summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJackLivio <jack@livio.io>2022-04-04 12:57:55 -0400
committerGitHub <noreply@github.com>2022-04-04 12:57:55 -0400
commitb380f4865aaa7c68cab72c67e32f29ae17c4cc1c (patch)
tree99c8067a57dbc09ae315a953b2e419751a688c1b
parentcbc9d3928fb3c4a8db6608e84bad67d2398a52e7 (diff)
downloadsdl_core-b380f4865aaa7c68cab72c67e32f29ae17c4cc1c.tar.gz
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 <jacob.keeler@livioradio.com> Co-authored-by: Jacob Keeler <jacob.keeler@livioradio.com>
-rw-r--r--src/components/application_manager/include/application_manager/application_manager_impl.h2
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/sdl_activate_app_request.cc10
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/sdl_activate_app_request_test.cc24
-rw-r--r--src/components/application_manager/src/application_manager_impl.cc7
-rw-r--r--src/components/include/application_manager/application_manager.h3
-rw-r--r--src/components/include/test/application_manager/mock_application_manager.h3
6 files changed, 48 insertions, 1 deletions
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<SDLActivateAppRequest> command(
+ CreateCommand<SDLActivateAppRequest>());
+
+ 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<am::HmiState>(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<AppsWaitRegistrationSet> 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));