diff options
author | JackLivio <jack@livio.io> | 2018-05-21 16:13:16 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-05-21 16:13:16 -0400 |
commit | 0529c83d073601048ca77a8957ea29e371e186e1 (patch) | |
tree | 409bc9c6f38d258e0f7c1fe61b13aaac568a73c1 | |
parent | 85f11be01d76770707efb350544676438e7fcf66 (diff) | |
parent | 6d5271c700975ed5bdeda486844356cb03aaedc5 (diff) | |
download | sdl_core-0529c83d073601048ca77a8957ea29e371e186e1.tar.gz |
Merge pull request #2158 from smartdevicelink/feature/0147_template_color_schemes
Implementation of color schemes
13 files changed, 242 insertions, 3 deletions
diff --git a/src/components/application_manager/include/application_manager/application.h b/src/components/application_manager/include/application_manager/application.h index 0c93f7447b..01e3bf6b56 100644 --- a/src/components/application_manager/include/application_manager/application.h +++ b/src/components/application_manager/include/application_manager/application.h @@ -189,6 +189,9 @@ class DynamicApplicationData { virtual const smart_objects::SmartObject* keyboard_props() const = 0; virtual const smart_objects::SmartObject* menu_title() const = 0; virtual const smart_objects::SmartObject* menu_icon() const = 0; + virtual const smart_objects::SmartObject* day_color_scheme() const = 0; + virtual const smart_objects::SmartObject* night_color_scheme() const = 0; + virtual const std::string& display_layout() const = 0; virtual void load_global_properties(const smart_objects::SmartObject& so) = 0; virtual void set_help_prompt( @@ -220,6 +223,12 @@ class DynamicApplicationData { virtual void set_video_stream_retry_number( const uint32_t& video_stream_retry_number) = 0; + virtual void set_day_color_scheme( + const smart_objects::SmartObject& color_scheme) = 0; + virtual void set_night_color_scheme( + const smart_objects::SmartObject& color_scheme) = 0; + + virtual void set_display_layout(const std::string& layout) = 0; /** * @brief Checks if application is media, voice communication or navigation * @return true if application is media, voice communication or navigation, 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 64b5f8780b..dc9be4e1d8 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 @@ -55,6 +55,7 @@ class InitialApplicationDataImpl : public virtual Application { const smart_objects::SmartObject* ngn_media_screen_name() const; const mobile_api::Language::eType& language() const; const mobile_api::Language::eType& ui_language() const; + void set_app_types(const smart_objects::SmartObject& app_types); void set_vr_synonyms(const smart_objects::SmartObject& vr_synonyms); void set_mobile_app_id(const std::string& policy_app_id); @@ -95,6 +96,9 @@ class DynamicApplicationDataImpl : public virtual Application { const smart_objects::SmartObject* keyboard_props() const; const smart_objects::SmartObject* menu_title() const; const smart_objects::SmartObject* menu_icon() const; + const smart_objects::SmartObject* day_color_scheme() const; + const smart_objects::SmartObject* night_color_scheme() const; + const std::string& display_layout() const; void load_global_properties(const smart_objects::SmartObject& properties_so); void set_help_prompt(const smart_objects::SmartObject& help_prompt); @@ -109,6 +113,9 @@ class DynamicApplicationDataImpl : public virtual Application { void set_keyboard_props(const smart_objects::SmartObject& keyboard_props); void set_menu_title(const smart_objects::SmartObject& menu_title); void set_menu_icon(const smart_objects::SmartObject& menu_icon); + void set_day_color_scheme(const smart_objects::SmartObject& color_scheme); + void set_night_color_scheme(const smart_objects::SmartObject& color_scheme); + void set_display_layout(const std::string& layout); /* * @brief Adds a command to the in application menu */ @@ -263,6 +270,9 @@ class DynamicApplicationDataImpl : public virtual Application { smart_objects::SmartObject* menu_title_; smart_objects::SmartObject* menu_icon_; smart_objects::SmartObject* tbt_show_command_; + smart_objects::SmartObject* day_color_scheme_; + smart_objects::SmartObject* night_color_scheme_; + std::string display_layout_; CommandsMap commands_; mutable sync_primitives::Lock commands_lock_; diff --git a/src/components/application_manager/include/application_manager/smart_object_keys.h b/src/components/application_manager/include/application_manager/smart_object_keys.h index 0694447004..5e9e07ac76 100644 --- a/src/components/application_manager/include/application_manager/smart_object_keys.h +++ b/src/components/application_manager/include/application_manager/smart_object_keys.h @@ -178,6 +178,15 @@ extern const char* navigation_capability; extern const char* phone_capability; extern const char* video_streaming_capability; extern const char* rc_capability; +extern const char* day_color_scheme; +extern const char* night_color_scheme; +extern const char* primary_color; +extern const char* secondary_color; +extern const char* background_color; +extern const char* red; +extern const char* green; +extern const char* blue; +extern const char* display_layout; // PutFile extern const char* sync_file_name; diff --git a/src/components/application_manager/src/application_data_impl.cc b/src/components/application_manager/src/application_data_impl.cc index a81540708c..226c83dbf6 100644 --- a/src/components/application_manager/src/application_data_impl.cc +++ b/src/components/application_manager/src/application_data_impl.cc @@ -173,6 +173,9 @@ DynamicApplicationDataImpl::DynamicApplicationDataImpl() , menu_title_(NULL) , menu_icon_(NULL) , tbt_show_command_(NULL) + , day_color_scheme_(NULL) + , night_color_scheme_(NULL) + , display_layout_("") , commands_() , commands_lock_(true) , sub_menu_() @@ -214,6 +217,16 @@ DynamicApplicationDataImpl::~DynamicApplicationDataImpl() { tbt_show_command_ = NULL; } + if (day_color_scheme_) { + delete day_color_scheme_; + day_color_scheme_ = NULL; + } + + if (night_color_scheme_) { + delete night_color_scheme_; + night_color_scheme_ = NULL; + } + for (CommandsMap::iterator command_it = commands_.begin(); commands_.end() != command_it; ++command_it) { @@ -290,6 +303,20 @@ const smart_objects::SmartObject* DynamicApplicationDataImpl::menu_icon() return menu_icon_; } +const smart_objects::SmartObject* DynamicApplicationDataImpl::day_color_scheme() + const { + return day_color_scheme_; +} + +const smart_objects::SmartObject* +DynamicApplicationDataImpl::night_color_scheme() const { + return night_color_scheme_; +} + +const std::string& DynamicApplicationDataImpl::display_layout() const { + return display_layout_; +} + void DynamicApplicationDataImpl::load_global_properties( const smart_objects::SmartObject& properties_so) { SetGlobalProperties(properties_so.getElement(strings::vr_help_title), @@ -405,6 +432,28 @@ void DynamicApplicationDataImpl::set_menu_icon( menu_icon_ = new smart_objects::SmartObject(menu_icon); } +void DynamicApplicationDataImpl::set_day_color_scheme( + const smart_objects::SmartObject& color_scheme) { + if (day_color_scheme_) { + delete day_color_scheme_; + } + + day_color_scheme_ = new smart_objects::SmartObject(color_scheme); +} + +void DynamicApplicationDataImpl::set_night_color_scheme( + const smart_objects::SmartObject& color_scheme) { + if (night_color_scheme_) { + delete night_color_scheme_; + } + + night_color_scheme_ = new smart_objects::SmartObject(color_scheme); +} + +void DynamicApplicationDataImpl::set_display_layout(const std::string& layout) { + display_layout_ = layout; +} + void DynamicApplicationDataImpl::SetGlobalProperties( const smart_objects::SmartObject& param, void (DynamicApplicationData::*callback)( 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 a3a30ddb20..c799d68609 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 @@ -348,6 +348,15 @@ void RegisterAppInterfaceRequest::Run() { } } + if (msg_params.keyExists(strings::day_color_scheme)) { + application->set_day_color_scheme(msg_params[strings::day_color_scheme]); + } + + if (msg_params.keyExists(strings::night_color_scheme)) { + application->set_night_color_scheme( + msg_params[strings::night_color_scheme]); + } + // Add device to policy table and set device info, if any policy::DeviceParams dev_params; if (-1 == @@ -884,6 +893,18 @@ void RegisterAppInterfaceRequest::SendOnAppRegisteredNotificationToHMI( device_info[strings::transport_type] = application_manager_.GetDeviceTransportType(transport_type); + const smart_objects::SmartObject* day_color_scheme = + application_impl.day_color_scheme(); + if (day_color_scheme) { + application[strings::day_color_scheme] = *day_color_scheme; + } + + const smart_objects::SmartObject* night_color_scheme = + application_impl.night_color_scheme(); + if (night_color_scheme) { + application[strings::night_color_scheme] = *night_color_scheme; + } + DCHECK(application_manager_.ManageHMICommand(notification)); } diff --git a/src/components/application_manager/src/commands/mobile/set_display_layout_request.cc b/src/components/application_manager/src/commands/mobile/set_display_layout_request.cc index 38b62ce731..648a531e92 100644 --- a/src/components/application_manager/src/commands/mobile/set_display_layout_request.cc +++ b/src/components/application_manager/src/commands/mobile/set_display_layout_request.cc @@ -48,8 +48,7 @@ SetDisplayLayoutRequest::~SetDisplayLayoutRequest() {} void SetDisplayLayoutRequest::Run() { LOG4CXX_AUTO_TRACE(logger_); - ApplicationConstSharedPtr app = - application_manager_.application(connection_key()); + ApplicationSharedPtr app = application_manager_.application(connection_key()); if (!app) { LOG4CXX_ERROR(logger_, "Application is not registered"); @@ -57,6 +56,58 @@ void SetDisplayLayoutRequest::Run() { return; } + const smart_objects::SmartObject& msg_params = + (*message_)[strings::msg_params]; + + std::string old_layout = app->display_layout(); + std::string new_layout = ""; + + if (msg_params.keyExists(strings::display_layout)) { + new_layout = msg_params[strings::display_layout].asString(); + } + + if (new_layout != old_layout && + !new_layout.empty()) { // Template switched, allow any color change + LOG4CXX_DEBUG(logger_, + "SetDisplayLayoutRequest New Layout: " << new_layout); + app->set_display_layout(new_layout); + } else { + LOG4CXX_DEBUG(logger_, "SetDisplayLayoutRequest No Layout Change"); + // Template layout is the same as previous layout + // Reject message if colors are set + if (msg_params.keyExists(strings::day_color_scheme) && + app->day_color_scheme() != NULL && + !(msg_params[strings::day_color_scheme] == + *(app->day_color_scheme()))) { + // Color scheme param exists and has been previously set, do not allow + // color change + LOG4CXX_DEBUG(logger_, "Reject Day Color Scheme Change"); + SendResponse(false, mobile_apis::Result::REJECTED); + return; + } + + if (msg_params.keyExists(strings::night_color_scheme) && + app->night_color_scheme() != NULL && + !(msg_params[strings::night_color_scheme] == + *(app->night_color_scheme()))) { + // Color scheme param exists and has been previously set, do not allow + // color change + LOG4CXX_DEBUG(logger_, "Reject Night Color Scheme Change"); + SendResponse(false, mobile_apis::Result::REJECTED); + return; + } + } + + if (msg_params.keyExists(strings::day_color_scheme)) { + LOG4CXX_DEBUG(logger_, "Allow Day Color Scheme Change"); + app->set_day_color_scheme(msg_params[strings::day_color_scheme]); + } + + if (msg_params.keyExists(strings::night_color_scheme)) { + LOG4CXX_DEBUG(logger_, "Allow Night Color Scheme Change"); + app->set_night_color_scheme(msg_params[strings::night_color_scheme]); + } + (*message_)[strings::msg_params][strings::app_id] = app->app_id(); StartAwaitForInterface(HmiInterfaces::HMI_INTERFACE_UI); SendHMIRequest(hmi_apis::FunctionID::UI_SetDisplayLayout, diff --git a/src/components/application_manager/src/message_helper/message_helper.cc b/src/components/application_manager/src/message_helper/message_helper.cc index 6938677ed0..f577f30c32 100644 --- a/src/components/application_manager/src/message_helper/message_helper.cc +++ b/src/components/application_manager/src/message_helper/message_helper.cc @@ -1678,6 +1678,9 @@ bool MessageHelper::CreateHMIApplicationStruct( const smart_objects::SmartObject* app_types = app->app_types(); const smart_objects::SmartObject* ngn_media_screen_name = app->ngn_media_screen_name(); + const smart_objects::SmartObject* day_color_scheme = app->day_color_scheme(); + const smart_objects::SmartObject* night_color_scheme = + app->night_color_scheme(); std::string device_name; std::string mac_address; std::string transport_type; @@ -1715,6 +1718,14 @@ bool MessageHelper::CreateHMIApplicationStruct( message[strings::app_type] = *app_types; } + if (day_color_scheme) { + message[strings::day_color_scheme] = *day_color_scheme; + } + + if (night_color_scheme) { + message[strings::night_color_scheme] = *night_color_scheme; + } + message[strings::device_info] = smart_objects::SmartObject(smart_objects::SmartType_Map); message[strings::device_info][strings::name] = device_name; diff --git a/src/components/application_manager/src/smart_object_keys.cc b/src/components/application_manager/src/smart_object_keys.cc index 5cba083a51..92387e63c0 100644 --- a/src/components/application_manager/src/smart_object_keys.cc +++ b/src/components/application_manager/src/smart_object_keys.cc @@ -142,6 +142,15 @@ const char* navigation_capability = "navigationCapability"; const char* phone_capability = "phoneCapability"; const char* video_streaming_capability = "videoStreamingCapability"; const char* rc_capability = "remoteControlCapability"; +const char* day_color_scheme = "dayColorScheme"; +const char* night_color_scheme = "nightColorScheme"; +const char* primary_color = "primaryColor"; +const char* secondary_color = "secondaryColor"; +const char* background_color = "backgroundColor"; +const char* red = "red"; +const char* green = "green"; +const char* blue = "blue"; +const char* display_layout = "displayLayout"; // PutFile const char* sync_file_name = "syncFileName"; diff --git a/src/components/application_manager/test/commands/mobile/set_display_layout_test.cc b/src/components/application_manager/test/commands/mobile/set_display_layout_test.cc index 8444b88d63..3e1785a3bd 100644 --- a/src/components/application_manager/test/commands/mobile/set_display_layout_test.cc +++ b/src/components/application_manager/test/commands/mobile/set_display_layout_test.cc @@ -69,6 +69,7 @@ const uint32_t kAppId = 1u; const uint32_t kCmdId = 1u; const uint32_t kConnectionKey = 2u; const uint32_t kCorrelationKey = 2u; +const std::string kLayout = "media"; } // namespace MATCHER_P(CheckMshCorrId, corr_id, "") { @@ -189,6 +190,7 @@ TEST_F(SetDisplayLayoutRequestTest, Run_SUCCESS) { MockAppPtr mock_app(CreateMockApp()); EXPECT_CALL(app_mngr_, application(kConnectionKey)) .WillOnce(Return(mock_app)); + EXPECT_CALL(*mock_app, display_layout()).WillOnce(ReturnRef(kLayout)); EXPECT_CALL(*mock_app, app_id()).WillOnce(Return(kAppId)); EXPECT_CALL(app_mngr_, GetNextHMICorrelationID()) 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 5bf2f2368e..c46a0b994f 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 @@ -209,6 +209,9 @@ class MockApplication : public ::application_manager::Application { MOCK_CONST_METHOD0(keyboard_props, const smart_objects::SmartObject*()); MOCK_CONST_METHOD0(menu_title, const smart_objects::SmartObject*()); MOCK_CONST_METHOD0(menu_icon, const smart_objects::SmartObject*()); + MOCK_CONST_METHOD0(day_color_scheme, const smart_objects::SmartObject*()); + MOCK_CONST_METHOD0(night_color_scheme, const smart_objects::SmartObject*()); + MOCK_CONST_METHOD0(display_layout, const std::string&()); MOCK_METHOD1(load_global_properties, void(const smart_objects::SmartObject& so)); MOCK_METHOD1(set_help_prompt, @@ -232,6 +235,11 @@ class MockApplication : public ::application_manager::Application { void(const smart_objects::SmartObject& menu_title)); MOCK_METHOD1(set_menu_icon, void(const smart_objects::SmartObject& menu_icon)); + MOCK_METHOD1(set_day_color_scheme, + void(const smart_objects::SmartObject& color_scheme)); + MOCK_METHOD1(set_night_color_scheme, + void(const smart_objects::SmartObject& color_scheme)); + MOCK_METHOD1(set_display_layout, void(const std::string& layout)); MOCK_CONST_METHOD0(audio_stream_retry_number, uint32_t()); MOCK_METHOD1(set_audio_stream_retry_number, void(const uint32_t& audio_stream_retry_number)); diff --git a/src/components/interfaces/HMI_API.xml b/src/components/interfaces/HMI_API.xml index cdb3b474a5..0115f9f5f5 100644 --- a/src/components/interfaces/HMI_API.xml +++ b/src/components/interfaces/HMI_API.xml @@ -1874,6 +1874,27 @@ </param> </struct> +<struct name="RGBColor"> + <param name="red" type="Integer" minvalue="0" maxvalue="255" mandatory="true" /> + <param name="green" type="Integer" minvalue="0" maxvalue="255" mandatory="true" /> + <param name="blue" type="Integer" minvalue="0" maxvalue="255" mandatory="true" /> +</struct> + +<struct name="TemplateColorScheme"> + <description> + A color scheme for all display layout templates. + </description> + <param name="primaryColor" type="Common.RGBColor" mandatory="false"> + <description>The primary "accent" color</description> + </param> + <param name="secondaryColor" type="Common.RGBColor" mandatory="false"> + <description>The secondary "accent" color</description> + </param> + <param name="backgroundColor" type="Common.RGBColor" mandatory="false"> + <description>The color of the background</description> + </param> +</struct> + <struct name="HMIApplication"> <description>Data type containing information about application needed by HMI.</description> <param name="appName" type="String" maxlength="100" mandatory="true"> @@ -1931,6 +1952,8 @@ <description>If SDL omits this parameter - none RequestType is allowed for this app</description> <description>(either this is a pre-registered app or such is dictated by policies).</description> </param> + <param name="dayColorScheme" type="Common.TemplateColorScheme" mandatory="false"></param> + <param name="nightColorScheme" type="Common.TemplateColorScheme" mandatory="false"></param> </struct> <struct name="MenuParams"> @@ -3674,6 +3697,8 @@ <param name="appID" type="Integer" mandatory="true"> <description>ID of application related to this RPC.</description> </param> + <param name="dayColorScheme" type="Common.TemplateColorScheme" mandatory="false"></param> + <param name="nightColorScheme" type="Common.TemplateColorScheme" mandatory="false"></param> </function> <function name="SetDisplayLayout" messagetype="response"> <param name="displayCapabilities" type="Common.DisplayCapabilities" mandatory="false"> diff --git a/src/components/interfaces/MOBILE_API.xml b/src/components/interfaces/MOBILE_API.xml index b5e2143bc2..c6837866e5 100644 --- a/src/components/interfaces/MOBILE_API.xml +++ b/src/components/interfaces/MOBILE_API.xml @@ -2892,7 +2892,27 @@ <description>The position of the haptic rectangle to be highlighted. The center of this rectangle will be "touched" when a press occurs.</description> </param> </struct> - + + <struct name="RGBColor"> + <param name="red" type="Integer" minvalue="0" maxvalue="255" mandatory="true" /> + <param name="green" type="Integer" minvalue="0" maxvalue="255" mandatory="true" /> + <param name="blue" type="Integer" minvalue="0" maxvalue="255" mandatory="true" /> + </struct> + + <struct name="TemplateColorScheme"> + <description> + A color scheme for all display layout templates. + </description> + <param name="primaryColor" type="RGBColor" mandatory="false"> + <description>The primary "accent" color</description> + </param> + <param name="secondaryColor" type="RGBColor" mandatory="false"> + <description>The secondary "accent" color</description> + </param> + <param name="backgroundColor" type="RGBColor" mandatory="false"> + <description>The color of the background</description> + </param> + </struct> <!-- Requests/Responses --> <function name="RegisterAppInterface" functionID="RegisterAppInterfaceID" messagetype="request"> @@ -2993,6 +3013,10 @@ See AppInfo. </description> </param> + + <param name="dayColorScheme" type="TemplateColorScheme" mandatory="false"/> + + <param name="nightColorScheme" type="TemplateColorScheme" mandatory="false"/> </function> <function name="RegisterAppInterface" functionID="RegisterAppInterfaceID" messagetype="response"> @@ -5268,6 +5292,9 @@ </description> </param> + <param name="dayColorScheme" type="TemplateColorScheme" mandatory="false"/> + + <param name="nightColorScheme" type="TemplateColorScheme" mandatory="false"/> </function> <function name="SetDisplayLayout" functionID="SetDisplayLayoutID" messagetype="response"> diff --git a/src/components/remote_control/test/include/mock_application.h b/src/components/remote_control/test/include/mock_application.h index a46b48673d..ef7c1d63a7 100644 --- a/src/components/remote_control/test/include/mock_application.h +++ b/src/components/remote_control/test/include/mock_application.h @@ -216,6 +216,9 @@ class MockApplication : public ::application_manager::Application { MOCK_CONST_METHOD0(keyboard_props, const smart_objects::SmartObject*()); MOCK_CONST_METHOD0(menu_title, const smart_objects::SmartObject*()); MOCK_CONST_METHOD0(menu_icon, const smart_objects::SmartObject*()); + MOCK_CONST_METHOD0(day_color_scheme, const smart_objects::SmartObject*()); + MOCK_CONST_METHOD0(night_color_scheme, const smart_objects::SmartObject*()); + MOCK_CONST_METHOD0(display_layout, const std::string&()); MOCK_METHOD1(load_global_properties, void(const smart_objects::SmartObject& so)); MOCK_METHOD1(set_help_prompt, @@ -239,6 +242,11 @@ class MockApplication : public ::application_manager::Application { void(const smart_objects::SmartObject& menu_title)); MOCK_METHOD1(set_menu_icon, void(const smart_objects::SmartObject& menu_icon)); + MOCK_METHOD1(set_day_color_scheme, + void(const smart_objects::SmartObject& color_scheme)); + MOCK_METHOD1(set_night_color_scheme, + void(const smart_objects::SmartObject& color_scheme)); + MOCK_METHOD1(set_display_layout, void(const std::string& layout)); MOCK_CONST_METHOD0(audio_stream_retry_number, uint32_t()); MOCK_METHOD1(set_audio_stream_retry_number, void(const uint32_t& audio_stream_retry_number)); |