blob: c91903df4604b1b57acbaa677549d2a2c1304a40 [file] [log] [blame]
// Copyright 2019 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.
#ifndef SRC_MODULAR_BIN_BASEMGR_SESSION_PROVIDER_H_
#define SRC_MODULAR_BIN_BASEMGR_SESSION_PROVIDER_H_
#include <fuchsia/hardware/power/statecontrol/cpp/fidl.h>
#include <fuchsia/modular/cpp/fidl.h>
#include <fuchsia/modular/session/cpp/fidl.h>
#include <fuchsia/ui/policy/cpp/fidl.h>
#include <fuchsia/ui/views/cpp/fidl.h>
#include <lib/sys/cpp/component_context.h>
#include <lib/sys/cpp/service_directory.h>
#include <lib/vfs/cpp/pseudo_dir.h>
#include "src/modular/bin/basemgr/session_context_impl.h"
#include "src/modular/lib/async/cpp/future.h"
#include "src/modular/lib/modular_config/modular_config_accessor.h"
namespace modular {
class SessionProvider {
public:
// Users of SessionProvider must register a Delegate object, which provides
// functionality to SessionProvider that's outside the scope of this class.
class Delegate {
public:
// Called when a session provided by SessionProvider wants to acquire
// presentation.
virtual void GetPresentation(
fidl::InterfaceRequest<fuchsia::ui::policy::Presentation> request) = 0;
};
using StartSessionResult = fit::result<void, zx_status_t>;
// Target constructor.
//
// |on_zero_sessions| is invoked when all sessions have been deleted. This is
// meant to be a callback for BasemgrImpl to start a new session.
SessionProvider(Delegate* delegate, fuchsia::sys::Launcher* launcher,
fuchsia::sys::Environment* base_environment,
fuchsia::hardware::power::statecontrol::Admin* administrator,
const modular::ModularConfigAccessor* config_accessor,
fuchsia::sys::ServiceList services_from_session_launcher,
fit::function<void()> on_zero_sessions);
// Starts a new sessionmgr process if there isn't one already.
//
// Returns |ZX_ERR_BAD_STATE| if there is an existing sessionmgr process, and does not
// start a new session.
//
// Returns fit::ok if a new session was started successfully.
StartSessionResult StartSession(fuchsia::ui::views::ViewToken view_token);
// Asynchronously tears down the sessionmgr process. |callback| is invoked
// once teardown is complete or has timed out.
void Teardown(fit::function<void()> callback);
// Callback function for session_provider to invoke when there is no active session.
void OnSessionShutdown(SessionContextImpl::ShutDownReason shutdown_reason);
// Shuts down the running session, causing a new session to be created.
void RestartSession(fit::function<void()> on_restart_complete);
// Returns true if sessionmgr is running.
bool is_session_running() const { return !!session_context_; }
private:
// Returns a service list for serving |fuchsia.intl.PropertyProvider| to sessionmgr,
// served from |sessionmgr_service_dir_|.
fuchsia::sys::ServiceListPtr CreateAndServeSessionmgrServices();
Delegate* const delegate_; // Neither owned nor copied.
fuchsia::sys::Launcher* const launcher_; // Not owned.
fuchsia::sys::Environment* const base_environment_; // Not owned.
fuchsia::hardware::power::statecontrol::Admin* const administrator_; // Not owned.
const modular::ModularConfigAccessor* const config_accessor_; // Not owned.
fit::function<void()> on_zero_sessions_;
std::unique_ptr<SessionContextImpl> session_context_;
// Service directory from which services will be served to child |sessionmgr|s.
vfs::PseudoDir sessionmgr_service_dir_;
// Names of services passed by session launcher.
const std::vector<std::string> session_launcher_service_names_;
// Exposes the services passed by session launcher to agents.
const sys::ServiceDirectory session_launcher_service_dir_;
// The number of times that session had to be recovered from a crash, during a
// given timeout. If the count exceed the max retry limit, a device
// reboot will be triggered
int session_crash_recovery_counter_ = 0;
// The timestamp of when last crash happened
zx::time last_crash_time_;
// If set, this will be used for the value of |use_random_session_id| instead of
// the one from the configuration.
std::optional<bool> use_random_session_id_ = std::nullopt;
FXL_DISALLOW_COPY_AND_ASSIGN(SessionProvider);
};
} // namespace modular
#endif // SRC_MODULAR_BIN_BASEMGR_SESSION_PROVIDER_H_