From a0f004003ec76a92fac941cea37e8014822938c8 Mon Sep 17 00:00:00 2001 From: "Andrii Kalinich (GitHub)" Date: Thu, 21 Oct 2021 10:30:53 -0400 Subject: Fix issues with web app activation (#3799) * Add initial states for pending applications This would prevent crashes for cases when app will be attempted to be activated. * Fix UpdateAppList content * Fix checks in SDL.ActivateApp * Fix unit tests --- .../src/commands/hmi/sdl_activate_app_request.cc | 13 +++++-- .../commands/hmi/sdl_activate_app_request_test.cc | 41 ++-------------------- .../src/application_manager_impl.cc | 26 ++++++++++++++ .../src/message_helper/message_helper.cc | 2 +- 4 files changed, 41 insertions(+), 41 deletions(-) (limited to 'src') 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 88b3065fb0..e25ee93400 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 @@ -139,7 +139,7 @@ void SDLActivateAppRequest::Run() { return; } - if (!app->is_cloud_app() || app->IsRegistered()) { + if (app->app_id() > 0 || app->IsRegistered()) { auto main_state = app->CurrentHmiState(mobile_apis::PredefinedWindows::DEFAULT_WINDOW); if (mobile_apis::HMILevel::INVALID_ENUM == main_state->hmi_level()) { @@ -173,6 +173,15 @@ void SDLActivateAppRequest::Run() { application_manager_.connection_handler().ConnectToDevice(app->device()); return; } + + connection_handler::DeviceHandle device_handle = app->device(); + SDL_LOG_ERROR( + "Can't find regular foreground app with the same connection id: " + << device_handle); + SendErrorResponse(correlation_id(), + SDL_ActivateApp, + hmi_apis::Common_Result::NO_APPS_REGISTERED, + ""); } #else // EXTERNAL_PROPRIETARY_MODE @@ -216,7 +225,7 @@ void SDLActivateAppRequest::Run() { return; } - if (!app_to_activate->is_cloud_app() || app_to_activate->IsRegistered()) { + if (app_to_activate->app_id() > 0 || app_to_activate->IsRegistered()) { auto main_state = app_to_activate->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 44bd7f4a80..b110d4bf9e 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 @@ -157,6 +157,7 @@ TEST_F(SDLActivateAppRequestTest, Run_ActivateApp_SUCCESS) { CurrentHmiState(mobile_apis::PredefinedWindows::DEFAULT_WINDOW)) .WillOnce(Return(state)); + EXPECT_CALL(*mock_app, app_id()).WillOnce(Return(kAppID)); EXPECT_CALL(*mock_app, IsRegistered()).WillOnce(Return(true)); EXPECT_CALL(mock_policy_handler_, OnActivateApp(kAppID, kCorrelationID)); @@ -204,12 +205,6 @@ TEST_F(SDLActivateAppRequestTest, FindAppToRegister_SUCCESS) { IsStateActive(am::HmiState::StateID::STATE_ID_DEACTIVATE_HMI)) .WillOnce(Return(false)); - am::HmiStatePtr state = std::make_shared(mock_app, app_mngr_); - state->set_hmi_level(mobile_apis::HMILevel::HMI_NONE); - EXPECT_CALL(*mock_app, - CurrentHmiState(mobile_apis::PredefinedWindows::DEFAULT_WINDOW)) - .WillOnce(Return(state)); - ON_CALL(*mock_app, IsRegistered()).WillByDefault(Return(false)); ON_CALL(*mock_app, is_cloud_app()).WillByDefault(Return(false)); ON_CALL(*mock_app, device()).WillByDefault(Return(kHandle)); @@ -272,12 +267,6 @@ TEST_F(SDLActivateAppRequestTest, DevicesAppsEmpty_SUCCESS) { IsStateActive(am::HmiState::StateID::STATE_ID_DEACTIVATE_HMI)) .WillOnce(Return(false)); - am::HmiStatePtr state = std::make_shared(mock_app, app_mngr_); - state->set_hmi_level(mobile_apis::HMILevel::HMI_NONE); - EXPECT_CALL(*mock_app, - CurrentHmiState(mobile_apis::PredefinedWindows::DEFAULT_WINDOW)) - .WillOnce(Return(state)); - ON_CALL(*mock_app, IsRegistered()).WillByDefault(Return(false)); ON_CALL(*mock_app, is_cloud_app()).WillByDefault(Return(false)); ON_CALL(*mock_app, device()).WillByDefault(Return(kHandle)); @@ -305,12 +294,6 @@ TEST_F(SDLActivateAppRequestTest, FirstAppActive_SUCCESS) { .WillOnce(Return(false)); EXPECT_CALL(*mock_app, device()).WillOnce(Return(kHandle)); - am::HmiStatePtr state = std::make_shared(mock_app, app_mngr_); - state->set_hmi_level(mobile_apis::HMILevel::HMI_NONE); - EXPECT_CALL(*mock_app, - CurrentHmiState(mobile_apis::PredefinedWindows::DEFAULT_WINDOW)) - .WillOnce(Return(state)); - DataAccessor accessor(app_list_, lock_); EXPECT_CALL(app_mngr_, applications()).WillRepeatedly(Return(accessor)); @@ -348,14 +331,14 @@ TEST_F(SDLActivateAppRequestTest, FirstAppNotActiveNONE_SUCCESS) { IsStateActive(am::HmiState::StateID::STATE_ID_DEACTIVATE_HMI)) .WillOnce(Return(false)); + ON_CALL(*mock_app, IsRegistered()).WillByDefault(Return(true)); + am::HmiStatePtr state = std::make_shared(mock_app, app_mngr_); state->set_hmi_level(mobile_apis::HMILevel::HMI_NONE); EXPECT_CALL(*mock_app, CurrentHmiState(mobile_apis::PredefinedWindows::DEFAULT_WINDOW)) .WillOnce(Return(state)); - EXPECT_CALL(*mock_app, IsRegistered()).WillOnce(Return(true)); - EXPECT_CALL(mock_policy_handler_, OnActivateApp(kAppID, kCorrelationID)); command->Run(); @@ -377,12 +360,6 @@ TEST_F(SDLActivateAppRequestTest, FirstAppIsForeground_SUCCESS) { ON_CALL(app_mngr_, application(kAppID)).WillByDefault(Return(mock_app)); - am::HmiStatePtr state = std::make_shared(mock_app, app_mngr_); - state->set_hmi_level(mobile_apis::HMILevel::HMI_NONE); - EXPECT_CALL(*mock_app, - CurrentHmiState(mobile_apis::PredefinedWindows::DEFAULT_WINDOW)) - .WillOnce(Return(state)); - EXPECT_CALL(*mock_app, device()).WillOnce(Return(kHandle)); ON_CALL(*mock_app, IsRegistered()).WillByDefault(Return(false)); ON_CALL(*mock_app, is_cloud_app()).WillByDefault(Return(false)); @@ -425,12 +402,6 @@ TEST_F(SDLActivateAppRequestTest, FirstAppNotRegisteredAndEmpty_SUCCESS) { IsStateActive(am::HmiState::StateID::STATE_ID_DEACTIVATE_HMI)) .WillOnce(Return(false)); - am::HmiStatePtr state = std::make_shared(mock_app, app_mngr_); - state->set_hmi_level(mobile_apis::HMILevel::HMI_NONE); - EXPECT_CALL(*mock_app, - CurrentHmiState(mobile_apis::PredefinedWindows::DEFAULT_WINDOW)) - .WillOnce(Return(state)); - MockAppPtr mock_app_first(CreateMockApp()); ON_CALL(*mock_app_first, device()).WillByDefault(Return(kHandle)); ON_CALL(*mock_app_first, is_foreground()).WillByDefault(Return(false)); @@ -464,12 +435,6 @@ TEST_F(SDLActivateAppRequestTest, FirstAppNotRegistered_SUCCESS) { IsStateActive(am::HmiState::StateID::STATE_ID_DEACTIVATE_HMI)) .WillOnce(Return(false)); - am::HmiStatePtr state = std::make_shared(mock_app, app_mngr_); - state->set_hmi_level(mobile_apis::HMILevel::HMI_NONE); - EXPECT_CALL(*mock_app, - CurrentHmiState(mobile_apis::PredefinedWindows::DEFAULT_WINDOW)) - .WillOnce(Return(state)); - DataAccessor accessor(app_list_, lock_); EXPECT_CALL(app_mngr_, applications()).WillRepeatedly(Return(accessor)); diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index 8d2875364d..7a5d5fc0dc 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -1200,6 +1200,19 @@ void ApplicationManagerImpl::CreatePendingApplication( application->set_hybrid_app_preference(hybrid_app_preference_enum); application->set_cloud_app_certificate(app_properties.certificate); + HmiStatePtr initial_state = + CreateRegularState(application, + mobile_apis::WindowType::MAIN, + mobile_apis::HMILevel::INVALID_ENUM, + mobile_apis::AudioStreamingState::INVALID_ENUM, + mobile_apis::VideoStreamingState::INVALID_ENUM, + mobile_api::SystemContext::SYSCTXT_MAIN); + + application->SetInitialState( + mobile_apis::PredefinedWindows::DEFAULT_WINDOW, + std::string(), // should not be tracked for main window + initial_state); + { sync_primitives::AutoLock lock(apps_to_register_list_lock_ptr_); SDL_LOG_DEBUG( @@ -1284,6 +1297,19 @@ void ApplicationManagerImpl::CreatePendingLocalApplication( application->set_hybrid_app_preference(hybrid_app_preference_enum); application->set_cloud_app_certificate(app_properties.certificate); + HmiStatePtr initial_state = + CreateRegularState(application, + mobile_apis::WindowType::MAIN, + mobile_apis::HMILevel::INVALID_ENUM, + mobile_apis::AudioStreamingState::INVALID_ENUM, + mobile_apis::VideoStreamingState::INVALID_ENUM, + mobile_api::SystemContext::SYSCTXT_MAIN); + + application->SetInitialState( + mobile_apis::PredefinedWindows::DEFAULT_WINDOW, + std::string(), // should not be tracked for main window + initial_state); + sync_primitives::AutoLock lock(apps_to_register_list_lock_ptr_); apps_to_register_.insert(application); SDL_LOG_DEBUG("Insert " << application->name().c_str() diff --git a/src/components/application_manager/src/message_helper/message_helper.cc b/src/components/application_manager/src/message_helper/message_helper.cc index 94d0a75c7f..bbe6189bc9 100644 --- a/src/components/application_manager/src/message_helper/message_helper.cc +++ b/src/components/application_manager/src/message_helper/message_helper.cc @@ -1848,7 +1848,7 @@ bool MessageHelper::CreateHMIApplicationStruct( if (file_system::FileExists(app->app_icon_path())) { message[strings::icon] = icon_path; } - if (!app->is_cloud_app() || app->IsRegistered()) { + if (app->app_id() > 0 || app->IsRegistered()) { message[strings::hmi_display_language_desired] = app->ui_language(); message[strings::is_media_application] = app->is_media_application(); } else { -- cgit v1.2.1