diff options
author | Collin <iCollin@users.noreply.github.com> | 2019-08-15 10:11:56 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-08-15 10:11:56 -0400 |
commit | 6f84c1ab5140422c978df7ab18e5043d5cefbf83 (patch) | |
tree | 9d7b0bd7c00d61859488f85e67c0732fd8f26154 /src/components | |
parent | 399f983e6e75dbe0e2f82ff28ed794d60bfcc3e5 (diff) | |
download | sdl_core-6f84c1ab5140422c978df7ab18e5043d5cefbf83.tar.gz |
support tiled menus and submenus (#2968)
* support tiled menus and submenus
* with style script
* SendResponse in on_event
* style script
* fix compiling with unit tests
* append warnings info
* append response info when sending warnings
* load menuLayoutsAvailable in hmi_capabilities.json
* add to hmi_capabilities in RAI response
* case unsupported menuLayout only SGP param
* Update warning message for invalid data
* proposal revisions
Diffstat (limited to 'src/components')
14 files changed, 192 insertions, 37 deletions
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 94fc293c3e..7e203c9919 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 @@ -439,6 +439,14 @@ class HMICapabilitiesImpl : public HMICapabilities { bool rc_supported() const OVERRIDE; /* + * @brief Retrieves whether HMI supports passed Menu Layout + * + * @return TRUE if it supported, otherwise FALSE + */ + bool menu_layout_supported( + mobile_apis::MenuLayout::eType layout) const OVERRIDE; + + /* * @brief Interface used to store information regarding * the navigation "System Capability" * 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 7f5a1d78db..2ee5daaed6 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 @@ -115,6 +115,8 @@ extern const char* num_ticks; extern const char* slider_footer; extern const char* menu_id; extern const char* menu_name; +extern const char* menu_layout; +extern const char* menu_layouts_available; extern const char* interaction_choice_set_id; extern const char* interaction_choice_set_id_list; extern const char* choice_set; diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/add_sub_menu_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/add_sub_menu_request.h index 2da94ae67e..d99c5dab38 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/add_sub_menu_request.h +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/add_sub_menu_request.h @@ -88,6 +88,8 @@ class AddSubMenuRequest : public app_mngr::commands::CommandRequestImpl { */ bool CheckSubMenuName(); + bool is_menu_layout_available_ = true; + DISALLOW_COPY_AND_ASSIGN(AddSubMenuRequest); }; diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/set_global_properties_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/set_global_properties_request.h index e84bf6e5e6..7e67428fb0 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/set_global_properties_request.h +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/set_global_properties_request.h @@ -149,6 +149,8 @@ class SetGlobalPropertiesRequest std::string ui_response_info_; std::string tts_response_info_; + bool is_menu_layout_available_ = true; + DISALLOW_COPY_AND_ASSIGN(SetGlobalPropertiesRequest); }; diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_sub_menu_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_sub_menu_request.cc index fbfcd4d38a..d5ec8b8bb3 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_sub_menu_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_sub_menu_request.cc @@ -109,6 +109,18 @@ void AddSubMenuRequest::Run() { smart_objects::SmartObject msg_params = smart_objects::SmartObject(smart_objects::SmartType_Map); + if (received_msg_params.keyExists(strings::menu_layout)) { + auto menu_layout = static_cast<mobile_apis::MenuLayout::eType>( + received_msg_params[strings::menu_layout].asUInt()); + if (application_manager_.hmi_capabilities().menu_layout_supported( + menu_layout)) { + msg_params[strings::menu_layout] = + received_msg_params[strings::menu_layout]; + } else { + is_menu_layout_available_ = false; + } + } + msg_params[strings::menu_id] = received_msg_params[strings::menu_id]; if (received_msg_params.keyExists(strings::position)) { msg_params[strings::menu_params][strings::position] = @@ -152,11 +164,22 @@ void AddSubMenuRequest::on_event(const event_engine::Event& event) { application->AddSubMenu( (*message_)[strings::msg_params][strings::menu_id].asInt(), (*message_)[strings::msg_params]); + response_info = + "The MenuLayout specified is unsupported, the " + "default MenuLayout will be used." + + response_info; + SendResponse(result, + is_menu_layout_available_ + ? MessageHelper::HMIToMobileResult(result_code) + : mobile_apis::Result::WARNINGS, + is_menu_layout_available_ ? NULL : response_info.c_str(), + &(message[strings::msg_params])); + } else { + SendResponse(result, + MessageHelper::HMIToMobileResult(result_code), + response_info.empty() ? NULL : response_info.c_str(), + &(message[strings::msg_params])); } - SendResponse(result, - MessageHelper::HMIToMobileResult(result_code), - response_info.empty() ? NULL : response_info.c_str(), - &(message[strings::msg_params])); break; } default: { diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc index 597df26d0a..701002ed65 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc @@ -576,6 +576,13 @@ void FillUIRelatedFields(smart_objects::SmartObject& response_params, } if (hmi_capabilities.display_capabilities()->keyExists( + strings::menu_layouts_available)) { + display_caps[strings::menu_layouts_available] = + hmi_capabilities.display_capabilities()->getElement( + strings::menu_layouts_available); + } + + if (hmi_capabilities.display_capabilities()->keyExists( hmi_response::media_clock_formats)) { display_caps[hmi_response::media_clock_formats] = hmi_capabilities.display_capabilities()->getElement( diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_global_properties_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_global_properties_request.cc index 3b13b00968..4a73740ccf 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_global_properties_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_global_properties_request.cc @@ -146,6 +146,20 @@ void SetGlobalPropertiesRequest::Run() { return; } + smart_objects::SmartObject params = + smart_objects::SmartObject(smart_objects::SmartType_Map); + + if (msg_params.keyExists(strings::menu_layout)) { + auto menu_layout = static_cast<mobile_apis::MenuLayout::eType>( + msg_params[strings::menu_layout].asUInt()); + if (application_manager_.hmi_capabilities().menu_layout_supported( + menu_layout)) { + params[strings::menu_layout] = msg_params[strings::menu_layout]; + } else { + is_menu_layout_available_ = false; + } + } + /* Need to set flags before sending request to HMI * for correct processing this flags in method on_event */ if (is_help_prompt_present || is_timeout_prompt_present) { @@ -162,9 +176,6 @@ void SetGlobalPropertiesRequest::Run() { return; } - smart_objects::SmartObject params = - smart_objects::SmartObject(smart_objects::SmartType_Map); - PrepareUIRequestVRHelpData(app, msg_params, params); PrepareUIRequestMenuAndKeyboardData(app, msg_params, params); @@ -177,9 +188,6 @@ void SetGlobalPropertiesRequest::Run() { LOG4CXX_DEBUG(logger_, "VRHelp params does not present"); DCHECK_OR_RETURN_VOID(!is_vr_help_title_present && !is_vr_help_present); - smart_objects::SmartObject params = - smart_objects::SmartObject(smart_objects::SmartType_Map); - PrepareUIRequestMenuAndKeyboardData(app, msg_params, params); // Preparing data @@ -194,14 +202,13 @@ void SetGlobalPropertiesRequest::Run() { // check TTS params if (is_help_prompt_present || is_timeout_prompt_present) { LOG4CXX_DEBUG(logger_, "TTS params presents"); - smart_objects::SmartObject params = - smart_objects::SmartObject(smart_objects::SmartType_Map); + auto tts_params = smart_objects::SmartObject(smart_objects::SmartType_Map); std::vector<std::string> invalid_params; if (is_help_prompt_present) { smart_objects::SmartObject& help_prompt = (*message_)[strings::msg_params][strings::help_prompt]; - mobile_apis::Result::eType verification_result = + verification_result = MessageHelper::VerifyTtsFiles(help_prompt, app, application_manager_); if (mobile_apis::Result::FILE_NOT_FOUND == verification_result) { @@ -211,16 +218,15 @@ void SetGlobalPropertiesRequest::Run() { invalid_params.push_back("help_prompt"); } else { app->set_help_prompt(help_prompt); - params[strings::help_prompt] = (*app->help_prompt()); + tts_params[strings::help_prompt] = (*app->help_prompt()); } } if (is_timeout_prompt_present) { smart_objects::SmartObject& timeout_prompt = (*message_)[strings::msg_params][strings::timeout_prompt]; - mobile_apis::Result::eType verification_result = - MessageHelper::VerifyTtsFiles( - timeout_prompt, app, application_manager_); + verification_result = MessageHelper::VerifyTtsFiles( + timeout_prompt, app, application_manager_); if (mobile_apis::Result::FILE_NOT_FOUND == verification_result) { LOG4CXX_ERROR( @@ -229,7 +235,7 @@ void SetGlobalPropertiesRequest::Run() { invalid_params.push_back("timeout_prompt"); } else { app->set_timeout_prompt(timeout_prompt); - params[strings::timeout_prompt] = (*app->timeout_prompt()); + tts_params[strings::timeout_prompt] = (*app->timeout_prompt()); } } @@ -247,11 +253,18 @@ void SetGlobalPropertiesRequest::Run() { return; } - params[strings::app_id] = app->app_id(); - SendTTSRequest(params, true); + tts_params[strings::app_id] = app->app_id(); + SendTTSRequest(tts_params, true); auto& help_prompt_manager = app->help_prompt_manager(); - help_prompt_manager.OnSetGlobalPropertiesReceived(params, false); + help_prompt_manager.OnSetGlobalPropertiesReceived(tts_params, false); + } else if (!is_ui_send_) { + std::string response_info = "There are no parameters present in request."; + if (!is_menu_layout_available_) { + response_info += " The MenuLayout specified is unsupported."; + } + SendResponse( + false, mobile_apis::Result::INVALID_DATA, response_info.c_str()); } } @@ -325,10 +338,21 @@ void SetGlobalPropertiesRequest::on_event(const event_engine::Event& event) { std::string response_info; const bool result = PrepareResponseParameters(result_code, response_info); - SendResponse(result, - result_code, - response_info.empty() ? NULL : response_info.c_str(), - &(message[strings::msg_params])); + if (result && !is_menu_layout_available_) { + response_info = + "The MenuLayout specified is unsupported, the " + "default MenuLayout will be used." + + response_info; + SendResponse(result, + mobile_apis::Result::WARNINGS, + response_info.c_str(), + &(message[strings::msg_params])); + } else { + SendResponse(result, + result_code, + response_info.empty() ? NULL : response_info.c_str(), + &(message[strings::msg_params])); + } } bool SetGlobalPropertiesRequest::Init() { @@ -443,7 +467,8 @@ bool SetGlobalPropertiesRequest::ValidateConditionalMandatoryParameters( params.keyExists(strings::vr_help) || params.keyExists(strings::menu_title) || params.keyExists(strings::menu_icon) || - params.keyExists(strings::keyboard_properties); + params.keyExists(strings::keyboard_properties) || + params.keyExists(strings::menu_layout); } bool SetGlobalPropertiesRequest::IsWhiteSpaceExist() { diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index 317ad2933f..7e72dd4c64 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -4242,16 +4242,11 @@ bool ApplicationManagerImpl::IsSOStructValid( const smart_objects::SmartObject& display_capabilities) { smart_objects::SmartObject display_capabilities_so = display_capabilities; if (hmi_so_factory().AttachSchema(struct_id, display_capabilities_so)) { - if (display_capabilities_so.isValid()) { - return true; - } else { - return false; - } - } else { - LOG4CXX_ERROR(logger_, "Could not find struct id: " << struct_id); - return false; + return display_capabilities_so.isValid(); } - return true; + + LOG4CXX_ERROR(logger_, "Could not find struct id: " << struct_id); + return false; } #ifdef BUILD_TESTS diff --git a/src/components/application_manager/src/hmi_capabilities_impl.cc b/src/components/application_manager/src/hmi_capabilities_impl.cc index 7f4b14835f..618a787ae9 100644 --- a/src/components/application_manager/src/hmi_capabilities_impl.cc +++ b/src/components/application_manager/src/hmi_capabilities_impl.cc @@ -58,6 +58,7 @@ std::map<std::string, hmi_apis::Common_TextFieldName::eType> text_fields_enum_name; std::map<std::string, hmi_apis::Common_MediaClockFormat::eType> media_clock_enum_name; +std::map<std::string, hmi_apis::Common_MenuLayout::eType> menu_layout_enum; std::map<std::string, hmi_apis::Common_ImageType::eType> image_type_enum; std::map<std::string, hmi_apis::Common_SamplingRate::eType> sampling_rate_enum; std::map<std::string, hmi_apis::Common_BitsPerSample::eType> @@ -279,6 +280,11 @@ void InitCapabilities() { std::make_pair(std::string("CLOCKTEXT4"), hmi_apis::Common_MediaClockFormat::CLOCKTEXT4)); + menu_layout_enum.insert( + std::make_pair(std::string("LIST"), hmi_apis::Common_MenuLayout::LIST)); + menu_layout_enum.insert( + std::make_pair(std::string("TILES"), hmi_apis::Common_MenuLayout::TILES)); + image_type_enum.insert(std::make_pair(std::string("STATIC"), hmi_apis::Common_ImageType::STATIC)); image_type_enum.insert(std::make_pair(std::string("DYNAMIC"), @@ -377,6 +383,8 @@ void InitCapabilities() { std::make_pair(std::string("MFD5"), hmi_apis::Common_DisplayType::MFD5)); display_type_enum.insert(std::make_pair( std::string("GEN3_8_INCH"), hmi_apis::Common_DisplayType::GEN3_8_INCH)); + display_type_enum.insert(std::make_pair( + std::string("SDL_GENERIC"), hmi_apis::Common_DisplayType::SDL_GENERIC)); character_set_enum.insert(std::make_pair( std::string("TYPE2SET"), hmi_apis::Common_CharacterSet::TYPE2SET)); @@ -866,6 +874,26 @@ bool HMICapabilitiesImpl::rc_supported() const { return is_rc_supported_; } +bool HMICapabilitiesImpl::menu_layout_supported( + mobile_apis::MenuLayout::eType layout) const { + if (!display_capabilities_ || + !display_capabilities_->keyExists(strings::menu_layouts_available)) + return false; + + auto menu_layouts = + display_capabilities_->getElement(strings::menu_layouts_available); + if (menu_layouts.getType() == smart_objects::SmartType_Array) { + for (uint32_t i = 0; i < menu_layouts.length(); ++i) { + if (layout == static_cast<mobile_apis::MenuLayout::eType>( + menu_layouts.getElement(i).asUInt())) { + return true; + } + } + } + + return false; +} + const smart_objects::SmartObject* HMICapabilitiesImpl::navigation_capability() const { return navigation_capability_; @@ -1042,6 +1070,25 @@ bool HMICapabilitiesImpl::load_capabilities_from_file() { } if (display_capabilities_so.keyExists( + strings::menu_layouts_available)) { + smart_objects::SmartObject menu_layouts_available_enum( + smart_objects::SmartType_Array); + auto menu_layouts_available_array = + display_capabilities_so[strings::menu_layouts_available]; + for (uint32_t i = 0, j = 0; i < menu_layouts_available_array.length(); + ++i) { + auto it = menu_layout_enum.find( + menu_layouts_available_array[i].asString()); + if (it != menu_layout_enum.end()) { + menu_layouts_available_enum[j++] = it->second; + } + } + display_capabilities_so.erase(strings::menu_layouts_available); + display_capabilities_so[strings::menu_layouts_available] = + menu_layouts_available_enum; + } + + if (display_capabilities_so.keyExists( hmi_response::image_capabilities)) { smart_objects::SmartObject& image_capabilities_array = display_capabilities_so[hmi_response::image_capabilities]; diff --git a/src/components/application_manager/src/smart_object_keys.cc b/src/components/application_manager/src/smart_object_keys.cc index 96f6fd02de..fbca1366b8 100644 --- a/src/components/application_manager/src/smart_object_keys.cc +++ b/src/components/application_manager/src/smart_object_keys.cc @@ -82,6 +82,8 @@ const char* num_ticks = "numTicks"; const char* slider_footer = "sliderFooter"; const char* menu_id = "menuID"; const char* menu_name = "menuName"; +const char* menu_layout = "menuLayout"; +const char* menu_layouts_available = "menuLayoutsAvailable"; const char* interaction_choice_set_id = "interactionChoiceSetID"; const char* interaction_choice_set_id_list = "interactionChoiceSetIDList"; const char* choice_set = "choiceSet"; 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 468bdbe5eb..bdece64fea 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 @@ -163,6 +163,9 @@ class MockHMICapabilities : public ::application_manager::HMICapabilities { MOCK_CONST_METHOD0(rc_supported, bool()); MOCK_METHOD1(set_rc_supported, void(const bool supported)); + MOCK_CONST_METHOD1(menu_layout_supported, + bool(mobile_apis::MenuLayout::eType layout)); + MOCK_CONST_METHOD0(navigation_capability, const smart_objects::SmartObject*()); MOCK_METHOD1(set_navigation_capability, diff --git a/src/components/include/application_manager/hmi_capabilities.h b/src/components/include/application_manager/hmi_capabilities.h index 215a549579..3bb9b8a3c4 100644 --- a/src/components/include/application_manager/hmi_capabilities.h +++ b/src/components/include/application_manager/hmi_capabilities.h @@ -441,6 +441,14 @@ class HMICapabilities { virtual bool rc_supported() const = 0; /* + * @brief Retrieves whether HMI supports passed Menu Layout + * + * @return TRUE if it supported, otherwise FALSE + */ + virtual bool menu_layout_supported( + mobile_apis::MenuLayout::eType layout) const = 0; + + /* * @brief Interface used to store information regarding * the navigation "System Capability" * diff --git a/src/components/interfaces/HMI_API.xml b/src/components/interfaces/HMI_API.xml index 18dd9cf1bd..1e768c694e 100644 --- a/src/components/interfaces/HMI_API.xml +++ b/src/components/interfaces/HMI_API.xml @@ -2723,6 +2723,12 @@ </param> </struct> +<enum name="MenuLayout"> + <description>How the main menu or submenu is laid out on screen</description> + <element name="LIST" /> + <element name="TILES" /> +</enum> + <struct name="Choice"> <description>A choice is an option given to the user which can be selected either by menu, or through voice recognition system.</description> <param name="choiceID" type="Integer" minvalue="0" maxvalue="65535" mandatory="true"> @@ -2863,6 +2869,9 @@ <param name="numCustomPresetsAvailable" type="Integer" minvalue="1" maxvalue="100" mandatory="false"> <description>The number of on-screen custom presets available (if any); otherwise omitted.</description> </param> + <param name="menuLayoutsAvailable" type="Common.MenuLayout" array="true" minsize="1" maxsize="1000" mandatory="false"> + <description>An array of available menu layouts. If this parameter is not provided, only the `LIST` layout is assumed to be available</description> + </param> </struct> <struct name="SoftButtonCapabilities"> @@ -4751,6 +4760,9 @@ <param name="appID" type="Integer" mandatory="true"> <description>ID of application that requested this RPC.</description> </param> + <param name="menuLayout" type="Common.MenuLayout" mandatory="false"> + <description>Sets the layout of the submenu screen.</description> + </param> </function> <function name="AddSubMenu" messagetype="response"> </function> @@ -4884,6 +4896,9 @@ <param name="appID" type="Integer" mandatory="true"> <description>ID of application that concerns this RPC.</description> </param> + <param name="menuLayout" type="Common.MenuLayout" mandatory="false"> + <description>Sets the layout of the main menu screen. If this is sent while a menu is already on-screen, the head unit will change the display to the new layout type.</description> + </param> </function> <function name="SetGlobalProperties" messagetype="response"> </function> diff --git a/src/components/interfaces/MOBILE_API.xml b/src/components/interfaces/MOBILE_API.xml index 0c05e0cb6b..f874baba70 100644 --- a/src/components/interfaces/MOBILE_API.xml +++ b/src/components/interfaces/MOBILE_API.xml @@ -1937,6 +1937,12 @@ </element> </enum> + <enum name="MenuLayout" since="6.0"> + <description>How the main menu or submenu is laid out on screen</description> + <element name="LIST" /> + <element name="TILES" /> + </enum> + <struct name="GPSData" since="2.0"> <description>Struct with the GPS data.</description> <param name="longitudeDegrees" type="Float" minvalue="-180" maxvalue="180" mandatory="true"> @@ -2241,7 +2247,9 @@ <param name="numCustomPresetsAvailable" type="Integer" minvalue="1" maxvalue="100" mandatory="false" since="3.0"> <description>The number of on-screen custom presets available (if any); otherwise omitted.</description> </param> - + <param name="menuLayoutsAvailable" type="MenuLayout" array="true" minsize="1" maxsize="1000" mandatory="false" since="6.0"> + <description>An array of available menu layouts. If this parameter is not provided, only the `LIST` layout is assumed to be available</description> + </param> <!-- TODO: Add pixel density? --> </struct> @@ -2377,7 +2385,7 @@ <description>Trim of the vehicle, e.g. SE</description> </param> </struct> - + <enum name="KeyboardLayout" since="3.0"> <description>Enumeration listing possible keyboard layouts.</description> <element name="QWERTY" /> @@ -4512,6 +4520,10 @@ <param name="keyboardProperties" type="KeyboardProperties" mandatory="false" since="3.0"> <description>On-screen keyboard configuration (if available).</description> </param> + + <param name="menuLayout" type="MenuLayout" mandatory="false" since="6.0"> + <description>Sets the layout of the main menu screen. If this is sent while a menu is already on-screen, the head unit will change the display to the new layout type.</description> + </param> </function> <function name="SetGlobalProperties" functionID="SetGlobalPropertiesID" messagetype="response" since="1.0"> @@ -4687,6 +4699,10 @@ <param name="menuIcon" type="Image" mandatory="false" since="5.0"> <description>The image field for AddSubMenu</description> </param> + + <param name="menuLayout" type="MenuLayout" mandatory="false" since="6.0"> + <description>Sets the layout of the submenu screen.</description> + </param> </function> <function name="AddSubMenu" functionID="AddSubMenuID" messagetype="response" since="1.0"> |