[modular] Remove StartupContext dependency from basemgr and
user_provider.
MF-89 #done
TESTED: paved, ran unit/integration tests
Change-Id: Iaef814385db5a5f330eb058ff1b7dca33276414d
diff --git a/bin/basemgr/basemgr_impl.cc b/bin/basemgr/basemgr_impl.cc
index af2acec..698b8be 100644
--- a/bin/basemgr/basemgr_impl.cc
+++ b/bin/basemgr/basemgr_impl.cc
@@ -36,23 +36,22 @@
BasemgrImpl::BasemgrImpl(
const modular::BasemgrSettings& settings,
const std::vector<SessionShellSettings>& session_shell_settings,
- std::shared_ptr<component::StartupContext> const context,
+ fuchsia::sys::Launcher* const launcher,
+ fuchsia::modular::BasemgrMonitorPtr monitor,
+ fuchsia::ui::policy::PresenterPtr presenter,
std::function<void()> on_shutdown)
: settings_(settings),
session_shell_settings_(session_shell_settings),
- user_provider_impl_("UserProviderImpl"),
- context_(std::move(context)),
+ launcher_(launcher),
+ monitor_(std::move(monitor)),
+ presenter_(std::move(presenter)),
on_shutdown_(std::move(on_shutdown)),
+ user_provider_impl_("UserProviderImpl"),
base_shell_context_binding_(this),
account_provider_context_binding_(this),
authentication_context_provider_binding_(this) {
update_session_shell_config();
- if (!context_->has_environment_services()) {
- FXL_LOG(ERROR) << "Failed to receive services from the environment.";
- exit(1);
- }
-
// TODO(SCN-595): Presentation is now discoverable, so we don't need
// kPresentationService anymore.
service_namespace_.AddService(presentation_state_.bindings.GetHandler(
@@ -64,8 +63,6 @@
return;
}
- context_->ConnectToEnvironmentService(monitor_.NewRequest());
-
monitor_.set_error_handler([](zx_status_t status) {
FXL_LOG(ERROR) << "No basemgr monitor found.";
exit(1);
@@ -95,9 +92,8 @@
? presentation_state_.presentation.Unbind().NewRequest()
: presentation_state_.presentation.NewRequest();
- context_->ConnectToEnvironmentService<fuchsia::ui::policy::Presenter>()
- ->Present2(zx::eventpair(view_owner.TakeChannel().release()),
- std::move(presentation_request));
+ presenter_->Present2(zx::eventpair(view_owner.TakeChannel().release()),
+ std::move(presentation_request));
AddGlobalKeyboardShortcuts(presentation_state_.presentation);
@@ -143,7 +139,7 @@
}
base_shell_app_ = std::make_unique<AppClient<fuchsia::modular::Lifecycle>>(
- context_->launcher().get(), CloneStruct(settings_.base_shell));
+ launcher_, CloneStruct(settings_.base_shell));
base_shell_app_->services().ConnectToService(base_shell_.NewRequest());
fuchsia::ui::viewsv1::ViewProviderPtr base_shell_view_provider;
@@ -249,7 +245,7 @@
FXL_DLOG(INFO) << "Initialzing token_manager_factory_app()";
token_manager_factory_app_ =
std::make_unique<AppClient<fuchsia::modular::Lifecycle>>(
- context_->launcher().get(), CloneStruct(token_manager_config));
+ launcher_, CloneStruct(token_manager_config));
token_manager_factory_app_->services().ConnectToService(
token_manager_factory_.NewRequest());
} else {
@@ -259,7 +255,7 @@
account_provider_ =
std::make_unique<AppClient<fuchsia::modular::auth::AccountProvider>>(
- context_->launcher().get(), std::move(token_manager_config),
+ launcher_, std::move(token_manager_config),
"/data/modular/ACCOUNT_MANAGER");
account_provider_->SetAppErrorHandler(
[] { FXL_CHECK(false) << "Token manager crashed. Stopping basemgr."; });
@@ -267,7 +263,7 @@
account_provider_context_binding_.NewBinding());
user_provider_impl_.reset(new UserProviderImpl(
- context_, settings_.sessionmgr, session_shell_config_,
+ launcher_, settings_.sessionmgr, session_shell_config_,
settings_.story_shell, account_provider_->primary_service().get(),
token_manager_factory_.get(),
authentication_context_provider_binding_.NewBinding().Bind(),
diff --git a/bin/basemgr/basemgr_impl.h b/bin/basemgr/basemgr_impl.h
index 9318b2d..586c3b4 100644
--- a/bin/basemgr/basemgr_impl.h
+++ b/bin/basemgr/basemgr_impl.h
@@ -43,10 +43,22 @@
fuchsia::ui::policy::KeyboardCaptureListenerHACK,
modular::UserProviderImpl::Delegate {
public:
+ // Initializes as BasemgrImpl instance with the given parameters:
+ //
+ // |settings| Settings that are parsed from command line. Used to configure
+ // the modular framework environment.
+ // |session_shell_settings| Settings relevant to session shells. Used to
+ // configure session shells that are launched.
+ // |launcher| Environment service for creating component instances.
+ // |monitor| Service that monitors how many basemgr instances are active.
+ // |presenter| Service to initialize the presentation.
+ // |on_shutdown| Callback invoked when this basemgr instance is shutdown.
explicit BasemgrImpl(
const modular::BasemgrSettings& settings,
const std::vector<modular::SessionShellSettings>& session_shell_settings,
- std::shared_ptr<component::StartupContext> context,
+ fuchsia::sys::Launcher* const launcher,
+ fuchsia::modular::BasemgrMonitorPtr monitor,
+ fuchsia::ui::policy::PresenterPtr presenter,
std::function<void()> on_shutdown);
~BasemgrImpl() override;
@@ -141,12 +153,16 @@
std::vector<SessionShellSettings>::size_type
active_session_shell_settings_index_{};
- AsyncHolder<UserProviderImpl> user_provider_impl_;
-
- std::shared_ptr<component::StartupContext> const context_;
+ // Used to launch component instances, such as the base shell.
+ fuchsia::sys::Launcher* const launcher_; // Not owned.
+ // Used to report this basemgr instance to the BasemgrMonitor.
fuchsia::modular::BasemgrMonitorPtr monitor_;
+ // Used to initialize the presentation.
+ fuchsia::ui::policy::PresenterPtr presenter_;
std::function<void()> on_shutdown_;
+ AsyncHolder<UserProviderImpl> user_provider_impl_;
+
fidl::Binding<fuchsia::modular::BaseShellContext> base_shell_context_binding_;
fidl::Binding<fuchsia::modular::auth::AccountProviderContext>
account_provider_context_binding_;
diff --git a/bin/basemgr/main.cc b/bin/basemgr/main.cc
index 03ecbf3..8b15229 100644
--- a/bin/basemgr/main.cc
+++ b/bin/basemgr/main.cc
@@ -34,21 +34,30 @@
return 0;
}
- modular::BasemgrSettings settings(command_line);
- auto session_shell_settings =
- modular::SessionShellSettings::GetSystemSettings();
async::Loop loop(&kAsyncLoopConfigAttachToThread);
trace::TraceProvider trace_provider(loop.dispatcher());
auto context = std::shared_ptr<component::StartupContext>(
component::StartupContext::CreateFromStartupInfo());
+ if (!context->has_environment_services()) {
+ FXL_LOG(ERROR) << "Failed to receive services from the environment.";
+ return 1;
+ }
+
+ modular::BasemgrSettings settings(command_line);
+ auto session_shell_settings =
+ modular::SessionShellSettings::GetSystemSettings();
+
fit::deferred_action<fit::closure> cobalt_cleanup =
SetupCobalt(settings, std::move(loop.dispatcher()), context.get());
- // TODO(MF-98): Assess feasibility of injecting the service dependencies
- // explicitly rather than passing the entire startup context, for easier
- // testing.
- modular::BasemgrImpl basemgr(settings, session_shell_settings, context,
- [&loop, &cobalt_cleanup] {
+ fuchsia::modular::BasemgrMonitorPtr monitor;
+ context->ConnectToEnvironmentService(monitor.NewRequest());
+ fuchsia::ui::policy::PresenterPtr presenter;
+ context->ConnectToEnvironmentService(presenter.NewRequest());
+
+ modular::BasemgrImpl basemgr(settings, session_shell_settings,
+ context->launcher().get(), std::move(monitor),
+ std::move(presenter), [&loop, &cobalt_cleanup] {
cobalt_cleanup.call();
loop.Quit();
});
diff --git a/bin/basemgr/user_controller_impl.h b/bin/basemgr/user_controller_impl.h
index a18ff55..7bc3da9 100644
--- a/bin/basemgr/user_controller_impl.h
+++ b/bin/basemgr/user_controller_impl.h
@@ -40,7 +40,8 @@
using DoneCallback = std::function<void(UserControllerImpl*)>;
UserControllerImpl(
- fuchsia::sys::Launcher* launcher, fuchsia::modular::AppConfig sessionmgr,
+ fuchsia::sys::Launcher* const launcher,
+ fuchsia::modular::AppConfig sessionmgr,
fuchsia::modular::AppConfig session_shell,
fuchsia::modular::AppConfig story_shell,
fidl::InterfaceHandle<fuchsia::modular::auth::TokenProviderFactory>
diff --git a/bin/basemgr/user_provider_impl.cc b/bin/basemgr/user_provider_impl.cc
index c7f62d7..f8b9d60 100644
--- a/bin/basemgr/user_provider_impl.cc
+++ b/bin/basemgr/user_provider_impl.cc
@@ -109,7 +109,7 @@
} // namespace
UserProviderImpl::UserProviderImpl(
- std::shared_ptr<component::StartupContext> context,
+ fuchsia::sys::Launcher* const launcher,
const fuchsia::modular::AppConfig& sessionmgr,
const fuchsia::modular::AppConfig& session_shell,
const fuchsia::modular::AppConfig& story_shell,
@@ -118,7 +118,7 @@
fuchsia::auth::AuthenticationContextProviderPtr
authentication_context_provider,
bool use_token_manager_factory, Delegate* const delegate)
- : context_(std::move(context)),
+ : launcher_(launcher),
sessionmgr_(sessionmgr),
session_shell_(session_shell),
story_shell_(story_shell),
@@ -583,12 +583,11 @@
delegate_->GetSessionShellServiceProvider(std::move(params.services));
auto controller = std::make_unique<UserControllerImpl>(
- context_->launcher().get(), CloneStruct(sessionmgr_),
- CloneStruct(session_shell_), CloneStruct(story_shell_),
- std::move(token_provider_factory), std::move(ledger_token_manager),
- std::move(agent_token_manager), std::move(account), std::move(view_owner),
- std::move(service_provider), std::move(params.user_controller),
- [this](UserControllerImpl* c) {
+ launcher_, CloneStruct(sessionmgr_), CloneStruct(session_shell_),
+ CloneStruct(story_shell_), std::move(token_provider_factory),
+ std::move(ledger_token_manager), std::move(agent_token_manager),
+ std::move(account), std::move(view_owner), std::move(service_provider),
+ std::move(params.user_controller), [this](UserControllerImpl* c) {
user_controllers_.erase(c);
delegate_->DidLogout();
});
diff --git a/bin/basemgr/user_provider_impl.h b/bin/basemgr/user_provider_impl.h
index 316095d..0663cea 100644
--- a/bin/basemgr/user_provider_impl.h
+++ b/bin/basemgr/user_provider_impl.h
@@ -57,7 +57,7 @@
// |account_provider| and |delegate| must outlive UserProviderImpl.
UserProviderImpl(
- std::shared_ptr<component::StartupContext> context,
+ fuchsia::sys::Launcher* const launcher,
const fuchsia::modular::AppConfig& sessionmgr,
const fuchsia::modular::AppConfig& session_shell,
const fuchsia::modular::AppConfig& story_shell,
@@ -129,7 +129,7 @@
fidl::BindingSet<fuchsia::modular::UserProvider> bindings_;
- std::shared_ptr<component::StartupContext> context_;
+ fuchsia::sys::Launcher* const launcher_; // Not owned.
const fuchsia::modular::AppConfig& sessionmgr_; // Neither owned nor copied.
const fuchsia::modular::AppConfig&
session_shell_; // Neither owned nor copied.