From b380f4865aaa7c68cab72c67e32f29ae17c4cc1c Mon Sep 17 00:00:00 2001 From: JackLivio Date: Mon, 4 Apr 2022 12:57:55 -0400 Subject: Fix app activation during pending cloud connection (#3898) * Fix app activation during pending cloud connection * Apply suggestions from code review Co-authored-by: Jacob Keeler Co-authored-by: Jacob Keeler --- .../application_manager/application_manager_impl.h | 2 ++ .../src/commands/hmi/sdl_activate_app_request.cc | 10 ++++++++- .../commands/hmi/sdl_activate_app_request_test.cc | 24 ++++++++++++++++++++++ .../src/application_manager_impl.cc | 7 +++++++ .../application_manager/application_manager.h | 3 +++ .../application_manager/mock_application_manager.h | 3 +++ 6 files changed, 48 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/components/application_manager/include/application_manager/application_manager_impl.h b/src/components/application_manager/include/application_manager/application_manager_impl.h index c59456a022..d72508bd63 100644 --- a/src/components/application_manager/include/application_manager/application_manager_impl.h +++ b/src/components/application_manager/include/application_manager/application_manager_impl.h @@ -187,6 +187,8 @@ class ApplicationManagerImpl uint32_t hmi_app_id) const OVERRIDE; ApplicationSharedPtr application_by_policy_id( const std::string& policy_app_id) const OVERRIDE; + ApplicationSharedPtr pending_application_by_hmi_app( + uint32_t hmi_app_id) const OVERRIDE; ApplicationSharedPtr pending_application_by_policy_id( const std::string& policy_app_id) const OVERRIDE; ApplicationSharedPtr reregister_application_by_policy_id( diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/sdl_activate_app_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/sdl_activate_app_request.cc index d79a397651..50152e0924 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/sdl_activate_app_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/sdl_activate_app_request.cc @@ -297,7 +297,13 @@ void SDLActivateAppRequest::on_event(const event_engine::Event& event) { if (event.id() != BasicCommunication_OnAppRegistered) { return; } - unsubscribe_from_event(BasicCommunication_OnAppRegistered); + + ApplicationSharedPtr pending_app = + application_manager_.pending_application_by_hmi_app(app_id()); + if (pending_app) { + SDL_LOG_ERROR("Application is still pending connection: " << app_id()); + return; + } // Have to use HMI app id from event, since HMI app id from original request // message will be changed after app, initially requested for launch via @@ -312,6 +318,8 @@ void SDLActivateAppRequest::on_event(const event_engine::Event& event) { return; } + unsubscribe_from_event(BasicCommunication_OnAppRegistered); + auto main_state = app->CurrentHmiState(mobile_apis::PredefinedWindows::DEFAULT_WINDOW); if (mobile_apis::HMILevel::INVALID_ENUM == main_state->hmi_level()) { diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/sdl_activate_app_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/sdl_activate_app_request_test.cc index 8057a2c518..162e421904 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/sdl_activate_app_request_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/sdl_activate_app_request_test.cc @@ -542,6 +542,28 @@ TEST_F(SDLActivateAppRequestTest, OnEvent_InvalidAppId_UNSUCCESS) { MockAppPtr invalid_mock_app; EXPECT_CALL(app_mngr_, application_by_hmi_app(_)) .WillOnce(Return(invalid_mock_app)); + EXPECT_CALL(app_mngr_, pending_application_by_hmi_app(_)) + .WillOnce(Return(ApplicationSharedPtr())); + + command->on_event(event); +} + +TEST_F(SDLActivateAppRequestTest, OnEvent_PendingApp_UNSUCCESS) { + MessageSharedPtr event_msg = CreateMessage(); + (*event_msg)[strings::msg_params][strings::application][strings::app_id] = + kAppID; + + std::shared_ptr command( + CreateCommand()); + + Event event(hmi_apis::FunctionID::BasicCommunication_OnAppRegistered); + event.set_smart_object(*event_msg); + + MockAppPtr mock_app(CreateMockApp()); + EXPECT_CALL(app_mngr_, pending_application_by_hmi_app(_)) + .WillOnce(Return(mock_app)); + EXPECT_CALL(app_mngr_, application_by_hmi_app(_)).Times(0); + EXPECT_CALL(mock_policy_handler_, OnActivateApp(_, _)).Times(0); command->on_event(event); } @@ -561,6 +583,8 @@ TEST_F(SDLActivateAppRequestTest, OnEvent_SUCCESS) { MockAppPtr mock_app(CreateMockApp()); EXPECT_CALL(app_mngr_, application_by_hmi_app(_)).WillOnce(Return(mock_app)); + EXPECT_CALL(app_mngr_, pending_application_by_hmi_app(_)) + .WillOnce(Return(ApplicationSharedPtr())); auto hmi_state = std::make_shared(mock_app, app_mngr_); hmi_state->set_hmi_level(mobile_apis::HMILevel::HMI_NONE); diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index 486af1de92..acf174eb39 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -301,6 +301,13 @@ ApplicationSharedPtr ApplicationManagerImpl::application_by_policy_id( return FindApp(accessor, finder); } +ApplicationSharedPtr ApplicationManagerImpl::pending_application_by_hmi_app( + uint32_t hmi_app_id) const { + HmiAppIdPredicate finder(hmi_app_id); + DataAccessor accessor = pending_applications(); + return FindPendingApp(accessor, finder); +} + ApplicationSharedPtr ApplicationManagerImpl::pending_application_by_policy_id( const std::string& policy_app_id) const { PolicyAppIdPredicate finder(policy_app_id); diff --git a/src/components/include/application_manager/application_manager.h b/src/components/include/application_manager/application_manager.h index 5fd9be2a66..a0092b93df 100644 --- a/src/components/include/application_manager/application_manager.h +++ b/src/components/include/application_manager/application_manager.h @@ -216,6 +216,9 @@ class ApplicationManager { virtual ApplicationSharedPtr application_by_policy_id( const std::string& policy_app_id) const = 0; + virtual ApplicationSharedPtr pending_application_by_hmi_app( + uint32_t hmi_app_id) const = 0; + virtual ApplicationSharedPtr pending_application_by_policy_id( const std::string& policy_app_id) const = 0; diff --git a/src/components/include/test/application_manager/mock_application_manager.h b/src/components/include/test/application_manager/mock_application_manager.h index ef0f20ac65..dfc9cbab5a 100644 --- a/src/components/include/test/application_manager/mock_application_manager.h +++ b/src/components/include/test/application_manager/mock_application_manager.h @@ -113,6 +113,9 @@ class MockApplicationManager : public application_manager::ApplicationManager { MOCK_CONST_METHOD1(application_by_policy_id, application_manager::ApplicationSharedPtr( const std::string& policy_app_id)); + MOCK_CONST_METHOD1( + pending_application_by_hmi_app, + application_manager::ApplicationSharedPtr(uint32_t hmi_app_id)); MOCK_CONST_METHOD1(pending_application_by_policy_id, application_manager::ApplicationSharedPtr( const std::string& policy_app_id)); -- cgit v1.2.1