summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJackLivio <jack@livio.io>2019-11-13 16:51:37 -0500
committerGitHub <noreply@github.com>2019-11-13 16:51:37 -0500
commit2eafae9d0ae0b352d3b30bd1409bebdcfc447988 (patch)
tree76813b5efc628cf7816fda69a416a1a743f1acc3
parent891497bc9fb23434242dbe92e1f13dd1273fcb21 (diff)
downloadsdl_core-2eafae9d0ae0b352d3b30bd1409bebdcfc447988.tar.gz
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
-rw-r--r--src/components/application_manager/include/application_manager/application_manager_impl.h2
-rw-r--r--src/components/application_manager/include/application_manager/resumption/resume_ctrl.h4
-rw-r--r--src/components/application_manager/include/application_manager/resumption/resume_ctrl_impl.h5
-rw-r--r--src/components/application_manager/src/application_manager_impl.cc14
-rw-r--r--src/components/application_manager/src/resumption/resume_ctrl_impl.cc16
-rw-r--r--src/components/application_manager/test/include/application_manager/mock_resume_ctrl.h4
-rw-r--r--src/components/application_manager/test/resumption/resume_ctrl_test.cc2
-rw-r--r--src/components/include/application_manager/application_manager.h2
-rw-r--r--src/components/include/test/application_manager/mock_application_manager.h2
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<ApplicationSet> 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,