diff options
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 |