[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.