diff --git a/src/anbox/cmds/session_manager.cpp b/src/anbox/cmds/session_manager.cpp index 9f632ee6d280c3b3727e98eab9ba6a4fd9a36b4f..3b6b7a2d6749df6d46e88c032044dda1f129429c 100644 --- a/src/anbox/cmds/session_manager.cpp +++ b/src/anbox/cmds/session_manager.cpp @@ -60,6 +60,9 @@ std::istream& operator>>(std::istream& in, anbox::graphics::GLRendererServer::Co namespace fs = boost::filesystem; namespace { +constexpr const char *default_appmgr_package{"org.anbox.appmgr"}; +constexpr const char *default_appmgr_component{"org.anbox.appmgr.AppViewActivity"}; +const boost::posix_time::milliseconds default_appmgr_startup_delay{50}; const anbox::graphics::Rect default_single_window_size{0, 0, 1024, 768}; class NullConnectionCreator : public anbox::network::ConnectionCreator< @@ -85,6 +88,18 @@ std::istream& operator>>(std::istream& in, anbox::graphics::GLRendererServer::Co } } +void anbox::cmds::SessionManager::launch_appmgr_if_needed(const std::shared_ptr &android_api_stub) { + if (!single_window_) + return; + + android::Intent launch_intent; + launch_intent.package = default_appmgr_package; + launch_intent.component = default_appmgr_component; + // As this will only be executed in single window mode we don't have + // to specify and launch bounds. + android_api_stub->launch(launch_intent, graphics::Rect::Invalid, wm::Stack::Id::Default); +} + anbox::cmds::SessionManager::SessionManager() : CommandWithFlagsAndAction{cli::Name{"session-manager"}, cli::Usage{"session-manager"}, cli::Description{"Run the the anbox session manager"}}, @@ -187,7 +202,6 @@ anbox::cmds::SessionManager::SessionManager() platform->set_window_manager(window_manager); platform->set_renderer(gl_server->renderer()); - window_manager->setup(); auto app_manager = std::static_pointer_cast(android_api_stub); @@ -210,6 +224,8 @@ anbox::cmds::SessionManager::SessionManager() utils::string_format("%s/qemu_pipe", socket_path), rt, std::make_shared(gl_server->renderer(), rt)); + boost::asio::deadline_timer appmgr_start_timer(rt->service()); + auto bridge_connector = std::make_shared( utils::string_format("%s/anbox_bridge", socket_path), rt, std::make_shared( @@ -228,6 +244,12 @@ anbox::cmds::SessionManager::SessionManager() server->register_boot_finished_handler([&]() { DEBUG("Android successfully booted"); android_api_stub->ready().set(true); + appmgr_start_timer.expires_from_now(default_appmgr_startup_delay); + appmgr_start_timer.async_wait([&](const boost::system::error_code &err) { + if (err != boost::system::errc::success) + return; + launch_appmgr_if_needed(android_api_stub); + }); }); return std::make_shared( sender, server, pending_calls); diff --git a/src/anbox/cmds/session_manager.h b/src/anbox/cmds/session_manager.h index 77e75c61c464920d73ace0936de909d31b3c61ab..48ed94160fb0a9d9848e56f5cb059c68503beebb 100644 --- a/src/anbox/cmds/session_manager.h +++ b/src/anbox/cmds/session_manager.h @@ -30,6 +30,9 @@ #include "anbox/graphics/rect.h" namespace anbox { +namespace bridge { +class AndroidApiStub; +} // namespace bridge namespace container { class Client; } // namespace container @@ -39,6 +42,8 @@ class SessionManager : public cli::CommandWithFlagsAndAction { SessionManager(); private: + void launch_appmgr_if_needed(const std::shared_ptr &android_api_stub); + std::shared_ptr container_; std::string desktop_file_hint_; graphics::GLRendererServer::Config::Driver gles_driver_;