summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJackLivio <jack@livio.io>2020-08-07 08:46:12 -0700
committerGitHub <noreply@github.com>2020-08-07 11:46:12 -0400
commite3970a01836b6e2d2d4926cd18345b32bc788794 (patch)
tree8cfd028295ae0a70b441db26a53b1e469f92682d
parent5c0fa709061cabc89ab235193dc62121bd0cca3e (diff)
downloadsdl_core-e3970a01836b6e2d2d4926cd18345b32bc788794.tar.gz
Additional Submenus and Driver Distraction Limits (#3447)
* Implement additional sub menus * Fix merge conflicts * Revert adding mobile api merge conflict * Update src/components/interfaces/HMI_API.xml Co-authored-by: Jacob Keeler <jacob.keeler@livioradio.com> * Update src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_sub_menu_request.cc Co-authored-by: Jacob Keeler <jacob.keeler@livioradio.com> * Update src/components/application_manager/src/application_data_impl.cc Co-authored-by: Jacob Keeler <jacob.keeler@livioradio.com> * Update src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_sub_menu_request.cc Co-authored-by: Jacob Keeler <jacob.keeler@livioradio.com> * Address comments * Fix unit tests * Fix conflitcs * Update src/components/interfaces/HMI_API.xml Co-authored-by: Jacob Keeler <jacob.keeler@livioradio.com> * Update commit hash Co-authored-by: Jacob Keeler <jacob.keeler@livioradio.com>
-rwxr-xr-xsrc/appMain/hmi_capabilities.json4
-rw-r--r--src/components/application_manager/include/application_manager/application.h3
-rw-r--r--src/components/application_manager/include/application_manager/application_data_impl.h5
-rw-r--r--src/components/application_manager/include/application_manager/hmi_capabilities_impl.h31
-rw-r--r--src/components/application_manager/include/application_manager/smart_object_keys.h3
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/delete_sub_menu_request.h23
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_capabilities_response.cc9
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_sub_menu_request.cc11
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/delete_sub_menu_request.cc56
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/get_system_capability_request.cc10
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc2
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/delete_sub_menu_test.cc18
-rw-r--r--src/components/application_manager/src/application_data_impl.cc7
-rw-r--r--src/components/application_manager/src/hmi_capabilities_impl.cc35
-rw-r--r--src/components/application_manager/src/message_helper/message_helper.cc4
-rw-r--r--src/components/application_manager/src/smart_object_keys.cc3
-rw-r--r--src/components/application_manager/test/include/application_manager/mock_application.h3
-rw-r--r--src/components/application_manager/test/include/application_manager/mock_hmi_capabilities.h9
-rw-r--r--src/components/include/application_manager/hmi_capabilities.h24
-rw-r--r--src/components/interfaces/HMI_API.xml20
m---------tools/rpc_spec0
21 files changed, 255 insertions, 25 deletions
diff --git a/src/appMain/hmi_capabilities.json b/src/appMain/hmi_capabilities.json
index 29604f0c2c..417135fcb6 100755
--- a/src/appMain/hmi_capabilities.json
+++ b/src/appMain/hmi_capabilities.json
@@ -324,6 +324,10 @@
"diagonalScreenSize": 8,
"pixelPerInch": 117,
"scale": 1
+ },
+ "driverDistractionCapability": {
+ "menuLength": 10,
+ "subMenuDepth": 3
}
}
},
diff --git a/src/components/application_manager/include/application_manager/application.h b/src/components/application_manager/include/application_manager/application.h
index e9dcf2bcb0..a595fc7379 100644
--- a/src/components/application_manager/include/application_manager/application.h
+++ b/src/components/application_manager/include/application_manager/application.h
@@ -369,7 +369,8 @@ class DynamicApplicationData {
/*
* @brief Returns true if sub menu with such name already exist
*/
- virtual bool IsSubMenuNameAlreadyExist(const std::string& name) = 0;
+ virtual bool IsSubMenuNameAlreadyExist(const std::string& name,
+ const uint32_t parent_id) = 0;
/*
* @brief Adds a interaction choice set to the application
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 5f62c8d5b5..f04d3122fa 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
@@ -194,7 +194,8 @@ class DynamicApplicationDataImpl : public virtual Application {
/*
* @brief Returns true if sub menu with such name already exist
*/
- bool IsSubMenuNameAlreadyExist(const std::string& name);
+ bool IsSubMenuNameAlreadyExist(const std::string& name,
+ const uint32_t parent_id);
void SetWindowInfo(const WindowID window_id,
const smart_objects::SmartObject& window_info) OVERRIDE;
@@ -329,7 +330,7 @@ class DynamicApplicationDataImpl : public virtual Application {
CommandsMap commands_;
mutable std::shared_ptr<sync_primitives::RecursiveLock> commands_lock_ptr_;
SubMenuMap sub_menu_;
- mutable std::shared_ptr<sync_primitives::Lock> sub_menu_lock_ptr_;
+ mutable std::shared_ptr<sync_primitives::RecursiveLock> sub_menu_lock_ptr_;
ChoiceSetMap choice_set_map_;
mutable std::shared_ptr<sync_primitives::Lock> choice_set_map_lock_ptr_;
PerformChoiceSetMap performinteraction_choice_set_map_;
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 089105fdba..1e75499a07 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
@@ -194,6 +194,29 @@ class HMICapabilitiesImpl : public HMICapabilities {
bool rc_supported() const OVERRIDE;
+ /*
+ * @brief Interface to store whether HMI supports driver distraction menu
+ * limits
+ *
+ * @param supported Indicates whether driver distraction menu limits is
+ * supported by HMI
+ */
+ void set_driver_distraction_supported(const bool supported) OVERRIDE;
+
+ /*
+ * @brief Retrieves whether HMI supports driver distraction menu limits
+ *
+ * @return TRUE if it supported, otherwise FALSE
+ */
+ bool driver_distraction_supported() const OVERRIDE;
+
+ /*
+ * @brief Interface used to store information regarding
+ * the navigation "System Capability"
+ *
+ * @param navigation_capability contains information related
+ * to the navigation system capability.
+ */
void set_navigation_capability(
const smart_objects::SmartObject& navigation_capability) OVERRIDE;
@@ -215,6 +238,12 @@ class HMICapabilitiesImpl : public HMICapabilities {
const smart_objects::SmartObjectSPtr rc_capability() const OVERRIDE;
+ void set_driver_distraction_capability(
+ const smart_objects::SmartObject& driver_distraction_capability) OVERRIDE;
+
+ const smart_objects::SmartObjectSPtr driver_distraction_capability()
+ const OVERRIDE;
+
void set_seat_location_capability(
const smart_objects::SmartObject& seat_location_capability) OVERRIDE;
@@ -444,11 +473,13 @@ class HMICapabilitiesImpl : public HMICapabilities {
bool is_phone_call_supported_;
bool is_video_streaming_supported_;
bool is_rc_supported_;
+ bool is_driver_distraction_supported_;
std::string ccpu_version_;
smart_objects::SmartObjectSPtr navigation_capability_;
smart_objects::SmartObjectSPtr phone_capability_;
smart_objects::SmartObjectSPtr video_streaming_capability_;
smart_objects::SmartObjectSPtr rc_capability_;
+ smart_objects::SmartObjectSPtr driver_distraction_capability_;
smart_objects::SmartObjectSPtr seat_location_capability_;
ApplicationManager& app_mngr_;
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 cfec80cac8..a5d980762d 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
@@ -119,6 +119,7 @@ extern const char* num_ticks;
extern const char* slider_footer;
extern const char* menu_id;
extern const char* menu_name;
+extern const char* parent_id;
extern const char* menu_layout;
extern const char* menu_layouts_available;
extern const char* interaction_choice_set_id;
@@ -197,6 +198,8 @@ extern const char* navigation_capability;
extern const char* phone_capability;
extern const char* video_streaming_capability;
extern const char* rc_capability;
+extern const char* driver_distraction_capability;
+extern const char* driver_distraction;
extern const char* seat_location_capability;
extern const char* app_services_capabilities;
extern const char* day_color_scheme;
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/delete_sub_menu_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/delete_sub_menu_request.h
index 2f85065ee7..af2ba4a1ea 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/delete_sub_menu_request.h
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/delete_sub_menu_request.h
@@ -83,22 +83,33 @@ class DeleteSubMenuRequest : public app_mngr::commands::CommandRequestImpl {
private:
/*
- * @brief Deletes VR commands from SDL for corresponding submenu ID
+ * @brief Deletes submenus that have a parentID that matches the parentID
+ * parameter
*
* @param app_id Application ID
+ * @param parentID Parent ID of a nested submenu
+ */
+ void DeleteNestedSubMenus(app_mngr::ApplicationSharedPtr const app,
+ uint32_t parentID,
+ const app_mngr::SubMenuMap& subMenus);
+
+ /*
+ * @brief Deletes VR commands from SDL for corresponding submenu ID
*
- * @return TRUE on success, otherwise FALSE
+ * @param app_id Application ID
+ * @param parentID Parent ID of a nested submenu
*/
- void DeleteSubMenuVRCommands(app_mngr::ApplicationConstSharedPtr app);
+ void DeleteSubMenuVRCommands(app_mngr::ApplicationConstSharedPtr app,
+ uint32_t parentID);
/*
* @brief Deletes UI commands from SDL for corresponding submenu ID
*
* @param app_id Application ID
- *
- * @return TRUE on success, otherwise FALSE
+ * @param parentID Parent ID of a nested submenu
*/
- void DeleteSubMenuUICommands(app_mngr::ApplicationSharedPtr const app);
+ void DeleteSubMenuUICommands(app_mngr::ApplicationSharedPtr const app,
+ uint32_t parentID);
DISALLOW_COPY_AND_ASSIGN(DeleteSubMenuRequest);
};
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_capabilities_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_capabilities_response.cc
index c5a76612f6..9f45d174e7 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_capabilities_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_capabilities_response.cc
@@ -141,6 +141,15 @@ void UIGetCapabilitiesResponse::Run() {
hmi_capabilities_.set_video_streaming_capability(
system_capabilities_so[strings::video_streaming_capability]);
}
+ if (system_capabilities_so.keyExists(
+ strings::driver_distraction_capability)) {
+ if (!system_capabilities_so[strings::driver_distraction_capability]
+ .empty()) {
+ hmi_capabilities_.set_driver_distraction_capability(
+ system_capabilities_so[strings::driver_distraction_capability]);
+ hmi_capabilities_.set_driver_distraction_supported(true);
+ }
+ }
if (system_capabilities_so.keyExists(strings::display_capabilities)) {
sections_to_update.push_back(strings::display_capabilities);
hmi_capabilities_.set_system_display_capabilities(
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 89ccfb8bd7..71bf867054 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
@@ -94,7 +94,12 @@ void AddSubMenuRequest::Run() {
const std::string& menu_name =
received_msg_params[strings::menu_name].asString();
- if (app->IsSubMenuNameAlreadyExist(menu_name)) {
+ const uint32_t parent_id =
+ received_msg_params.keyExists(strings::parent_id)
+ ? received_msg_params[strings::parent_id].asUInt()
+ : 0;
+
+ if (app->IsSubMenuNameAlreadyExist(menu_name, parent_id)) {
LOG4CXX_ERROR(logger_, "Menu name " << menu_name << " is duplicated.");
SendResponse(false, mobile_apis::Result::DUPLICATE_NAME);
return;
@@ -130,6 +135,10 @@ void AddSubMenuRequest::Run() {
}
msg_params[strings::menu_params][strings::menu_name] =
received_msg_params[strings::menu_name];
+ if (received_msg_params.keyExists(strings::parent_id)) {
+ msg_params[strings::menu_params][strings::parent_id] = parent_id;
+ }
+
msg_params[strings::app_id] = app->app_id();
StartAwaitForInterface(HmiInterfaces::HMI_INTERFACE_UI);
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/delete_sub_menu_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/delete_sub_menu_request.cc
index 6aaa2406e8..383daa9b83 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/delete_sub_menu_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/delete_sub_menu_request.cc
@@ -33,6 +33,7 @@
#include "sdl_rpc_plugin/commands/mobile/delete_sub_menu_request.h"
+#include "application_manager/application.h"
#include "application_manager/application_impl.h"
#include "application_manager/message_helper.h"
#include "interfaces/HMI_API.h"
@@ -88,8 +89,41 @@ void DeleteSubMenuRequest::Run() {
SendHMIRequest(hmi_apis::FunctionID::UI_DeleteSubMenu, &msg_params, true);
}
+void DeleteSubMenuRequest::DeleteNestedSubMenus(ApplicationSharedPtr const app,
+ uint32_t parentID,
+ const SubMenuMap& subMenus) {
+ LOG4CXX_AUTO_TRACE(logger_);
+
+ SubMenuMap::const_iterator it = subMenus.begin();
+ LOG4CXX_DEBUG(logger_, "Delete Submenus with Parent ID: " << parentID);
+ while (subMenus.end() != it) {
+ if (!(*it->second).keyExists(strings::parent_id)) {
+ LOG4CXX_ERROR(logger_, "parent ID does not exist");
+ ++it;
+ continue;
+ }
+
+ if (parentID == (*it->second)[strings::parent_id].asUInt()) {
+ uint32_t menuID = (*it->second)[strings::menu_id].asUInt();
+ DeleteNestedSubMenus(app, menuID, subMenus);
+ DeleteSubMenuVRCommands(app, menuID);
+ DeleteSubMenuUICommands(app, menuID);
+ smart_objects::SmartObject msg_params =
+ smart_objects::SmartObject(smart_objects::SmartType_Map);
+ msg_params[strings::menu_id] = menuID;
+ msg_params[strings::app_id] = app->app_id();
+ SendHMIRequest(hmi_apis::FunctionID::UI_DeleteSubMenu, &msg_params);
+ ++it;
+ LOG4CXX_DEBUG(logger_, "Removing submenuID: " << menuID);
+ app->RemoveSubMenu(menuID);
+ } else {
+ ++it;
+ }
+ }
+}
+
void DeleteSubMenuRequest::DeleteSubMenuVRCommands(
- ApplicationConstSharedPtr app) {
+ ApplicationConstSharedPtr app, uint32_t parentID) {
LOG4CXX_AUTO_TRACE(logger_);
const DataAccessor<CommandsMap> accessor = app->commands_map();
@@ -101,7 +135,7 @@ void DeleteSubMenuRequest::DeleteSubMenuVRCommands(
continue;
}
- if ((*message_)[strings::msg_params][strings::menu_id].asInt() ==
+ if (parentID ==
(*it->second)[strings::menu_params][hmi_request::parent_id].asInt()) {
smart_objects::SmartObject msg_params =
smart_objects::SmartObject(smart_objects::SmartType_Map);
@@ -116,9 +150,9 @@ void DeleteSubMenuRequest::DeleteSubMenuVRCommands(
}
void DeleteSubMenuRequest::DeleteSubMenuUICommands(
- ApplicationSharedPtr const app) {
+ ApplicationSharedPtr const app, uint32_t parentID) {
LOG4CXX_AUTO_TRACE(logger_);
-
+ LOG4CXX_DEBUG(logger_, "Delete UI Commands with Parent ID: " << parentID);
const DataAccessor<CommandsMap> accessor(app->commands_map());
const CommandsMap& commands = accessor.GetData();
CommandsMap::const_iterator it = commands.begin();
@@ -130,13 +164,14 @@ void DeleteSubMenuRequest::DeleteSubMenuUICommands(
continue;
}
- if ((*message_)[strings::msg_params][strings::menu_id].asInt() ==
- (*it->second)[strings::menu_params][hmi_request::parent_id].asInt()) {
+ if (parentID ==
+ (*it->second)[strings::menu_params][hmi_request::parent_id].asUInt()) {
smart_objects::SmartObject msg_params =
smart_objects::SmartObject(smart_objects::SmartType_Map);
const uint32_t cmd_id = (*it->second)[strings::cmd_id].asUInt();
msg_params[strings::app_id] = app->app_id();
msg_params[strings::cmd_id] = cmd_id;
+ LOG4CXX_DEBUG(logger_, "Removing UI Command: " << cmd_id);
app->RemoveCommand(cmd_id);
app->help_prompt_manager().OnVrCommandDeleted(cmd_id, false);
it = commands.begin(); // Can not relay on
@@ -174,8 +209,13 @@ void DeleteSubMenuRequest::on_event(const event_engine::Event& event) {
if (result) {
// delete sub menu items from SDL and HMI
- DeleteSubMenuVRCommands(application);
- DeleteSubMenuUICommands(application);
+ uint32_t parentID =
+ (*message_)[strings::msg_params][strings::menu_id].asUInt();
+ const DataAccessor<SubMenuMap> accessor = application->sub_menu_map();
+ const SubMenuMap& subMenus = accessor.GetData();
+ DeleteNestedSubMenus(application, parentID, subMenus);
+ DeleteSubMenuVRCommands(application, parentID);
+ DeleteSubMenuUICommands(application, parentID);
application->RemoveSubMenu(
(*message_)[strings::msg_params][strings::menu_id].asInt());
}
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 6121747ccc..8b557efc5d 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
@@ -163,6 +163,16 @@ void GetSystemCapabilityRequest::Run() {
all_services);
break;
}
+ case mobile_apis::SystemCapabilityType::DRIVER_DISTRACTION:
+ if (hmi_capabilities.driver_distraction_capability()) {
+ response_params[strings::system_capability]
+ [strings::driver_distraction_capability] =
+ *hmi_capabilities.driver_distraction_capability();
+ } else {
+ SendResponse(false, mobile_apis::Result::DATA_NOT_AVAILABLE);
+ return;
+ }
+ break;
case mobile_apis::SystemCapabilityType::DISPLAYS: {
auto capabilities = hmi_capabilities.system_display_capabilities();
if (app->display_capabilities()) {
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 5fb66c25ac..70bd47e232 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
@@ -677,6 +677,8 @@ void FillUIRelatedFields(smart_objects::SmartObject& response_params,
response_params[strings::hmi_capabilities][strings::displays] = true;
response_params[strings::hmi_capabilities][strings::seat_location] =
hmi_capabilities.seat_location_capability() ? true : false;
+ response_params[strings::hmi_capabilities][strings::driver_distraction] =
+ hmi_capabilities.driver_distraction_supported();
}
void RegisterAppInterfaceRequest::SendRegisterAppInterfaceResponseToMobile(
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/delete_sub_menu_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/delete_sub_menu_test.cc
index 04f12568b4..cd832d3122 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/delete_sub_menu_test.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/delete_sub_menu_test.cc
@@ -98,7 +98,9 @@ class DeleteSubMenuRequestTest
public:
DeleteSubMenuRequestTest()
: commands_lock_(std::make_shared<sync_primitives::Lock>())
+ , sub_menu_lock_(std::make_shared<sync_primitives::RecursiveLock>())
, accessor_(commands_map_, commands_lock_)
+ , sub_menu_accessor_(sub_menu_map_, sub_menu_lock_)
, message_(CreateMessage())
, command_(CreateCommand<DeleteSubMenuRequest>(message_))
, mock_help_prompt_manager_(
@@ -106,8 +108,11 @@ class DeleteSubMenuRequestTest
, app_(CreateMockApp()) {}
am::CommandsMap commands_map_;
+ am::SubMenuMap sub_menu_map_;
mutable std::shared_ptr<sync_primitives::Lock> commands_lock_;
+ mutable std::shared_ptr<sync_primitives::RecursiveLock> sub_menu_lock_;
DataAccessor<am::CommandsMap> accessor_;
+ DataAccessor<am::SubMenuMap> sub_menu_accessor_;
MessageSharedPtr message_;
DeleteSubMenuRequestPtr command_;
@@ -266,6 +271,17 @@ TEST_F(DeleteSubMenuRequestTest, OnEvent_DeleteSubmenu_SUCCESS) {
commands_map_.insert(
std::make_pair(0, &((*message_)[am::strings::msg_params])));
+ smart_objects::SmartObjectSPtr smartObjectPtr =
+ std::make_shared<smart_objects::SmartObject>();
+
+ smart_objects::SmartObject& object = *smartObjectPtr;
+
+ object[am::strings::position] = 1;
+ object[am::strings::menu_name] = "SubMenu";
+
+ sub_menu_map_.insert(
+ std::pair<uint32_t, smart_objects::SmartObject*>(5, &object));
+ EXPECT_CALL(*app_, sub_menu_map()).WillRepeatedly(Return(sub_menu_accessor_));
EXPECT_CALL(app_mngr_, application(_)).WillRepeatedly(Return(app_));
InSequence seq;
@@ -330,6 +346,7 @@ TEST_F(DeleteSubMenuRequestTest,
std::make_pair(0, &((*message_)[am::strings::msg_params])));
EXPECT_CALL(app_mngr_, application(_)).WillRepeatedly(Return(app_));
+ EXPECT_CALL(*app_, sub_menu_map()).WillRepeatedly(Return(sub_menu_accessor_));
EXPECT_CALL(mock_rpc_service_, ManageHMICommand(_, _)).Times(0);
EXPECT_CALL(*app_, commands_map()).Times(2).WillRepeatedly(Return(accessor_));
EXPECT_CALL(*app_, RemoveCommand(_)).Times(0);
@@ -357,6 +374,7 @@ TEST_F(DeleteSubMenuRequestTest,
std::make_pair(0, &((*message_)[am::strings::msg_params])));
EXPECT_CALL(app_mngr_, application(_)).WillRepeatedly(Return(app_));
+ EXPECT_CALL(*app_, sub_menu_map()).WillRepeatedly(Return(sub_menu_accessor_));
EXPECT_CALL(mock_rpc_service_, ManageHMICommand(_, _)).Times(0);
EXPECT_CALL(*app_, commands_map()).Times(2).WillRepeatedly(Return(accessor_));
EXPECT_CALL(*app_, RemoveCommand(_)).Times(0);
diff --git a/src/components/application_manager/src/application_data_impl.cc b/src/components/application_manager/src/application_data_impl.cc
index a5b5827f2f..0bf992d68b 100644
--- a/src/components/application_manager/src/application_data_impl.cc
+++ b/src/components/application_manager/src/application_data_impl.cc
@@ -205,7 +205,7 @@ DynamicApplicationDataImpl::DynamicApplicationDataImpl()
, commands_()
, commands_lock_ptr_(std::make_shared<sync_primitives::RecursiveLock>())
, sub_menu_()
- , sub_menu_lock_ptr_(std::make_shared<sync_primitives::Lock>())
+ , sub_menu_lock_ptr_(std::make_shared<sync_primitives::RecursiveLock>())
, choice_set_map_()
, choice_set_map_lock_ptr_(std::make_shared<sync_primitives::Lock>())
, performinteraction_choice_set_map_()
@@ -855,12 +855,13 @@ smart_objects::SmartObject* DynamicApplicationDataImpl::FindSubMenu(
}
bool DynamicApplicationDataImpl::IsSubMenuNameAlreadyExist(
- const std::string& name) {
+ const std::string& name, const uint32_t parent_id) {
sync_primitives::AutoLock lock(sub_menu_lock_ptr_);
for (SubMenuMap::iterator it = sub_menu_.begin(); sub_menu_.end() != it;
++it) {
smart_objects::SmartObject* menu = it->second;
- if ((*menu)[strings::menu_name] == name) {
+ if ((*menu)[strings::menu_name].asString() == name &&
+ (*menu)[strings::parent_id].asInt() == parent_id) {
return true;
}
}
diff --git a/src/components/application_manager/src/hmi_capabilities_impl.cc b/src/components/application_manager/src/hmi_capabilities_impl.cc
index 11300bc684..c5ab78ade5 100644
--- a/src/components/application_manager/src/hmi_capabilities_impl.cc
+++ b/src/components/application_manager/src/hmi_capabilities_impl.cc
@@ -495,10 +495,12 @@ HMICapabilitiesImpl::HMICapabilitiesImpl(ApplicationManager& app_mngr)
, is_phone_call_supported_(false)
, is_video_streaming_supported_(false)
, is_rc_supported_(false)
+ , is_driver_distraction_supported_(false)
, navigation_capability_(NULL)
, phone_capability_(NULL)
, video_streaming_capability_(NULL)
, rc_capability_(NULL)
+ , driver_distraction_capability_(NULL)
, seat_location_capability_(NULL)
, app_mngr_(app_mngr)
, hmi_language_handler_(app_mngr) {
@@ -729,6 +731,11 @@ void HMICapabilitiesImpl::set_rc_supported(const bool supported) {
is_rc_supported_ = supported;
}
+void HMICapabilitiesImpl::set_driver_distraction_supported(
+ const bool supported) {
+ is_driver_distraction_supported_ = supported;
+}
+
void HMICapabilitiesImpl::set_navigation_capability(
const smart_objects::SmartObject& navigation_capability) {
auto new_value =
@@ -756,6 +763,13 @@ void HMICapabilitiesImpl::set_rc_capability(
rc_capability_.swap(new_value);
}
+void HMICapabilitiesImpl::set_driver_distraction_capability(
+ const smart_objects::SmartObject& driver_distraction_capability) {
+ auto new_value = std::make_shared<smart_objects::SmartObject>(
+ driver_distraction_capability);
+ driver_distraction_capability_.swap(new_value);
+}
+
void HMICapabilitiesImpl::set_seat_location_capability(
const smart_objects::SmartObject& seat_location_capability) {
auto new_value =
@@ -895,6 +909,10 @@ bool HMICapabilitiesImpl::rc_supported() const {
return is_rc_supported_;
}
+bool HMICapabilitiesImpl::driver_distraction_supported() const {
+ return is_driver_distraction_supported_;
+}
+
const smart_objects::SmartObjectSPtr
HMICapabilitiesImpl::navigation_capability() const {
return navigation_capability_;
@@ -916,6 +934,11 @@ const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::rc_capability()
}
const smart_objects::SmartObjectSPtr
+HMICapabilitiesImpl::driver_distraction_capability() const {
+ return driver_distraction_capability_;
+}
+
+const smart_objects::SmartObjectSPtr
HMICapabilitiesImpl::seat_location_capability() const {
return seat_location_capability_;
}
@@ -1419,6 +1442,18 @@ bool HMICapabilitiesImpl::LoadCapabilitiesFromFile() {
set_video_streaming_supported(true);
}
}
+ if (JsonIsMemberSafe(ui_system_capabilities_node,
+ strings::driver_distraction_capability)) {
+ Json::Value dd_capability = ui_system_capabilities_node.get(
+ strings::driver_distraction_capability, "");
+ smart_objects::SmartObject dd_capability_so;
+ formatters::CFormatterJsonBase::jsonValueToObj(dd_capability,
+ dd_capability_so);
+ set_driver_distraction_capability(dd_capability_so);
+ if (!dd_capability_so.empty()) {
+ set_driver_distraction_supported(true);
+ }
+ }
}
} else {
AddRequiredRequestsForCapabilities(hmi_interface::ui);
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 e5fe2d14a7..dc54f6d1eb 100644
--- a/src/components/application_manager/src/message_helper/message_helper.cc
+++ b/src/components/application_manager/src/message_helper/message_helper.cc
@@ -1881,6 +1881,10 @@ smart_objects::SmartObjectList MessageHelper::CreateAddSubMenuRequestToHMI(
(*i->second)[strings::position];
msg_params[strings::menu_params][strings::menu_name] =
(*i->second)[strings::menu_name];
+ if ((*i->second).keyExists(strings::parent_id)) {
+ msg_params[strings::menu_params][strings::parent_id] =
+ (*i->second)[strings::parent_id];
+ }
msg_params[strings::app_id] = app->app_id();
(*ui_sub_menu)[strings::msg_params] = msg_params;
if (((*i->second).keyExists(strings::menu_icon)) &&
diff --git a/src/components/application_manager/src/smart_object_keys.cc b/src/components/application_manager/src/smart_object_keys.cc
index 7bfd14ca83..1765788419 100644
--- a/src/components/application_manager/src/smart_object_keys.cc
+++ b/src/components/application_manager/src/smart_object_keys.cc
@@ -85,6 +85,7 @@ const char* user_location = "userLocation";
const char* num_ticks = "numTicks";
const char* slider_footer = "sliderFooter";
const char* menu_id = "menuID";
+const char* parent_id = "parentID";
const char* menu_name = "menuName";
const char* menu_layout = "menuLayout";
const char* menu_layouts_available = "menuLayoutsAvailable";
@@ -163,6 +164,8 @@ const char* system_capabilities = "systemCapabilities";
const char* navigation_capability = "navigationCapability";
const char* phone_capability = "phoneCapability";
const char* video_streaming_capability = "videoStreamingCapability";
+const char* driver_distraction_capability = "driverDistractionCapability";
+const char* driver_distraction = "driverDistraction";
const char* rc_capability = "remoteControlCapability";
const char* seat_location_capability = "seatLocationCapability";
const char* app_services_capabilities = "appServicesCapabilities";
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 362dda4efb..175c39513e 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
@@ -321,7 +321,8 @@ class MockApplication : public ::application_manager::Application {
MOCK_METHOD1(RemoveSubMenu, void(uint32_t menu_id));
MOCK_CONST_METHOD1(FindSubMenu,
smart_objects::SmartObject*(uint32_t menu_id));
- MOCK_METHOD1(IsSubMenuNameAlreadyExist, bool(const std::string& name));
+ MOCK_METHOD2(IsSubMenuNameAlreadyExist,
+ bool(const std::string& name, const uint32_t parent_id));
MOCK_METHOD2(AddChoiceSet,
void(uint32_t choice_set_id,
const smart_objects::SmartObject& choice_set));
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 6d428eda24..2f9f40ad2a 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
@@ -172,6 +172,9 @@ class MockHMICapabilities : public ::application_manager::HMICapabilities {
MOCK_CONST_METHOD0(rc_supported, bool());
MOCK_METHOD1(set_rc_supported, void(const bool supported));
+ MOCK_CONST_METHOD0(driver_distraction_supported, bool());
+ MOCK_METHOD1(set_driver_distraction_supported, void(const bool supported));
+
MOCK_CONST_METHOD0(navigation_capability,
const smart_objects::SmartObjectSPtr());
MOCK_METHOD1(set_navigation_capability,
@@ -190,6 +193,12 @@ class MockHMICapabilities : public ::application_manager::HMICapabilities {
MOCK_METHOD1(set_rc_capability,
void(const smart_objects::SmartObject& rc_capability));
+ MOCK_CONST_METHOD0(driver_distraction_capability,
+ const smart_objects::SmartObjectSPtr());
+ MOCK_METHOD1(
+ set_driver_distraction_capability,
+ void(const smart_objects::SmartObject& driver_distraction_capability));
+
MOCK_CONST_METHOD0(seat_location_capability,
const smart_objects::SmartObjectSPtr());
MOCK_METHOD1(
diff --git a/src/components/include/application_manager/hmi_capabilities.h b/src/components/include/application_manager/hmi_capabilities.h
index 0948a4e6ad..56ac807d63 100644
--- a/src/components/include/application_manager/hmi_capabilities.h
+++ b/src/components/include/application_manager/hmi_capabilities.h
@@ -408,7 +408,23 @@ class HMICapabilities {
*/
virtual bool rc_supported() const = 0;
- /**
+ /*
+ * @brief Interface to store whether HMI supports driver distraction menu
+ * limits
+ *
+ * @param supported Indicates whether driver distraction menu limits is
+ * supported by HMI
+ */
+ virtual void set_driver_distraction_supported(const bool supported) = 0;
+
+ /*
+ * @brief Retrieves whether HMI supports driver distraction menu limits
+ *
+ * @return TRUE if it supported, otherwise FALSE
+ */
+ virtual bool driver_distraction_supported() const = 0;
+
+ /*
* @brief Interface used to store information regarding
* the navigation "System Capability"
* @param navigation_capability contains information related
@@ -466,6 +482,12 @@ class HMICapabilities {
*/
virtual const smart_objects::SmartObjectSPtr rc_capability() const = 0;
+ virtual void set_driver_distraction_capability(
+ const smart_objects::SmartObject& driver_distraction_capability) = 0;
+
+ virtual const smart_objects::SmartObjectSPtr driver_distraction_capability()
+ const = 0;
+
/**
* @brief Sets available SeatLocation capabilities for further usage by
* RC functionality
diff --git a/src/components/interfaces/HMI_API.xml b/src/components/interfaces/HMI_API.xml
index 2bec97ee93..acc3fe10cc 100644
--- a/src/components/interfaces/HMI_API.xml
+++ b/src/components/interfaces/HMI_API.xml
@@ -2871,7 +2871,7 @@
<struct name="MenuParams">
<param name="parentID" type="Integer" minvalue="0" maxvalue="2000000000" mandatory="false">
<description>unique ID of the sub menu, the command must be added to.</description>
- <description>If not provided, the command must be added to the top level of the in application menu.</description>
+ <description>If not provided or 0, the command must be added to the top level of the in application menu.</description>
</param>
<param name="position" type="Integer" minvalue="0" maxvalue="1000" mandatory="false">
<description>Position within the items that are at the top level of the in application menu.</description>
@@ -3620,6 +3620,15 @@
</param>
</struct>
+ <struct name="DriverDistractionCapability">
+ <param name="menuLength" type="Integer" mandatory="false">
+ <description>The number of items allowed in a Choice Set or Command menu while the driver is distracted</description>
+ </param>
+ <param name="subMenuDepth" type="Integer" minvalue="1" mandatory="false">
+ <description>The depth of submenus allowed when the driver is distracted. e.g. 3 == top level menu -> submenu -> submenu; 1 == top level menu only</description>
+ </param>
+ </struct>
+
<struct name="SystemCapabilities">
<param name="navigationCapability" type="NavigationCapability" mandatory="false">
</param>
@@ -3627,6 +3636,9 @@
</param>
<param name="videoStreamingCapability" type="VideoStreamingCapability" mandatory="false">
</param>
+ <param name="driverDistractionCapability" type="DriverDistractionCapability" mandatory="false">
+ <description>Describes capabilities when the driver is distracted</description>
+ </param>
</struct>
<struct name="RemoteControlCapabilities">
@@ -4152,6 +4164,7 @@
<element name="APP_SERVICES" />
<element name="SEAT_LOCATION"/>
<element name="DISPLAYS"/>
+ <element name="DRIVER_DISTRACTION" />
</enum>
<struct name="SystemCapability">
@@ -4185,6 +4198,9 @@
<param name="seatLocationCapability" type="SeatLocationCapability" mandatory="false">
<description>Contains information about the locations of each seat</description>
</param>
+ <param name="driverDistractionCapability" type="DriverDistractionCapability" mandatory="false" since="6.0">
+ <description>Describes capabilities when the driver is distracted</description>
+ </param>
</struct>
<enum name="HybridAppPreference">
@@ -5313,7 +5329,7 @@
<description>ID of the sub menu to be added. Unique for the application.</description>
</param>
<param name="menuParams" type="Common.MenuParams" mandatory="true">
- <description>Position and name of menu to be added. 'parent' field is omitted for this RPC. </description>
+ <description>Position, parentID, and name of menu to be added.</description>
</param>
<param name="menuIcon" type="Common.Image" mandatory="false">
<description>The image field for AddSubMenu</description>
diff --git a/tools/rpc_spec b/tools/rpc_spec
-Subproject a2043db1771752ce7089ac9601c76b49ef38a9d
+Subproject fc985db8d7c4f9eb973b4b431227566a1ae79cb