summaryrefslogtreecommitdiff
path: root/src/components/application_manager
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/application_manager')
-rw-r--r--src/components/application_manager/include/application_manager/app_service_manager.h7
-rw-r--r--src/components/application_manager/include/application_manager/application.h24
-rw-r--r--src/components/application_manager/include/application_manager/application_impl.h9
-rw-r--r--src/components/application_manager/include/application_manager/application_manager_impl.h75
-rw-r--r--src/components/application_manager/include/application_manager/hmi_capabilities_impl.h5
-rw-r--r--src/components/application_manager/include/application_manager/message_helper.h18
-rw-r--r--src/components/application_manager/include/application_manager/policies/policy_handler.h7
-rw-r--r--src/components/application_manager/include/application_manager/resumption/resumption_data_db.h32
-rw-r--r--src/components/application_manager/include/application_manager/resumption/resumption_sql_queries.h4
-rw-r--r--src/components/application_manager/include/application_manager/rpc_handler_impl.h1
-rw-r--r--src/components/application_manager/include/application_manager/smart_object_keys.h15
-rw-r--r--src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/get_interior_vehicle_data_request.cc6
-rw-r--r--src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_app_extension.cc9
-rw-r--r--src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc4
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/CMakeLists.txt5
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/bc_on_app_capability_updated_notification.h64
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/get_system_info_response.h1
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/navi_is_ready_request.h2
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/on_bc_system_capability_updated_notification_from_hmi.h12
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/update_device_list_request.h19
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/add_command_request.h10
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/create_interaction_choice_set_request.h50
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/on_app_capability_updated_notification.h81
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/on_way_point_change_notification_from_mobile.h75
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/perform_interaction_request.h17
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/register_app_interface_request.h6
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/set_global_properties_request.h25
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/set_media_clock_timer_request.h2
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/subscribe_way_points_request.h2
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/unsubscribe_way_points_request.h2
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/bc_on_app_capability_updated_notification.cc63
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/button_get_capabilities_response.cc8
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/get_system_info_response.cc13
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_is_ready_request.cc7
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_bc_system_capability_updated_notification_from_hmi.cc69
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_navi_way_point_change_notification.cc8
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/rc_get_capabilities_response.cc8
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/rc_is_ready_request.cc4
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_capabilities_response.cc8
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_language_response.cc8
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_supported_languages_response.cc8
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_is_ready_request.cc4
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_capabilities_response.cc8
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_language_response.cc8
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_supported_languages_response.cc8
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_is_ready_request.cc4
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/update_device_list_request.cc40
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_capabilities_response.cc8
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_language_response.cc8
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_supported_languages_response.cc26
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_is_ready_request.cc4
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_command_request.cc80
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_sub_menu_request.cc32
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_maneuver_request.cc4
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_maneuver_response.cc2
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_request.cc14
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_response.cc2
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/get_system_capability_request.cc6
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_app_capability_updated_notification.cc75
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_capability_updated_notification.cc94
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_request_notification.cc34
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_way_point_change_notification.cc1
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_way_point_change_notification_from_mobile.cc90
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_audio_pass_thru_request.cc7
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_interaction_request.cc157
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc18
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/reset_global_properties_request.cc13
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/scrollable_message_response.cc10
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/send_haptic_data_request.cc1
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_app_icon_request.cc4
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_global_properties_request.cc180
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_media_clock_timer_request.cc43
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/show_constant_tbt_response.cc2
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/subscribe_way_points_request.cc34
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/subtle_alert_request.cc16
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/unsubscribe_way_points_request.cc35
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/update_turn_list_response.cc2
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/hmi_command_factory.cc5
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/mobile_command_factory.cc14
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/sdl_rpc_plugin.cc10
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/waypoints_pending_resumption_handler.cc10
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/CMakeLists.txt1
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/bc_on_app_capability_updated_notification_test.cc101
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/get_system_info_response_test.cc53
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/hmi_notifications_test.cc17
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/on_bc_system_capability_updated_notification_from_hmi_test.cc203
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/ui_get_capabilities_response_test.cc1
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/update_device_list_request_test.cc41
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/add_command_request_test.cc19
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_app_capability_updated_notification_test.cc107
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_system_capability_updated_notification_test.cc43
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_way_point_change_notification_test.cc1
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc21
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/set_global_properties_test.cc388
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/simple_response_commands_test.cc52
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/subscribe_way_points_request_test.cc7
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/unsubscribe_way_points_request_test.cc9
-rw-r--r--src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_get_vehicle_type_response.cc8
-rw-r--r--src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_is_ready_request.cc4
-rw-r--r--src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/on_vehicle_data_notification.cc37
-rw-r--r--src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/unsubscribe_vehicle_data_request.cc4
-rw-r--r--src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/commands/mobile/on_vehicle_data_notification_test.cc11
-rw-r--r--src/components/application_manager/src/app_service_manager.cc19
-rw-r--r--src/components/application_manager/src/application_impl.cc136
-rw-r--r--src/components/application_manager/src/application_manager_impl.cc345
-rw-r--r--src/components/application_manager/src/display_capabilities_builder.cc3
-rw-r--r--src/components/application_manager/src/helpers/application_helper.cc20
-rw-r--r--src/components/application_manager/src/hmi_capabilities_impl.cc16
-rw-r--r--src/components/application_manager/src/message_helper/message_helper.cc182
-rw-r--r--src/components/application_manager/src/policies/policy_handler.cc53
-rw-r--r--src/components/application_manager/src/resumption/resume_ctrl_impl.cc26
-rw-r--r--src/components/application_manager/src/resumption/resumption_data_db.cc138
-rw-r--r--src/components/application_manager/src/resumption/resumption_data_json.cc4
-rw-r--r--src/components/application_manager/src/resumption/resumption_data_processor_impl.cc50
-rw-r--r--src/components/application_manager/src/resumption/resumption_sql_queries.cc44
-rw-r--r--src/components/application_manager/src/rpc_handler_impl.cc6
-rw-r--r--src/components/application_manager/src/rpc_service_impl.cc5
-rw-r--r--src/components/application_manager/src/smart_object_keys.cc16
-rwxr-xr-xsrc/components/application_manager/test/CMakeLists.txt2
-rw-r--r--src/components/application_manager/test/app_launch/app_launch_ctrl_test.cc30
-rw-r--r--src/components/application_manager/test/application_helper_test.cc6
-rw-r--r--src/components/application_manager/test/application_impl_test.cc39
-rw-r--r--src/components/application_manager/test/application_manager_impl_test.cc64
-rw-r--r--src/components/application_manager/test/hmi_capabilities_test.cc36
-rw-r--r--src/components/application_manager/test/include/application_manager/commands/commands_test.h25
-rw-r--r--src/components/application_manager/test/include/application_manager/mock_app_service_manager.h1
-rw-r--r--src/components/application_manager/test/include/application_manager/mock_application.h12
-rw-r--r--src/components/application_manager/test/include/application_manager/mock_hmi_capabilities.h2
-rw-r--r--src/components/application_manager/test/include/application_manager/mock_message_helper.h6
-rw-r--r--src/components/application_manager/test/include/application_manager/resumption_data_test.h1
-rw-r--r--src/components/application_manager/test/message_helper/message_helper_test.cc55
-rw-r--r--src/components/application_manager/test/mock_message_helper.cc8
-rw-r--r--src/components/application_manager/test/policy_handler_test.cc124
-rw-r--r--src/components/application_manager/test/request_controller/request_controller_test.cc18
-rw-r--r--src/components/application_manager/test/resumption/resume_ctrl_test.cc6
-rw-r--r--src/components/application_manager/test/resumption/resumption_data_test.cc2
-rw-r--r--src/components/application_manager/test/resumption_sql_queries_test.cc2
-rw-r--r--src/components/application_manager/test/rpc_passing_handler_test.cc2
-rw-r--r--src/components/application_manager/test/sdl_preloaded_pt.json1979
139 files changed, 3451 insertions, 3066 deletions
diff --git a/src/components/application_manager/include/application_manager/app_service_manager.h b/src/components/application_manager/include/application_manager/app_service_manager.h
index d26598c1e9..94606909c6 100644
--- a/src/components/application_manager/include/application_manager/app_service_manager.h
+++ b/src/components/application_manager/include/application_manager/app_service_manager.h
@@ -215,6 +215,13 @@ class AppServiceManager {
smart_objects::SmartObject& out_params);
/**
+ * @brief Retrieve the active service for handling waypoints if available
+ * @return The active NAVIGATION service if it handles waypoints, nullptr
+ * otherwise
+ */
+ virtual AppService* FindWayPointsHandler();
+
+ /**
* @brief Get the RPCPassingHandler tied to this object
* @return The RPCPassingHandler tied to this object
*/
diff --git a/src/components/application_manager/include/application_manager/application.h b/src/components/application_manager/include/application_manager/application.h
index c08bb37082..bc966cd00c 100644
--- a/src/components/application_manager/include/application_manager/application.h
+++ b/src/components/application_manager/include/application_manager/application.h
@@ -170,9 +170,14 @@ typedef std::map<uint32_t, smart_objects::SmartObject*> PerformChoice;
typedef std::map<uint32_t, PerformChoice> PerformChoiceSetMap;
/**
- * @brief Defines id of SoftButton
+ * @brief Defines id of SoftButtons for specified WindowID
*/
-typedef std::set<std::pair<uint32_t, WindowID> > SoftButtonID;
+typedef std::pair<WindowID, std::set<uint32_t> > WindowSoftButtons;
+
+/**
+ * @brief Defines id of SoftButtons related to a specified WindowID
+ */
+typedef std::set<WindowSoftButtons> SoftButtonIDs;
/**
* @brief Defines set of buttons subscription
@@ -369,8 +374,8 @@ class DynamicApplicationData {
/*
* @brief Returns true if sub menu with such name already exist
*/
- virtual bool IsSubMenuNameAlreadyExist(const std::string& name,
- const uint32_t parent_id) = 0;
+ DEPRECATED virtual bool IsSubMenuNameAlreadyExist(
+ const std::string& name, const uint32_t parent_id) = 0;
/*
* @brief Adds a interaction choice set to the application
@@ -524,6 +529,7 @@ class Application : public virtual InitialApplicationData,
* @brief The StreamingState enum defines current streaming state
*/
enum class StreamingState { kStopped, kStarted, kSuspended };
+
enum ApplicationRegisterState { kRegistered = 0, kWaitingForRegistration };
Application() : is_greyed_out_(false) {}
@@ -664,8 +670,10 @@ class Application : public virtual InitialApplicationData,
/**
* @brief Wakes up streaming process for application
* @param service_type Type of streaming service
+ * @param timer_len The amount of time in ms the timer will wait
*/
- virtual void WakeUpStreaming(protocol_handler::ServiceType service_type) = 0;
+ virtual void WakeUpStreaming(protocol_handler::ServiceType service_type,
+ uint32_t timer_len = 0) = 0;
virtual bool is_voice_communication_supported() const = 0;
virtual void set_voice_communication_supported(
@@ -961,10 +969,10 @@ class Application : public virtual InitialApplicationData,
* Alert, Show, ScrollableMessage, ShowConstantTBT, AlertManeuver,
* UpdateTurnList
* @param cmd_id Unique command id from mobile API
- * @param list of softbuttons were created by command.
+ * @param window_softbuttons list of softbuttons were created by command.
*/
- virtual void SubscribeToSoftButtons(int32_t cmd_id,
- const SoftButtonID& softbuttons_id) = 0;
+ virtual void SubscribeToSoftButtons(
+ int32_t cmd_id, const WindowSoftButtons& window_softbuttons) = 0;
/**
* @brief Retreives window id on which given button is created
diff --git a/src/components/application_manager/include/application_manager/application_impl.h b/src/components/application_manager/include/application_manager/application_impl.h
index 88668a2505..21e45b4515 100644
--- a/src/components/application_manager/include/application_manager/application_impl.h
+++ b/src/components/application_manager/include/application_manager/application_impl.h
@@ -142,7 +142,8 @@ class ApplicationImpl : public virtual Application,
void StopStreamingForce(protocol_handler::ServiceType service_type);
void StopStreaming(protocol_handler::ServiceType service_type);
void SuspendStreaming(protocol_handler::ServiceType service_type);
- void WakeUpStreaming(protocol_handler::ServiceType service_type);
+ void WakeUpStreaming(protocol_handler::ServiceType service_type,
+ uint32_t timer_len = 0);
virtual bool is_voice_communication_supported() const;
virtual void set_voice_communication_supported(bool option);
@@ -279,8 +280,8 @@ class ApplicationImpl : public virtual Application,
bool AreCommandLimitsExceeded(mobile_apis::FunctionID::eType cmd_id,
TLimitSource source);
- virtual void SubscribeToSoftButtons(int32_t cmd_id,
- const SoftButtonID& softbuttons_id);
+ virtual void SubscribeToSoftButtons(
+ int32_t cmd_id, const WindowSoftButtons& window_softbuttons);
virtual bool IsSubscribedToSoftButton(const uint32_t softbutton_id);
virtual void UnsubscribeFromSoftButtons(int32_t cmd_id);
@@ -638,7 +639,7 @@ class ApplicationImpl : public virtual Application,
/**
* @brief Defines id of SoftButton which is related from name of command
*/
- typedef std::map<int32_t, SoftButtonID> CommandSoftButtonID;
+ typedef std::map<int32_t, SoftButtonIDs> CommandSoftButtonID;
CommandNumberTimeLimit cmd_number_to_time_limits_;
CommandSoftButtonID cmd_softbuttonid_;
// Lock for command soft button id
diff --git a/src/components/application_manager/include/application_manager/application_manager_impl.h b/src/components/application_manager/include/application_manager/application_manager_impl.h
index bda1e5f49e..9191a06c6b 100644
--- a/src/components/application_manager/include/application_manager/application_manager_impl.h
+++ b/src/components/application_manager/include/application_manager/application_manager_impl.h
@@ -286,32 +286,22 @@ class ApplicationManagerImpl
*/
bool IsAppSubscribedForWayPoints(Application& app) const OVERRIDE;
- void SaveWayPointsMessage(
- smart_objects::SmartObjectSPtr way_points_message) OVERRIDE;
+ void SaveWayPointsMessage(smart_objects::SmartObjectSPtr way_points_message,
+ uint32_t app_id = 0) OVERRIDE;
- /**
- * @brief Subscribe Application for way points
- * @param Application id
- */
- void SubscribeAppForWayPoints(uint32_t app_id) OVERRIDE;
+ void SubscribeAppForWayPoints(uint32_t app_id,
+ bool response_from_hmi = true) OVERRIDE;
- /**
- * @brief Subscribe Application for way points
- * @param Application pointer
- */
- void SubscribeAppForWayPoints(ApplicationSharedPtr app) OVERRIDE;
+ void SubscribeAppForWayPoints(ApplicationSharedPtr app,
+ bool response_from_hmi = true) OVERRIDE;
- /**
- * @brief Unsubscribe Application for way points
- * @param Application id
- */
- void UnsubscribeAppFromWayPoints(uint32_t app_id) OVERRIDE;
+ void UnsubscribeAppFromWayPoints(uint32_t app_id,
+ bool response_from_hmi = true) OVERRIDE;
- /**
- * @brief Unsubscribe Application for way points
- * @param Application pointer
- */
- void UnsubscribeAppFromWayPoints(ApplicationSharedPtr app) OVERRIDE;
+ void UnsubscribeAppFromWayPoints(ApplicationSharedPtr app,
+ bool response_from_hmi = true) OVERRIDE;
+
+ bool IsSubscribedToHMIWayPoints() const OVERRIDE;
/**
* @brief Is Any Application is subscribed for way points
@@ -710,6 +700,9 @@ class ApplicationManagerImpl
void RemoveDevice(
const connection_handler::DeviceHandle& device_handle) OVERRIDE;
+ bool GetProtocolVehicleData(
+ connection_handler::ProtocolVehicleData& data) OVERRIDE;
+
/**
* @brief OnDeviceSwitchingStart is invoked on device transport switching
* start (e.g. from Bluetooth to USB) and creates waiting list of applications
@@ -880,6 +873,10 @@ class ApplicationManagerImpl
void OnAppStreaming(uint32_t app_id,
protocol_handler::ServiceType service_type,
+ bool state) OVERRIDE;
+
+ void OnAppStreaming(uint32_t app_id,
+ protocol_handler::ServiceType service_type,
const Application::StreamingState new_state) OVERRIDE;
mobile_api::HMILevel::eType GetDefaultHmiLevel(
@@ -1154,6 +1151,8 @@ class ApplicationManagerImpl
return is_stopping_;
}
+ bool WaitForHmiIsReady() OVERRIDE;
+
/**
* @brief ProcessReconnection handles reconnection flow for application on
* transport switch
@@ -1182,6 +1181,9 @@ class ApplicationManagerImpl
bool IsSOStructValid(const hmi_apis::StructIdentifiers::eType struct_id,
const smart_objects::SmartObject& display_capabilities);
+ virtual bool UnsubscribeAppFromSoftButtons(
+ const commands::MessageSharedPtr response) OVERRIDE;
+
/**
* @brief Function returns supported SDL Protocol Version
* @return protocol version depends on parameters from smartDeviceLink.ini.
@@ -1191,8 +1193,16 @@ class ApplicationManagerImpl
void ApplyFunctorForEachPlugin(
std::function<void(plugin_manager::RPCPlugin&)> functor) OVERRIDE;
+ ns_smart_device_link_rpc::V1::v4_protocol_v1_2_no_extra&
+ mobile_v4_protocol_so_factory() OVERRIDE;
+
private:
/**
+ * @brief Sets is_stopping flag to true
+ */
+ void InitiateStopping();
+
+ /**
* @brief Adds application to registered applications list and marks it as
* registered
* @param application Application that should be added to registered
@@ -1562,7 +1572,11 @@ class ApplicationManagerImpl
*/
std::set<uint32_t> subscribed_way_points_apps_list_;
- smart_objects::SmartObjectSPtr way_points_data_;
+ bool subscribed_to_hmi_way_points_;
+
+ smart_objects::SmartObjectSPtr hmi_way_points_data_;
+
+ std::map<uint32_t, smart_objects::SmartObject> mobile_way_points_data_;
/**
* @brief Map contains applications which
@@ -1610,12 +1624,14 @@ class ApplicationManagerImpl
mobile_apis::SystemContext::eType system_context;
};
- hmi_apis::HMI_API* hmi_so_factory_;
- mobile_apis::MOBILE_API* mobile_so_factory_;
+ hmi_apis::HMI_API hmi_so_factory_;
+ mobile_apis::MOBILE_API mobile_so_factory_;
+ ns_smart_device_link_rpc::V1::v4_protocol_v1_2_no_extra
+ mobile_v4_protocol_so_factory_;
- static uint32_t mobile_corelation_id_;
- static uint32_t corelation_id_;
- static const uint32_t max_corelation_id_;
+ std::atomic<uint32_t> mobile_correlation_id_;
+ std::atomic<uint32_t> correlation_id_;
+ const uint32_t max_correlation_id_;
std::unique_ptr<HMICapabilities> hmi_capabilities_;
// The reason of HU shutdown
@@ -1643,6 +1659,9 @@ class ApplicationManagerImpl
sync_primitives::Lock close_app_timer_pool_lock_;
sync_primitives::Lock end_stream_timer_pool_lock_;
+ mutable sync_primitives::Lock wait_for_hmi_lock_;
+ sync_primitives::ConditionalVariable wait_for_hmi_condvar_;
+
StateControllerImpl state_ctrl_;
std::unique_ptr<app_launch::AppLaunchData> app_launch_dto_;
std::unique_ptr<app_launch::AppLaunchCtrl> app_launch_ctrl_;
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 0bc98827c8..f646c66ca1 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
@@ -81,6 +81,10 @@ class HMICapabilitiesImpl : public HMICapabilities {
const std::string& ccpu_version() const OVERRIDE;
+ void set_hardware_version(const std::string& hardware_version) OVERRIDE;
+
+ const std::string& hardware_version() const OVERRIDE;
+
bool attenuated_supported() const OVERRIDE;
void set_attenuated_supported(const bool state) OVERRIDE;
@@ -476,6 +480,7 @@ class HMICapabilitiesImpl : public HMICapabilities {
bool is_rc_supported_;
bool is_driver_distraction_supported_;
std::string ccpu_version_;
+ std::string hardware_version_;
smart_objects::SmartObjectSPtr navigation_capability_;
smart_objects::SmartObjectSPtr phone_capability_;
smart_objects::SmartObjectSPtr video_streaming_capability_;
diff --git a/src/components/application_manager/include/application_manager/message_helper.h b/src/components/application_manager/include/application_manager/message_helper.h
index 7af9bacf27..9797442e34 100644
--- a/src/components/application_manager/include/application_manager/message_helper.h
+++ b/src/components/application_manager/include/application_manager/message_helper.h
@@ -75,6 +75,7 @@ struct ResetGlobalPropertiesResult {
bool menu_name;
bool menu_icon;
bool keyboard_properties;
+ bool user_location;
bool vr_has_been_reset;
ResetGlobalPropertiesResult()
@@ -84,6 +85,7 @@ struct ResetGlobalPropertiesResult {
, menu_name(false)
, menu_icon(false)
, keyboard_properties(false)
+ , user_location(false)
, vr_has_been_reset(false) {}
bool HasUIPropertiesReset() const {
@@ -93,6 +95,10 @@ struct ResetGlobalPropertiesResult {
bool HasTTSPropertiesReset() const {
return timeout_prompt || help_prompt;
}
+
+ bool HasRCPropertiesReset() const {
+ return user_location;
+ }
};
/**
@@ -1062,6 +1068,18 @@ class MessageHelper {
const ResetGlobalPropertiesResult& reset_result,
const ApplicationSharedPtr application);
+ /**
+ * @brief CreateRCResetGlobalPropertiesRequest Creates request
+ * to reset global properties for RC
+ * @param reset_result struct containing result of global properties reset
+ * procedure
+ * @param application application for which properties are to be reset
+ * @return filled smart object with relevant request data
+ */
+ static smart_objects::SmartObjectSPtr CreateRCResetGlobalPropertiesRequest(
+ const ResetGlobalPropertiesResult& reset_result,
+ const ApplicationSharedPtr application);
+
static smart_objects::SmartObject CreateAppServiceCapabilities(
std::vector<smart_objects::SmartObject>& all_services);
diff --git a/src/components/application_manager/include/application_manager/policies/policy_handler.h b/src/components/application_manager/include/application_manager/policies/policy_handler.h
index c123bcc764..0a815b4c5b 100644
--- a/src/components/application_manager/include/application_manager/policies/policy_handler.h
+++ b/src/components/application_manager/include/application_manager/policies/policy_handler.h
@@ -386,10 +386,14 @@ class PolicyHandler : public PolicyHandlerInterface,
const std::string& wers_country_code,
const std::string& language) OVERRIDE;
+ void OnHardwareVersionReceived(const std::string& hardware_version) OVERRIDE;
+
void SetPreloadedPtFlag(const bool is_preloaded) OVERRIDE;
std::string GetCCPUVersionFromPT() const OVERRIDE;
+ std::string GetHardwareVersionFromPT() const OVERRIDE;
+
/**
* @brief Sends GetVehicleData request in case when Vechicle info is ready.
*/
@@ -812,6 +816,9 @@ class PolicyHandler : public PolicyHandlerInterface,
*/
void LinkAppsToDevice();
+ void SetHeartBeatTimeout(const std::string& policy_app_id,
+ const uint32_t app_id);
+
typedef std::vector<application_manager::ApplicationSharedPtr> Applications;
/**
diff --git a/src/components/application_manager/include/application_manager/resumption/resumption_data_db.h b/src/components/application_manager/include/application_manager/resumption/resumption_data_db.h
index a667dbf8e2..a4614d4f2c 100644
--- a/src/components/application_manager/include/application_manager/resumption/resumption_data_db.h
+++ b/src/components/application_manager/include/application_manager/resumption/resumption_data_db.h
@@ -353,6 +353,16 @@ class ResumptionDataDB : public ResumptionData {
const std::string& device_id);
/**
+ * @brief Deletes userLocation from saved application
+ * @param policy_app_id - mobile application id
+ * @param device_id - contains id of device on which is running application
+ * @return true if data was deleted otherwise returns
+ * false
+ */
+ bool DeleteUserLocation(const std::string& policy_app_id,
+ const std::string& device_id);
+
+ /**
* @brief Deletes commands from saved application
* @param policy_app_id - mobile application id
* @param device_id - contains id of device on which is running application
@@ -442,6 +452,16 @@ class ResumptionDataDB : public ResumptionData {
int64_t application_primary_key) const;
/**
+ * @brief Saves user location data to DB
+ * @param user_location contains data for saving
+ * @param application_primary_key - primary key from DB table application
+ * @return true if data was saved successfully otherwise returns
+ * false
+ */
+ bool InsertUserLocationData(const smart_objects::SmartObject& user_location,
+ int64_t application_primary_key) const;
+
+ /**
* @brief Saves globalProperties data to DB
* @param global_properties contains data for saving
* @param global_properties_key - will contain primary key from global
@@ -690,6 +710,18 @@ class ResumptionDataDB : public ResumptionData {
smart_objects::SmartObject& saved_app) const;
/**
+ * @brief Selects data from applicationUserLocation table
+ * @param policy_app_id contains mobile application id of application
+ * @param device_id contains id of device on which is running application
+ * @param saved_app contains userLocation
+ * @return true if query has been executed successfully otherwise returns
+ * false
+ */
+ bool SelectUserLocationData(const std::string& policy_app_id,
+ const std::string& device_id,
+ smart_objects::SmartObject& saved_app) const;
+
+ /**
* @brief Selects choice set data from DB
* @param policy_app_id contains mobile application id of application
* @param device_id contains id of device on which is running application
diff --git a/src/components/application_manager/include/application_manager/resumption/resumption_sql_queries.h b/src/components/application_manager/include/application_manager/resumption/resumption_sql_queries.h
index eee7650697..c62d115448 100644
--- a/src/components/application_manager/include/application_manager/resumption/resumption_sql_queries.h
+++ b/src/components/application_manager/include/application_manager/resumption/resumption_sql_queries.h
@@ -66,6 +66,7 @@ extern const std::string kDeleteApplicationFilesArray;
extern const std::string kDeleteSubMenu;
extern const std::string kDeleteApplicationSubMenuArray;
extern const std::string kDeleteApplicationSubscriptionsArray;
+extern const std::string kDeleteApplicationUserLocation;
extern const std::string kDeleteImageFromCommands;
extern const std::string kDeleteVrCommands;
extern const std::string kDeleteCommands;
@@ -97,6 +98,7 @@ extern const std::string kInsertToCommand;
extern const std::string kInsertApplicationCommandArray;
extern const std::string kInsertVrCommand;
extern const std::string kInsertSubscriptions;
+extern const std::string kInsertUserLocation;
extern const std::string kInsertChoice;
extern const std::string kInsertApplicationChoiceSet;
extern const std::string kInsertChoiceArray;
@@ -117,6 +119,8 @@ extern const std::string kSelectCountCommands;
extern const std::string kSelectCommands;
extern const std::string kSelectCountSubscriptions;
extern const std::string kSelectSubscriptions;
+extern const std::string kSelectCountUserLocation;
+extern const std::string kSelectUserLocation;
extern const std::string kSelectCountChoiceSet;
extern const std::string kSelectChoiceSets;
extern const std::string kSelectImage;
diff --git a/src/components/application_manager/include/application_manager/rpc_handler_impl.h b/src/components/application_manager/include/application_manager/rpc_handler_impl.h
index ab140dbd8a..dd4fb3d309 100644
--- a/src/components/application_manager/include/application_manager/rpc_handler_impl.h
+++ b/src/components/application_manager/include/application_manager/rpc_handler_impl.h
@@ -181,6 +181,7 @@ class RPCHandlerImpl : public RPCHandler,
const bool validate_params = true);
std::shared_ptr<Message> ConvertRawMsgToMessage(
const ::protocol_handler::RawMessagePtr message);
+
hmi_apis::HMI_API& hmi_so_factory();
mobile_apis::MOBILE_API& mobile_so_factory();
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 c96c9ebe69..5572dfd55d 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
@@ -171,6 +171,9 @@ extern const char* minutes;
extern const char* seconds;
extern const char* update_mode;
extern const char* audioStreamingIndicator;
+extern const char* seek_time;
+extern const char* forward_seek_indicator;
+extern const char* back_seek_indicator;
extern const char* trigger_source;
extern const char* hmi_level;
extern const char* activate_app_hmi_level;
@@ -227,6 +230,8 @@ extern const char* policy_type;
extern const char* property;
extern const char* displays;
extern const char* seat_location;
+extern const char* app_capability;
+extern const char* app_capability_type;
// PutFile
extern const char* sync_file_name;
@@ -296,6 +301,7 @@ extern const char* fuel_level_state;
extern const char* instant_fuel_consumption;
extern const char* fuel_range;
extern const char* cloud_app_vehicle_id;
+extern const char* climate_data;
extern const char* external_temp;
extern const char* turn_signal;
extern const char* vin;
@@ -336,11 +342,13 @@ extern const char* video_streaming;
extern const char* remote_control;
extern const char* sdl_version;
extern const char* system_software_version;
+extern const char* system_hardware_version;
extern const char* priority;
extern const char* engine_oil_life;
extern const char* oem_custom_data_type;
extern const char* window_status;
extern const char* hands_off_steering;
+extern const char* seat_occupancy;
// app services
extern const char* app_service_manifest;
@@ -480,10 +488,12 @@ extern const char* const haptic_spatial_data_supported;
extern const char* const diagonal_screen_size;
extern const char* const pixel_per_inch;
extern const char* const scale;
+extern const char* const additional_video_streaming_capabilities;
extern const char* const haptic_rect_data;
extern const char* const rect;
extern const char* const x;
extern const char* const y;
+extern const char* const preferred_fps;
} // namespace strings
namespace hmi_interface {
@@ -584,6 +594,8 @@ extern const char* method_name;
extern const char* keyboard_layout;
extern const char* limited_character_list;
extern const char* auto_complete_list;
+extern const char* mask_input_characters;
+extern const char* custom_keys;
extern const char* file;
extern const char* file_name;
extern const char* retry;
@@ -621,6 +633,9 @@ extern const char* image_capabilities;
extern const char* display_type;
extern const char* display_name;
extern const char* text_fields;
+extern const char* keyboard_capabilities;
+extern const char* supported_keyboards;
+extern const char* num_configurable_keys;
extern const char* media_clock_formats;
extern const char* graphic_supported;
extern const char* image_fields;
diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/get_interior_vehicle_data_request.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/get_interior_vehicle_data_request.cc
index 8d3a3d796e..c3b0a7d4a5 100644
--- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/get_interior_vehicle_data_request.cc
+++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/get_interior_vehicle_data_request.cc
@@ -284,10 +284,8 @@ void GetInteriorVehicleDataRequest::on_event(
[message_params::kModuleData][data_mapping(module_type)];
interior_data_cache_.Add(module, module_data);
}
- } else {
- hmi_response[app_mngr::strings::msg_params].erase(
- message_params::kIsSubscribed);
}
+
std::string response_info;
GetInfo(hmi_response, response_info);
SetResourceState(ModuleType(), ResourceState::FREE);
@@ -295,7 +293,7 @@ void GetInteriorVehicleDataRequest::on_event(
SendResponse(result,
result_code,
response_info.c_str(),
- &hmi_response[app_mngr::strings::msg_params]);
+ result ? &hmi_response[app_mngr::strings::msg_params] : nullptr);
}
GetInteriorVehicleDataRequest::~GetInteriorVehicleDataRequest() {}
diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_app_extension.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_app_extension.cc
index 3bfad3095b..b623350388 100644
--- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_app_extension.cc
+++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_app_extension.cc
@@ -88,7 +88,8 @@ void RCAppExtension::UnsubscribeFromInteriorVehicleData(
void RCAppExtension::UnsubscribeFromInteriorVehicleDataOfType(
const std::string& module_type) {
bool unsubscribed = false;
- for (auto& item : subscribed_interior_vehicle_data_) {
+ auto subscribed_ivi = subscribed_interior_vehicle_data_;
+ for (auto& item : subscribed_ivi) {
if (module_type == item.first) {
subscribed_interior_vehicle_data_.erase(item);
unsubscribed = true;
@@ -198,15 +199,13 @@ void RCAppExtension::RevertResumption(
const auto module_subscriptions =
ConvertSmartObjectToModuleCollection(resumption_data);
- for (auto& module : module_subscriptions) {
- SDL_LOG_TRACE("Requested to unsubscribe module_type "
- << module.first << "module_id: " << module.second);
- }
std::set<rc_rpc_plugin::ModuleUid> to_be_unsubscribed;
const auto app_id = application_.app_id();
auto no_apps_subscribed = [app_id,
this](const rc_rpc_plugin::ModuleUid& module) {
+ SDL_LOG_TRACE("Requested to unsubscribe module_type "
+ << module.first << "module_id: " << module.second);
if (plugin_.IsOtherAppsSubscribed(module, app_id)) {
SDL_LOG_DEBUG("Some other app except " << app_id
<< " is already subscribed to "
diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc
index 20f9c27912..fdfa3ea03a 100644
--- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc
+++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc
@@ -734,6 +734,8 @@ TEST_F(GetInteriorVehicleDataRequestTest,
available_hd_chanels[1] = chanel2_index;
available_hd_chanels[2] = chanel3_index;
+ msg_params[message_params::kModuleData][message_params::kModuleId] =
+ kModuleId;
msg_params[message_params::kModuleData][message_params::kRadioControlData]
[message_params::kAvailableHdChannels] = available_hd_chanels;
@@ -792,6 +794,8 @@ TEST_F(GetInteriorVehicleDataRequestTest,
smart_objects::SmartObject(smart_objects::SmartType_Boolean);
climate_control_data = true;
+ msg_params[message_params::kModuleData][message_params::kModuleId] =
+ kModuleId;
msg_params[message_params::kModuleData][message_params::kClimateControlData]
[message_params::kClimateEnableAvailable] = climate_control_data;
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/CMakeLists.txt b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/CMakeLists.txt
index a03b34d742..67a178893c 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/CMakeLists.txt
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/CMakeLists.txt
@@ -28,7 +28,10 @@
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
-include_directories(include)
+include_directories(
+ include
+ ${CMAKE_CURRENT_SOURCE_DIR}/include/sdl_rpc_plugin
+)
set (COMMANDS_SOURCE_DIR
${CMAKE_CURRENT_SOURCE_DIR}/src/commands
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/bc_on_app_capability_updated_notification.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/bc_on_app_capability_updated_notification.h
new file mode 100644
index 0000000000..f4883cecaf
--- /dev/null
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/bc_on_app_capability_updated_notification.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2020, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_HMI_BC_ON_APP_CAPABILITY_UPDATED_NOTIFICATION_H_
+#define SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_HMI_BC_ON_APP_CAPABILITY_UPDATED_NOTIFICATION_H_
+
+#include "application_manager/commands/notification_to_hmi.h"
+
+namespace sdl_rpc_plugin {
+namespace app_mngr = application_manager;
+
+namespace commands {
+
+class BCOnAppCapabilityUpdatedNotification
+ : public app_mngr::commands::NotificationToHMI {
+ public:
+ BCOnAppCapabilityUpdatedNotification(
+ const app_mngr::commands::MessageSharedPtr& message,
+ app_mngr::ApplicationManager& application_manager,
+ app_mngr::rpc_service::RPCService& rpc_service,
+ app_mngr::HMICapabilities& hmi_capabilities,
+ policy::PolicyHandlerInterface& policy_handle);
+
+ ~BCOnAppCapabilityUpdatedNotification() OVERRIDE;
+
+ void Run() OVERRIDE;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(BCOnAppCapabilityUpdatedNotification);
+};
+
+} // namespace commands
+} // namespace sdl_rpc_plugin
+
+#endif // SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_HMI_BC_ON_APP_CAPABILITY_UPDATED_NOTIFICATION_H_
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/get_system_info_response.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/get_system_info_response.h
index 2d3c40c3f3..5254d641de 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/get_system_info_response.h
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/get_system_info_response.h
@@ -45,6 +45,7 @@ struct SystemInfo {
std::string ccpu_version;
std::string wers_country_code;
std::string language;
+ std::string hardware_version;
};
/**
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/navi_is_ready_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/navi_is_ready_request.h
index 17d4eb483f..d2bda320a3 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/navi_is_ready_request.h
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/navi_is_ready_request.h
@@ -72,6 +72,8 @@ class NaviIsReadyRequest : public app_mngr::commands::RequestToHMI,
**/
void on_event(const app_mngr::event_engine::Event& event) OVERRIDE;
+ void onTimeOut() OVERRIDE;
+
private:
DISALLOW_COPY_AND_ASSIGN(NaviIsReadyRequest);
};
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/on_bc_system_capability_updated_notification_from_hmi.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/on_bc_system_capability_updated_notification_from_hmi.h
index 39b5c3aee3..41b5846a46 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/on_bc_system_capability_updated_notification_from_hmi.h
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/on_bc_system_capability_updated_notification_from_hmi.h
@@ -87,6 +87,18 @@ class OnBCSystemCapabilityUpdatedNotificationFromHMI
ProcessSystemDisplayCapabilitiesResult ProcessSystemDisplayCapabilities(
const smart_objects::SmartObject& display_capabilities);
+ /**
+ * @brief ProcessVideoStreamingCapability processes provided video
+ * streaming capabilities according to its structure
+ * @param system_capability capabilities to process
+ * @return true if video streaming capabilities have been processed
+ * properly, otherwise returns false
+ */
+ bool ProcessVideoStreamingCapability(
+ const smart_objects::SmartObject& system_capability);
+
+ void RemoveAppIdFromNotification();
+
DISALLOW_COPY_AND_ASSIGN(OnBCSystemCapabilityUpdatedNotificationFromHMI);
};
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/update_device_list_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/update_device_list_request.h
index db4f265a9f..ed89bc73ec 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/update_device_list_request.h
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/update_device_list_request.h
@@ -46,8 +46,7 @@ namespace commands {
/**
* @brief UpdateDeviceListRequest command class
**/
-class UpdateDeviceListRequest : public app_mngr::commands::RequestToHMI,
- public app_mngr::event_engine::EventObserver {
+class UpdateDeviceListRequest : public app_mngr::commands::RequestToHMI {
public:
/**
* @brief UpdateDeviceListRequest class constructor
@@ -70,23 +69,7 @@ class UpdateDeviceListRequest : public app_mngr::commands::RequestToHMI,
**/
virtual void Run();
- /**
- * @brief Interface method that is called whenever new event received
- * Need to observe OnHMIReady event, to send UpdateDeviceListRequest
- * when HMI will be ready
- * @param event The received event
- */
- virtual void on_event(const app_mngr::event_engine::Event& event);
-
- /**
- * @brief Need to stop execution StopMethod if HMI did not started
- */
- virtual bool CleanUp();
-
private:
- sync_primitives::Lock wait_hmi_lock;
- sync_primitives::ConditionalVariable termination_condition_;
-
DISALLOW_COPY_AND_ASSIGN(UpdateDeviceListRequest);
};
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/add_command_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/add_command_request.h
index 8cac0d686d..6ccd57947c 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/add_command_request.h
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/add_command_request.h
@@ -91,16 +91,6 @@ class AddCommandRequest : public app_mngr::commands::CommandRequestImpl {
private:
/*
- * @brief Check if command name doesn't exist in application
- * Please see SDLAQ-CRS-407 for more information
- *
- * @param app Mobile application
- *
- * @return TRUE on success, otherwise FALSE
- */
- bool CheckCommandName(app_mngr::ApplicationConstSharedPtr app);
-
- /*
* @brief Check if command VR synonyms doesn't exist in application commands
* Please see SDLAQ-CRS-407 for more information
*
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/create_interaction_choice_set_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/create_interaction_choice_set_request.h
index a1bc866347..aba2ce3be5 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/create_interaction_choice_set_request.h
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/create_interaction_choice_set_request.h
@@ -162,56 +162,6 @@ class CreateInteractionChoiceSetRequest
app_mngr::ApplicationConstSharedPtr app);
/*
- * @brief Predicate for using with CheckChoiceSet method to compare choice ID
- *param
- *
- * return TRUE if there is coincidence of choice ID, otherwise FALSE
- */
- struct CoincidencePredicateChoiceID {
- CoincidencePredicateChoiceID(const uint32_t newItem) : newItem_(newItem) {}
-
- bool operator()(smart_objects::SmartObject obj) {
- return obj[app_mngr::strings::choice_id].asUInt() == newItem_;
- }
-
- const uint32_t newItem_;
- };
-
- /*
- * @brief Predicate for using with CheckChoiceSet method to compare menu name
- *param
- *
- * return TRUE if there is coincidence of menu name, otherwise FALSE
- */
- struct CoincidencePredicateMenuName {
- CoincidencePredicateMenuName(const std::string& newItem)
- : newItem_(newItem) {}
-
- bool operator()(smart_objects::SmartObject obj) {
- return obj[app_mngr::strings::menu_name].asString() == newItem_;
- }
-
- const std::string& newItem_;
- };
-
- /*
- * @brief Predicate for using with CheckChoiceSet method to compare VR
- *commands param
- *
- * return TRUE if there is coincidence of VR commands, otherwise FALSE
- */
- struct CoincidencePredicateVRCommands {
- CoincidencePredicateVRCommands(const smart_objects::SmartObject& newItem)
- : newItem_(newItem) {}
-
- bool operator()(smart_objects::SmartObject obj) {
- return compareStr(obj, newItem_);
- }
-
- const smart_objects::SmartObject& newItem_;
- };
-
- /*
* @brief Checks if incoming choice set doesn't has similar VR synonyms.
*
* @param choice1 Choice to compare
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/on_app_capability_updated_notification.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/on_app_capability_updated_notification.h
new file mode 100644
index 0000000000..64e16f57be
--- /dev/null
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/on_app_capability_updated_notification.h
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2020, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_MOBILE_ON_APP_CAPABILITY_UPDATED_NOTIFICATION_H_
+#define SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_MOBILE_ON_APP_CAPABILITY_UPDATED_NOTIFICATION_H_
+
+#include "application_manager/commands/command_notification_from_mobile_impl.h"
+#include "utils/macro.h"
+
+namespace sdl_rpc_plugin {
+namespace commands {
+namespace mobile {
+
+namespace app_mngr = application_manager;
+class OnAppCapabilityUpdatedNotification
+ : public app_mngr::commands::CommandNotificationFromMobileImpl {
+ public:
+ /**
+ * @brief OnAppPermissionChangedNotification class constructor
+ * @param message Incoming SmartObject message
+ * @param application_manager Reference to the instance of the Application
+ *Manager
+ * @param rpc_service Reference to the instance of the RPCService
+ * @param hmi_capabilities Reference to the instance of the HMICapabilities
+ * @param policy_handle Reference to the instance of the PolicyHandler
+ **/
+ OnAppCapabilityUpdatedNotification(
+ const app_mngr::commands::MessageSharedPtr& message,
+ app_mngr::ApplicationManager& application_manager,
+ app_mngr::rpc_service::RPCService& rpc_service,
+ app_mngr::HMICapabilities& hmi_capabilities,
+ policy::PolicyHandlerInterface& policy_handle);
+
+ /**
+ * @brief OnAppPermissionChangedNotification class destructor
+ **/
+ ~OnAppCapabilityUpdatedNotification() OVERRIDE;
+
+ /**
+ * @brief Execute command
+ **/
+ void Run() OVERRIDE;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(OnAppCapabilityUpdatedNotification);
+};
+
+} // namespace mobile
+} // namespace commands
+} // namespace sdl_rpc_plugin
+
+#endif // SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_MOBILE_ON_APP_CAPABILITY_UPDATED_NOTIFICATION_H_
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/on_way_point_change_notification_from_mobile.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/on_way_point_change_notification_from_mobile.h
new file mode 100644
index 0000000000..2ad9a4c0af
--- /dev/null
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/on_way_point_change_notification_from_mobile.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2018, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_MOBILE_ON_WAY_POINT_CHANGE_NOTIFICATION_FROM_MOBILE_H_
+#define SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_MOBILE_ON_WAY_POINT_CHANGE_NOTIFICATION_FROM_MOBILE_H_
+
+#include "application_manager/commands/command_notification_from_mobile_impl.h"
+#include "utils/macro.h"
+
+namespace sdl_rpc_plugin {
+namespace app_mngr = application_manager;
+
+namespace commands {
+
+class OnWayPointChangeNotificationFromMobile
+ : public app_mngr::commands::CommandNotificationFromMobileImpl {
+ public:
+ /**
+ * @brief OnWayPointChangeNotificationFromMobile class constructor
+ *
+ * @param message Incoming SmartObject message
+ **/
+ OnWayPointChangeNotificationFromMobile(
+ const app_mngr::commands::MessageSharedPtr& message,
+ app_mngr::ApplicationManager& application_manager,
+ app_mngr::rpc_service::RPCService& rpc_service,
+ app_mngr::HMICapabilities& hmi_capabilities,
+ policy::PolicyHandlerInterface& policy_handler);
+
+ /**
+ * @brief OnWayPointChangeNotificationFromMobile class destructor
+ **/
+ virtual ~OnWayPointChangeNotificationFromMobile();
+
+ /**
+ * @brief Execute command
+ **/
+ virtual void Run() OVERRIDE;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(OnWayPointChangeNotificationFromMobile);
+};
+
+} // namespace commands
+} // namespace sdl_rpc_plugin
+#endif // SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_MOBILE_ON_WAY_POINT_CHANGE_NOTIFICATION_FROM_MOBILE_H_
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/perform_interaction_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/perform_interaction_request.h
index 52a0ad4dc1..88182a0b8e 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/perform_interaction_request.h
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/perform_interaction_request.h
@@ -128,15 +128,13 @@ class PerformInteractionRequest
* @return true if send response to mobile application otherwise
* return false.
*/
- bool ProcessVRResponse(const smart_objects::SmartObject& message,
- smart_objects::SmartObject& msg_params);
+ bool ProcessVRResponse(const smart_objects::SmartObject& message);
/**
* @brief Sends PerformInteraction response to mobile side
* @param message which should send to mobile side
*/
- void ProcessUIResponse(const smart_objects::SmartObject& message,
- smart_objects::SmartObject& msg_params);
+ void ProcessUIResponse(const smart_objects::SmartObject& message);
/*
* @brief Sends UI PerformInteraction request to HMI
@@ -164,16 +162,6 @@ class PerformInteractionRequest
void SendUIShowVRHelpRequest(app_mngr::ApplicationSharedPtr const app);
/*
- * @brief Checks if incoming choice set doesn't has similar menu names.
- *
- * @param app_id Application ID
- *
- * return Return TRUE if there are no similar menu names in choice set,
- * otherwise FALSE
- */
- bool CheckChoiceSetMenuNames(app_mngr::ApplicationSharedPtr const app);
-
- /*
* @brief Checks if incoming choice set doesn't has similar VR synonyms.
*
* @param app_id Application ID
@@ -279,6 +267,7 @@ class PerformInteractionRequest
mobile_apis::InteractionMode::eType interaction_mode_;
std::int32_t ui_choice_id_received_;
std::int32_t vr_choice_id_received_;
+ std::string ui_text_entry_received_;
bool ui_response_received_;
bool vr_response_received_;
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/register_app_interface_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/register_app_interface_request.h
index fae8f5eeb7..ae52caf0f7 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/register_app_interface_request.h
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/register_app_interface_request.h
@@ -261,12 +261,6 @@ class RegisterAppInterfaceRequest
const smart_objects::SmartObject& message);
/**
- * @brief WaitForHMIIsReady blocking function. Waits for HMI be ready for
- * requests processing
- */
- void WaitForHMIIsReady();
-
- /**
* @brief FillApplicationParams set app application attributes from the RAI
* request
* @param application applicaiton to fill params
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 190cb07459..fbf3056e58 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
@@ -203,7 +203,30 @@ class SetGlobalPropertiesRequest
*/
bool IsWhiteSpaceExist();
- /*
+ /**
+ * @brief helps to determine layout of interest. Returns keyboard layout,
+ * mentioned in current request. If not, returns saved keyboard layout for
+ * current app. If such layout wasn't saved, returns default keyboard layout
+ * (QWERTY)
+ * @return KeyboardLayout enum value
+ */
+ hmi_apis::Common_KeyboardLayout::eType GetKeyboardLayout() const;
+
+ /**
+ * @brief Returns allowed number of configurable keys for certain layout
+ * @return allowed number of configurable keys, if provided, and zero
+ * otherwise
+ */
+ uint32_t GetAllowedNumberOfConfigurableKeys() const;
+
+ /**
+ * @brief Checks provided custom keys against capabilities.
+ * @return true if the specified keyboard layout supports the number of
+ * custom keys provided.
+ */
+ bool ValidateCustomKeys() const;
+
+ /**
* @brief Prepare result code and result for sending to mobile application
* @param result_code contains result code for sending to mobile application
* @param info contains info for sending to mobile applicaion
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/set_media_clock_timer_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/set_media_clock_timer_request.h
index adced13d73..3023bf4fec 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/set_media_clock_timer_request.h
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/set_media_clock_timer_request.h
@@ -74,7 +74,7 @@ class SetMediaClockRequest : public app_mngr::commands::CommandRequestImpl {
void on_event(const app_mngr::event_engine::Event& event);
private:
- bool isDataValid();
+ bool isDataValid(std::string& info);
DISALLOW_COPY_AND_ASSIGN(SetMediaClockRequest);
};
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/subscribe_way_points_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/subscribe_way_points_request.h
index 8b88a1c884..69154d7669 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/subscribe_way_points_request.h
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/subscribe_way_points_request.h
@@ -76,6 +76,8 @@ class SubscribeWayPointsRequest
*/
bool Init() FINAL;
+ void onTimeOut() FINAL;
+
private:
DISALLOW_COPY_AND_ASSIGN(SubscribeWayPointsRequest);
};
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/unsubscribe_way_points_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/unsubscribe_way_points_request.h
index e83e9b7509..c4357d7529 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/unsubscribe_way_points_request.h
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/unsubscribe_way_points_request.h
@@ -75,6 +75,8 @@ class UnsubscribeWayPointsRequest
*/
bool Init() FINAL;
+ void onTimeOut() FINAL;
+
private:
DISALLOW_COPY_AND_ASSIGN(UnsubscribeWayPointsRequest);
};
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/bc_on_app_capability_updated_notification.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/bc_on_app_capability_updated_notification.cc
new file mode 100644
index 0000000000..a5f2137136
--- /dev/null
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/bc_on_app_capability_updated_notification.cc
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2020, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "sdl_rpc_plugin/commands/hmi/bc_on_app_capability_updated_notification.h"
+
+namespace sdl_rpc_plugin {
+namespace app_mngr = application_manager;
+
+namespace commands {
+
+SDL_CREATE_LOG_VARIABLE("Commands")
+
+BCOnAppCapabilityUpdatedNotification::BCOnAppCapabilityUpdatedNotification(
+ const application_manager::commands::MessageSharedPtr& message,
+ application_manager::ApplicationManager& application_manager,
+ application_manager::rpc_service::RPCService& rpc_service,
+ application_manager::HMICapabilities& hmi_capabilities,
+ policy::PolicyHandlerInterface& policy_handle)
+ : NotificationToHMI(message,
+ application_manager,
+ rpc_service,
+ hmi_capabilities,
+ policy_handle) {}
+
+BCOnAppCapabilityUpdatedNotification::~BCOnAppCapabilityUpdatedNotification() {}
+
+void BCOnAppCapabilityUpdatedNotification::Run() {
+ SDL_LOG_AUTO_TRACE();
+
+ SendNotification();
+}
+
+} // namespace commands
+} // namespace sdl_rpc_plugin
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/button_get_capabilities_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/button_get_capabilities_response.cc
index 20250af222..722bfc5097 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/button_get_capabilities_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/button_get_capabilities_response.cc
@@ -60,11 +60,10 @@ void ButtonGetCapabilitiesResponse::Run() {
static_cast<hmi_apis::Common_Result::eType>(
(*message_)[strings::params][hmi_response::code].asInt());
- hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
- hmi_apis::FunctionID::Buttons_GetCapabilities);
-
if (hmi_apis::Common_Result::SUCCESS != code) {
SDL_LOG_ERROR("Error is returned. Capabilities won't be updated.");
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::Buttons_GetCapabilities);
return;
}
@@ -81,6 +80,9 @@ void ButtonGetCapabilitiesResponse::Run() {
[hmi_response::preset_bank_capabilities]);
}
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::Buttons_GetCapabilities);
+
if (!hmi_capabilities_.SaveCachedCapabilitiesToFile(
hmi_interface::buttons, sections_to_update, message_->getSchema())) {
SDL_LOG_ERROR("Failed to save Buttons.GetCapabilities response to cache");
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/get_system_info_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/get_system_info_response.cc
index 8229e1978c..50fb41a551 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/get_system_info_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/get_system_info_response.cc
@@ -59,6 +59,8 @@ void GetSystemInfoResponse::Run() {
(*message_)[strings::params][hmi_response::code].asInt());
hmi_capabilities_.set_ccpu_version(policy_handler_.GetCCPUVersionFromPT());
+ hmi_capabilities_.set_hardware_version(
+ policy_handler_.GetHardwareVersionFromPT());
if (hmi_apis::Common_Result::SUCCESS != code) {
SDL_LOG_WARN("GetSystemError returns an error code " << code);
@@ -72,6 +74,11 @@ void GetSystemInfoResponse::Run() {
policy_handler_.OnGetSystemInfo(
info.ccpu_version, info.wers_country_code, info.language);
+ if (!info.hardware_version.empty()) {
+ policy_handler_.OnHardwareVersionReceived(info.hardware_version);
+ hmi_capabilities_.set_hardware_version(info.hardware_version);
+ }
+
hmi_capabilities_.OnSoftwareVersionReceived(info.ccpu_version);
}
@@ -89,6 +96,12 @@ const SystemInfo GetSystemInfoResponse::GetSystemInfo() const {
info.language = application_manager::EnumToString(
static_cast<hmi_apis::Common_Language::eType>(lang_code));
+ if ((*message_)[strings::msg_params].keyExists(
+ strings::system_hardware_version)) {
+ info.hardware_version =
+ (*message_)[strings::msg_params][strings::system_hardware_version]
+ .asString();
+ }
return info;
}
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_is_ready_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_is_ready_request.cc
index 4caa307be3..850f292972 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_is_ready_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_is_ready_request.cc
@@ -75,6 +75,8 @@ void NaviIsReadyRequest::on_event(const event_engine::Event& event) {
HMICapabilities& hmi_capabilities = hmi_capabilities_;
hmi_capabilities.set_is_navi_cooperating(is_available);
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::Navigation_IsReady);
break;
}
default: {
@@ -84,6 +86,11 @@ void NaviIsReadyRequest::on_event(const event_engine::Event& event) {
}
}
+void NaviIsReadyRequest::onTimeOut() {
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::Navigation_IsReady);
+}
+
} // namespace commands
} // namespace sdl_rpc_plugin
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_bc_system_capability_updated_notification_from_hmi.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_bc_system_capability_updated_notification_from_hmi.cc
index 7ba330caa8..56ff20ecc5 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_bc_system_capability_updated_notification_from_hmi.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_bc_system_capability_updated_notification_from_hmi.cc
@@ -34,6 +34,7 @@
#include "application_manager/display_capabilities_builder.h"
#include "application_manager/message_helper.h"
+#include "extensions/system_capability_app_extension.h"
#include "interfaces/HMI_API.h"
#include "interfaces/MOBILE_API.h"
@@ -84,11 +85,7 @@ OnBCSystemCapabilityUpdatedNotificationFromHMI::
SDL_LOG_DEBUG("Updating display capabilities for app " << app_id);
app->set_display_capabilities(display_capabilities);
- // Remove app_id from notification to mobile
- (*message_)[strings::params][strings::connection_key] =
- (*message_)[strings::msg_params][strings::app_id];
- (*message_)[strings::msg_params].erase(strings::app_id);
-
+ RemoveAppIdFromNotification();
auto& builder = app->display_capabilities_builder();
if (builder.IsWaitingForWindowCapabilities(display_capabilities)) {
SDL_LOG_DEBUG("Application is waiting for capabilities");
@@ -99,6 +96,54 @@ OnBCSystemCapabilityUpdatedNotificationFromHMI::
return ProcessSystemDisplayCapabilitiesResult::SUCCESS;
}
+void OnBCSystemCapabilityUpdatedNotificationFromHMI::
+ RemoveAppIdFromNotification() {
+ (*message_)[strings::params][strings::connection_key] =
+ (*message_)[strings::msg_params][strings::app_id];
+ (*message_)[strings::msg_params].erase(strings::app_id);
+}
+
+bool OnBCSystemCapabilityUpdatedNotificationFromHMI::
+ ProcessVideoStreamingCapability(
+ const smart_objects::SmartObject& system_capability) {
+ if (!system_capability.keyExists(strings::video_streaming_capability)) {
+ SDL_LOG_WARN(
+ "VideoStreamingCapability is absent in the notification. "
+ "Notification Will be ignored");
+ return false;
+ }
+ if (!(*message_)[strings::msg_params].keyExists(strings::app_id)) {
+ SDL_LOG_WARN(
+ "Notification doesn't contain an application id. Will "
+ "be ignored");
+ return false;
+ }
+
+ const auto app_id =
+ (*message_)[strings::msg_params][strings::app_id].asUInt();
+
+ auto app = application_manager_.application(app_id);
+ if (!app) {
+ SDL_LOG_WARN("Application with app_id: "
+ << app_id
+ << " isn't registered. Notification will be ignored");
+ return false;
+ }
+
+ auto& system_capability_extension =
+ SystemCapabilityAppExtension::ExtractExtension(*app);
+
+ if (!system_capability_extension.IsSubscribedTo(
+ mobile_apis::SystemCapabilityType::VIDEO_STREAMING)) {
+ SDL_LOG_WARN("The Application with app_id: "
+ << app_id
+ << " isn't subscribed to the VIDEO_STREAMING system "
+ "capability type. Notification will be ignored");
+ return false;
+ }
+ return true;
+}
+
void OnBCSystemCapabilityUpdatedNotificationFromHMI::Run() {
SDL_LOG_AUTO_TRACE();
@@ -109,7 +154,11 @@ void OnBCSystemCapabilityUpdatedNotificationFromHMI::Run() {
const auto& system_capability =
(*message_)[strings::msg_params][strings::system_capability];
- switch (system_capability[strings::system_capability_type].asInt()) {
+ const auto system_capability_type =
+ static_cast<mobile_apis::SystemCapabilityType::eType>(
+ system_capability[strings::system_capability_type].asInt());
+
+ switch (system_capability_type) {
case mobile_apis::SystemCapabilityType::DISPLAYS: {
if (system_capability.keyExists(strings::display_capabilities)) {
const auto result = ProcessSystemDisplayCapabilities(
@@ -135,6 +184,14 @@ void OnBCSystemCapabilityUpdatedNotificationFromHMI::Run() {
}
break;
}
+ case mobile_apis::SystemCapabilityType::VIDEO_STREAMING: {
+ if (!ProcessVideoStreamingCapability(system_capability)) {
+ return;
+ }
+ RemoveAppIdFromNotification();
+ break;
+ }
+ default: { SDL_LOG_ERROR("Unknown system capability type received"); }
}
SendNotificationToMobile(message_);
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_navi_way_point_change_notification.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_navi_way_point_change_notification.cc
index 2440e918b7..02c2ccf31b 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_navi_way_point_change_notification.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_navi_way_point_change_notification.cc
@@ -32,6 +32,8 @@
#include "sdl_rpc_plugin/commands/hmi/on_navi_way_point_change_notification.h"
+#include "application_manager/app_service_manager.h"
+
namespace sdl_rpc_plugin {
using namespace application_manager;
@@ -56,8 +58,12 @@ void OnNaviWayPointChangeNotification::Run() {
// prepare SmartObject for mobile factory
(*message_)[strings::params][strings::function_id] =
static_cast<int32_t>(mobile_apis::FunctionID::OnWayPointChangeID);
+ application_manager_.SaveWayPointsMessage(message_, 0);
- SendNotificationToMobile(message_);
+ if (application_manager_.GetAppServiceManager().FindWayPointsHandler() ==
+ nullptr) {
+ SendNotificationToMobile(message_);
+ }
}
} // namespace commands
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/rc_get_capabilities_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/rc_get_capabilities_response.cc
index 10507a516f..bd5da04cb3 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/rc_get_capabilities_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/rc_get_capabilities_response.cc
@@ -58,11 +58,10 @@ void RCGetCapabilitiesResponse::Run() {
const auto result_code = static_cast<hmi_apis::Common_Result::eType>(
(*message_)[strings::params][hmi_response::code].asInt());
- hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
- hmi_apis::FunctionID::RC_GetCapabilities);
-
if (hmi_apis::Common_Result::SUCCESS != result_code) {
SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities");
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::RC_GetCapabilities);
return;
}
@@ -88,6 +87,9 @@ void RCGetCapabilitiesResponse::Run() {
hmi_capabilities_.set_rc_supported(rc_capability_exists);
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::RC_GetCapabilities);
+
if (!hmi_capabilities_.SaveCachedCapabilitiesToFile(
hmi_interface::rc, sections_to_update, message_->getSchema())) {
SDL_LOG_ERROR("Failed to save RC.GetCapabilities response to cache");
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/rc_is_ready_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/rc_is_ready_request.cc
index c9a9af87fb..3d31953474 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/rc_is_ready_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/rc_is_ready_request.cc
@@ -79,6 +79,8 @@ void RCIsReadyRequest::on_event(const event_engine::Event& event) {
if (!is_available) {
hmi_capabilities.set_rc_supported(false);
}
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::RC_IsReady);
if (!app_mngr::commands::CheckAvailabilityHMIInterfaces(
application_manager_, HmiInterfaces::HMI_INTERFACE_RC)) {
@@ -99,6 +101,8 @@ void RCIsReadyRequest::on_event(const event_engine::Event& event) {
void RCIsReadyRequest::onTimeOut() {
// Note(dtrunov): According to new requirment APPLINK-27956
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::RC_IsReady);
RequestInterfaceCapabilities(hmi_interface::rc);
}
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_capabilities_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_capabilities_response.cc
index 167966e55b..10709bf94d 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_capabilities_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_capabilities_response.cc
@@ -57,11 +57,10 @@ void TTSGetCapabilitiesResponse::Run() {
const auto result_code = static_cast<hmi_apis::Common_Result::eType>(
(*message_)[strings::params][hmi_response::code].asInt());
- hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
- hmi_apis::FunctionID::TTS_GetCapabilities);
-
if (hmi_apis::Common_Result::SUCCESS != result_code) {
SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities");
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::TTS_GetCapabilities);
return;
}
@@ -80,6 +79,9 @@ void TTSGetCapabilitiesResponse::Run() {
[hmi_response::prerecorded_speech_capabilities]);
}
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::TTS_GetCapabilities);
+
if (!hmi_capabilities_.SaveCachedCapabilitiesToFile(
hmi_interface::tts, sections_to_update, message_->getSchema())) {
SDL_LOG_ERROR("Failed to save TTS.GetCapabilities response to cache");
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_language_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_language_response.cc
index 2b14bea681..8b708dda01 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_language_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_language_response.cc
@@ -61,11 +61,10 @@ void TTSGetLanguageResponse::Run() {
const Common_Result::eType result_code = static_cast<Common_Result::eType>(
(*message_)[strings::params][hmi_response::code].asInt());
- hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
- hmi_apis::FunctionID::TTS_GetLanguage);
-
if (Common_Result::SUCCESS != result_code) {
SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities");
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::TTS_GetLanguage);
return;
}
@@ -79,6 +78,9 @@ void TTSGetLanguageResponse::Run() {
hmi_capabilities_.set_active_tts_language(language);
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::TTS_GetLanguage);
+
std::vector<std::string> sections_to_update{hmi_response::language};
if (!hmi_capabilities_.SaveCachedCapabilitiesToFile(
hmi_interface::tts, sections_to_update, message_->getSchema())) {
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_supported_languages_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_supported_languages_response.cc
index 6b074005b2..71ecd9d4da 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_supported_languages_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_supported_languages_response.cc
@@ -61,17 +61,19 @@ void TTSGetSupportedLanguagesResponse::Run() {
static_cast<hmi_apis::Common_Result::eType>(
(*message_)[strings::params][hmi_response::code].asInt());
- hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
- hmi_apis::FunctionID::TTS_GetSupportedLanguages);
-
if (hmi_apis::Common_Result::SUCCESS != code) {
SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities");
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::TTS_GetSupportedLanguages);
return;
}
hmi_capabilities_.set_tts_supported_languages(
(*message_)[strings::msg_params][hmi_response::languages]);
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::TTS_GetSupportedLanguages);
+
std::vector<std::string> sections_to_update{hmi_response::languages};
if (!hmi_capabilities_.SaveCachedCapabilitiesToFile(
hmi_interface::tts, sections_to_update, message_->getSchema())) {
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_is_ready_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_is_ready_request.cc
index 1f1f3e7eab..5ff7bc5a50 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_is_ready_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_is_ready_request.cc
@@ -73,6 +73,8 @@ void TTSIsReadyRequest::on_event(const event_engine::Event& event) {
application_manager_, message, HmiInterfaces::HMI_INTERFACE_TTS);
HMICapabilities& hmi_capabilities = hmi_capabilities_;
hmi_capabilities.set_is_tts_cooperating(is_available);
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::TTS_IsReady);
if (!app_mngr::commands::CheckAvailabilityHMIInterfaces(
application_manager_, HmiInterfaces::HMI_INTERFACE_TTS)) {
UpdateRequiredInterfaceCapabilitiesRequests(hmi_interface::tts);
@@ -92,6 +94,8 @@ void TTSIsReadyRequest::on_event(const event_engine::Event& event) {
void TTSIsReadyRequest::onTimeOut() {
// Note(dtrunov): According to new requirment APPLINK-27956
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::TTS_IsReady);
RequestInterfaceCapabilities(hmi_interface::tts);
}
} // namespace commands
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 31dda22709..45c5f59326 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
@@ -58,11 +58,10 @@ void UIGetCapabilitiesResponse::Run() {
const auto result_code = static_cast<hmi_apis::Common_Result::eType>(
(*message_)[strings::params][hmi_response::code].asInt());
- hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
- hmi_apis::FunctionID::UI_GetCapabilities);
-
if (hmi_apis::Common_Result::SUCCESS != result_code) {
SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities");
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::UI_GetCapabilities);
return;
}
@@ -165,6 +164,9 @@ void UIGetCapabilitiesResponse::Run() {
msg_params[strings::pcm_stream_capabilities]);
}
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::UI_GetCapabilities);
+
if (!hmi_capabilities_.SaveCachedCapabilitiesToFile(
hmi_interface::ui, sections_to_update, message_->getSchema())) {
SDL_LOG_ERROR("Failed to save UI.GetCapabilities response to cache");
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_language_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_language_response.cc
index ffeec025be..9bae80f48e 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_language_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_language_response.cc
@@ -61,11 +61,10 @@ void UIGetLanguageResponse::Run() {
const Common_Result::eType result_code = static_cast<Common_Result::eType>(
(*message_)[strings::params][hmi_response::code].asInt());
- hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
- hmi_apis::FunctionID::UI_GetLanguage);
-
if (Common_Result::SUCCESS != result_code) {
SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities");
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::UI_GetLanguage);
return;
}
@@ -79,6 +78,9 @@ void UIGetLanguageResponse::Run() {
hmi_capabilities_.set_active_ui_language(language);
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::UI_GetLanguage);
+
std::vector<std::string> sections_to_update{hmi_response::language};
if (!hmi_capabilities_.SaveCachedCapabilitiesToFile(
hmi_interface::ui, sections_to_update, message_->getSchema())) {
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_supported_languages_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_supported_languages_response.cc
index 20606294ae..e3d6a979ba 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_supported_languages_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_supported_languages_response.cc
@@ -61,17 +61,19 @@ void UIGetSupportedLanguagesResponse::Run() {
static_cast<hmi_apis::Common_Result::eType>(
(*message_)[strings::params][hmi_response::code].asInt());
- hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
- hmi_apis::FunctionID::UI_GetSupportedLanguages);
-
if (hmi_apis::Common_Result::SUCCESS != code) {
SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities");
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::UI_GetSupportedLanguages);
return;
}
hmi_capabilities_.set_ui_supported_languages(
(*message_)[strings::msg_params][hmi_response::languages]);
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::UI_GetSupportedLanguages);
+
std::vector<std::string> sections_to_update{hmi_response::languages};
if (!hmi_capabilities_.SaveCachedCapabilitiesToFile(
hmi_interface::ui, sections_to_update, message_->getSchema())) {
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_is_ready_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_is_ready_request.cc
index d020972ce6..f3da33c5b5 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_is_ready_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_is_ready_request.cc
@@ -72,6 +72,8 @@ void UIIsReadyRequest::on_event(const event_engine::Event& event) {
application_manager_, message, HmiInterfaces::HMI_INTERFACE_UI);
HMICapabilities& hmi_capabilities = hmi_capabilities_;
hmi_capabilities.set_is_ui_cooperating(is_available);
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::UI_IsReady);
if (!app_mngr::commands::CheckAvailabilityHMIInterfaces(
application_manager_, HmiInterfaces::HMI_INTERFACE_UI)) {
UpdateRequiredInterfaceCapabilitiesRequests(hmi_interface::ui);
@@ -91,6 +93,8 @@ void UIIsReadyRequest::on_event(const event_engine::Event& event) {
void UIIsReadyRequest::onTimeOut() {
// Note(dtrunov): According to new requirment APPLINK-27956
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::UI_IsReady);
RequestInterfaceCapabilities(hmi_interface::ui);
}
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/update_device_list_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/update_device_list_request.cc
index c8aa295645..4d055564de 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/update_device_list_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/update_device_list_request.cc
@@ -53,51 +53,27 @@ UpdateDeviceListRequest::UpdateDeviceListRequest(
application_manager,
rpc_service,
hmi_capabilities,
- policy_handle)
- , EventObserver(application_manager_.event_dispatcher()) {}
+ policy_handle) {}
UpdateDeviceListRequest::~UpdateDeviceListRequest() {}
void UpdateDeviceListRequest::Run() {
SDL_LOG_AUTO_TRACE();
- sync_primitives::AutoLock auto_lock(wait_hmi_lock);
// Fix problem with SDL and HMI HTML. This problem is not actual for HMI PASA.
// Flag conditional compilation for specific customer is used in order to
// exclude
// hit code to RTC
- if (true == application_manager_.get_settings().launch_hmi()) {
- if (!application_manager_.IsHMICooperating()) {
- SDL_LOG_INFO("Wait for HMI Cooperation");
- subscribe_on_event(hmi_apis::FunctionID::BasicCommunication_OnReady);
- termination_condition_.Wait(auto_lock);
- SDL_LOG_DEBUG("HMI Cooperation OK");
+ if (application_manager_.get_settings().launch_hmi()) {
+ SDL_LOG_INFO("Wait for HMI Cooperation");
+ if (!application_manager_.WaitForHmiIsReady()) {
+ SDL_LOG_ERROR("HMI is not ready");
+ return;
}
- }
-
- SendRequest();
-}
-void UpdateDeviceListRequest::on_event(const event_engine::Event& event) {
- SDL_LOG_AUTO_TRACE();
- sync_primitives::AutoLock auto_lock(wait_hmi_lock);
- switch (event.id()) {
- case hmi_apis::FunctionID::BasicCommunication_OnReady: {
- SDL_LOG_INFO("received OnReady");
- unsubscribe_from_event(hmi_apis::FunctionID::BasicCommunication_OnReady);
- termination_condition_.Broadcast();
- break;
- };
- default: {
- SDL_LOG_ERROR("Unknown event " << event.id());
- break;
- };
+ SDL_LOG_DEBUG("HMI Cooperation is OK");
}
-}
-bool UpdateDeviceListRequest::CleanUp() {
- sync_primitives::AutoLock auto_lock(wait_hmi_lock);
- termination_condition_.Broadcast();
- return true;
+ SendRequest();
}
} // namespace commands
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_capabilities_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_capabilities_response.cc
index 315107d94a..60cb39f987 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_capabilities_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_capabilities_response.cc
@@ -57,11 +57,10 @@ void VRGetCapabilitiesResponse::Run() {
const auto result_code = static_cast<hmi_apis::Common_Result::eType>(
(*message_)[strings::params][hmi_response::code].asInt());
- hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
- hmi_apis::FunctionID::VR_GetCapabilities);
-
if (hmi_apis::Common_Result::SUCCESS != result_code) {
SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities");
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::VR_GetCapabilities);
return;
}
@@ -74,6 +73,9 @@ void VRGetCapabilitiesResponse::Run() {
hmi_capabilities_.set_vr_capabilities(msg_params[strings::vr_capabilities]);
}
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::VR_GetCapabilities);
+
if (!hmi_capabilities_.SaveCachedCapabilitiesToFile(
hmi_interface::vr, sections_to_update, message_->getSchema())) {
SDL_LOG_ERROR("Failed to save VR.GetCapabilities response to cache");
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_language_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_language_response.cc
index e8c881f6f8..3529d9fcde 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_language_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_language_response.cc
@@ -61,11 +61,10 @@ void VRGetLanguageResponse::Run() {
const Common_Result::eType result_code = static_cast<Common_Result::eType>(
(*message_)[strings::params][hmi_response::code].asInt());
- hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
- hmi_apis::FunctionID::VR_GetLanguage);
-
if (Common_Result::SUCCESS != result_code) {
SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities");
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::VR_GetLanguage);
return;
}
@@ -79,6 +78,9 @@ void VRGetLanguageResponse::Run() {
hmi_capabilities_.set_active_vr_language(language);
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::VR_GetLanguage);
+
std::vector<std::string> sections_to_update{hmi_response::language};
if (!hmi_capabilities_.SaveCachedCapabilitiesToFile(
hmi_interface::vr, sections_to_update, message_->getSchema())) {
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_supported_languages_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_supported_languages_response.cc
index 72278fcddd..7b234befbe 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_supported_languages_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_supported_languages_response.cc
@@ -62,20 +62,24 @@ void VRGetSupportedLanguagesResponse::Run() {
static_cast<hmi_apis::Common_Result::eType>(
(*message_)[strings::params][hmi_response::code].asInt());
+ if (hmi_apis::Common_Result::SUCCESS != code) {
+ SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities");
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::VR_GetSupportedLanguages);
+ return;
+ }
+
+ HMICapabilities& hmi_capabilities = hmi_capabilities_;
+ hmi_capabilities.set_vr_supported_languages(
+ (*message_)[strings::msg_params][hmi_response::languages]);
+
hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
hmi_apis::FunctionID::VR_GetSupportedLanguages);
- if (hmi_apis::Common_Result::SUCCESS == code) {
- HMICapabilities& hmi_capabilities = hmi_capabilities_;
- hmi_capabilities.set_vr_supported_languages(
- (*message_)[strings::msg_params][hmi_response::languages]);
-
- std::vector<std::string> sections_to_update{hmi_response::languages};
- if (!hmi_capabilities_.SaveCachedCapabilitiesToFile(
- hmi_interface::vr, sections_to_update, message_->getSchema())) {
- SDL_LOG_ERROR(
- "Failed to save VR.GetSupportedLanguages response to cache");
- }
+ std::vector<std::string> sections_to_update{hmi_response::languages};
+ if (!hmi_capabilities_.SaveCachedCapabilitiesToFile(
+ hmi_interface::vr, sections_to_update, message_->getSchema())) {
+ SDL_LOG_ERROR("Failed to save VR.GetSupportedLanguages response to cache");
}
}
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_is_ready_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_is_ready_request.cc
index 303e7a6843..2efd227add 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_is_ready_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_is_ready_request.cc
@@ -73,6 +73,8 @@ void VRIsReadyRequest::on_event(const event_engine::Event& event) {
HMICapabilities& hmi_capabilities = hmi_capabilities_;
hmi_capabilities.set_is_vr_cooperating(is_available);
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::VR_IsReady);
if (!app_mngr::commands::CheckAvailabilityHMIInterfaces(
application_manager_, HmiInterfaces::HMI_INTERFACE_VR)) {
UpdateRequiredInterfaceCapabilitiesRequests(hmi_interface::vr);
@@ -92,6 +94,8 @@ void VRIsReadyRequest::on_event(const event_engine::Event& event) {
void VRIsReadyRequest::onTimeOut() {
// Note(dtrunov): According to new requirment APPLINK-27956
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::VR_IsReady);
RequestInterfaceCapabilities(hmi_interface::vr);
}
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_command_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_command_request.cc
index 6717f332f8..03b0ee20fc 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_command_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_command_request.cc
@@ -107,6 +107,20 @@ void AddCommandRequest::Run() {
}
}
+ if ((*message_)[strings::msg_params].keyExists(strings::secondary_image)) {
+ mobile_apis::Result::eType verification_result = MessageHelper::VerifyImage(
+ (*message_)[strings::msg_params][strings::secondary_image],
+ app,
+ application_manager_);
+
+ if (mobile_apis::Result::INVALID_DATA == verification_result) {
+ SDL_LOG_ERROR("MessageHelper::VerifyImage return "
+ << verification_result);
+ SendResponse(false, verification_result);
+ return;
+ }
+ }
+
if (!((*message_)[strings::msg_params].keyExists(strings::cmd_id))) {
SDL_LOG_ERROR("INVALID_DATA");
SendResponse(false, mobile_apis::Result::INVALID_DATA);
@@ -127,10 +141,6 @@ void AddCommandRequest::Run() {
bool data_exist = false;
if ((*message_)[strings::msg_params].keyExists(strings::menu_params)) {
- if (!CheckCommandName(app)) {
- SendResponse(false, mobile_apis::Result::DUPLICATE_NAME);
- return;
- }
if (((*message_)[strings::msg_params][strings::menu_params].keyExists(
hmi_request::parent_id)) &&
(0 != (*message_)[strings::msg_params][strings::menu_params]
@@ -191,6 +201,17 @@ void AddCommandRequest::Run() {
(*message_)[strings::msg_params][strings::cmd_icon];
}
+ if (((*message_)[strings::msg_params].keyExists(
+ strings::secondary_image)) &&
+ ((*message_)[strings::msg_params][strings::secondary_image].keyExists(
+ strings::value)) &&
+ (0 < (*message_)[strings::msg_params][strings::secondary_image]
+ [strings::value]
+ .length())) {
+ ui_msg_params[strings::secondary_image] =
+ (*message_)[strings::msg_params][strings::secondary_image];
+ }
+
send_ui_ = true;
}
@@ -220,47 +241,6 @@ void AddCommandRequest::Run() {
}
}
-bool AddCommandRequest::CheckCommandName(ApplicationConstSharedPtr app) {
- if (!app) {
- return false;
- }
-
- const DataAccessor<CommandsMap> accessor = app->commands_map();
- const CommandsMap& commands = accessor.GetData();
- CommandsMap::const_iterator i = commands.begin();
- uint32_t saved_parent_id = 0;
- uint32_t parent_id = 0;
- if ((*message_)[strings::msg_params][strings::menu_params].keyExists(
- hmi_request::parent_id)) {
- parent_id = (*message_)[strings::msg_params][strings::menu_params]
- [hmi_request::parent_id]
- .asUInt();
- }
-
- for (; commands.end() != i; ++i) {
- if (!(*i->second).keyExists(strings::menu_params)) {
- continue;
- }
-
- saved_parent_id = 0;
- if ((*i->second)[strings::menu_params].keyExists(hmi_request::parent_id)) {
- saved_parent_id =
- (*i->second)[strings::menu_params][hmi_request::parent_id].asUInt();
- }
- if (((*i->second)[strings::menu_params][strings::menu_name].asString() ==
- (*message_)[strings::msg_params][strings::menu_params]
- [strings::menu_name]
- .asString()) &&
- (saved_parent_id == parent_id)) {
- SDL_LOG_INFO(
- "AddCommandRequest::CheckCommandName received"
- " command name already exist in same level menu");
- return false;
- }
- }
- return true;
-}
-
bool AddCommandRequest::CheckCommandVRSynonym(ApplicationConstSharedPtr app) {
if (!app) {
return false;
@@ -565,6 +545,16 @@ bool AddCommandRequest::IsWhiteSpaceExist() {
return true;
}
}
+
+ if ((*message_)[strings::msg_params].keyExists(strings::secondary_image)) {
+ str = (*message_)[strings::msg_params][strings::secondary_image]
+ [strings::value]
+ .asCharArray();
+ if (!CheckSyntax(str)) {
+ SDL_LOG_ERROR("Invalid secondaryImage value syntax check failed");
+ return true;
+ }
+ }
return false;
}
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 e2a37f17bd..309f07e443 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
@@ -86,6 +86,20 @@ void AddSubMenuRequest::Run() {
}
}
+ if (received_msg_params.keyExists(strings::secondary_image)) {
+ verification_result = MessageHelper::VerifyImage(
+ received_msg_params[strings::secondary_image],
+ app,
+ application_manager_);
+
+ if (mobile_apis::Result::INVALID_DATA == verification_result) {
+ SDL_LOG_ERROR("MessageHelper::VerifyImage return "
+ << verification_result);
+ SendResponse(false, verification_result);
+ return;
+ }
+ }
+
const int32_t menu_id = received_msg_params[strings::menu_id].asInt();
const auto sub_menu = app->FindSubMenu(menu_id);
@@ -114,12 +128,6 @@ void AddSubMenuRequest::Run() {
const std::string& menu_name =
received_msg_params[strings::menu_name].asString();
- if (app->IsSubMenuNameAlreadyExist(menu_name, parent_id)) {
- SDL_LOG_ERROR("Menu name " << menu_name << " is duplicated.");
- SendResponse(false, mobile_apis::Result::DUPLICATE_NAME);
- return;
- }
-
if (!CheckSubMenuName()) {
SDL_LOG_ERROR("Sub-menu name is not valid.");
SendResponse(false, mobile_apis::Result::INVALID_DATA);
@@ -148,11 +156,23 @@ void AddSubMenuRequest::Run() {
if (received_msg_params.keyExists(strings::menu_icon)) {
msg_params[strings::menu_icon] = received_msg_params[strings::menu_icon];
}
+ if (received_msg_params.keyExists(strings::secondary_image)) {
+ msg_params[strings::secondary_image] =
+ received_msg_params[strings::secondary_image];
+ }
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;
}
+ if (received_msg_params.keyExists(strings::secondary_text)) {
+ msg_params[strings::menu_params][strings::secondary_text] =
+ received_msg_params[strings::secondary_text];
+ }
+ if (received_msg_params.keyExists(strings::tertiary_text)) {
+ msg_params[strings::menu_params][strings::tertiary_text] =
+ received_msg_params[strings::tertiary_text];
+ }
msg_params[strings::app_id] = app->app_id();
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_maneuver_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_maneuver_request.cc
index 47b3a87d52..8728bb4403 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_maneuver_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_maneuver_request.cc
@@ -144,6 +144,7 @@ void AlertManeuverRequest::Run() {
smart_objects::SmartObject msg_params =
smart_objects::SmartObject(smart_objects::SmartType_Map);
+ msg_params[strings::app_id] = app->app_id();
msg_params[hmi_request::tts_chunks] =
(*message_)[strings::msg_params][strings::tts_chunks];
msg_params[hmi_request::speak_type] =
@@ -236,7 +237,8 @@ bool AlertManeuverRequest::PrepareResponseParameters(
application_manager_.hmi_interfaces().GetInterfaceState(
HmiInterfaces::HMI_INTERFACE_TTS)))) {
result_code = mobile_apis::Result::WARNINGS;
- return_info = std::string("Unsupported phoneme type sent in a prompt");
+ return_info = app_mngr::commands::MergeInfos(
+ navigation_alert_info, info_navi_, tts_alert_info, info_tts_);
return result;
}
result_code =
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_maneuver_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_maneuver_response.cc
index 993dc75548..5661b1df9c 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_maneuver_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_maneuver_response.cc
@@ -59,6 +59,8 @@ AlertManeuverResponse::~AlertManeuverResponse() {}
void AlertManeuverResponse::Run() {
SDL_LOG_AUTO_TRACE();
+ application_manager_.UnsubscribeAppFromSoftButtons(message_);
+
rpc_service_.SendMessageToMobile(message_);
}
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_request.cc
index cfd3106f4d..9f04541b46 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_request.cc
@@ -213,19 +213,10 @@ bool AlertRequest::PrepareResponseParameters(
bool result = PrepareResultForMobileResponse(ui_alert_info, tts_alert_info);
- /* result=false if UI interface is ok and TTS interface = UNSUPPORTED_RESOURCE
- * and sdl receive TTS.IsReady=true or SDL doesn't receive responce for
- * TTS.IsReady.
- */
- if (result && ui_alert_info.is_ok && tts_alert_info.is_unsupported_resource &&
- HmiInterfaces::STATE_NOT_AVAILABLE != tts_alert_info.interface_state) {
- result = false;
- }
result_code = mobile_apis::Result::WARNINGS;
if ((ui_alert_info.is_ok || ui_alert_info.is_not_used) &&
tts_alert_info.is_unsupported_resource &&
HmiInterfaces::STATE_AVAILABLE == tts_alert_info.interface_state) {
- tts_response_info_ = "Unsupported phoneme type sent in a prompt";
info = app_mngr::commands::MergeInfos(
ui_alert_info, ui_response_info_, tts_alert_info, tts_response_info_);
return result;
@@ -234,7 +225,10 @@ bool AlertRequest::PrepareResponseParameters(
info = app_mngr::commands::MergeInfos(
ui_alert_info, ui_response_info_, tts_alert_info, tts_response_info_);
// Mobile Alert request is successful when UI_Alert is successful
- if (is_ui_alert_sent_ && !ui_alert_info.is_ok) {
+ bool has_unsupported_data =
+ ui_alert_info.is_unsupported_resource &&
+ HmiInterfaces::STATE_NOT_AVAILABLE != ui_alert_info.interface_state;
+ if (is_ui_alert_sent_ && !ui_alert_info.is_ok && !has_unsupported_data) {
return false;
}
return result;
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_response.cc
index 1b8eebe7d7..84d23bec46 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_response.cc
@@ -61,6 +61,8 @@ AlertResponse::~AlertResponse() {}
void AlertResponse::Run() {
SDL_LOG_AUTO_TRACE();
+ application_manager_.UnsubscribeAppFromSoftButtons(message_);
+
rpc_service_.SendMessageToMobile(message_);
}
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 1cd4806f7e..64eae885a8 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
@@ -204,10 +204,12 @@ void GetSystemCapabilityRequest::Run() {
auto& ext = SystemCapabilityAppExtension::ExtractExtension(*app);
if ((*message_)[app_mngr::strings::msg_params][strings::subscribe]
.asBool() == true) {
- SDL_LOG_DEBUG("Subscribe to system capability: " << response_type);
+ SDL_LOG_DEBUG("Subscribe to system capability: "
+ << response_type << " for app_id: " << app->app_id());
ext.SubscribeTo(response_type);
} else {
- SDL_LOG_DEBUG("Unsubscribe from system capability: " << response_type);
+ SDL_LOG_DEBUG("Unsubscribe from system capability: "
+ << response_type << " for app_id: " << app->app_id());
ext.UnsubscribeFrom(response_type);
}
}
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_app_capability_updated_notification.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_app_capability_updated_notification.cc
new file mode 100644
index 0000000000..c04b10cbd4
--- /dev/null
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_app_capability_updated_notification.cc
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2020, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "sdl_rpc_plugin/commands/mobile/on_app_capability_updated_notification.h"
+
+namespace sdl_rpc_plugin {
+
+namespace commands {
+namespace mobile {
+
+SDL_CREATE_LOG_VARIABLE("Commands")
+
+OnAppCapabilityUpdatedNotification::OnAppCapabilityUpdatedNotification(
+ const application_manager::commands::MessageSharedPtr& message,
+ app_mngr::ApplicationManager& application_manager,
+ app_mngr::rpc_service::RPCService& rpc_service,
+ app_mngr::HMICapabilities& hmi_capabilities,
+ policy::PolicyHandlerInterface& policy_handle)
+ : CommandNotificationFromMobileImpl(message,
+ application_manager,
+ rpc_service,
+ hmi_capabilities,
+ policy_handle) {}
+
+OnAppCapabilityUpdatedNotification::~OnAppCapabilityUpdatedNotification() {}
+
+void OnAppCapabilityUpdatedNotification::Run() {
+ SDL_LOG_AUTO_TRACE();
+ app_mngr::ApplicationSharedPtr app =
+ application_manager_.application(connection_key());
+
+ if (!app) {
+ SDL_LOG_ERROR("No application associated with session key");
+ return;
+ }
+
+ (*message_)[app_mngr::strings::msg_params][app_mngr::strings::app_id] =
+ app->app_id();
+
+ SendNotificationToHMI(
+ hmi_apis::FunctionID::BasicCommunication_OnAppCapabilityUpdated);
+}
+
+} // namespace mobile
+} // namespace commands
+} // namespace sdl_rpc_plugin
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_capability_updated_notification.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_capability_updated_notification.cc
index 850aa64b5f..1f15170ffe 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_capability_updated_notification.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_capability_updated_notification.cc
@@ -81,15 +81,10 @@ void OnSystemCapabilityUpdatedNotification::Run() {
}
break;
}
- case mobile_apis::SystemCapabilityType::VIDEO_STREAMING:
- if (hmi_capabilities_.video_streaming_capability()) {
- msg_params[strings::system_capability]
- [strings::video_streaming_capability] =
- *hmi_capabilities_.video_streaming_capability();
- } else {
- return;
- }
- break;
+ case mobile_apis::SystemCapabilityType::VIDEO_STREAMING: {
+ SendNotification();
+ return;
+ }
case mobile_apis::SystemCapabilityType::APP_SERVICES: {
auto all_services =
application_manager_.GetAppServiceManager().GetAllServiceRecords();
@@ -200,48 +195,51 @@ void OnSystemCapabilityUpdatedNotification::Run() {
for (; applications.end() != app_it; ++app_it) {
const ApplicationSharedPtr app = *app_it;
- if (system_capability_type ==
- mobile_apis::SystemCapabilityType::REMOTE_CONTROL &&
- !app->is_remote_control_supported()) {
- SDL_LOG_WARN(
- "App with connection key: "
- << app->app_id()
- << " was subcribed to REMOTE_CONTROL system capabilities, but "
- "does not have RC permissions. Unsubscribing");
- auto& ext = SystemCapabilityAppExtension::ExtractExtension(*app);
- ext.UnsubscribeFrom(system_capability_type);
- continue;
- }
- if (mobile_apis::SystemCapabilityType::DISPLAYS == system_capability_type) {
- SDL_LOG_DEBUG("Using common display capabilities");
- auto capabilities = hmi_capabilities_.system_display_capabilities();
-
- auto& builder = app->display_capabilities_builder();
- if (app->is_resuming() && builder.IsWindowResumptionNeeded()) {
- SDL_LOG_DEBUG("Application "
- << app->app_id()
- << " is resuming. Providing cached capabilities");
- auto display_caps = builder.display_capabilities();
- capabilities = display_caps;
- } else if (app->display_capabilities()) {
- SDL_LOG_DEBUG("Application " << app->app_id()
- << " has specific display capabilities");
- const WindowID window_id =
- msg_params[strings::system_capability]
- [strings::display_capabilities][0]
- [strings::window_capabilities][0][strings::window_id]
- .asInt();
- capabilities = app->display_capabilities(window_id);
- }
+ switch (system_capability_type) {
+ case mobile_apis::SystemCapabilityType::REMOTE_CONTROL: {
+ if (!app->is_remote_control_supported()) {
+ SDL_LOG_WARN("App with connection key: "
+ << app->app_id()
+ << " was subcribed to REMOTE_CONTROL system "
+ "capabilities, but "
+ "does not have RC permissions. Unsubscribing");
+ auto& ext = SystemCapabilityAppExtension::ExtractExtension(*app);
+ ext.UnsubscribeFrom(system_capability_type);
+ }
+ } break;
+
+ case mobile_apis::SystemCapabilityType::DISPLAYS: {
+ SDL_LOG_DEBUG("Using common display capabilities");
+ auto capabilities = hmi_capabilities_.system_display_capabilities();
+ auto& builder = app->display_capabilities_builder();
+ if (app->is_resuming() && builder.IsWindowResumptionNeeded()) {
+ SDL_LOG_DEBUG("Application "
+ << app->app_id()
+ << " is resuming. Providing cached capabilities");
+ auto display_caps = builder.display_capabilities();
+ capabilities = display_caps;
+ } else if (app->display_capabilities()) {
+ SDL_LOG_DEBUG("Application " << app->app_id()
+ << " has specific display capabilities");
+ const WindowID window_id =
+ msg_params[strings::system_capability]
+ [strings::display_capabilities][0]
+ [strings::window_capabilities][0][strings::window_id]
+ .asInt();
+ capabilities = app->display_capabilities(window_id);
+ }
- if (!capabilities) {
- SDL_LOG_WARN("No available display capabilities for sending. Skipping");
- continue;
- }
+ if (!capabilities) {
+ SDL_LOG_WARN(
+ "No available display capabilities for sending. Skipping");
+ continue;
+ }
- msg_params[strings::system_capability][strings::display_capabilities] =
- *capabilities;
+ msg_params[strings::system_capability][strings::display_capabilities] =
+ *capabilities;
+ } break;
+ default: { SDL_LOG_ERROR("Unknown system capability type"); }
}
SDL_LOG_INFO("Sending OnSystemCapabilityUpdated " << capability_type_string
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_request_notification.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_request_notification.cc
index 4a97d5b970..40705491fc 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_request_notification.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_request_notification.cc
@@ -109,15 +109,8 @@ void OnSystemRequestNotification::Run() {
SDL_LOG_DEBUG("Processing Request type : " << stringified_request_type);
- const bool binary_data_is_required =
- Compare<mobile_apis::RequestType::eType, EQ, ONE>(
- request_type,
- mobile_apis::RequestType::PROPRIETARY,
- mobile_apis::RequestType::OEM_SPECIFIC);
-
BinaryMessage binary_data;
- if (binary_data_is_required &&
- (*message_)[strings::msg_params].keyExists(strings::file_name)) {
+ if ((*message_)[strings::msg_params].keyExists(strings::file_name)) {
const std::string filename =
(*message_)[strings::msg_params][strings::file_name].asString();
file_system::ReadBinaryFile(filename, binary_data);
@@ -126,22 +119,15 @@ void OnSystemRequestNotification::Run() {
binary_data = (*message_)[strings::params][strings::binary_data].asBinary();
}
- if (mobile_apis::RequestType::OEM_SPECIFIC == request_type) {
- (*message_)[strings::params][strings::binary_data] = binary_data;
- } else if (mobile_apis::RequestType::PROPRIETARY == request_type) {
+ if (mobile_apis::RequestType::PROPRIETARY == request_type) {
/* According to requirements:
"If the requestType = PROPRIETARY, add to mobile API fileType = JSON
- If the requestType = HTTP, add to mobile API fileType = BINARY"
- Also we don't save the PT to file - we put it directly in binary_data */
+ If the requestType = HTTP, add to mobile API fileType = BINARY" */
#if defined(PROPRIETARY_MODE)
AddHeader(binary_data);
#endif // PROPRIETARY_MODE
-#if defined(PROPRIETARY_MODE) || defined(EXTERNAL_PROPRIETARY_MODE)
- (*message_)[strings::params][strings::binary_data] = binary_data;
-#endif // PROPRIETARY_MODE
-
(*message_)[strings::msg_params][strings::file_type] = FileType::JSON;
} else if (mobile_apis::RequestType::HTTP == request_type) {
(*message_)[strings::msg_params][strings::file_type] = FileType::BINARY;
@@ -150,13 +136,21 @@ void OnSystemRequestNotification::Run() {
policy_handler.TimeoutExchangeSec();
}
} else if (mobile_apis::RequestType::LOCK_SCREEN_ICON_URL == request_type) {
- if (!(*message_)[strings::msg_params].keyExists(strings::url) ||
- (*message_)[strings::msg_params][strings::url].empty()) {
- SDL_LOG_ERROR("discarding LOCK_SCREEN_ICON_URL request without URL");
+ if (binary_data.empty() &&
+ (!(*message_)[strings::msg_params].keyExists(strings::url) ||
+ (*message_)[strings::msg_params][strings::url].empty())) {
+ SDL_LOG_ERROR(
+ "discarding LOCK_SCREEN_ICON_URL request with no URL or data");
return;
}
}
+#if defined(PROPRIETARY_MODE) || defined(EXTERNAL_PROPRIETARY_MODE)
+ if (!binary_data.empty()) {
+ (*message_)[strings::params][strings::binary_data] = binary_data;
+ }
+#endif // PROPRIETARY_MODE
+
SendNotification();
}
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_way_point_change_notification.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_way_point_change_notification.cc
index 33413f805d..4aa0d9c630 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_way_point_change_notification.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_way_point_change_notification.cc
@@ -67,7 +67,6 @@ void OnWayPointChangeNotification::Run() {
(*message_)[strings::params][strings::connection_key] = *app_id;
SendNotification();
}
- application_manager_.SaveWayPointsMessage(message_);
}
} // namespace commands
} // namespace sdl_rpc_plugin
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_way_point_change_notification_from_mobile.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_way_point_change_notification_from_mobile.cc
new file mode 100644
index 0000000000..ad1b0c7ef7
--- /dev/null
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_way_point_change_notification_from_mobile.cc
@@ -0,0 +1,90 @@
+/*
+ Copyright (c) 2020, Ford Motor Company
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+ Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided with the
+ distribution.
+
+ Neither the name of the Ford Motor Company nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "sdl_rpc_plugin/commands/mobile/on_way_point_change_notification_from_mobile.h"
+
+#include "application_manager/app_service_manager.h"
+#include "application_manager/message.h"
+#include "application_manager/message_helper.h"
+
+namespace sdl_rpc_plugin {
+using namespace application_manager;
+namespace commands {
+
+SDL_CREATE_LOG_VARIABLE("Commands")
+
+OnWayPointChangeNotificationFromMobile::OnWayPointChangeNotificationFromMobile(
+ const application_manager::commands::MessageSharedPtr& message,
+ ApplicationManager& application_manager,
+ app_mngr::rpc_service::RPCService& rpc_service,
+ app_mngr::HMICapabilities& hmi_capabilities,
+ policy::PolicyHandlerInterface& policy_handler)
+ : CommandNotificationFromMobileImpl(message,
+ application_manager,
+ rpc_service,
+ hmi_capabilities,
+ policy_handler) {}
+
+OnWayPointChangeNotificationFromMobile::
+ ~OnWayPointChangeNotificationFromMobile() {}
+
+void OnWayPointChangeNotificationFromMobile::Run() {
+ SDL_LOG_AUTO_TRACE();
+
+ (*message_)[strings::params][strings::message_type] =
+ static_cast<int32_t>(application_manager::MessageType::kNotification);
+ ApplicationSharedPtr app = application_manager_.application(connection_key());
+
+ if (app.use_count() == 0) {
+ SDL_LOG_ERROR(
+ "OnWayPointChangeNotificationFromMobile application doesn't exist");
+ return;
+ }
+
+ auto service =
+ application_manager_.GetAppServiceManager().FindWayPointsHandler();
+ if (!service || !service->mobile_service ||
+ service->connection_key != connection_key()) {
+ SDL_LOG_ERROR("Application is not active NAVIGATION ASP");
+ return;
+ }
+
+ application_manager_.SaveWayPointsMessage(message_, connection_key());
+
+ (*message_)[strings::params][strings::message_type] =
+ static_cast<int32_t>(application_manager::MessageType::kNotification);
+ rpc_service_.ManageMobileCommand(message_, SOURCE_SDL);
+}
+
+} // namespace commands
+
+} // namespace sdl_rpc_plugin
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_audio_pass_thru_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_audio_pass_thru_request.cc
index 5918c05f2d..0accdd1e76 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_audio_pass_thru_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_audio_pass_thru_request.cc
@@ -224,20 +224,17 @@ PerformAudioPassThruRequest::PrepareResponseParameters() {
HmiInterfaces::HMI_INTERFACE_TTS,
application_manager_);
- // Note(dtrunov): According to requirment "WARNINGS, success:true on getting
- // UNSUPPORTED_RESOURCE for "ttsChunks"
+ response_params_.success =
+ PrepareResultForMobileResponse(ui_perform_info, tts_perform_info);
if (ui_perform_info.is_ok && tts_perform_info.is_unsupported_resource &&
HmiInterfaces::STATE_AVAILABLE == tts_perform_info.interface_state) {
response_params_.result_code = mobile_apis::Result::WARNINGS;
- tts_info_ = "Unsupported phoneme type sent in a prompt";
response_params_.info = app_mngr::commands::MergeInfos(
ui_perform_info, ui_info_, tts_perform_info, tts_info_);
response_params_.success = true;
return response_params_;
}
- response_params_.success =
- PrepareResultForMobileResponse(ui_perform_info, tts_perform_info);
if (IsResultCodeUnsupported(ui_perform_info, tts_perform_info)) {
response_params_.result_code = mobile_apis::Result::UNSUPPORTED_RESOURCE;
} else {
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_interaction_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_interaction_request.cc
index a3269847a1..bb990574bd 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_interaction_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_interaction_request.cc
@@ -195,8 +195,7 @@ void PerformInteractionRequest::Run() {
switch (interaction_mode_) {
case mobile_apis::InteractionMode::BOTH: {
SDL_LOG_DEBUG("Interaction Mode: BOTH");
- if (!CheckChoiceSetVRSynonyms(app) || !CheckChoiceSetMenuNames(app) ||
- !CheckVrHelpItemPositions(app) ||
+ if (!CheckChoiceSetVRSynonyms(app) || !CheckVrHelpItemPositions(app) ||
!CheckChoiceSetListVRCommands(app)) {
return;
}
@@ -204,8 +203,7 @@ void PerformInteractionRequest::Run() {
}
case mobile_apis::InteractionMode::MANUAL_ONLY: {
SDL_LOG_DEBUG("Interaction Mode: MANUAL_ONLY");
- if (!CheckChoiceSetVRSynonyms(app) || !CheckChoiceSetMenuNames(app) ||
- !CheckVrHelpItemPositions(app)) {
+ if (!CheckChoiceSetVRSynonyms(app) || !CheckVrHelpItemPositions(app)) {
return;
}
break;
@@ -253,7 +251,7 @@ void PerformInteractionRequest::on_event(const event_engine::Event& event) {
ui_result_code_ = static_cast<hmi_apis::Common_Result::eType>(
message[strings::params][hmi_response::code].asUInt());
GetInfo(message, ui_info_);
- ProcessUIResponse(event.smart_object(), response_msg_params);
+ ProcessUIResponse(event.smart_object());
break;
}
case hmi_apis::FunctionID::VR_PerformInteraction: {
@@ -265,7 +263,7 @@ void PerformInteractionRequest::on_event(const event_engine::Event& event) {
vr_result_code_ = static_cast<hmi_apis::Common_Result::eType>(
message[strings::params][hmi_response::code].asUInt());
GetInfo(message, vr_info_);
- if (ProcessVRResponse(event.smart_object(), response_msg_params)) {
+ if (ProcessVRResponse(event.smart_object())) {
return;
}
break;
@@ -328,8 +326,7 @@ void PerformInteractionRequest::onTimeOut() {
}
bool PerformInteractionRequest::ProcessVRResponse(
- const smart_objects::SmartObject& message,
- smart_objects::SmartObject& msg_params) {
+ const smart_objects::SmartObject& message) {
SDL_LOG_AUTO_TRACE();
using namespace hmi_apis;
using namespace mobile_apis;
@@ -343,9 +340,6 @@ bool PerformInteractionRequest::ProcessVRResponse(
return false;
}
- msg_params[strings::trigger_source] =
- static_cast<int32_t>(TriggerSource::TS_VR);
-
const bool is_vr_aborted_timeout = Compare<Common_Result::eType, EQ, ONE>(
vr_result_code_, Common_Result::ABORTED, Common_Result::TIMED_OUT);
@@ -403,8 +397,7 @@ bool PerformInteractionRequest::ProcessVRResponse(
}
void PerformInteractionRequest::ProcessUIResponse(
- const smart_objects::SmartObject& message,
- smart_objects::SmartObject& msg_params) {
+ const smart_objects::SmartObject& message) {
SDL_LOG_AUTO_TRACE();
using namespace helpers;
using namespace smart_objects;
@@ -436,38 +429,30 @@ void PerformInteractionRequest::ProcessUIResponse(
ui_result_code_, hmi_apis::Common_Result::UNSUPPORTED_RESOURCE);
if (result) {
+ const smart_objects::SmartObject& hmi_msg_params =
+ message[strings::msg_params];
if (is_pi_unsupported) {
ui_result_code_ = hmi_apis::Common_Result::UNSUPPORTED_RESOURCE;
ui_info_ = message[strings::msg_params][strings::info].asString();
- } else {
- if (message.keyExists(strings::msg_params)) {
- msg_params = message[strings::msg_params];
- }
- if (is_pi_warning) {
- ui_result_code_ = hmi_apis::Common_Result::WARNINGS;
- ui_info_ = message[strings::msg_params][strings::info].asString();
- }
+ } else if (is_pi_warning) {
+ ui_result_code_ = hmi_apis::Common_Result::WARNINGS;
+ ui_info_ = message[strings::msg_params][strings::info].asString();
}
// result code must be GENERIC_ERROR in case wrong choice_id
- if (msg_params.keyExists(strings::choice_id)) {
+ if (hmi_msg_params.keyExists(strings::choice_id)) {
const std::int32_t ui_choice_id =
- static_cast<std::int32_t>(msg_params[strings::choice_id].asInt());
+ static_cast<std::int32_t>(hmi_msg_params[strings::choice_id].asInt());
if (!CheckChoiceIDFromResponse(app, ui_choice_id)) {
ui_result_code_ = hmi_apis::Common_Result::GENERIC_ERROR;
ui_info_ = "Wrong choiceID was received from HMI";
} else {
ui_choice_id_received_ = ui_choice_id;
- msg_params[strings::trigger_source] =
- mobile_apis::TriggerSource::TS_MENU;
- }
- } else if (msg_params.keyExists(strings::manual_text_entry)) {
- msg_params[strings::trigger_source] =
- mobile_apis::TriggerSource::TS_KEYBOARD;
- if (msg_params[strings::manual_text_entry].empty()) {
- msg_params.erase(strings::manual_text_entry);
}
+ } else if (hmi_msg_params.keyExists(strings::manual_text_entry)) {
+ ui_text_entry_received_ =
+ hmi_msg_params[strings::manual_text_entry].asString();
}
}
}
@@ -696,60 +681,6 @@ void PerformInteractionRequest::SendVRPerformInteractionRequest(
hmi_apis::FunctionID::VR_PerformInteraction, &msg_params, true);
}
-bool PerformInteractionRequest::CheckChoiceSetMenuNames(
- application_manager::ApplicationSharedPtr const app) {
- SDL_LOG_AUTO_TRACE();
-
- smart_objects::SmartObject& choice_list =
- (*message_)[strings::msg_params][strings::interaction_choice_set_id_list];
-
- for (size_t i = 0; i < choice_list.length(); ++i) {
- // choice_set contains SmartObject msg_params
- smart_objects::SmartObject i_choice_set =
- app->FindChoiceSet(choice_list[i].asInt());
-
- for (size_t j = 0; j < choice_list.length(); ++j) {
- smart_objects::SmartObject j_choice_set =
- app->FindChoiceSet(choice_list[j].asInt());
-
- if (i == j) {
- // skip check the same element
- continue;
- }
-
- if ((smart_objects::SmartType_Null == i_choice_set.getType()) ||
- (smart_objects::SmartType_Null == j_choice_set.getType())) {
- SDL_LOG_ERROR("Invalid ID");
- SendResponse(false, mobile_apis::Result::INVALID_ID);
- return false;
- }
-
- size_t ii = 0;
- size_t jj = 0;
- for (; ii < i_choice_set[strings::choice_set].length(); ++ii) {
- for (; jj < j_choice_set[strings::choice_set].length(); ++jj) {
- const std::string& ii_menu_name =
- i_choice_set[strings::choice_set][ii][strings::menu_name]
- .asString();
- const std::string& jj_menu_name =
- j_choice_set[strings::choice_set][jj][strings::menu_name]
- .asString();
-
- if (ii_menu_name == jj_menu_name) {
- SDL_LOG_ERROR("Choice set has duplicated menu name");
- SendResponse(false,
- mobile_apis::Result::DUPLICATE_NAME,
- "Choice set has duplicated menu name");
- return false;
- }
- }
- }
- }
- }
-
- return true;
-}
-
bool PerformInteractionRequest::CheckChoiceSetVRSynonyms(
application_manager::ApplicationSharedPtr const app) {
SDL_LOG_AUTO_TRACE();
@@ -1124,7 +1055,8 @@ PerformInteractionRequest::PrepareResultCodeForResponse(
if (INVALID_CHOICE_ID != vr_choice_id_received_) {
return mobile_vr_result_code;
}
- if (INVALID_CHOICE_ID != ui_choice_id_received_) {
+ if (INVALID_CHOICE_ID != ui_choice_id_received_ ||
+ !ui_text_entry_received_.empty()) {
return mobile_ui_result_code;
}
@@ -1135,14 +1067,29 @@ PerformInteractionRequest::PrepareResultCodeForResponse(
bool PerformInteractionRequest::PrepareResultForMobileResponse(
app_mngr::commands::ResponseInfo& ui_response,
app_mngr::commands::ResponseInfo& vr_response) const {
+ bool vr_choice_received = INVALID_CHOICE_ID != vr_choice_id_received_;
+ bool ui_choice_received = INVALID_CHOICE_ID != ui_choice_id_received_ ||
+ !ui_text_entry_received_.empty();
+
+ bool vr_response_success =
+ vr_response.is_ok ||
+ (vr_response.is_unsupported_resource &&
+ vr_response.interface_state != HmiInterfaces::STATE_NOT_AVAILABLE &&
+ vr_choice_received);
+ bool ui_response_success =
+ ui_response.is_ok ||
+ (ui_response.is_unsupported_resource &&
+ ui_response.interface_state != HmiInterfaces::STATE_NOT_AVAILABLE &&
+ ui_choice_received);
+
if (mobile_apis::InteractionMode::VR_ONLY == interaction_mode_) {
- return vr_response.is_ok;
+ return vr_response_success;
}
if (mobile_apis::InteractionMode::MANUAL_ONLY == interaction_mode_) {
- return ui_response.is_ok;
+ return ui_response_success;
}
- return (vr_response.is_ok || ui_response.is_ok);
+ return (vr_response_success || ui_response_success);
}
bool PerformInteractionRequest::SetChoiceIdToResponseMsgParams(
@@ -1151,27 +1098,27 @@ bool PerformInteractionRequest::SetChoiceIdToResponseMsgParams(
const bool ui_choice_id_valid = INVALID_CHOICE_ID != ui_choice_id_received_;
const bool vr_choice_id_valid = INVALID_CHOICE_ID != vr_choice_id_received_;
-
if (ui_choice_id_valid && vr_choice_id_valid &&
ui_choice_id_received_ != vr_choice_id_received_) {
return false;
}
- switch (interaction_mode_) {
- case mobile_apis::InteractionMode::eType::MANUAL_ONLY:
- if (ui_choice_id_valid) {
- msg_param[strings::choice_id] = ui_choice_id_received_;
- }
- case mobile_apis::InteractionMode::eType::VR_ONLY:
- if (vr_choice_id_valid) {
- msg_param[strings::choice_id] = vr_choice_id_received_;
- }
- default:
- if (ui_choice_id_valid) {
- msg_param[strings::choice_id] = ui_choice_id_received_;
- } else if (vr_choice_id_valid) {
- msg_param[strings::choice_id] = vr_choice_id_received_;
- }
+ if (!ui_text_entry_received_.empty()) {
+ msg_param[strings::trigger_source] =
+ mobile_apis::TriggerSource::TS_KEYBOARD;
+ msg_param[strings::manual_text_entry] = ui_text_entry_received_;
+ return true;
+ }
+
+ if (ui_choice_id_valid &&
+ interaction_mode_ != mobile_apis::InteractionMode::eType::VR_ONLY) {
+ msg_param[strings::trigger_source] = mobile_apis::TriggerSource::TS_MENU;
+ msg_param[strings::choice_id] = ui_choice_id_received_;
+ } else if (vr_choice_id_valid &&
+ interaction_mode_ !=
+ mobile_apis::InteractionMode::eType::MANUAL_ONLY) {
+ msg_param[strings::trigger_source] = mobile_apis::TriggerSource::TS_VR;
+ msg_param[strings::choice_id] = vr_choice_id_received_;
}
return true;
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 6ac830c378..920805be7c 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
@@ -159,18 +159,6 @@ uint32_t RegisterAppInterfaceRequest::default_timeout() const {
return 0;
}
-void RegisterAppInterfaceRequest::WaitForHMIIsReady() {
- while (!application_manager_.IsStopping() &&
- !application_manager_.IsHMICooperating()) {
- SDL_LOG_DEBUG("Waiting for the HMI... conn_key="
- << connection_key() << ", correlation_id=" << correlation_id()
- << ", default_timeout=" << default_timeout()
- << ", thread=" << pthread_self());
- sleep(1);
- // TODO(DK): timer_->StartWait(1);
- }
-}
-
void RegisterAppInterfaceRequest::FillApplicationParams(
ApplicationSharedPtr application) {
SDL_LOG_AUTO_TRACE();
@@ -488,10 +476,8 @@ void RegisterAppInterfaceRequest::Run() {
SDL_LOG_AUTO_TRACE();
SDL_LOG_DEBUG("Connection key is " << connection_key());
- WaitForHMIIsReady();
-
- if (application_manager_.IsStopping()) {
- SDL_LOG_WARN("The ApplicationManager is stopping!");
+ if (!application_manager_.WaitForHmiIsReady()) {
+ SDL_LOG_WARN("Failed to wait for HMI readiness");
return;
}
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/reset_global_properties_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/reset_global_properties_request.cc
index 40302e51d5..f4e07d4b78 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/reset_global_properties_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/reset_global_properties_request.cc
@@ -89,6 +89,10 @@ void ResetGlobalPropertiesRequest::Run() {
StartAwaitForInterface(HmiInterfaces::HMI_INTERFACE_TTS);
}
+ if (reset_global_props_result.HasRCPropertiesReset()) {
+ StartAwaitForInterface(HmiInterfaces::HMI_INTERFACE_RC);
+ }
+
app->set_reset_global_properties_active(true);
if (reset_global_props_result.HasUIPropertiesReset()) {
@@ -110,6 +114,15 @@ void ResetGlobalPropertiesRequest::Run() {
SendHMIRequest(
hmi_apis::FunctionID::TTS_SetGlobalProperties, msg_params.get(), true);
}
+
+ if (reset_global_props_result.HasRCPropertiesReset()) {
+ smart_objects::SmartObjectSPtr msg_params =
+ MessageHelper::CreateRCResetGlobalPropertiesRequest(
+ reset_global_props_result, app);
+
+ SendHMIRequest(
+ hmi_apis::FunctionID::RC_SetGlobalProperties, msg_params.get(), true);
+ }
}
void ResetGlobalPropertiesRequest::on_event(const event_engine::Event& event) {
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/scrollable_message_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/scrollable_message_response.cc
index a6f980b9ba..b7cf0e15ac 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/scrollable_message_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/scrollable_message_response.cc
@@ -57,15 +57,7 @@ ScrollableMessageResponse::ScrollableMessageResponse(
void ScrollableMessageResponse::Run() {
SDL_LOG_AUTO_TRACE();
- mobile_apis::Result::eType result_code =
- static_cast<mobile_apis::Result::eType>(
- (*message_)[strings::msg_params][strings::result_code].asInt());
- ApplicationSharedPtr application = application_manager_.application(
- (*message_)[strings::params][strings::connection_key].asInt());
- if ((mobile_apis::Result::REJECTED != result_code) && application) {
- application->UnsubscribeFromSoftButtons(
- (*message_)[strings::params][strings::function_id].asInt());
- }
+ application_manager_.UnsubscribeAppFromSoftButtons(message_);
rpc_service_.SendMessageToMobile(message_);
}
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/send_haptic_data_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/send_haptic_data_request.cc
index aa5e1077ca..2b0a36cb9d 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/send_haptic_data_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/send_haptic_data_request.cc
@@ -70,6 +70,7 @@ void SendHapticDataRequest::Run() {
}
if (app->is_navi() || app->mobile_projection_enabled()) {
+ msg_params[strings::app_id] = connection_key();
SendHMIRequest(hmi_apis::FunctionID::UI_SendHapticData, &msg_params, true);
} else {
SendResponse(false,
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_app_icon_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_app_icon_request.cc
index 9f30478111..9eb4c82721 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_app_icon_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_app_icon_request.cc
@@ -116,8 +116,8 @@ void SetAppIconRequest::Run() {
msg_params[strings::sync_file_name] =
smart_objects::SmartObject(smart_objects::SmartType_Map);
- // For further use in on_event function
- full_file_path_for_hmi_ = file_system::ConvertPathForURL(full_file_path);
+ // for further use in on_event function
+ full_file_path_for_hmi_ = full_file_path;
msg_params[strings::sync_file_name][strings::value] = full_file_path_for_hmi_;
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 396763ff98..bbce4d2bb3 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
@@ -151,6 +151,17 @@ void SetGlobalPropertiesRequest::Run() {
return;
}
+ if (!ValidateCustomKeys()) {
+ SDL_LOG_ERROR(
+ "Number of customizable keys exceeds the maximum number for this "
+ "layout");
+ SendResponse(
+ false,
+ mobile_apis::Result::INVALID_DATA,
+ "customKeys exceeds the number of customizable keys in this Layout");
+ return;
+ }
+
// if application waits for sending ttsGlobalProperties need to remove this
// application from tts_global_properties_app_list_
application_manager_.RemoveAppFromTTSGlobalPropertiesList(connection_key());
@@ -642,7 +653,53 @@ void SetGlobalPropertiesRequest::PrepareUIRequestMenuAndKeyboardData(
if (is_keyboard_props_present) {
out_params[hmi_request::keyboard_properties] =
msg_params[hmi_request::keyboard_properties];
- app->set_keyboard_props(msg_params[hmi_request::keyboard_properties]);
+ smart_objects::SmartObject cached_keyboard_props(
+ msg_params[hmi_request::keyboard_properties]);
+
+ if (cached_keyboard_props.keyExists(hmi_request::auto_complete_list)) {
+ auto auto_complete_list =
+ cached_keyboard_props[hmi_request::auto_complete_list].asArray();
+ if (auto_complete_list && auto_complete_list->empty()) {
+ cached_keyboard_props.erase(hmi_request::auto_complete_list);
+ }
+ }
+
+ auto saved_keyboard_props = app->keyboard_props();
+ if (!saved_keyboard_props) {
+ app->set_keyboard_props(cached_keyboard_props);
+ return;
+ }
+
+ if (!msg_params[hmi_request::keyboard_properties].keyExists(
+ hmi_request::keyboard_layout) &&
+ saved_keyboard_props->keyExists(hmi_request::keyboard_layout)) {
+ cached_keyboard_props[hmi_request::keyboard_layout] =
+ static_cast<hmi_apis::Common_KeyboardLayout::eType>(
+ (*saved_keyboard_props)[hmi_request::keyboard_layout].asInt());
+ }
+
+ if (!msg_params[hmi_request::keyboard_properties].keyExists(
+ hmi_response::language) &&
+ saved_keyboard_props->keyExists(hmi_response::language)) {
+ cached_keyboard_props[hmi_response::language] =
+ static_cast<hmi_apis::Common_Language::eType>(
+ (*saved_keyboard_props)[hmi_response::language].asInt());
+ }
+
+ if (!msg_params[hmi_request::keyboard_properties].keyExists(
+ hmi_request::auto_complete_list) &&
+ saved_keyboard_props->keyExists(hmi_request::auto_complete_list)) {
+ cached_keyboard_props[hmi_request::auto_complete_list] =
+ (*saved_keyboard_props)[hmi_request::auto_complete_list];
+ }
+
+ if (!msg_params[hmi_request::keyboard_properties].keyExists(
+ hmi_request::mask_input_characters) &&
+ saved_keyboard_props->keyExists(hmi_request::mask_input_characters)) {
+ cached_keyboard_props[hmi_request::mask_input_characters] =
+ (*saved_keyboard_props)[hmi_request::mask_input_characters];
+ }
+ app->set_keyboard_props(cached_keyboard_props);
}
}
@@ -820,9 +877,130 @@ bool SetGlobalPropertiesRequest::IsWhiteSpaceExist() {
}
}
}
+
+ if (msg_params[strings::keyboard_properties].keyExists(
+ hmi_request::custom_keys)) {
+ const smart_objects::SmartArray* custom_keys_array =
+ msg_params[strings::keyboard_properties][hmi_request::custom_keys]
+ .asArray();
+
+ for (auto keys : (*custom_keys_array)) {
+ if (!CheckSyntax(keys.asCharArray())) {
+ SDL_LOG_ERROR(
+ "Invalid keyboard_properties "
+ "custom_keys syntax check failed");
+ return true;
+ }
+ }
+ }
}
+
return false;
}
+hmi_apis::Common_KeyboardLayout::eType
+SetGlobalPropertiesRequest::GetKeyboardLayout() const {
+ SDL_LOG_AUTO_TRACE();
+
+ const smart_objects::SmartObject& msg_params =
+ (*message_)[strings::msg_params];
+ if (msg_params[strings::keyboard_properties].keyExists(
+ hmi_request::keyboard_layout)) {
+ return static_cast<hmi_apis::Common_KeyboardLayout::eType>(
+ msg_params[strings::keyboard_properties][hmi_request::keyboard_layout]
+ .asInt());
+ }
+
+ ApplicationSharedPtr app = application_manager_.application(connection_key());
+ auto saved_keyboard_props = app->keyboard_props();
+ if (saved_keyboard_props) {
+ if (saved_keyboard_props->keyExists(hmi_request::keyboard_layout)) {
+ return static_cast<hmi_apis::Common_KeyboardLayout::eType>(
+ (*saved_keyboard_props)[hmi_request::keyboard_layout].asInt());
+ }
+ }
+
+ return hmi_apis::Common_KeyboardLayout::QWERTY;
+}
+
+uint32_t SetGlobalPropertiesRequest::GetAllowedNumberOfConfigurableKeys()
+ const {
+ SDL_LOG_AUTO_TRACE();
+
+ ApplicationSharedPtr app = application_manager_.application(connection_key());
+ auto display_capabilities = app->display_capabilities();
+ if (!display_capabilities) {
+ SDL_LOG_WARN("Display capabilities are not available");
+ return 0;
+ }
+
+ auto* window_capabilities =
+ (*display_capabilities)[0][strings::window_capabilities].asArray();
+
+ if (!window_capabilities) {
+ SDL_LOG_WARN("Window capabilities are not available");
+ return 0;
+ }
+
+ if (!(*window_capabilities)[0].keyExists(
+ hmi_response::keyboard_capabilities)) {
+ SDL_LOG_WARN("Keyboard capabilities are not available");
+ return 0;
+ }
+
+ if (!(*window_capabilities)[0][hmi_response::keyboard_capabilities].keyExists(
+ hmi_response::supported_keyboards)) {
+ SDL_LOG_WARN("Data about supported keyboards is not available");
+ return 0;
+ }
+
+ auto supported_keyboards =
+ (*window_capabilities)[0][hmi_response::keyboard_capabilities]
+ [hmi_response::supported_keyboards]
+ .asArray();
+
+ const auto requested_layout = GetKeyboardLayout();
+ for (auto keyboard : (*supported_keyboards)) {
+ if (requested_layout ==
+ static_cast<hmi_apis::Common_KeyboardLayout::eType>(
+ keyboard[hmi_request::keyboard_layout].asInt())) {
+ return keyboard[hmi_response::num_configurable_keys].asUInt();
+ }
+ }
+
+ return 0;
+}
+
+bool SetGlobalPropertiesRequest::ValidateCustomKeys() const {
+ SDL_LOG_AUTO_TRACE();
+
+ const smart_objects::SmartObject& msg_params =
+ (*message_)[strings::msg_params];
+
+ if (!msg_params.keyExists(strings::keyboard_properties)) {
+ SDL_LOG_WARN("Keyboard properties are not available");
+ return true;
+ }
+
+ if (!msg_params[strings::keyboard_properties].keyExists(
+ hmi_request::custom_keys)) {
+ SDL_LOG_WARN("Customizable keys are not available");
+ return true;
+ }
+
+ auto custom_keys_array =
+ msg_params[strings::keyboard_properties][hmi_request::custom_keys]
+ .asArray();
+ if (custom_keys_array) {
+ uint32_t requested_key_count = custom_keys_array->size();
+ uint32_t allowed_key_count = GetAllowedNumberOfConfigurableKeys();
+
+ if (requested_key_count > allowed_key_count) {
+ return false;
+ }
+ }
+
+ return true;
+}
} // namespace commands
} // namespace sdl_rpc_plugin
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_media_clock_timer_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_media_clock_timer_request.cc
index cf5d80ecc0..285118749a 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_media_clock_timer_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_media_clock_timer_request.cc
@@ -37,6 +37,7 @@
#include "application_manager/message_helper.h"
#include "interfaces/HMI_API.h"
#include "interfaces/MOBILE_API.h"
+#include "smart_objects/enum_schema_item.h"
namespace sdl_rpc_plugin {
using namespace application_manager;
@@ -76,7 +77,8 @@ void SetMediaClockRequest::Run() {
return;
}
- if (isDataValid()) {
+ std::string info;
+ if (isDataValid(info)) {
// copy entirely msg
smart_objects::SmartObject msg_params = (*message_)[strings::msg_params];
msg_params[strings::app_id] = app->app_id();
@@ -85,7 +87,9 @@ void SetMediaClockRequest::Run() {
SendHMIRequest(
hmi_apis::FunctionID::UI_SetMediaClockTimer, &msg_params, true);
} else {
- SendResponse(false, mobile_apis::Result::INVALID_DATA);
+ SendResponse(false,
+ mobile_apis::Result::INVALID_DATA,
+ info.empty() ? NULL : info.c_str());
}
}
@@ -117,7 +121,7 @@ void SetMediaClockRequest::on_event(const event_engine::Event& event) {
}
}
-bool SetMediaClockRequest::isDataValid() {
+bool SetMediaClockRequest::isDataValid(std::string& info) {
smart_objects::SmartObject msg_params = (*message_)[strings::msg_params];
mobile_apis::UpdateMode::eType update_mode =
static_cast<mobile_apis::UpdateMode::eType>(
@@ -126,7 +130,10 @@ bool SetMediaClockRequest::isDataValid() {
if (update_mode == mobile_apis::UpdateMode::COUNTUP ||
update_mode == mobile_apis::UpdateMode::COUNTDOWN) {
if (!msg_params.keyExists(strings::start_time)) {
- SDL_LOG_INFO("Invalid data");
+ info =
+ "Start time must be provided for \"COUNTUP\" and \"COUNTDOWN\" "
+ "update modes";
+ SDL_LOG_INFO("Invalid data: " << info);
return false;
}
@@ -151,7 +158,33 @@ bool SetMediaClockRequest::isDataValid() {
(update_mode == mobile_apis::UpdateMode::COUNTDOWN)) ||
((end_time_in_seconds < start_time_in_seconds) &&
(update_mode == mobile_apis::UpdateMode::COUNTUP))) {
- SDL_LOG_INFO("Invalid data");
+ std::string update_mode_name;
+ smart_objects::EnumConversionHelper<
+ mobile_apis::UpdateMode::eType>::EnumToString(update_mode,
+ &update_mode_name);
+ info = "Start time must be " +
+ std::string((update_mode == mobile_apis::UpdateMode::COUNTUP)
+ ? "before"
+ : "after") +
+ " the end time for update mode " + update_mode_name;
+ SDL_LOG_INFO("Invalid data: " << info);
+ return false;
+ }
+ }
+ }
+
+ std::vector<std::string> indicator_keys{strings::forward_seek_indicator,
+ strings::back_seek_indicator};
+ for (auto& key : indicator_keys) {
+ if (msg_params.keyExists(key)) {
+ mobile_apis::SeekIndicatorType::eType seek_indicator_type =
+ static_cast<mobile_apis::SeekIndicatorType::eType>(
+ msg_params[key][strings::type].asUInt());
+ if (seek_indicator_type == mobile_apis::SeekIndicatorType::TRACK &&
+ msg_params[key].keyExists(strings::seek_time)) {
+ info =
+ "The seekTime parameter is not applicable for indicator type TRACK";
+ SDL_LOG_INFO("Invalid data: " << info);
return false;
}
}
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/show_constant_tbt_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/show_constant_tbt_response.cc
index 7d546079e8..a2362a74bc 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/show_constant_tbt_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/show_constant_tbt_response.cc
@@ -60,6 +60,8 @@ ShowConstantTBTResponse::~ShowConstantTBTResponse() {}
void ShowConstantTBTResponse::Run() {
SDL_LOG_AUTO_TRACE();
+ application_manager_.UnsubscribeAppFromSoftButtons(message_);
+
rpc_service_.SendMessageToMobile(message_);
}
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/subscribe_way_points_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/subscribe_way_points_request.cc
index 6e8ad05a74..11cbdac14a 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/subscribe_way_points_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/subscribe_way_points_request.cc
@@ -31,6 +31,8 @@
*/
#include "sdl_rpc_plugin/commands/mobile/subscribe_way_points_request.h"
+
+#include "application_manager/app_service_manager.h"
#include "application_manager/application_manager.h"
#include "application_manager/message_helper.h"
@@ -72,8 +74,8 @@ void SubscribeWayPointsRequest::Run() {
return;
}
- if (application_manager_.IsAnyAppSubscribedForWayPoints()) {
- application_manager_.SubscribeAppForWayPoints(app);
+ if (application_manager_.IsSubscribedToHMIWayPoints()) {
+ application_manager_.SubscribeAppForWayPoints(app, false);
SendResponse(true, mobile_apis::Result::SUCCESS);
return;
}
@@ -91,15 +93,20 @@ void SubscribeWayPointsRequest::on_event(const event_engine::Event& event) {
case hmi_apis::FunctionID::Navigation_SubscribeWayPoints: {
SDL_LOG_INFO("Received Navigation_SubscribeWayPoints event");
EndAwaitForInterface(HmiInterfaces::HMI_INTERFACE_Navigation);
- const hmi_apis::Common_Result::eType result_code =
+ hmi_apis::Common_Result::eType result_code =
static_cast<hmi_apis::Common_Result::eType>(
message[strings::params][hmi_response::code].asInt());
std::string response_info;
GetInfo(message, response_info);
- const bool result = PrepareResultForMobileResponse(
+ bool result = PrepareResultForMobileResponse(
result_code, HmiInterfaces::HMI_INTERFACE_Navigation);
if (result) {
- application_manager_.SubscribeAppForWayPoints(app);
+ application_manager_.SubscribeAppForWayPoints(app, true);
+ } else if (application_manager_.GetAppServiceManager()
+ .FindWayPointsHandler() != nullptr) {
+ application_manager_.SubscribeAppForWayPoints(app, false);
+ result = true;
+ result_code = hmi_apis::Common_Result::WARNINGS;
}
SendResponse(result,
MessageHelper::HMIToMobileResult(result_code),
@@ -114,6 +121,23 @@ void SubscribeWayPointsRequest::on_event(const event_engine::Event& event) {
}
}
+void SubscribeWayPointsRequest::onTimeOut() {
+ SDL_LOG_AUTO_TRACE();
+ if (application_manager_.GetAppServiceManager().FindWayPointsHandler() !=
+ nullptr) {
+ ApplicationSharedPtr app =
+ application_manager_.application(connection_key());
+ application_manager_.SubscribeAppForWayPoints(app, false);
+ SendResponse(true,
+ mobile_apis::Result::WARNINGS,
+ "HMI request timeout expired, waypoints are available through "
+ "NAVIGATION service");
+ } else {
+ SendResponse(
+ false, mobile_apis::Result::GENERIC_ERROR, "Request timeout expired");
+ }
+}
+
bool SubscribeWayPointsRequest::Init() {
hash_update_mode_ = HashUpdateMode::kDoHashUpdate;
return true;
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/subtle_alert_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/subtle_alert_request.cc
index 327315b372..1a54f7f106 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/subtle_alert_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/subtle_alert_request.cc
@@ -206,20 +206,10 @@ bool SubtleAlertRequest::PrepareResponseParameters(
bool result =
PrepareResultForMobileResponse(ui_subtle_alert_info, tts_alert_info);
- /* result=false if UI interface is ok and TTS interface = UNSUPPORTED_RESOURCE
- * and sdl receive TTS.IsReady=true or SDL doesn't receive response for
- * TTS.IsReady.
- */
- if (result && ui_subtle_alert_info.is_ok &&
- tts_alert_info.is_unsupported_resource &&
- HmiInterfaces::STATE_NOT_AVAILABLE != tts_alert_info.interface_state) {
- result = false;
- }
result_code = mobile_apis::Result::WARNINGS;
if ((ui_subtle_alert_info.is_ok || ui_subtle_alert_info.is_not_used) &&
tts_alert_info.is_unsupported_resource &&
HmiInterfaces::STATE_AVAILABLE == tts_alert_info.interface_state) {
- tts_response_info_ = "Unsupported phoneme type sent in a prompt";
info = app_mngr::commands::MergeInfos(ui_subtle_alert_info,
ui_response_info_,
tts_alert_info,
@@ -244,7 +234,11 @@ bool SubtleAlertRequest::PrepareResponseParameters(
tts_alert_info,
tts_response_info_);
// Mobile Alert request is successful when UI_SubtleAlert is successful
- if (is_ui_subtle_alert_sent_ && !ui_subtle_alert_info.is_ok) {
+ bool has_unsupported_data = ui_subtle_alert_info.is_unsupported_resource &&
+ HmiInterfaces::STATE_NOT_AVAILABLE !=
+ ui_subtle_alert_info.interface_state;
+ if (is_ui_subtle_alert_sent_ && !ui_subtle_alert_info.is_ok &&
+ !has_unsupported_data) {
return false;
}
return result;
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/unsubscribe_way_points_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/unsubscribe_way_points_request.cc
index 545a36def8..7aa6e2b40a 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/unsubscribe_way_points_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/unsubscribe_way_points_request.cc
@@ -31,6 +31,8 @@
*/
#include "sdl_rpc_plugin/commands/mobile/unsubscribe_way_points_request.h"
+
+#include "application_manager/app_service_manager.h"
#include "application_manager/application_manager.h"
#include "application_manager/message_helper.h"
@@ -75,9 +77,10 @@ void UnsubscribeWayPointsRequest::Run() {
std::set<uint32_t> subscribed_apps =
application_manager_.GetAppsSubscribedForWayPoints();
- if (subscribed_apps.size() > 1) {
+ if (subscribed_apps.size() > 1 ||
+ !application_manager_.IsSubscribedToHMIWayPoints()) {
// More than 1 subscribed app, don't send HMI unsubscribe request
- application_manager_.UnsubscribeAppFromWayPoints(app);
+ application_manager_.UnsubscribeAppFromWayPoints(app, false);
SendResponse(true, mobile_apis::Result::SUCCESS, NULL);
return;
} else {
@@ -96,15 +99,20 @@ void UnsubscribeWayPointsRequest::on_event(const event_engine::Event& event) {
case hmi_apis::FunctionID::Navigation_UnsubscribeWayPoints: {
SDL_LOG_INFO("Received Navigation_UnsubscribeWayPoints event");
EndAwaitForInterface(HmiInterfaces::HMI_INTERFACE_Navigation);
- const hmi_apis::Common_Result::eType result_code =
+ hmi_apis::Common_Result::eType result_code =
static_cast<hmi_apis::Common_Result::eType>(
message[strings::params][hmi_response::code].asInt());
std::string response_info;
GetInfo(message, response_info);
- const bool result = PrepareResultForMobileResponse(
+ bool result = PrepareResultForMobileResponse(
result_code, HmiInterfaces::HMI_INTERFACE_Navigation);
if (result) {
- application_manager_.UnsubscribeAppFromWayPoints(app);
+ application_manager_.UnsubscribeAppFromWayPoints(app, true);
+ } else if (application_manager_.GetAppServiceManager()
+ .FindWayPointsHandler() != nullptr) {
+ application_manager_.UnsubscribeAppFromWayPoints(app, false);
+ result = true;
+ result_code = hmi_apis::Common_Result::WARNINGS;
}
SendResponse(result,
MessageHelper::HMIToMobileResult(result_code),
@@ -119,6 +127,23 @@ void UnsubscribeWayPointsRequest::on_event(const event_engine::Event& event) {
}
}
+void UnsubscribeWayPointsRequest::onTimeOut() {
+ SDL_LOG_AUTO_TRACE();
+ if (application_manager_.GetAppServiceManager().FindWayPointsHandler() !=
+ nullptr) {
+ ApplicationSharedPtr app =
+ application_manager_.application(connection_key());
+ application_manager_.UnsubscribeAppFromWayPoints(app, false);
+ SendResponse(true,
+ mobile_apis::Result::WARNINGS,
+ "HMI request timeout expired, waypoints are available through "
+ "NAVIGATION service");
+ } else {
+ SendResponse(
+ false, mobile_apis::Result::GENERIC_ERROR, "Request timeout expired");
+ }
+}
+
bool UnsubscribeWayPointsRequest::Init() {
hash_update_mode_ = HashUpdateMode::kDoHashUpdate;
return true;
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/update_turn_list_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/update_turn_list_response.cc
index bedf91b45c..bf2658128d 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/update_turn_list_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/update_turn_list_response.cc
@@ -59,6 +59,8 @@ UpdateTurnListResponse::~UpdateTurnListResponse() {}
void UpdateTurnListResponse::Run() {
SDL_LOG_AUTO_TRACE();
+ application_manager_.UnsubscribeAppFromSoftButtons(message_);
+
rpc_service_.SendMessageToMobile(message_);
}
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/hmi_command_factory.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/hmi_command_factory.cc
index 570a4ce12e..2727c89673 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/hmi_command_factory.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/hmi_command_factory.cc
@@ -173,6 +173,7 @@
#include "sdl_rpc_plugin/commands/hmi/basic_communication_on_awake_sdl.h"
#include "sdl_rpc_plugin/commands/hmi/basic_communication_system_request.h"
#include "sdl_rpc_plugin/commands/hmi/basic_communication_system_response.h"
+#include "sdl_rpc_plugin/commands/hmi/bc_on_app_capability_updated_notification.h"
#include "sdl_rpc_plugin/commands/hmi/dial_number_request.h"
#include "sdl_rpc_plugin/commands/hmi/dial_number_response.h"
#include "sdl_rpc_plugin/commands/hmi/navi_alert_maneuver_request.h"
@@ -942,6 +943,10 @@ CommandCreator& HMICommandFactory::get_creator_factory(
case hmi_apis::FunctionID::UI_OnSubtleAlertPressed: {
return factory.GetCreator<commands::OnUISubtleAlertPressedNotification>();
}
+ case hmi_apis::FunctionID::BasicCommunication_OnAppCapabilityUpdated: {
+ return factory
+ .GetCreator<commands::BCOnAppCapabilityUpdatedNotification>();
+ }
default: { return factory.GetCreator<InvalidCommand>(); }
}
}
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/mobile_command_factory.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/mobile_command_factory.cc
index d2f1325c82..0a8c342448 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/mobile_command_factory.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/mobile_command_factory.cc
@@ -76,6 +76,7 @@
#include "sdl_rpc_plugin/commands/mobile/get_way_points_response.h"
#include "sdl_rpc_plugin/commands/mobile/list_files_request.h"
#include "sdl_rpc_plugin/commands/mobile/list_files_response.h"
+#include "sdl_rpc_plugin/commands/mobile/on_app_capability_updated_notification.h"
#include "sdl_rpc_plugin/commands/mobile/on_app_interface_unregistered_notification.h"
#include "sdl_rpc_plugin/commands/mobile/on_audio_pass_thru_notification.h"
#include "sdl_rpc_plugin/commands/mobile/on_button_event_notification.h"
@@ -96,6 +97,7 @@
#include "sdl_rpc_plugin/commands/mobile/on_update_file_notification.h"
#include "sdl_rpc_plugin/commands/mobile/on_update_sub_menu_notification.h"
#include "sdl_rpc_plugin/commands/mobile/on_way_point_change_notification.h"
+#include "sdl_rpc_plugin/commands/mobile/on_way_point_change_notification_from_mobile.h"
#include "sdl_rpc_plugin/commands/mobile/perform_audio_pass_thru_request.h"
#include "sdl_rpc_plugin/commands/mobile/perform_audio_pass_thru_response.h"
#include "sdl_rpc_plugin/commands/mobile/perform_interaction_request.h"
@@ -491,6 +493,14 @@ CommandCreator& MobileCommandFactory::get_notification_from_mobile_creator(
case mobile_apis::FunctionID::OnHMIStatusID: {
return factory.GetCreator<commands::OnHMIStatusNotificationFromMobile>();
}
+ case mobile_apis::FunctionID::OnWayPointChangeID: {
+ return factory
+ .GetCreator<commands::OnWayPointChangeNotificationFromMobile>();
+ }
+ case mobile_apis::FunctionID::OnAppCapabilityUpdatedID: {
+ return factory
+ .GetCreator<commands::mobile::OnAppCapabilityUpdatedNotification>();
+ }
default: {}
}
return factory.GetCreator<InvalidCommand>();
@@ -543,10 +553,12 @@ bool MobileCommandFactory::IsAbleToProcess(
const int32_t function_id,
const application_manager::commands::Command::CommandSource message_source)
const {
+ SDL_LOG_AUTO_TRACE();
auto id = static_cast<mobile_apis::FunctionID::eType>(function_id);
return get_command_creator(id, mobile_apis::messageType::INVALID_ENUM)
.CanBeCreated() ||
- get_notification_creator(id).CanBeCreated();
+ get_notification_creator(id).CanBeCreated() ||
+ get_notification_from_mobile_creator(id).CanBeCreated();
}
CommandSharedPtr MobileCommandFactory::CreateCommand(
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/sdl_rpc_plugin.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/sdl_rpc_plugin.cc
index 4756c8b9a2..c5bc79f09d 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/sdl_rpc_plugin.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/sdl_rpc_plugin.cc
@@ -131,14 +131,20 @@ void SDLRPCPlugin::RevertResumption(application_manager::Application& app) {
pending_resumption_handler_->OnResumptionRevert();
if (application_manager_->IsAppSubscribedForWayPoints(app)) {
- application_manager_->UnsubscribeAppFromWayPoints(app.app_id());
- if (!application_manager_->IsAnyAppSubscribedForWayPoints()) {
+ const auto subscribed_apps =
+ application_manager_->GetAppsSubscribedForWayPoints();
+ const bool send_unsubscribe =
+ subscribed_apps.size() <= 1 &&
+ application_manager_->IsSubscribedToHMIWayPoints();
+ if (send_unsubscribe) {
SDL_LOG_DEBUG("Send UnsubscribeWayPoints");
auto request =
application_manager::MessageHelper::CreateUnsubscribeWayPointsRequest(
application_manager_->GetNextHMICorrelationID());
application_manager_->GetRPCService().ManageHMICommand(request);
}
+ application_manager_->UnsubscribeAppFromWayPoints(app.app_id(),
+ send_unsubscribe);
}
}
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/waypoints_pending_resumption_handler.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/waypoints_pending_resumption_handler.cc
index 7aa6dd5273..af6c7f3c1d 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/waypoints_pending_resumption_handler.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/waypoints_pending_resumption_handler.cc
@@ -86,7 +86,7 @@ void WayPointsPendingResumptionHandler::HandleResumptionSubscriptionRequest(
SDL_LOG_DEBUG(
"Subscription to waypoint already exist, no need to send "
"request to HMI");
- application_manager_.SubscribeAppForWayPoints(app.app_id());
+ application_manager_.SubscribeAppForWayPoints(app.app_id(), false);
return;
}
@@ -154,10 +154,10 @@ void WayPointsPendingResumptionHandler::on_event(
}
const smart_objects::SmartObject& response = event.smart_object();
- const uint32_t corr_id = event.smart_object_correlation_id();
SDL_LOG_TRACE("Received event with function id: "
- << event.id() << " and correlation id: " << corr_id);
+ << event.id() << " and correlation id: "
+ << event.smart_object_correlation_id());
auto current_pending = pending_requests_.front();
pending_requests_.pop_front();
@@ -170,7 +170,7 @@ void WayPointsPendingResumptionHandler::on_event(
if (resumption::IsResponseSuccessful(response)) {
SDL_LOG_DEBUG("Resumption of waypoints is successful");
- application_manager_.SubscribeAppForWayPoints(app);
+ application_manager_.SubscribeAppForWayPoints(app, true);
}
ProcessNextPendingResumption();
}
@@ -195,7 +195,7 @@ void WayPointsPendingResumptionHandler::ProcessNextPendingResumption() {
auto pending_copy = pending;
pending_requests_.pop_front();
auto app = application_manager_.application(pending_copy.app_id_);
- application_manager_.SubscribeAppForWayPoints(app);
+ application_manager_.SubscribeAppForWayPoints(app, false);
RaiseFakeSuccessfulResponse(pending_copy.corr_id_);
ProcessNextPendingResumption();
}
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/CMakeLists.txt b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/CMakeLists.txt
index b21ab9dca8..b5bb139377 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/CMakeLists.txt
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/CMakeLists.txt
@@ -24,6 +24,7 @@ file(GLOB SOURCES
set(LIBRARIES
sdl_rpc_plugin_static
+ Resumption
gmock
)
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/bc_on_app_capability_updated_notification_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/bc_on_app_capability_updated_notification_test.cc
new file mode 100644
index 0000000000..2d875a2680
--- /dev/null
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/bc_on_app_capability_updated_notification_test.cc
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2020, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "hmi/bc_on_app_capability_updated_notification.h"
+
+#include "application_manager/commands/commands_test.h"
+#include "gtest/gtest.h"
+#include "sdl_rpc_plugin/extensions/system_capability_app_extension.h"
+#include "sdl_rpc_plugin/sdl_rpc_plugin.h"
+
+namespace test {
+namespace components {
+namespace commands_test {
+namespace hmi_commands_test {
+namespace bc_on_app_capability_updated_notification_test {
+
+using sdl_rpc_plugin::commands::BCOnAppCapabilityUpdatedNotification;
+using ::testing::_;
+
+typedef std::shared_ptr<BCOnAppCapabilityUpdatedNotification>
+ BCOnAppCapabilityUpdatedNotificationPtr;
+
+namespace strings = application_manager::strings;
+namespace {
+const uint32_t kConnectionKey = 1u;
+} // namespace
+
+MATCHER_P(CheckAppCapability, app_capability, "") {
+ return app_capability == (*arg)[strings::msg_params][strings::app_capability];
+}
+
+class BCOnAppCapabilityUpdatedNotificationTest
+ : public CommandsTest<CommandsTestMocks::kIsNice> {
+ protected:
+ void SetUp() OVERRIDE {
+ message_ = CreateMessage();
+ (*message_)[strings::params][strings::connection_key] = kConnectionKey;
+ command_ = CreateCommand<BCOnAppCapabilityUpdatedNotification>(message_);
+ mock_app_ = CreateMockApp();
+ }
+
+ BCOnAppCapabilityUpdatedNotificationPtr command_;
+ MockAppPtr mock_app_;
+ MessageSharedPtr message_;
+};
+
+TEST_F(BCOnAppCapabilityUpdatedNotificationTest, Run_SendMessageToHMI_SUCCESS) {
+ smart_objects::SmartObject app_capability =
+ smart_objects::SmartObject(smart_objects::SmartType_Map);
+
+ app_capability[strings::app_capability_type] =
+ mobile_apis::AppCapabilityType::VIDEO_STREAMING;
+ app_capability[strings::video_streaming_capability] =
+ smart_objects::SmartObject(smart_objects::SmartType_Map);
+
+ FillVideoStreamingCapability(
+ app_capability[strings::video_streaming_capability]);
+
+ (*message_)[strings::msg_params][strings::app_capability] = app_capability;
+
+ ASSERT_TRUE(command_->Init());
+
+ EXPECT_CALL(mock_rpc_service_,
+ SendMessageToHMI(CheckAppCapability(app_capability)));
+ command_->Run();
+}
+
+} // namespace bc_on_app_capability_updated_notification_test
+} // namespace hmi_commands_test
+} // namespace commands_test
+} // namespace components
+} // namespace test
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/get_system_info_response_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/get_system_info_response_test.cc
index 8cdce4fa74..3e01849807 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/get_system_info_response_test.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/get_system_info_response_test.cc
@@ -68,6 +68,7 @@ typedef NiceMock<
namespace {
const uint32_t kConnectionKey = 2u;
const std::string ccpu_version("4.1.3.B_EB355B");
+const std::string kHardwareVersion("1.1.1.1");
const std::string wers_country_code("WAEGB");
const std::string lang_code("EN-US");
} // namespace
@@ -82,14 +83,36 @@ class GetSystemInfoResponseTest
(*command_msg)[strings::msg_params]["ccpu_version"] = ccpu_version;
(*command_msg)[strings::msg_params]["wersCountryCode"] = wers_country_code;
(*command_msg)[strings::msg_params]["language"] = lang_code;
-
return command_msg;
}
+ void SetHardwareVersionFromPT() {
+ const std::string hardware_version_from_pt = "1.1.1.0";
+ ON_CALL(mock_policy_handler_, GetHardwareVersionFromPT())
+ .WillByDefault(Return(hardware_version_from_pt));
+ EXPECT_CALL(mock_hmi_capabilities_,
+ set_hardware_version(hardware_version_from_pt));
+ }
+
SmartObject capabilities_;
};
-TEST_F(GetSystemInfoResponseTest, GetSystemInfo_SUCCESS) {
+TEST_F(GetSystemInfoResponseTest, GetSystemInfo_UNSUCCESS) {
+ MessageSharedPtr command_msg = CreateCommandMsg();
+ (*command_msg)[strings::params][hmi_response::code] =
+ hmi_apis::Common_Result::WRONG_LANGUAGE;
+ (*command_msg)[strings::msg_params][hmi_response::capabilities] =
+ (capabilities_);
+
+ ResponseFromHMIPtr command(CreateCommand<GetSystemInfoResponse>(command_msg));
+
+ EXPECT_CALL(mock_hmi_capabilities_, UpdateCachedCapabilities());
+ EXPECT_CALL(mock_policy_handler_, SetPreloadedPtFlag(false));
+
+ command->Run();
+}
+
+TEST_F(GetSystemInfoResponseTest, GetSystemInfo_UpdateCapabilities_Called) {
MessageSharedPtr command_msg = CreateCommandMsg();
(*command_msg)[strings::params][hmi_response::code] =
hmi_apis::Common_Result::SUCCESS;
@@ -98,28 +121,35 @@ TEST_F(GetSystemInfoResponseTest, GetSystemInfo_SUCCESS) {
ResponseFromHMIPtr command(CreateCommand<GetSystemInfoResponse>(command_msg));
- EXPECT_CALL(mock_policy_handler_,
- OnGetSystemInfo(ccpu_version, wers_country_code, lang_code));
+ EXPECT_CALL(mock_hmi_capabilities_, OnSoftwareVersionReceived(ccpu_version));
+ ASSERT_TRUE(command->Init());
command->Run();
}
-TEST_F(GetSystemInfoResponseTest, GetSystemInfo_UNSUCCESS) {
+TEST_F(GetSystemInfoResponseTest,
+ GetSystemInfo_SaveHardwareVersionToHMICapabilitiesIfPresentInResponse) {
MessageSharedPtr command_msg = CreateCommandMsg();
(*command_msg)[strings::params][hmi_response::code] =
- hmi_apis::Common_Result::WRONG_LANGUAGE;
+ hmi_apis::Common_Result::SUCCESS;
(*command_msg)[strings::msg_params][hmi_response::capabilities] =
(capabilities_);
+ (*command_msg)[strings::msg_params][strings::system_hardware_version] =
+ kHardwareVersion;
ResponseFromHMIPtr command(CreateCommand<GetSystemInfoResponse>(command_msg));
- EXPECT_CALL(mock_hmi_capabilities_, UpdateCachedCapabilities());
- EXPECT_CALL(mock_policy_handler_, SetPreloadedPtFlag(false));
+ SetHardwareVersionFromPT();
+ EXPECT_CALL(mock_policy_handler_, OnHardwareVersionReceived(_));
+ EXPECT_CALL(mock_hmi_capabilities_, set_hardware_version(kHardwareVersion));
+ ASSERT_TRUE(command->Init());
command->Run();
}
-TEST_F(GetSystemInfoResponseTest, GetSystemInfo_UpdateCapabilities_Called) {
+TEST_F(
+ GetSystemInfoResponseTest,
+ GetSystemInfo_DontSaveHardwareVersionToHMICapabilitiesIfAbsentInResponse) {
MessageSharedPtr command_msg = CreateCommandMsg();
(*command_msg)[strings::params][hmi_response::code] =
hmi_apis::Common_Result::SUCCESS;
@@ -128,7 +158,10 @@ TEST_F(GetSystemInfoResponseTest, GetSystemInfo_UpdateCapabilities_Called) {
ResponseFromHMIPtr command(CreateCommand<GetSystemInfoResponse>(command_msg));
- EXPECT_CALL(mock_hmi_capabilities_, OnSoftwareVersionReceived(ccpu_version));
+ SetHardwareVersionFromPT();
+ EXPECT_CALL(mock_policy_handler_, OnHardwareVersionReceived(_)).Times(0);
+ EXPECT_CALL(mock_hmi_capabilities_, set_hardware_version(kHardwareVersion))
+ .Times(0);
ASSERT_TRUE(command->Init());
command->Run();
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/hmi_notifications_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/hmi_notifications_test.cc
index 400481f506..5487da51a3 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/hmi_notifications_test.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/hmi_notifications_test.cc
@@ -92,6 +92,7 @@
#include "utils/signals.h"
#include "application_manager/hmi_capabilities_impl.h"
+#include "application_manager/mock_app_service_manager.h"
#include "application_manager/mock_application.h"
#include "application_manager/mock_application_manager.h"
#include "application_manager/mock_event_dispatcher.h"
@@ -106,6 +107,8 @@
#include "connection_handler/mock_connection_handler.h"
#include "connection_handler/mock_connection_handler_settings.h"
#include "protocol_handler/mock_session_observer.h"
+#include "resumption/last_state_wrapper_impl.h"
+#include "resumption/mock_last_state.h"
#include "smart_objects/smart_object.h"
#include "test/application_manager/mock_application_manager_settings.h"
#include "transport_manager/mock_transport_manager.h"
@@ -127,6 +130,7 @@ using ::test::components::application_manager_test::MockApplication;
using ::test::components::application_manager_test::MockApplicationManager;
using ::test::components::application_manager_test::
MockApplicationManagerSettings;
+using ::test::components::application_manager_test::MockAppServiceManager;
using ::test::components::event_engine_test::MockEventDispatcher;
using ::testing::_;
using ::testing::InSequence;
@@ -216,7 +220,11 @@ class HMICommandsNotificationsTest
HMICommandsNotificationsTest()
: applications_lock_(std::make_shared<sync_primitives::Lock>())
, applications_(application_set_, applications_lock_)
- , app_ptr_(NULL) {}
+ , app_ptr_(NULL)
+ , mock_last_state_(std::make_shared<resumption_test::MockLastState>())
+ , last_state_wrapper_(std::make_shared<resumption::LastStateWrapperImpl>(
+ mock_last_state_))
+ , mock_app_service_manager_(app_mngr_, last_state_wrapper_) {}
~HMICommandsNotificationsTest() {
// Fix DataAccessor release and WinQt crash
@@ -244,6 +252,9 @@ class HMICommandsNotificationsTest
MockConnectionHandler mock_connection_handler_;
MockSessionObserver mock_session_observer_;
+ std::shared_ptr<resumption_test::MockLastState> mock_last_state_;
+ resumption::LastStateWrapperPtr last_state_wrapper_;
+ MockAppServiceManager mock_app_service_manager_;
void InitCommand(const uint32_t& default_timeout) OVERRIDE {
app_ = ConfigureApp(&app_ptr_, kAppId_, NOT_MEDIA, NOT_NAVI, NOT_VC);
@@ -256,6 +267,8 @@ class HMICommandsNotificationsTest
ON_CALL(app_mngr_, application_by_hmi_app(_)).WillByDefault(Return(app_));
ON_CALL(*app_ptr_, app_id()).WillByDefault(Return(kAppId_));
ON_CALL(app_mngr_, application(kConnectionKey)).WillByDefault(Return(app_));
+ ON_CALL(app_mngr_, GetAppServiceManager())
+ .WillByDefault(ReturnRef(mock_app_service_manager_));
ON_CALL(app_mngr_, connection_handler())
.WillByDefault(ReturnRef(mock_connection_handler_));
}
@@ -428,6 +441,8 @@ TEST_F(HMICommandsNotificationsTest,
MessageSharedPtr message = CreateMessage();
std::shared_ptr<Command> command =
CreateCommand<OnNaviWayPointChangeNotification>(message);
+ EXPECT_CALL(mock_app_service_manager_, FindWayPointsHandler())
+ .WillOnce(Return(nullptr));
EXPECT_CALL(mock_rpc_service_,
ManageMobileCommand(_, Command::CommandSource::SOURCE_SDL));
command->Run();
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/on_bc_system_capability_updated_notification_from_hmi_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/on_bc_system_capability_updated_notification_from_hmi_test.cc
index ae2a544cc9..1316952a92 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/on_bc_system_capability_updated_notification_from_hmi_test.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/on_bc_system_capability_updated_notification_from_hmi_test.cc
@@ -33,6 +33,8 @@
#include "hmi/on_bc_system_capability_updated_notification_from_hmi.h"
#include "application_manager/commands/commands_test.h"
+#include "sdl_rpc_plugin/extensions/system_capability_app_extension.h"
+
#include "gtest/gtest.h"
namespace test {
@@ -47,8 +49,10 @@ using ::testing::Return;
typedef std::shared_ptr<OnBCSystemCapabilityUpdatedNotificationFromHMI>
OnBCSystemCapabilityUpdatedNotificationFromHMIPtr;
+typedef mobile_apis::SystemCapabilityType::eType SystemCapabilityType;
namespace strings = application_manager::strings;
+
namespace {
const uint32_t kAppId = 1u;
} // namespace
@@ -61,11 +65,30 @@ MATCHER(CheckMessageToMobile, "") {
(*arg)[strings::params][strings::function_id].asInt());
const bool app_id_exist =
(*arg)[strings::msg_params].keyExists(strings::app_id);
- bool is_connection_key_correct = true;
- if ((*arg)[strings::msg_params].keyExists(strings::connection_key)) {
- is_connection_key_correct =
- (*arg)[strings::params][strings::connection_key] == kAppId;
- }
+ const bool is_connection_key_correct = [](arg_type arg) {
+ if ((*arg)[strings::msg_params].keyExists(strings::connection_key)) {
+ return (*arg)[strings::params][strings::connection_key] == kAppId;
+ }
+ return false;
+ };
+
+ return is_function_id_matched && app_id_exist && is_connection_key_correct;
+}
+
+MATCHER(CheckMessageToMobileWithoutAppId, "") {
+ const auto function_id = mobile_apis::FunctionID::OnSystemCapabilityUpdatedID;
+
+ const bool is_function_id_matched =
+ function_id == static_cast<am::mobile_api::FunctionID::eType>(
+ (*arg)[strings::params][strings::function_id].asInt());
+ const bool app_id_exist =
+ (*arg)[strings::msg_params].keyExists(strings::app_id);
+ const bool is_connection_key_correct = [](arg_type arg) {
+ if ((*arg)[strings::msg_params].keyExists(strings::connection_key)) {
+ return (*arg)[strings::params][strings::connection_key] == kAppId;
+ }
+ return false;
+ };
return is_function_id_matched && !app_id_exist && is_connection_key_correct;
}
@@ -73,6 +96,27 @@ MATCHER_P(CheckDisplayCapabilitiesNotChanged, display_capability, "") {
return display_capability == arg;
}
+MATCHER_P2(CheckVideoStreamingCapability,
+ system_capability_type,
+ video_streaming_capability,
+ "") {
+ const mobile_apis::SystemCapabilityType::eType received_sys_cap_type =
+ static_cast<mobile_apis::SystemCapabilityType::eType>(
+ (*arg)[strings::msg_params][strings::system_capability]
+ [strings::system_capability_type]
+ .asInt());
+
+ const bool system_capability_type_matched =
+ received_sys_cap_type == system_capability_type;
+
+ const bool video_capability_matched =
+ video_streaming_capability ==
+ (*arg)[strings::msg_params][strings::system_capability]
+ [strings::video_streaming_capability];
+
+ return system_capability_type_matched && video_capability_matched;
+}
+
class OnBCSystemCapabilityUpdatedNotificationFromHMITest
: public CommandsTest<CommandsTestMocks::kIsNice> {
protected:
@@ -105,7 +149,7 @@ TEST_F(
EXPECT_CALL(
mock_rpc_service_,
ManageMobileCommand(
- CheckMessageToMobile(),
+ CheckMessageToMobileWithoutAppId(),
::application_manager::commands::Command::CommandSource::SOURCE_SDL))
.WillOnce(Return(true));
@@ -130,7 +174,7 @@ TEST_F(OnBCSystemCapabilityUpdatedNotificationFromHMITest,
TEST_F(
OnBCSystemCapabilityUpdatedNotificationFromHMITest,
- Run_AppRegisteredWithPresentedAppIdInMessage_SetDisplayCapabilitiesToApp_SendMessageToMobile) {
+ Run_AppRegisteredWithPresentedAppIdInMessage_SetDisplayCapabilitiesToAppAndAppIdIsErasedFromMessage_SendMessageToMobile) {
(*message_)[am::strings::msg_params][strings::system_capability]
[am::strings::system_capability_type] =
mobile_apis::SystemCapabilityType::DISPLAYS;
@@ -147,7 +191,7 @@ TEST_F(
EXPECT_CALL(
mock_rpc_service_,
ManageMobileCommand(
- CheckMessageToMobile(),
+ CheckMessageToMobileWithoutAppId(),
::application_manager::commands::Command::CommandSource::SOURCE_SDL))
.WillOnce(Return(true));
@@ -155,6 +199,149 @@ TEST_F(
command_->Run();
}
+TEST_F(
+ OnBCSystemCapabilityUpdatedNotificationFromHMITest,
+ Run_SysCapTypeVideoStreaming_CapabilityIsAbsent_DoesntSetInHMICapabilities) {
+ smart_objects::SmartObject system_capability =
+ smart_objects::SmartObject(smart_objects::SmartType_Map);
+
+ system_capability[strings::system_capability_type] =
+ mobile_apis::SystemCapabilityType::VIDEO_STREAMING;
+
+ ASSERT_TRUE(command_->Init());
+ EXPECT_CALL(mock_hmi_capabilities_, set_video_streaming_capability(_))
+ .Times(0);
+ command_->Run();
+}
+
+TEST_F(OnBCSystemCapabilityUpdatedNotificationFromHMITest,
+ Run_VideoStreamingCapability_AppIdIsAbsent_NotificationIgnored) {
+ (*message_)[am::strings::msg_params][strings::system_capability]
+ [am::strings::system_capability_type] =
+ mobile_apis::SystemCapabilityType::VIDEO_STREAMING;
+
+ EXPECT_CALL(mock_rpc_service_, ManageMobileCommand(_, _)).Times(0);
+
+ ASSERT_TRUE(command_->Init());
+ command_->Run();
+}
+
+TEST_F(OnBCSystemCapabilityUpdatedNotificationFromHMITest,
+ Run_VideoStreamingCapability_AppNotRegistered_NotificationIgnored) {
+ (*message_)[am::strings::msg_params][strings::system_capability]
+ [am::strings::system_capability_type] =
+ mobile_apis::SystemCapabilityType::VIDEO_STREAMING;
+ (*message_)[am::strings::msg_params][strings::app_id] = kAppId;
+
+ ApplicationSharedPtr app; // Empty application shared pointer
+
+ ON_CALL(app_mngr_, application(kAppId)).WillByDefault(Return(app));
+ EXPECT_CALL(mock_rpc_service_, ManageMobileCommand(_, _)).Times(0);
+
+ ASSERT_TRUE(command_->Init());
+ command_->Run();
+}
+
+TEST_F(OnBCSystemCapabilityUpdatedNotificationFromHMITest,
+ Run_VideoStreamingCapability_AppNotSubsribed_NotificationIgnored) {
+ (*message_)[am::strings::msg_params][strings::system_capability]
+ [am::strings::system_capability_type] =
+ mobile_apis::SystemCapabilityType::VIDEO_STREAMING;
+ (*message_)[am::strings::msg_params][strings::app_id] = kAppId;
+
+ sdl_rpc_plugin::SDLRPCPlugin sdl_rpc_plugin;
+
+ // By default system capability extension is not subsribed to the
+ // VIDEO_STREAMING
+ auto system_capability_app_extension =
+ std::make_shared<sdl_rpc_plugin::SystemCapabilityAppExtension>(
+ sdl_rpc_plugin, *mock_app_);
+
+ ON_CALL(*mock_app_,
+ QueryInterface(sdl_rpc_plugin::SystemCapabilityAppExtension::
+ SystemCapabilityAppExtensionUID))
+ .WillByDefault(Return(system_capability_app_extension));
+ ON_CALL(app_mngr_, application(kAppId)).WillByDefault(Return(mock_app_));
+
+ EXPECT_CALL(mock_rpc_service_, ManageMobileCommand(_, _)).Times(0);
+
+ ASSERT_TRUE(command_->Init());
+ command_->Run();
+}
+
+TEST_F(
+ OnBCSystemCapabilityUpdatedNotificationFromHMITest,
+ Run_VideoStreamingCapability_AppIsSubsribed_VideoCapabilityIsAbsent_NotificationIgnored) {
+ const mobile_apis::SystemCapabilityType::eType system_capability_type =
+ mobile_apis::SystemCapabilityType::VIDEO_STREAMING;
+
+ (*message_)[am::strings::msg_params][strings::system_capability]
+ [am::strings::system_capability_type] = system_capability_type;
+ (*message_)[am::strings::msg_params][strings::app_id] = kAppId;
+
+ sdl_rpc_plugin::SDLRPCPlugin sdl_rpc_plugin;
+ std::shared_ptr<sdl_rpc_plugin::SystemCapabilityAppExtension>
+ system_capability_app_extension(
+ std::make_shared<sdl_rpc_plugin::SystemCapabilityAppExtension>(
+ sdl_rpc_plugin, *mock_app_));
+ system_capability_app_extension->SubscribeTo(system_capability_type);
+
+ ON_CALL(*mock_app_,
+ QueryInterface(sdl_rpc_plugin::SystemCapabilityAppExtension::
+ SystemCapabilityAppExtensionUID))
+ .WillByDefault(Return(system_capability_app_extension));
+ ON_CALL(app_mngr_, application(kAppId)).WillByDefault(Return(mock_app_));
+
+ EXPECT_CALL(mock_rpc_service_, ManageMobileCommand(_, _)).Times(0);
+
+ ASSERT_TRUE(command_->Init());
+ command_->Run();
+}
+
+TEST_F(
+ OnBCSystemCapabilityUpdatedNotificationFromHMITest,
+ Run_VideoStreamingCapability_AppIsSubsribed_VideoCapabilityExists_NotificationForwarded) {
+ const mobile_apis::SystemCapabilityType::eType system_capability_type =
+ mobile_apis::SystemCapabilityType::VIDEO_STREAMING;
+
+ (*message_)[am::strings::msg_params][strings::system_capability]
+ [am::strings::system_capability_type] = system_capability_type;
+ (*message_)[am::strings::msg_params][strings::app_id] = kAppId;
+
+ (*message_)[am::strings::msg_params][strings::system_capability]
+ [strings::video_streaming_capability] =
+ new smart_objects::SmartObject(
+ smart_objects::SmartType::SmartType_Map);
+
+ auto& video_streaming_capability =
+ (*message_)[am::strings::msg_params][strings::system_capability]
+ [strings::video_streaming_capability];
+
+ FillVideoStreamingCapability(video_streaming_capability);
+
+ sdl_rpc_plugin::SDLRPCPlugin sdl_rpc_plugin;
+ std::shared_ptr<sdl_rpc_plugin::SystemCapabilityAppExtension>
+ system_capability_app_extension(
+ std::make_shared<sdl_rpc_plugin::SystemCapabilityAppExtension>(
+ sdl_rpc_plugin, *mock_app_));
+ system_capability_app_extension->SubscribeTo(system_capability_type);
+
+ ON_CALL(*mock_app_,
+ QueryInterface(sdl_rpc_plugin::SystemCapabilityAppExtension::
+ SystemCapabilityAppExtensionUID))
+ .WillByDefault(Return(system_capability_app_extension));
+ ON_CALL(app_mngr_, application(kAppId)).WillByDefault(Return(mock_app_));
+
+ EXPECT_CALL(mock_rpc_service_,
+ ManageMobileCommand(
+ CheckVideoStreamingCapability(system_capability_type,
+ video_streaming_capability),
+ _));
+
+ ASSERT_TRUE(command_->Init());
+ command_->Run();
+}
+
} // namespace on_bc_system_capability_updated_notification_from_hmi
} // namespace hmi_commands_test
} // namespace commands_test
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/ui_get_capabilities_response_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/ui_get_capabilities_response_test.cc
index cf701caf51..a1661dc247 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/ui_get_capabilities_response_test.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/ui_get_capabilities_response_test.cc
@@ -344,6 +344,7 @@ TEST_F(UIGetCapabilitiesResponseTest, SetVideoStreamingCapability_SUCCESS) {
video_streaming_capability[strings::pixel_per_inch] = 117.f;
video_streaming_capability[strings::scale] = 1.f;
+ video_streaming_capability[strings::preferred_fps] = 30;
ResponseFromHMIPtr command(
CreateCommand<UIGetCapabilitiesResponse>(command_msg));
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/update_device_list_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/update_device_list_request_test.cc
index 31c03a7ed5..9760462d05 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/update_device_list_request_test.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/update_device_list_request_test.cc
@@ -92,10 +92,6 @@ class UpdateDeviceListRequestTest
TEST_F(UpdateDeviceListRequestTest, RUN_LaunchHMIReturnsFalse) {
MessageSharedPtr command_msg = CreateCommandMsg();
- EXPECT_CALL(app_mngr_, event_dispatcher())
- .WillOnce(ReturnRef(mock_event_dispatcher_));
- EXPECT_CALL(mock_event_dispatcher_, remove_observer(_));
-
UpdateDeviceListRequestPtr command(
CreateCommand<UpdateDeviceListRequest>(command_msg));
@@ -103,7 +99,7 @@ TEST_F(UpdateDeviceListRequestTest, RUN_LaunchHMIReturnsFalse) {
EXPECT_CALL(settings_, launch_hmi()).WillOnce(Return(false));
- EXPECT_CALL(app_mngr_, IsHMICooperating()).Times(0);
+ EXPECT_CALL(app_mngr_, WaitForHmiIsReady()).Times(0);
EXPECT_CALL(mock_rpc_service_, SendMessageToHMI(command_msg));
command->Run();
@@ -114,13 +110,9 @@ TEST_F(UpdateDeviceListRequestTest, RUN_LaunchHMIReturnsFalse) {
CommandImpl::protocol_version_);
}
-TEST_F(UpdateDeviceListRequestTest, RUN_HMICooperatingReturnsTrue_SUCCESSS) {
+TEST_F(UpdateDeviceListRequestTest, RUN_HMICooperatingReturnsTrue_SUCCESS) {
MessageSharedPtr command_msg = CreateCommandMsg();
- EXPECT_CALL(app_mngr_, event_dispatcher())
- .WillOnce(ReturnRef(mock_event_dispatcher_));
- EXPECT_CALL(mock_event_dispatcher_, remove_observer(_));
-
UpdateDeviceListRequestPtr command(
CreateCommand<UpdateDeviceListRequest>(command_msg));
@@ -128,7 +120,7 @@ TEST_F(UpdateDeviceListRequestTest, RUN_HMICooperatingReturnsTrue_SUCCESSS) {
EXPECT_CALL(settings_, launch_hmi()).WillOnce(Return(true));
- EXPECT_CALL(app_mngr_, IsHMICooperating()).WillOnce(Return(true));
+ EXPECT_CALL(app_mngr_, WaitForHmiIsReady()).WillOnce(Return(true));
EXPECT_CALL(mock_rpc_service_, SendMessageToHMI(command_msg));
command->Run();
@@ -139,29 +131,20 @@ TEST_F(UpdateDeviceListRequestTest, RUN_HMICooperatingReturnsTrue_SUCCESSS) {
CommandImpl::protocol_version_);
}
-TEST_F(UpdateDeviceListRequestTest, OnEvent_WrongEventId_UNSUCCESS) {
- Event event(Event::EventID::INVALID_ENUM);
-
- EXPECT_CALL(app_mngr_, event_dispatcher())
- .WillOnce(ReturnRef(mock_event_dispatcher_));
- EXPECT_CALL(mock_event_dispatcher_, remove_observer(_));
-
- UpdateDeviceListRequestPtr command(CreateCommand<UpdateDeviceListRequest>());
+TEST_F(UpdateDeviceListRequestTest, RUN_HMICooperatingReturnsFalse_UNSUCCESS) {
+ MessageSharedPtr command_msg = CreateCommandMsg();
- command->on_event(event);
-}
+ UpdateDeviceListRequestPtr command(
+ CreateCommand<UpdateDeviceListRequest>(command_msg));
-TEST_F(UpdateDeviceListRequestTest, OnEvent_SUCCESS) {
- Event event(Event::EventID::BasicCommunication_OnReady);
+ EXPECT_CALL(app_mngr_, get_settings()).WillOnce(ReturnRef(settings_));
- EXPECT_CALL(app_mngr_, event_dispatcher())
- .WillOnce(ReturnRef(mock_event_dispatcher_));
- EXPECT_CALL(mock_event_dispatcher_, remove_observer(_, _));
- EXPECT_CALL(mock_event_dispatcher_, remove_observer(_));
+ EXPECT_CALL(settings_, launch_hmi()).WillOnce(Return(true));
- UpdateDeviceListRequestPtr command(CreateCommand<UpdateDeviceListRequest>());
+ EXPECT_CALL(app_mngr_, WaitForHmiIsReady()).WillOnce(Return(false));
+ EXPECT_CALL(mock_rpc_service_, SendMessageToHMI(_)).Times(0);
- command->on_event(event);
+ command->Run();
}
} // namespace update_device_list_request
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/add_command_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/add_command_request_test.cc
index aa199bd112..93ae813535 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/add_command_request_test.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/add_command_request_test.cc
@@ -373,26 +373,27 @@ TEST_F(AddCommandRequestTest, Run_CommandIDAlreadyExists_EXPECT_INVALID_ID) {
request_ptr->Run();
}
-TEST_F(AddCommandRequestTest,
- Run_CommandNameAlreadyExists_EXPECT_DUPLICATE_NAME) {
+TEST_F(AddCommandRequestTest, Run_CommandNameAlreadyExists_EXPECT_Forwarded) {
CreateBasicParamsUIRequest();
- SmartObject& msg_params = (*msg_)[strings::msg_params];
- msg_params[menu_params][hmi_request::parent_id] = kFirstParentId;
- SmartObject& image = msg_params[cmd_icon];
+ (*msg_)[msg_params][menu_name] = kMenuName;
+ SmartObject& image = (*msg_)[msg_params][cmd_icon];
EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _))
.WillOnce(Return(mobile_apis::Result::SUCCESS));
EXPECT_CALL(*mock_app_, FindCommand(kCmdId)).WillOnce(Return(smart_obj_));
+ EXPECT_CALL(*mock_app_, AddCommand(_, (*msg_)[msg_params]));
+
SmartObject first_command = SmartObject(SmartType_Map);
SmartObject second_command = SmartObject(SmartType_Map);
- const am::CommandsMap commands_map =
+ am::CommandsMap commands_map =
CreateCommandsMap(first_command, second_command);
EXPECT_CALL(*mock_app_, commands_map())
.WillRepeatedly(Return(DataAccessor<application_manager::CommandsMap>(
commands_map, lock_ptr_)));
- EXPECT_CALL(mock_rpc_service_,
- ManageMobileCommand(
- MobileResultCodeIs(mobile_apis::Result::DUPLICATE_NAME), _));
+ EXPECT_CALL(
+ mock_rpc_service_,
+ ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand), _))
+ .WillOnce(Return(true));
std::shared_ptr<AddCommandRequest> request_ptr =
CreateCommand<AddCommandRequest>(msg_);
request_ptr->Run();
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_app_capability_updated_notification_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_app_capability_updated_notification_test.cc
new file mode 100644
index 0000000000..41e734137b
--- /dev/null
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_app_capability_updated_notification_test.cc
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 2020, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "mobile/on_app_capability_updated_notification.h"
+
+#include "application_manager/commands/commands_test.h"
+#include "gtest/gtest.h"
+#include "sdl_rpc_plugin/extensions/system_capability_app_extension.h"
+#include "sdl_rpc_plugin/sdl_rpc_plugin.h"
+
+namespace test {
+namespace components {
+namespace commands_test {
+namespace mobile_commands_test {
+namespace on_app_capability_updated_notification_test {
+
+using sdl_rpc_plugin::commands::mobile::OnAppCapabilityUpdatedNotification;
+using ::testing::_;
+
+typedef std::shared_ptr<OnAppCapabilityUpdatedNotification>
+ OnAppCapabilityUpdatedNotificationPtr;
+
+namespace strings = application_manager::strings;
+namespace {
+const uint32_t kConnectionKey = 1u;
+const uint32_t kAppId = 2u;
+} // namespace
+
+MATCHER_P(CheckAppCapability, app_capability, "") {
+ return app_capability == (*arg)[strings::msg_params][strings::app_capability];
+}
+
+class OnAppCapabilityUpdatedNotificationTest
+ : public CommandsTest<CommandsTestMocks::kIsNice> {
+ protected:
+ void SetUp() OVERRIDE {
+ message_ = CreateMessage();
+ (*message_)[strings::params][strings::connection_key] = kConnectionKey;
+ command_ = CreateCommand<OnAppCapabilityUpdatedNotification>(message_);
+ mock_app_ = CreateMockApp();
+ }
+
+ OnAppCapabilityUpdatedNotificationPtr command_;
+ MockAppPtr mock_app_;
+ MessageSharedPtr message_;
+};
+
+TEST_F(OnAppCapabilityUpdatedNotificationTest, Run_ManageHMICommand_SUCCESS) {
+ smart_objects::SmartObject app_capability =
+ smart_objects::SmartObject(smart_objects::SmartType_Map);
+
+ app_capability[strings::app_capability_type] =
+ mobile_apis::AppCapabilityType::VIDEO_STREAMING;
+ app_capability[strings::video_streaming_capability] =
+ smart_objects::SmartObject(smart_objects::SmartType_Map);
+
+ FillVideoStreamingCapability(
+ app_capability[strings::video_streaming_capability]);
+
+ (*message_)[strings::msg_params][strings::app_capability] = app_capability;
+
+ ASSERT_TRUE(command_->Init());
+
+ ON_CALL(app_mngr_, application(kConnectionKey))
+ .WillByDefault(Return(mock_app_));
+ ON_CALL(*mock_app_, app_id()).WillByDefault(Return(kAppId));
+
+ EXPECT_CALL(mock_rpc_service_,
+ ManageHMICommand(CheckAppCapability(app_capability),
+ app_mngr::commands::Command::SOURCE_SDL_TO_HMI));
+ command_->Run();
+}
+
+} // namespace on_app_capability_updated_notification_test
+} // namespace mobile_commands_test
+} // namespace commands_test
+} // namespace components
+} // namespace test
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_system_capability_updated_notification_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_system_capability_updated_notification_test.cc
index 7e7b16aa89..32a13f402c 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_system_capability_updated_notification_test.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_system_capability_updated_notification_test.cc
@@ -63,6 +63,12 @@ MATCHER_P(CheckDisplayCapabilities, display_capabilities, "") {
[strings::display_capabilities];
}
+MATCHER_P(CheckVideoStreamCapability, video_streaming_capability, "") {
+ return video_streaming_capability ==
+ (*arg)[strings::msg_params][strings::system_capability]
+ [strings::video_streaming_capability];
+}
+
class OnSystemCapabilityUpdatedNotificationTest
: public CommandsTest<CommandsTestMocks::kIsNice> {
protected:
@@ -233,6 +239,43 @@ TEST_F(
command_->Run();
}
+TEST_F(OnSystemCapabilityUpdatedNotificationTest,
+ Run_VideoSteamingCapability_AppIdIsAbsent_SendMessageToMobile) {
+ (*message_)[am::strings::msg_params][strings::system_capability]
+ [am::strings::system_capability_type] =
+ mobile_apis::SystemCapabilityType::VIDEO_STREAMING;
+
+ EXPECT_CALL(mock_rpc_service_, SendMessageToMobile(message_, false));
+
+ ASSERT_TRUE(command_->Init());
+ command_->Run();
+}
+
+TEST_F(OnSystemCapabilityUpdatedNotificationTest,
+ Run_VideoSteamingCapability_AppIdExistsInMessage_SendMessageToMobile) {
+ (*message_)[strings::msg_params][strings::system_capability]
+ [strings::system_capability_type] =
+ mobile_apis::SystemCapabilityType::VIDEO_STREAMING;
+ (*message_)[strings::msg_params][strings::app_id] = kAppId;
+ (*message_)[strings::msg_params][strings::system_capability]
+ [strings::video_streaming_capability] =
+ new smart_objects::SmartObject(smart_objects::SmartType_Map);
+
+ auto& video_streaming_capability =
+ (*message_)[strings::msg_params][strings::system_capability]
+ [strings::video_streaming_capability];
+
+ FillVideoStreamingCapability(video_streaming_capability);
+
+ EXPECT_CALL(
+ mock_rpc_service_,
+ SendMessageToMobile(
+ CheckVideoStreamCapability(video_streaming_capability), false));
+
+ ASSERT_TRUE(command_->Init());
+ command_->Run();
+}
+
} // namespace on_system_capability_updated_notification
} // namespace mobile_commands_test
} // namespace commands_test
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_way_point_change_notification_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_way_point_change_notification_test.cc
index ec401ae2a8..dc6f07f525 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_way_point_change_notification_test.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_way_point_change_notification_test.cc
@@ -139,7 +139,6 @@ TEST_F(OnWayPointChangeNotificationTest,
.WillOnce(Return(apps_subscribed_for_way_points));
EXPECT_CALL(mock_rpc_service_,
SendMessageToMobile(CheckMessageData(kApp1Id), _));
- EXPECT_CALL(app_mngr_, SaveWayPointsMessage(message_));
command_->Run();
}
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc
index fab648fc95..4572a6d907 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc
@@ -198,7 +198,7 @@ class RegisterAppInterfaceRequestTest
void InitGetters() {
ON_CALL(app_mngr_, GetCorrectMobileIDFromMessage(msg_))
.WillByDefault(Return(kAppId1));
- ON_CALL(app_mngr_, IsHMICooperating()).WillByDefault(Return(true));
+ ON_CALL(app_mngr_, WaitForHmiIsReady()).WillByDefault(Return(true));
ON_CALL(app_mngr_, resume_controller())
.WillByDefault(ReturnRef(mock_resume_crt_));
ON_CALL(app_mngr_, connection_handler())
@@ -416,11 +416,7 @@ TEST_F(RegisterAppInterfaceRequestTest, DefaultTimeout_CheckIfZero_SUCCESS) {
TEST_F(RegisterAppInterfaceRequestTest, Run_MinimalData_SUCCESS) {
InitBasicMessage();
(*msg_)[am::strings::msg_params][am::strings::hash_id] = kAppId1;
- EXPECT_CALL(app_mngr_, IsStopping())
- .WillOnce(Return(false))
- .WillOnce(Return(true))
- .WillOnce(Return(false));
- ON_CALL(app_mngr_, IsHMICooperating()).WillByDefault(Return(false));
+ EXPECT_CALL(app_mngr_, WaitForHmiIsReady()).WillOnce(Return(true));
EXPECT_CALL(app_mngr_, IsApplicationForbidden(_, _)).WillOnce(Return(false));
ON_CALL(mock_connection_handler_,
@@ -504,11 +500,7 @@ TEST_F(RegisterAppInterfaceRequestTest,
Run_HmiInterfacesStateAvailable_SUCCESS) {
InitBasicMessage();
- EXPECT_CALL(app_mngr_, IsStopping())
- .WillOnce(Return(false))
- .WillOnce(Return(true))
- .WillOnce(Return(false));
- ON_CALL(app_mngr_, IsHMICooperating()).WillByDefault(Return(false));
+ ON_CALL(app_mngr_, WaitForHmiIsReady()).WillByDefault(Return(true));
EXPECT_CALL(app_mngr_, IsApplicationForbidden(_, _)).WillOnce(Return(false));
ON_CALL(mock_connection_handler_,
@@ -808,11 +800,8 @@ TEST_F(RegisterAppInterfaceRequestTest,
InitBasicMessage();
(*msg_)[am::strings::params][am::strings::connection_key] = kConnectionKey2;
- EXPECT_CALL(app_mngr_, IsStopping())
- .WillOnce(Return(false))
- .WillOnce(Return(true))
- .WillOnce(Return(false));
- ON_CALL(app_mngr_, IsHMICooperating()).WillByDefault(Return(false));
+
+ ON_CALL(app_mngr_, WaitForHmiIsReady()).WillByDefault(Return(true));
EXPECT_CALL(app_mngr_, IsApplicationForbidden(kConnectionKey2, kAppId1))
.WillOnce(Return(false));
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/set_global_properties_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/set_global_properties_test.cc
index 9b72d41f7e..4272005fba 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/set_global_properties_test.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/set_global_properties_test.cc
@@ -397,6 +397,29 @@ class SetGlobalPropertiesRequestTest
ui_result, tts_result, rc_result, false);
}
+ void AddCustomizableKeys(MessageSharedPtr msg) {
+ SmartObject customizable_keys(smart_objects::SmartType_Array);
+ customizable_keys[0] = "%";
+ customizable_keys[1] = "@";
+ customizable_keys[2] = "&";
+ (*msg)[am::strings::msg_params][am::strings::keyboard_properties]
+ [am::hmi_request::custom_keys] = customizable_keys;
+ }
+
+ std::shared_ptr<SmartObject> GetCapabilitiesForConfigurableKeyboard(
+ hmi_apis::Common_KeyboardLayout::eType layout, int num_allowed_keys) {
+ auto display_capabilities =
+ std::make_shared<SmartObject>(smart_objects::SmartType_Map);
+ auto& supported_keyboards =
+ (*display_capabilities)[0][am::strings::window_capabilities][0]
+ [am::hmi_response::keyboard_capabilities]
+ [am::hmi_response::supported_keyboards];
+ supported_keyboards[0][am::hmi_request::keyboard_layout] = layout;
+ supported_keyboards[0][am::hmi_response::num_configurable_keys] =
+ num_allowed_keys;
+ return display_capabilities;
+ }
+
std::shared_ptr<sync_primitives::Lock> lock_ptr_;
MockAppPtr mock_app_;
std::shared_ptr<application_manager_test::MockHelpPromptManager>
@@ -1262,6 +1285,371 @@ TEST_F(SetGlobalPropertiesRequestTest,
command->Run();
}
+TEST_F(SetGlobalPropertiesRequestTest,
+ Run_InvalidCustomizableKeys_INVALID_DATA) {
+ MessageSharedPtr msg = CreateMsgParams();
+ SmartObject customizable_keys(smart_objects::SmartType_Array);
+ customizable_keys[0] = "%";
+ customizable_keys[1] = "\\n";
+ customizable_keys[2] = " ";
+ (*msg)[am::strings::msg_params][am::strings::keyboard_properties]
+ [am::hmi_request::custom_keys] = customizable_keys;
+
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ ExpectInvalidData();
+
+ command->Run();
+}
+
+TEST_F(
+ SetGlobalPropertiesRequestTest,
+ Run_DisallowedNumberOfCustomizableKeysAndLayoutFromRequest_INVALID_DATA) {
+ MessageSharedPtr msg = CreateMsgParams();
+ AddCustomizableKeys(msg);
+ (*msg)[am::strings::msg_params][am::strings::keyboard_properties]
+ [am::hmi_request::keyboard_layout] =
+ hmi_apis::Common_KeyboardLayout::QWERTZ;
+
+ const int num_allowed_keys = 0;
+ auto display_capabilities = GetCapabilitiesForConfigurableKeyboard(
+ hmi_apis::Common_KeyboardLayout::QWERTZ, num_allowed_keys);
+
+ ON_CALL(app_mngr_, application(kConnectionKey))
+ .WillByDefault(Return(mock_app_));
+ ON_CALL(*mock_app_, display_capabilities())
+ .WillByDefault(Return(display_capabilities));
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ ExpectInvalidData();
+
+ command->Run();
+}
+
+TEST_F(SetGlobalPropertiesRequestTest,
+ Run_DisallowedNumberOfCustomizableKeysAndSavedLayout_INVALID_DATA) {
+ MessageSharedPtr msg = CreateMsgParams();
+ AddCustomizableKeys(msg);
+
+ ON_CALL(app_mngr_, application(kConnectionKey))
+ .WillByDefault(Return(mock_app_));
+ auto saved_keyboard_props = SmartObject(smart_objects::SmartType_Map);
+ saved_keyboard_props[am::hmi_request::keyboard_layout] =
+ hmi_apis::Common_KeyboardLayout::QWERTZ;
+ EXPECT_CALL(*mock_app_, keyboard_props())
+ .WillOnce(Return(&saved_keyboard_props));
+
+ const int num_allowed_keys = 0;
+ auto display_capabilities = GetCapabilitiesForConfigurableKeyboard(
+ hmi_apis::Common_KeyboardLayout::QWERTZ, num_allowed_keys);
+
+ ON_CALL(*mock_app_, display_capabilities())
+ .WillByDefault(Return(display_capabilities));
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ ExpectInvalidData();
+
+ command->Run();
+}
+
+TEST_F(SetGlobalPropertiesRequestTest,
+ Run_DisallowedNumberOfCustomizableKeysAndDefaultLayout_INVALID_DATA) {
+ MessageSharedPtr msg = CreateMsgParams();
+ AddCustomizableKeys(msg);
+
+ const int num_allowed_keys = 0;
+ auto display_capabilities = GetCapabilitiesForConfigurableKeyboard(
+ hmi_apis::Common_KeyboardLayout::QWERTY, num_allowed_keys);
+
+ ON_CALL(app_mngr_, application(kConnectionKey))
+ .WillByDefault(Return(mock_app_));
+ ON_CALL(*mock_app_, display_capabilities())
+ .WillByDefault(Return(display_capabilities));
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ ExpectInvalidData();
+
+ command->Run();
+}
+
+TEST_F(SetGlobalPropertiesRequestTest,
+ Run_AllowedNumberOfCustomizableKeysAndNotSupportedLayout_INVALID_DATA) {
+ MessageSharedPtr msg = CreateMsgParams();
+ AddCustomizableKeys(msg);
+ (*msg)[am::strings::msg_params][am::strings::keyboard_properties]
+ [am::hmi_request::keyboard_layout] =
+ hmi_apis::Common_KeyboardLayout::QWERTZ;
+
+ const int num_allowed_keys = 3;
+ auto display_capabilities = GetCapabilitiesForConfigurableKeyboard(
+ hmi_apis::Common_KeyboardLayout::QWERTY, num_allowed_keys);
+
+ ON_CALL(app_mngr_, application(kConnectionKey))
+ .WillByDefault(Return(mock_app_));
+ ON_CALL(*mock_app_, display_capabilities())
+ .WillByDefault(Return(display_capabilities));
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ ExpectInvalidData();
+
+ command->Run();
+}
+
+TEST_F(SetGlobalPropertiesRequestTest,
+ Run_AllowedNumberOfCustomizableKeys_LayoutFromRequestCached) {
+ MessageSharedPtr msg = CreateMsgParams();
+ AddCustomizableKeys(msg);
+ auto& keyboard_properties =
+ (*msg)[am::strings::msg_params][am::strings::keyboard_properties];
+ keyboard_properties[am::hmi_request::keyboard_layout] =
+ hmi_apis::Common_KeyboardLayout::QWERTY;
+
+ const int num_allowed_keys = 3;
+ auto display_capabilities = GetCapabilitiesForConfigurableKeyboard(
+ hmi_apis::Common_KeyboardLayout::QWERTY, num_allowed_keys);
+
+ ON_CALL(app_mngr_, application(kConnectionKey))
+ .WillByDefault(Return(mock_app_));
+ ON_CALL(*mock_app_, display_capabilities())
+ .WillByDefault(Return(display_capabilities));
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ EXPECT_CALL(*mock_app_, set_keyboard_props(keyboard_properties));
+
+ command->Run();
+}
+
+TEST_F(
+ SetGlobalPropertiesRequestTest,
+ Run_AllowedNumberOfCustomizableKeysAndSavedLayout_SavedLayoutCachedAgain) {
+ MessageSharedPtr msg = CreateMsgParams();
+ AddCustomizableKeys(msg);
+
+ ON_CALL(app_mngr_, application(kConnectionKey))
+ .WillByDefault(Return(mock_app_));
+ auto saved_keyboard_props = SmartObject(smart_objects::SmartType_Map);
+ saved_keyboard_props[am::hmi_request::keyboard_layout] =
+ hmi_apis::Common_KeyboardLayout::QWERTZ;
+ EXPECT_CALL(*mock_app_, keyboard_props())
+ .WillRepeatedly(Return(&saved_keyboard_props));
+
+ const int num_allowed_keys = 3;
+ auto display_capabilities = GetCapabilitiesForConfigurableKeyboard(
+ hmi_apis::Common_KeyboardLayout::QWERTZ, num_allowed_keys);
+
+ ON_CALL(*mock_app_, display_capabilities())
+ .WillByDefault(Return(display_capabilities));
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ auto requested_keyboard_properties =
+ (*msg)[am::strings::msg_params][am::strings::keyboard_properties];
+ auto cached_keyboard_props(requested_keyboard_properties);
+ cached_keyboard_props[am::hmi_request::keyboard_layout] =
+ hmi_apis::Common_KeyboardLayout::QWERTZ;
+ EXPECT_CALL(*mock_app_, set_keyboard_props(cached_keyboard_props));
+
+ command->Run();
+}
+
+TEST_F(
+ SetGlobalPropertiesRequestTest,
+ Run_AllowedNumberOfCustomizableKeysAndDefaultLayout_KeyboardPropsCachedAsIs) {
+ MessageSharedPtr msg = CreateMsgParams();
+ AddCustomizableKeys(msg);
+
+ const int num_allowed_keys = 3;
+ auto display_capabilities = GetCapabilitiesForConfigurableKeyboard(
+ hmi_apis::Common_KeyboardLayout::QWERTY, num_allowed_keys);
+
+ ON_CALL(app_mngr_, application(kConnectionKey))
+ .WillByDefault(Return(mock_app_));
+ ON_CALL(*mock_app_, display_capabilities())
+ .WillByDefault(Return(display_capabilities));
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ auto requested_keyboard_properties =
+ (*msg)[am::strings::msg_params][am::strings::keyboard_properties];
+ EXPECT_CALL(*mock_app_, set_keyboard_props(requested_keyboard_properties));
+
+ command->Run();
+}
+
+TEST_F(SetGlobalPropertiesRequestTest,
+ Run_RequestContainsLanguageParam_KeyboardPropsCachedAsIs) {
+ MessageSharedPtr msg = CreateMsgParams();
+ auto& keyboard_properties =
+ (*msg)[am::strings::msg_params][am::strings::keyboard_properties];
+ keyboard_properties[am::hmi_response::language] =
+ hmi_apis::Common_Language::EN_GB;
+
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ EXPECT_CALL(*mock_app_, set_keyboard_props(keyboard_properties));
+
+ command->Run();
+}
+
+TEST_F(SetGlobalPropertiesRequestTest,
+ Run_NoLanguageInRequestButPresentInSaved_SavedLanguageCachedAgain) {
+ MessageSharedPtr msg = CreateMsgParams();
+
+ ON_CALL(app_mngr_, application(kConnectionKey))
+ .WillByDefault(Return(mock_app_));
+ auto saved_keyboard_props = SmartObject(smart_objects::SmartType_Map);
+ saved_keyboard_props[am::hmi_response::language] =
+ hmi_apis::Common_Language::EN_GB;
+ EXPECT_CALL(*mock_app_, keyboard_props())
+ .WillRepeatedly(Return(&saved_keyboard_props));
+
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ auto cached_keyboard_props =
+ (*msg)[am::strings::msg_params][am::strings::keyboard_properties];
+ cached_keyboard_props[am::hmi_response::language] =
+ hmi_apis::Common_Language::EN_GB;
+ EXPECT_CALL(*mock_app_, set_keyboard_props(cached_keyboard_props));
+
+ command->Run();
+}
+
+TEST_F(SetGlobalPropertiesRequestTest,
+ Run_RequestContainsMaskInputCharactersParam_KeyboardPropsCachedAsIs) {
+ MessageSharedPtr msg = CreateMsgParams();
+ auto& keyboard_properties =
+ (*msg)[am::strings::msg_params][am::strings::keyboard_properties];
+ keyboard_properties[am::hmi_request::mask_input_characters] =
+ hmi_apis::Common_KeyboardInputMask::ENABLE_INPUT_KEY_MASK;
+
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ EXPECT_CALL(*mock_app_, set_keyboard_props(keyboard_properties));
+
+ command->Run();
+}
+
+TEST_F(
+ SetGlobalPropertiesRequestTest,
+ Run_NoMaskInputCharactersInRequestButPresentInSaved_SavedParamCachedAgain) {
+ MessageSharedPtr msg = CreateMsgParams();
+
+ ON_CALL(app_mngr_, application(kConnectionKey))
+ .WillByDefault(Return(mock_app_));
+ auto saved_keyboard_props = SmartObject(smart_objects::SmartType_Map);
+ saved_keyboard_props[am::hmi_request::mask_input_characters] =
+ hmi_apis::Common_KeyboardInputMask::USER_CHOICE_INPUT_KEY_MASK;
+ EXPECT_CALL(*mock_app_, keyboard_props())
+ .WillRepeatedly(Return(&saved_keyboard_props));
+
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ auto cached_keyboard_props =
+ (*msg)[am::strings::msg_params][am::strings::keyboard_properties];
+ cached_keyboard_props[am::hmi_request::mask_input_characters] =
+ hmi_apis::Common_KeyboardInputMask::USER_CHOICE_INPUT_KEY_MASK;
+ EXPECT_CALL(*mock_app_, set_keyboard_props(cached_keyboard_props));
+
+ command->Run();
+}
+
+TEST_F(SetGlobalPropertiesRequestTest,
+ Run_NoAutocompleteListInRequestButPresentInSaved_SavedArrayCachedAgain) {
+ MessageSharedPtr msg = CreateMsgParams();
+
+ ON_CALL(app_mngr_, application(kConnectionKey))
+ .WillByDefault(Return(mock_app_));
+ auto saved_keyboard_props = SmartObject(smart_objects::SmartType_Map);
+
+ SmartObject autocomplete_list(smart_objects::SmartType_Array);
+ autocomplete_list[0] = "first";
+ autocomplete_list[1] = "second";
+ saved_keyboard_props[am::hmi_request::auto_complete_list] = autocomplete_list;
+ EXPECT_CALL(*mock_app_, keyboard_props())
+ .WillRepeatedly(Return(&saved_keyboard_props));
+
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ auto cached_keyboard_props =
+ (*msg)[am::strings::msg_params][am::strings::keyboard_properties];
+ cached_keyboard_props[am::hmi_request::auto_complete_list] =
+ autocomplete_list;
+ EXPECT_CALL(*mock_app_, set_keyboard_props(cached_keyboard_props));
+
+ command->Run();
+}
+
+TEST_F(
+ SetGlobalPropertiesRequestTest,
+ Run_NewAutocompleteListInRequestAndAlsoPresentInSaved_TransferAndSaveNewArray) {
+ MessageSharedPtr msg = CreateMsgParams();
+
+ auto& keyboard_properties =
+ (*msg)[am::strings::msg_params][am::strings::keyboard_properties];
+ SmartObject new_list(smart_objects::SmartType_Array);
+ new_list[0] = "first_new_value";
+ new_list[1] = "second_new_value";
+ keyboard_properties[am::hmi_request::auto_complete_list] = new_list;
+
+ ON_CALL(app_mngr_, application(kConnectionKey))
+ .WillByDefault(Return(mock_app_));
+ SmartObject old_list(smart_objects::SmartType_Array);
+ old_list[0] = "old_value";
+ old_list[1] = "another_old_value";
+ auto saved_keyboard_props = SmartObject(smart_objects::SmartType_Map);
+ saved_keyboard_props[am::hmi_request::auto_complete_list] = old_list;
+ EXPECT_CALL(*mock_app_, keyboard_props())
+ .WillRepeatedly(Return(&saved_keyboard_props));
+
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ EXPECT_CALL(*mock_app_, set_keyboard_props(keyboard_properties));
+
+ command->Run();
+}
+
+TEST_F(
+ SetGlobalPropertiesRequestTest,
+ Run_EmptyAutocompleteListInRequestAndAlsoPresentInSaved_TransferButNotSaveEmptyArray) {
+ MessageSharedPtr msg = CreateMsgParams();
+
+ auto& keyboard_properties =
+ (*msg)[am::strings::msg_params][am::strings::keyboard_properties];
+ SmartObject new_list(smart_objects::SmartType_Array);
+ keyboard_properties[am::hmi_request::auto_complete_list] = new_list;
+
+ ON_CALL(app_mngr_, application(kConnectionKey))
+ .WillByDefault(Return(mock_app_));
+ SmartObject old_list(smart_objects::SmartType_Array);
+ old_list[0] = "old_value";
+ old_list[1] = "another_old_value";
+ auto saved_keyboard_props = SmartObject(smart_objects::SmartType_Map);
+ saved_keyboard_props[am::hmi_request::auto_complete_list] = old_list;
+ EXPECT_CALL(*mock_app_, keyboard_props())
+ .WillRepeatedly(Return(&saved_keyboard_props));
+
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ auto properties_without_empty_list(keyboard_properties);
+ properties_without_empty_list.erase(am::hmi_request::auto_complete_list);
+ EXPECT_CALL(*mock_app_, set_keyboard_props(properties_without_empty_list));
+
+ command->Run();
+}
+
TEST_F(SetGlobalPropertiesRequestTest, Run_NoData_Canceled) {
MessageSharedPtr msg = CreateMsgParams();
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/simple_response_commands_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/simple_response_commands_test.cc
index 0034dcf916..d091fdc8c5 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/simple_response_commands_test.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/simple_response_commands_test.cc
@@ -93,15 +93,12 @@ class MobileResponseCommandsTest
typedef Types<commands::ListFilesResponse,
commands::DeleteCommandResponse,
- commands::AlertManeuverResponse,
- commands::AlertResponse,
commands::SubscribeButtonResponse,
commands::AddSubMenuResponse,
commands::DialNumberResponse,
commands::EndAudioPassThruResponse,
commands::UnregisterAppInterfaceResponse,
commands::UnsubscribeWayPointsResponse,
- commands::UpdateTurnListResponse,
commands::UnsubscribeButtonResponse,
commands::SliderResponse,
commands::SpeakResponse,
@@ -112,7 +109,6 @@ typedef Types<commands::ListFilesResponse,
commands::PerformAudioPassThruResponse,
commands::SetGlobalPropertiesResponse,
commands::SetMediaClockTimerResponse,
- commands::ShowConstantTBTResponse,
commands::ShowResponse,
commands::SystemResponse,
commands::AddCommandResponse,
@@ -131,6 +127,35 @@ TYPED_TEST(MobileResponseCommandsTest, Run_SendResponseToMobile_SUCCESS) {
command->Run();
}
+template <class CommandWithUnsubscribe>
+class MobileResponseWithUnsubscribeCommandsTest
+ : public CommandsTest<CommandsTestMocks::kIsNice> {
+ public:
+ typedef CommandWithUnsubscribe UnsubscribeCommand;
+};
+
+typedef Types<commands::AlertManeuverResponse,
+ commands::AlertResponse,
+ commands::UpdateTurnListResponse,
+ commands::ScrollableMessageResponse,
+ commands::ShowConstantTBTResponse>
+ ResponseWithUnsubscribeCommandList;
+
+TYPED_TEST_CASE(MobileResponseWithUnsubscribeCommandsTest,
+ ResponseWithUnsubscribeCommandList);
+
+TYPED_TEST(MobileResponseWithUnsubscribeCommandsTest,
+ RunWithUnsubscribe_SUCCESS) {
+ std::shared_ptr<typename TestFixture::UnsubscribeCommand> command =
+ this->template CreateCommand<typename TestFixture::UnsubscribeCommand>();
+
+ EXPECT_CALL(this->app_mngr_, UnsubscribeAppFromSoftButtons(_));
+ EXPECT_CALL(this->mock_rpc_service_, SendMessageToMobile(NotNull(), _));
+
+ command->Init();
+ command->Run();
+}
+
class GenericResponseFromHMICommandsTest
: public CommandsTest<CommandsTestMocks::kIsNice> {};
@@ -145,7 +170,6 @@ MATCHER_P2(CheckMessageParams, success, result, "") {
result ==
static_cast<int32_t>(
(*arg)[am::strings::msg_params][am::strings::result_code].asInt());
-
using namespace helpers;
return Compare<bool, EQ, ALL>(
true, is_msg_type_correct, is_success_correct, is_result_code_correct);
@@ -164,24 +188,6 @@ TEST_F(GenericResponseFromHMICommandsTest, Run_SUCCESS) {
command->Run();
}
-
-class ScrollableMessageResponseTest
- : public CommandsTest<CommandsTestMocks::kIsNice> {};
-
-TEST_F(ScrollableMessageResponseTest, Run_SUCCESS) {
- MessageSharedPtr message = CreateMessage();
- (*message)[am::strings::msg_params][am::strings::result_code] =
- mobile_apis::Result::SUCCESS;
-
- MockAppPtr app(CreateMockApp());
-
- std::shared_ptr<commands::ScrollableMessageResponse> command(
- CreateCommand<commands::ScrollableMessageResponse>(message));
- EXPECT_CALL(app_mngr_, application(_)).WillOnce(Return(app));
- EXPECT_CALL(*app, UnsubscribeFromSoftButtons(_));
- command->Run();
-}
-
} // namespace simple_response_commands_test
} // namespace mobile_commands_test
} // namespace commands_test
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/subscribe_way_points_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/subscribe_way_points_request_test.cc
index 528f8a0700..44c5a7a3dd 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/subscribe_way_points_request_test.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/subscribe_way_points_request_test.cc
@@ -73,13 +73,12 @@ TEST_F(SubscribeWayPointsRequestTest, Run_SUCCESS) {
ON_CALL(app_mngr_, application(_)).WillByDefault(Return(app));
ON_CALL(app_mngr_, IsAppSubscribedForWayPoints(Ref(*app)))
.WillByDefault(Return(false));
- ON_CALL(app_mngr_, IsAnyAppSubscribedForWayPoints())
- .WillByDefault(Return(true));
+ ON_CALL(app_mngr_, IsSubscribedToHMIWayPoints()).WillByDefault(Return(true));
{
InSequence dummy;
EXPECT_CALL(app_mngr_,
- SubscribeAppForWayPoints(A<am::ApplicationSharedPtr>()));
+ SubscribeAppForWayPoints(A<am::ApplicationSharedPtr>(), false));
EXPECT_CALL(*app, UpdateHash());
}
@@ -112,7 +111,7 @@ TEST_F(SubscribeWayPointsRequestTest, OnEvent_SUCCESS) {
{
InSequence dummy;
EXPECT_CALL(app_mngr_,
- SubscribeAppForWayPoints(A<am::ApplicationSharedPtr>()));
+ SubscribeAppForWayPoints(A<am::ApplicationSharedPtr>(), true));
EXPECT_CALL(mock_message_helper_, HMIToMobileResult(result_code))
.WillOnce(Return(mobile_apis::Result::SUCCESS));
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/unsubscribe_way_points_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/unsubscribe_way_points_request_test.cc
index ec4d2420d6..9a6ff4d14e 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/unsubscribe_way_points_request_test.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/unsubscribe_way_points_request_test.cc
@@ -123,6 +123,8 @@ TEST_F(UnsubscribeWayPointsRequestTest, Run_AppSubscribedForWayPoints_SUCCESS) {
EXPECT_CALL(app_mngr_, GetAppsSubscribedForWayPoints())
.WillOnce(Return(subscribed_apps));
+ EXPECT_CALL(app_mngr_, IsSubscribedToHMIWayPoints()).WillOnce(Return(true));
+
EXPECT_CALL(mock_rpc_service_,
ManageHMICommand(
HMIResultCodeIs(
@@ -156,9 +158,10 @@ TEST_F(UnsubscribeWayPointsRequestTest,
Event event(hmi_apis::FunctionID::Navigation_UnsubscribeWayPoints);
event.set_smart_object(*event_msg);
- EXPECT_CALL(app_mngr_,
- UnsubscribeAppFromWayPoints(
- ::testing::Matcher<am::ApplicationSharedPtr>(mock_app)));
+ EXPECT_CALL(
+ app_mngr_,
+ UnsubscribeAppFromWayPoints(
+ ::testing::Matcher<am::ApplicationSharedPtr>(mock_app), true));
EXPECT_CALL(
mock_rpc_service_,
diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_get_vehicle_type_response.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_get_vehicle_type_response.cc
index dbd1b48033..19c1113cc6 100644
--- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_get_vehicle_type_response.cc
+++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_get_vehicle_type_response.cc
@@ -55,11 +55,10 @@ void VIGetVehicleTypeResponse::Run() {
const auto result_code = static_cast<hmi_apis::Common_Result::eType>(
(*message_)[strings::params][hmi_response::code].asInt());
- hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
- hmi_apis::FunctionID::VehicleInfo_GetVehicleType);
-
if (hmi_apis::Common_Result::SUCCESS != result_code) {
SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities");
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::VehicleInfo_GetVehicleType);
return;
}
@@ -67,6 +66,9 @@ void VIGetVehicleTypeResponse::Run() {
hmi_capabilities_.set_vehicle_type(
(*message_)[strings::msg_params][hmi_response::vehicle_type]);
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::VehicleInfo_GetVehicleType);
+
if (!hmi_capabilities_.SaveCachedCapabilitiesToFile(
hmi_interface::vehicle_info,
sections_to_update,
diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_is_ready_request.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_is_ready_request.cc
index 578f650e98..2c9ac78523 100644
--- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_is_ready_request.cc
+++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_is_ready_request.cc
@@ -78,6 +78,8 @@ void VIIsReadyRequest::on_event(const event_engine::Event& event) {
HMICapabilities& hmi_capabilities = hmi_capabilities_;
hmi_capabilities.set_is_ivi_cooperating(is_available);
policy_handler_.OnVIIsReady();
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::VehicleInfo_IsReady);
if (!app_mngr::commands::CheckAvailabilityHMIInterfaces(
application_manager_, HmiInterfaces::HMI_INTERFACE_VehicleInfo)) {
SDL_LOG_INFO(
@@ -99,6 +101,8 @@ void VIIsReadyRequest::on_event(const event_engine::Event& event) {
void VIIsReadyRequest::onTimeOut() {
// Note(dtrunov): According to new requirment APPLINK-27956
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::VehicleInfo_IsReady);
RequestInterfaceCapabilities(hmi_interface ::vehicle_info);
}
diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/on_vehicle_data_notification.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/on_vehicle_data_notification.cc
index e336b778ff..60dea0a24b 100644
--- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/on_vehicle_data_notification.cc
+++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/on_vehicle_data_notification.cc
@@ -103,10 +103,41 @@ void OnVehicleDataNotification::Run() {
}
}
- SDL_LOG_DEBUG("Number of Notifications to be send: " << notify_apps.size());
-
for (size_t idx = 0; idx < notify_apps.size(); idx++) {
- SDL_LOG_INFO("Send OnVehicleData PRNDL notification to "
+ CommandParametersPermissions params_permissions;
+ application_manager_.CheckPolicyPermissions(
+ notify_apps[idx],
+ window_id(),
+ MessageHelper::StringifiedFunctionID(
+ mobile_api::FunctionID::OnVehicleDataID),
+ appSO[idx].enumerate(),
+ &params_permissions);
+ if (params_permissions.allowed_params.empty() &&
+ params_permissions.disallowed_params.empty() &&
+ params_permissions.undefined_params.empty()) {
+ SDL_LOG_DEBUG(
+ "No parameter permissions provided, all params are allowed");
+ } else {
+ for (const auto& param : appSO[idx].enumerate()) {
+ const auto& allowed_params = params_permissions.allowed_params;
+ auto param_allowed = allowed_params.find(param);
+ if (allowed_params.end() == param_allowed) {
+ SDL_LOG_DEBUG("Param " << param
+ << " is not allowed by policy for app "
+ << notify_apps[idx]->app_id()
+ << ". It will be ignored.");
+ appSO[idx].erase(param);
+ }
+ }
+ }
+
+ if (appSO[idx].empty()) {
+ SDL_LOG_DEBUG("App " << notify_apps[idx]->app_id()
+ << " will be skipped: there is nothing to notify.");
+ continue;
+ }
+
+ SDL_LOG_INFO("Send OnVehicleData notification to "
<< notify_apps[idx]->name().c_str() << " application id "
<< notify_apps[idx]->app_id());
(*message_)[strings::params][strings::connection_key] =
diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/unsubscribe_vehicle_data_request.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/unsubscribe_vehicle_data_request.cc
index 8ffeaf922a..7d81701a64 100644
--- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/unsubscribe_vehicle_data_request.cc
+++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/unsubscribe_vehicle_data_request.cc
@@ -314,8 +314,8 @@ bool UnsubscribeVehicleDataRequest::CheckSubscriptionStatus(
bool UnsubscribeVehicleDataRequest::UnsubscribePendingVehicleData(
ApplicationSharedPtr app, const smart_objects::SmartObject& msg_params) {
SDL_LOG_DEBUG("Unsubscribing from all pending VehicleData");
-
- for (const auto& vi_name : vi_waiting_for_unsubscribe_) {
+ auto pending_vi = vi_waiting_for_unsubscribe_;
+ for (const auto& vi_name : pending_vi) {
const auto converted_item = ConvertRequestToResponseName(vi_name);
const bool is_unsubscription_successful =
CheckSubscriptionStatus(converted_item, msg_params);
diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/commands/mobile/on_vehicle_data_notification_test.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/commands/mobile/on_vehicle_data_notification_test.cc
index 82eb19c45f..3f8dcbb488 100644
--- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/commands/mobile/on_vehicle_data_notification_test.cc
+++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/test/commands/mobile/on_vehicle_data_notification_test.cc
@@ -56,8 +56,10 @@ namespace on_vehicle_data_notification {
namespace am = ::application_manager;
using ::testing::_;
+using ::testing::ContainerEq;
using ::testing::Return;
using ::testing::ReturnRef;
+using ::testing::SetArgPointee;
using am::commands::MessageSharedPtr;
using vehicle_info_plugin::commands::OnVehicleDataNotification;
@@ -119,6 +121,15 @@ TEST_F(OnVehicleDataNotificationTest, OnVehicleDataNotification_SUCCESS) {
VehicleInfoAppExtensionUID))
.WillByDefault(Return(vi_app_extention_ptr));
+ am::CommandParametersPermissions params_permissions;
+ params_permissions.allowed_params.insert(am::strings::gps);
+ params_permissions.allowed_params.insert(am::strings::speed);
+ EXPECT_CALL(app_mngr_,
+ CheckPolicyPermissions(
+ _, _, _, ContainerEq(params_permissions.allowed_params), _))
+ .WillOnce(DoAll(SetArgPointee<4>(params_permissions),
+ Return(mobile_apis::Result::SUCCESS)));
+
MessageSharedPtr message(CreateMessage(smart_objects::SmartType_Map));
smart_objects::SmartObject gps_data;
gps_data[am::strings::longitude_degrees] = 1.0;
diff --git a/src/components/application_manager/src/app_service_manager.cc b/src/components/application_manager/src/app_service_manager.cc
index 9b31d57ca0..4955c792c2 100644
--- a/src/components/application_manager/src/app_service_manager.cc
+++ b/src/components/application_manager/src/app_service_manager.cc
@@ -617,6 +617,25 @@ bool AppServiceManager::UpdateNavigationCapabilities(
return true;
}
+AppService* AppServiceManager::FindWayPointsHandler() {
+ auto service = ActiveServiceForType(
+ EnumToString(mobile_apis::AppServiceType::NAVIGATION));
+ if (!service || !service->mobile_service ||
+ !service->record[strings::service_manifest].keyExists(
+ strings::handled_rpcs)) {
+ return nullptr;
+ }
+
+ smart_objects::SmartObject& handled_rpcs =
+ service->record[strings::service_manifest][strings::handled_rpcs];
+ for (size_t i = 0; i < handled_rpcs.length(); ++i) {
+ if (handled_rpcs[i].asInt() == mobile_apis::FunctionID::GetWayPointsID) {
+ return service;
+ }
+ }
+ return nullptr;
+}
+
void AppServiceManager::AppServiceUpdated(
const smart_objects::SmartObject& service_record,
const mobile_apis::ServiceUpdateReason::eType update_reason,
diff --git a/src/components/application_manager/src/application_impl.cc b/src/components/application_manager/src/application_impl.cc
index 6b4500e394..2952fd5481 100644
--- a/src/components/application_manager/src/application_impl.cc
+++ b/src/components/application_manager/src/application_impl.cc
@@ -613,9 +613,6 @@ void ApplicationImpl::StopStreaming(
void ApplicationImpl::StopNaviStreaming() {
SDL_LOG_AUTO_TRACE();
video_stream_suspend_timer_.Stop();
- application_manager_.OnAppStreaming(app_id(),
- protocol_handler::ServiceType::kMobileNav,
- StreamingState::kStopped);
MessageHelper::SendNaviStopStream(app_id(), application_manager_);
set_video_streaming_approved(false);
set_video_stream_retry_number(0);
@@ -624,9 +621,6 @@ void ApplicationImpl::StopNaviStreaming() {
void ApplicationImpl::StopAudioStreaming() {
SDL_LOG_AUTO_TRACE();
audio_stream_suspend_timer_.Stop();
- application_manager_.OnAppStreaming(app_id(),
- protocol_handler::ServiceType::kAudio,
- StreamingState::kStopped);
MessageHelper::SendAudioStopStream(app_id(), application_manager_);
set_audio_streaming_approved(false);
set_audio_stream_retry_number(0);
@@ -637,17 +631,14 @@ void ApplicationImpl::SuspendStreaming(
using namespace protocol_handler;
SDL_LOG_AUTO_TRACE();
- if (ServiceType::kMobileNav == service_type && !video_streaming_suspended_) {
+ if (ServiceType::kMobileNav == service_type) {
video_stream_suspend_timer_.Stop();
- application_manager_.OnAppStreaming(
- app_id(), service_type, StreamingState::kSuspended);
+ application_manager_.OnAppStreaming(app_id(), service_type, false);
sync_primitives::AutoLock lock(video_streaming_suspended_lock_);
video_streaming_suspended_ = true;
- } else if (ServiceType::kAudio == service_type &&
- !audio_streaming_suspended_) {
+ } else if (ServiceType::kAudio == service_type) {
audio_stream_suspend_timer_.Stop();
- application_manager_.OnAppStreaming(
- app_id(), service_type, StreamingState::kSuspended);
+ application_manager_.OnAppStreaming(app_id(), service_type, false);
sync_primitives::AutoLock lock(audio_streaming_suspended_lock_);
audio_streaming_suspended_ = true;
}
@@ -656,7 +647,7 @@ void ApplicationImpl::SuspendStreaming(
}
void ApplicationImpl::WakeUpStreaming(
- protocol_handler::ServiceType service_type) {
+ protocol_handler::ServiceType service_type, uint32_t timer_len) {
using namespace protocol_handler;
SDL_LOG_AUTO_TRACE();
@@ -668,29 +659,28 @@ void ApplicationImpl::WakeUpStreaming(
{ // reduce the range of video_streaming_suspended_lock_
sync_primitives::AutoLock auto_lock(video_streaming_suspended_lock_);
if (video_streaming_suspended_) {
- application_manager_.OnAppStreaming(
- app_id(), service_type, StreamingState::kStarted);
+ application_manager_.OnAppStreaming(app_id(), service_type, true);
application_manager_.ProcessOnDataStreamingNotification(
service_type, app_id(), true);
video_streaming_suspended_ = false;
}
}
-
- video_stream_suspend_timer_.Start(video_stream_suspend_timeout_,
- timer::kPeriodic);
+ video_stream_suspend_timer_.Start(
+ timer_len == 0 ? video_stream_suspend_timeout_ : timer_len,
+ timer::kPeriodic);
} else if (ServiceType::kAudio == service_type) {
{ // reduce the range of audio_streaming_suspended_lock_
sync_primitives::AutoLock auto_lock(audio_streaming_suspended_lock_);
if (audio_streaming_suspended_) {
- application_manager_.OnAppStreaming(
- app_id(), service_type, StreamingState::kStarted);
+ application_manager_.OnAppStreaming(app_id(), service_type, true);
application_manager_.ProcessOnDataStreamingNotification(
service_type, app_id(), true);
audio_streaming_suspended_ = false;
}
}
- audio_stream_suspend_timer_.Start(audio_stream_suspend_timeout_,
- timer::kPeriodic);
+ audio_stream_suspend_timer_.Start(
+ timer_len == 0 ? audio_stream_suspend_timeout_ : timer_len,
+ timer::kPeriodic);
}
}
@@ -1147,20 +1137,36 @@ uint32_t ApplicationImpl::GetAvailableDiskSpace() {
}
void ApplicationImpl::SubscribeToSoftButtons(
- int32_t cmd_id, const SoftButtonID& softbuttons_id) {
+ int32_t cmd_id, const WindowSoftButtons& window_softbuttons) {
sync_primitives::AutoLock lock(cmd_softbuttonid_lock_);
- if (static_cast<int32_t>(mobile_apis::FunctionID::ScrollableMessageID) ==
- cmd_id) {
- CommandSoftButtonID::iterator it = cmd_softbuttonid_.find(cmd_id);
- if (cmd_softbuttonid_.end() == it) {
- cmd_softbuttonid_[cmd_id] = softbuttons_id;
- }
- } else {
- auto& soft_button_ids = cmd_softbuttonid_[cmd_id];
- for (auto& softbutton_item : softbuttons_id) {
- soft_button_ids.insert(softbutton_item);
- }
+ CommandSoftButtonID::iterator it = cmd_softbuttonid_.find(cmd_id);
+
+ if (cmd_softbuttonid_.end() == it) {
+ SoftButtonIDs soft_buttons{window_softbuttons};
+ cmd_softbuttonid_.insert({cmd_id, soft_buttons});
+ return;
+ }
+
+ auto& command_soft_buttons = cmd_softbuttonid_[cmd_id];
+
+ const auto window_id = window_softbuttons.first;
+ auto find_window_id = [window_id](const WindowSoftButtons& window_buttons) {
+ return window_id == window_buttons.first;
+ };
+
+ auto subscribed_window_buttons = std::find_if(
+ command_soft_buttons.begin(), command_soft_buttons.end(), find_window_id);
+
+ if (subscribed_window_buttons == command_soft_buttons.end()) {
+ command_soft_buttons.insert(window_softbuttons);
+ return;
}
+
+ WindowSoftButtons new_window_soft_buttons = *subscribed_window_buttons;
+ new_window_soft_buttons.second.insert(window_softbuttons.second.begin(),
+ window_softbuttons.second.end());
+ command_soft_buttons.erase(subscribed_window_buttons);
+ command_soft_buttons.insert(new_window_soft_buttons);
}
struct FindSoftButtonId {
@@ -1169,24 +1175,46 @@ struct FindSoftButtonId {
explicit FindSoftButtonId(const uint32_t soft_button_id)
: soft_button_id_(soft_button_id) {}
- bool operator()(const std::pair<uint32_t, WindowID>& element) const {
- return soft_button_id_ == element.first;
+ bool operator()(const uint32_t softbutton_id) {
+ return soft_button_id_ == softbutton_id;
+ }
+};
+
+struct FindWindowSoftButtonId {
+ public:
+ FindWindowSoftButtonId(const uint32_t soft_button_id)
+ : find_softbutton_id_(soft_button_id) {}
+
+ bool operator()(const WindowSoftButtons& window_buttons) {
+ const auto softbuttons = window_buttons.second;
+ auto found_softbutton = std::find_if(
+ softbuttons.begin(), softbuttons.end(), find_softbutton_id_);
+
+ return found_softbutton != softbuttons.end();
}
+
+ private:
+ FindSoftButtonId find_softbutton_id_;
};
bool ApplicationImpl::IsSubscribedToSoftButton(const uint32_t softbutton_id) {
SDL_LOG_AUTO_TRACE();
sync_primitives::AutoLock lock(cmd_softbuttonid_lock_);
- CommandSoftButtonID::iterator it = cmd_softbuttonid_.begin();
- for (; it != cmd_softbuttonid_.end(); ++it) {
- const auto& soft_button_ids = (*it).second;
- FindSoftButtonId finder(softbutton_id);
- const auto find_res =
- std::find_if(soft_button_ids.begin(), soft_button_ids.end(), finder);
- if ((soft_button_ids.end() != find_res)) {
+
+ for (const auto& command_soft_buttons : cmd_softbuttonid_) {
+ FindWindowSoftButtonId find_window_softbutton_id(softbutton_id);
+ const auto& window_softbuttons = command_soft_buttons.second;
+
+ const auto found_window_softbutton_id =
+ std::find_if(window_softbuttons.begin(),
+ window_softbuttons.end(),
+ find_window_softbutton_id);
+
+ if (found_window_softbutton_id != window_softbuttons.end()) {
return true;
}
}
+
return false;
}
@@ -1194,14 +1222,18 @@ WindowID ApplicationImpl::GetSoftButtonWindowID(const uint32_t softbutton_id) {
SDL_LOG_AUTO_TRACE();
sync_primitives::AutoLock lock(cmd_softbuttonid_lock_);
- CommandSoftButtonID::iterator it = cmd_softbuttonid_.begin();
- for (; it != cmd_softbuttonid_.end(); ++it) {
- const auto& soft_button_ids = (*it).second;
- FindSoftButtonId finder(softbutton_id);
- const auto find_res =
- std::find_if(soft_button_ids.begin(), soft_button_ids.end(), finder);
- if ((soft_button_ids.end() != find_res)) {
- return find_res->second;
+
+ for (const auto& command_soft_buttons : cmd_softbuttonid_) {
+ FindWindowSoftButtonId find_window_softbutton_id(softbutton_id);
+ const auto& window_softbuttons = command_soft_buttons.second;
+
+ const auto found_window_softbutton_id =
+ std::find_if(window_softbuttons.begin(),
+ window_softbuttons.end(),
+ find_window_softbutton_id);
+
+ if (found_window_softbutton_id != window_softbuttons.end()) {
+ return found_window_softbutton_id->first;
}
}
diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc
index 6b0ea39804..948f7944d4 100644
--- a/src/components/application_manager/src/application_manager_impl.cc
+++ b/src/components/application_manager/src/application_manager_impl.cc
@@ -145,10 +145,6 @@ struct PolicyAppIdComparator {
const std::string& policy_app_id_;
};
-uint32_t ApplicationManagerImpl::mobile_corelation_id_ = 0;
-uint32_t ApplicationManagerImpl::corelation_id_ = 0;
-const uint32_t ApplicationManagerImpl::max_corelation_id_ = UINT_MAX;
-
namespace formatters = ns_smart_device_link::ns_json_handler::formatters;
namespace jhs = ns_smart_device_link::ns_json_handler::strings;
@@ -162,6 +158,7 @@ ApplicationManagerImpl::ApplicationManagerImpl(
std::make_shared<sync_primitives::RecursiveLock>())
, apps_to_register_list_lock_ptr_(std::make_shared<sync_primitives::Lock>())
, reregister_wait_list_lock_ptr_(std::make_shared<sync_primitives::Lock>())
+ , subscribed_to_hmi_way_points_(false)
, audio_pass_thru_active_(false)
, audio_pass_thru_app_id_(0)
, driver_distraction_state_(hmi_apis::Common_DriverDistractionState::DD_OFF)
@@ -174,8 +171,9 @@ ApplicationManagerImpl::ApplicationManagerImpl(
, policy_handler_(new policy::PolicyHandler(policy_settings, *this))
, protocol_handler_(NULL)
, request_ctrl_(am_settings)
- , hmi_so_factory_(NULL)
- , mobile_so_factory_(NULL)
+ , mobile_correlation_id_(0)
+ , correlation_id_(0)
+ , max_correlation_id_(UINT_MAX)
, hmi_capabilities_(new HMICapabilitiesImpl(*this))
, unregister_reason_(
mobile_api::AppInterfaceUnregisteredReason::INVALID_ENUM)
@@ -229,19 +227,11 @@ ApplicationManagerImpl::ApplicationManagerImpl(
ApplicationManagerImpl::~ApplicationManagerImpl() {
SDL_LOG_AUTO_TRACE();
- is_stopping_.store(true);
+ InitiateStopping();
SendOnSDLClose();
media_manager_ = NULL;
hmi_handler_ = NULL;
connection_handler_ = NULL;
- if (hmi_so_factory_) {
- delete hmi_so_factory_;
- hmi_so_factory_ = NULL;
- }
- if (mobile_so_factory_) {
- delete mobile_so_factory_;
- mobile_so_factory_ = NULL;
- }
protocol_handler_ = NULL;
SDL_LOG_DEBUG("Destroying Policy Handler");
RemovePolicyObserver(this);
@@ -673,17 +663,8 @@ ApplicationSharedPtr ApplicationManagerImpl::RegisterApplication(
static_cast<protocol_handler::MajorProtocolVersion>(
message[strings::params][strings::protocol_version].asInt());
application->set_protocol_version(protocol_version);
-
- if (protocol_handler::MajorProtocolVersion::PROTOCOL_VERSION_UNKNOWN !=
- protocol_version) {
- connection_handler().BindProtocolVersionWithSession(
- connection_key, static_cast<uint8_t>(protocol_version));
- }
- if ((protocol_version ==
- protocol_handler::MajorProtocolVersion::PROTOCOL_VERSION_3) &&
- (get_settings().heart_beat_timeout() != 0)) {
- connection_handler().StartSessionHeartBeat(connection_key);
- }
+ connection_handler_->BindProtocolVersionWithSession(connection_key,
+ protocol_version);
// Keep HMI add id in case app is present in "waiting for registration" list
apps_to_register_list_lock_ptr_->Acquire();
@@ -1382,23 +1363,23 @@ ApplicationManagerImpl::GetCloudAppConnectionStatus(
}
uint32_t ApplicationManagerImpl::GetNextMobileCorrelationID() {
- if (mobile_corelation_id_ < max_corelation_id_) {
- mobile_corelation_id_++;
+ if (mobile_correlation_id_ < max_correlation_id_) {
+ mobile_correlation_id_++;
} else {
- mobile_corelation_id_ = 0;
+ mobile_correlation_id_ = 0;
}
- return mobile_corelation_id_;
+ return mobile_correlation_id_;
}
uint32_t ApplicationManagerImpl::GetNextHMICorrelationID() {
- if (corelation_id_ < max_corelation_id_) {
- corelation_id_++;
+ if (correlation_id_ < max_correlation_id_) {
+ correlation_id_++;
} else {
- corelation_id_ = 0;
+ correlation_id_ = 0;
}
- return corelation_id_;
+ return correlation_id_;
}
bool ApplicationManagerImpl::BeginAudioPassThru(uint32_t app_id) {
@@ -1616,6 +1597,58 @@ void ApplicationManagerImpl::OnDeviceListUpdated(
RefreshCloudAppInformation();
}
+bool ApplicationManagerImpl::WaitForHmiIsReady() {
+ sync_primitives::AutoLock lock(wait_for_hmi_lock_);
+ if (!IsStopping() && !IsHMICooperating()) {
+ SDL_LOG_DEBUG("Waiting for the HMI cooperation...");
+ wait_for_hmi_condvar_.Wait(lock);
+ }
+
+ if (IsStopping()) {
+ SDL_LOG_WARN("System is terminating...");
+ return false;
+ }
+
+ return IsHMICooperating();
+}
+
+bool ApplicationManagerImpl::GetProtocolVehicleData(
+ connection_handler::ProtocolVehicleData& data) {
+ SDL_LOG_AUTO_TRACE();
+ using namespace protocol_handler::strings;
+
+ if (!WaitForHmiIsReady()) {
+ SDL_LOG_ERROR("Failed to wait for HMI readiness");
+ return false;
+ }
+
+ const auto vehicle_type_ptr = hmi_capabilities_->vehicle_type();
+ if (vehicle_type_ptr) {
+ if (vehicle_type_ptr->keyExists(vehicle_make)) {
+ data.vehicle_make = vehicle_type_ptr->getElement(vehicle_make).asString();
+ }
+
+ if (vehicle_type_ptr->keyExists(vehicle_model)) {
+ data.vehicle_model =
+ vehicle_type_ptr->getElement(vehicle_model).asString();
+ }
+
+ if (vehicle_type_ptr->keyExists(vehicle_model_year)) {
+ data.vehicle_year =
+ vehicle_type_ptr->getElement(vehicle_model_year).asString();
+ }
+
+ if (vehicle_type_ptr->keyExists(vehicle_trim)) {
+ data.vehicle_trim = vehicle_type_ptr->getElement(vehicle_trim).asString();
+ }
+ }
+
+ data.vehicle_system_software_version = hmi_capabilities_->ccpu_version();
+ data.vehicle_system_hardware_version = hmi_capabilities_->hardware_version();
+
+ return true;
+}
+
void ApplicationManagerImpl::OnFindNewApplicationsRequest() {
connection_handler().ConnectToAllDevices();
SDL_LOG_DEBUG("Starting application list update timer");
@@ -1731,11 +1764,11 @@ void ApplicationManagerImpl::SwitchApplication(ApplicationSharedPtr app,
bool is_subscribed_to_way_points = IsAppSubscribedForWayPoints(*app);
if (is_subscribed_to_way_points) {
- UnsubscribeAppFromWayPoints(app);
+ UnsubscribeAppFromWayPoints(app, false);
}
SwitchApplicationParameters(app, connection_key, device_id, mac_address);
if (is_subscribed_to_way_points) {
- SubscribeAppForWayPoints(app);
+ SubscribeAppForWayPoints(app, false);
}
// Normally this is done during registration, however since switched apps are
@@ -2555,7 +2588,7 @@ bool ApplicationManagerImpl::Init(
bool ApplicationManagerImpl::Stop() {
SDL_LOG_AUTO_TRACE();
- is_stopping_.store(true);
+ InitiateStopping();
application_list_update_timer_.Stop();
try {
if (unregister_reason_ ==
@@ -2681,25 +2714,16 @@ bool ApplicationManagerImpl::ConvertSOtoMessage(
}
hmi_apis::HMI_API& ApplicationManagerImpl::hmi_so_factory() {
- if (!hmi_so_factory_) {
- hmi_so_factory_ = new hmi_apis::HMI_API;
- if (!hmi_so_factory_) {
- SDL_LOG_ERROR("Out of memory");
- NOTREACHED();
- }
- }
- return *hmi_so_factory_;
+ return hmi_so_factory_;
}
mobile_apis::MOBILE_API& ApplicationManagerImpl::mobile_so_factory() {
- if (!mobile_so_factory_) {
- mobile_so_factory_ = new mobile_apis::MOBILE_API;
- if (!mobile_so_factory_) {
- SDL_LOG_ERROR("Out of memory");
- NOTREACHED();
- }
- }
- return *mobile_so_factory_;
+ return mobile_so_factory_;
+}
+
+ns_smart_device_link_rpc::V1::v4_protocol_v1_2_no_extra&
+ApplicationManagerImpl::mobile_v4_protocol_so_factory() {
+ return mobile_v4_protocol_so_factory_;
}
HMICapabilities& ApplicationManagerImpl::hmi_capabilities() {
@@ -2979,7 +3003,7 @@ void ApplicationManagerImpl::SetUnregisterAllApplicationsReason(
void ApplicationManagerImpl::HeadUnitReset(
mobile_api::AppInterfaceUnregisteredReason::eType reason) {
SDL_LOG_AUTO_TRACE();
- is_stopping_.store(true);
+ InitiateStopping();
switch (reason) {
case mobile_api::AppInterfaceUnregisteredReason::MASTER_RESET: {
SDL_LOG_TRACE("Performing MASTER_RESET");
@@ -3231,6 +3255,7 @@ void ApplicationManagerImpl::UnregisterApplication(
}
ApplicationSharedPtr app_to_remove;
connection_handler::DeviceHandle handle = 0;
+
{
sync_primitives::AutoLock lock(applications_list_lock_ptr_);
auto it_app = applications_.begin();
@@ -3243,64 +3268,65 @@ void ApplicationManagerImpl::UnregisterApplication(
++it_app;
}
}
- if (!app_to_remove) {
- SDL_LOG_ERROR("Cant find application with app_id = " << app_id);
-
- // Just to terminate RAI in case of connection is dropped (rare case)
- // App won't be unregistered since RAI has not been started yet
- SDL_LOG_DEBUG("Trying to terminate possible RAI request.");
- request_ctrl_.terminateAppRequests(app_id);
-
- return;
- }
+ }
+ if (!app_to_remove) {
+ SDL_LOG_ERROR("Cant find application with app_id = " << app_id);
- if (is_resuming) {
- resume_controller().SaveApplication(app_to_remove);
- } else {
- resume_controller().RemoveApplicationFromSaved(app_to_remove);
- }
+ // Just to terminate RAI in case of connection is dropped (rare case)
+ // App won't be unregistered since RAI has not been started yet
+ SDL_LOG_DEBUG("Trying to terminate possible RAI request.");
+ request_ctrl_.terminateAppRequests(app_id);
- if (IsAppSubscribedForWayPoints(app_id)) {
- UnsubscribeAppFromWayPoints(app_id);
- if (!IsAnyAppSubscribedForWayPoints()) {
- SDL_LOG_DEBUG("Send UnsubscribeWayPoints");
- auto request = MessageHelper::CreateUnsubscribeWayPointsRequest(
- GetNextHMICorrelationID());
- rpc_service_->ManageHMICommand(request);
- }
- }
+ return;
+ }
- (hmi_capabilities_->get_hmi_language_handler())
- .OnUnregisterApplication(app_id);
+ resume_controller().RemoveFromResumption(app_id);
- if (connection_handler().GetDeviceID(app_to_remove->mac_address(),
- &handle)) {
- AppV4DevicePredicate finder(handle);
- ApplicationSharedPtr app = FindApp(applications(), finder);
- if (!app) {
- SDL_LOG_DEBUG(
- "There is no more SDL4 apps with device handle: " << handle);
+ if (is_resuming) {
+ resume_controller().SaveApplication(app_to_remove);
+ } else {
+ resume_controller().RemoveApplicationFromSaved(app_to_remove);
+ }
- RemoveAppsWaitingForRegistration(handle);
- }
+ if (IsAppSubscribedForWayPoints(app_id)) {
+ UnsubscribeAppFromWayPoints(app_id, true);
+ if (!IsAnyAppSubscribedForWayPoints()) {
+ SDL_LOG_DEBUG("Send UnsubscribeWayPoints");
+ auto request = MessageHelper::CreateUnsubscribeWayPointsRequest(
+ GetNextHMICorrelationID());
+ rpc_service_->ManageHMICommand(request);
}
+ }
- MessageHelper::SendOnAppUnregNotificationToHMI(
- app_to_remove, is_unexpected_disconnect, *this);
- commands_holder_->Clear(app_to_remove);
+ (hmi_capabilities_->get_hmi_language_handler())
+ .OnUnregisterApplication(app_id);
- const auto enabled_local_apps = policy_handler_->GetEnabledLocalApps();
- if (helpers::in_range(enabled_local_apps, app_to_remove->policy_app_id())) {
+ if (connection_handler().GetDeviceID(app_to_remove->mac_address(), &handle)) {
+ AppV4DevicePredicate finder(handle);
+ ApplicationSharedPtr app = FindApp(applications(), finder);
+ if (!app) {
SDL_LOG_DEBUG(
- "Enabled local app has been unregistered. Re-create "
- "pending application");
- CreatePendingLocalApplication(app_to_remove->policy_app_id());
+ "There is no more SDL4 apps with device handle: " << handle);
+
+ RemoveAppsWaitingForRegistration(handle);
}
+ }
- RefreshCloudAppInformation();
- SendUpdateAppList();
+ MessageHelper::SendOnAppUnregNotificationToHMI(
+ app_to_remove, is_unexpected_disconnect, *this);
+ commands_holder_->Clear(app_to_remove);
+
+ const auto enabled_local_apps = policy_handler_->GetEnabledLocalApps();
+ if (helpers::in_range(enabled_local_apps, app_to_remove->policy_app_id())) {
+ SDL_LOG_DEBUG(
+ "Enabled local app has been unregistered. Re-create "
+ "pending application");
+ CreatePendingLocalApplication(app_to_remove->policy_app_id());
}
+ RefreshCloudAppInformation();
+ SendUpdateAppList();
+
if (EndAudioPassThru(app_id)) {
// May be better to put this code in MessageHelper?
StopAudioPassThru(app_id);
@@ -3583,6 +3609,27 @@ void ApplicationManagerImpl::ForbidStreaming(
}
void ApplicationManagerImpl::OnAppStreaming(
+ uint32_t app_id, protocol_handler::ServiceType service_type, bool state) {
+ SDL_LOG_AUTO_TRACE();
+
+ ApplicationSharedPtr app = application(app_id);
+ if (!app || (!app->is_navi() && !app->mobile_projection_enabled())) {
+ SDL_LOG_DEBUG(
+ " There is no navi or projection application with id: " << app_id);
+ return;
+ }
+ DCHECK_OR_RETURN_VOID(media_manager_);
+
+ if (state) {
+ state_ctrl_.OnVideoStreamingStarted(app);
+ media_manager_->StartStreaming(app_id, service_type);
+ } else {
+ media_manager_->StopStreaming(app_id, service_type);
+ state_ctrl_.OnVideoStreamingStopped(app);
+ }
+}
+
+void ApplicationManagerImpl::OnAppStreaming(
uint32_t app_id,
protocol_handler::ServiceType service_type,
const Application::StreamingState new_state) {
@@ -4132,7 +4179,17 @@ bool ApplicationManagerImpl::IsHMICooperating() const {
}
void ApplicationManagerImpl::SetHMICooperating(const bool hmi_cooperating) {
+ SDL_LOG_AUTO_TRACE();
+ sync_primitives::AutoLock lock(wait_for_hmi_lock_);
hmi_cooperating_ = hmi_cooperating;
+ wait_for_hmi_condvar_.Broadcast();
+}
+
+void ApplicationManagerImpl::InitiateStopping() {
+ SDL_LOG_AUTO_TRACE();
+ sync_primitives::AutoLock lock(wait_for_hmi_lock_);
+ is_stopping_.store(true);
+ wait_for_hmi_condvar_.Broadcast();
}
void ApplicationManagerImpl::OnApplicationListUpdateTimer() {
@@ -4266,6 +4323,10 @@ ResetGlobalPropertiesResult ApplicationManagerImpl::ResetGlobalProperties(
result.keyboard_properties = true;
break;
}
+ case mobile_apis::GlobalProperty::USER_LOCATION: {
+ result.user_location = true;
+ break;
+ }
default: {
SDL_LOG_TRACE("Unknown global property: " << global_property);
break;
@@ -4316,7 +4377,9 @@ ApplicationManagerImpl::CreateAllAppGlobalPropsIDList(
if (application->keyboard_props()) {
(*global_properties)[i++] = GlobalProperty::KEYBOARDPROPERTIES;
}
-
+ if (!application->get_user_location().empty()) {
+ (*global_properties)[i++] = GlobalProperty::USER_LOCATION;
+ }
return global_properties;
}
@@ -4725,42 +4788,69 @@ bool ApplicationManagerImpl::IsAppSubscribedForWayPoints(
return IsAppSubscribedForWayPoints(app.app_id());
}
-void ApplicationManagerImpl::SubscribeAppForWayPoints(uint32_t app_id) {
+void ApplicationManagerImpl::SubscribeAppForWayPoints(uint32_t app_id,
+ bool response_from_hmi) {
SDL_LOG_AUTO_TRACE();
sync_primitives::AutoLock lock(subscribed_way_points_apps_lock_);
SDL_LOG_DEBUG("Subscribing " << app_id);
subscribed_way_points_apps_list_.insert(app_id);
+ if (response_from_hmi) {
+ subscribed_to_hmi_way_points_ = true;
+ }
SDL_LOG_DEBUG("There are applications subscribed: "
<< subscribed_way_points_apps_list_.size());
- if (way_points_data_) {
- smart_objects::SmartObjectSPtr way_point_notification_ =
- std::make_shared<smart_objects::SmartObject>(*way_points_data_);
- (*way_point_notification_)[strings::params][strings::connection_key] =
+ if (GetAppServiceManager().FindWayPointsHandler() != nullptr) {
+ auto service = GetAppServiceManager().ActiveServiceForType(
+ EnumToString(mobile_apis::AppServiceType::NAVIGATION));
+ auto it = mobile_way_points_data_.find(service->connection_key);
+ if (mobile_way_points_data_.end() == it) {
+ SDL_LOG_DEBUG("No waypoint data provided by app service provider yet");
+ return;
+ }
+ smart_objects::SmartObjectSPtr way_point_notification =
+ std::make_shared<smart_objects::SmartObject>(it->second);
+ (*way_point_notification)[strings::params][strings::connection_key] =
+ app_id;
+ GetRPCService().SendMessageToMobile(way_point_notification);
+ } else if (hmi_way_points_data_) {
+ smart_objects::SmartObjectSPtr way_point_notification =
+ std::make_shared<smart_objects::SmartObject>(*hmi_way_points_data_);
+ (*way_point_notification)[strings::params][strings::connection_key] =
app_id;
- GetRPCService().SendMessageToMobile(way_point_notification_);
+ GetRPCService().SendMessageToMobile(way_point_notification);
}
}
-void ApplicationManagerImpl::SubscribeAppForWayPoints(
- ApplicationSharedPtr app) {
- SubscribeAppForWayPoints(app->app_id());
+void ApplicationManagerImpl::SubscribeAppForWayPoints(ApplicationSharedPtr app,
+ bool response_from_hmi) {
+ SubscribeAppForWayPoints(app->app_id(), response_from_hmi);
}
-void ApplicationManagerImpl::UnsubscribeAppFromWayPoints(uint32_t app_id) {
+void ApplicationManagerImpl::UnsubscribeAppFromWayPoints(
+ uint32_t app_id, bool response_from_hmi) {
SDL_LOG_AUTO_TRACE();
sync_primitives::AutoLock lock(subscribed_way_points_apps_lock_);
SDL_LOG_DEBUG("Unsubscribing " << app_id);
subscribed_way_points_apps_list_.erase(app_id);
+ if (response_from_hmi) {
+ subscribed_to_hmi_way_points_ = false;
+ }
SDL_LOG_DEBUG("There are applications subscribed: "
<< subscribed_way_points_apps_list_.size());
if (subscribed_way_points_apps_list_.empty()) {
- way_points_data_.reset();
+ hmi_way_points_data_.reset();
+ mobile_way_points_data_.clear();
}
}
void ApplicationManagerImpl::UnsubscribeAppFromWayPoints(
- ApplicationSharedPtr app) {
- UnsubscribeAppFromWayPoints(app->app_id());
+ ApplicationSharedPtr app, bool response_from_hmi) {
+ UnsubscribeAppFromWayPoints(app->app_id(), response_from_hmi);
+}
+
+bool ApplicationManagerImpl::IsSubscribedToHMIWayPoints() const {
+ SDL_LOG_AUTO_TRACE();
+ return subscribed_to_hmi_way_points_;
}
bool ApplicationManagerImpl::IsAnyAppSubscribedForWayPoints() const {
@@ -4772,9 +4862,17 @@ bool ApplicationManagerImpl::IsAnyAppSubscribedForWayPoints() const {
}
void ApplicationManagerImpl::SaveWayPointsMessage(
- std::shared_ptr<smart_objects::SmartObject> way_points_message) {
+ std::shared_ptr<smart_objects::SmartObject> way_points_message,
+ uint32_t app_id) {
sync_primitives::AutoLock lock(subscribed_way_points_apps_lock_);
- way_points_data_ = way_points_message;
+ // Notification from HMI
+ if (0 == app_id) {
+ hmi_way_points_data_ = way_points_message;
+ }
+ // Notification from app service provider
+ else {
+ mobile_way_points_data_[app_id] = *way_points_message;
+ }
}
const std::set<uint32_t> ApplicationManagerImpl::GetAppsSubscribedForWayPoints()
@@ -4890,6 +4988,23 @@ bool ApplicationManagerImpl::IsSOStructValid(
return false;
}
+bool ApplicationManagerImpl::UnsubscribeAppFromSoftButtons(
+ const commands::MessageSharedPtr response) {
+ using namespace mobile_apis;
+
+ const uint32_t connection_key =
+ (*response)[strings::params][strings::connection_key].asUInt();
+ const auto function_id = static_cast<FunctionID::eType>(
+ (*response)[strings::params][strings::function_id].asInt());
+
+ ApplicationSharedPtr app = application(connection_key);
+ DCHECK_OR_RETURN(app, false);
+ app->UnsubscribeFromSoftButtons(function_id);
+ SDL_LOG_DEBUG("Application has unsubscribed from softbuttons. FunctionID: "
+ << function_id << ", app_id:" << app->app_id());
+ return true;
+}
+
#ifdef BUILD_TESTS
void ApplicationManagerImpl::AddMockApplication(ApplicationSharedPtr mock_app) {
applications_list_lock_ptr_->Acquire();
diff --git a/src/components/application_manager/src/display_capabilities_builder.cc b/src/components/application_manager/src/display_capabilities_builder.cc
index e0d486ab14..2988d53471 100644
--- a/src/components/application_manager/src/display_capabilities_builder.cc
+++ b/src/components/application_manager/src/display_capabilities_builder.cc
@@ -157,7 +157,8 @@ bool DisplayCapabilitiesBuilder::IsWaitingForWindowCapabilities(
void DisplayCapabilitiesBuilder::ResetDisplayCapabilities() {
SDL_LOG_AUTO_TRACE();
sync_primitives::AutoLock lock(display_capabilities_lock_);
- for (auto& window_id : window_ids_to_resume_) {
+ auto window_ids = window_ids_to_resume_;
+ for (auto& window_id : window_ids) {
if (kDefaultWindowID != window_id) {
window_ids_to_resume_.erase(window_id);
}
diff --git a/src/components/application_manager/src/helpers/application_helper.cc b/src/components/application_manager/src/helpers/application_helper.cc
index 488ee4aca0..74810d7e09 100644
--- a/src/components/application_manager/src/helpers/application_helper.cc
+++ b/src/components/application_manager/src/helpers/application_helper.cc
@@ -9,19 +9,23 @@ namespace {
using namespace application_manager;
void DeleteWayPoints(ApplicationSharedPtr app,
ApplicationManager& app_manager) {
- app_manager.UnsubscribeAppFromWayPoints(app);
- if (!app_manager.IsAnyAppSubscribedForWayPoints()) {
+ std::set<uint32_t> subscribed_apps =
+ app_manager.GetAppsSubscribedForWayPoints();
+ bool send_unsubscribe =
+ subscribed_apps.size() <= 1 && app_manager.IsSubscribedToHMIWayPoints();
+ if (send_unsubscribe) {
auto request = MessageHelper::CreateUnsubscribeWayPointsRequest(
app_manager.GetNextHMICorrelationID());
app_manager.GetRPCService().ManageHMICommand(request);
}
+ app_manager.UnsubscribeAppFromWayPoints(app, send_unsubscribe);
}
void DeleteCommands(ApplicationSharedPtr app, ApplicationManager& app_manager) {
auto accessor = app->commands_map();
- const auto& commands_map = accessor.GetData();
+ const auto commands_map = accessor.GetData();
- for (const auto& cmd : commands_map) {
+ for (const auto cmd : commands_map) {
auto delete_UI_msg = MessageHelper::CreateDeleteUICommandRequest(
cmd.second, app->app_id(), app_manager.GetNextHMICorrelationID());
app_manager.GetRPCService().ManageHMICommand(delete_UI_msg);
@@ -37,9 +41,9 @@ void DeleteCommands(ApplicationSharedPtr app, ApplicationManager& app_manager) {
void DeleteSubmenus(ApplicationSharedPtr app, ApplicationManager& app_manager) {
auto accessor = app->sub_menu_map();
- const auto& sub_menu_map = accessor.GetData();
+ const auto sub_menu_map = accessor.GetData();
- for (const auto& smenu : sub_menu_map) {
+ for (const auto smenu : sub_menu_map) {
MessageHelper::SendDeleteSubmenuRequest(smenu.second, app, app_manager);
app->RemoveSubMenu(smenu.first);
}
@@ -48,9 +52,9 @@ void DeleteSubmenus(ApplicationSharedPtr app, ApplicationManager& app_manager) {
void DeleteChoiceSets(ApplicationSharedPtr app,
ApplicationManager& app_manager) {
auto accessor = app->choice_set_map();
- const auto& choices = accessor.GetData();
+ const auto choices = accessor.GetData();
- for (const auto& choice : choices) {
+ for (const auto choice : choices) {
MessageHelper::SendDeleteChoiceSetRequest(choice.second, app, app_manager);
app->RemoveChoiceSet(choice.first);
}
diff --git a/src/components/application_manager/src/hmi_capabilities_impl.cc b/src/components/application_manager/src/hmi_capabilities_impl.cc
index 1390a3ae2c..f313e0c0a5 100644
--- a/src/components/application_manager/src/hmi_capabilities_impl.cc
+++ b/src/components/application_manager/src/hmi_capabilities_impl.cc
@@ -126,6 +126,13 @@ HMICapabilitiesImpl::HMICapabilitiesImpl(ApplicationManager& app_mngr)
is_ivi_cooperating_ = true;
is_rc_cooperating_ = true;
}
+ requests_required_for_capabilities_ = {
+ hmi_apis::FunctionID::VehicleInfo_IsReady,
+ hmi_apis::FunctionID::VR_IsReady,
+ hmi_apis::FunctionID::TTS_IsReady,
+ hmi_apis::FunctionID::UI_IsReady,
+ hmi_apis::FunctionID::RC_IsReady,
+ hmi_apis::FunctionID::Navigation_IsReady};
}
HMICapabilitiesImpl::~HMICapabilitiesImpl() {}
@@ -1860,6 +1867,15 @@ const std::string& HMICapabilitiesImpl::ccpu_version() const {
return ccpu_version_;
}
+void HMICapabilitiesImpl::set_hardware_version(
+ const std::string& hardware_version) {
+ hardware_version_ = hardware_version;
+}
+
+const std::string& HMICapabilitiesImpl::hardware_version() const {
+ return hardware_version_;
+}
+
void HMICapabilitiesImpl::convert_json_languages_to_obj(
const Json::Value& json_languages,
smart_objects::SmartObject& languages) const {
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 ba1c726415..b25e07c8f3 100644
--- a/src/components/application_manager/src/message_helper/message_helper.cc
+++ b/src/components/application_manager/src/message_helper/message_helper.cc
@@ -53,6 +53,7 @@
#include "application_manager/message_helper.h"
#include "application_manager/policies/policy_handler_interface.h"
#include "application_manager/resumption/resume_ctrl.h"
+#include "application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_module_constants.h"
#include "application_manager/rpc_service.h"
#include "connection_handler/connection_handler_impl.h"
#include "interfaces/MOBILE_API.h"
@@ -183,6 +184,8 @@ std::pair<std::string, mobile_apis::VehicleDataType::eType>
std::make_pair(
strings::cloud_app_vehicle_id,
mobile_apis::VehicleDataType::VEHICLEDATA_CLOUDAPPVEHICLEID),
+ std::make_pair(strings::climate_data,
+ mobile_apis::VehicleDataType::VEHICLEDATA_CLIMATEDATA),
std::make_pair(strings::external_temp,
mobile_apis::VehicleDataType::VEHICLEDATA_EXTERNTEMP),
std::make_pair(strings::turn_signal,
@@ -246,6 +249,8 @@ std::pair<std::string, mobile_apis::VehicleDataType::eType>
mobile_apis::VehicleDataType::VEHICLEDATA_ENGINEOILLIFE),
std::make_pair(strings::window_status,
mobile_apis::VehicleDataType::VEHICLEDATA_WINDOWSTATUS),
+ std::make_pair(strings::seat_occupancy,
+ mobile_apis::VehicleDataType::VEHICLEDATA_SEATOCCUPANCY),
std::make_pair(
strings::hands_off_steering,
mobile_apis::VehicleDataType::VEHICLEDATA_HANDSOFFSTEERING)};
@@ -392,18 +397,23 @@ MessageHelper::CreateUIResetGlobalPropertiesRequest(
}
if (reset_result.keyboard_properties) {
- smart_objects::SmartObject key_board_properties =
+ smart_objects::SmartObject keyboard_properties =
smart_objects::SmartObject(smart_objects::SmartType_Map);
- key_board_properties[strings::language] =
+ keyboard_properties[strings::language] =
static_cast<int32_t>(hmi_apis::Common_Language::EN_US);
- key_board_properties[hmi_request::keyboard_layout] =
+ keyboard_properties[hmi_request::keyboard_layout] =
static_cast<int32_t>(hmi_apis::Common_KeyboardLayout::QWERTY);
- key_board_properties[hmi_request::auto_complete_list] =
+ keyboard_properties[hmi_request::auto_complete_list] =
smart_objects::SmartObject(smart_objects::SmartType_Array);
+ keyboard_properties[strings::auto_complete_text] = "";
+ keyboard_properties[hmi_request::mask_input_characters] =
+ static_cast<int32_t>(
+ hmi_apis::Common_KeyboardInputMask::DISABLE_INPUT_KEY_MASK);
- key_board_properties[strings::auto_complete_text] = "";
(*ui_reset_global_prop_request)[hmi_request::keyboard_properties] =
- key_board_properties;
+ keyboard_properties;
+ application->set_keyboard_props(
+ smart_objects::SmartObject(smart_objects::SmartType_Null));
}
(*ui_reset_global_prop_request)[strings::app_id] = application->app_id();
@@ -412,6 +422,39 @@ MessageHelper::CreateUIResetGlobalPropertiesRequest(
}
smart_objects::SmartObjectSPtr
+MessageHelper::CreateRCResetGlobalPropertiesRequest(
+ const ResetGlobalPropertiesResult& reset_result,
+ const ApplicationSharedPtr application) {
+ namespace rc = rc_rpc_plugin;
+
+ smart_objects::SmartObjectSPtr rc_reset_global_prop_request =
+ std::make_shared<smart_objects::SmartObject>(
+ smart_objects::SmartType_Map);
+
+ if (reset_result.user_location) {
+ smart_objects::SmartObject user_location =
+ smart_objects::SmartObject(smart_objects::SmartType_Map);
+
+ user_location[rc::strings::kGrid] =
+ smart_objects::SmartObject(smart_objects::SmartType_Map);
+ smart_objects::SmartObject& grid = user_location[rc::strings::kGrid];
+ grid[rc::strings::kRow] = 0;
+ grid[rc::strings::kCol] = 0;
+ grid[rc::strings::kLevel] = 0;
+ grid[rc::strings::kRowspan] = 1;
+ grid[rc::strings::kColspan] = 1;
+ grid[rc::strings::kLevelspan] = 1;
+
+ (*rc_reset_global_prop_request)[strings::user_location] = user_location;
+ application->set_user_location(user_location);
+ }
+
+ (*rc_reset_global_prop_request)[strings::app_id] = application->app_id();
+
+ return rc_reset_global_prop_request;
+}
+
+smart_objects::SmartObjectSPtr
MessageHelper::CreateDisplayCapabilityUpdateToMobile(
const smart_objects::SmartObject& display_capabilities, Application& app) {
SDL_LOG_AUTO_TRACE();
@@ -1244,38 +1287,38 @@ MessageHelper::CreateGlobalPropertiesRequestsToHMI(
// UI global properties
- if (can_send_ui && (app->vr_help_title() || app->vr_help())) {
+ if (can_send_ui &&
+ (app->vr_help_title() || app->vr_help() || app->keyboard_props() ||
+ app->menu_title() || app->menu_icon())) {
smart_objects::SmartObjectSPtr ui_global_properties = CreateMessageForHMI(
hmi_apis::messageType::request, app_mngr.GetNextHMICorrelationID());
- if (!ui_global_properties) {
- return requests;
- }
-
- (*ui_global_properties)[strings::params][strings::function_id] =
- static_cast<int>(hmi_apis::FunctionID::UI_SetGlobalProperties);
+ if (ui_global_properties) {
+ (*ui_global_properties)[strings::params][strings::function_id] =
+ static_cast<int>(hmi_apis::FunctionID::UI_SetGlobalProperties);
- smart_objects::SmartObject ui_msg_params =
- smart_objects::SmartObject(smart_objects::SmartType_Map);
- if (app->vr_help_title()) {
- ui_msg_params[strings::vr_help_title] = (*app->vr_help_title());
- }
- if (app->vr_help()) {
- ui_msg_params[strings::vr_help] = (*app->vr_help());
- }
- if (app->keyboard_props()) {
- ui_msg_params[strings::keyboard_properties] = (*app->keyboard_props());
- }
- if (app->menu_title()) {
- ui_msg_params[strings::menu_title] = (*app->menu_title());
- }
- if (app->menu_icon()) {
- ui_msg_params[strings::menu_icon] = (*app->menu_icon());
- }
- ui_msg_params[strings::app_id] = app->app_id();
+ smart_objects::SmartObject ui_msg_params =
+ smart_objects::SmartObject(smart_objects::SmartType_Map);
+ if (app->vr_help_title()) {
+ ui_msg_params[strings::vr_help_title] = (*app->vr_help_title());
+ }
+ if (app->vr_help()) {
+ ui_msg_params[strings::vr_help] = (*app->vr_help());
+ }
+ if (app->keyboard_props()) {
+ ui_msg_params[strings::keyboard_properties] = (*app->keyboard_props());
+ }
+ if (app->menu_title()) {
+ ui_msg_params[strings::menu_title] = (*app->menu_title());
+ }
+ if (app->menu_icon()) {
+ ui_msg_params[strings::menu_icon] = (*app->menu_icon());
+ }
+ ui_msg_params[strings::app_id] = app->app_id();
- (*ui_global_properties)[strings::msg_params] = ui_msg_params;
+ (*ui_global_properties)[strings::msg_params] = ui_msg_params;
- requests.push_back(ui_global_properties);
+ requests.push_back(ui_global_properties);
+ }
}
const bool can_send_vr = helpers::
@@ -1289,27 +1332,46 @@ MessageHelper::CreateGlobalPropertiesRequestsToHMI(
uint32_t correlation_id = app_mngr.GetNextHMICorrelationID();
smart_objects::SmartObjectSPtr tts_global_properties =
CreateMessageForHMI(hmi_apis::messageType::request, correlation_id);
- if (!tts_global_properties) {
- return requests;
- }
+ if (tts_global_properties) {
+ (*tts_global_properties)[strings::params][strings::function_id] =
+ static_cast<int>(hmi_apis::FunctionID::TTS_SetGlobalProperties);
- (*tts_global_properties)[strings::params][strings::function_id] =
- static_cast<int>(hmi_apis::FunctionID::TTS_SetGlobalProperties);
+ smart_objects::SmartObject tts_msg_params =
+ smart_objects::SmartObject(smart_objects::SmartType_Map);
+ if (app->help_prompt()) {
+ tts_msg_params[strings::help_prompt] = (*app->help_prompt());
+ }
+ if (app->timeout_prompt()) {
+ tts_msg_params[strings::timeout_prompt] = (*app->timeout_prompt());
+ }
+ tts_msg_params[strings::app_id] = app->app_id();
- smart_objects::SmartObject tts_msg_params =
- smart_objects::SmartObject(smart_objects::SmartType_Map);
- if (app->help_prompt()) {
- tts_msg_params[strings::help_prompt] = (*app->help_prompt());
- }
- if (app->timeout_prompt()) {
- tts_msg_params[strings::timeout_prompt] = (*app->timeout_prompt());
+ (*tts_global_properties)[strings::msg_params] = tts_msg_params;
+
+ requests.push_back(tts_global_properties);
}
- tts_msg_params[strings::app_id] = app->app_id();
+ }
- (*tts_global_properties)[strings::msg_params] = tts_msg_params;
+ // RC global properties
+ if (!app->get_user_location().empty()) {
+ smart_objects::SmartObjectSPtr rc_global_properties = CreateMessageForHMI(
+ hmi_apis::messageType::request, app_mngr.GetNextHMICorrelationID());
+ if (rc_global_properties) {
+ (*rc_global_properties)[strings::params][strings::function_id] =
+ static_cast<int>(hmi_apis::FunctionID::RC_SetGlobalProperties);
+
+ smart_objects::SmartObject rc_msg_params =
+ smart_objects::SmartObject(smart_objects::SmartType_Map);
+
+ rc_msg_params[strings::user_location] = (app->get_user_location());
+ rc_msg_params[strings::app_id] = app->app_id();
- requests.push_back(tts_global_properties);
+ (*rc_global_properties)[strings::msg_params] = rc_msg_params;
+
+ requests.push_back(rc_global_properties);
+ }
}
+
return requests;
}
@@ -3365,16 +3427,20 @@ void MessageHelper::SubscribeApplicationToSoftButton(
ApplicationSharedPtr app,
int32_t function_id,
const WindowID window_id) {
- SoftButtonID softbuttons_id;
- smart_objects::SmartObject& soft_buttons =
- message_params[strings::soft_buttons];
- unsigned int length = soft_buttons.length();
- for (unsigned int i = 0; i < length; ++i) {
- const auto button_id = std::make_pair(
- soft_buttons[i][strings::soft_button_id].asUInt(), window_id);
- softbuttons_id.insert(button_id);
- }
- app->SubscribeToSoftButtons(function_id, softbuttons_id);
+ if (!message_params.keyExists(strings::soft_buttons)) {
+ return;
+ }
+
+ std::set<uint32_t> soft_buttons;
+
+ auto& soft_buttons_so = message_params[strings::soft_buttons];
+ for (const auto& softbutton : *(soft_buttons_so.asArray())) {
+ const auto button_id = softbutton[strings::soft_button_id].asUInt();
+ soft_buttons.insert(button_id);
+ }
+
+ WindowSoftButtons window_buttons{window_id, soft_buttons};
+ app->SubscribeToSoftButtons(function_id, window_buttons);
}
void MessageHelper::SubscribeApplicationToSoftButton(
diff --git a/src/components/application_manager/src/policies/policy_handler.cc b/src/components/application_manager/src/policies/policy_handler.cc
index b61a75d7de..bacd478138 100644
--- a/src/components/application_manager/src/policies/policy_handler.cc
+++ b/src/components/application_manager/src/policies/policy_handler.cc
@@ -600,6 +600,10 @@ void PolicyHandler::OnDeviceConsentChanged(const std::string& device_id,
policy_manager->SendNotificationOnPermissionsUpdated(device_id,
policy_app_id);
+
+ if (policy_manager->IsPredataPolicy(policy_app_id) && !is_allowed) {
+ SetHeartBeatTimeout(policy_app_id, (*it_app_list)->app_id());
+ }
}
}
}
@@ -767,6 +771,23 @@ void PolicyHandler::OnAppPermissionConsentInternal(
#endif
}
+void PolicyHandler::SetHeartBeatTimeout(const std::string& policy_app_id,
+ const uint32_t app_id) {
+ SDL_LOG_AUTO_TRACE();
+
+ const std::shared_ptr<PolicyManager> policy_manager = LoadPolicyManager();
+ POLICY_LIB_CHECK_VOID(policy_manager);
+
+ const uint32_t timeout = policy_manager->HeartBeatTimeout(policy_app_id);
+ if (0 != timeout) {
+ SDL_LOG_DEBUG("SetHeartBeatTimeout for " << app_id << " is " << timeout);
+ application_manager_.connection_handler().SetHeartBeatTimeout(app_id,
+ timeout);
+ } else {
+ SDL_LOG_DEBUG("SetHeartBeatTimeout for " << app_id << " ignored");
+ }
+}
+
void policy::PolicyHandler::SetDaysAfterEpoch() {
const auto policy_manager = LoadPolicyManager();
POLICY_LIB_CHECK_VOID(policy_manager);
@@ -817,7 +838,7 @@ void PolicyHandler::OnSystemRequestReceived() const {
}
void PolicyHandler::TriggerPTUOnStartupIfRequired() {
-#ifdef PROPRIETARY_MODE
+#if defined(PROPRIETARY_MODE) || defined(EXTERNAL_PROPRIETARY_MODE)
const auto policy_manager = LoadPolicyManager();
POLICY_LIB_CHECK_VOID(policy_manager);
policy_manager->TriggerPTUOnStartupIfRequired();
@@ -1076,6 +1097,14 @@ void PolicyHandler::OnGetSystemInfo(const std::string& ccpu_version,
policy_manager->SetSystemInfo(ccpu_version, wers_country_code, language);
}
+void PolicyHandler::OnHardwareVersionReceived(
+ const std::string& hardware_version) {
+ SDL_LOG_AUTO_TRACE();
+ const auto policy_manager = LoadPolicyManager();
+ POLICY_LIB_CHECK_VOID(policy_manager);
+ policy_manager->SetHardwareVersion(hardware_version);
+}
+
std::string PolicyHandler::GetCCPUVersionFromPT() const {
SDL_LOG_AUTO_TRACE();
const auto policy_manager = LoadPolicyManager();
@@ -1083,6 +1112,13 @@ std::string PolicyHandler::GetCCPUVersionFromPT() const {
return policy_manager->GetCCPUVersionFromPT();
}
+std::string PolicyHandler::GetHardwareVersionFromPT() const {
+ SDL_LOG_AUTO_TRACE();
+ const auto policy_manager = LoadPolicyManager();
+ POLICY_LIB_CHECK_OR_RETURN(policy_manager, std::string());
+ return policy_manager->GetHardwareVersionFromPT();
+}
+
void PolicyHandler::OnVIIsReady() {
SDL_LOG_AUTO_TRACE();
const uint32_t correlation_id =
@@ -1359,7 +1395,6 @@ void PolicyHandler::OnAllowSDLFunctionalityNotification(
}
#ifdef EXTERNAL_PROPRIETARY_MODE
-
ApplicationSet applications;
{
DataAccessor<ApplicationSet> accessor =
@@ -1405,7 +1440,6 @@ void PolicyHandler::OnAllowSDLFunctionalityNotification(
}
#ifdef EXTERNAL_PROPRIETARY_MODE
-
if (last_activated_app_id_) {
ApplicationSharedPtr app =
application_manager_.application(last_activated_app_id_);
@@ -1416,7 +1450,14 @@ void PolicyHandler::OnAllowSDLFunctionalityNotification(
<< "' not found among registered applications.");
return;
}
- if (is_allowed) {
+
+ bool is_allowed_by_policies = true;
+ if (PolicyEnabled()) {
+ is_allowed_by_policies =
+ !policy_manager->IsApplicationRevoked(app->policy_app_id());
+ }
+
+ if (is_allowed && is_allowed_by_policies) {
// Send HMI status notification to mobile
// Put application in full
AudioStreamingState::eType audio_state =
@@ -1489,7 +1530,9 @@ void PolicyHandler::OnActivateApp(uint32_t connection_key,
// is not allowed.
if (!permissions.isSDLAllowed) {
permissions.priority.clear();
- last_activated_app_id_ = connection_key;
+ if (!permissions.appRevoked) {
+ last_activated_app_id_ = connection_key;
+ }
}
if (permissions.appRevoked) {
diff --git a/src/components/application_manager/src/resumption/resume_ctrl_impl.cc b/src/components/application_manager/src/resumption/resume_ctrl_impl.cc
index 6a045fda03..bc373d48c9 100644
--- a/src/components/application_manager/src/resumption/resume_ctrl_impl.cc
+++ b/src/components/application_manager/src/resumption/resume_ctrl_impl.cc
@@ -514,16 +514,30 @@ void ResumeCtrlImpl::StartAppHmiStateResumption(
const bool is_resume_allowed_by_low_voltage =
CheckLowVoltageRestrictions(saved_app);
- const bool is_hmi_level_allowed_by_ign_cycle =
- CheckIgnCycleRestrictions(saved_app);
-
+ const time_t sdl_launch_time = LaunchTime();
+ const bool is_unexpected_disconnect_in_current_ign_cycle =
+ sdl_launch_time < saved_app[strings::time_stamp].asInt();
+ SDL_LOG_DEBUG("sdl_launch_time: " << sdl_launch_time
+ << ", App disconnect time: "
+ << saved_app[strings::time_stamp].asInt());
const bool is_app_revoked =
application_manager_.GetPolicyHandler().IsApplicationRevoked(
application->policy_app_id());
- const bool restore_hmi_level_allowed = is_resume_allowed_by_low_voltage &&
- is_hmi_level_allowed_by_ign_cycle &&
- !is_app_revoked;
+ bool restore_hmi_level_allowed = true;
+ if (!is_unexpected_disconnect_in_current_ign_cycle) {
+ const bool is_hmi_level_allowed_by_ign_cycle =
+ CheckIgnCycleRestrictions(saved_app);
+ restore_hmi_level_allowed = is_resume_allowed_by_low_voltage &&
+ is_hmi_level_allowed_by_ign_cycle &&
+ !is_app_revoked;
+ } else {
+ const bool is_resume_app_data_not_expired =
+ !IsAppDataResumptionExpired(saved_app);
+ restore_hmi_level_allowed = is_resume_allowed_by_low_voltage &&
+ is_resume_app_data_not_expired &&
+ !is_app_revoked;
+ }
if (restore_hmi_level_allowed) {
SDL_LOG_INFO("Resume application " << application->policy_app_id());
diff --git a/src/components/application_manager/src/resumption/resumption_data_db.cc b/src/components/application_manager/src/resumption/resumption_data_db.cc
index f00b100913..eedfc48b73 100644
--- a/src/components/application_manager/src/resumption/resumption_data_db.cc
+++ b/src/components/application_manager/src/resumption/resumption_data_db.cc
@@ -37,6 +37,7 @@
#include "application_manager/message_helper.h"
#include "application_manager/resumption/resumption_data_db.h"
#include "application_manager/resumption/resumption_sql_queries.h"
+#include "application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_module_constants.h"
#include "application_manager/smart_object_keys.h"
#include "utils/gen_hash.h"
#include "utils/helpers.h"
@@ -326,6 +327,12 @@ bool ResumptionDataDB::GetSavedApplication(
SDL_LOG_ERROR("Problem with restoring of global properties data");
return false;
}
+
+ if (!SelectUserLocationData(policy_app_id, device_id, saved_app)) {
+ SDL_LOG_ERROR("Problem with restoring of user location data");
+ return false;
+ }
+
SDL_LOG_INFO("Application data were successfully fetched from data base");
return true;
}
@@ -762,6 +769,9 @@ bool ResumptionDataDB::DropAppDataResumption(const std::string& device_id,
if (!DeleteSavedGlobalProperties(app_id, device_id)) {
return false;
}
+ if (!DeleteUserLocation(app_id, device_id)) {
+ return false;
+ }
if (!UpdateGrammarID(app_id, device_id, 0)) {
return false;
}
@@ -1006,6 +1016,58 @@ bool ResumptionDataDB::SelectSubscriptionsData(
return true;
}
+bool ResumptionDataDB::SelectUserLocationData(
+ const std::string& policy_app_id,
+ const std::string& device_id,
+ smart_objects::SmartObject& saved_app) const {
+ SDL_LOG_AUTO_TRACE();
+ using namespace app_mngr;
+ using namespace smart_objects;
+ uint32_t count_item = 0;
+ if (!SelectCountFromArray(
+ count_item, kSelectCountUserLocation, policy_app_id, device_id)) {
+ SDL_LOG_ERROR("Select query has been failed");
+ return false;
+ }
+
+ if (0 == count_item) {
+ SDL_LOG_DEBUG("Application does not contain user_location data");
+ return true;
+ }
+ utils::dbms::SQLQuery select_user_location(db());
+ if (!PrepareSelectQuery(select_user_location,
+ policy_app_id,
+ device_id,
+ kSelectUserLocation)) {
+ SDL_LOG_ERROR("Failed to prepare user location select query");
+ return false;
+ }
+
+ if (!select_user_location.Exec()) {
+ SDL_LOG_ERROR("Failed to execute user location select query");
+ return false;
+ }
+ /* Position of data in "select_user_location" :
+ field "col" from table "applicationUserLocation" = 0
+ field "colspan" from table "applicationUserLocation" = 1
+ field "level" from table "applicationUserLocation" = 2
+ field "levelspan" from table "applicationUserLocation" = 3
+ field "row" from table "applicationUserLocation" = 4
+ field "rowspan" from table "applicationUserLocation" = 5*/
+ smart_objects::SmartObject grid =
+ smart_objects::SmartObject(smart_objects::SmartType_Map);
+ grid[rc_rpc_plugin::strings::kCol] = select_user_location.GetInteger(0);
+ grid[rc_rpc_plugin::strings::kColspan] = select_user_location.GetInteger(1);
+ grid[rc_rpc_plugin::strings::kLevel] = select_user_location.GetInteger(2);
+ grid[rc_rpc_plugin::strings::kLevelspan] = select_user_location.GetInteger(3);
+ grid[rc_rpc_plugin::strings::kRow] = select_user_location.GetInteger(4);
+ grid[rc_rpc_plugin::strings::kRowspan] = select_user_location.GetInteger(5);
+
+ saved_app[strings::user_location][rc_rpc_plugin::strings::kGrid] = grid;
+
+ return true;
+}
+
bool ResumptionDataDB::SelectChoiceSetData(
const std::string& policy_app_id,
const std::string& device_id,
@@ -1519,6 +1581,18 @@ bool ResumptionDataDB::DeleteSavedSubscriptions(
return true;
}
+bool ResumptionDataDB::DeleteUserLocation(const std::string& policy_app_id,
+ const std::string& device_id) {
+ SDL_LOG_AUTO_TRACE();
+
+ if (!ExecQueryToDeleteData(
+ policy_app_id, device_id, kDeleteApplicationUserLocation)) {
+ SDL_LOG_WARN("Incorrect delete from applicationUserLocation.");
+ return false;
+ }
+ return true;
+}
+
bool ResumptionDataDB::DeleteSavedCommands(const std::string& policy_app_id,
const std::string& device_id) {
SDL_LOG_AUTO_TRACE();
@@ -1914,6 +1988,12 @@ bool ResumptionDataDB::SaveApplicationToDB(
db_->RollbackTransaction();
return false;
}
+ if (!InsertUserLocationData(application->get_user_location(),
+ application_primary_key)) {
+ SDL_LOG_WARN("Incorrect insert user location to DB.");
+ db_->RollbackTransaction();
+ return false;
+ }
db_->CommitTransaction();
return true;
}
@@ -1973,6 +2053,12 @@ bool ResumptionDataDB::SaveApplicationToDB(
db_->RollbackTransaction();
return false;
}
+ if (!InsertUserLocationData(application["userLocation"],
+ application_primary_key)) {
+ SDL_LOG_WARN("Incorrect insert userLocation to DB.");
+ db_->RollbackTransaction();
+ return false;
+ }
db_->CommitTransaction();
return true;
}
@@ -2222,6 +2308,58 @@ bool ResumptionDataDB::InsertChoiceSetData(
return true;
}
+bool ResumptionDataDB::InsertUserLocationData(
+ const smart_objects::SmartObject& user_location,
+ int64_t application_primary_key) const {
+ SDL_LOG_AUTO_TRACE();
+ using namespace app_mngr;
+ using namespace smart_objects;
+
+ if (user_location.empty()) {
+ SDL_LOG_DEBUG("Application doesn't contain user location");
+ return true;
+ }
+
+ const auto grid = user_location[rc_rpc_plugin::strings::kGrid];
+ const int32_t col = grid[rc_rpc_plugin::strings::kCol].asInt();
+ const int32_t row = grid[rc_rpc_plugin::strings::kRow].asInt();
+ const int32_t level = grid[rc_rpc_plugin::strings::kLevel].asInt();
+ const int32_t colspan = grid[rc_rpc_plugin::strings::kColspan].asInt();
+ const int32_t rowspan = grid[rc_rpc_plugin::strings::kRowspan].asInt();
+ const int32_t levelspan = grid[rc_rpc_plugin::strings::kLevelspan].asInt();
+
+ utils::dbms::SQLQuery insert_application_user_location(db());
+ if (!insert_application_user_location.Prepare(kInsertUserLocation)) {
+ SDL_LOG_WARN(
+ "Problem with preparation insert "
+ "application user location query");
+ return false;
+ }
+
+ /* Positions of binding data for "insert_application_user_location":
+ field "idApplication" from table "applicationUserLocation" = 0
+ field "col" from table "applicationUserLocation" = 1
+ field "colspan" from table "applicationUserLocation" = 2
+ field "level" from table "applicationUserLocation" = 3
+ field "levelspan" from table "applicationUserLocation" = 4
+ field "row" from table "applicationUserLocation" = 5
+ field "rowspan" from table "applicationUserLocation" = 6*/
+ insert_application_user_location.Bind(0, application_primary_key);
+ insert_application_user_location.Bind(1, col);
+ insert_application_user_location.Bind(2, colspan);
+ insert_application_user_location.Bind(3, level);
+ insert_application_user_location.Bind(4, levelspan);
+ insert_application_user_location.Bind(5, row);
+ insert_application_user_location.Bind(6, rowspan);
+
+ if (!insert_application_user_location.Exec()) {
+ SDL_LOG_WARN("Incorrect insertion of user location");
+ return false;
+ }
+
+ return true;
+}
+
bool ResumptionDataDB::ExecInsertApplicationChoiceSet(
int64_t& choice_set_primary_key,
const smart_objects::SmartObject& choiceset) const {
diff --git a/src/components/application_manager/src/resumption/resumption_data_json.cc b/src/components/application_manager/src/resumption/resumption_data_json.cc
index f3d417d128..1f2d0f116f 100644
--- a/src/components/application_manager/src/resumption/resumption_data_json.cc
+++ b/src/components/application_manager/src/resumption/resumption_data_json.cc
@@ -107,6 +107,9 @@ void ResumptionDataJson::SaveApplication(
json_app[strings::windows_info] = tmp;
json_app[strings::time_stamp] = time_stamp;
json_app[strings::subscribed_for_way_points] = is_subscribed_for_way_points;
+ formatters::CFormatterJsonBase::objToJsonValue(
+ application->get_user_location(), tmp);
+ json_app[strings::user_location] = tmp;
accessor.GetMutableData().set_dictionary(dictionary);
SDL_LOG_DEBUG("SaveApplication : " << json_app.toStyledString());
@@ -557,6 +560,7 @@ bool ResumptionDataJson::DropAppDataResumption(const std::string& device_id,
application[strings::application_global_properties].clear();
application[strings::application_subscriptions].clear();
application[strings::application_files].clear();
+ application[strings::user_location].clear();
application.removeMember(strings::grammar_id);
accessor.GetMutableData().set_dictionary(dictionary);
SDL_LOG_DEBUG("Resumption data for application "
diff --git a/src/components/application_manager/src/resumption/resumption_data_processor_impl.cc b/src/components/application_manager/src/resumption/resumption_data_processor_impl.cc
index 792e7f97ea..dffb1ea094 100644
--- a/src/components/application_manager/src/resumption/resumption_data_processor_impl.cc
+++ b/src/components/application_manager/src/resumption/resumption_data_processor_impl.cc
@@ -29,6 +29,7 @@
#include "application_manager/application_manager.h"
#include "application_manager/commands/command_impl.h"
+#include "application_manager/commands/command_request_impl.h"
#include "application_manager/display_capabilities_builder.h"
#include "application_manager/event_engine/event_observer.h"
#include "application_manager/message_helper.h"
@@ -151,6 +152,8 @@ void ResumptionDataProcessorImpl::ProcessResumptionStatus(
if (IsResponseSuccessful(response)) {
status.successful_requests.push_back(found_request);
} else {
+ SDL_LOG_DEBUG("Resumption request failed");
+ MessageHelper::PrintSmartObject(response);
status.error_requests.push_back(found_request);
}
@@ -534,9 +537,9 @@ void ResumptionDataProcessorImpl::DeleteSubmenus(
application->app_id(), resumption_status_, resumption_status_lock_);
auto accessor = application->sub_menu_map();
- const auto& sub_menu_map = accessor.GetData();
+ const auto sub_menu_map = accessor.GetData();
- for (const auto& smenu : sub_menu_map) {
+ for (const auto smenu : sub_menu_map) {
auto failed_submenu_request =
FindResumptionSubmenuRequest(smenu.first, failed_requests);
if (!failed_submenu_request) {
@@ -627,9 +630,9 @@ void ResumptionDataProcessorImpl::DeleteCommands(
};
auto accessor = application->commands_map();
- const auto& commands_map = accessor.GetData();
+ const auto commands_map = accessor.GetData();
- for (const auto& cmd : commands_map) {
+ for (const auto cmd : commands_map) {
const auto cmd_id = extract_cmd_id(cmd.second);
if (0 == cmd_id) {
SDL_LOG_ERROR("Can't extract cmd_id for command with internal number: "
@@ -719,8 +722,8 @@ void ResumptionDataProcessorImpl::DeleteChoicesets(
application->app_id(), resumption_status_, resumption_status_lock_);
auto accessor = application->choice_set_map();
- const auto& choices = accessor.GetData();
- for (const auto& choice : choices) {
+ const auto choices = accessor.GetData();
+ for (const auto choice : choices) {
auto failed_choice_set =
FindResumptionChoiceSetRequest(choice.first, failed_requests);
if (!failed_choice_set) {
@@ -744,6 +747,10 @@ void ResumptionDataProcessorImpl::SetGlobalProperties(
saved_app[strings::application_global_properties];
application->load_global_properties(properties_so);
+ if (saved_app.keyExists(strings::user_location)) {
+ application->set_user_location(saved_app[strings::user_location]);
+ }
+
ProcessMessagesToHMI(MessageHelper::CreateGlobalPropertiesRequestsToHMI(
application, application_manager_));
}
@@ -803,6 +810,21 @@ void ResumptionDataProcessorImpl::DeleteGlobalProperties(
(*msg)[strings::msg_params] = *msg_params;
ProcessMessageToHMI(msg, false);
}
+
+ if (result.HasRCPropertiesReset() &&
+ check_if_successful(hmi_apis::FunctionID::RC_SetGlobalProperties)) {
+ smart_objects::SmartObjectSPtr msg_params =
+ MessageHelper::CreateRCResetGlobalPropertiesRequest(result,
+ application);
+ auto msg = MessageHelper::CreateMessageForHMI(
+ hmi_apis::messageType::request,
+ application_manager_.GetNextHMICorrelationID());
+ (*msg)[strings::params][strings::function_id] =
+ hmi_apis::FunctionID::RC_SetGlobalProperties;
+
+ (*msg)[strings::msg_params] = *msg_params;
+ ProcessMessageToHMI(msg, false);
+ }
}
void ResumptionDataProcessorImpl::AddSubscriptions(
@@ -881,7 +903,7 @@ void ResumptionDataProcessorImpl::DeleteButtonsSubscriptions(
SDL_LOG_AUTO_TRACE();
const ButtonSubscriptions button_subscriptions =
application->SubscribedButtons().GetData();
- for (auto& btn : button_subscriptions) {
+ for (auto btn : button_subscriptions) {
const auto hmi_btn = static_cast<hmi_apis::Common_ButtonName::eType>(btn);
if (hmi_apis::Common_ButtonName::CUSTOM_BUTTON == hmi_btn) {
continue;
@@ -973,7 +995,12 @@ void ResumptionDataProcessorImpl::DeletePluginsSubscriptions(
}
bool IsResponseSuccessful(const smart_objects::SmartObject& response) {
- return !response[strings::params].keyExists(strings::error_msg);
+ auto result_code = static_cast<hmi_apis::Common_Result::eType>(
+ response[strings::params][application_manager::hmi_response::code]
+ .asInt());
+
+ return commands::CommandRequestImpl::IsHMIResultSuccess(result_code) ||
+ hmi_apis::Common_Result::UNSUPPORTED_RESOURCE == result_code;
}
void ResumptionDataProcessorImpl::CheckVehicleDataResponse(
@@ -1079,8 +1106,6 @@ void ResumptionDataProcessorImpl::CheckCreateWindowResponse(
const smart_objects::SmartObject& request,
const smart_objects::SmartObject& response) const {
SDL_LOG_AUTO_TRACE();
- const auto correlation_id =
- response[strings::params][strings::correlation_id].asInt();
const auto& msg_params = request[strings::msg_params];
const auto app_id = msg_params[strings::app_id].asInt();
@@ -1093,8 +1118,9 @@ void ResumptionDataProcessorImpl::CheckCreateWindowResponse(
const auto window_id = msg_params[strings::window_id].asInt();
if (!IsResponseSuccessful(response)) {
- SDL_LOG_ERROR("UI_CreateWindow for correlation id: " << correlation_id
- << " has failed");
+ SDL_LOG_ERROR("UI_CreateWindow for correlation id: "
+ << response[strings::params][strings::correlation_id].asInt()
+ << " has failed");
auto& builder = application->display_capabilities_builder();
builder.ResetDisplayCapabilities();
return;
diff --git a/src/components/application_manager/src/resumption/resumption_sql_queries.cc b/src/components/application_manager/src/resumption/resumption_sql_queries.cc
index 4770bafef4..cfcac136aa 100644
--- a/src/components/application_manager/src/resumption/resumption_sql_queries.cc
+++ b/src/components/application_manager/src/resumption/resumption_sql_queries.cc
@@ -314,6 +314,23 @@ const std::string kCreateSchema =
"CREATE TABLE IF NOT EXISTS `_internal_data`( "
" `db_version_hash` INTEGER "
" ); "
+ "CREATE TABLE IF NOT EXISTS `applicationUserLocation`( "
+ " `idLocation` INTEGER PRIMARY KEY NOT NULL, "
+ " `idApplication` INTEGER, "
+ " `col` INTEGER, "
+ " `colspan` INTEGER, "
+ " `level` INTEGER, "
+ " `levelspan` INTEGER, "
+ " `row` INTEGER, "
+ " `rowspan` INTEGER, "
+ " CONSTRAINT `fk_Application` "
+ " FOREIGN KEY(`idApplication`) "
+ " REFERENCES `application`(`idApplication`) "
+ " ); "
+ "CREATE INDEX IF NOT EXISTS "
+ "`applicationUserLocation.fk_Application_idx` "
+ " ON `applicationUserLocation`(`idApplication`); "
+
"COMMIT;";
const std::string kDropSchema =
@@ -369,6 +386,8 @@ const std::string kDropSchema =
"DROP TABLE IF EXISTS `applicationSubscriptionsArray`; "
"DROP INDEX IF EXISTS `applicationSubscriptionsArray.fk_Application_idx`; "
"DROP TABLE IF EXISTS `_internal_data`; "
+ "DROP TABLE IF EXISTS `applicationUserLocation`; "
+ "DROP INDEX IF EXISTS `applicationUserLocation.fk_Application_idx`; "
"COMMIT; "
"VACUUM;";
@@ -497,6 +516,12 @@ const std::string kDeleteApplicationSubscriptionsArray =
"FROM `application` "
"WHERE `appID` = ? AND `deviceID` = ?)";
+const std::string kDeleteApplicationUserLocation =
+ "DELETE FROM `applicationUserLocation` "
+ "WHERE `idApplication` = (SELECT `idApplication` "
+ "FROM `application` "
+ "WHERE `appID` = ? AND `deviceID` = ?)";
+
const std::string kDeleteImageFromCommands =
"DELETE FROM `image` "
"WHERE `idimage` IN (SELECT `idimage` "
@@ -732,6 +757,13 @@ const std::string kInsertSubscriptions =
"VALUES "
"(?, ?, ?);";
+const std::string kInsertUserLocation =
+ "INSERT INTO `applicationUserLocation` "
+ "(`idApplication`, `col`, `colspan`, `level`, `levelspan`, `row`, "
+ "`rowspan`) "
+ "VALUES "
+ "(?, ?, ?, ?, ?, ?, ?);";
+
const std::string kInsertChoice =
"INSERT INTO `choice` "
"(`choiceID`, `menuName`, `secondaryText`, "
@@ -877,6 +909,18 @@ const std::string kSelectSubscriptions =
"FROM `application` "
"WHERE `appID` = ? AND `deviceID` = ?);";
+const std::string kSelectCountUserLocation =
+ "SELECT COUNT (*) "
+ "FROM `applicationUserLocation` INNER JOIN `application` ON "
+ "`applicationUserLocation`.`idApplication` = `application`.`idApplication` "
+ "WHERE `appID` = ? AND `deviceID` = ?";
+
+const std::string kSelectUserLocation =
+ "SELECT `col`, `colspan`, `level`, `levelspan`, `row`, `rowspan` "
+ "FROM `applicationUserLocation` INNER JOIN `application` ON "
+ "`applicationUserLocation`.`idApplication` = `application`.`idApplication` "
+ "WHERE `appID` = ? AND `deviceID` = ?";
+
const std::string kSelectCountChoiceSet =
"SELECT COUNT (`idApplication`) "
"FROM `applicationChoiceSetArray` "
diff --git a/src/components/application_manager/src/rpc_handler_impl.cc b/src/components/application_manager/src/rpc_handler_impl.cc
index 4137ab93bb..b6b9f2e16b 100644
--- a/src/components/application_manager/src/rpc_handler_impl.cc
+++ b/src/components/application_manager/src/rpc_handler_impl.cc
@@ -466,8 +466,6 @@ bool RPCHandlerImpl::ConvertMessageToSO(
break;
}
case protocol_handler::MajorProtocolVersion::PROTOCOL_VERSION_1: {
- static ns_smart_device_link_rpc::V1::v4_protocol_v1_2_no_extra v1_shema;
-
if (message.function_id() == 0 || message.type() == kUnknownType) {
SDL_LOG_ERROR("Message received: UNSUPPORTED_VERSION");
@@ -495,7 +493,8 @@ bool RPCHandlerImpl::ConvertMessageToSO(
smart_objects::SmartObjectSPtr msg_to_send =
std::make_shared<smart_objects::SmartObject>(output);
- v1_shema.attachSchema(*msg_to_send, false);
+ app_manager_.mobile_v4_protocol_so_factory().attachSchema(
+ *msg_to_send, false);
app_manager_.GetRPCService().SendMessageToMobile(msg_to_send);
return false;
}
@@ -601,5 +600,6 @@ hmi_apis::HMI_API& RPCHandlerImpl::hmi_so_factory() {
mobile_apis::MOBILE_API& RPCHandlerImpl::mobile_so_factory() {
return mobile_so_factory_;
}
+
} // namespace rpc_handler
} // namespace application_manager
diff --git a/src/components/application_manager/src/rpc_service_impl.cc b/src/components/application_manager/src/rpc_service_impl.cc
index 34a0bed7af..f0cd720e30 100644
--- a/src/components/application_manager/src/rpc_service_impl.cc
+++ b/src/components/application_manager/src/rpc_service_impl.cc
@@ -390,7 +390,10 @@ bool RPCServiceImpl::ManageHMICommand(const commands::MessageSharedPtr message,
if (command->Init()) {
command->Run();
- if (kResponse == message_type) {
+ if (helpers::Compare<int32_t, helpers::EQ, helpers::ONE>(
+ message_type, kResponse, kErrorResponse) &&
+ message->getElement(strings::params)
+ .keyExists(strings::correlation_id)) {
const uint32_t correlation_id =
(*(message.get()))[strings::params][strings::correlation_id].asUInt();
const int32_t function_id =
diff --git a/src/components/application_manager/src/smart_object_keys.cc b/src/components/application_manager/src/smart_object_keys.cc
index f95476b7a6..a680653d6c 100644
--- a/src/components/application_manager/src/smart_object_keys.cc
+++ b/src/components/application_manager/src/smart_object_keys.cc
@@ -138,6 +138,9 @@ const char* minutes = "minutes";
const char* seconds = "seconds";
const char* update_mode = "updateMode";
const char* audioStreamingIndicator = "audioStreamingIndicator";
+const char* seek_time = "seekTime";
+const char* forward_seek_indicator = "forwardSeekIndicator";
+const char* back_seek_indicator = "backSeekIndicator";
const char* trigger_source = "triggerSource";
const char* hmi_level = "hmiLevel";
const char* activate_app_hmi_level = "level";
@@ -194,6 +197,8 @@ const char* policy_type = "policyType";
const char* property = "property";
const char* displays = "displays";
const char* seat_location = "seatLocation";
+const char* app_capability = "appCapability";
+const char* app_capability_type = "appCapabilityType";
// PutFile
const char* sync_file_name = "syncFileName";
@@ -263,6 +268,7 @@ const char* fuel_level_state = "fuelLevel_State";
const char* instant_fuel_consumption = "instantFuelConsumption";
const char* fuel_range = "fuelRange";
const char* cloud_app_vehicle_id = "cloudAppVehicleID";
+const char* climate_data = "climateData";
const char* external_temp = "externalTemperature";
const char* turn_signal = "turnSignal";
const char* vin = "vin";
@@ -303,11 +309,13 @@ const char* video_streaming = "videoStreaming";
const char* remote_control = "remoteControl";
const char* sdl_version = "sdlVersion";
const char* system_software_version = "systemSoftwareVersion";
+const char* system_hardware_version = "systemHardwareVersion";
const char* priority = "priority";
const char* engine_oil_life = "engineOilLife";
const char* oem_custom_data_type = "oemCustomDataType";
const char* window_status = "windowStatus";
const char* hands_off_steering = "handsOffSteering";
+const char* seat_occupancy = "seatOccupancy";
// app services
const char* app_service_manifest = "appServiceManifest";
@@ -439,10 +447,13 @@ const char* const haptic_spatial_data_supported = "hapticSpatialDataSupported";
const char* const diagonal_screen_size = "diagonalScreenSize";
const char* const pixel_per_inch = "pixelPerInch";
const char* const scale = "scale";
+const char* const additional_video_streaming_capabilities =
+ "additionalVideoStreamingCapabilities";
const char* const haptic_rect_data = "hapticRectData";
const char* const rect = "rect";
const char* const x = "x";
const char* const y = "y";
+const char* const preferred_fps = "preferredFPS";
} // namespace strings
namespace hmi_interface {
@@ -541,6 +552,8 @@ const char* method_name = "methodName";
const char* keyboard_layout = "keyboardLayout";
const char* limited_character_list = "limitedCharacterList";
const char* auto_complete_list = "autoCompleteList";
+const char* mask_input_characters = "maskInputCharacters";
+const char* custom_keys = "customKeys";
const char* file = "file";
const char* file_name = "fileName";
const char* retry = "retry";
@@ -578,6 +591,9 @@ const char* image_capabilities = "imageCapabilities";
const char* display_type = "displayType";
const char* display_name = "displayName";
const char* text_fields = "textFields";
+const char* keyboard_capabilities = "keyboardCapabilities";
+const char* supported_keyboards = "supportedKeyboards";
+const char* num_configurable_keys = "numConfigurableKeys";
const char* media_clock_formats = "mediaClockFormats";
const char* graphic_supported = "graphicSupported";
const char* image_fields = "imageFields";
diff --git a/src/components/application_manager/test/CMakeLists.txt b/src/components/application_manager/test/CMakeLists.txt
index c9c9a80391..7b1a262f1b 100755
--- a/src/components/application_manager/test/CMakeLists.txt
+++ b/src/components/application_manager/test/CMakeLists.txt
@@ -130,8 +130,8 @@ if (ENABLE_LOG)
list(APPEND LIBRARIES expat -L${EXPAT_LIBS_DIRECTORY})
endif()
+file(COPY ${CMAKE_SOURCE_DIR}/src/appMain/sdl_preloaded_pt.json DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
file(COPY smartDeviceLink_test2.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
-file(COPY sdl_preloaded_pt.json DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
file(COPY sdl_pt_update.json DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
add_custom_command(
diff --git a/src/components/application_manager/test/app_launch/app_launch_ctrl_test.cc b/src/components/application_manager/test/app_launch/app_launch_ctrl_test.cc
index 08868a239f..41d300cc4a 100644
--- a/src/components/application_manager/test/app_launch/app_launch_ctrl_test.cc
+++ b/src/components/application_manager/test/app_launch/app_launch_ctrl_test.cc
@@ -202,7 +202,7 @@ TEST_F(AppLaunchCtrlTest, StoredAppIsLaunchedAfterDeviceConnected) {
app_launch::ApplicationDataPtr app_to_launch = GetTestAppData(0);
MockAppPtr app = GetTestApp(0);
- TestAsyncWaiter waiter;
+ auto waiter = TestAsyncWaiter::createInstance();
applications_on_device.push_back(app_to_launch);
EXPECT_CALL(app_launch_data_mock_,
GetApplicationDataByDevice(app_to_launch->device_mac_))
@@ -212,11 +212,11 @@ TEST_F(AppLaunchCtrlTest, StoredAppIsLaunchedAfterDeviceConnected) {
RunAppOnDevice(app_to_launch->device_mac_, app_to_launch->bundle_id_))
.Times(AtLeast(1))
.WillOnce(DoAll(InvokeOnAppRegistered(app_launch_ctrl_.get(), app.get()),
- NotifyTestAsyncWaiter(&waiter)));
+ NotifyTestAsyncWaiter(waiter)));
app_launch_ctrl_->OnDeviceConnected(app_to_launch->device_mac_);
const uint32_t wait_time =
MAX_TEST_DURATION + settings_.app_launch_wait_time();
- EXPECT_TRUE(waiter.WaitFor(1, wait_time));
+ EXPECT_TRUE(waiter->WaitFor(1, wait_time));
}
TEST_F(AppLaunchCtrlTest, RelaunchAppIfNotRegisteredMultipleTimes) {
@@ -224,7 +224,7 @@ TEST_F(AppLaunchCtrlTest, RelaunchAppIfNotRegisteredMultipleTimes) {
app_launch::ApplicationDataPtr app_to_launch = GetTestAppData(0);
applications_on_device.push_back(app_to_launch);
- TestAsyncWaiter waiter;
+ auto waiter = TestAsyncWaiter::createInstance();
const uint32_t times = settings_.app_launch_max_retry_attempt();
EXPECT_CALL(app_launch_data_mock_,
GetApplicationDataByDevice(app_to_launch->device_mac_))
@@ -234,14 +234,14 @@ TEST_F(AppLaunchCtrlTest, RelaunchAppIfNotRegisteredMultipleTimes) {
connection_handler_mock_,
RunAppOnDevice(app_to_launch->device_mac_, app_to_launch->bundle_id_))
.Times(times)
- .WillRepeatedly(NotifyTestAsyncWaiter(&waiter));
+ .WillRepeatedly(NotifyTestAsyncWaiter(waiter));
app_launch_ctrl_->OnDeviceConnected(app_to_launch->device_mac_);
const uint32_t wait_time = MAX_TEST_DURATION +
settings_.app_launch_wait_time() +
settings_.app_launch_max_retry_attempt() *
settings_.app_launch_retry_wait_time();
- EXPECT_TRUE(waiter.WaitFor(times, wait_time));
+ EXPECT_TRUE(waiter->WaitFor(times, wait_time));
}
TEST_F(AppLaunchCtrlTest, LaunchMultipleApps) {
@@ -253,7 +253,7 @@ TEST_F(AppLaunchCtrlTest, LaunchMultipleApps) {
apps.push_back(it->second);
}
- TestAsyncWaiter waiter;
+ auto waiter = TestAsyncWaiter::createInstance();
const uint32_t times = apps_and_data.size();
EXPECT_CALL(app_launch_data_mock_, GetApplicationDataByDevice(DeviceMac(1)))
.WillOnce(Return(apps));
@@ -267,13 +267,13 @@ TEST_F(AppLaunchCtrlTest, LaunchMultipleApps) {
.Times(AtLeast(1))
.WillOnce(DoAll(
InvokeOnAppRegistered(app_launch_ctrl_.get(), it->first.get()),
- NotifyTestAsyncWaiter(&waiter)));
+ NotifyTestAsyncWaiter(waiter)));
}
app_launch_ctrl_->OnDeviceConnected(DeviceMac(1));
const uint32_t wait_time = MAX_TEST_DURATION +
settings_.app_launch_wait_time() +
apps.size() * settings_.wait_time_between_apps();
- waiter.WaitFor(times, wait_time);
+ waiter->WaitFor(times, wait_time);
}
TEST_F(AppLaunchCtrlTest, LaunchMultipleAppsNoRegister) {
@@ -285,7 +285,7 @@ TEST_F(AppLaunchCtrlTest, LaunchMultipleAppsNoRegister) {
apps.push_back(it->second);
}
- TestAsyncWaiter waiter;
+ auto waiter = TestAsyncWaiter::createInstance();
const uint32_t times =
settings_.app_launch_max_retry_attempt() * apps_and_data.size();
EXPECT_CALL(app_launch_data_mock_, GetApplicationDataByDevice(DeviceMac(1)))
@@ -300,13 +300,13 @@ TEST_F(AppLaunchCtrlTest, LaunchMultipleAppsNoRegister) {
RunAppOnDevice(app_data.second->device_mac_,
app_data.second->bundle_id_))
.Times(settings_.app_launch_max_retry_attempt())
- .WillRepeatedly(NotifyTestAsyncWaiter(&waiter));
+ .WillRepeatedly(NotifyTestAsyncWaiter(waiter));
}
app_launch_ctrl_->OnDeviceConnected(DeviceMac(1));
const uint32_t wait_time = MAX_TEST_DURATION +
settings_.app_launch_wait_time() +
apps.size() * settings_.wait_time_between_apps();
- waiter.WaitFor(times, wait_time);
+ waiter->WaitFor(times, wait_time);
}
TEST_F(AppLaunchCtrlTest, LaunchMultipleAppsInHMILevelOrder) {
@@ -343,7 +343,7 @@ TEST_F(AppLaunchCtrlTest, LaunchMultipleAppsInHMILevelOrder) {
apps.push_back(app_data);
}
- TestAsyncWaiter waiter;
+ auto waiter = TestAsyncWaiter::createInstance();
const uint32_t times = apps_and_data.size();
EXPECT_CALL(app_launch_data_mock_, GetApplicationDataByDevice(DeviceMac(1)))
.WillOnce(Return(apps));
@@ -356,7 +356,7 @@ TEST_F(AppLaunchCtrlTest, LaunchMultipleAppsInHMILevelOrder) {
.Times(AtLeast(1))
.WillRepeatedly(DoAll(
InvokeOnAppRegistered(app_launch_ctrl_.get(), it->first.get()),
- NotifyTestAsyncWaiter(&waiter)));
+ NotifyTestAsyncWaiter(waiter)));
}
app_launch_ctrl_->OnDeviceConnected(DeviceMac(1));
@@ -364,7 +364,7 @@ TEST_F(AppLaunchCtrlTest, LaunchMultipleAppsInHMILevelOrder) {
const uint32_t wait_time = MAX_TEST_DURATION +
settings_.app_launch_wait_time() +
apps.size() * settings_.wait_time_between_apps();
- waiter.WaitFor(times, wait_time);
+ waiter->WaitFor(times, wait_time);
}
} // namespace app_launch_test
diff --git a/src/components/application_manager/test/application_helper_test.cc b/src/components/application_manager/test/application_helper_test.cc
index 4c451ab072..1633b9d29b 100644
--- a/src/components/application_manager/test/application_helper_test.cc
+++ b/src/components/application_manager/test/application_helper_test.cc
@@ -209,9 +209,6 @@ TEST_F(ApplicationHelperTest, RecallApplicationData_ExpectAppDataReset) {
EXPECT_TRUE(NULL != file_ptr);
EXPECT_TRUE(file_ptr->file_name == filename);
- EXPECT_CALL(*mock_message_helper_, CreateUnsubscribeWayPointsRequest(_))
- .WillOnce(Return(std::make_shared<smart_objects::SmartObject>()));
-
EXPECT_CALL(*mock_message_helper_, CreateDeleteUICommandRequest(_, _, _))
.WillOnce(Return(std::make_shared<smart_objects::SmartObject>()));
@@ -261,9 +258,6 @@ TEST_F(ApplicationHelperTest, RecallApplicationData_ExpectHMICleanupRequests) {
app_impl_->AddChoiceSet(choice_set_id, cmd[strings::msg_params]);
app_impl_->SubscribeToButton(mobile_apis::ButtonName::AC);
- EXPECT_CALL(*mock_message_helper_, CreateUnsubscribeWayPointsRequest(_))
- .WillOnce(Return(std::make_shared<smart_objects::SmartObject>()));
-
EXPECT_CALL(*mock_message_helper_, CreateDeleteUICommandRequest(_, _, _))
.WillOnce(Return(std::make_shared<smart_objects::SmartObject>()));
diff --git a/src/components/application_manager/test/application_impl_test.cc b/src/components/application_manager/test/application_impl_test.cc
index d468c9790b..5f23e97391 100644
--- a/src/components/application_manager/test/application_impl_test.cc
+++ b/src/components/application_manager/test/application_impl_test.cc
@@ -571,14 +571,17 @@ TEST_F(ApplicationImplTest, SubscribeToSoftButton_UnsubscribeFromSoftButton) {
EXPECT_FALSE(app_impl->IsSubscribedToSoftButton(i));
}
- SoftButtonID test_button;
+ std::set<uint32_t> softbuttons_ids;
+
for (uint i = 0; i < btn_count; i++) {
- test_button.insert(std::make_pair(
- i,
- static_cast<WindowID>(mobile_apis::PredefinedWindows::DEFAULT_WINDOW)));
+ softbuttons_ids.insert(i);
}
+
+ WindowSoftButtons window_softbuttons{
+ static_cast<WindowID>(mobile_apis::PredefinedWindows::DEFAULT_WINDOW),
+ softbuttons_ids};
app_impl->SubscribeToSoftButtons(FunctionID::ScrollableMessageID,
- test_button);
+ window_softbuttons);
for (uint i = 0; i < btn_count; i++) {
EXPECT_TRUE(app_impl->IsSubscribedToSoftButton(i));
@@ -837,6 +840,7 @@ TEST_F(ApplicationImplTest, StartStreaming_StreamingApproved) {
TEST_F(ApplicationImplTest, SuspendNaviStreaming) {
protocol_handler::ServiceType type =
protocol_handler::ServiceType::kMobileNav;
+ EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false));
EXPECT_CALL(mock_application_manager_,
ProcessOnDataStreamingNotification(type, app_id, false));
app_impl->SuspendStreaming(type);
@@ -844,6 +848,7 @@ TEST_F(ApplicationImplTest, SuspendNaviStreaming) {
TEST_F(ApplicationImplTest, SuspendAudioStreaming) {
protocol_handler::ServiceType type = protocol_handler::ServiceType::kAudio;
+ EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false));
EXPECT_CALL(mock_application_manager_,
ProcessOnDataStreamingNotification(type, app_id, false));
app_impl->SuspendStreaming(type);
@@ -852,16 +857,12 @@ TEST_F(ApplicationImplTest, SuspendAudioStreaming) {
// TODO {AKozoriz} : Fix tests with streaming (APPLINK-19289)
TEST_F(ApplicationImplTest, DISABLED_Suspend_WakeUpAudioStreaming) {
protocol_handler::ServiceType type = protocol_handler::ServiceType::kAudio;
- EXPECT_CALL(
- mock_application_manager_,
- OnAppStreaming(app_id, type, Application::StreamingState::kSuspended));
+ EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false));
EXPECT_CALL(*MockMessageHelper::message_helper_mock(),
SendOnDataStreaming(type, false, _));
app_impl->SuspendStreaming(type);
- EXPECT_CALL(
- mock_application_manager_,
- OnAppStreaming(app_id, type, Application::StreamingState::kStarted));
+ EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, true));
EXPECT_CALL(*MockMessageHelper::message_helper_mock(),
SendOnDataStreaming(type, true, _));
app_impl->WakeUpStreaming(type);
@@ -870,16 +871,12 @@ TEST_F(ApplicationImplTest, DISABLED_Suspend_WakeUpAudioStreaming) {
TEST_F(ApplicationImplTest, DISABLED_Suspend_WakeUpNaviStreaming) {
protocol_handler::ServiceType type =
protocol_handler::ServiceType::kMobileNav;
- EXPECT_CALL(
- mock_application_manager_,
- OnAppStreaming(app_id, type, Application::StreamingState::kSuspended));
+ EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false));
EXPECT_CALL(*MockMessageHelper::message_helper_mock(),
SendOnDataStreaming(type, false, _));
app_impl->SuspendStreaming(type);
- EXPECT_CALL(
- mock_application_manager_,
- OnAppStreaming(app_id, type, Application::StreamingState::kStarted));
+ EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, true));
EXPECT_CALL(*MockMessageHelper::message_helper_mock(),
SendOnDataStreaming(type, true, _));
app_impl->WakeUpStreaming(type);
@@ -891,9 +888,7 @@ TEST_F(ApplicationImplTest, StopStreaming_StreamingApproved) {
protocol_handler::ServiceType::kMobileNav;
app_impl->set_video_streaming_approved(true);
- EXPECT_CALL(
- mock_application_manager_,
- OnAppStreaming(app_id, type, Application::StreamingState::kStopped));
+ EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false));
EXPECT_CALL(mock_application_manager_,
ProcessOnDataStreamingNotification(type, app_id, false));
EXPECT_CALL(*MockMessageHelper::message_helper_mock(),
@@ -905,9 +900,7 @@ TEST_F(ApplicationImplTest, StopStreaming_StreamingApproved) {
// Stop audio streaming
app_impl->set_audio_streaming_approved(true);
type = protocol_handler::ServiceType::kAudio;
- EXPECT_CALL(
- mock_application_manager_,
- OnAppStreaming(app_id, type, Application::StreamingState::kStopped));
+ EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false));
EXPECT_CALL(mock_application_manager_,
ProcessOnDataStreamingNotification(type, app_id, false));
EXPECT_CALL(*MockMessageHelper::message_helper_mock(),
diff --git a/src/components/application_manager/test/application_manager_impl_test.cc b/src/components/application_manager/test/application_manager_impl_test.cc
index cf8aadb080..48ba75275b 100644
--- a/src/components/application_manager/test/application_manager_impl_test.cc
+++ b/src/components/application_manager/test/application_manager_impl_test.cc
@@ -159,9 +159,7 @@ struct ServiceStatus {
: service_type_(type), service_event_(event), reason_(reason) {}
};
-class ApplicationManagerImplTest
- : public ::testing::Test,
- public ::testing::WithParamInterface<ServiceStatus> {
+class ApplicationManagerImplTest : public ::testing::Test {
public:
ApplicationManagerImplTest()
: app_id_(0u)
@@ -406,9 +404,13 @@ MATCHER_P(HMIFunctionIDIs, result_code, "") {
.asInt());
}
+class ApplicationManagerImplTestWithServiceStatus
+ : public ::testing::WithParamInterface<ServiceStatus>,
+ public ApplicationManagerImplTest {};
+
INSTANTIATE_TEST_CASE_P(
ProcessServiceStatusUpdate_REQUEST_ACCEPTED,
- ApplicationManagerImplTest,
+ ApplicationManagerImplTestWithServiceStatus,
::testing::Values(ServiceStatus(ServiceType::AUDIO,
ServiceEvent::REQUEST_ACCEPTED,
UpdateReasonOptional::EMPTY),
@@ -421,7 +423,7 @@ INSTANTIATE_TEST_CASE_P(
INSTANTIATE_TEST_CASE_P(
ProcessServiceStatusUpdate_REQUEST_RECEIVED,
- ApplicationManagerImplTest,
+ ApplicationManagerImplTestWithServiceStatus,
::testing::Values(ServiceStatus(ServiceType::AUDIO,
ServiceEvent::REQUEST_RECEIVED,
UpdateReasonOptional::EMPTY),
@@ -434,7 +436,7 @@ INSTANTIATE_TEST_CASE_P(
INSTANTIATE_TEST_CASE_P(
ProcessServiceStatusUpdate_REQUEST_REJECTED,
- ApplicationManagerImplTest,
+ ApplicationManagerImplTestWithServiceStatus,
::testing::Values(ServiceStatus(ServiceType::AUDIO,
ServiceEvent::REQUEST_REJECTED,
UpdateReasonOptional::EMPTY),
@@ -445,7 +447,7 @@ INSTANTIATE_TEST_CASE_P(
ServiceEvent::REQUEST_REJECTED,
UpdateReasonOptional::EMPTY)));
-TEST_P(ApplicationManagerImplTest,
+TEST_P(ApplicationManagerImplTestWithServiceStatus,
ProcessServiceStatusUpdate_SendMessageToHMI) {
smart_objects::SmartObjectSPtr notification_ =
std::make_shared<smart_objects::SmartObject>(
@@ -499,16 +501,16 @@ TEST_F(ApplicationManagerImplTest, ProcessQueryApp_ExpectSuccess) {
TEST_F(ApplicationManagerImplTest,
SubscribeAppForWayPoints_ExpectSubscriptionApp) {
auto app_ptr = std::static_pointer_cast<am::Application>(mock_app_ptr_);
- app_manager_impl_->SubscribeAppForWayPoints(app_ptr);
+ app_manager_impl_->SubscribeAppForWayPoints(app_ptr, true);
EXPECT_TRUE(app_manager_impl_->IsAppSubscribedForWayPoints(*app_ptr));
}
TEST_F(ApplicationManagerImplTest,
- UnsubscribeAppForWayPoints_ExpectUnsubscriptionApp) {
+ UnsubscribeAppFromWayPoints_ExpectUnsubscriptionApp) {
auto app_ptr = std::static_pointer_cast<am::Application>(mock_app_ptr_);
- app_manager_impl_->SubscribeAppForWayPoints(app_ptr);
+ app_manager_impl_->SubscribeAppForWayPoints(app_ptr, true);
EXPECT_TRUE(app_manager_impl_->IsAppSubscribedForWayPoints(*app_ptr));
- app_manager_impl_->UnsubscribeAppFromWayPoints(app_ptr);
+ app_manager_impl_->UnsubscribeAppFromWayPoints(app_ptr, true);
EXPECT_FALSE(app_manager_impl_->IsAppSubscribedForWayPoints(*app_ptr));
const std::set<uint32_t> result =
app_manager_impl_->GetAppsSubscribedForWayPoints();
@@ -520,7 +522,7 @@ TEST_F(
IsAnyAppSubscribedForWayPoints_SubcribeAppForWayPoints_ExpectCorrectResult) {
EXPECT_FALSE(app_manager_impl_->IsAnyAppSubscribedForWayPoints());
auto app_ptr = std::static_pointer_cast<am::Application>(mock_app_ptr_);
- app_manager_impl_->SubscribeAppForWayPoints(app_ptr);
+ app_manager_impl_->SubscribeAppForWayPoints(app_ptr, true);
EXPECT_TRUE(app_manager_impl_->IsAnyAppSubscribedForWayPoints());
}
@@ -528,7 +530,7 @@ TEST_F(
ApplicationManagerImplTest,
GetAppsSubscribedForWayPoints_SubcribeAppForWayPoints_ExpectCorrectResult) {
auto app_ptr = std::static_pointer_cast<am::Application>(mock_app_ptr_);
- app_manager_impl_->SubscribeAppForWayPoints(app_ptr);
+ app_manager_impl_->SubscribeAppForWayPoints(app_ptr, true);
std::set<uint32_t> result =
app_manager_impl_->GetAppsSubscribedForWayPoints();
EXPECT_EQ(1u, result.size());
@@ -2294,6 +2296,42 @@ TEST_F(
app_manager_impl_->RequestForInterfacesAvailability();
}
+class ApplicationManagerImplTestWithFunctionID
+ : public ::testing::WithParamInterface<mobile_apis::FunctionID::eType>,
+ public ApplicationManagerImplTest {};
+
+TEST_P(ApplicationManagerImplTestWithFunctionID,
+ UnsubscribeAppFromSoftButtons_SUCCESS) {
+ AddMockApplication();
+ commands::MessageSharedPtr response_message =
+ std::make_shared<smart_objects::SmartObject>(
+ smart_objects::SmartType_Map);
+
+ const mobile_apis::FunctionID::eType function_id = GetParam();
+ (*response_message)[strings::params][strings::connection_key] =
+ kConnectionKey;
+ (*response_message)[strings::msg_params][strings::result_code] =
+ mobile_apis::Result::SUCCESS;
+ (*response_message)[strings::params][strings::function_id] = function_id;
+
+ EXPECT_CALL(*mock_app_ptr_, app_id()).WillOnce(Return(kConnectionKey));
+ EXPECT_CALL(*mock_app_ptr_, UnsubscribeFromSoftButtons(function_id));
+
+ const bool unsubscribe_result =
+ app_manager_impl_->UnsubscribeAppFromSoftButtons(response_message);
+
+ EXPECT_TRUE(unsubscribe_result);
+}
+
+INSTANTIATE_TEST_CASE_P(
+ UnsubscribeAppFromSoftButtons,
+ ApplicationManagerImplTestWithFunctionID,
+ ::testing::Values(mobile_apis::FunctionID::ScrollableMessageID,
+ mobile_apis::FunctionID::AlertID,
+ mobile_apis::FunctionID::AlertManeuverID,
+ mobile_apis::FunctionID::UpdateTurnListID,
+ mobile_apis::FunctionID::ShowConstantTBTID));
+
} // namespace application_manager_test
} // namespace components
} // namespace test
diff --git a/src/components/application_manager/test/hmi_capabilities_test.cc b/src/components/application_manager/test/hmi_capabilities_test.cc
index 4e2e948335..c83dd76978 100644
--- a/src/components/application_manager/test/hmi_capabilities_test.cc
+++ b/src/components/application_manager/test/hmi_capabilities_test.cc
@@ -130,6 +130,14 @@ const std::vector<hmi_apis::Common_LightName::eType> light_name_enum_values{
hmi_apis::Common_LightName::eType::EXTERIOR_RIGHT_LIGHTS,
hmi_apis::Common_LightName::eType::EXTERIOR_ALL_LIGHTS};
+const std::vector<hmi_apis::FunctionID::eType> is_ready_requests{
+ hmi_apis::FunctionID::RC_IsReady,
+ hmi_apis::FunctionID::VR_IsReady,
+ hmi_apis::FunctionID::UI_IsReady,
+ hmi_apis::FunctionID::TTS_IsReady,
+ hmi_apis::FunctionID::Navigation_IsReady,
+ hmi_apis::FunctionID::VehicleInfo_IsReady};
+
bool IsLightNameExists(const hmi_apis::Common_LightName::eType& light_name) {
auto it = std::find(
light_name_enum_values.begin(), light_name_enum_values.end(), light_name);
@@ -155,6 +163,13 @@ class HMICapabilitiesTest : public ::testing::Test {
.WillByDefault(ReturnRef(kHmiCapabilitiesCacheFile));
hmi_capabilities_ = std::make_shared<HMICapabilitiesImpl>(mock_app_mngr_);
+ IsReadyResponsesReceived();
+ }
+
+ void IsReadyResponsesReceived() {
+ for (const auto& request : is_ready_requests) {
+ hmi_capabilities_->UpdateRequestsRequiredForCapabilities(request);
+ }
}
void TearDown() OVERRIDE {
@@ -530,16 +545,16 @@ TEST_F(
800,
vs_capability_so[strings::preferred_resolution][strings::resolution_width]
.asInt());
- EXPECT_EQ(350,
+ EXPECT_EQ(380,
vs_capability_so[strings::preferred_resolution]
[strings::resolution_height]
.asInt());
EXPECT_TRUE(vs_capability_so.keyExists(strings::max_bitrate));
- EXPECT_EQ(10000, vs_capability_so[strings::max_bitrate].asInt());
+ EXPECT_EQ(20000, vs_capability_so[strings::max_bitrate].asInt());
EXPECT_TRUE(vs_capability_so.keyExists(strings::supported_formats));
const size_t supported_formats_len =
vs_capability_so[strings::supported_formats].length();
- EXPECT_EQ(1ull, supported_formats_len);
+ EXPECT_EQ(5u, supported_formats_len);
EXPECT_TRUE(vs_capability_so[strings::supported_formats][0].keyExists(
strings::protocol));
@@ -554,8 +569,21 @@ TEST_F(
EXPECT_TRUE(
vs_capability_so.keyExists(strings::haptic_spatial_data_supported));
- EXPECT_FALSE(
+ EXPECT_TRUE(
vs_capability_so[strings::haptic_spatial_data_supported].asBool());
+ EXPECT_TRUE(vs_capability_so.keyExists(strings::diagonal_screen_size));
+ EXPECT_EQ(8, vs_capability_so[strings::diagonal_screen_size].asInt());
+ EXPECT_TRUE(vs_capability_so.keyExists(strings::pixel_per_inch));
+ EXPECT_EQ(96, vs_capability_so[strings::pixel_per_inch].asInt());
+ EXPECT_TRUE(vs_capability_so.keyExists(strings::scale));
+ EXPECT_EQ(1, vs_capability_so[strings::scale].asInt());
+ EXPECT_TRUE(vs_capability_so.keyExists(strings::preferred_fps));
+ EXPECT_TRUE(vs_capability_so.keyExists(
+ strings::additional_video_streaming_capabilities));
+ const size_t additional_video_streaming_capabilities_len =
+ vs_capability_so[strings::additional_video_streaming_capabilities]
+ .length();
+ EXPECT_EQ(7u, additional_video_streaming_capabilities_len);
EXPECT_TRUE(hmi_capabilities_->video_streaming_supported());
}
diff --git a/src/components/application_manager/test/include/application_manager/commands/commands_test.h b/src/components/application_manager/test/include/application_manager/commands/commands_test.h
index fdaef2c716..18afa01a88 100644
--- a/src/components/application_manager/test/include/application_manager/commands/commands_test.h
+++ b/src/components/application_manager/test/include/application_manager/commands/commands_test.h
@@ -53,6 +53,7 @@ namespace components {
namespace commands_test {
namespace am = ::application_manager;
+namespace strings = am::strings;
using ::testing::_;
using ::testing::Mock;
@@ -179,6 +180,30 @@ class CommandsTest : public ::testing::Test {
InitHMIToMobileResultConverter();
}
+ void FillVideoStreamingCapability(
+ smart_objects::SmartObject& video_streaming_capability) {
+ video_streaming_capability[strings::preferred_resolution] =
+ smart_objects::SmartObject(smart_objects::SmartType_Map);
+ video_streaming_capability[strings::preferred_resolution]
+ [strings::resolution_width] = 800;
+ video_streaming_capability[strings::preferred_resolution]
+ [strings::resolution_height] = 354;
+ video_streaming_capability[strings::max_bitrate] = 10000;
+ video_streaming_capability[strings::supported_formats] =
+ smart_objects::SmartObject(smart_objects::SmartType_Array);
+ video_streaming_capability[strings::supported_formats][0] =
+ smart_objects::SmartObject(smart_objects::SmartType_Map);
+ video_streaming_capability[strings::supported_formats][0]
+ [strings::protocol] =
+ hmi_apis::Common_VideoStreamingProtocol::RAW;
+ video_streaming_capability[strings::supported_formats][0][strings::codec] =
+ hmi_apis::Common_VideoStreamingCodec::H264;
+ video_streaming_capability[strings::haptic_spatial_data_supported] = true;
+ video_streaming_capability[strings::diagonal_screen_size] = 7.47;
+ video_streaming_capability[strings::pixel_per_inch] = 117.f;
+ video_streaming_capability[strings::scale] = 1.f;
+ }
+
void InitHMIToMobileResultConverter() {
namespace MobileResult = mobile_apis::Result;
namespace HMIResult = hmi_apis::Common_Result;
diff --git a/src/components/application_manager/test/include/application_manager/mock_app_service_manager.h b/src/components/application_manager/test/include/application_manager/mock_app_service_manager.h
index 60d2f90297..e3a47f412a 100644
--- a/src/components/application_manager/test/include/application_manager/mock_app_service_manager.h
+++ b/src/components/application_manager/test/include/application_manager/mock_app_service_manager.h
@@ -87,6 +87,7 @@ class MockAppServiceManager : public application_manager::AppServiceManager {
const bool service_published));
MOCK_METHOD1(UpdateNavigationCapabilities,
bool(smart_objects::SmartObject& out_params));
+ MOCK_METHOD0(FindWayPointsHandler, application_manager::AppService*());
MOCK_METHOD0(GetRPCPassingHandler, application_manager::RPCPassingHandler&());
};
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 454b43b99f..2c9fe688b4 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
@@ -88,8 +88,9 @@ class MockApplication : public ::application_manager::Application {
void(protocol_handler::ServiceType service_type));
MOCK_METHOD1(SuspendStreaming,
void(protocol_handler::ServiceType service_type));
- MOCK_METHOD1(WakeUpStreaming,
- void(protocol_handler::ServiceType service_type));
+ MOCK_METHOD2(WakeUpStreaming,
+ void(protocol_handler::ServiceType service_type,
+ uint32_t timer_len));
MOCK_CONST_METHOD0(is_voice_communication_supported, bool());
MOCK_METHOD1(set_voice_communication_supported,
void(bool is_voice_communication_supported));
@@ -206,9 +207,10 @@ class MockApplication : public ::application_manager::Application {
MOCK_METHOD2(RemoveHMIState,
void(const application_manager::WindowID window_id,
::application_manager::HmiState::StateID state_id));
- MOCK_METHOD2(SubscribeToSoftButtons,
- void(int32_t cmd_id,
- const ::application_manager::SoftButtonID& softbuttons_id));
+ MOCK_METHOD2(
+ SubscribeToSoftButtons,
+ void(int32_t cmd_id,
+ const application_manager::WindowSoftButtons& window_softbuttons));
MOCK_METHOD1(IsSubscribedToSoftButton, bool(const uint32_t softbutton_id));
MOCK_METHOD1(UnsubscribeFromSoftButtons, void(int32_t cmd_id));
MOCK_CONST_METHOD0(IsAudioApplication, bool());
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 2f9f40ad2a..e40197cc13 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
@@ -212,6 +212,8 @@ class MockHMICapabilities : public ::application_manager::HMICapabilities {
MOCK_CONST_METHOD0(ccpu_version, const std::string&());
MOCK_METHOD1(set_ccpu_version, void(const std::string& ccpu_version));
+ MOCK_CONST_METHOD0(hardware_version, const std::string&());
+ MOCK_METHOD1(set_hardware_version, void(const std::string& hardware_version));
MOCK_METHOD1(OnSoftwareVersionReceived,
void(const std::string& ccpu_version));
MOCK_METHOD0(UpdateCachedCapabilities, void());
diff --git a/src/components/application_manager/test/include/application_manager/mock_message_helper.h b/src/components/application_manager/test/include/application_manager/mock_message_helper.h
index d7919a374b..89b2d125e5 100644
--- a/src/components/application_manager/test/include/application_manager/mock_message_helper.h
+++ b/src/components/application_manager/test/include/application_manager/mock_message_helper.h
@@ -182,6 +182,12 @@ class MockMessageHelper {
smart_objects::SmartObjectSPtr(
const ResetGlobalPropertiesResult& reset_result,
ApplicationSharedPtr application));
+
+ MOCK_METHOD2(CreateRCResetGlobalPropertiesRequest,
+ smart_objects::SmartObjectSPtr(
+ const ResetGlobalPropertiesResult& reset_result,
+ ApplicationSharedPtr application));
+
MOCK_METHOD2(CreateGlobalPropertiesRequestsToHMI,
smart_objects::SmartObjectList(ApplicationConstSharedPtr app,
ApplicationManager& app_mngr));
diff --git a/src/components/application_manager/test/include/application_manager/resumption_data_test.h b/src/components/application_manager/test/include/application_manager/resumption_data_test.h
index e38b428877..0596b4e500 100644
--- a/src/components/application_manager/test/include/application_manager/resumption_data_test.h
+++ b/src/components/application_manager/test/include/application_manager/resumption_data_test.h
@@ -157,6 +157,7 @@ class ResumptionDataTest : public ::testing::Test {
am::SubMenuMap test_submenu_map;
am::ChoiceSetMap test_choiceset_map;
am::AppFilesMap app_files_map_;
+ smart_objects::SmartObject user_location_;
am::ButtonSubscriptions btn_subscr;
diff --git a/src/components/application_manager/test/message_helper/message_helper_test.cc b/src/components/application_manager/test/message_helper/message_helper_test.cc
index c380805bc2..f6ee2b654a 100644
--- a/src/components/application_manager/test/message_helper/message_helper_test.cc
+++ b/src/components/application_manager/test/message_helper/message_helper_test.cc
@@ -46,6 +46,7 @@
#include "application_manager/mock_rpc_service.h"
#include "application_manager/policies/policy_handler.h"
#include "application_manager/resumption/resume_ctrl.h"
+#include "application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_module_constants.h"
#include "application_manager/state_controller.h"
#include "policy/mock_policy_settings.h"
#include "smart_objects/enum_schema_item.h"
@@ -167,6 +168,12 @@ TEST(MessageHelperTestCreate,
EXPECT_CALL(*mock_help_prompt_manager, GetSendingType())
.WillRepeatedly(Return(HelpPromptManager::SendingType::kSendBoth));
+ smart_objects::SmartObject user_loc =
+ smart_objects::SmartObject(smart_objects::SmartType_Map);
+
+ EXPECT_CALL(*appSharedMock, get_user_location())
+ .WillRepeatedly(ReturnRef(user_loc));
+
application_manager_test::MockApplicationManager mock_application_manager;
smart_objects::SmartObjectList ptr =
MessageHelper::CreateGlobalPropertiesRequestsToHMI(
@@ -189,6 +196,10 @@ TEST(MessageHelperTestCreate,
(*objPtr)[5][strings::help_prompt] = "666";
(*objPtr)[6][strings::timeout_prompt] = "777";
+ smart_objects::SmartObject user_loc =
+ smart_objects::SmartObject(smart_objects::SmartType_Map);
+ user_loc[rc_rpc_plugin::strings::kGrid] = "[]";
+
EXPECT_CALL(*appSharedMock, vr_help_title())
.Times(AtLeast(3))
.WillRepeatedly(Return(&(*objPtr)[0]));
@@ -211,6 +222,8 @@ TEST(MessageHelperTestCreate,
.Times(AtLeast(2))
.WillRepeatedly(Return(&(*objPtr)[4]));
EXPECT_CALL(*appSharedMock, app_id()).WillRepeatedly(Return(0));
+ EXPECT_CALL(*appSharedMock, get_user_location())
+ .WillRepeatedly(ReturnRef(user_loc));
std::shared_ptr<MockHelpPromptManager> mock_help_prompt_manager =
std::make_shared<MockHelpPromptManager>();
@@ -888,16 +901,46 @@ TEST_F(MessageHelperTest,
}
}
-TEST_F(MessageHelperTest, SubscribeApplicationToSoftButton_CallFromApp) {
- // Create application mock
+TEST_F(
+ MessageHelperTest,
+ SubscribeApplicationToSoftButton_SoftbuttonsAreAbsent_DoesntCallFromApp) {
+ MockApplicationSharedPtr appSharedPtr = std::make_shared<MockApplication>();
+ smart_objects::SmartObject message_params;
+ size_t function_id = 1;
+ WindowSoftButtons window_buttons{
+ mobile_apis::PredefinedWindows::DEFAULT_WINDOW, {}};
+
+ EXPECT_CALL(*appSharedPtr,
+ SubscribeToSoftButtons(function_id, window_buttons))
+ .Times(0);
+ MessageHelper::SubscribeApplicationToSoftButton(
+ message_params, appSharedPtr, function_id);
+}
+
+TEST_F(MessageHelperTest,
+ SubscribeApplicationToSoftButton_SoftbuttonsExist_CallFromApp) {
MockApplicationSharedPtr appSharedPtr = std::make_shared<MockApplication>();
- // Prepare data for method
smart_objects::SmartObject message_params;
+ message_params[strings::soft_buttons] =
+ new smart_objects::SmartObject(smart_objects::SmartType_Array);
+ const uint32_t softbutton1 = 1u;
+ const uint32_t softbutton2 = 2u;
+ const uint32_t softbutton3 = 3u;
+ message_params[strings::soft_buttons][0][strings::soft_button_id] =
+ softbutton1;
+ message_params[strings::soft_buttons][1][strings::soft_button_id] =
+ softbutton2;
+ message_params[strings::soft_buttons][2][strings::soft_button_id] =
+ softbutton3;
+
size_t function_id = 1;
- //
+ WindowSoftButtons window_buttons{
+ mobile_apis::PredefinedWindows::DEFAULT_WINDOW,
+ {softbutton1, softbutton2, softbutton3}};
+
EXPECT_CALL(*appSharedPtr,
- SubscribeToSoftButtons(function_id, SoftButtonID()))
- .Times(1);
+ SubscribeToSoftButtons(function_id, window_buttons));
+
MessageHelper::SubscribeApplicationToSoftButton(
message_params, appSharedPtr, function_id);
}
diff --git a/src/components/application_manager/test/mock_message_helper.cc b/src/components/application_manager/test/mock_message_helper.cc
index 91f953eaf5..554b99ff72 100644
--- a/src/components/application_manager/test/mock_message_helper.cc
+++ b/src/components/application_manager/test/mock_message_helper.cc
@@ -582,6 +582,14 @@ MessageHelper::CreateTTSResetGlobalPropertiesRequest(
->CreateTTSResetGlobalPropertiesRequest(reset_result, application);
}
+smart_objects::SmartObjectSPtr
+MessageHelper::CreateRCResetGlobalPropertiesRequest(
+ const ResetGlobalPropertiesResult& reset_result,
+ ApplicationSharedPtr application) {
+ return MockMessageHelper::message_helper_mock()
+ ->CreateRCResetGlobalPropertiesRequest(reset_result, application);
+}
+
smart_objects::SmartObjectList
MessageHelper::CreateGlobalPropertiesRequestsToHMI(
ApplicationConstSharedPtr app, ApplicationManager& app_mngr) {
diff --git a/src/components/application_manager/test/policy_handler_test.cc b/src/components/application_manager/test/policy_handler_test.cc
index 39ad034d6f..1d764526b9 100644
--- a/src/components/application_manager/test/policy_handler_test.cc
+++ b/src/components/application_manager/test/policy_handler_test.cc
@@ -72,6 +72,7 @@
#include "policy/mock_policy_manager.h"
#include "policy/usage_statistics/mock_statistics_manager.h"
#include "protocol_handler/mock_session_observer.h"
+#include "utils/test_async_waiter.h"
#include "smart_objects/enum_schema_item.h"
@@ -291,40 +292,6 @@ class PolicyHandlerTest : public ::testing::Test {
}
};
-namespace {
-/**
- * @brief The WaitAsync class
- * can wait for a certain amount of function calls from different
- * threads, or a timeout expires.
- */
-class WaitAsync {
- public:
- WaitAsync(const uint32_t count, const uint32_t timeout)
- : count_(count), timeout_(timeout) {}
-
- void Notify() {
- count_--;
- cond_var_.NotifyOne();
- }
-
- bool Wait(sync_primitives::AutoLock& auto_lock) {
- while (count_ > 0) {
- sync_primitives::ConditionalVariable::WaitStatus wait_status =
- cond_var_.WaitFor(auto_lock, timeout_);
- if (wait_status == sync_primitives::ConditionalVariable::kTimeout) {
- return false;
- }
- }
- return true;
- }
-
- private:
- int count_;
- const uint32_t timeout_;
- sync_primitives::ConditionalVariable cond_var_;
-};
-} // namespace
-
TEST_F(PolicyHandlerTest, LoadPolicyLibrary_Method_ExpectLibraryLoaded) {
// Check before policy enabled from ini file
EXPECT_CALL(policy_settings_, enable_policy()).WillRepeatedly(Return(false));
@@ -926,8 +893,8 @@ void PolicyHandlerTest::TestActivateApp(const uint32_t connection_key,
_,
_));
#endif // EXTERNAL_PROPRIETARY_MODE
-
- EXPECT_CALL(*application1, policy_app_id()).WillOnce(Return(kPolicyAppId_));
+ EXPECT_CALL(*application1, policy_app_id())
+ .WillRepeatedly(Return(kPolicyAppId_));
EXPECT_CALL(*mock_policy_manager_,
GetAppPermissionsChanges(kMacAddr_, kPolicyAppId_))
.WillOnce(Return(permissions));
@@ -1323,19 +1290,6 @@ TEST_F(PolicyHandlerTest, OnSystemInfoChanged) {
policy_handler_.OnSystemInfoChanged(language);
}
-TEST_F(PolicyHandlerTest, OnGetSystemInfo) {
- // Arrange
- ChangePolicyManagerToMock();
- // Check expectations
- const std::string ccpu_version("4.1.3.B_EB355B");
- const std::string wers_country_code("WAEGB");
- const std::string language("ru-ru");
- EXPECT_CALL(*mock_policy_manager_,
- SetSystemInfo(ccpu_version, wers_country_code, language));
- // Act
- policy_handler_.OnGetSystemInfo(ccpu_version, wers_country_code, language);
-}
-
TEST_F(PolicyHandlerTest, IsApplicationRevoked) {
// Arrange
EnablePolicy();
@@ -1915,7 +1869,7 @@ TEST_F(PolicyHandlerTest, OnDeviceConsentChanged_ConsentAllowed) {
EXPECT_CALL(*mock_app_, policy_app_id()).WillOnce(Return(kPolicyAppId_));
EXPECT_CALL(*mock_policy_manager_, IsPredataPolicy(kPolicyAppId_))
- .WillOnce(Return(true));
+ .WillRepeatedly(Return(true));
EXPECT_CALL(
*mock_policy_manager_,
@@ -1944,7 +1898,7 @@ TEST_F(PolicyHandlerTest, OnDeviceConsentChanged_ConsentNotAllowed) {
EXPECT_CALL(*mock_app_, policy_app_id()).WillOnce(Return(kPolicyAppId_));
EXPECT_CALL(*mock_policy_manager_, IsPredataPolicy(kPolicyAppId_))
- .WillOnce(Return(true));
+ .WillRepeatedly(Return(true));
EXPECT_CALL(*mock_policy_manager_,
ReactOnUserDevConsentForApp(handle, kPolicyAppId_, is_allowed))
@@ -1976,7 +1930,7 @@ TEST_F(PolicyHandlerTest, OnDeviceConsentChanged_PredatePolicyNotAllowed) {
// App does not have predate policy
EXPECT_CALL(*mock_policy_manager_, IsPredataPolicy(kPolicyAppId_))
- .WillOnce(Return(false));
+ .WillRepeatedly(Return(false));
EXPECT_CALL(
*mock_policy_manager_,
@@ -2258,24 +2212,20 @@ TEST_F(PolicyHandlerTest,
EXPECT_CALL(*mock_app_, policy_app_id()).WillOnce(Return(kPolicyAppId_));
EXPECT_CALL(*mock_app_, device()).WillOnce(Return(device));
- sync_primitives::Lock wait_hmi_lock_first;
- sync_primitives::AutoLock auto_lock_first(wait_hmi_lock_first);
- WaitAsync waiter_first(kCallsCount_, kTimeout_);
+ auto waiter_first = TestAsyncWaiter::createInstance();
#ifdef EXTERNAL_PROPRIETARY_MODE
EXPECT_CALL(*mock_policy_manager_, SetUserConsentForApp(_, _))
- .WillOnce(NotifyAsync(&waiter_first));
+ .WillOnce(NotifyTestAsyncWaiter(waiter_first));
#else
EXPECT_CALL(*mock_policy_manager_, SetUserConsentForApp(_))
- .WillOnce(NotifyAsync(&waiter_first));
+ .WillOnce(NotifyTestAsyncWaiter(waiter_first));
#endif
ExternalConsentStatusItem item(1u, 1u, kStatusOn);
ExternalConsentStatus external_consent_status;
external_consent_status.insert(item);
#ifdef EXTERNAL_PROPRIETARY_MODE
- sync_primitives::Lock wait_hmi_lock_second;
- sync_primitives::AutoLock auto_lock_second(wait_hmi_lock_second);
- WaitAsync waiter_second(kCallsCount_, kTimeout_);
+ auto waiter_second = TestAsyncWaiter::createInstance();
EXPECT_CALL(*mock_policy_manager_,
SetExternalConsentStatus(external_consent_status))
@@ -2286,9 +2236,9 @@ TEST_F(PolicyHandlerTest,
policy_handler_.OnAppPermissionConsent(kConnectionKey_, permissions);
#endif
- EXPECT_TRUE(waiter_first.Wait(auto_lock_first));
+ EXPECT_TRUE(waiter_first->WaitFor(kCallsCount_, kTimeout_));
#ifdef EXTERNAL_PROPRIETARY_MODE
- EXPECT_TRUE(waiter_second.Wait(auto_lock_second));
+ EXPECT_TRUE(waiter_second->WaitFor(kCallsCount_, kTimeout_));
#endif
}
@@ -2309,9 +2259,7 @@ TEST_F(PolicyHandlerTest,
permissions.group_permissions.push_back(group_permission_allowed);
- sync_primitives::Lock wait_hmi_lock;
- sync_primitives::AutoLock auto_lock(wait_hmi_lock);
- WaitAsync waiter(kCallsCount_, kTimeout_);
+ auto waiter = TestAsyncWaiter::createInstance();
EXPECT_CALL(app_manager_, application(_)).Times(0);
@@ -2328,7 +2276,7 @@ TEST_F(PolicyHandlerTest,
policy_handler_.OnAppPermissionConsent(invalid_connection_key, permissions);
#endif
- EXPECT_FALSE(waiter.Wait(auto_lock));
+ EXPECT_FALSE(waiter->WaitFor(kCallsCount_, kTimeout_));
}
TEST_F(PolicyHandlerTest,
@@ -2348,9 +2296,7 @@ TEST_F(PolicyHandlerTest,
permissions.group_permissions.push_back(group_permission_allowed);
- sync_primitives::Lock wait_hmi_lock;
- sync_primitives::AutoLock auto_lock(wait_hmi_lock);
- WaitAsync waiter(kCallsCount_, kTimeout_);
+ auto waiter = TestAsyncWaiter::createInstance();
EXPECT_CALL(app_manager_, application(_)).Times(0);
@@ -2369,7 +2315,7 @@ TEST_F(PolicyHandlerTest,
policy_handler_.OnAppPermissionConsent(invalid_connection_key, permissions);
#endif
- EXPECT_FALSE(waiter.Wait(auto_lock));
+ EXPECT_FALSE(waiter->WaitFor(kCallsCount_, kTimeout_));
}
ACTION_P(SetDeviceParamsMacAdress, mac_adress) {
@@ -2421,13 +2367,11 @@ TEST_F(PolicyHandlerTest,
ExternalConsentStatus external_consent_status;
external_consent_status.insert(item);
#ifdef EXTERNAL_PROPRIETARY_MODE
- sync_primitives::Lock wait_hmi_lock;
- sync_primitives::AutoLock auto_lock(wait_hmi_lock);
- WaitAsync waiter(kCallsCount_, kTimeout_);
+ auto waiter = TestAsyncWaiter::createInstance();
EXPECT_CALL(*mock_policy_manager_,
SetExternalConsentStatus(external_consent_status))
- .WillOnce(DoAll(NotifyAsync(&waiter), Return(true)));
+ .WillOnce(DoAll(NotifyTestAsyncWaiter(waiter), Return(true)));
policy_handler_.OnAppPermissionConsent(
invalid_connection_key, permissions, external_consent_status);
#else
@@ -2436,7 +2380,7 @@ TEST_F(PolicyHandlerTest,
Mock::VerifyAndClearExpectations(mock_app_.get());
#ifdef EXTERNAL_PROPRIETARY_MODE
- EXPECT_TRUE(waiter.Wait(auto_lock));
+ EXPECT_TRUE(waiter->WaitFor(kCallsCount_, kTimeout_));
#endif
}
@@ -2485,9 +2429,7 @@ TEST_F(PolicyHandlerTest,
ExternalConsentStatus external_consent_status;
external_consent_status.insert(item);
#ifdef EXTERNAL_PROPRIETARY_MODE
- sync_primitives::Lock wait_hmi_lock;
- sync_primitives::AutoLock auto_lock(wait_hmi_lock);
- WaitAsync waiter(kCallsCount_, kTimeout_);
+ auto waiter = TestAsyncWaiter::createInstance();
ON_CALL(*mock_policy_manager_, IsNeedToUpdateExternalConsentStatus(_))
.WillByDefault(Return(false));
@@ -2502,7 +2444,7 @@ TEST_F(PolicyHandlerTest,
Mock::VerifyAndClearExpectations(mock_app_.get());
#ifdef EXTERNAL_PROPRIETARY_MODE
- EXPECT_FALSE(waiter.Wait(auto_lock));
+ EXPECT_FALSE(waiter->WaitFor(kCallsCount_, kTimeout_));
#endif
}
@@ -2553,37 +2495,33 @@ TEST_F(PolicyHandlerTest, AddStatisticsInfo_UnknownStatistics_UNSUCCESS) {
TEST_F(PolicyHandlerTest, AddStatisticsInfo_SUCCESS) {
EnablePolicyAndPolicyManagerMock();
- sync_primitives::Lock wait_hmi_lock;
- sync_primitives::AutoLock auto_lock(wait_hmi_lock);
- WaitAsync waiter(kCallsCount_, kTimeout_);
+ auto waiter = TestAsyncWaiter::createInstance();
EXPECT_CALL(*mock_policy_manager_, Increment(_))
- .WillOnce(NotifyAsync(&waiter));
+ .WillOnce(NotifyTestAsyncWaiter(waiter));
policy_handler_.AddStatisticsInfo(
hmi_apis::Common_StatisticsType::iAPP_BUFFER_FULL);
- EXPECT_TRUE(waiter.Wait(auto_lock));
+ EXPECT_TRUE(waiter->WaitFor(kCallsCount_, kTimeout_));
}
TEST_F(PolicyHandlerTest, OnSystemError_SUCCESS) {
EnablePolicyAndPolicyManagerMock();
- sync_primitives::Lock wait_hmi_lock;
- sync_primitives::AutoLock auto_lock(wait_hmi_lock);
- WaitAsync waiter(kCallsCount_, kTimeout_);
+ auto waiter_first = TestAsyncWaiter::createInstance();
EXPECT_CALL(*mock_policy_manager_, Increment(_))
- .WillOnce(NotifyAsync(&waiter));
+ .WillOnce(NotifyTestAsyncWaiter(waiter_first));
policy_handler_.OnSystemError(hmi_apis::Common_SystemError::SYNC_REBOOTED);
- EXPECT_TRUE(waiter.Wait(auto_lock));
+ EXPECT_TRUE(waiter_first->WaitFor(kCallsCount_, kTimeout_));
- WaitAsync waiter1(kCallsCount_, kTimeout_);
- EXPECT_CALL(*mock_policy_manager_, Increment(_))
- .WillOnce(NotifyAsync(&waiter1));
+ auto waiter_second = TestAsyncWaiter::createInstance();
+ EXPECT_CALL(*mock_policy_manager_, Increment(_))
+ .WillOnce(NotifyTestAsyncWaiter(waiter_second));
policy_handler_.OnSystemError(
hmi_apis::Common_SystemError::SYNC_OUT_OF_MEMMORY);
- EXPECT_TRUE(waiter1.Wait(auto_lock));
+ EXPECT_TRUE(waiter_second->WaitFor(kCallsCount_, kTimeout_));
}
TEST_F(PolicyHandlerTest, RemoteAppsUrl_EndpointsEmpty_UNSUCCESS) {
diff --git a/src/components/application_manager/test/request_controller/request_controller_test.cc b/src/components/application_manager/test/request_controller/request_controller_test.cc
index 71e12b2825..992bf8e303 100644
--- a/src/components/application_manager/test/request_controller/request_controller_test.cc
+++ b/src/components/application_manager/test/request_controller/request_controller_test.cc
@@ -162,35 +162,35 @@ class RequestControllerTestClass : public ::testing::Test {
TEST_F(RequestControllerTestClass,
AddMobileRequest_DuplicateCorrelationId_INVALID_ID) {
RequestPtr request_valid = GetMockRequest();
- TestAsyncWaiter waiter_valid;
+ auto waiter_valid = TestAsyncWaiter::createInstance();
ON_CALL(*request_valid, default_timeout()).WillByDefault(Return(0));
EXPECT_CALL(*request_valid, Init()).WillOnce(Return(true));
EXPECT_CALL(*request_valid, Run())
.Times(1)
- .WillRepeatedly(NotifyTestAsyncWaiter(&waiter_valid));
+ .WillRepeatedly(NotifyTestAsyncWaiter(waiter_valid));
EXPECT_EQ(RequestController::SUCCESS,
AddRequest(default_settings_,
request_valid,
RequestInfo::RequestType::MobileRequest,
mobile_apis::HMILevel::HMI_NONE));
- EXPECT_TRUE(waiter_valid.WaitFor(1, 1000));
+ EXPECT_TRUE(waiter_valid->WaitFor(1, 1000));
// The command should not be run if another command with the same
// correlation_id is waiting for a response
RequestPtr request_dup_corr_id = GetMockRequest();
- TestAsyncWaiter waiter_dup;
+ auto waiter_dup = TestAsyncWaiter::createInstance();
ON_CALL(*request_dup_corr_id, default_timeout()).WillByDefault(Return(0));
EXPECT_CALL(*request_dup_corr_id, Init()).WillOnce(Return(true));
ON_CALL(*request_dup_corr_id, Run())
- .WillByDefault(NotifyTestAsyncWaiter(&waiter_dup));
+ .WillByDefault(NotifyTestAsyncWaiter(waiter_dup));
EXPECT_EQ(RequestController::SUCCESS,
AddRequest(default_settings_,
request_dup_corr_id,
RequestInfo::RequestType::MobileRequest,
mobile_apis::HMILevel::HMI_NONE));
- EXPECT_FALSE(waiter_dup.WaitFor(1, 1000));
+ EXPECT_FALSE(waiter_dup->WaitFor(1, 1000));
}
TEST_F(RequestControllerTestClass,
@@ -282,17 +282,17 @@ TEST_F(RequestControllerTestClass, OnTimer_SUCCESS) {
RequestPtr mock_request = GetMockRequest(
kDefaultCorrelationID, kDefaultConnectionKey, request_timeout);
- TestAsyncWaiter waiter;
+ auto waiter = TestAsyncWaiter::createInstance();
EXPECT_EQ(RequestController::SUCCESS,
AddRequest(default_settings_,
mock_request,
RequestInfo::RequestType::MobileRequest));
EXPECT_CALL(*mock_request, onTimeOut())
- .WillOnce(NotifyTestAsyncWaiter(&waiter));
+ .WillOnce(NotifyTestAsyncWaiter(waiter));
// Waiting for call of `onTimeOut` for `kTimeScale` seconds
- EXPECT_TRUE(waiter.WaitFor(1, kTimeScale));
+ EXPECT_TRUE(waiter->WaitFor(1, kTimeScale));
}
} // namespace request_controller_test
diff --git a/src/components/application_manager/test/resumption/resume_ctrl_test.cc b/src/components/application_manager/test/resumption/resume_ctrl_test.cc
index 8d228240d2..a265b2b341 100644
--- a/src/components/application_manager/test/resumption/resume_ctrl_test.cc
+++ b/src/components/application_manager/test/resumption/resume_ctrl_test.cc
@@ -685,9 +685,9 @@ TEST_F(ResumeCtrlTest,
extensions.insert(extensions.begin(), mock_app_extension_);
EXPECT_CALL(*mock_app_, Extensions()).WillOnce(ReturnRef(extensions));
- EXPECT_CALL(
- mock_app_mngr_,
- SubscribeAppForWayPoints(A<application_manager::ApplicationSharedPtr>()));
+ EXPECT_CALL(mock_app_mngr_,
+ SubscribeAppForWayPoints(
+ A<application_manager::ApplicationSharedPtr>(), true));
const mobile_apis::HMILevel::eType hmi_test_level =
mobile_apis::HMILevel::HMI_FULL;
ON_CALL(mock_app_mngr_, GetDefaultHmiLevel(const_app_))
diff --git a/src/components/application_manager/test/resumption/resumption_data_test.cc b/src/components/application_manager/test/resumption/resumption_data_test.cc
index d5228934db..a416cbbad5 100644
--- a/src/components/application_manager/test/resumption/resumption_data_test.cc
+++ b/src/components/application_manager/test/resumption/resumption_data_test.cc
@@ -437,6 +437,8 @@ void ResumptionDataTest::PrepareData() {
ON_CALL(*app_mock, getAppFiles()).WillByDefault(ReturnRef(app_files_map_));
ON_CALL(*app_mock, window_optional_params_map())
.WillByDefault(Return(window_params_map));
+ ON_CALL(*app_mock, get_user_location())
+ .WillByDefault(ReturnRef(user_location_));
}
void ResumptionDataTest::SetDefaultCurrentHmiState() {
diff --git a/src/components/application_manager/test/resumption_sql_queries_test.cc b/src/components/application_manager/test/resumption_sql_queries_test.cc
index 61490ae4af..f31d8f8e28 100644
--- a/src/components/application_manager/test/resumption_sql_queries_test.cc
+++ b/src/components/application_manager/test/resumption_sql_queries_test.cc
@@ -81,6 +81,7 @@ const string kDeleteData =
"DELETE FROM `applicationSubMenuArray`; "
"DELETE FROM `applicationSubscriptionsArray`; "
"DELETE FROM `_internal_data`; "
+ "DELETE FROM `applicationUserLocation`;"
"COMMIT; "
"VACUUM;";
@@ -329,6 +330,7 @@ class ResumptionSqlQueriesTest : public ::testing::Test {
db_schema.push_back("applicationSubMenuArray");
db_schema.push_back("applicationSubscriptionsArray");
db_schema.push_back("_internal_data");
+ db_schema.push_back("applicationUserLocation");
std::sort(db_schema.begin(), db_schema.end());
}
};
diff --git a/src/components/application_manager/test/rpc_passing_handler_test.cc b/src/components/application_manager/test/rpc_passing_handler_test.cc
index 6eac6ca0b1..4e7f401646 100644
--- a/src/components/application_manager/test/rpc_passing_handler_test.cc
+++ b/src/components/application_manager/test/rpc_passing_handler_test.cc
@@ -390,7 +390,7 @@ TEST_F(RPCPassingHandlerTest,
TEST_F(RPCPassingHandlerTest, RPCPassingTest_REQUEST_Timeout) {
uint32_t timeout_in_ms = 4;
- std::shared_ptr<TestAsyncWaiter> waiter = std::make_shared<TestAsyncWaiter>();
+ auto waiter = TestAsyncWaiter::createInstance();
app_services_.push_back(CreateAppService(
kConnectionKey_NAV_ASP, "Navigation service", "NAVIGATION"));
diff --git a/src/components/application_manager/test/sdl_preloaded_pt.json b/src/components/application_manager/test/sdl_preloaded_pt.json
deleted file mode 100644
index 536a0939f9..0000000000
--- a/src/components/application_manager/test/sdl_preloaded_pt.json
+++ /dev/null
@@ -1,1979 +0,0 @@
- {
- "policy_table": {
- "module_config": {
- "preloaded_pt": true,
- "preloaded_date": "2015-02-12",
- "exchange_after_x_ignition_cycles": 100,
- "exchange_after_x_kilometers": 1800,
- "exchange_after_x_days": 30,
- "timeout_after_x_seconds": 70,
- "seconds_between_retries": [1,
- 5,
- 25,
- 125,
- 625],
- "endpoints": {
- "0x07": {
- "default": ["http://x.x.x.x:3000/api/1/policies"]
- }
- },
- "notifications_per_minute_by_priority": {
- "EMERGENCY": 60,
- "NAVIGATION": 15,
- "PROJECTION": 15,
- "VOICECOM": 20,
- "COMMUNICATION": 6,
- "NORMAL": 4,
- "NONE": 0
- },
- "subtle_notifications_per_minute_by_priority": {
- "EMERGENCY": 60,
- "NAVIGATION": 20,
- "PROJECTION": 20,
- "VOICECOM": 30,
- "COMMUNICATION": 15,
- "NORMAL": 10,
- "NONE": 0
- }
- },
- "functional_groupings": {
- "Base-4": {
- "rpcs": {
- "AddCommand": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"]
- },
- "AddSubMenu": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"]
- },
- "Alert": {
- "hmi_levels": ["FULL",
- "LIMITED"]
- },
- "ChangeRegistration": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "CreateInteractionChoiceSet": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"]
- },
- "DeleteCommand": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"]
- },
- "DeleteFile": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "DeleteInteractionChoiceSet": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"]
- },
- "DeleteSubMenu": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"]
- },
- "EncodedSyncPData": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "EndAudioPassThru": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"]
- },
- "GenericResponse": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"]
- },
- "ListFiles": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "OnAppInterfaceUnregistered": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "OnAudioPassThru": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"]
- },
- "OnButtonEvent": {
- "hmi_levels": ["FULL",
- "LIMITED"]
- },
- "OnButtonPress": {
- "hmi_levels": ["FULL",
- "LIMITED"]
- },
- "OnCommand": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"]
- },
- "OnDriverDistraction": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"]
- },
- "OnEncodedSyncPData": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "OnHashChange": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "OnHMIStatus": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "OnLanguageChange": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "OnPermissionsChange": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "OnSystemRequest": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "PerformAudioPassThru": {
- "hmi_levels": ["FULL",
- "LIMITED"]
- },
- "PerformInteraction": {
- "hmi_levels": ["FULL",
- "LIMITED"]
- },
- "PutFile": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "RegisterAppInterface": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "ResetGlobalProperties": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"]
- },
- "ScrollableMessage": {
- "hmi_levels": ["FULL"]
- },
- "SetAppIcon": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "SetDisplayLayout": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "SetGlobalProperties": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"]
- },
- "SetMediaClockTimer": {
- "hmi_levels": ["FULL",
- "LIMITED"]
- },
- "Show": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"]
- },
- "Slider": {
- "hmi_levels": ["FULL"]
- },
- "Speak": {
- "hmi_levels": ["FULL",
- "LIMITED"]
- },
- "SubscribeButton": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"]
- },
- "SystemRequest": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "UnregisterAppInterface": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "UnsubscribeButton": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"]
- }
- }
- },
- "Location-1": {
- "user_consent_prompt": "Location",
- "rpcs": {
- "GetVehicleData": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"],
- "parameters": ["gps",
- "speed"]
- },
- "OnVehicleData": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"],
- "parameters": ["gps",
- "speed"]
- },
- "SubscribeVehicleData": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"],
- "parameters": ["gps",
- "speed"]
- },
- "UnsubscribeVehicleData": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"],
- "parameters": ["gps",
- "speed"]
- }
- }
- },
- "Notifications": {
- "user_consent_prompt": "Notifications",
- "rpcs": {
- "Alert": {
- "hmi_levels": ["BACKGROUND"]
- }
- }
- },
- "DrivingCharacteristics-3": {
- "user_consent_prompt": "DrivingCharacteristics",
- "rpcs": {
- "GetVehicleData": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"],
- "parameters": ["accPedalPosition",
- "beltStatus",
- "electronicParkBrakeStatus",
- "driverBraking",
- "myKey",
- "prndl",
- "rpm",
- "steeringWheelAngle"]
- },
- "OnVehicleData": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"],
- "parameters": ["accPedalPosition",
- "beltStatus",
- "electronicParkBrakeStatus",
- "driverBraking",
- "myKey",
- "prndl",
- "rpm",
- "steeringWheelAngle"]
- },
- "SubscribeVehicleData": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"],
- "parameters": ["accPedalPosition",
- "beltStatus",
- "electronicParkBrakeStatus",
- "driverBraking",
- "myKey",
- "prndl",
- "rpm",
- "steeringWheelAngle"]
- },
- "UnsubscribeVehicleData": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"],
- "parameters": ["accPedalPosition",
- "beltStatus",
- "electronicParkBrakeStatus",
- "driverBraking",
- "myKey",
- "prndl",
- "rpm",
- "steeringWheelAngle"]
- }
- }
- },
- "VehicleInfo-3": {
- "user_consent_prompt": "VehicleInfo",
- "rpcs": {
- "GetVehicleData": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"],
- "parameters": ["bodyInformation",
- "deviceStatus",
- "engineOilLife",
- "engineTorque",
- "externalTemperature",
- "turnSignal",
- "fuelLevel",
- "fuelLevel_State",
- "headLampStatus",
- "instantFuelConsumption",
- "fuelRange",
- "cloudAppVehicleID",
- "odometer",
- "tirePressure",
- "vin",
- "wiperStatus",
- "stabilityControlsStatus"]
- },
- "OnVehicleData": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"],
- "parameters": ["bodyInformation",
- "deviceStatus",
- "engineOilLife",
- "engineTorque",
- "externalTemperature",
- "turnSignal",
- "fuelLevel",
- "fuelLevel_State",
- "headLampStatus",
- "instantFuelConsumption",
- "fuelRange",
- "cloudAppVehicleID",
- "odometer",
- "tirePressure",
- "vin",
- "wiperStatus",
- "stabilityControlsStatus"]
- },
- "SubscribeVehicleData": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"],
- "parameters": ["bodyInformation",
- "deviceStatus",
- "engineOilLife",
- "engineTorque",
- "externalTemperature",
- "turnSignal",
- "fuelLevel",
- "fuelLevel_State",
- "headLampStatus",
- "instantFuelConsumption",
- "fuelRange",
- "cloudAppVehicleID",
- "odometer",
- "tirePressure",
- "wiperStatus",
- "stabilityControlsStatus"]
- },
- "UnsubscribeVehicleData": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"],
- "parameters": ["bodyInformation",
- "deviceStatus",
- "engineOilLife",
- "engineTorque",
- "externalTemperature",
- "turnSignal",
- "fuelLevel",
- "fuelLevel_State",
- "headLampStatus",
- "instantFuelConsumption",
- "fuelRange",
- "cloudAppVehicleID",
- "odometer",
- "tirePressure",
- "wiperStatus",
- "stabilityControlsStatus"]
- }
- }
- },
- "PropriataryData-1": {
- "rpcs": {
- "DiagnosticMessage": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"]
- },
- "GetDTCs": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"]
- },
- "ReadDID": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"]
- }
- }
- },
- "Emergency-1": {
- "rpcs": {
- "GetVehicleData": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"],
- "parameters": ["airbagStatus",
- "clusterModeStatus",
- "eCallInfo",
- "emergencyEvent"]
- },
- "OnVehicleData": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"],
- "parameters": ["airbagStatus",
- "clusterModeStatus",
- "eCallInfo",
- "emergencyEvent"]
- },
- "SubscribeVehicleData": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"],
- "parameters": ["airbagStatus",
- "clusterModeStatus",
- "eCallInfo",
- "emergencyEvent"]
- },
- "UnsubscribeVehicleData": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"],
- "parameters": ["airbagStatus",
- "clusterModeStatus",
- "eCallInfo",
- "emergencyEvent"]
- }
- }
- },
- "Navigation-1": {
- "rpcs": {
- "AlertManeuver": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"]
- },
- "ShowConstantTBT": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"]
- },
- "UpdateTurnList": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED"]
- }
- }
- },
- "DataConsent-2": {
- "user_consent_prompt": "DataConsent",
- "rpcs": null
- },
- "BaseBeforeDataConsent": {
- "rpcs": {
- "ChangeRegistration": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "DeleteFile": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "EncodedSyncPData": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "ListFiles": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "OnAppInterfaceUnregistered": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "OnEncodedSyncPData": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "OnHashChange": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "OnHMIStatus": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "OnLanguageChange": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "OnPermissionsChange": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "OnSystemRequest": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "PutFile": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "RegisterAppInterface": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "SetAppIcon": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "SetDisplayLayout": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "SystemRequest": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- },
- "UnregisterAppInterface": {
- "hmi_levels": ["BACKGROUND",
- "FULL",
- "LIMITED",
- "NONE"]
- }
- }
- }
- },
- "consumer_friendly_messages": {
- "version": "001.001.019",
- "messages": {
- "AppPermissions": {
- "languages": {
- "de-de": {
- "tts": "%appName% benötigt die folgenden Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Wenn Sie Ja drücken, erklären Sie sich damit einverstanden, dass %vehicleMake% nicht für Schäden oder Verletzungen der Privatsphäre haftet, die im Zusammenhang mit der Nutzung Ihrer Benutzerdaten durch %appName% entstehen. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab.",
- "line1": "Zugriffsanfrage(n)",
- "line2": "erlauben?"
- },
- "en-au": {
- "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.",
- "line1": "Grant requested",
- "line2": "permission(s)?"
- },
- "en-gb": {
- "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. Please press Yes to allow or No to deny.",
- "line1": "Grant requested",
- "line2": "permission(s)?",
- "textBody": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu."
- },
- "en-ie": {
- "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.",
- "line1": "Grant requested",
- "line2": "permission(s)?"
- },
- "en-us": {
- "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%’s use of your data. Please press yes to allow or no to deny.",
- "line1": "Grant Requested",
- "line2": "Permission(s)?",
- "textBody": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. \n\nIf you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%’s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu."
- },
- "es-en": {
- "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.",
- "line1": "¿Otorgar permiso(s)",
- "line2": "solicitado(s)?",
- "textBody": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar. \n\n Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles."
- },
- "es-es": {
- "tts": "%appName% está solicitando el uso de los siguientes permisos e información del vehículo: %functionalGroupLabels%. Si pulsa sí, acepta que %vehicleMake% no será responsable de los daños o la pérdida de privacidad relacionados con el uso de sus datos por parte de %appName%. Pulse sí para permitir o no para denegar.",
- "line1": "¿Conceder permisos",
- "line2": "solicitados?"
- },
- "es-mx": {
- "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.",
- "line1": "¿Otorgar permiso(s)",
- "line2": "solicitado(s)?"
- },
- "fr-ca": {
- "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.",
- "line1": "Accorder permission(s)",
- "line2": "demandée(s)",
- "textBody": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles."
- },
- "fr-fr": {
- "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.",
- "line1": "Accorder permission(s)",
- "line2": "demandée(s)"
- },
- "it-it": {
- "tts": "%appName% richiede l'uso delle seguenti informazioni e autorizzazioni sul veicolo: %functionalGroupLabels%. Se si preme Sì, si acconsente che %vehicleMake% non sarà responsabile per danni o perdita di privacy in relazione all'impiego dei dati da parte di %appName%. Premere Sì per consentire e No per negare.",
- "line1": "Concedi autorizzaz.",
- "line2": "richiesta(e)?"
- },
- "nl-nl": {
- "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. Als u op Ja drukt, gaat u ermee akkoord dat %vehicleMake% in geen geval aansprakelijk gesteld kan worden voor schade of verlies van privacy als gevolg van het feit dat %appName% gebruik maakt van uw gegevens. Druk op Ja om dit toe te staan of Nee om te weigeren.",
- "line1": "Aangevraagde",
- "line2": "permissie(s) verlenen?"
- },
- "pl-pl": {
- "tts": "%appName% wymaga następujących informacji o pojeździe oraz pozwoleń: %functionalGroupLabels%. Naciśnięcie TAK oznacza zgodę na fakt, iż %vehicleMake% nie będzie ponosić odpowiedzialności za szkody ani utratę prywatności w związku z wykorzystaniem przez %appName% danych, należących do użytkownika. Naciśnij TAK w celu udzielenia zgody lub NIE w celu odrzucenia żądania.",
- "line1": "Udzielić żądanych",
- "line2": "pozwoleń?"
- },
- "pt-br": {
- "tts": "%appName% está solicitando o uso das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se pressionar sim, você concorda que a %vehicleMake% não será responsável por danos ou perdas de privacidade relacionados ao uso dos seus dados por %appName%. Pressione sim para permitir ou não para negar.",
- "line1": "Conceder permissão",
- "line2": "solicitada?"
- },
- "pt-pt": {
- "tts": "%appName% está a solicitar a utilização das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se premir “Sim”, concorda que %vehicleMake% não será responsável por quaisquer danos ou perda de privacidade relacionada com a utilização dos seus dados por parte de %appName%. Prima “Sim” para permitir ou “Não” para recusar.",
- "line1": "Conceder permiss.",
- "line2": "solicitada(s)?"
- },
- "ru-ru": {
- "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Нажатием \"\"да\"\", Вы соглашаетесь, что %vehicleMake% не будет нести ответственность за какие-либо убытки или потерю прайвеси, связанные с использованием Ваших данных компанией %appName%. Нажмите \"\"Да\"\", если Вы согласны, или \"\"Нет\"\" - если не согласны.",
- "line1": "Предост. заправш.",
- "line2": "разрешения?"
- },
- "sv-se": {
- "tts": "%appName% begär att få tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Om du trycker Ja godkänner du att %vehicleMake% ska hållas skadeslös för alla skador som kan uppstå eller eventuella integritetsintrång som uppstår när %appName% använder dina data. Tryck Ja för att godkänna eller Nej för att neka.",
- "line1": "Vill du ge",
- "line2": "tillstånd?"
- },
- "tr-tr": {
- "tts": "%appName%, şu araç bilgilerini ve izinleri kullanma isteğinde bulunuyor: %functionalGroupLabels%. Evet'e basarsanız, %appName%'in verilerinizi kullanması sonucunda oluşabilecek hasarlardan veya gizlilik kaybından %vehicleMake%'in sorumlu olmayacağını kabul etmiş olacaksınız. Lütfen kabul etmek için Evet'e veya reddetmek için Hayır'a basın.",
- "line1": "İstenen izinler",
- "line2": "verilsin mi?"
- },
- "zh-cn": {
- "tts": "%appName% 正在请求使用下列车辆信息和权限: %functionalGroupLabels%。如果您按“是”,则表示您同意。 %vehicleMake% 将不会对因 %appName% 使用您的数据而引起的任何损毁或隐私损失负责。 请按“是”允许或按“否”拒绝。",
- "line1": "是否允许请求的",
- "line2": "权限?"
- },
- "zh-tw": {
- "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。按「是」,表示您同意,如因 %appName% 使用您的資料導致任何損害或損失,%vehicleMake% 將不負賠償責任。同意請按「是」,拒絕請按「否」。",
- "line1": "允許",
- "line2": "授權請求?"
- }
- }
- },
- "AppPermissionsHelp": {
- "languages": {
- "de-de": {
- "tts": "%appName% fordert folgende Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Im Einstellungsmenü der mobilen Apps können Sie diese Berechtigungen ändern und sich detaillierte Beschreibungen anhören. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab."
- },
- "en-au": {
- "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny."
- },
- "en-gb": {
- "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny."
- },
- "en-ie": {
- "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny."
- },
- "en-us": {
- "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press yes to grant permissions or no to deny."
- },
- "es-en": {
- "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar."
- },
- "es-es": {
- "tts": "%appName% está solicitando los siguientes permisos e información del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y escuchar descripciones detalladas en el menú de configuración de la aplicación móvil. Pulse sí para conceder el permiso o no para denegarlo."
- },
- "es-mx": {
- "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar."
- },
- "fr-ca": {
- "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser."
- },
- "fr-fr": {
- "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser."
- },
- "it-it": {
- "tts": "%appName% richiede le seguenti informazioni e autorizzazioni riguardo il veicolo: %functionalGroupLabels%. È possibile modificare tali autorizzazioni e ascoltare descrizioni dettagliate nel menu impostazioni delle app mobili. Premere Sì per concedere le autorizzazioni e No per negarle."
- },
- "nl-nl": {
- "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. U kunt deze toestemmingen wijzigen en gedetailleerde beschrijvingen beluisteren in het instellingenmenu voor mobiele apps. Druk op Ja om permissies te verlenen of op Nee om te weigeren."
- },
- "pl-pl": {
- "tts": "%appName% wymaga następujących informacji o pojeździe oraz zezwoleń: %functionalGroupLabels%. W menu ustawień aplikacji mobilnych można zmienić owe zezwolenia i usłyszeć ich szczegółowy opis. Naciśnij TAK, aby wyrazić zgodę lub NIE w celu odrzucenia żądania."
- },
- "pt-br": {
- "tts": "%appName% está solicitando as seguintes informações e permissões do veículo: %functionalGroupLabels%. Você pode alterar estas permissões e ouvir descrições detalhadas no menu de configurações de aplicativos móveis. Pressione sim para conceder as permissões ou não para negar."
- },
- "pt-pt": {
- "tts": "%appName% está a solicitar as seguintes informações e permissões do veículo: %functionalGroupLabels%. Pode alterar estas permissões e ouvir descrições detalhadas no menu de definições das aplicações móveis. Prima \"\"Sim\"\" para permitir ou \"\"Não\"\" para recusar."
- },
- "ru-ru": {
- "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Вы можете изменить эти разрешения и прослушать подробные их описания в меню настроек мобильного приложения. Нажмите \"\"да\"\", чтобы предоставить разрешения, или \"\"нет\"\", чтобы не предоставлять."
- },
- "sv-se": {
- "tts": "%appName% begär tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Du kan ändra tillstånden och höra detaljerade beskrivningar i menyn för mobilappsinställningar. Tryck Ja för att ge tillstånd eller Nej för att neka."
- },
- "tr-tr": {
- "tts": "%appName%, şu araç bilgilerini ve izinleri istiyor: %functionalGroupLabels%. Bu izinleri değiştirebilir ve mobil uygulamalar ayarlar menüsünden ayrıntılı açıklamaları dinleyebilirsiniz. Lütfen izin vermek için Evet'e veya reddetmek için Hayır'a basın."
- },
- "zh-cn": {
- "tts": "%appName% 正在请求下列车辆信息和权限: %functionalGroupLabels%。您可在移动应用程序设置菜单中更改这些权限,并听取详细说明。请按“是”允许权限或按“否”拒绝。"
- },
- "zh-tw": {
- "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。您可在行動應用程式設定清單中更改這些許可,並聆聽詳細說明。給予許可請按「是」,拒絕請按「否」。"
- }
- }
- },
- "AppPermissionsRevoked": {
- "languages": {
- "de-de": {
- "tts": "Die Autorisierungsdaten der App wurden geändert. %appName% hat keinen Zugriff auf %functionalGroupLabels% mehr. Installieren Sie die neueste Version der App auf Ihrem Gerät.."
- },
- "en-au": {
- "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device."
- },
- "en-gb": {
- "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device."
- },
- "en-ie": {
- "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device."
- },
- "en-us": {
- "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device."
- },
- "es-en": {
- "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil."
- },
- "es-es": {
- "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de que tiene la versión más reciente de la aplicación instalada en su dispositivo móvil."
- },
- "es-mx": {
- "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil."
- },
- "fr-ca": {
- "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile."
- },
- "fr-fr": {
- "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile."
- },
- "it-it": {
- "tts": "Le autorizzazioni dell'app sono cambiate. %appName% non è più in grado di accedere a %functionalGroupLabels%. Assicurarsi di avere la versione più recente dell'app installata sul dispositivo mobile."
- },
- "nl-nl": {
- "tts": "De app-autorisaties zijn gewijzigd. %appName% heeft geen toegang meer tot %functionalGroupLabels%. Zorg ervoor dat u de meest recente app-versie op uw mobiele apparaat geïnstalleerd hebt."
- },
- "pl-pl": {
- "tts": "Dane dostępu aplikacji zostały zmienione. %appName% nie ma już dostępu do %functionalGroupLabels%. Sprawdź, czy na telefonie komórkowym zainstalowano najnowszą wersję aplikacji."
- },
- "pt-br": {
- "tts": "As autorizações dos aplicativos foram alteradas. %appName% não pode mais acessar %functionalGroupLabels%. Certifique-se de que a versão mais recente do aplicativo está instalada no seu dispositivo móvel."
- },
- "pt-pt": {
- "tts": "As autorizações das aplicações mudaram. %appName% já não consegue aceder a %functionalGroupLabels%. Certifique-se de que tem a última versão da aplicação no seu dispositivo móvel."
- },
- "ru-ru": {
- "tts": "Авторизации приложения изменены. %appName% больше не имеет доступа к %functionalGroupLabels%. Убедитесь, что на вашем мобильном устройстве установлена самая новая версия приложения."
- },
- "sv-se": {
- "tts": "Appens behörigheter har ändrats. %appName% har inte längre åtkomst till %functionalGroupLabels%. Kontrollera att du har installerat den senaste versionen av appen på mobilenheten."
- },
- "tr-tr": {
- "tts": "Uygulama yetkileri değişti. %appName% artık %functionalGroupLabels%'e erişemeyecek. Lütfen mobil aygıtınızda en son uygulama sürümünün yüklü olduğundan emin olun."
- },
- "zh-cn": {
- "tts": "应用程序授权已变更。 %appName% 将不能再访问 %functionalGroupLabels%。 请确认您的移动设备上安装的应用程序是最新版本。"
- },
- "zh-tw": {
- "tts": "應用程式授權已改變。%appName% 已無法進入 %functionalGroupLabels%。請確認您的行動裝置上安裝了最新版應用程式。"
- }
- }
- },
- "AppUnauthorized": {
- "languages": {
- "de-de": {
- "tts": "Diese Version von %appName% ist nicht autorisiert und wird nicht mit SYNC funktionieren.",
- "line1": "nicht autorisiert"
- },
- "en-au": {
- "tts": "This version of %appName% is not authorized and will not work with SYNC.",
- "line1": "not authorized"
- },
- "en-gb": {
- "tts": "This version of %appName% is not authorized and will not work with SYNC.",
- "line1": "not authorized",
- "textBody": "This version of %appName% is not authorized and will not work with SYNC."
- },
- "en-ie": {
- "tts": "This version of %appName% is not authorized and will not work with SYNC.",
- "line1": "not authorized"
- },
- "en-us": {
- "tts": "This version of %appName% is not authorized and will not work with SYNC.",
- "line1": "Not Authorized",
- "textBody": "This version of %appName% is no longer authorized to work with AppLink. Please update to the latest version of %appName%."
- },
- "es-en": {
- "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.",
- "line1": "no autorizada",
- "textBody": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC."
- },
- "es-es": {
- "tts": "Esta versión de %appName% no está autorizada y no funcionará con SYNC.",
- "line1": "No autorizada"
- },
- "es-mx": {
- "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.",
- "line1": "no autorizada"
- },
- "fr-ca": {
- "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.",
- "line1": "non autorisée",
- "textBody": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC."
- },
- "fr-fr": {
- "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.",
- "line1": "non autorisée"
- },
- "it-it": {
- "tts": "Questa versione di %appName% non è autorizzata e non funziona con il SYNC.",
- "line1": "non autorizzata"
- },
- "nl-nl": {
- "tts": "Deze versie van %appName% is niet geautoriseerd en werkt niet met SYNC.",
- "line1": "niet geautoriseerd"
- },
- "pl-pl": {
- "tts": "Niniejsza wersja %appName% nie posiada autoryzacji i nie będzie działać z SYNC.",
- "line1": "brak autoryzacji"
- },
- "pt-br": {
- "tts": "Esta versão do %appName% não tem autorização e não funcionará com o SYNC.",
- "line1": "não autorizado"
- },
- "pt-pt": {
- "tts": "Esta versão de %appName% não está autorizada e não funcionará com o SYNC.",
- "line1": "não autorizada"
- },
- "ru-ru": {
- "tts": "Эта версия %appName% не авторизирована и не будет работать с SYNC.",
- "line1": "не авторизировано"
- },
- "sv-se": {
- "tts": "Den här versionen av %appName% är inte godkänd och fungerar inte med SYNC.",
- "line1": "är ej godkänd"
- },
- "tr-tr": {
- "tts": "Bu %appName% sürümüne izin verilmediğinden SYNC ile çalışamaz.",
- "line1": "için izin yok"
- },
- "zh-cn": {
- "tts": "此版本的%appName% 未得到授权,无法在SYNC上使用。",
- "line1": "未得到授权"
- },
- "zh-tw": {
- "tts": "%appName% 的版本未獲得授權,將無法透過 SYNC 使用。",
- "line1": "無授權"
- }
- }
- },
- "AppUnsupported": {
- "languages": {
- "de-de": {
- "tts": "Diese Version von %appName% wird von SYNC nicht unterstützt.",
- "line1": "nicht unterstützt"
- },
- "en-au": {
- "tts": "This version of %appName% is not supported by SYNC.",
- "line1": "not supported"
- },
- "en-gb": {
- "tts": "This version of %appName% is not supported by SYNC.",
- "line1": "not supported",
- "textBody": "This version of %appName% is not supported by SYNC."
- },
- "en-ie": {
- "tts": "This version of %appName% is not supported by SYNC.",
- "line1": "not supported"
- },
- "en-us": {
- "tts": "This version of %appName% is not supported by SYNC.",
- "line1": "Not Supported",
- "textBody": "Your version of %appName% is not supported by SYNC."
- },
- "es-en": {
- "tts": "Esta versión de %appName% no es compatible con SYNC.",
- "line1": "no compatible",
- "textBody": "Esta versión de %appName% no es compatible con SYNC."
- },
- "es-es": {
- "tts": "Esta versión de %appName% no es compatible con SYNC.",
- "line1": "No compatible"
- },
- "es-mx": {
- "tts": "Esta versión de %appName% no es compatible con SYNC.",
- "line1": "no compatible"
- },
- "fr-ca": {
- "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.",
- "line1": "incompatible",
- "textBody": "Cette version de %appName% n’est pas prise en charge par SYNC."
- },
- "fr-fr": {
- "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.",
- "line1": "incompatible"
- },
- "it-it": {
- "tts": "Questa versione di %appName% non è supportata dal SYNC.",
- "line1": "non supportata"
- },
- "nl-nl": {
- "tts": "Deze versie van %appName% wordt niet ondersteund door SYNC.",
- "line1": "niet ondersteund"
- },
- "pl-pl": {
- "tts": "Niniejsza wersja %appName% nie jest obsługiwana przez system SYNC.",
- "line1": "aplikacja nie obsług."
- },
- "pt-br": {
- "tts": "Esta versão do %appName% não é suportada pelo SYNC.",
- "line1": "não suportado"
- },
- "pt-pt": {
- "tts": "Esta versão de %appName% não é suportado pelo SYNC.",
- "line1": "não suportada"
- },
- "ru-ru": {
- "tts": "Эта версия %appName% не поддерживается SYNC.",
- "line1": "не поддерживается"
- },
- "sv-se": {
- "tts": "SYNC har inte stöd för den här versionen av %appName%.",
- "line1": "stöds ej"
- },
- "tr-tr": {
- "tts": "Bu %appName% sürümü SYNC tarafından desteklenmiyor.",
- "line1": "desteklenmiyor"
- },
- "zh-cn": {
- "tts": "SYNC不支持此版本的%appName%。",
- "line1": "不受支持"
- },
- "zh-tw": {
- "tts": "SYNC 不支援此版本的%appName% 。",
- "line1": "不支援"
- }
- }
- },
- "DataConsent": {
- "languages": {
- "en-gb": {
- "textBody": "Would you like to enable Mobile Apps on SYNC? To use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S. Updates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information."
- },
- "en-us": {
- "line1": "Enable Mobile Apps",
- "line2": "on SYNC? (Uses Data)",
- "textBody": "Would you like to enable Mobile Apps on SYNC?\n\nTo use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S.\n\nUpdates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information."
- },
- "es-en": {
- "textBody": "Para usar aplicaciones móviles con SYNC, este debe comunicarse con Ford al menos una vez al mes a través del plan de datos de su dispositivo móvil. Pueden aplicar tarifas normales. SYNC enviará su VIN y el número de módulo de SYNC a Ford de Estados Unidos de América. Las actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario. /r Presione Sí para permitir y No para denegar."
- },
- "fr-ca": {
- "textBody": "Pour utiliser AppLink, SYNC devra communiquer avec Ford au moins une fois par mois en utilisant le forfait de données de votre appareil mobile. Les tarifs réguliers peuvent s’appliquer. SYNC enverra votre NIV et le numéro de votre module SYNC à Ford États-Unis. Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements. /r Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser."
- }
- }
- },
- "DataConsentHelp": {
- "languages": {
- "en-us": {
- "textBody": "Updates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. See your Owner Guide for more information."
- },
- "es-en": {
- "textBody": "Las actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario."
- },
- "fr-ca": {
- "textBody": "Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements."
- }
- }
- },
- "DisableApps": {
- "languages": {
- "de-de": {
- "tts": "Ausschalten der automatischen Updates führt zum Ausschalten von SYNC mobile Apps. Sie können Ihre mobilen Apps dann nicht mehr mit SYNC nutzen. Bitte drücken Sie Ja zur Bestätigung oder Nein, um abzubrechen.",
- "line1": "Auto-Update",
- "line2": "und Mobile Apps deaktivieren"
- },
- "en-au": {
- "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.",
- "line1": "Disable auto-updates",
- "line2": "and Mobile Apps?"
- },
- "en-gb": {
- "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.",
- "line1": "Disable auto-updates",
- "line2": "and Mobile Apps?",
- "textBody": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel."
- },
- "en-ie": {
- "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.",
- "line1": "Disable auto-updates",
- "line2": "and Mobile Apps?"
- },
- "en-us": {
- "tts": "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel.",
- "line1": "Disable Auto-Updates",
- "line2": "and Mobile Apps?",
- "textBody": "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel."
- },
- "es-en": {
- "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.",
- "line1": "¿Deshab. actualiz.",
- "line2": "autom. y aplic. móv.?",
- "textBody": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar."
- },
- "es-es": {
- "tts": "Si desactiva las actualizaciones automáticas, también se desactivará la sincronización de las aplicaciones móviles. No podrá utilizar ninguna aplicación móvil con SYNC. Pulse sí para confirmar o no para cancelar.",
- "line1": "¿Desact. actual. auto",
- "line2": "y apl. móviles?"
- },
- "es-mx": {
- "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.",
- "line1": "¿Deshab. actualiz.",
- "line2": "autom. y aplic. móv.?"
- },
- "fr-ca": {
- "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.",
- "line1": "Désactiver màj autom.",
- "line2": "et app. mobiles?",
- "textBody": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler."
- },
- "fr-fr": {
- "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.",
- "line1": "Désactiver màj autom.",
- "line2": "et app. mobiles?"
- },
- "it-it": {
- "tts": "Disabilitando gli aggiornamenti automatici si disattiva anche la sincronizzazione delle app mobili. Non sarà possibile usare app mobili con il SYNC. Premere Sì per confermare e No per cancellare.",
- "line1": "Disabilitare agg. aut.",
- "line2": "e app mobili?"
- },
- "nl-nl": {
- "tts": "Door automatische updates uit te schakelen, schakelt u ook SYNC-mobiele apps uit. U kunt dan geen mobiele apps meer gebruiken met SYNC. Druk op Ja om te bevestigen of op Nee om te annuleren.",
- "line1": "Auto-updates en mob.",
- "line2": "apps uitschakelen?"
- },
- "pl-pl": {
- "tts": "Wyłączenie automatycznych aktualizacji spowoduje także wyłączenie aplikacji mobilnych SYNC. Korzystanie z mobilnych aplikacji za pomocą SYNC będzie niemożliwe. Naciśnij TAK, by potwierdzić lub NIE, by anulować.",
- "line1": "Wył. automat. aktual.",
- "line2": "i aplikacje mobilne?"
- },
- "pt-br": {
- "tts": "Se as atualizações automáticas forem desativadas, os aplicativos também serão desativados. Você não poderá usar nenhum aplicativo com o SYNC. Pressione sim para confirmar ou não para cancelar.",
- "line1": "Desativar atualizações",
- "line2": "autom. e aplicativos?"
- },
- "pt-pt": {
- "tts": "A desactivação das actualizações automáticas desactiva igualmente as aplicações móveis do SYNC. Não poderá utilizar quaisquer aplicações móveis com o SYNC. Prima \"\"Sim\"\" para confirmar ou \"\"Não\"\" para cancelar.",
- "line1": "Desact. actual. autom.",
- "line2": "e aplicações móveis?"
- },
- "ru-ru": {
- "tts": "При отключении автоматических обновлений также будут отключены мобильные приложения sync. Вы не сможете использовать какие-либо мобильные приложения с SYNC. Нажмите \"\"Да\"\" для подтверждения или \"\"Нет\"\" для отмены.",
- "line1": "Откл. автообновления",
- "line2": "и мобил. прилож.?"
- },
- "sv-se": {
- "tts": "Om du avaktiverar automatisk uppdatering avaktiverar du även synkning av mobilappar. Du kommer inte längre att kunna använda dina mobilappar med SYNC. Tryck Ja för att bekräfta eller Nej för att avbryta.",
- "line1": "Avaktiverar autouppdat.",
- "line2": "och mobilappar?"
- },
- "tr-tr": {
- "tts": "Otomatik güncellemeleri devre dışı bırakırsanız sync mobil uygulamalar da devre dışı kalır. SYNC ile mobil uygulama kullanmanız mümkün olmaz. Lütfen onaylamak için Evet'e veya iptal etmek için Hayır'a basın.",
- "line1": "Oto. güncelleme ve",
- "line2": "mobil uygul. kapat?"
- },
- "zh-cn": {
- "tts": "禁用自动更新同时也会禁用SYNC移动应用程序。您将无法在 SYNC 中使用任何移动应用程序。请按“是”确认或按“否”取消。",
- "line1": "是否禁用自动更新和",
- "line2": "移动应用程序?"
- },
- "zh-tw": {
- "tts": "停用自動更新也將停用 sync 行動應用程式。您將無法透過 SYNC 使用任何行動應用程式。確認請按「是」,取消請按「否」。",
- "line1": "停用自動更新",
- "line2": "和行動應用程式?"
- }
- }
- },
- "DrivingCharacteristics": {
- "languages": {
- "de-de": {
- "tts": "Eine App hat Zugriff auf die folgenden Fahreigenschaften: Kraftstoffverbrauch, MyKey, Sicherheitsgurtstatus.",
- "label": "Fahreigenschaften"
- },
- "en-au": {
- "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.",
- "label": "Driving characteristics"
- },
- "en-gb": {
- "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.",
- "label": "Driving characteristics",
- "textBody": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status."
- },
- "en-ie": {
- "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.",
- "label": "Driving characteristics"
- },
- "en-us": {
- "tts": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status.",
- "label": "Driving Characteristics",
- "textBody": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status."
- },
- "es-en": {
- "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.",
- "label": "Características del manejo",
- "textBody": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad."
- },
- "es-es": {
- "tts": "Una aplicación puede acceder a las siguientes características de conducción: Consumo de combustible, MyKey, Estado cinturones de seguridad.",
- "label": "Características de conducción"
- },
- "es-mx": {
- "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.",
- "label": "Características del manejo"
- },
- "fr-ca": {
- "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité.",
- "label": "Caractéristiques de conduite",
- "textBody": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité."
- },
- "fr-fr": {
- "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité.",
- "label": "Caractéristiques de conduite"
- },
- "it-it": {
- "tts": "Un'app può avere accesso alle seguenti caratteristiche di guida: Consumo carburante, MyKey, Stato cinture di sicurezza.",
- "label": "Caratteristiche di guida"
- },
- "nl-nl": {
- "tts": "Een app heeft toegang tot de volgende rijkenmerken: Brandstofverbruik, MyKey, Veiligheidsgordelstatus.",
- "label": "Rijkenmerken"
- },
- "pl-pl": {
- "tts": "Aplikacja może uzyskać dostęp do następujących informacji dotyczących jazdy: Zużycie paliwa, MyKey, Stan pasów bezpieczeństwa.",
- "label": "Informacje dotyczące stylu jazdy"
- },
- "pt-br": {
- "tts": "Um aplicativo pode acessar as seguintes características de condução: Consumo de combustível, MyKey, Estado do cinto de segurança.",
- "label": "Características de condução"
- },
- "pt-pt": {
- "tts": "Uma aplicação consegue aceder às seguintes informações de condução: Consumo de combustível, MyKey, Estado dos cintos de segurança.",
- "label": "Características de condução"
- },
- "ru-ru": {
- "tts": "Приложение имеет доступ к следующим характеристикам движения: Расход топлива, MyKey, Состояние ремней безопасности.",
- "label": "Характеристики движения"
- },
- "sv-se": {
- "tts": "Appen kan komma åt följande köregenskaper: Bränsleförbrukning, MyKey, Bältesstatus.",
- "label": "Köregenskaper"
- },
- "tr-tr": {
- "tts": "Bir uygulama şu sürüş karakteristiklerine erişebilir: Yakıt tüketimi, MyKey, Emniyet kemeri durumu.",
- "label": "Sürüş karakteristikleri"
- },
- "zh-cn": {
- "tts": "移动应用程序可访问下列行驶特性: 油耗, MyKey, 安全带状态",
- "label": "行驶特性"
- },
- "zh-tw": {
- "tts": "應用程式可存取以下駕駛特性: 油耗, MyKey, 安全帶狀態",
- "label": "駕駛特性"
- }
- }
- },
- "Location": {
- "languages": {
- "de-de": {
- "tts": "Eine App hat Zugriff auf die GPS-Daten und die Geschwindigkeit des Fahrzeugs.",
- "label": "GPS und Geschwindigkeit"
- },
- "en-au": {
- "tts": "An app can access vehicle GPS and speed.",
- "label": "GPS and speed"
- },
- "en-gb": {
- "tts": "An app can access vehicle GPS and speed.",
- "label": "GPS and speed",
- "textBody": "An app can access vehicle GPS and speed."
- },
- "en-ie": {
- "tts": "An app can access vehicle GPS and speed.",
- "label": "GPS and speed"
- },
- "en-us": {
- "tts": "An app can access vehicle GPS and speed.",
- "label": "GPS and speed",
- "textBody": "An app can access vehicle GPS and speed."
- },
- "es-en": {
- "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.",
- "label": "GPS y velocidad",
- "textBody": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo."
- },
- "es-es": {
- "tts": "Una aplicación puede acceder al GPS y la velocidad del vehículo.",
- "label": "GPS y velocidad"
- },
- "es-mx": {
- "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.",
- "label": "GPS y velocidad"
- },
- "fr-ca": {
- "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.",
- "label": "GPS et vitesse",
- "textBody": "Une application peut accéder au GPS et à la vitesse du véhicule."
- },
- "fr-fr": {
- "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.",
- "label": "GPS et vitesse"
- },
- "it-it": {
- "tts": "Un'app può avere accesso a GPS e velocità del veicolo.",
- "label": "GPS e velocità"
- },
- "nl-nl": {
- "tts": "Een app heeft toegang tot gps en de snelheid van het voertuig.",
- "label": "Gps en snelheid"
- },
- "pl-pl": {
- "tts": "Aplikacja może uzyskać dostęp do modułu GPS i prędkości pojazdu.",
- "label": "GPS i prędkość"
- },
- "pt-br": {
- "tts": "Um aplicativo pode acessar o GPS e a velocidade do veículo.",
- "label": "GPS e velocidade"
- },
- "pt-pt": {
- "tts": "Uma aplicação consegue aceder ao GPS e à velocidade do veículo.",
- "label": "GPS e velocidade"
- },
- "ru-ru": {
- "tts": "Приложение имеет доступ к GPS и скорости автомобиля.",
- "label": "GPS и скорость"
- },
- "sv-se": {
- "tts": "Appen kan komma åt fordonets GPS och hastighetsmätare.",
- "label": "GPS och hastighet"
- },
- "tr-tr": {
- "tts": "Bu uygulama aracın GPS ve hız bilgilerine erişebilir.",
- "label": "GPS ve hız"
- },
- "zh-cn": {
- "tts": "移动应用程序可以访问车辆 GPS 和车速信息。",
- "label": "GPS 和车速"
- },
- "zh-tw": {
- "tts": "應用程式可存取車輛的GPS和速度。",
- "label": "GPS和車速"
- }
- }
- },
- "Notifications": {
- "languages": {
- "de-de": {
- "tts": "Läuft die App im Hintergrund, kann Sie Benachrichtigungen senden.",
- "label": "Push-Benachrichtigungen"
- },
- "en-au": {
- "tts": "An app can send notifications when running in the background.",
- "label": "Push notifications"
- },
- "en-gb": {
- "tts": "An app can send notifications when running in the background.",
- "label": "Push notifications",
- "textBody": "An app can send notifications when running in the background."
- },
- "en-ie": {
- "tts": "An app can send notifications when running in the background.",
- "label": "Push notifications"
- },
- "en-us": {
- "tts": "An app can send notifications when running in the background.",
- "label": "Push notifications",
- "textBody": "An app can send notifications when running in the background."
- },
- "es-en": {
- "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.",
- "label": "Notificaciones tipo Push",
- "textBody": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano."
- },
- "es-es": {
- "tts": "Una aplicación puede enviar notificaciones cuando se está ejecutando en segundo plano.",
- "label": "Notificaciones push"
- },
- "es-mx": {
- "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.",
- "label": "Notificaciones tipo Push"
- },
- "fr-ca": {
- "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.",
- "label": "Notifications instantanées",
- "textBody": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan."
- },
- "fr-fr": {
- "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.",
- "label": "Notifications push"
- },
- "it-it": {
- "tts": "Un'app può inviare notifiche se eseguita in background.",
- "label": "Notifiche push"
- },
- "nl-nl": {
- "tts": "Een app kan meldingen versturen als deze op de achtergrond actief is.",
- "label": "Push-meldingen"
- },
- "pl-pl": {
- "tts": "Aplikacja może wysyłać powiadomienia, działając w tle.",
- "label": "Powiadomienia Push"
- },
- "pt-br": {
- "tts": "Um aplicativo pode enviar notificações quando estiver sendo executado em segundo plano.",
- "label": "Notificações Push"
- },
- "pt-pt": {
- "tts": "Uma aplicação consegue enviar notificações quando está activa em segundo plano.",
- "label": "Notificações push"
- },
- "ru-ru": {
- "tts": "Если приложение работает в фоновом режиме, оно может отправлять оповещения.",
- "label": "Оповещения о пересылке"
- },
- "sv-se": {
- "tts": "Appen kan skicka meddelanden när den körs i bakgrunden.",
- "label": "Push-notiser"
- },
- "tr-tr": {
- "tts": "Bir uygulama arka planda çalışırken bildirim gönderebilir.",
- "label": "Anlık bildirimleri"
- },
- "zh-cn": {
- "tts": "移动应用程序在后台运行时可推送通知。",
- "label": "推送通知"
- },
- "zh-tw": {
- "tts": "車輛行進時,應用程式可在背景中傳送通知。",
- "label": "傳送通知"
- }
- }
- },
- "SettingDisableUpdates": {
- "languages": {
- "de-de": {
- "line1": "Updates deakt."
- },
- "en-au": {
- "line1": "Disable updates"
- },
- "en-gb": {
- "line1": "Disable updates"
- },
- "en-ie": {
- "line1": "Disable updates"
- },
- "en-us": {
- "line1": "Disable Updates",
- "textBody": "Disable Updates"
- },
- "es-en": {
- "line1": "Deshab. actual.",
- "textBody": "Deshab. actual."
- },
- "es-es": {
- "line1": "Desact. actual."
- },
- "es-mx": {
- "line1": "Deshab. actual."
- },
- "fr-ca": {
- "line1": "Désactiver MAJ",
- "textBody": "Désactiver MAJ"
- },
- "fr-fr": {
- "line1": "Désactiver màj"
- },
- "it-it": {
- "line1": "Disabilita agg."
- },
- "nl-nl": {
- "line1": "Upd. uitschak."
- },
- "pl-pl": {
- "line1": "Wyłącz aktual."
- },
- "pt-br": {
- "line1": "Desat. atualiz."
- },
- "pt-pt": {
- "line1": "Desact. actualiz."
- },
- "ru-ru": {
- "line1": "Откл. обновл."
- },
- "sv-se": {
- "line1": "Inaktivera uppd."
- },
- "tr-tr": {
- "line1": "Güncell. Kapat"
- },
- "zh-cn": {
- "line1": "禁用更新"
- },
- "zh-tw": {
- "line1": "停用更新"
- }
- }
- },
- "SettingEnableUpdates": {
- "languages": {
- "de-de": {
- "line1": "Apps aktivieren"
- },
- "en-au": {
- "line1": "Enable Apps"
- },
- "en-gb": {
- "line1": "Enable Apps"
- },
- "en-ie": {
- "line1": "Enable Apps"
- },
- "en-us": {
- "line1": "Enable Apps"
- },
- "es-en": {
- "line1": "Hab. aplic."
- },
- "es-es": {
- "line1": "Activar apl."
- },
- "es-mx": {
- "line1": "Hab. aplic."
- },
- "fr-ca": {
- "line1": "Activer app.",
- "textBody": "Activer app."
- },
- "fr-fr": {
- "line1": "Activer app."
- },
- "it-it": {
- "line1": "Abilita app"
- },
- "nl-nl": {
- "line1": "Apps inschak."
- },
- "pl-pl": {
- "line1": "Włącz aplikacje"
- },
- "pt-br": {
- "line1": "Ativar aplic."
- },
- "pt-pt": {
- "line1": "Activar actualiz."
- },
- "ru-ru": {
- "line1": "Вкл. прилож."
- },
- "sv-se": {
- "line1": "Aktivera appar"
- },
- "tr-tr": {
- "line1": "Uygulamaları aç"
- },
- "zh-cn": {
- "line1": "启用应用程序"
- },
- "zh-tw": {
- "line1": "啟用應用程式"
- }
- }
- },
- "SettingUpdateAuto": {
- "languages": {
- "de-de": {
- "line1": "Update anford."
- },
- "en-au": {
- "line1": "Request update"
- },
- "en-gb": {
- "line1": "Request update"
- },
- "en-ie": {
- "line1": "Request update"
- },
- "en-us": {
- "line1": "Request Update",
- "textBody": "Select `Update now` to receive app authorization information for your SYNC-enabled mobile apps. This may enable additional functionality depending on the app and your settings. If your phone has a working data connection, an update should complete in less than 1 minute."
- },
- "es-en": {
- "line1": "Solicit. actualiz.",
- "textBody": "Solicit. actualiz."
- },
- "es-es": {
- "line1": "Solicitar actual."
- },
- "es-mx": {
- "line1": "Solicit. actualiz."
- },
- "fr-ca": {
- "line1": "Demander MAJ",
- "textBody": "Demander MAJ"
- },
- "fr-fr": {
- "line1": "Demander màj"
- },
- "it-it": {
- "line1": "Rich. aggiorn."
- },
- "nl-nl": {
- "line1": "Upd. aanvragen"
- },
- "pl-pl": {
- "line1": "Zażądaj aktual."
- },
- "pt-br": {
- "line1": "Solicitar atualiz."
- },
- "pt-pt": {
- "line1": "Solicit. actualiz."
- },
- "ru-ru": {
- "line1": "Запрос на обн."
- },
- "sv-se": {
- "line1": "Begär uppdat."
- },
- "tr-tr": {
- "line1": "Güncelleme iste"
- },
- "zh-cn": {
- "line1": "请求更新"
- },
- "zh-tw": {
- "line1": "請求更新"
- }
- }
- },
- "StatusNeeded": {
- "languages": {
- "de-de": {
- "line1": "Update benötigt"
- },
- "en-au": {
- "line1": "Update needed"
- },
- "en-gb": {
- "line1": "Update needed",
- "textBody": "Update needed"
- },
- "en-ie": {
- "line1": "Update needed"
- },
- "en-us": {
- "line1": "Update Needed",
- "textBody": "Update Needed"
- },
- "es-en": {
- "line1": "Actualiz. neces.",
- "textBody": "Actualiz. neces."
- },
- "es-es": {
- "line1": "Actu. necesaria"
- },
- "es-mx": {
- "line1": "Actualiz. neces."
- },
- "fr-ca": {
- "line1": "Màj requise",
- "textBody": "Màj requise"
- },
- "fr-fr": {
- "line1": "Mise à jour requise"
- },
- "it-it": {
- "line1": "Necess. aggiorn."
- },
- "nl-nl": {
- "line1": "Update nodig"
- },
- "pl-pl": {
- "line1": "Potrzeba aktual."
- },
- "pt-br": {
- "line1": "Atualiz. necess."
- },
- "pt-pt": {
- "line1": "Actual. necess."
- },
- "ru-ru": {
- "line1": "Необх. обновл."
- },
- "sv-se": {
- "line1": "Uppdat. krävs"
- },
- "tr-tr": {
- "line1": "Güncellenmeli"
- },
- "zh-cn": {
- "line1": "需要进行更新"
- },
- "zh-tw": {
- "line1": "需更新"
- }
- }
- },
- "StatusPending": {
- "languages": {
- "de-de": {
- "line1": "Aktualisieren..."
- },
- "en-au": {
- "line1": "Updating..."
- },
- "en-gb": {
- "line1": "Updating...",
- "textBody": "Updating..."
- },
- "en-ie": {
- "line1": "Updating..."
- },
- "en-us": {
- "line1": "Updating...",
- "textBody": "Updating..."
- },
- "es-en": {
- "line1": "Actualizando...",
- "textBody": "Actualizando..."
- },
- "es-es": {
- "line1": "Actualizando..."
- },
- "es-mx": {
- "line1": "Actualizando..."
- },
- "fr-ca": {
- "line1": "MAJ en cours...",
- "textBody": "MAJ en cours..."
- },
- "fr-fr": {
- "line1": "Màj en cours..."
- },
- "it-it": {
- "line1": "Aggiornamento"
- },
- "nl-nl": {
- "line1": "Updaten..."
- },
- "pl-pl": {
- "line1": "Aktualizowanie"
- },
- "pt-br": {
- "line1": "Atualizando..."
- },
- "pt-pt": {
- "line1": "A actualizar..."
- },
- "ru-ru": {
- "line1": "Обновление..."
- },
- "sv-se": {
- "line1": "Uppdaterar..."
- },
- "tr-tr": {
- "line1": "Güncelleniyor..."
- },
- "zh-cn": {
- "line1": "正在更新......"
- },
- "zh-tw": {
- "line1": "更新中..."
- }
- }
- },
- "StatusUpToDate": {
- "languages": {
- "de-de": {
- "line1": "Aktuelle Version"
- },
- "en-au": {
- "line1": "Up-to-date"
- },
- "en-gb": {
- "line1": "Up-to-date",
- "textBody": "Up-to-date"
- },
- "en-ie": {
- "line1": "Up-to-date"
- },
- "en-us": {
- "line1": "Up-To-Date",
- "textBody": "Up-To-Date"
- },
- "es-en": {
- "line1": "Actualizado",
- "textBody": "Actualizado"
- },
- "es-es": {
- "line1": "Actualizada"
- },
- "es-mx": {
- "line1": "Actualizado"
- },
- "fr-ca": {
- "line1": "Déjà à jour",
- "textBody": "Déjà à jour"
- },
- "fr-fr": {
- "line1": "Déjà à jour"
- },
- "it-it": {
- "line1": "più recente"
- },
- "nl-nl": {
- "line1": "Up-to-date"
- },
- "pl-pl": {
- "line1": "Aktualne"
- },
- "pt-br": {
- "line1": "Atualizado"
- },
- "pt-pt": {
- "line1": "Actualizado"
- },
- "ru-ru": {
- "line1": "Обновлено"
- },
- "sv-se": {
- "line1": "Uppdat. krävs ej"
- },
- "tr-tr": {
- "line1": "Güncel"
- },
- "zh-cn": {
- "line1": "最新更新"
- },
- "zh-tw": {
- "line1": "更新最新"
- }
- }
- },
- "VehicleInfo": {
- "languages": {
- "de-de": {
- "tts": "Eine App hat Zugriff auf die folgenden Fahrzeuginformationen: Kraftstoff-Füllstand, Kraftstoffverbrauch, Motordrehzahl, Kilometerzähler, FIN, Außentemperatur, Gangstellung, Reifenluftdruck.",
- "label": "Fahrzeuginformationen"
- },
- "en-au": {
- "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.",
- "label": "Vehicle information"
- },
- "en-gb": {
- "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure.",
- "label": "Vehicle information",
- "textBody": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure."
- },
- "en-ie": {
- "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.",
- "label": "Vehicle information"
- },
- "en-us": {
- "tts": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Engine RPMs, Odometer, VIN, External Temperature, Gear Position, Tire Pressure.",
- "label": "Vehicle information",
- "textBody": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Engine RPMs, Odometer, VIN, External Temperature, Gear Position, Tire Pressure."
- },
- "es-en": {
- "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.",
- "label": "Información del vehículo",
- "textBody": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos."
- },
- "es-es": {
- "tts": "Una aplicación puede acceder a la siguiente información del vehículo: Nivel de combustible, Ahorro de combustible, RPM del motor, Cuentakilómetros, VIN, Temperatura aire exterior, Marcha engranada, Presión de neumáticos.",
- "label": "Información del vehículo"
- },
- "es-mx": {
- "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.",
- "label": "Información del vehículo"
- },
- "fr-ca": {
- "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Au régime du moteur, Odomètre, NIV, Température extérieure, Position d’embrayage, Pression des pneus.",
- "label": "Renseignements du véhicule",
- "textBody": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Au régime du moteur, Odomètre, NIV, Température extérieure, Position d’embrayage, Pression des pneus."
- },
- "fr-fr": {
- "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Vitesse de moteur, Compteur kilométrique, NIV, Température extérieure, Position de vitesse, Pression des pneus.",
- "label": "Renseignements du véhicule"
- },
- "it-it": {
- "tts": "Un'app può avere accesso alle seguenti informazioni del veicolo: Livello carburante, Consumi carburante, Numero giri motore, Contachilometri, VIN, Temperatura esterna, Posizione marcia, Pressione pneumatici.",
- "label": "Informazioni sul veicolo"
- },
- "nl-nl": {
- "tts": "Een app heeft toegang tot de volgende voertuiginformatie: Brandstofpeil, Brandstofverbruik, Motortoerental, Kilometerteller, VIN, Buitentemperatuur, Versnellingsstand, Bandenspanning.",
- "label": "Voertuiginformatie"
- },
- "pl-pl": {
- "tts": "Aplikacja może uzyskać dostęp do następujących informacji o pojeździe: Poziom paliwa, Zużycie paliwa, Obroty silnika, Licznik przebiegu, Numer VIN, Temperatura zewnętrzna, Aktualny bieg, Ciśnienie opon.",
- "label": "Informacje o pojeździe"
- },
- "pt-br": {
- "tts": "Um aplicativo pode acessar as seguintes informações sobre o veículo: Nível de combustível, Economia de combustível, RPM do motor, Hodômetro, VIN, Temperatura externa, Posição das marchas, Pressão dos pneus.",
- "label": "Informações sobre o veículo"
- },
- "pt-pt": {
- "tts": "Uma aplicação consegue aceder às seguintes informações do veículo: Nível de combustível, Poupança de combustível, RPM do motor, Conta-quilómetros, VIN, Temperatura exterior, Posição da mudança de velocidade, Pressão dos pneus.",
- "label": "Informações do veículo"
- },
- "ru-ru": {
- "tts": "Приложение имеет доступ к следующим данным автомобиля: Уровень топлива, Економия топлива, Число оборотов двигателя, Одометр, Номер VIN, Температура за бортом, Положение передачи, Давление шин.",
- "label": "Информация об автомобиле"
- },
- "sv-se": {
- "tts": "Appen kan komma åt följande fordonsinformation: Bränslenivå, Bränsleekonomi, Motorns varvtal, Vägmätare, VIN, Utetemperatur, Växelläge, Däcktryck.",
- "label": "Fordonsinformation"
- },
- "tr-tr": {
- "tts": "Bir uygulama şu araç bilgilerine erişebilir: Yakıt seviyesi, Yakıt ekonomisi, Motor devirleri, Kilometre sayacı, VIN, Dış sıcaklık, Vites konumu, Lastik basıncı.",
- "label": "Araç bilgisi"
- },
- "zh-cn": {
- "tts": "移动应用程序可访问下列车辆信息 : 燃油量, 燃油经济性, 发动机转速(RPM), 里程表, VIN, 车外温度, 档位, 胎压.",
- "label": "车辆信息"
- },
- "zh-tw": {
- "tts": "一個應用程式可存取以下車輛資訊 : 燃油存量, 燃油經濟性, 引擎轉速, 里程表, 車輛識別號碼, 車外溫度, 檔位, 胎壓.",
- "label": "車輛資訊"
- }
- }
- }
- }
- },
- "app_policies": {
- "default": {
- "keep_context": false,
- "steal_focus": false,
- "priority": "NONE",
- "default_hmi": "NONE",
- "groups": ["Base-4"],
- "RequestType": [
- "QUERY_APPS",
- "LAUNCH_APP",
- "PROPRIETARY"
- ]
- },
- "device": {
- "keep_context": false,
- "steal_focus": false,
- "priority": "NONE",
- "default_hmi": "NONE",
- "groups": ["DataConsent-2"]
- },
- "pre_DataConsent": {
- "keep_context": false,
- "steal_focus": false,
- "priority": "NONE",
- "default_hmi": "NONE",
- "groups": ["BaseBeforeDataConsent"],
- "RequestType": ["HTTP"]
- }
- }
- }
- }