diff options
18 files changed, 115 insertions, 22 deletions
diff --git a/src/components/application_manager/include/application_manager/policies/policy_handler.h b/src/components/application_manager/include/application_manager/policies/policy_handler.h index 33b37fb2c8..4c5c923372 100644 --- a/src/components/application_manager/include/application_manager/policies/policy_handler.h +++ b/src/components/application_manager/include/application_manager/policies/policy_handler.h @@ -330,8 +330,9 @@ class PolicyHandler : public PolicyHandlerInterface, * @brief Allows to add new or update existed application during * registration process * @param application_id The policy aplication id. + ** @return function that will notify update manager about new application */ - void AddApplication(const std::string& application_id) OVERRIDE; + StatusNotifier AddApplication(const std::string& application_id) OVERRIDE; /** * Checks whether application is revoked diff --git a/src/components/application_manager/src/commands/mobile/register_app_interface_request.cc b/src/components/application_manager/src/commands/mobile/register_app_interface_request.cc index 699837f225..151037065d 100644 --- a/src/components/application_manager/src/commands/mobile/register_app_interface_request.cc +++ b/src/components/application_manager/src/commands/mobile/register_app_interface_request.cc @@ -634,11 +634,12 @@ void RegisterAppInterfaceRequest::SendRegisterAppInterfaceResponseToMobile() { application->mac_address()); } + policy::StatusNotifier notify_upd_manager = + GetPolicyHandler().AddApplication(application->policy_app_id()); SendResponse(true, result_code, add_info.c_str(), &response_params); SendOnAppRegisteredNotificationToHMI( *(application.get()), resumption, need_restore_vr); - GetPolicyHandler().AddApplication(application->policy_app_id()); // Default HMI level should be set before any permissions validation, since it // relies on HMI level. application_manager_.OnApplicationRegistered(application); @@ -647,6 +648,7 @@ void RegisterAppInterfaceRequest::SendRegisterAppInterfaceResponseToMobile() { // Sends OnPermissionChange notification to mobile right after RAI response // and HMI level set-up GetPolicyHandler().OnAppRegisteredOnMobile(application->policy_app_id()); + (*notify_upd_manager)(); if (result_code != mobile_apis::Result::RESUME_FAILED) { resumer.StartResumption(application, hash_id); diff --git a/src/components/application_manager/src/policies/policy_handler.cc b/src/components/application_manager/src/policies/policy_handler.cc index 513afb9a43..09d01325da 100644 --- a/src/components/application_manager/src/policies/policy_handler.cc +++ b/src/components/application_manager/src/policies/policy_handler.cc @@ -484,9 +484,10 @@ void PolicyHandler::GetAvailableApps(std::queue<std::string>& apps) { } } -void PolicyHandler::AddApplication(const std::string& application_id) { - POLICY_LIB_CHECK_VOID(); - policy_manager_->AddApplication(application_id); +StatusNotifier PolicyHandler::AddApplication( + const std::string& application_id) { + POLICY_LIB_CHECK(utils::MakeShared<utils::CallNothing>()); + return policy_manager_->AddApplication(application_id); } void PolicyHandler::AddDevice(const std::string& device_id, diff --git a/src/components/application_manager/test/include/application_manager/policy_handler_interface_mock.h b/src/components/application_manager/test/include/application_manager/policy_handler_interface_mock.h index da20d8144b..c8e3118ea2 100644 --- a/src/components/application_manager/test/include/application_manager/policy_handler_interface_mock.h +++ b/src/components/application_manager/test/include/application_manager/policy_handler_interface_mock.h @@ -164,7 +164,8 @@ class MockPolicyHandlerInterface : public policy::PolicyHandlerInterface { const std::string& policy_app_id)); MOCK_METHOD0(OnPTExchangeNeeded, void()); MOCK_METHOD1(GetAvailableApps, void(std::queue<std::string>& apps)); - MOCK_METHOD1(AddApplication, void(const std::string& application_id)); + MOCK_METHOD1(AddApplication, + StatusNotifier(const std::string& application_id)); MOCK_METHOD1(IsApplicationRevoked, bool(const std::string& app_id)); MOCK_METHOD0(OnUpdateRequestSentToMobile, void()); MOCK_CONST_METHOD1(HeartBeatTimeout, uint32_t(const std::string& app_id)); diff --git a/src/components/application_manager/test/policy_handler_test.cc b/src/components/application_manager/test/policy_handler_test.cc index 1862b06836..4f80f2e464 100644 --- a/src/components/application_manager/test/policy_handler_test.cc +++ b/src/components/application_manager/test/policy_handler_test.cc @@ -1110,7 +1110,8 @@ TEST_F(PolicyHandlerTest, AddApplication) { // Arrange EnablePolicyAndPolicyManagerMock(); // Check expectations - EXPECT_CALL(*mock_policy_manager_, AddApplication(kPolicyAppId_)); + EXPECT_CALL(*mock_policy_manager_, AddApplication(kPolicyAppId_)) + .WillOnce(Return(utils::MakeShared<utils::CallNothing>())); // Act policy_handler_.AddApplication(kPolicyAppId_); } diff --git a/src/components/include/application_manager/policies/policy_handler_interface.h b/src/components/include/application_manager/policies/policy_handler_interface.h index 8f34fa9ae5..e1623a92c3 100644 --- a/src/components/include/application_manager/policies/policy_handler_interface.h +++ b/src/components/include/application_manager/policies/policy_handler_interface.h @@ -45,8 +45,11 @@ #include "utils/custom_string.h" #include "policy/policy_settings.h" #include "smart_objects/smart_object.h" +#include "utils/callable.h" namespace policy { +typedef utils::SharedPtr<utils::Callable> StatusNotifier; + class PolicyHandlerInterface { public: virtual ~PolicyHandlerInterface() {} @@ -306,8 +309,9 @@ class PolicyHandlerInterface { * @brief Allows to add new or update existed application during * registration process * @param application_id The policy aplication id. + * @return function that will notify update manager about new application */ - virtual void AddApplication(const std::string& application_id) = 0; + virtual StatusNotifier AddApplication(const std::string& application_id) = 0; /** * Checks whether application is revoked diff --git a/src/components/include/policy/policy_external/policy/policy_manager.h b/src/components/include/policy/policy_external/policy/policy_manager.h index c587a00111..7d5bbb5e52 100644 --- a/src/components/include/policy/policy_external/policy/policy_manager.h +++ b/src/components/include/policy/policy_external/policy/policy_manager.h @@ -35,12 +35,15 @@ #include <vector> +#include "utils/callable.h" + #include "policy/policy_types.h" #include "policy/policy_listener.h" #include "usage_statistics/statistics_manager.h" namespace policy { class PolicySettings; +typedef utils::SharedPtr<utils::Callable> StatusNotifier; class PolicyManager : public usage_statistics::StatisticsManager { public: @@ -354,8 +357,9 @@ class PolicyManager : public usage_statistics::StatisticsManager { * @brief Adds, application to the db or update existed one * run PTU if policy update is necessary for application. * @param Application id assigned by Ford to the application + * @return function that will notify update manager about new application */ - virtual void AddApplication(const std::string& application_id) = 0; + virtual StatusNotifier AddApplication(const std::string& application_id) = 0; /** * @brief Removes unpaired device records and related records from DB diff --git a/src/components/include/test/application_manager/policies/mock_policy_handler_interface.h b/src/components/include/test/application_manager/policies/mock_policy_handler_interface.h index 509ca05056..33a86c6f98 100644 --- a/src/components/include/test/application_manager/policies/mock_policy_handler_interface.h +++ b/src/components/include/test/application_manager/policies/mock_policy_handler_interface.h @@ -173,7 +173,8 @@ class MockPolicyHandlerInterface : public policy::PolicyHandlerInterface { const std::string& policy_app_id)); MOCK_METHOD0(OnPTExchangeNeeded, void()); MOCK_METHOD1(GetAvailableApps, void(std::queue<std::string>& apps)); - MOCK_METHOD1(AddApplication, void(const std::string& application_id)); + MOCK_METHOD1(AddApplication, + policy::StatusNotifier(const std::string& application_id)); MOCK_METHOD1(IsApplicationRevoked, bool(const std::string& app_id)); MOCK_METHOD0(OnUpdateRequestSentToMobile, void()); MOCK_CONST_METHOD1(HeartBeatTimeout, uint32_t(const std::string& app_id)); diff --git a/src/components/include/test/policy/policy_external/policy/mock_policy_manager.h b/src/components/include/test/policy/policy_external/policy/mock_policy_manager.h index 31f80859c1..0140efddf5 100644 --- a/src/components/include/test/policy/policy_external/policy/mock_policy_manager.h +++ b/src/components/include/test/policy/policy_external/policy/mock_policy_manager.h @@ -140,7 +140,8 @@ class MockPolicyManager : public PolicyManager { MOCK_METHOD1(SendNotificationOnPermissionsUpdated, void(const std::string& application_id)); MOCK_METHOD1(MarkUnpairedDevice, void(const std::string& device_id)); - MOCK_METHOD1(AddApplication, void(const std::string& application_id)); + MOCK_METHOD1(AddApplication, + StatusNotifier(const std::string& application_id)); MOCK_METHOD0(CleanupUnpairedDevices, bool()); MOCK_CONST_METHOD1(CanAppKeepContext, bool(const std::string& app_id)); MOCK_CONST_METHOD1(CanAppStealFocus, bool(const std::string& app_id)); diff --git a/src/components/include/test/policy/policy_regular/policy/mock_policy_manager.h b/src/components/include/test/policy/policy_regular/policy/mock_policy_manager.h index 5405792d6b..b3f48686e4 100644 --- a/src/components/include/test/policy/policy_regular/policy/mock_policy_manager.h +++ b/src/components/include/test/policy/policy_regular/policy/mock_policy_manager.h @@ -139,7 +139,8 @@ class MockPolicyManager : public PolicyManager { MOCK_METHOD1(SendNotificationOnPermissionsUpdated, void(const std::string& application_id)); MOCK_METHOD1(MarkUnpairedDevice, void(const std::string& device_id)); - MOCK_METHOD1(AddApplication, void(const std::string& application_id)); + MOCK_METHOD1(AddApplication, + StatusNotifier(const std::string& application_id)); MOCK_METHOD0(CleanupUnpairedDevices, bool()); MOCK_CONST_METHOD1(CanAppKeepContext, bool(const std::string& app_id)); MOCK_CONST_METHOD1(CanAppStealFocus, bool(const std::string& app_id)); diff --git a/src/components/include/utils/callable.h b/src/components/include/utils/callable.h new file mode 100644 index 0000000000..aff91814bf --- /dev/null +++ b/src/components/include/utils/callable.h @@ -0,0 +1,26 @@ +#ifndef SRC_COMPONENTS_INCLUDE_UTILS_CALLABLE_H +#define SRC_COMPONENTS_INCLUDE_UTILS_CALLABLE_H + +#include "utils/macro.h" + +namespace utils { +/** + * @brief The Callable class allows + * to create functor to call in other context + */ +class Callable { + public: + virtual void operator()() const = 0; + virtual ~Callable() {} +}; + +/** + * @brief The CallNothing class functior that to nothing + */ +class CallNothing : public Callable { + // Callable interface + public: + void operator()() const OVERRIDE {} +}; +} // namespace utils +#endif // SRC_COMPONENTS_INCLUDE_UTILS_CALLABLE_H diff --git a/src/components/policy/policy_external/include/policy/policy_manager_impl.h b/src/components/policy/policy_external/include/policy/policy_manager_impl.h index 505c9f71ce..55b5ab1212 100644 --- a/src/components/policy/policy_external/include/policy/policy_manager_impl.h +++ b/src/components/policy/policy_external/include/policy/policy_manager_impl.h @@ -166,7 +166,7 @@ class PolicyManagerImpl : public PolicyManager { bool CanAppStealFocus(const std::string& app_id) const; void MarkUnpairedDevice(const std::string& device_id); - void AddApplication(const std::string& application_id); + StatusNotifier AddApplication(const std::string& application_id); virtual void RemoveAppConsentForGroup(const std::string& app_id, const std::string& group_name); diff --git a/src/components/policy/policy_external/src/policy_manager_impl.cc b/src/components/policy/policy_external/src/policy_manager_impl.cc index 737fbf16f8..88d810ecc2 100644 --- a/src/components/policy/policy_external/src/policy_manager_impl.cc +++ b/src/components/policy/policy_external/src/policy_manager_impl.cc @@ -47,6 +47,7 @@ #include "policy/cache_manager.h" #include "policy/update_status_manager.h" #include "config_profile/profile.h" +#include "utils/make_shared.h" policy::PolicyManager* CreateManager() { return new policy::PolicyManagerImpl(); @@ -1189,7 +1190,27 @@ void PolicyManagerImpl::SetDecryptedCertificate( cache_->SetDecryptedCertificate(certificate); } -void PolicyManagerImpl::AddApplication(const std::string& application_id) { +/** + * @brief The CallStatusChange class notify update manager aboun new application + */ +class CallStatusChange : public utils::Callable { + public: + CallStatusChange(UpdateStatusManager& upd_manager, + const DeviceConsent& device_consent) + : upd_manager_(upd_manager), device_consent_(device_consent) {} + + // Callable interface + void operator()() const { + upd_manager_.OnNewApplicationAdded(device_consent_); + } + + private: + UpdateStatusManager& upd_manager_; + const DeviceConsent device_consent_; +}; + +StatusNotifier PolicyManagerImpl::AddApplication( + const std::string& application_id) { LOG4CXX_AUTO_TRACE(logger_); const std::string device_id = GetCurrentDeviceId(application_id); DeviceConsent device_consent = GetUserConsentForDevice(device_id); @@ -1197,9 +1218,11 @@ void PolicyManagerImpl::AddApplication(const std::string& application_id) { if (IsNewApplication(application_id)) { AddNewApplication(application_id, device_consent); - update_status_manager_.OnNewApplicationAdded(device_consent); + return utils::MakeShared<CallStatusChange>(update_status_manager_, + device_consent); } else { PromoteExistedApplication(application_id, device_consent); + return utils::MakeShared<utils::CallNothing>(); } } diff --git a/src/components/policy/policy_regular/include/policy/policy_manager.h b/src/components/policy/policy_regular/include/policy/policy_manager.h index 1f726d308e..0bd72faaae 100644 --- a/src/components/policy/policy_regular/include/policy/policy_manager.h +++ b/src/components/policy/policy_regular/include/policy/policy_manager.h @@ -36,12 +36,14 @@ #include <vector> #include <cstdint> +#include "utils/callable.h" #include "policy/policy_types.h" #include "policy/policy_listener.h" #include "policy/usage_statistics/statistics_manager.h" namespace policy { class PolicySettings; +typedef utils::SharedPtr<utils::Callable> StatusNotifier; class PolicyManager : public usage_statistics::StatisticsManager { public: @@ -352,8 +354,9 @@ class PolicyManager : public usage_statistics::StatisticsManager { * @brief Adds, application to the db or update existed one * run PTU if policy update is necessary for application. * @param Application id assigned by Ford to the application + * @return function that will notify update manager about new application */ - virtual void AddApplication(const std::string& application_id) = 0; + virtual StatusNotifier AddApplication(const std::string& application_id) = 0; /** * @brief Removes unpaired device records and related records from DB diff --git a/src/components/policy/policy_regular/include/policy/policy_manager_impl.h b/src/components/policy/policy_regular/include/policy/policy_manager_impl.h index 31e4ab454c..c7773d7728 100644 --- a/src/components/policy/policy_regular/include/policy/policy_manager_impl.h +++ b/src/components/policy/policy_regular/include/policy/policy_manager_impl.h @@ -171,7 +171,7 @@ class PolicyManagerImpl : public PolicyManager { bool CanAppStealFocus(const std::string& app_id) const; void MarkUnpairedDevice(const std::string& device_id); - void AddApplication(const std::string& application_id); + StatusNotifier AddApplication(const std::string& application_id); virtual void RemoveAppConsentForGroup(const std::string& app_id, const std::string& group_name); diff --git a/src/components/policy/policy_regular/src/policy_manager_impl.cc b/src/components/policy/policy_regular/src/policy_manager_impl.cc index ac82c9ebcb..8b02f7fc5b 100644 --- a/src/components/policy/policy_regular/src/policy_manager_impl.cc +++ b/src/components/policy/policy_regular/src/policy_manager_impl.cc @@ -49,6 +49,7 @@ #include "policy/update_status_manager.h" #include "config_profile/profile.h" #include "utils/timer_task_impl.h" +#include "utils/make_shared.h" policy::PolicyManager* CreateManager() { return new policy::PolicyManagerImpl(); @@ -58,7 +59,8 @@ void DeleteManager(policy::PolicyManager* pm) { } namespace { -const uint32_t kDefaultRetryTimeoutInMSec = 60u * date_time::DateTime::MILLISECONDS_IN_SECOND; +const uint32_t kDefaultRetryTimeoutInMSec = + 60u * date_time::DateTime::MILLISECONDS_IN_SECOND; } // namespace namespace policy { @@ -894,7 +896,24 @@ std::string PolicyManagerImpl::RetrieveCertificate() const { return cache_->GetCertificate(); } -void PolicyManagerImpl::AddApplication(const std::string& application_id) { +class CallStatusChange : public utils::Callable { + public: + CallStatusChange(UpdateStatusManager& upd_manager, + const DeviceConsent& device_consent) + : upd_manager_(upd_manager), device_consent_(device_consent) {} + + // Callable interface + void operator()() const { + upd_manager_.OnNewApplicationAdded(device_consent_); + } + + private: + UpdateStatusManager& upd_manager_; + const DeviceConsent device_consent_; +}; + +StatusNotifier PolicyManagerImpl::AddApplication( + const std::string& application_id) { LOG4CXX_AUTO_TRACE(logger_); const std::string device_id = GetCurrentDeviceId(application_id); DeviceConsent device_consent = GetUserConsentForDevice(device_id); @@ -902,9 +921,11 @@ void PolicyManagerImpl::AddApplication(const std::string& application_id) { if (IsNewApplication(application_id)) { AddNewApplication(application_id, device_consent); - update_status_manager_.OnNewApplicationAdded(device_consent); + return utils::MakeShared<CallStatusChange>(update_status_manager_, + device_consent); } else { PromoteExistedApplication(application_id, device_consent); + return utils::MakeShared<utils::CallNothing>(); } } diff --git a/src/components/policy/policy_regular/test/include/policy/mock_policy_manager.h b/src/components/policy/policy_regular/test/include/policy/mock_policy_manager.h index b63bdf2d19..ff54807ef2 100644 --- a/src/components/policy/policy_regular/test/include/policy/mock_policy_manager.h +++ b/src/components/policy/policy_regular/test/include/policy/mock_policy_manager.h @@ -137,7 +137,8 @@ class MockPolicyManager : public PolicyManager { MOCK_METHOD1(SendNotificationOnPermissionsUpdated, void(const std::string& application_id)); MOCK_METHOD1(MarkUnpairedDevice, void(const std::string& device_id)); - MOCK_METHOD1(AddApplication, void(const std::string& application_id)); + MOCK_METHOD1(AddApplication, + StatusNotifier(const std::string& application_id)); MOCK_METHOD0(CleanupUnpairedDevices, bool()); MOCK_CONST_METHOD1(CanAppKeepContext, bool(const std::string& app_id)); MOCK_CONST_METHOD1(CanAppStealFocus, bool(const std::string& app_id)); diff --git a/src/components/policy/policy_regular/test/policy_manager_impl_test.cc b/src/components/policy/policy_regular/test/policy_manager_impl_test.cc index 2f241fa069..51bd1f4fe5 100644 --- a/src/components/policy/policy_regular/test/policy_manager_impl_test.cc +++ b/src/components/policy/policy_regular/test/policy_manager_impl_test.cc @@ -771,7 +771,9 @@ TEST_F( AddApplication_AddNewApplicationFromDeviceWithoutConsent_ExpectUpdateRequired) { // Arrange CreateLocalPT("sdl_preloaded_pt.json"); - manager->AddApplication(app_id1); + ::policy::StatusNotifier notifyer = manager->AddApplication(app_id1); + DCHECK(notifyer); + (*notifyer)(); EXPECT_EQ("UPDATE_NEEDED", manager->GetPolicyTableStatus()); } |