summaryrefslogtreecommitdiff
path: root/src/components
diff options
context:
space:
mode:
authorCollin <iCollin@users.noreply.github.com>2019-08-15 10:11:56 -0400
committerGitHub <noreply@github.com>2019-08-15 10:11:56 -0400
commit6f84c1ab5140422c978df7ab18e5043d5cefbf83 (patch)
tree9d7b0bd7c00d61859488f85e67c0732fd8f26154 /src/components
parent399f983e6e75dbe0e2f82ff28ed794d60bfcc3e5 (diff)
downloadsdl_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')
-rw-r--r--src/components/application_manager/include/application_manager/hmi_capabilities_impl.h8
-rw-r--r--src/components/application_manager/include/application_manager/smart_object_keys.h2
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/add_sub_menu_request.h2
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/set_global_properties_request.h2
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_sub_menu_request.cc31
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc7
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_global_properties_request.cc69
-rw-r--r--src/components/application_manager/src/application_manager_impl.cc13
-rw-r--r--src/components/application_manager/src/hmi_capabilities_impl.cc47
-rw-r--r--src/components/application_manager/src/smart_object_keys.cc2
-rw-r--r--src/components/application_manager/test/include/application_manager/mock_hmi_capabilities.h3
-rw-r--r--src/components/include/application_manager/hmi_capabilities.h8
-rw-r--r--src/components/interfaces/HMI_API.xml15
-rw-r--r--src/components/interfaces/MOBILE_API.xml20
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">