blob: 3f2874af17e115f09d45483bb473df1eabf04f4a [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/cobalt/bin/app/activity_listener_impl.h"
#include <iostream>
#include "fuchsia/ui/activity/cpp/fidl.h"
#include "lib/async/cpp/task.h"
namespace cobalt {
std::map<fuchsia::ui::activity::State, ActivityState> state_map = {
{fuchsia::ui::activity::State::ACTIVE, ActivityState::ACTIVE},
{fuchsia::ui::activity::State::IDLE, ActivityState::IDLE},
{fuchsia::ui::activity::State::UNKNOWN, ActivityState::UNKNOWN},
};
ActivityListenerImpl::ActivityListenerImpl(async_dispatcher_t* dispatcher,
std::shared_ptr<sys::ServiceDirectory> services)
: dispatcher_(dispatcher),
services_(std::move(services)),
backoff_(/*initial_delay=*/zx::msec(100), /*retry_factor=*/2u, /*max_delay=*/zx::hour(1)) {}
void ActivityListenerImpl::OnStateChanged(fuchsia::ui::activity::State state,
zx_time_t transition_time,
OnStateChangedCallback callback) {
SetState(state);
callback();
}
void ActivityListenerImpl::Start(const std::function<void(cobalt::ActivityState)>& callback) {
if (callback_) {
FX_LOGS(ERROR) << "Callback value already set. Replacing the current value.";
}
callback_ = callback;
StartListening();
Update();
}
void ActivityListenerImpl::StartListening() {
activity_state_ptr_ = services_->Connect<fuchsia::ui::activity::Provider>();
activity_state_ptr_.set_error_handler([this](zx_status_t status) {
FX_PLOGS(ERROR, status) << "Lost connection to fuchsia.ui.activity";
RestartListening();
});
activity_state_ptr_->WatchState(binding_.NewBinding(dispatcher_));
}
void ActivityListenerImpl::RestartListening() {
SetState(fuchsia::ui::activity::State::UNKNOWN);
activity_state_ptr_.Unbind();
reconnect_task_.Reset([this] { StartListening(); });
async::PostDelayedTask(dispatcher_, reconnect_task_.callback(), backoff_.GetNext());
}
void ActivityListenerImpl::SetState(fuchsia::ui::activity::State state) {
state_ = state_map[state];
Update();
}
void ActivityListenerImpl::Update() {
if (callback_) {
callback_.value()(state_);
}
}
} // namespace cobalt