From 2eafae9d0ae0b352d3b30bd1409bebdcfc447988 Mon Sep 17 00:00:00 2001 From: JackLivio Date: Wed, 13 Nov 2019 16:51:37 -0500 Subject: Check for conflicting app resumption level (#3117) * Check for conflicting app resumption level * Change variable name * Restore widgets before HMI level conflict check * Add check for number of restored widget windows * Address comments * Fix active app check * Fix typo * Fix style * Add helper method * Add new app manager predicate finder --- .../application_manager/application_manager_impl.h | 2 ++ .../include/application_manager/resumption/resume_ctrl.h | 4 ++-- .../application_manager/resumption/resume_ctrl_impl.h | 5 +++-- .../application_manager/src/application_manager_impl.cc | 14 ++++++++++++++ .../src/resumption/resume_ctrl_impl.cc | 16 ++++++++++++---- .../test/include/application_manager/mock_resume_ctrl.h | 4 ++-- .../test/resumption/resume_ctrl_test.cc | 2 ++ .../include/application_manager/application_manager.h | 2 ++ .../test/application_manager/mock_application_manager.h | 2 ++ 9 files changed, 41 insertions(+), 10 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 e88c954c18..99264d6ef6 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 @@ -175,6 +175,8 @@ class ApplicationManagerImpl ApplicationSharedPtr active_application() const OVERRIDE; + ApplicationSharedPtr get_full_or_limited_application() const OVERRIDE; + ApplicationSharedPtr application_by_hmi_app( uint32_t hmi_app_id) const OVERRIDE; ApplicationSharedPtr application_by_policy_id( diff --git a/src/components/application_manager/include/application_manager/resumption/resume_ctrl.h b/src/components/application_manager/include/application_manager/resumption/resume_ctrl.h index 11b1bcf926..78366ea96a 100644 --- a/src/components/application_manager/include/application_manager/resumption/resume_ctrl.h +++ b/src/components/application_manager/include/application_manager/resumption/resume_ctrl.h @@ -113,9 +113,9 @@ class ResumeCtrl { * @brief RestoreAppWidgets add widgets for the application * @param application application which will be resumed * @param saved_app application specific section from backup file - * @return true if widgets resumed successfully otherwise - false + * @return the number of widget windows to be resumed */ - virtual void RestoreAppWidgets( + virtual size_t RestoreAppWidgets( application_manager::ApplicationSharedPtr application, const smart_objects::SmartObject& saved_app) = 0; diff --git a/src/components/application_manager/include/application_manager/resumption/resume_ctrl_impl.h b/src/components/application_manager/include/application_manager/resumption/resume_ctrl_impl.h index 5e6fb58671..f0d5dc39e4 100644 --- a/src/components/application_manager/include/application_manager/resumption/resume_ctrl_impl.h +++ b/src/components/application_manager/include/application_manager/resumption/resume_ctrl_impl.h @@ -124,8 +124,9 @@ class ResumeCtrlImpl : public ResumeCtrl, * @param application application which will be resumed * @param saved_app application specific section from backup file */ - void RestoreAppWidgets(application_manager::ApplicationSharedPtr application, - const smart_objects::SmartObject& saved_app) OVERRIDE; + size_t RestoreAppWidgets( + application_manager::ApplicationSharedPtr application, + const smart_objects::SmartObject& saved_app) OVERRIDE; /** * @brief Remove application from list of saved applications diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index 8044e8b6cd..d6e673b5b5 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -327,6 +327,20 @@ ApplicationSharedPtr ApplicationManagerImpl::active_application() const { return FindApp(accessor, ActiveAppPredicate); } +bool FullOrLimitedAppPredicate(const ApplicationSharedPtr app) { + return app ? app->IsFullscreen() || + app->hmi_level( + mobile_api::PredefinedWindows::DEFAULT_WINDOW) == + mobile_api::HMILevel::HMI_LIMITED + : false; +} + +ApplicationSharedPtr ApplicationManagerImpl::get_full_or_limited_application() + const { + DataAccessor accessor = applications(); + return FindApp(accessor, FullOrLimitedAppPredicate); +} + bool LimitedAppPredicate(const ApplicationSharedPtr app) { return app ? app->hmi_level(mobile_api::PredefinedWindows::DEFAULT_WINDOW) == mobile_api::HMILevel::HMI_LIMITED diff --git a/src/components/application_manager/src/resumption/resume_ctrl_impl.cc b/src/components/application_manager/src/resumption/resume_ctrl_impl.cc index 0e1840e867..1be336c685 100644 --- a/src/components/application_manager/src/resumption/resume_ctrl_impl.cc +++ b/src/components/application_manager/src/resumption/resume_ctrl_impl.cc @@ -214,12 +214,19 @@ bool ResumeCtrlImpl::RestoreAppHMIState(ApplicationSharedPtr application) { "High-bandwidth transport not available, app will resume into : " << saved_hmi_level); } - + const bool app_exists_in_full_or_limited = + application_manager_.get_full_or_limited_application().use_count() != + 0; const bool app_hmi_state_is_set = SetAppHMIState(application, saved_hmi_level, true); + size_t restored_widgets = 0; if (app_hmi_state_is_set && application->is_app_data_resumption_allowed()) { - RestoreAppWidgets(application, saved_app); + restored_widgets = RestoreAppWidgets(application, saved_app); + } + if (0 == restored_widgets && app_exists_in_full_or_limited) { + LOG4CXX_DEBUG(logger_, "App exists in full or limited. Do not resume"); + return false; } } else { result = false; @@ -399,7 +406,7 @@ bool ResumeCtrlImpl::SetAppHMIState( return true; } -void ResumeCtrlImpl::RestoreAppWidgets( +size_t ResumeCtrlImpl::RestoreAppWidgets( application_manager::ApplicationSharedPtr application, const smart_objects::SmartObject& saved_app) { using namespace mobile_apis; @@ -407,7 +414,7 @@ void ResumeCtrlImpl::RestoreAppWidgets( DCHECK(application); if (!saved_app.keyExists(strings::windows_info)) { LOG4CXX_ERROR(logger_, "windows_info section does not exist"); - return; + return 0; } const auto& windows_info = saved_app[strings::windows_info]; auto request_list = MessageHelper::CreateUICreateWindowRequestsToHMI( @@ -419,6 +426,7 @@ void ResumeCtrlImpl::RestoreAppWidgets( (*request)[strings::params][strings::correlation_id].asInt(), request)); } ProcessHMIRequests(request_list); + return request_list.size(); } bool ResumeCtrlImpl::IsHMIApplicationIdExist(uint32_t hmi_app_id) { diff --git a/src/components/application_manager/test/include/application_manager/mock_resume_ctrl.h b/src/components/application_manager/test/include/application_manager/mock_resume_ctrl.h index 56c2ae3cd4..b657f0e86b 100644 --- a/src/components/application_manager/test/include/application_manager/mock_resume_ctrl.h +++ b/src/components/application_manager/test/include/application_manager/mock_resume_ctrl.h @@ -102,8 +102,8 @@ class MockResumeCtrl : public resumption::ResumeCtrl { MOCK_CONST_METHOD0(LaunchTime, time_t()); MOCK_METHOD2(RestoreAppWidgets, - void(app_mngr::ApplicationSharedPtr application, - const smart_objects::SmartObject& saved_app)); + size_t(app_mngr::ApplicationSharedPtr application, + const smart_objects::SmartObject& saved_app)); MOCK_METHOD1(RestoreWidgetsHMIState, void(const smart_objects::SmartObject& response_message)); diff --git a/src/components/application_manager/test/resumption/resume_ctrl_test.cc b/src/components/application_manager/test/resumption/resume_ctrl_test.cc index 9f0430a937..909ebbbb92 100644 --- a/src/components/application_manager/test/resumption/resume_ctrl_test.cc +++ b/src/components/application_manager/test/resumption/resume_ctrl_test.cc @@ -128,6 +128,8 @@ class ResumeCtrlTest : public ::testing::Test { EXPECT_CALL(mock_app_mngr_, CheckResumptionRequiredTransportAvailable(_)) .Times(AtLeast(0)) .WillRepeatedly(Return(true)); + ON_CALL(mock_app_mngr_, get_full_or_limited_application()) + .WillByDefault(Return(ApplicationSharedPtr())); ON_CALL(mock_application_manager_settings_, use_db_for_resumption()) .WillByDefault(Return(false)); diff --git a/src/components/include/application_manager/application_manager.h b/src/components/include/application_manager/application_manager.h index fa2e8941b8..8369d494f4 100644 --- a/src/components/include/application_manager/application_manager.h +++ b/src/components/include/application_manager/application_manager.h @@ -171,6 +171,8 @@ class ApplicationManager { virtual ApplicationSharedPtr application(uint32_t app_id) const = 0; virtual ApplicationSharedPtr active_application() const = 0; + virtual ApplicationSharedPtr get_full_or_limited_application() const = 0; + /** * Function used only by HMI request/response/notification base classes * to change HMI app id to Mobile app id and vice versa. 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 e533228656..cb230805fb 100644 --- a/src/components/include/test/application_manager/mock_application_manager.h +++ b/src/components/include/test/application_manager/mock_application_manager.h @@ -86,6 +86,8 @@ class MockApplicationManager : public application_manager::ApplicationManager { application, application_manager::ApplicationSharedPtr(uint32_t app_id)); MOCK_CONST_METHOD0(active_application, application_manager::ApplicationSharedPtr()); + MOCK_CONST_METHOD0(get_full_or_limited_application, + application_manager::ApplicationSharedPtr()); MOCK_CONST_METHOD2(application, application_manager::ApplicationSharedPtr( const std::string& device_id, -- cgit v1.2.1