diff options
author | mked-luxoft <mked@luxoft.com> | 2019-08-15 15:53:49 +0300 |
---|---|---|
committer | Andriy Byzhynar (GitHub) <AByzhynar@luxoft.com> | 2019-08-20 21:17:13 +0300 |
commit | 1ff190e79fb2a5eaa530ffa824a1a5a59a432ab9 (patch) | |
tree | ba1c0c34f3f0b109352b96f79451e682075031f0 | |
parent | c4cc7348bc95bb4c010ddb0f071dafd36476e893 (diff) | |
download | sdl_core-1ff190e79fb2a5eaa530ffa824a1a5a59a432ab9.tar.gz |
Add accumulating window capabilities
Accumulating window capabilities is needed so SDL can send mobile a
full list of window capabilities in response to GetSystemCapabilities.
At the same time, a new function display_capabilities(window_id) is
introduced, so SDL can send window capabilities of only affected window
to mobile.
14 files changed, 173 insertions, 25 deletions
diff --git a/src/components/application_manager/include/application_manager/application.h b/src/components/application_manager/include/application_manager/application.h index c9e5a3d497..15c01072ed 100644 --- a/src/components/application_manager/include/application_manager/application.h +++ b/src/components/application_manager/include/application_manager/application.h @@ -207,6 +207,15 @@ class DynamicApplicationData { */ virtual smart_objects::SmartObjectSPtr display_capabilities() const = 0; + /** + * @brief Specific display capabilities of application + * @param window id - id of an affected widget + * @return display capabilities of application or NULL-initialized pointer if + * not specified + */ + virtual smart_objects::SmartObjectSPtr display_capabilities( + const WindowID window_id) const = 0; + virtual void load_global_properties(const smart_objects::SmartObject& so) = 0; virtual void set_help_prompt( const smart_objects::SmartObject& help_prompt) = 0; @@ -251,6 +260,12 @@ class DynamicApplicationData { const smart_objects::SmartObject& display_capabilities) = 0; /** + * @brief deletes stored window capability for given window id + * @param window id of capability to remove + */ + virtual void remove_window_capability(const WindowID window_id) = 0; + + /** * @brief Sets layout for application's specific window * @param window_id window id for which layout should be set * @param layout - layout to be set diff --git a/src/components/application_manager/include/application_manager/application_data_impl.h b/src/components/application_manager/include/application_manager/application_data_impl.h index 74857eddb2..dd093c9890 100644 --- a/src/components/application_manager/include/application_manager/application_data_impl.h +++ b/src/components/application_manager/include/application_manager/application_data_impl.h @@ -107,6 +107,8 @@ class DynamicApplicationDataImpl : public virtual Application { smart_objects::SmartObject night_color_scheme() const OVERRIDE; std::string display_layout() const OVERRIDE; smart_objects::SmartObjectSPtr display_capabilities() const OVERRIDE; + smart_objects::SmartObjectSPtr display_capabilities( + const WindowID window_id) const OVERRIDE; void set_window_layout(const WindowID window_id, const std::string& layout) OVERRIDE; @@ -144,6 +146,7 @@ class DynamicApplicationDataImpl : public virtual Application { void set_display_layout(const std::string& layout); void set_display_capabilities( const smart_objects::SmartObject& display_capabilities) OVERRIDE; + void remove_window_capability(const WindowID window_id) OVERRIDE; /* * @brief Adds a command to the in application menu */ diff --git a/src/components/application_manager/include/application_manager/hmi_capabilities_impl.h b/src/components/application_manager/include/application_manager/hmi_capabilities_impl.h index d18932bac5..c75306345b 100644 --- a/src/components/application_manager/include/application_manager/hmi_capabilities_impl.h +++ b/src/components/application_manager/include/application_manager/hmi_capabilities_impl.h @@ -233,7 +233,7 @@ class HMICapabilitiesImpl : public HMICapabilities { * @brief Retrieves information about the display capability * @return Currently supported display capability */ - const smart_objects::SmartObject* system_display_capabilities() + const smart_objects::SmartObjectSPtr system_display_capabilities() const OVERRIDE; /* @@ -598,7 +598,7 @@ class HMICapabilitiesImpl : public HMICapabilities { * display_capabilities_ is not removed. */ smart_objects::SmartObject* display_capabilities_; - smart_objects::SmartObject* system_display_capabilities_; + smart_objects::SmartObjectSPtr system_display_capabilities_; smart_objects::SmartObject* hmi_zone_capabilities_; smart_objects::SmartObject* soft_buttons_capabilities_; smart_objects::SmartObject* button_capabilities_; diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/delete_window_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/delete_window_request.cc index 9a943bb9e3..7f253e25fd 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/delete_window_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/delete_window_request.cc @@ -81,6 +81,7 @@ void DeleteWindowRequest::DeleteWindow( (*message_)[strings::msg_params][strings::window_id].asInt(); app->RemoveWindowInfo(window_id); app->RemoveHMIState(window_id, HmiState::StateID::STATE_ID_REGULAR); + app->remove_window_capability(window_id); } void DeleteWindowRequest::Run() { diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/get_system_capability_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/get_system_capability_request.cc index d8b50e20d0..dfc48ce2d5 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/get_system_capability_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/get_system_capability_request.cc @@ -155,7 +155,7 @@ void GetSystemCapabilityRequest::Run() { case mobile_apis::SystemCapabilityType::DISPLAYS: { auto capabilities = hmi_capabilities.system_display_capabilities(); if (app->display_capabilities()) { - capabilities = app->display_capabilities().get(); + capabilities = app->display_capabilities(); } if (!capabilities) { diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_capability_updated_notification.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_capability_updated_notification.cc index 26d6fea164..8c2c6d1aff 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_capability_updated_notification.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_capability_updated_notification.cc @@ -215,12 +215,17 @@ void OnSystemCapabilityUpdatedNotification::Run() { << " is resuming. Providing cached capabilities"); auto display_caps = app->display_capabilities_builder().display_capabilities(); - capabilities = display_caps.get(); + capabilities = display_caps; } else if (app->display_capabilities()) { LOG4CXX_DEBUG(logger_, "Application " << app->app_id() << " has specific display capabilities"); - capabilities = app->display_capabilities().get(); + const WindowID window_id = + msg_params[strings::system_capability] + [strings::display_capabilities][0] + [strings::window_capabilities][0][strings::window_id] + .asInt(); + capabilities = app->display_capabilities(window_id); } if (!capabilities) { diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/on_bc_system_capability_updated_notification_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/on_bc_system_capability_updated_notification_test.cc index 29f4d02436..cb8894749f 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/on_bc_system_capability_updated_notification_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/on_bc_system_capability_updated_notification_test.cc @@ -81,15 +81,17 @@ TEST_F(OnBCSystemCapabilityUpdatedNotificationTest, [am::strings::system_capability_type] = mobile_apis::SystemCapabilityType::DISPLAYS; - smart_objects::SmartObject system_display_capabilities; + smart_objects::SmartObjectSPtr system_display_capabilities = + std::make_shared<smart_objects::SmartObject>( + smart_objects::SmartType_Null); EXPECT_CALL(mock_hmi_capabilities_, system_display_capabilities()) .Times(2) - .WillRepeatedly(Return(&system_display_capabilities)); + .WillRepeatedly(Return(system_display_capabilities)); EXPECT_CALL( mock_rpc_service_, - SendMessageToHMI(CheckDisplayCapabilities(system_display_capabilities))); + SendMessageToHMI(CheckDisplayCapabilities(*system_display_capabilities))); ASSERT_TRUE(command_->Init()); command_->Run(); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/get_system_capability_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/get_system_capability_request_test.cc index 90797bb1d5..74c61410e8 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/get_system_capability_request_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/get_system_capability_request_test.cc @@ -85,6 +85,9 @@ TEST_F( ON_CALL(*mock_app_, display_capabilities()) .WillByDefault(Return(system_display_capabilities)); + ON_CALL(mock_hmi_capabilities_, system_display_capabilities()) + .WillByDefault(Return(system_display_capabilities)); + EXPECT_CALL( mock_rpc_service_, ManageMobileCommand(MobileResultCodeIs(mobile_apis::Result::SUCCESS), @@ -102,6 +105,9 @@ TEST_F( EXPECT_CALL(*mock_app_, display_capabilities()).WillOnce(Return(nullptr)); + ON_CALL(mock_hmi_capabilities_, system_display_capabilities()) + .WillByDefault(Return(nullptr)); + EXPECT_CALL(mock_rpc_service_, ManageMobileCommand( MobileResultCodeIs(mobile_apis::Result::DATA_NOT_AVAILABLE), diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_system_capability_updated_notification_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_system_capability_updated_notification_test.cc index a7324f14c9..349ada66a2 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_system_capability_updated_notification_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_system_capability_updated_notification_test.cc @@ -58,7 +58,7 @@ const uint32_t kAppId = 2u; } // namespace MATCHER_P(CheckDisplayCapabilities, display_capabilities, "") { - return display_capabilities == + return *display_capabilities == (*arg)[strings::msg_params][strings::system_capability] [strings::display_capabilities]; } @@ -86,10 +86,12 @@ TEST_F( [am::strings::system_capability_type] = mobile_apis::SystemCapabilityType::DISPLAYS; - smart_objects::SmartObject system_display_capabilities; + smart_objects::SmartObjectSPtr system_display_capabilities = + std::make_shared<smart_objects::SmartObject>( + smart_objects::SmartType_Null); ON_CALL(mock_hmi_capabilities_, system_display_capabilities()) - .WillByDefault(Return(&system_display_capabilities)); + .WillByDefault(Return(system_display_capabilities)); sdl_rpc_plugin::SDLRPCPlugin sdl_rpc_plugin; @@ -132,10 +134,12 @@ TEST_F( [am::strings::system_capability_type] = mobile_apis::SystemCapabilityType::DISPLAYS; - smart_objects::SmartObject system_display_capabilities; + smart_objects::SmartObjectSPtr system_display_capabilities = + std::make_shared<smart_objects::SmartObject>( + smart_objects::SmartType_Null); ON_CALL(mock_hmi_capabilities_, system_display_capabilities()) - .WillByDefault(Return(&system_display_capabilities)); + .WillByDefault(Return(system_display_capabilities)); sdl_rpc_plugin::SDLRPCPlugin sdl_rpc_plugin; @@ -172,10 +176,12 @@ TEST_F( [am::strings::system_capability_type] = mobile_apis::SystemCapabilityType::DISPLAYS; - smart_objects::SmartObject system_display_capabilities; + smart_objects::SmartObjectSPtr system_display_capabilities = + std::make_shared<smart_objects::SmartObject>( + smart_objects::SmartType_Null); ON_CALL(mock_hmi_capabilities_, system_display_capabilities()) - .WillByDefault(Return(&system_display_capabilities)); + .WillByDefault(Return(system_display_capabilities)); sdl_rpc_plugin::SDLRPCPlugin sdl_rpc_plugin; diff --git a/src/components/application_manager/src/application_data_impl.cc b/src/components/application_manager/src/application_data_impl.cc index c19998f6c0..f6b87d3a7e 100644 --- a/src/components/application_manager/src/application_data_impl.cc +++ b/src/components/application_manager/src/application_data_impl.cc @@ -359,6 +359,44 @@ DynamicApplicationDataImpl::display_capabilities() const { return display_capabilities_; } +smart_objects::SmartObjectSPtr DynamicApplicationDataImpl::display_capabilities( + const WindowID window_id) const { + LOG4CXX_AUTO_TRACE(logger_); + + auto result_display_caps = std::make_shared<smart_objects::SmartObject>( + smart_objects::SmartType_Array); + const auto window_caps = + (*display_capabilities_)[0][strings::window_capabilities].asArray(); + if (!window_caps) { + LOG4CXX_WARN(logger_, "Current window capabilities are empty"); + // SDL still needs to retreive display capabilities + return display_capabilities_; + } + auto find_res = + std::find_if(window_caps->begin(), + window_caps->end(), + [&window_id](const smart_objects::SmartObject& element) { + if (window_id == element[strings::window_id].asInt()) { + return true; + } + + return false; + }); + + DCHECK(find_res != window_caps->end()); + const auto disp_caps_keys = (*display_capabilities_)[0].enumerate(); + for (const auto& key : disp_caps_keys) { + if (strings::window_capabilities == key) { + continue; + } + (*result_display_caps)[0][key] = (*display_capabilities_)[0][key]; + } + + (*result_display_caps)[0][strings::window_capabilities][0] = *find_res; + + return result_display_caps; +} + void DynamicApplicationDataImpl::load_global_properties( const smart_objects::SmartObject& properties_so) { SetGlobalProperties(properties_so.getElement(strings::vr_help_title), @@ -498,8 +536,80 @@ void DynamicApplicationDataImpl::set_display_layout(const std::string& layout) { void DynamicApplicationDataImpl::set_display_capabilities( const smart_objects::SmartObject& display_capabilities) { + LOG4CXX_AUTO_TRACE(logger_); + const auto& incoming_window_capabilities = + display_capabilities[0][strings::window_capabilities]; + + smart_objects::SmartObject tmp_window_capabilities; + if (display_capabilities_) { + tmp_window_capabilities = + (*display_capabilities_)[0][strings::window_capabilities]; + } + display_capabilities_.reset( new smart_objects::SmartObject(display_capabilities)); + + auto has_window_id = [&tmp_window_capabilities](const WindowID window_id) { + const auto tmp_window_capabilities_arr = tmp_window_capabilities.asArray(); + if (!tmp_window_capabilities_arr) { + return false; + } + + const auto find_res = std::find_if( + tmp_window_capabilities_arr->begin(), + tmp_window_capabilities_arr->end(), + [&window_id](const smart_objects::SmartObject& element) { + LOG4CXX_DEBUG(logger_, + "Searching for " + << window_id << " with element window id " + << element[strings::window_id].asInt()); + if ((!element.keyExists(strings::window_id)) && 0 == window_id) { + return true; + } + const auto current_window_id = element[strings::window_id].asInt(); + if (window_id == current_window_id) { + return true; + } + return false; + }); + + return find_res != tmp_window_capabilities_arr->end(); + }; + for (uint32_t i = 0; i < incoming_window_capabilities.length(); ++i) { + const auto window_id = + incoming_window_capabilities[i][strings::window_id].asInt(); + if (!has_window_id(window_id)) { + tmp_window_capabilities[tmp_window_capabilities.length()] = + incoming_window_capabilities[i]; + } + } + + (*display_capabilities_)[0][strings::window_capabilities] = + tmp_window_capabilities; +} + +void DynamicApplicationDataImpl::remove_window_capability( + const WindowID window_id) { + LOG4CXX_AUTO_TRACE(logger_); + + auto window_capabilities = + (*display_capabilities_)[0][strings::window_capabilities].asArray(); + DCHECK_OR_RETURN_VOID(window_capabilities); + + for (auto it = window_capabilities->begin(); it != window_capabilities->end(); + ++it) { + const auto cur_window_id = (*it).keyExists(strings::window_id) + ? (*it)[strings::window_id].asInt() + : 0; + if (window_id == cur_window_id) { + window_capabilities->erase(it); + return; + } + } + + LOG4CXX_WARN( + logger_, + "No window id " << window_id << " found in display capabilities"); } void DynamicApplicationDataImpl::set_window_layout(const WindowID window_id, diff --git a/src/components/application_manager/src/hmi_capabilities_impl.cc b/src/components/application_manager/src/hmi_capabilities_impl.cc index 1356502b34..6b209ade0c 100644 --- a/src/components/application_manager/src/hmi_capabilities_impl.cc +++ b/src/components/application_manager/src/hmi_capabilities_impl.cc @@ -436,7 +436,6 @@ HMICapabilitiesImpl::HMICapabilitiesImpl(ApplicationManager& app_mngr) , tts_supported_languages_(NULL) , vr_supported_languages_(NULL) , display_capabilities_(NULL) - , system_display_capabilities_(NULL) , hmi_zone_capabilities_(NULL) , soft_buttons_capabilities_(NULL) , button_capabilities_(NULL) @@ -473,7 +472,6 @@ HMICapabilitiesImpl::~HMICapabilitiesImpl() { delete tts_supported_languages_; delete vr_supported_languages_; delete display_capabilities_; - delete system_display_capabilities_; delete hmi_zone_capabilities_; delete soft_buttons_capabilities_; delete button_capabilities_; @@ -620,11 +618,8 @@ void HMICapabilitiesImpl::set_display_capabilities( void HMICapabilitiesImpl::set_system_display_capabilities( const smart_objects::SmartObject& display_capabilities) { - if (system_display_capabilities_) { - delete system_display_capabilities_; - } - system_display_capabilities_ = - new smart_objects::SmartObject(display_capabilities); + system_display_capabilities_.reset( + new smart_objects::SmartObject(display_capabilities)); } void HMICapabilitiesImpl::set_hmi_zone_capabilities( @@ -817,7 +812,7 @@ const smart_objects::SmartObject* HMICapabilitiesImpl::display_capabilities() return display_capabilities_; } -const smart_objects::SmartObject* +const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::system_display_capabilities() const { return system_display_capabilities_; } diff --git a/src/components/application_manager/test/include/application_manager/mock_application.h b/src/components/application_manager/test/include/application_manager/mock_application.h index d90edbe2a1..e0f00f7b3a 100644 --- a/src/components/application_manager/test/include/application_manager/mock_application.h +++ b/src/components/application_manager/test/include/application_manager/mock_application.h @@ -249,6 +249,9 @@ class MockApplication : public ::application_manager::Application { MOCK_CONST_METHOD0(night_color_scheme, smart_objects::SmartObject()); MOCK_CONST_METHOD0(display_layout, std::string()); MOCK_CONST_METHOD0(display_capabilities, smart_objects::SmartObjectSPtr()); + MOCK_CONST_METHOD1(display_capabilities, + smart_objects::SmartObjectSPtr( + const application_manager::WindowID window_id)); MOCK_METHOD2(set_window_layout, void(const application_manager::WindowID window_id, @@ -418,6 +421,8 @@ class MockApplication : public ::application_manager::Application { application_manager::DisplayCapabilitiesBuilder&()); MOCK_METHOD1(GetSoftButtonWindowID, application_manager::WindowID(const uint32_t button_id)); + MOCK_METHOD1(remove_window_capability, + void(const application_manager::WindowID window_id)); }; } // namespace application_manager_test diff --git a/src/components/application_manager/test/include/application_manager/mock_hmi_capabilities.h b/src/components/application_manager/test/include/application_manager/mock_hmi_capabilities.h index 854a72be20..6ca987c1b2 100644 --- a/src/components/application_manager/test/include/application_manager/mock_hmi_capabilities.h +++ b/src/components/application_manager/test/include/application_manager/mock_hmi_capabilities.h @@ -104,7 +104,7 @@ class MockHMICapabilities : public ::application_manager::HMICapabilities { void(const smart_objects::SmartObject& display_capabilities)); MOCK_CONST_METHOD0(system_display_capabilities, - const smart_objects::SmartObject*()); + const smart_objects::SmartObjectSPtr()); MOCK_METHOD1(set_system_display_capabilities, void(const smart_objects::SmartObject& display_capabilities)); diff --git a/src/components/include/application_manager/hmi_capabilities.h b/src/components/include/application_manager/hmi_capabilities.h index 1bd463381d..a30625347d 100644 --- a/src/components/include/application_manager/hmi_capabilities.h +++ b/src/components/include/application_manager/hmi_capabilities.h @@ -233,7 +233,7 @@ class HMICapabilities { * @brief Retrieves information about the display capability * @return Currently supported display capability */ - virtual const smart_objects::SmartObject* system_display_capabilities() + virtual const smart_objects::SmartObjectSPtr system_display_capabilities() const = 0; /* |