summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/appMain/sdl_preloaded_pt.json23
-rw-r--r--src/components/application_manager/include/application_manager/policies/policy_handler.h3
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/on_ui_subtle_alert_pressed_notification.h80
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/ui_subtle_alert_request.h78
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/ui_subtle_alert_response.h78
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/alert_request.h3
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/on_subtle_alert_pressed_notification.h80
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/subtle_alert_request.h152
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/subtle_alert_response.h78
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_ui_subtle_alert_pressed_notification.cc63
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_subtle_alert_request.cc69
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_subtle_alert_response.cc63
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_request.cc5
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/cancel_interaction_request.cc1
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_subtle_alert_pressed_notification.cc74
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/subtle_alert_request.cc461
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/subtle_alert_response.cc64
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/hmi_command_factory.cc11
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/mobile_command_factory.cc12
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/dummy_hmi_commands_test.cc23
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/hmi_notifications_test.cc16
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/simple_requests_to_hmi_test.cc2
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/simple_response_from_hmi_test.cc3
-rw-r--r--src/components/application_manager/src/application_impl.cc5
-rw-r--r--src/components/application_manager/src/hmi_capabilities_impl.cc12
-rw-r--r--src/components/application_manager/src/hmi_interfaces_impl.cc1
-rw-r--r--src/components/application_manager/src/policies/policy_handler.cc6
-rw-r--r--src/components/application_manager/test/application_impl_test.cc6
-rw-r--r--src/components/application_manager/test/policy_handler_test.cc4
-rw-r--r--src/components/application_manager/test/sdl_preloaded_pt.json10
-rw-r--r--src/components/application_manager/test/sdl_pt_update.json9
-rw-r--r--src/components/include/application_manager/policies/policy_handler_interface.h4
-rw-r--r--src/components/include/policy/policy_external/policy/policy_manager.h5
-rw-r--r--src/components/include/policy/policy_regular/policy/policy_manager.h5
-rw-r--r--src/components/include/test/application_manager/policies/mock_policy_handler_interface.h5
-rw-r--r--src/components/include/test/policy/policy_external/policy/mock_cache_manager.h6
-rw-r--r--src/components/include/test/policy/policy_external/policy/mock_policy_manager.h5
-rw-r--r--src/components/include/test/policy/policy_regular/policy/mock_cache_manager.h6
-rw-r--r--src/components/include/test/policy/policy_regular/policy/mock_policy_manager.h5
-rw-r--r--src/components/interfaces/HMI_API.xml60
-rw-r--r--src/components/policy/policy_external/include/policy/cache_manager.h7
-rw-r--r--src/components/policy/policy_external/include/policy/cache_manager_interface.h3
-rw-r--r--src/components/policy/policy_external/include/policy/policy_manager_impl.h4
-rw-r--r--src/components/policy/policy_external/include/policy/policy_table/types.h5
-rw-r--r--src/components/policy/policy_external/include/policy/policy_table_interface_ext.xml1
-rw-r--r--src/components/policy/policy_external/include/policy/sql_pt_queries.h2
-rw-r--r--src/components/policy/policy_external/include/policy/sql_pt_representation.h2
-rw-r--r--src/components/policy/policy_external/src/cache_manager.cc13
-rw-r--r--src/components/policy/policy_external/src/policy_manager_impl.cc12
-rw-r--r--src/components/policy/policy_external/src/policy_table/types.cc28
-rw-r--r--src/components/policy/policy_external/src/sql_pt_queries.cc24
-rw-r--r--src/components/policy/policy_external/src/sql_pt_representation.cc38
-rw-r--r--src/components/policy/policy_external/test/cache_manager_test.cc88
-rw-r--r--src/components/policy/policy_external/test/json/sdl_preloaded_pt_for_merge_initial.json11
-rw-r--r--src/components/policy/policy_external/test/json/sdl_preloaded_pt_for_merge_latest.json11
-rw-r--r--src/components/policy/policy_external/test/sql_pt_ext_representation_test.cc14
-rw-r--r--src/components/policy/policy_external/test/sql_pt_representation_test.cc28
-rw-r--r--src/components/policy/policy_regular/include/policy/cache_manager.h7
-rw-r--r--src/components/policy/policy_regular/include/policy/cache_manager_interface.h3
-rw-r--r--src/components/policy/policy_regular/include/policy/policy_manager_impl.h4
-rw-r--r--src/components/policy/policy_regular/include/policy/policy_table/types.h5
-rw-r--r--src/components/policy/policy_regular/include/policy/sql_pt_queries.h2
-rw-r--r--src/components/policy/policy_regular/include/policy/sql_pt_representation.h2
-rw-r--r--src/components/policy/policy_regular/src/cache_manager.cc15
-rw-r--r--src/components/policy/policy_regular/src/policy_manager_impl.cc12
-rw-r--r--src/components/policy/policy_regular/src/policy_table/types.cc28
-rw-r--r--src/components/policy/policy_regular/src/sql_pt_queries.cc27
-rw-r--r--src/components/policy/policy_regular/src/sql_pt_representation.cc38
-rw-r--r--src/components/policy/policy_regular/test/cache_manager_test.cc88
-rw-r--r--src/components/policy/policy_regular/test/include/policy/mock_pt_representation.h3
-rw-r--r--src/components/policy/policy_regular/test/json/sdl_preloaded_pt_for_merge_initial.json11
-rw-r--r--src/components/policy/policy_regular/test/json/sdl_preloaded_pt_for_merge_latest.json11
-rw-r--r--src/components/policy/policy_regular/test/sql_pt_representation_test.cc28
m---------tools/rpc_spec0
74 files changed, 2069 insertions, 102 deletions
diff --git a/src/appMain/sdl_preloaded_pt.json b/src/appMain/sdl_preloaded_pt.json
index e07a5eeab0..f04a00570b 100644
--- a/src/appMain/sdl_preloaded_pt.json
+++ b/src/appMain/sdl_preloaded_pt.json
@@ -54,6 +54,15 @@
"NORMAL": 4,
"NONE": 0
},
+ "subtle_notifications_per_minute_by_priority": {
+ "EMERGENCY": 60,
+ "NAVIGATION": 20,
+ "PROJECTION": 20,
+ "VOICECOM": 30,
+ "COMMUNICATION": 15,
+ "NORMAL": 10,
+ "NONE": 0
+ },
"lock_screen_dismissal_enabled": true
},
"functional_groupings": {
@@ -84,6 +93,20 @@
"LIMITED"
]
},
+ "SubtleAlert": {
+ "hmi_levels": [
+ "FULL",
+ "LIMITED",
+ "BACKGROUND"
+ ]
+ },
+ "OnSubtleAlertPressed": {
+ "hmi_levels": [
+ "FULL",
+ "LIMITED",
+ "BACKGROUND"
+ ]
+ },
"ChangeRegistration": {
"hmi_levels": [
"BACKGROUND",
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 2f50fd4a6b..9206b1d155 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
@@ -122,7 +122,8 @@ class PolicyHandler : public PolicyHandlerInterface,
const RPCParams& rpc_params,
CheckPermissionResult& result) OVERRIDE;
- uint32_t GetNotificationsNumber(const std::string& priority) const OVERRIDE;
+ uint32_t GetNotificationsNumber(const std::string& priority,
+ const bool is_subtle = false) const OVERRIDE;
virtual DeviceConsent GetUserConsentForDevice(
const std::string& device_id) const OVERRIDE;
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/on_ui_subtle_alert_pressed_notification.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/on_ui_subtle_alert_pressed_notification.h
new file mode 100644
index 0000000000..c08746ba3d
--- /dev/null
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/on_ui_subtle_alert_pressed_notification.h
@@ -0,0 +1,80 @@
+/*
+ Copyright (c) 2020, Ford Motor Company, Livio
+ 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 the copyright holders nor the names of their
+ 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_ON_UI_SUBTLE_ALERT_PRESSED_NOTIFICATION_H_
+#define SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_HMI_ON_UI_SUBTLE_ALERT_PRESSED_NOTIFICATION_H_
+
+#include "application_manager/commands/notification_from_hmi.h"
+#include "sdl_rpc_plugin/sdl_rpc_plugin.h"
+
+namespace sdl_rpc_plugin {
+namespace app_mngr = application_manager;
+
+namespace commands {
+
+/**
+ * @brief OnUISubtleAlertPressedNotification command class
+ **/
+class OnUISubtleAlertPressedNotification
+ : public app_mngr::commands::NotificationFromHMI {
+ public:
+ /**
+ * @brief OnUISubtleAlertPressedNotification class constructor
+ *
+ * @param message Incoming SmartObject message
+ **/
+ OnUISubtleAlertPressedNotification(
+ 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 OnUISubtleAlertPressedNotification class destructor
+ **/
+ ~OnUISubtleAlertPressedNotification() OVERRIDE;
+
+ /**
+ * @brief Execute command
+ **/
+ void Run() OVERRIDE;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(OnUISubtleAlertPressedNotification);
+};
+
+} // namespace commands
+
+} // namespace sdl_rpc_plugin
+
+#endif // SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_HMI_ON_UI_SUBTLE_ALERT_PRESSED_NOTIFICATION_H_
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/ui_subtle_alert_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/ui_subtle_alert_request.h
new file mode 100644
index 0000000000..b6b232516d
--- /dev/null
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/ui_subtle_alert_request.h
@@ -0,0 +1,78 @@
+/*
+ Copyright (c) 2020, Ford Motor Company, Livio
+ 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 the copyright holders nor the names of their
+ 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_UI_SUBTLE_ALERT_REQUEST_H_
+#define SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_HMI_UI_SUBTLE_ALERT_REQUEST_H_
+
+#include "application_manager/commands/request_to_hmi.h"
+#include "sdl_rpc_plugin/sdl_rpc_plugin.h"
+
+namespace sdl_rpc_plugin {
+namespace app_mngr = application_manager;
+
+namespace commands {
+
+/**
+ * @brief UISubtleAlertRequest command class
+ **/
+class UISubtleAlertRequest : public app_mngr::commands::RequestToHMI {
+ public:
+ /**
+ * @brief UISubtleAlertRequest class constructor
+ *
+ * @param message Incoming SmartObject message
+ **/
+ UISubtleAlertRequest(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 UISubtleAlertRequest class destructor
+ **/
+ ~UISubtleAlertRequest() OVERRIDE;
+
+ /**
+ * @brief Execute command
+ **/
+ void Run() OVERRIDE;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(UISubtleAlertRequest);
+};
+
+} // namespace commands
+
+} // namespace sdl_rpc_plugin
+
+#endif // SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_HMI_UI_SUBTLE_ALERT_REQUEST_H_
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/ui_subtle_alert_response.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/ui_subtle_alert_response.h
new file mode 100644
index 0000000000..c363677ab0
--- /dev/null
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/ui_subtle_alert_response.h
@@ -0,0 +1,78 @@
+/*
+ Copyright (c) 2020, Ford Motor Company, Livio
+ 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 the copyright holders nor the names of their
+ 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_UI_SUBTLE_ALERT_RESPONSE_H_
+#define SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_HMI_UI_SUBTLE_ALERT_RESPONSE_H_
+
+#include "application_manager/commands/response_from_hmi.h"
+#include "sdl_rpc_plugin/sdl_rpc_plugin.h"
+
+namespace sdl_rpc_plugin {
+namespace app_mngr = application_manager;
+
+namespace commands {
+
+/**
+ * @brief UISubtleAlertResponse command class
+ **/
+class UISubtleAlertResponse : public app_mngr::commands::ResponseFromHMI {
+ public:
+ /**
+ * @brief UISubtleAlertResponse class constructor
+ *
+ * @param message Incoming SmartObject message
+ **/
+ UISubtleAlertResponse(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 UISubtleAlertResponse class destructor
+ **/
+ ~UISubtleAlertResponse() OVERRIDE;
+
+ /**
+ * @brief Execute command
+ **/
+ void Run() OVERRIDE;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(UISubtleAlertResponse);
+};
+
+} // namespace commands
+
+} // namespace sdl_rpc_plugin
+
+#endif // SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_HMI_UI_SUBTLE_ALERT_RESPONSE_H_
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/alert_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/alert_request.h
index dfc7b73487..2250d7a8de 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/alert_request.h
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/alert_request.h
@@ -123,7 +123,7 @@ class AlertRequest : public app_mngr::commands::CommandRequestImpl {
*
* @return TRUE on success, otherwise FALSE
*/
- bool CheckStringsOfAlertRequest();
+ bool CheckStrings();
/*
* @brief Prepare result code and result for sending to mobile application
@@ -137,7 +137,6 @@ class AlertRequest : public app_mngr::commands::CommandRequestImpl {
bool awaiting_ui_alert_response_;
bool awaiting_tts_speak_response_;
bool awaiting_tts_stop_speaking_response_;
- bool is_alert_succeeded_;
bool is_ui_alert_sent_;
hmi_apis::Common_Result::eType alert_result_;
smart_objects::SmartObject alert_response_params_;
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/on_subtle_alert_pressed_notification.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/on_subtle_alert_pressed_notification.h
new file mode 100644
index 0000000000..68789438b8
--- /dev/null
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/on_subtle_alert_pressed_notification.h
@@ -0,0 +1,80 @@
+/*
+ Copyright (c) 2020, Ford Motor Company, Livio
+ 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 the copyright holders nor the names of their
+ 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_SUBTLE_ALERT_PRESSED_NOTIFICATION_H_
+#define SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_MOBILE_ON_SUBTLE_ALERT_PRESSED_NOTIFICATION_H_
+
+#include "application_manager/commands/command_notification_impl.h"
+#include "sdl_rpc_plugin/sdl_rpc_plugin.h"
+
+namespace sdl_rpc_plugin {
+namespace app_mngr = application_manager;
+
+namespace commands {
+
+/**
+ * @brief OnSubtleAlertPressedNotification command class
+ **/
+class OnSubtleAlertPressedNotification
+ : public app_mngr::commands::CommandNotificationImpl {
+ public:
+ /**
+ * @brief OnSubtleAlertPressedNotification class constructor
+ *
+ * @param message Incoming SmartObject message
+ **/
+ OnSubtleAlertPressedNotification(
+ 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 OnSubtleAlertPressedNotification class destructor
+ **/
+ ~OnSubtleAlertPressedNotification() OVERRIDE;
+
+ /**
+ * @brief Execute command
+ **/
+ void Run() OVERRIDE;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(OnSubtleAlertPressedNotification);
+};
+
+} // namespace commands
+
+} // namespace sdl_rpc_plugin
+
+#endif // SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_MOBILE_ON_SUBTLE_ALERT_PRESSED_NOTIFICATION_H_
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/subtle_alert_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/subtle_alert_request.h
new file mode 100644
index 0000000000..4789d35e60
--- /dev/null
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/subtle_alert_request.h
@@ -0,0 +1,152 @@
+/*
+ Copyright (c) 2020, Ford Motor Company, Livio
+ 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 the copyright holders nor the names of their
+ 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_SUBTLE_ALERT_REQUEST_H_
+#define SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_MOBILE_SUBTLE_ALERT_REQUEST_H_
+
+#include "application_manager/commands/command_request_impl.h"
+#include "sdl_rpc_plugin/sdl_rpc_plugin.h"
+
+namespace sdl_rpc_plugin {
+namespace app_mngr = application_manager;
+
+namespace commands {
+
+/**
+ * @brief SubtleAlertRequest command class
+ **/
+class SubtleAlertRequest : public app_mngr::commands::CommandRequestImpl {
+ public:
+ /**
+ * @brief SubtleAlertRequest class constructor
+ *
+ * @param message Incoming SmartObject message
+ **/
+ SubtleAlertRequest(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 SubtleAlertRequest class destructor
+ **/
+ virtual ~SubtleAlertRequest();
+
+ /**
+ * @brief Initialize request params
+ **/
+ virtual bool Init();
+
+ /**
+ * @brief Execute command
+ **/
+ virtual void Run();
+
+ /**
+ * @brief Interface method that is called whenever new event received
+ *
+ * @param event The received event
+ */
+ void on_event(const app_mngr::event_engine::Event& event);
+
+ protected:
+ private:
+ /*
+ * @brief Checks if request parameters are valid
+ * @param app_id Id of application requested this RPC
+ * @returns true if request is valid and should be processed
+ */
+ bool Validate(uint32_t app_id);
+
+ /*
+ * @brief Sends UI SubtleAlert request
+ *
+ * @param app_id Id of application requested this RPC
+ */
+ void SendSubtleAlertRequest(int32_t app_id);
+
+ /*
+ * @brief Sends TTS Speak request
+ *
+ * @param app_id Id of application requested this RPC
+ *
+ * @param tts_chunks_exists if tts chunks exists in
+ * message contains true, otherwise contains false
+ *
+ * @param length_tts_chunks contains length of array
+ * tts chunks.
+ */
+ void SendSpeakRequest(int32_t app_id,
+ bool tts_chunks_exists,
+ size_t length_tts_chunks);
+
+ /*
+ * @brief Tells if there are sent requests without responses
+ */
+ bool HasHmiResponsesToWait();
+
+ /*
+ * @brief Check if all strings have valid syntax in request
+ *
+ * @return TRUE on success, otherwise FALSE
+ */
+ bool CheckStrings();
+
+ /*
+ * @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 mobile app.
+ * @return result for sending to mobile application.
+ */
+ bool PrepareResponseParameters(mobile_apis::Result::eType& result_code,
+ std::string& info);
+
+ bool awaiting_ui_subtle_alert_response_;
+ bool awaiting_tts_speak_response_;
+ bool awaiting_tts_stop_speaking_response_;
+ bool is_ui_subtle_alert_sent_;
+ bool is_tts_stop_speaking_sent_;
+ hmi_apis::Common_Result::eType subtle_alert_result_;
+ smart_objects::SmartObject subtle_alert_response_params_;
+ hmi_apis::Common_Result::eType tts_speak_result_;
+ std::string ui_response_info_;
+ std::string tts_response_info_;
+
+ DISALLOW_COPY_AND_ASSIGN(SubtleAlertRequest);
+};
+
+} // namespace commands
+
+} // namespace sdl_rpc_plugin
+
+#endif // SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_MOBILE_SUBTLE_ALERT_REQUEST_H_
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/subtle_alert_response.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/subtle_alert_response.h
new file mode 100644
index 0000000000..c9be00dd37
--- /dev/null
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/subtle_alert_response.h
@@ -0,0 +1,78 @@
+/*
+ Copyright (c) 2020, Ford Motor Company, Livio
+ 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 the copyright holders nor the names of their
+ 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_SUBTLE_ALERT_RESPONSE_H_
+#define SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_MOBILE_SUBTLE_ALERT_RESPONSE_H_
+
+#include "application_manager/commands/command_response_impl.h"
+#include "sdl_rpc_plugin/sdl_rpc_plugin.h"
+
+namespace sdl_rpc_plugin {
+namespace app_mngr = application_manager;
+
+namespace commands {
+
+/**
+ * @brief SubtleAlertResponse command class
+ **/
+class SubtleAlertResponse : public app_mngr::commands::CommandResponseImpl {
+ public:
+ /**
+ * @brief SubtleAlertResponse class constructor
+ *
+ * @param message Incoming SmartObject message
+ **/
+ SubtleAlertResponse(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 SubtleAlertResponse class destructor
+ **/
+ ~SubtleAlertResponse() OVERRIDE;
+
+ /**
+ * @brief Execute command
+ **/
+ void Run() OVERRIDE;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(SubtleAlertResponse);
+};
+
+} // namespace commands
+
+} // namespace sdl_rpc_plugin
+
+#endif // SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_MOBILE_SUBTLE_ALERT_RESPONSE_H_
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_ui_subtle_alert_pressed_notification.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_ui_subtle_alert_pressed_notification.cc
new file mode 100644
index 0000000000..b2f5f80055
--- /dev/null
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_ui_subtle_alert_pressed_notification.cc
@@ -0,0 +1,63 @@
+/*
+ Copyright (c) 2020, Ford Motor Company, Livio
+ 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 the copyright holders nor the names of their
+ 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/on_ui_subtle_alert_pressed_notification.h"
+
+namespace sdl_rpc_plugin {
+using namespace application_manager;
+
+namespace commands {
+
+OnUISubtleAlertPressedNotification::OnUISubtleAlertPressedNotification(
+ 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)
+ : NotificationFromHMI(message,
+ application_manager,
+ rpc_service,
+ hmi_capabilities,
+ policy_handler) {}
+
+OnUISubtleAlertPressedNotification::~OnUISubtleAlertPressedNotification() {}
+
+void OnUISubtleAlertPressedNotification::Run() {
+ LOG4CXX_AUTO_TRACE(logger_);
+
+ (*message_)[strings::params][strings::function_id] = static_cast<int32_t>(
+ mobile_apis::FunctionID::eType::OnSubtleAlertPressedID);
+ SendNotificationToMobile(message_);
+}
+
+} // namespace commands
+} // namespace sdl_rpc_plugin
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_subtle_alert_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_subtle_alert_request.cc
new file mode 100644
index 0000000000..02e9af4c3c
--- /dev/null
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_subtle_alert_request.cc
@@ -0,0 +1,69 @@
+/*
+ Copyright (c) 2020, Ford Motor Company, Livio
+ 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 the copyright holders nor the names of their
+ 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/ui_subtle_alert_request.h"
+
+namespace sdl_rpc_plugin {
+using namespace application_manager;
+
+namespace commands {
+
+UISubtleAlertRequest::UISubtleAlertRequest(
+ 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)
+ : RequestToHMI(message,
+ application_manager,
+ rpc_service,
+ hmi_capabilities,
+ policy_handler) {
+ const auto& msg_params = (*message_)[strings::msg_params];
+ if (msg_params.keyExists(strings::duration)) {
+ uint32_t request_timeout = msg_params[strings::duration].asUInt();
+ default_timeout_ += request_timeout;
+ } else {
+ default_timeout_ = 0;
+ }
+}
+
+UISubtleAlertRequest::~UISubtleAlertRequest() {}
+
+void UISubtleAlertRequest::Run() {
+ LOG4CXX_AUTO_TRACE(logger_);
+
+ SendRequest();
+}
+
+} // namespace commands
+} // namespace sdl_rpc_plugin
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_subtle_alert_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_subtle_alert_response.cc
new file mode 100644
index 0000000000..51e9802db7
--- /dev/null
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_subtle_alert_response.cc
@@ -0,0 +1,63 @@
+/*
+ Copyright (c) 2020, Ford Motor Company, Livio
+ 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 the copyright holders nor the names of their
+ 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/ui_subtle_alert_response.h"
+
+namespace sdl_rpc_plugin {
+using namespace application_manager;
+
+namespace commands {
+
+UISubtleAlertResponse::UISubtleAlertResponse(
+ 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)
+ : ResponseFromHMI(message,
+ application_manager,
+ rpc_service,
+ hmi_capabilities,
+ policy_handler) {}
+
+UISubtleAlertResponse::~UISubtleAlertResponse() {}
+
+void UISubtleAlertResponse::Run() {
+ LOG4CXX_AUTO_TRACE(logger_);
+
+ event_engine::Event event(hmi_apis::FunctionID::UI_SubtleAlert);
+ event.set_smart_object(*message_);
+ event.raise(application_manager_.event_dispatcher());
+}
+
+} // namespace commands
+} // namespace sdl_rpc_plugin
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 57912e7087..a0544ee444 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
@@ -61,7 +61,6 @@ AlertRequest::AlertRequest(
, awaiting_ui_alert_response_(false)
, awaiting_tts_speak_response_(false)
, awaiting_tts_stop_speaking_response_(false)
- , is_alert_succeeded_(false)
, is_ui_alert_sent_(false)
, alert_result_(hmi_apis::Common_Result::INVALID_ENUM)
, tts_speak_result_(hmi_apis::Common_Result::INVALID_ENUM) {
@@ -258,7 +257,7 @@ bool AlertRequest::Validate(uint32_t app_id) {
return false;
}
- if (!CheckStringsOfAlertRequest()) {
+ if (!CheckStrings()) {
SendResponse(false, mobile_apis::Result::INVALID_DATA);
return false;
}
@@ -423,7 +422,7 @@ void AlertRequest::SendSpeakRequest(int32_t app_id,
SendHMIRequest(FunctionID::TTS_Speak, &msg_params, true);
}
-bool AlertRequest::CheckStringsOfAlertRequest() {
+bool AlertRequest::CheckStrings() {
LOG4CXX_AUTO_TRACE(logger_);
const char* str = NULL;
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/cancel_interaction_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/cancel_interaction_request.cc
index 82e0703da1..6873cb7bf1 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/cancel_interaction_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/cancel_interaction_request.cc
@@ -66,6 +66,7 @@ void CancelInteractionRequest::Run() {
function_id,
mobile_apis::FunctionID::PerformInteractionID,
mobile_apis::FunctionID::AlertID,
+ mobile_apis::FunctionID::SubtleAlertID,
mobile_apis::FunctionID::ScrollableMessageID,
mobile_apis::FunctionID::SliderID)) {
LOG4CXX_ERROR(logger_, "Bad function ID" << function_id);
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_subtle_alert_pressed_notification.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_subtle_alert_pressed_notification.cc
new file mode 100644
index 0000000000..ce1d1b16d1
--- /dev/null
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_subtle_alert_pressed_notification.cc
@@ -0,0 +1,74 @@
+/*
+ Copyright (c) 2020, Ford Motor Company, Livio
+ 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 the copyright holders nor the names of their
+ 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_subtle_alert_pressed_notification.h"
+#include "application_manager/application_impl.h"
+
+namespace sdl_rpc_plugin {
+using namespace application_manager;
+
+namespace commands {
+
+OnSubtleAlertPressedNotification::OnSubtleAlertPressedNotification(
+ 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)
+ : CommandNotificationImpl(message,
+ application_manager,
+ rpc_service,
+ hmi_capabilities,
+ policy_handler) {}
+
+OnSubtleAlertPressedNotification::~OnSubtleAlertPressedNotification() {}
+
+void OnSubtleAlertPressedNotification::Run() {
+ LOG4CXX_AUTO_TRACE(logger_);
+
+ ApplicationSharedPtr app = application_manager_.application(
+ (*message_)[strings::msg_params][strings::app_id].asInt());
+
+ if (!app) {
+ LOG4CXX_ERROR(logger_, "No application associated with session key");
+ return;
+ }
+
+ (*message_)[strings::params][strings::connection_key] = app->app_id();
+ // remove app_id from notification
+ (*message_)[strings::msg_params].erase(strings::app_id);
+
+ SendNotification();
+}
+
+} // namespace commands
+} // namespace sdl_rpc_plugin
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
new file mode 100644
index 0000000000..23604a6b93
--- /dev/null
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/subtle_alert_request.cc
@@ -0,0 +1,461 @@
+/*
+ Copyright (c) 2020, Ford Motor Company, Livio
+ 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 the copyright holders nor the names of their
+ 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/subtle_alert_request.h"
+
+#include "application_manager/application_impl.h"
+#include "application_manager/message_helper.h"
+
+namespace sdl_rpc_plugin {
+using namespace application_manager;
+
+namespace commands {
+
+SubtleAlertRequest::SubtleAlertRequest(
+ const application_manager::commands::MessageSharedPtr& message,
+ ApplicationManager& application_manager,
+ rpc_service::RPCService& rpc_service,
+ HMICapabilities& hmi_capabilities,
+ policy::PolicyHandlerInterface& policy_handler)
+ : CommandRequestImpl(message,
+ application_manager,
+ rpc_service,
+ hmi_capabilities,
+ policy_handler)
+ , awaiting_ui_subtle_alert_response_(false)
+ , awaiting_tts_speak_response_(false)
+ , awaiting_tts_stop_speaking_response_(false)
+ , is_ui_subtle_alert_sent_(false)
+ , is_tts_stop_speaking_sent_(false)
+ , subtle_alert_result_(hmi_apis::Common_Result::INVALID_ENUM)
+ , tts_speak_result_(hmi_apis::Common_Result::INVALID_ENUM) {
+ subscribe_on_event(hmi_apis::FunctionID::UI_OnResetTimeout);
+ subscribe_on_event(hmi_apis::FunctionID::TTS_OnResetTimeout);
+}
+
+SubtleAlertRequest::~SubtleAlertRequest() {}
+
+bool SubtleAlertRequest::Init() {
+ /* Timeout in milliseconds.
+ If omitted a standard value of 10000 milliseconds is used.*/
+ auto& msg_params = (*message_)[strings::msg_params];
+ uint32_t duration_timeout = msg_params[strings::duration].asUInt();
+
+ default_timeout_ += duration_timeout;
+
+ // If soft buttons are present, SDL will not use initiate timeout tracking for
+ // response.
+ if (msg_params.keyExists(strings::soft_buttons)) {
+ LOG4CXX_INFO(logger_,
+ "Request contains soft buttons - request timeout "
+ "will be set to 0.");
+ default_timeout_ = 0;
+ }
+
+ return true;
+}
+
+void SubtleAlertRequest::Run() {
+ LOG4CXX_AUTO_TRACE(logger_);
+
+ uint32_t app_id =
+ (*message_)[strings::params][strings::connection_key].asInt();
+
+ if (!Validate(app_id)) {
+ // Invalid command, abort execution
+ return;
+ }
+ bool tts_chunks_exists =
+ (*message_)[strings::msg_params].keyExists(strings::tts_chunks);
+ size_t length_tts_chunks = 0;
+
+ if (tts_chunks_exists) {
+ length_tts_chunks =
+ (*message_)[strings::msg_params][strings::tts_chunks].length();
+ }
+
+ awaiting_tts_speak_response_ = (tts_chunks_exists && length_tts_chunks);
+
+ SendSubtleAlertRequest(app_id);
+ if (awaiting_tts_speak_response_) {
+ SendSpeakRequest(app_id, tts_chunks_exists, length_tts_chunks);
+ }
+}
+
+void SubtleAlertRequest::on_event(const event_engine::Event& event) {
+ LOG4CXX_AUTO_TRACE(logger_);
+ const smart_objects::SmartObject& message = event.smart_object();
+
+ switch (event.id()) {
+ case hmi_apis::FunctionID::TTS_OnResetTimeout:
+ case hmi_apis::FunctionID::UI_OnResetTimeout: {
+ LOG4CXX_INFO(logger_,
+ "Received UI_OnResetTimeout event "
+ " or TTS_OnResetTimeout event"
+ << awaiting_tts_speak_response_ << " "
+ << awaiting_tts_stop_speaking_response_ << " "
+ << awaiting_ui_subtle_alert_response_);
+ application_manager_.updateRequestTimeout(
+ connection_key(), correlation_id(), default_timeout());
+ break;
+ }
+ case hmi_apis::FunctionID::UI_SubtleAlert: {
+ LOG4CXX_INFO(logger_, "Received UI_SubtleAlert event");
+ // Unsubscribe from event to avoid unwanted messages
+ EndAwaitForInterface(HmiInterfaces::HMI_INTERFACE_UI);
+ unsubscribe_from_event(hmi_apis::FunctionID::UI_SubtleAlert);
+ awaiting_ui_subtle_alert_response_ = false;
+ HmiInterfaces::InterfaceState ui_interface_state =
+ application_manager_.hmi_interfaces().GetInterfaceState(
+ HmiInterfaces::HMI_INTERFACE_UI);
+
+ if (awaiting_tts_speak_response_ &&
+ HmiInterfaces::STATE_NOT_AVAILABLE != ui_interface_state) {
+ awaiting_tts_stop_speaking_response_ = true;
+ StartAwaitForInterface(HmiInterfaces::HMI_INTERFACE_TTS);
+ SendHMIRequest(hmi_apis::FunctionID::TTS_StopSpeaking, NULL, true);
+ is_tts_stop_speaking_sent_ = true;
+ }
+ subtle_alert_result_ = static_cast<hmi_apis::Common_Result::eType>(
+ message[strings::params][hmi_response::code].asInt());
+
+ // Mobile Alert request is successful when UI_SubtleAlert is successful
+ subtle_alert_response_params_ = message[strings::msg_params];
+ GetInfo(message, ui_response_info_);
+ break;
+ }
+ case hmi_apis::FunctionID::TTS_Speak: {
+ LOG4CXX_INFO(logger_, "Received TTS_Speak event");
+ // Unsubscribe from event to avoid unwanted messages
+ EndAwaitForInterface(HmiInterfaces::HMI_INTERFACE_TTS);
+ unsubscribe_from_event(hmi_apis::FunctionID::TTS_Speak);
+ awaiting_tts_speak_response_ = false;
+ tts_speak_result_ = static_cast<hmi_apis::Common_Result::eType>(
+ message[strings::params][hmi_response::code].asInt());
+ GetInfo(message, tts_response_info_);
+ break;
+ }
+ case hmi_apis::FunctionID::TTS_StopSpeaking: {
+ LOG4CXX_INFO(logger_, "Received TTS_StopSpeaking event");
+ EndAwaitForInterface(HmiInterfaces::HMI_INTERFACE_TTS);
+ // Unsubscribe from event to avoid unwanted messages
+ unsubscribe_from_event(hmi_apis::FunctionID::TTS_StopSpeaking);
+ awaiting_tts_stop_speaking_response_ = false;
+ break;
+ }
+ default: {
+ LOG4CXX_ERROR(logger_, "Received unknown event" << event.id());
+ return;
+ }
+ }
+
+ if (HasHmiResponsesToWait()) {
+ return;
+ }
+ mobile_apis::Result::eType result_code = mobile_apis::Result::INVALID_ENUM;
+ std::string info;
+ const bool result = PrepareResponseParameters(result_code, info);
+ SendResponse(result,
+ result_code,
+ info.empty() ? NULL : info.c_str(),
+ &subtle_alert_response_params_);
+}
+
+bool SubtleAlertRequest::PrepareResponseParameters(
+ mobile_apis::Result::eType& result_code, std::string& info) {
+ app_mngr::commands::ResponseInfo ui_subtle_alert_info(
+ subtle_alert_result_,
+ HmiInterfaces::HMI_INTERFACE_UI,
+ application_manager_);
+ app_mngr::commands::ResponseInfo tts_alert_info(
+ tts_speak_result_,
+ HmiInterfaces::HMI_INTERFACE_TTS,
+ application_manager_);
+
+ 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,
+ tts_response_info_);
+ return result;
+ }
+ // Ignore TTS.Speak result if ABORTED due to TTS.StopSpeaking request
+ if (is_tts_stop_speaking_sent_ &&
+ hmi_apis::Common_Result::ABORTED == tts_alert_info.result_code) {
+ result_code =
+ MessageHelper::HMIToMobileResult(ui_subtle_alert_info.result_code);
+ info = app_mngr::commands::MergeInfos(ui_subtle_alert_info,
+ ui_response_info_,
+ tts_alert_info,
+ tts_response_info_);
+ return ui_subtle_alert_info.is_ok;
+ }
+ result_code =
+ PrepareResultCodeForResponse(ui_subtle_alert_info, tts_alert_info);
+ info = app_mngr::commands::MergeInfos(ui_subtle_alert_info,
+ ui_response_info_,
+ 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) {
+ return false;
+ }
+ return result;
+}
+
+bool SubtleAlertRequest::Validate(uint32_t app_id) {
+ LOG4CXX_AUTO_TRACE(logger_);
+ ApplicationSharedPtr app = application_manager_.application(app_id);
+
+ if (!app) {
+ LOG4CXX_ERROR(logger_, "No application associated with session key");
+ SendResponse(false, mobile_apis::Result::APPLICATION_NOT_REGISTERED);
+ return false;
+ }
+
+ if (mobile_apis::HMILevel::HMI_BACKGROUND ==
+ app->hmi_level(mobile_apis::PredefinedWindows::DEFAULT_WINDOW) &&
+ app->AreCommandLimitsExceeded(
+ static_cast<mobile_apis::FunctionID::eType>(function_id()),
+ application_manager::TLimitSource::POLICY_TABLE)) {
+ LOG4CXX_ERROR(logger_, "SubtleAlert frequency is too high.");
+ SendResponse(false,
+ mobile_apis::Result::REJECTED,
+ "SubtleAlert frequency is too high.");
+ return false;
+ }
+
+ if (!CheckStrings()) {
+ SendResponse(false, mobile_apis::Result::INVALID_DATA);
+ return false;
+ }
+
+ // ProcessSoftButtons checks strings on the contents incorrect character
+
+ mobile_apis::Result::eType processing_result =
+ MessageHelper::ProcessSoftButtons((*message_)[strings::msg_params],
+ app,
+ policy_handler_,
+ application_manager_);
+
+ if (mobile_apis::Result::SUCCESS != processing_result) {
+ LOG4CXX_ERROR(logger_, "INVALID_DATA!");
+ SendResponse(false, processing_result);
+ return false;
+ }
+
+ // check if mandatory params(alertText1 and TTSChunk) specified
+ if ((!(*message_)[strings::msg_params].keyExists(strings::alert_text1)) &&
+ (!(*message_)[strings::msg_params].keyExists(strings::alert_text2)) &&
+ (!(*message_)[strings::msg_params].keyExists(strings::tts_chunks))) {
+ LOG4CXX_ERROR(logger_, "Mandatory parameters are missing");
+ SendResponse(false,
+ mobile_apis::Result::INVALID_DATA,
+ "Mandatory parameters are missing");
+ return false;
+ }
+
+ if ((*message_)[strings::msg_params].keyExists(strings::tts_chunks)) {
+ smart_objects::SmartObject& tts_chunks =
+ (*message_)[strings::msg_params][strings::tts_chunks];
+ mobile_apis::Result::eType verification_result =
+ MessageHelper::VerifyTtsFiles(tts_chunks, app, application_manager_);
+
+ if (mobile_apis::Result::FILE_NOT_FOUND == verification_result) {
+ LOG4CXX_ERROR(
+ logger_,
+ "MessageHelper::VerifyTtsFiles return " << verification_result);
+ SendResponse(false,
+ mobile_apis::Result::FILE_NOT_FOUND,
+ "One or more files needed for tts_chunks are not present");
+ return false;
+ }
+ }
+
+ return true;
+}
+
+void SubtleAlertRequest::SendSubtleAlertRequest(int32_t app_id) {
+ LOG4CXX_AUTO_TRACE(logger_);
+ ApplicationSharedPtr app = application_manager_.application(app_id);
+
+ smart_objects::SmartObject msg_params =
+ smart_objects::SmartObject(smart_objects::SmartType_Map);
+
+ msg_params[hmi_request::alert_strings] =
+ smart_objects::SmartObject(smart_objects::SmartType_Array);
+
+ if ((*message_)[strings::msg_params].keyExists(strings::cancel_id)) {
+ msg_params[strings::cancel_id] =
+ (*message_)[strings::msg_params][strings::cancel_id].asInt();
+ }
+
+ int32_t index = 0;
+ if ((*message_)[strings::msg_params].keyExists(strings::alert_text1)) {
+ msg_params[hmi_request::alert_strings][index][hmi_request::field_name] =
+ hmi_apis::Common_TextFieldName::subtleAlertText1;
+ msg_params[hmi_request::alert_strings][index][hmi_request::field_text] =
+ (*message_)[strings::msg_params][strings::alert_text1];
+ index++;
+ }
+ if ((*message_)[strings::msg_params].keyExists(strings::alert_text2)) {
+ msg_params[hmi_request::alert_strings][index][hmi_request::field_name] =
+ hmi_apis::Common_TextFieldName::subtleAlertText2;
+ msg_params[hmi_request::alert_strings][index][hmi_request::field_text] =
+ (*message_)[strings::msg_params][strings::alert_text2];
+ index++;
+ }
+
+ // softButtons
+ if ((*message_)[strings::msg_params].keyExists(strings::soft_buttons)) {
+ msg_params[hmi_request::soft_buttons] =
+ (*message_)[strings::msg_params][strings::soft_buttons];
+ MessageHelper::SubscribeApplicationToSoftButton(
+ (*message_)[strings::msg_params], app, function_id());
+ } else {
+ msg_params[strings::duration] =
+ (*message_)[strings::msg_params][strings::duration].asUInt();
+ }
+
+ if ((*message_)[strings::msg_params].keyExists(strings::alert_icon)) {
+ auto verification_result = MessageHelper::VerifyImage(
+ (*message_)[strings::msg_params][strings::alert_icon],
+ app,
+ application_manager_);
+
+ if (mobile_apis::Result::INVALID_DATA == verification_result) {
+ LOG4CXX_ERROR(logger_, "Image verification failed.");
+ SendResponse(false, verification_result);
+ return;
+ }
+
+ msg_params[strings::alert_icon] =
+ (*message_)[strings::msg_params][strings::alert_icon];
+ }
+
+ // app_id
+ msg_params[strings::app_id] = app_id;
+
+ // PASA Alert type
+ msg_params[strings::alert_type] = hmi_apis::Common_AlertType::UI;
+ if (awaiting_tts_speak_response_) {
+ msg_params[strings::alert_type] = hmi_apis::Common_AlertType::BOTH;
+ }
+
+ // check out if there are alert strings or soft buttons
+ if (msg_params[hmi_request::alert_strings].length() > 0 ||
+ msg_params.keyExists(hmi_request::soft_buttons)) {
+ awaiting_ui_subtle_alert_response_ = true;
+ is_ui_subtle_alert_sent_ = true;
+ StartAwaitForInterface(HmiInterfaces::HMI_INTERFACE_UI);
+ SendHMIRequest(hmi_apis::FunctionID::UI_SubtleAlert, &msg_params, true);
+ }
+}
+
+void SubtleAlertRequest::SendSpeakRequest(int32_t app_id,
+ bool tts_chunks_exists,
+ size_t length_tts_chunks) {
+ LOG4CXX_AUTO_TRACE(logger_);
+ using namespace hmi_apis;
+ using namespace smart_objects;
+ // crate HMI speak request
+ SmartObject msg_params = smart_objects::SmartObject(SmartType_Map);
+ if (tts_chunks_exists && length_tts_chunks) {
+ msg_params[hmi_request::tts_chunks] =
+ smart_objects::SmartObject(SmartType_Array);
+ msg_params[hmi_request::tts_chunks] =
+ (*message_)[strings::msg_params][strings::tts_chunks];
+ }
+ msg_params[strings::app_id] = app_id;
+ msg_params[hmi_request::speak_type] = Common_MethodName::SUBTLE_ALERT;
+ StartAwaitForInterface(HmiInterfaces::HMI_INTERFACE_TTS);
+ SendHMIRequest(FunctionID::TTS_Speak, &msg_params, true);
+}
+
+bool SubtleAlertRequest::CheckStrings() {
+ LOG4CXX_AUTO_TRACE(logger_);
+ const char* str = NULL;
+
+ if ((*message_)[strings::msg_params].keyExists(strings::alert_text1)) {
+ str = (*message_)[strings::msg_params][strings::alert_text1].asCharArray();
+ if (!CheckSyntax(str)) {
+ LOG4CXX_ERROR(logger_, "Invalid alert_text_1 syntax check failed");
+ return false;
+ }
+ }
+
+ if ((*message_)[strings::msg_params].keyExists(strings::alert_text2)) {
+ str = (*message_)[strings::msg_params][strings::alert_text2].asCharArray();
+ if (!CheckSyntax(str)) {
+ LOG4CXX_ERROR(logger_, "Invalid alert_text_2 syntax check failed");
+ return false;
+ }
+ }
+
+ if ((*message_)[strings::msg_params].keyExists(strings::tts_chunks)) {
+ smart_objects::SmartObject& tts_chunks_array =
+ (*message_)[strings::msg_params][strings::tts_chunks];
+ for (size_t i = 0; i < tts_chunks_array.length(); ++i) {
+ str = tts_chunks_array[i][strings::text].asCharArray();
+ if (strlen(str) && !CheckSyntax(str)) {
+ LOG4CXX_ERROR(logger_, "Invalid tts_chunks text syntax check failed");
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+bool SubtleAlertRequest::HasHmiResponsesToWait() {
+ LOG4CXX_AUTO_TRACE(logger_);
+ return awaiting_ui_subtle_alert_response_ || awaiting_tts_speak_response_ ||
+ awaiting_tts_stop_speaking_response_;
+}
+
+} // namespace commands
+} // namespace sdl_rpc_plugin
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/subtle_alert_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/subtle_alert_response.cc
new file mode 100644
index 0000000000..ad9252997b
--- /dev/null
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/subtle_alert_response.cc
@@ -0,0 +1,64 @@
+/*
+ Copyright (c) 2020, Ford Motor Company, Livio
+ 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 the copyright holders nor the names of their
+ 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/subtle_alert_response.h"
+
+#include "application_manager/application_impl.h"
+#include "interfaces/MOBILE_API.h"
+
+namespace sdl_rpc_plugin {
+using namespace application_manager;
+
+namespace commands {
+
+SubtleAlertResponse::SubtleAlertResponse(
+ 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)
+ : CommandResponseImpl(message,
+ application_manager,
+ rpc_service,
+ hmi_capabilities,
+ policy_handler) {}
+
+SubtleAlertResponse::~SubtleAlertResponse() {}
+
+void SubtleAlertResponse::Run() {
+ LOG4CXX_AUTO_TRACE(logger_);
+
+ rpc_service_.SendMessageToMobile(message_);
+}
+
+} // namespace commands
+} // namespace sdl_rpc_plugin
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 b89a8dbd68..0289a92290 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
@@ -135,6 +135,8 @@
#include "sdl_rpc_plugin/commands/hmi/ui_show_response.h"
#include "sdl_rpc_plugin/commands/hmi/ui_slider_request.h"
#include "sdl_rpc_plugin/commands/hmi/ui_slider_response.h"
+#include "sdl_rpc_plugin/commands/hmi/ui_subtle_alert_request.h"
+#include "sdl_rpc_plugin/commands/hmi/ui_subtle_alert_response.h"
#include "sdl_rpc_plugin/commands/hmi/update_app_list_request.h"
#include "sdl_rpc_plugin/commands/hmi/update_app_list_response.h"
#include "sdl_rpc_plugin/commands/hmi/update_device_list_request.h"
@@ -229,6 +231,7 @@
#include "sdl_rpc_plugin/commands/hmi/on_ui_keyboard_input_notification.h"
#include "sdl_rpc_plugin/commands/hmi/on_ui_language_change_notification.h"
#include "sdl_rpc_plugin/commands/hmi/on_ui_reset_timeout_notification.h"
+#include "sdl_rpc_plugin/commands/hmi/on_ui_subtle_alert_pressed_notification.h"
#include "sdl_rpc_plugin/commands/hmi/on_ui_touch_event_notification.h"
#include "sdl_rpc_plugin/commands/hmi/on_vr_command_notification.h"
#include "sdl_rpc_plugin/commands/hmi/on_vr_language_change_notification.h"
@@ -511,6 +514,11 @@ CommandCreator& HMICommandFactory::get_creator_factory(
? factory.GetCreator<commands::UIAlertRequest>()
: factory.GetCreator<commands::UIAlertResponse>();
}
+ case hmi_apis::FunctionID::UI_SubtleAlert: {
+ return hmi_apis::messageType::request == message_type
+ ? factory.GetCreator<commands::UISubtleAlertRequest>()
+ : factory.GetCreator<commands::UISubtleAlertResponse>();
+ }
case hmi_apis::FunctionID::VR_IsReady: {
return hmi_apis::messageType::request == message_type
? factory.GetCreator<commands::VRIsReadyRequest>()
@@ -923,6 +931,9 @@ CommandCreator& HMICommandFactory::get_creator_factory(
case hmi_apis::FunctionID::BasicCommunication_OnAppPropertiesChange: {
return factory.GetCreator<commands::OnAppPropertiesChangeNotification>();
}
+ case hmi_apis::FunctionID::UI_OnSubtleAlertPressed: {
+ return factory.GetCreator<commands::OnUISubtleAlertPressedNotification>();
+ }
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 c6f4b64636..5855309f80 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
@@ -31,6 +31,7 @@
*/
#include "sdl_rpc_plugin/mobile_command_factory.h"
+
#include "interfaces/MOBILE_API.h"
#include "sdl_rpc_plugin/commands/mobile/add_command_request.h"
#include "sdl_rpc_plugin/commands/mobile/add_command_response.h"
@@ -87,6 +88,7 @@
#include "sdl_rpc_plugin/commands/mobile/on_keyboard_input_notification.h"
#include "sdl_rpc_plugin/commands/mobile/on_language_change_notification.h"
#include "sdl_rpc_plugin/commands/mobile/on_permissions_change_notification.h"
+#include "sdl_rpc_plugin/commands/mobile/on_subtle_alert_pressed_notification.h"
#include "sdl_rpc_plugin/commands/mobile/on_system_capability_updated_notification.h"
#include "sdl_rpc_plugin/commands/mobile/on_system_request_notification.h"
#include "sdl_rpc_plugin/commands/mobile/on_tbt_client_state_notification.h"
@@ -132,6 +134,8 @@
#include "sdl_rpc_plugin/commands/mobile/subscribe_button_response.h"
#include "sdl_rpc_plugin/commands/mobile/subscribe_way_points_request.h"
#include "sdl_rpc_plugin/commands/mobile/subscribe_way_points_response.h"
+#include "sdl_rpc_plugin/commands/mobile/subtle_alert_request.h"
+#include "sdl_rpc_plugin/commands/mobile/subtle_alert_response.h"
#include "sdl_rpc_plugin/commands/mobile/system_request.h"
#include "sdl_rpc_plugin/commands/mobile/system_response.h"
#include "sdl_rpc_plugin/commands/mobile/unregister_app_interface_request.h"
@@ -222,6 +226,11 @@ CommandCreator& MobileCommandFactory::get_command_creator(
? factory.GetCreator<commands::AlertRequest>()
: factory.GetCreator<commands::AlertResponse>();
}
+ case mobile_apis::FunctionID::SubtleAlertID: {
+ return mobile_api::messageType::request == message_type
+ ? factory.GetCreator<commands::SubtleAlertRequest>()
+ : factory.GetCreator<commands::SubtleAlertResponse>();
+ }
case mobile_apis::FunctionID::SpeakID: {
return mobile_api::messageType::request == message_type
? factory.GetCreator<commands::SpeakRequest>()
@@ -458,6 +467,9 @@ CommandCreator& MobileCommandFactory::get_notification_creator(
case mobile_apis::FunctionID::OnWayPointChangeID: {
return factory.GetCreator<commands::OnWayPointChangeNotification>();
}
+ case mobile_apis::FunctionID::OnSubtleAlertPressedID: {
+ return factory.GetCreator<commands::OnSubtleAlertPressedNotification>();
+ }
default: {}
}
return factory.GetCreator<InvalidCommand>();
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/dummy_hmi_commands_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/dummy_hmi_commands_test.cc
index c66cb81141..5fa910b2d9 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/dummy_hmi_commands_test.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/dummy_hmi_commands_test.cc
@@ -30,13 +30,18 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-#include "application_manager/commands/command_request_test.h"
-
#include <stdint.h>
+
#include <string>
#include <vector>
-#include "gtest/gtest.h"
+#include "application_manager/commands/command_request_test.h"
+#include "application_manager/commands/commands_test.h"
+#include "application_manager/mock_application.h"
+#include "application_manager/mock_application_manager.h"
+#include "application_manager/mock_application_manager_settings.h"
+#include "application_manager/mock_event_dispatcher.h"
+#include "gtest/gtest.h"
#include "hmi/activate_app_request.h"
#include "hmi/activate_app_response.h"
#include "hmi/add_statistics_info_notification.h"
@@ -200,6 +205,8 @@
#include "hmi/ui_show_response.h"
#include "hmi/ui_slider_request.h"
#include "hmi/ui_slider_response.h"
+#include "hmi/ui_subtle_alert_request.h"
+#include "hmi/ui_subtle_alert_response.h"
#include "hmi/update_app_list_request.h"
#include "hmi/update_app_list_response.h"
#include "hmi/update_device_list_request.h"
@@ -223,12 +230,6 @@
#include "hmi/vr_perform_interaction_request.h"
#include "hmi/vr_perform_interaction_response.h"
-#include "application_manager/commands/commands_test.h"
-#include "application_manager/mock_application.h"
-#include "application_manager/mock_application_manager.h"
-#include "application_manager/mock_application_manager_settings.h"
-#include "application_manager/mock_event_dispatcher.h"
-
namespace am = application_manager;
namespace test {
@@ -499,7 +500,9 @@ typedef Types<commands::AllowAllAppsRequest,
commands::AllowAppRequest,
commands::AllowAppResponse,
commands::BCGetFilePathRequest,
- commands::BCGetFilePathResponse>
+ commands::BCGetFilePathResponse,
+ commands::UISubtleAlertResponse,
+ commands::UISubtleAlertRequest>
HMICommandsListFifth;
TYPED_TEST_CASE(HMICommandsTestFirst, HMICommandsListFirst);
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 3819c720f8..cbb27bffb2 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
@@ -79,6 +79,7 @@
#include "sdl_rpc_plugin/commands/hmi/on_ui_keyboard_input_notification.h"
#include "sdl_rpc_plugin/commands/hmi/on_ui_language_change_notification.h"
#include "sdl_rpc_plugin/commands/hmi/on_ui_reset_timeout_notification.h"
+#include "sdl_rpc_plugin/commands/hmi/on_ui_subtle_alert_pressed_notification.h"
#include "sdl_rpc_plugin/commands/hmi/on_ui_touch_event_notification.h"
#include "sdl_rpc_plugin/commands/hmi/on_video_data_streaming_notification.h"
#include "sdl_rpc_plugin/commands/hmi/on_vr_command_notification.h"
@@ -479,6 +480,21 @@ TEST_F(HMICommandsNotificationsTest, OnUITouchEventSendNotificationToMobile) {
}
TEST_F(HMICommandsNotificationsTest,
+ OnUISubtleAlertPressedSendNotificationToMobile) {
+ MessageSharedPtr message = CreateMessage();
+ std::shared_ptr<Command> command =
+ CreateCommand<OnUISubtleAlertPressedNotification>(message);
+ EXPECT_CALL(mock_rpc_service_,
+ ManageMobileCommand(_, Command::CommandSource::SOURCE_SDL));
+ command->Run();
+ EXPECT_EQ(
+ static_cast<int32_t>(mobile_apis::FunctionID::OnSubtleAlertPressedID),
+ (*message)[am::strings::params][am::strings::function_id].asInt());
+ EXPECT_EQ(static_cast<int32_t>(am::MessageType::kNotification),
+ (*message)[am::strings::params][am::strings::message_type].asInt());
+}
+
+TEST_F(HMICommandsNotificationsTest,
OnAppRegisteredNotificationSendNotificationToHmi) {
int32_t event_id = hmi_apis::FunctionID::INVALID_ENUM;
MessageSharedPtr message = CreateMessage();
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/simple_requests_to_hmi_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/simple_requests_to_hmi_test.cc
index 162e832e9f..21260250ae 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/simple_requests_to_hmi_test.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/simple_requests_to_hmi_test.cc
@@ -85,6 +85,7 @@
#include "sdl_rpc_plugin/commands/hmi/ui_set_media_clock_timer_request.h"
#include "sdl_rpc_plugin/commands/hmi/ui_show_request.h"
#include "sdl_rpc_plugin/commands/hmi/ui_slider_request.h"
+#include "sdl_rpc_plugin/commands/hmi/ui_subtle_alert_request.h"
#include "sdl_rpc_plugin/commands/hmi/vr_add_command_request.h"
#include "sdl_rpc_plugin/commands/hmi/vr_change_registration_request.h"
#include "sdl_rpc_plugin/commands/hmi/vr_delete_command_request.h"
@@ -156,6 +157,7 @@ typedef Types<sdl_rpc_plugin::commands::hmi::DialNumberRequest,
sdl_rpc_plugin::commands::UIAddCommandRequest,
sdl_rpc_plugin::commands::UIAddSubmenuRequest,
sdl_rpc_plugin::commands::UIAlertRequest,
+ sdl_rpc_plugin::commands::UISubtleAlertRequest,
sdl_rpc_plugin::commands::UIChangeRegistrationRequest,
sdl_rpc_plugin::commands::UIDeleteCommandRequest,
sdl_rpc_plugin::commands::UIDeleteSubmenuRequest,
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/simple_response_from_hmi_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/simple_response_from_hmi_test.cc
index f232240c28..c406d38f3d 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/simple_response_from_hmi_test.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/simple_response_from_hmi_test.cc
@@ -79,6 +79,7 @@
#include "hmi/ui_set_media_clock_timer_response.h"
#include "hmi/ui_show_response.h"
#include "hmi/ui_slider_response.h"
+#include "hmi/ui_subtle_alert_response.h"
#include "hmi/update_app_list_response.h"
#include "hmi/update_device_list_response.h"
#include "hmi/vr_add_command_response.h"
@@ -148,6 +149,8 @@ typedef Types<
hmi_apis::FunctionID::UI_AddSubMenu>,
CommandData<sdl_rpc_plugin::commands::UIAlertResponse,
hmi_apis::FunctionID::UI_Alert>,
+ CommandData<sdl_rpc_plugin::commands::UISubtleAlertResponse,
+ hmi_apis::FunctionID::UI_SubtleAlert>,
CommandData<sdl_rpc_plugin::commands::UIChangeRegistratioResponse,
hmi_apis::FunctionID::UI_ChangeRegistration>,
CommandData<sdl_rpc_plugin::commands::UIDeleteCommandResponse,
diff --git a/src/components/application_manager/src/application_impl.cc b/src/components/application_manager/src/application_impl.cc
index 11d038fee2..c595f8ecf9 100644
--- a/src/components/application_manager/src/application_impl.cc
+++ b/src/components/application_manager/src/application_impl.cc
@@ -934,7 +934,10 @@ bool ApplicationImpl::AreCommandLimitsExceeded(
application_manager_.GetPolicyHandler();
std::string priority;
policy_handler.GetPriority(policy_app_id(), &priority);
- uint32_t cmd_limit = policy_handler.GetNotificationsNumber(priority);
+ const bool is_subtle_alert =
+ (cmd_id == mobile_apis::FunctionID::SubtleAlertID);
+ uint32_t cmd_limit =
+ policy_handler.GetNotificationsNumber(priority, is_subtle_alert);
if (0 == cmd_limit) {
return true;
diff --git a/src/components/application_manager/src/hmi_capabilities_impl.cc b/src/components/application_manager/src/hmi_capabilities_impl.cc
index b9ab340614..a529ea3b5d 100644
--- a/src/components/application_manager/src/hmi_capabilities_impl.cc
+++ b/src/components/application_manager/src/hmi_capabilities_impl.cc
@@ -278,6 +278,15 @@ void InitCapabilities() {
hmi_apis::Common_TextFieldName::addressLines));
text_fields_enum_name.insert(std::make_pair(
std::string("phoneNumber"), hmi_apis::Common_TextFieldName::phoneNumber));
+ text_fields_enum_name.insert(
+ std::make_pair(std::string("subtleAlertText1"),
+ hmi_apis::Common_TextFieldName::subtleAlertText1));
+ text_fields_enum_name.insert(
+ std::make_pair(std::string("subtleAlertText2"),
+ hmi_apis::Common_TextFieldName::subtleAlertText2));
+ text_fields_enum_name.insert(std::make_pair(
+ std::string("subtleAlertSoftButtonText"),
+ hmi_apis::Common_TextFieldName::subtleAlertSoftButtonText));
text_fields_enum_name.insert(std::make_pair(
std::string("turnText"), hmi_apis::Common_TextFieldName::turnText));
text_fields_enum_name.insert(std::make_pair(
@@ -364,6 +373,9 @@ void InitCapabilities() {
hmi_apis::Common_ImageFieldName::locationImage));
image_field_name_enum.insert(std::make_pair(
std::string("alertIcon"), hmi_apis::Common_ImageFieldName::alertIcon));
+ image_field_name_enum.insert(
+ std::make_pair(std::string("subtleAlertIcon"),
+ hmi_apis::Common_ImageFieldName::subtleAlertIcon));
file_type_enum.insert(std::make_pair(std::string("GRAPHIC_BMP"),
hmi_apis::Common_FileType::GRAPHIC_BMP));
diff --git a/src/components/application_manager/src/hmi_interfaces_impl.cc b/src/components/application_manager/src/hmi_interfaces_impl.cc
index 0c33ea4b11..e4fa4c936c 100644
--- a/src/components/application_manager/src/hmi_interfaces_impl.cc
+++ b/src/components/application_manager/src/hmi_interfaces_impl.cc
@@ -134,6 +134,7 @@ generate_function_to_interface_convert_map() {
convert_map[TTS_SetGlobalProperties] = HmiInterfaces::HMI_INTERFACE_TTS;
convert_map[TTS_OnResetTimeout] = HmiInterfaces::HMI_INTERFACE_TTS;
convert_map[UI_Alert] = HmiInterfaces::HMI_INTERFACE_UI;
+ convert_map[UI_SubtleAlert] = HmiInterfaces::HMI_INTERFACE_UI;
convert_map[UI_Show] = HmiInterfaces::HMI_INTERFACE_UI;
convert_map[UI_AddCommand] = HmiInterfaces::HMI_INTERFACE_UI;
convert_map[UI_DeleteCommand] = HmiInterfaces::HMI_INTERFACE_UI;
diff --git a/src/components/application_manager/src/policies/policy_handler.cc b/src/components/application_manager/src/policies/policy_handler.cc
index 4992bd96ca..cf7735956a 100644
--- a/src/components/application_manager/src/policies/policy_handler.cc
+++ b/src/components/application_manager/src/policies/policy_handler.cc
@@ -1759,10 +1759,10 @@ void PolicyHandler::CheckPermissions(
device_id, app->policy_app_id(), hmi_level, rpc, rpc_params, result);
}
-uint32_t PolicyHandler::GetNotificationsNumber(
- const std::string& priority) const {
+uint32_t PolicyHandler::GetNotificationsNumber(const std::string& priority,
+ const bool is_subtle) const {
POLICY_LIB_CHECK_OR_RETURN(0);
- return policy_manager_->GetNotificationsNumber(priority);
+ return policy_manager_->GetNotificationsNumber(priority, is_subtle);
}
DeviceConsent PolicyHandler::GetUserConsentForDevice(
diff --git a/src/components/application_manager/test/application_impl_test.cc b/src/components/application_manager/test/application_impl_test.cc
index 11578f19d6..485f0f3b5b 100644
--- a/src/components/application_manager/test/application_impl_test.cc
+++ b/src/components/application_manager/test/application_impl_test.cc
@@ -534,16 +534,16 @@ TEST_F(ApplicationImplTest, AreCommandLimitsExceeded_LimitFromPT) {
EXPECT_CALL(policy_interface, GetPriority(policy_app_id, _))
.WillRepeatedly(Return(false));
- EXPECT_CALL(policy_interface, GetNotificationsNumber(_))
+ EXPECT_CALL(policy_interface, GetNotificationsNumber(_, false))
.WillOnce(Return(cmd_limit));
EXPECT_FALSE(app_impl->AreCommandLimitsExceeded(FunctionID::ReadDIDID,
TLimitSource::POLICY_TABLE));
- EXPECT_CALL(policy_interface, GetNotificationsNumber(_))
+ EXPECT_CALL(policy_interface, GetNotificationsNumber(_, false))
.WillOnce(Return(cmd_limit));
EXPECT_FALSE(app_impl->AreCommandLimitsExceeded(FunctionID::GetVehicleDataID,
TLimitSource::POLICY_TABLE));
- EXPECT_CALL(policy_interface, GetNotificationsNumber(_))
+ EXPECT_CALL(policy_interface, GetNotificationsNumber(_, false))
.WillRepeatedly(Return(0));
EXPECT_TRUE(app_impl->AreCommandLimitsExceeded(FunctionID::ReadDIDID,
TLimitSource::POLICY_TABLE));
diff --git a/src/components/application_manager/test/policy_handler_test.cc b/src/components/application_manager/test/policy_handler_test.cc
index ad94c4d1c8..35fa7d912e 100644
--- a/src/components/application_manager/test/policy_handler_test.cc
+++ b/src/components/application_manager/test/policy_handler_test.cc
@@ -729,9 +729,9 @@ TEST_F(PolicyHandlerTest, GetNotificationsNumber) {
// Arrange
EnablePolicyAndPolicyManagerMock();
// Check expectations
- EXPECT_CALL(*mock_policy_manager_, GetNotificationsNumber(priority_));
+ EXPECT_CALL(*mock_policy_manager_, GetNotificationsNumber(priority_, false));
// Act
- policy_handler_.GetNotificationsNumber(priority_);
+ policy_handler_.GetNotificationsNumber(priority_, false);
}
TEST_F(PolicyHandlerTest, GetUserConsentForDevice) {
diff --git a/src/components/application_manager/test/sdl_preloaded_pt.json b/src/components/application_manager/test/sdl_preloaded_pt.json
index e4818353d1..536a0939f9 100644
--- a/src/components/application_manager/test/sdl_preloaded_pt.json
+++ b/src/components/application_manager/test/sdl_preloaded_pt.json
@@ -21,9 +21,19 @@
"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": {
diff --git a/src/components/application_manager/test/sdl_pt_update.json b/src/components/application_manager/test/sdl_pt_update.json
index 205a962cc8..dc4fe16027 100644
--- a/src/components/application_manager/test/sdl_pt_update.json
+++ b/src/components/application_manager/test/sdl_pt_update.json
@@ -1743,6 +1743,15 @@
"NORMAL" : 4,
"VOICECOMM" : 10
},
+ "subtle_notifications_per_minute_by_priority": {
+ "COMMUNICATION": 15,
+ "EMERGENCY": 60,
+ "NAVIGATION": 20,
+ "PROJECTION": 20,
+ "NONE": 0,
+ "NORMAL": 10,
+ "VOICECOMM": 30
+ },
"seconds_between_retries" : [ 1, 5, 25, 125, 625 ],
"timeout_after_x_seconds" : 60,
"vehicle_make" : "Stark Industries",
diff --git a/src/components/include/application_manager/policies/policy_handler_interface.h b/src/components/include/application_manager/policies/policy_handler_interface.h
index 24d6db0d65..d8aef7cc1a 100644
--- a/src/components/include/application_manager/policies/policy_handler_interface.h
+++ b/src/components/include/application_manager/policies/policy_handler_interface.h
@@ -123,8 +123,8 @@ class PolicyHandlerInterface : public VehicleDataItemProvider {
const RPCParams& rpc_params,
CheckPermissionResult& result) = 0;
- virtual uint32_t GetNotificationsNumber(
- const std::string& priority) const = 0;
+ virtual uint32_t GetNotificationsNumber(const std::string& priority,
+ const bool is_subtle) const = 0;
virtual DeviceConsent GetUserConsentForDevice(
const std::string& device_id) const = 0;
virtual bool GetDefaultHmi(const std::string& device_id,
diff --git a/src/components/include/policy/policy_external/policy/policy_manager.h b/src/components/include/policy/policy_external/policy/policy_manager.h
index 184b3049f5..3086a7dfb8 100644
--- a/src/components/include/policy/policy_external/policy/policy_manager.h
+++ b/src/components/include/policy/policy_external/policy/policy_manager.h
@@ -488,10 +488,11 @@ class PolicyManager : public usage_statistics::StatisticsManager,
/**
* @brief Get number of notification by priority
* @param priority Specified priority
+ * @param is_subtle If true, get the number of allowed subtle notifications
* @return notification number
*/
- virtual uint32_t GetNotificationsNumber(
- const std::string& priority) const = 0;
+ virtual uint32_t GetNotificationsNumber(const std::string& priority,
+ const bool is_subtle) const = 0;
/**
* @brief Allows to update Vehicle Identification Number in policy table.
diff --git a/src/components/include/policy/policy_regular/policy/policy_manager.h b/src/components/include/policy/policy_regular/policy/policy_manager.h
index cc7fc1e1ce..4db05ccb38 100644
--- a/src/components/include/policy/policy_regular/policy/policy_manager.h
+++ b/src/components/include/policy/policy_regular/policy/policy_manager.h
@@ -479,10 +479,11 @@ class PolicyManager : public usage_statistics::StatisticsManager,
/**
* @brief Get number of notification by priority
* @param priority Specified priority
+ * @param is_subtle If true, get the number of allowed subtle notifications
* @return notification number
*/
- virtual uint32_t GetNotificationsNumber(
- const std::string& priority) const = 0;
+ virtual uint32_t GetNotificationsNumber(const std::string& priority,
+ const bool is_subtle) const = 0;
/**
* @brief Allows to update Vehicle Identification Number in policy table.
diff --git a/src/components/include/test/application_manager/policies/mock_policy_handler_interface.h b/src/components/include/test/application_manager/policies/mock_policy_handler_interface.h
index d52daa8fca..7b6da68c51 100644
--- a/src/components/include/test/application_manager/policies/mock_policy_handler_interface.h
+++ b/src/components/include/test/application_manager/policies/mock_policy_handler_interface.h
@@ -100,8 +100,9 @@ class MockPolicyHandlerInterface : public policy::PolicyHandlerInterface {
const policy::PTString& rpc,
const application_manager::RPCParams& rpc_params,
policy::CheckPermissionResult& result));
- MOCK_CONST_METHOD1(GetNotificationsNumber,
- uint32_t(const std::string& priority));
+ MOCK_CONST_METHOD2(GetNotificationsNumber,
+ uint32_t(const std::string& priority,
+ const bool is_subtle));
MOCK_CONST_METHOD1(GetUserConsentForDevice,
policy::DeviceConsent(const std::string& device_id));
MOCK_CONST_METHOD3(GetDefaultHmi,
diff --git a/src/components/include/test/policy/policy_external/policy/mock_cache_manager.h b/src/components/include/test/policy/policy_external/policy/mock_cache_manager.h
index 61022035bc..d93bdff7f7 100644
--- a/src/components/include/test/policy/policy_external/policy/mock_cache_manager.h
+++ b/src/components/include/test/policy/policy_external/policy/mock_cache_manager.h
@@ -137,9 +137,9 @@ class MockCacheManagerInterface : public ::policy::CacheManagerInterface {
void(const uint32_t service_type,
EndpointUrls& out_end_points));
MOCK_CONST_METHOD1(GetIconUrl, std::string(const std::string& policy_app_id));
- MOCK_METHOD1(
- GetNotificationsNumber,
- policy_table::NumberOfNotificationsType(const std::string& priority));
+ MOCK_METHOD2(GetNotificationsNumber,
+ policy_table::NumberOfNotificationsType(
+ const std::string& priority, const bool is_subtle));
MOCK_CONST_METHOD2(GetPriority,
bool(const std::string& policy_app_id,
std::string& priority));
diff --git a/src/components/include/test/policy/policy_external/policy/mock_policy_manager.h b/src/components/include/test/policy/policy_external/policy/mock_policy_manager.h
index 28a895fa64..0123c6c912 100644
--- a/src/components/include/test/policy/policy_external/policy/mock_policy_manager.h
+++ b/src/components/include/test/policy/policy_external/policy/mock_policy_manager.h
@@ -207,8 +207,9 @@ class MockPolicyManager : public PolicyManager {
MOCK_METHOD0(CleanupUnpairedDevices, bool());
MOCK_CONST_METHOD1(CanAppKeepContext, bool(const std::string& app_id));
MOCK_CONST_METHOD1(CanAppStealFocus, bool(const std::string& app_id));
- MOCK_CONST_METHOD1(GetNotificationsNumber,
- uint32_t(const std::string& priority));
+ MOCK_CONST_METHOD2(GetNotificationsNumber,
+ uint32_t(const std::string& priority,
+ const bool is_subtle));
MOCK_METHOD1(SetVINValue, void(const std::string& value));
MOCK_CONST_METHOD1(IsPredataPolicy, bool(const std::string& policy_app_id));
MOCK_CONST_METHOD1(HeartBeatTimeout, uint32_t(const std::string& app_id));
diff --git a/src/components/include/test/policy/policy_regular/policy/mock_cache_manager.h b/src/components/include/test/policy/policy_regular/policy/mock_cache_manager.h
index 97915884d7..19de301dc3 100644
--- a/src/components/include/test/policy/policy_regular/policy/mock_cache_manager.h
+++ b/src/components/include/test/policy/policy_regular/policy/mock_cache_manager.h
@@ -106,9 +106,9 @@ class MockCacheManagerInterface : public CacheManagerInterface {
policy_table::AppServiceParameters* app_service_parameters));
MOCK_CONST_METHOD1(UnknownRPCPassthroughAllowed,
bool(const std::string& policy_app_id));
- MOCK_METHOD1(
- GetNotificationsNumber,
- policy_table::NumberOfNotificationsType(const std::string& priority));
+ MOCK_METHOD2(GetNotificationsNumber,
+ policy_table::NumberOfNotificationsType(
+ const std::string& priority, const bool is_subtle));
MOCK_CONST_METHOD2(GetPriority,
bool(const std::string& policy_app_id,
std::string& priority));
diff --git a/src/components/include/test/policy/policy_regular/policy/mock_policy_manager.h b/src/components/include/test/policy/policy_regular/policy/mock_policy_manager.h
index 97f4504f71..4cb6455db6 100644
--- a/src/components/include/test/policy/policy_regular/policy/mock_policy_manager.h
+++ b/src/components/include/test/policy/policy_regular/policy/mock_policy_manager.h
@@ -205,8 +205,9 @@ class MockPolicyManager : public PolicyManager {
MOCK_METHOD0(CleanupUnpairedDevices, bool());
MOCK_CONST_METHOD1(CanAppKeepContext, bool(const std::string& app_id));
MOCK_CONST_METHOD1(CanAppStealFocus, bool(const std::string& app_id));
- MOCK_CONST_METHOD1(GetNotificationsNumber,
- uint32_t(const std::string& priority));
+ MOCK_CONST_METHOD2(GetNotificationsNumber,
+ uint32_t(const std::string& priority,
+ const bool is_subtle));
MOCK_METHOD1(SetVINValue, void(const std::string& value));
MOCK_CONST_METHOD1(IsPredataPolicy, bool(const std::string& policy_app_id));
MOCK_CONST_METHOD1(HeartBeatTimeout, uint32_t(const std::string& app_id));
diff --git a/src/components/interfaces/HMI_API.xml b/src/components/interfaces/HMI_API.xml
index 7c293ed858..50df15728f 100644
--- a/src/components/interfaces/HMI_API.xml
+++ b/src/components/interfaces/HMI_API.xml
@@ -630,6 +630,15 @@
<element name="phoneNumber">
<description> Optional phone number of intended location / establishment (if applicable) for SendLocation.</description>
</element>
+ <element name="subtleAlertText1">
+ <description>The first line of the subtle alert text field; applies to `SubtleAlert` `alertText1`</description>
+ </element>
+ <element name="subtleAlertText2">
+ <description>The second line of the subtle alert text field; applies to `SubtleAlert` `alertText2`</description>
+ </element>
+ <element name="subtleAlertSoftButtonText">
+ <description>A text field in the soft button of a subtle alert; applies to `SubtleAlert` `softButtons`</description>
+ </element>
<element name="timeToDestination"/>
<!-- TO DO to be removed -->
<element name="turnText"/>
@@ -723,6 +732,9 @@
<element name="alertIcon">
<description>The image field for Alert</description>
</element>
+ <element name="subtleAlertIcon">
+ <description>The image of the subtle alert; applies to `SubtleAlert` `alertIcon`</description>
+ </element>
</enum>
<enum name="TextAlignment">
@@ -1524,6 +1536,7 @@
<enum name="MethodName">
<description>Defines the type of the request which causes text-to-speech prompt</description>
<element name="ALERT" />
+ <element name="SUBTLE_ALERT" />
<element name="SPEAK" />
<element name="AUDIO_PASS_THRU" />
<element name="ALERT_MANEUVER" />
@@ -5160,6 +5173,51 @@
</param>
</function>
+ <function name="SubtleAlert" messagetype="request">
+ <description>Request from SDL to show a subtle alert message on the display.</description>
+ <param name="alertStrings" type="Common.TextFieldStruct" mandatory="true" array="true" minsize="0" maxsize="2">
+ <description>Array of lines of alert text fields. See TextFieldStruct. Uses subtleAlertText1, subtleAlertText2.</description>
+ </param>
+ <param name="alertIcon" type="Common.Image" mandatory="false">
+ <description>
+ Image to be displayed for the corresponding alert. See Image.
+ If omitted, no (or the default if applicable) icon should be displayed.
+ </description>
+ </param>
+ <param name="duration" type="Integer" mandatory="false" minvalue="3000" maxvalue="10000">
+ <description>Timeout in milliseconds.</description>
+ </param>
+ <param name="softButtons" type="Common.SoftButton" mandatory="false" minsize="0" maxsize="2" array="true">
+ <description>App defined SoftButtons</description>
+ </param>
+ <param name="alertType" type="Common.AlertType" mandatory="true">
+ <description>Defines if only UI or BOTH portions of the Alert request are being sent to HMI Side</description>
+ </param>
+ <param name="appID" type="Integer" mandatory="true">
+ <description>ID of application requested this RPC.</description>
+ </param>
+ <param name="cancelID" type="Integer" mandatory="false">
+ <description>
+ An ID for this specific alert to allow cancellation through the `CancelInteraction` RPC.
+ </description>
+ </param>
+ </function>
+
+ <function name="SubtleAlert" messagetype="response">
+ <param name="tryAgainTime" type="Integer" mandatory="false" minvalue="0" maxvalue="2000000000">
+ <description>Amount of time (in milliseconds) that SDL must wait before resending an alert. Must be provided if another system event or overlay currently has a higher priority than this alert.</description>
+ </param>
+ </function>
+
+ <function name="OnSubtleAlertPressed" messagetype="notification">
+ <description>
+ Sent when the alert itself is touched (outside of a soft button). Touching (or otherwise selecting) the alert should open the app before sending this notification.
+ </description>
+ <param name="appID" type="Integer" mandatory="true">
+ <description>ID of application that is related to this RPC.</description>
+ </param>
+ </function>
+
<function name="SetDisplayLayout" messagetype="request">
<description>This RPC is deprecated. Use Show RPC to change layout.</description>
<param name="displayLayout" type="String" maxlength="500" mandatory="true">
@@ -5447,7 +5505,7 @@
</param>
<param name="functionID" type="Integer" mandatory="true">
<description>
- The ID of the type of interaction the developer wants to dismiss. Only values 10, (PerformInteractionID), 12 (AlertID), 25 (ScrollableMessageID), and 26 (SliderID) are permitted.
+ The ID of the type of interaction the developer wants to dismiss. Only values 10, (PerformInteractionID), 12 (AlertID), 25 (ScrollableMessageID), 26 (SliderID), and 64 (SubtleAlertID) are permitted.
</description>
</param>
<param name="appID" type="Integer" mandatory="true">
diff --git a/src/components/policy/policy_external/include/policy/cache_manager.h b/src/components/policy/policy_external/include/policy/cache_manager.h
index 36dd6d7259..12fe8f10cd 100644
--- a/src/components/policy/policy_external/include/policy/cache_manager.h
+++ b/src/components/policy/policy_external/include/policy/cache_manager.h
@@ -309,13 +309,8 @@ class CacheManager : public CacheManagerInterface {
void GetUpdateUrls(const uint32_t service_type,
EndpointUrls& out_end_points) const OVERRIDE;
- /**
- * @brief Gets allowed number of notifications
- * depending on application priority.
- * @param priority Priority of application
- */
virtual rpc::policy_table_interface_base::NumberOfNotificationsType
- GetNotificationsNumber(const std::string& priority);
+ GetNotificationsNumber(const std::string& priority, const bool is_subtle);
/**
* @brief Gets priority for given application
diff --git a/src/components/policy/policy_external/include/policy/cache_manager_interface.h b/src/components/policy/policy_external/include/policy/cache_manager_interface.h
index 44df1f36a5..8ed46e0c72 100644
--- a/src/components/policy/policy_external/include/policy/cache_manager_interface.h
+++ b/src/components/policy/policy_external/include/policy/cache_manager_interface.h
@@ -342,9 +342,10 @@ class CacheManagerInterface {
* @brief Get allowed number of notifications
* depending on application priority.
* @param priority Priority of application
+ * @param is_subtle If true, get the number of allowed subtle notifications
*/
virtual policy_table::NumberOfNotificationsType GetNotificationsNumber(
- const std::string& priority) = 0;
+ const std::string& priority, const bool is_subtle) = 0;
/**
* @brief Get priority for given application
diff --git a/src/components/policy/policy_external/include/policy/policy_manager_impl.h b/src/components/policy/policy_external/include/policy/policy_manager_impl.h
index 04fac53885..27ce30bb3d 100644
--- a/src/components/policy/policy_external/include/policy/policy_manager_impl.h
+++ b/src/components/policy/policy_external/include/policy/policy_manager_impl.h
@@ -442,9 +442,11 @@ class PolicyManagerImpl : public PolicyManager {
/**
* @brief Get number of notification by priority
* @param priority Specified priority
+ * @param is_subtle If true, get the number of allowed subtle notifications
* @return notification number
*/
- uint32_t GetNotificationsNumber(const std::string& priority) const OVERRIDE;
+ uint32_t GetNotificationsNumber(const std::string& priority,
+ const bool is_subtle) const OVERRIDE;
/**
* @brief Allows to update Vehicle Identification Number in policy table.
diff --git a/src/components/policy/policy_external/include/policy/policy_table/types.h b/src/components/policy/policy_external/include/policy/policy_table/types.h
index 6e6fd1afb8..7736468aa0 100644
--- a/src/components/policy/policy_external/include/policy/policy_table/types.h
+++ b/src/components/policy/policy_external/include/policy/policy_table/types.h
@@ -382,6 +382,7 @@ struct ModuleConfig : CompositeType {
ServiceEndpoints endpoints;
Optional<ServiceEndpointProperties> endpoint_properties;
NumberOfNotificationsPerMinute notifications_per_minute_by_priority;
+ NumberOfNotificationsPerMinute subtle_notifications_per_minute_by_priority;
Optional<String<0, 100> > vehicle_make;
Optional<String<0, 100> > vehicle_model;
Optional<String<0, 4> > vehicle_year;
@@ -403,7 +404,9 @@ struct ModuleConfig : CompositeType {
const ServiceEndpoints& endpoints,
const ServiceEndpointProperties& endpoint_properties,
const NumberOfNotificationsPerMinute&
- notifications_per_minute_by_priority);
+ notifications_per_minute_by_priority,
+ const NumberOfNotificationsPerMinute&
+ subtle_notifications_per_minute_by_priority);
~ModuleConfig();
explicit ModuleConfig(const Json::Value* value__);
void SafeCopyFrom(const ModuleConfig& from);
diff --git a/src/components/policy/policy_external/include/policy/policy_table_interface_ext.xml b/src/components/policy/policy_external/include/policy/policy_table_interface_ext.xml
index 7446d3acae..7fad362c57 100644
--- a/src/components/policy/policy_external/include/policy/policy_table_interface_ext.xml
+++ b/src/components/policy/policy_external/include/policy/policy_table_interface_ext.xml
@@ -176,6 +176,7 @@
<param name="seconds_between_retries" type="SecondsBetweenRetries" />
<param name="endpoints" type="ServiceEndpoints" />
<param name="notifications_per_minute_by_priority" type="NumberOfNotificationsPerMinute" />
+ <param name="subtle_notifications_per_minute_by_priority" type="NumberOfNotificationsPerMinute" />
<param name="vehicle_make" type="String" maxlength="100"
mandatory="false" />
<param name="vehicle_model" type="String" maxlength="100"
diff --git a/src/components/policy/policy_external/include/policy/sql_pt_queries.h b/src/components/policy/policy_external/include/policy/sql_pt_queries.h
index 8a3ad1f7df..aba08dcca1 100644
--- a/src/components/policy/policy_external/include/policy/sql_pt_queries.h
+++ b/src/components/policy/policy_external/include/policy/sql_pt_queries.h
@@ -52,6 +52,7 @@ extern const std::string kSelectEndpoint;
extern const std::string kSelectModuleConfig;
extern const std::string kSelectEndpoints;
extern const std::string kSelectNotificationsPerMin;
+extern const std::string kSelectSubtleNotificationsPerMin;
extern const std::string kSelectNotificationsPerPriority;
extern const std::string kSelectAppLevels;
extern const std::string kSelectDeviceData;
@@ -93,6 +94,7 @@ extern const std::string kUpdateModuleConfig;
extern const std::string kInsertEndpoint;
extern const std::string kInsertSecondsBetweenRetry;
extern const std::string kInsertNotificationsByPriority;
+extern const std::string kInsertSubtleNotificationsByPriority;
extern const std::string kInsertDeviceData;
extern const std::string kInsertAppLevel;
extern const std::string kDeleteSecondsBetweenRetries;
diff --git a/src/components/policy/policy_external/include/policy/sql_pt_representation.h b/src/components/policy/policy_external/include/policy/sql_pt_representation.h
index 574806b3fb..473022c6c3 100644
--- a/src/components/policy/policy_external/include/policy/sql_pt_representation.h
+++ b/src/components/policy/policy_external/include/policy/sql_pt_representation.h
@@ -250,6 +250,8 @@ class SQLPTRepresentation : public virtual PTRepresentation {
const policy_table::SecondsBetweenRetries& seconds);
bool SaveNumberOfNotificationsPerMinute(
const policy_table::NumberOfNotificationsPerMinute& notifications);
+ bool SaveNumberOfSubtleNotificationsPerMinute(
+ const policy_table::NumberOfNotificationsPerMinute& notifications);
bool SaveMessageType(const std::string& type);
bool SaveLanguage(const std::string& code);
policy_table::VehicleDataItem PopulateVDIFromQuery(
diff --git a/src/components/policy/policy_external/src/cache_manager.cc b/src/components/policy/policy_external/src/cache_manager.cc
index 40c216a720..fee1bce426 100644
--- a/src/components/policy/policy_external/src/cache_manager.cc
+++ b/src/components/policy/policy_external/src/cache_manager.cc
@@ -1797,15 +1797,18 @@ std::string CacheManager::GetIconUrl(const std::string& policy_app_id) const {
}
rpc::policy_table_interface_base::NumberOfNotificationsType
-CacheManager::GetNotificationsNumber(const std::string& priority) {
+CacheManager::GetNotificationsNumber(const std::string& priority,
+ const bool is_subtle) {
CACHE_MANAGER_CHECK(0);
- typedef rpc::policy_table_interface_base::NumberOfNotificationsPerMinute NNPM;
sync_primitives::AutoLock auto_lock(cache_lock_);
- const NNPM& nnpm =
- pt_->policy_table.module_config.notifications_per_minute_by_priority;
+ const auto& nnpm = is_subtle
+ ? pt_->policy_table.module_config
+ .subtle_notifications_per_minute_by_priority
+ : pt_->policy_table.module_config
+ .notifications_per_minute_by_priority;
- NNPM::const_iterator priority_iter = nnpm.find(priority);
+ auto priority_iter = nnpm.find(priority);
const uint32_t result =
(nnpm.end() != priority_iter ? (*priority_iter).second : 0);
diff --git a/src/components/policy/policy_external/src/policy_manager_impl.cc b/src/components/policy/policy_external/src/policy_manager_impl.cc
index f057e21617..0c72aac4ad 100644
--- a/src/components/policy/policy_external/src/policy_manager_impl.cc
+++ b/src/components/policy/policy_external/src/policy_manager_impl.cc
@@ -428,6 +428,12 @@ void FilterPolicyTable(
FilterInvalidPriorityValues(
module_config.notifications_per_minute_by_priority);
}
+ if (module_config.is_initialized() &&
+ module_config.subtle_notifications_per_minute_by_priority
+ .is_initialized()) {
+ FilterInvalidPriorityValues(
+ module_config.subtle_notifications_per_minute_by_priority);
+ }
if (pt.app_policies_section.is_initialized()) {
policy_table::ApplicationPolicies& apps = pt.app_policies_section.apps;
@@ -1640,10 +1646,10 @@ std::string PolicyManagerImpl::GetCCPUVersionFromPT() const {
return cache_->GetCCPUVersionFromPT();
}
-uint32_t PolicyManagerImpl::GetNotificationsNumber(
- const std::string& priority) const {
+uint32_t PolicyManagerImpl::GetNotificationsNumber(const std::string& priority,
+ const bool is_subtle) const {
LOG4CXX_AUTO_TRACE(logger_);
- return cache_->GetNotificationsNumber(priority);
+ return cache_->GetNotificationsNumber(priority, is_subtle);
}
bool PolicyManagerImpl::ExceededIgnitionCycles() {
diff --git a/src/components/policy/policy_external/src/policy_table/types.cc b/src/components/policy/policy_external/src/policy_table/types.cc
index f0ea154f94..6d50a8cf26 100644
--- a/src/components/policy/policy_external/src/policy_table/types.cc
+++ b/src/components/policy/policy_external/src/policy_table/types.cc
@@ -830,7 +830,9 @@ ModuleConfig::ModuleConfig(
const SecondsBetweenRetries& seconds_between_retries,
const ServiceEndpoints& endpoints,
const ServiceEndpointProperties& endpoint_properties,
- const NumberOfNotificationsPerMinute& notifications_per_minute_by_priority)
+ const NumberOfNotificationsPerMinute& notifications_per_minute_by_priority,
+ const NumberOfNotificationsPerMinute&
+ subtle_notifications_per_minute_by_priority)
: CompositeType(kUninitialized)
, exchange_after_x_ignition_cycles(exchange_after_x_ignition_cycles)
, exchange_after_x_kilometers(exchange_after_x_kilometers)
@@ -839,8 +841,9 @@ ModuleConfig::ModuleConfig(
, seconds_between_retries(seconds_between_retries)
, endpoints(endpoints)
, endpoint_properties(endpoint_properties)
- , notifications_per_minute_by_priority(
- notifications_per_minute_by_priority) {}
+ , notifications_per_minute_by_priority(notifications_per_minute_by_priority)
+ , subtle_notifications_per_minute_by_priority(
+ subtle_notifications_per_minute_by_priority) {}
ModuleConfig::~ModuleConfig() {}
@@ -859,6 +862,8 @@ ModuleConfig::ModuleConfig(const Json::Value* value__)
, endpoint_properties(impl::ValueMember(value__, "endpoint_properties"))
, notifications_per_minute_by_priority(
impl::ValueMember(value__, "notifications_per_minute_by_priority"))
+ , subtle_notifications_per_minute_by_priority(impl::ValueMember(
+ value__, "subtle_notifications_per_minute_by_priority"))
, vehicle_make(impl::ValueMember(value__, "vehicle_make"))
, vehicle_model(impl::ValueMember(value__, "vehicle_model"))
, vehicle_year(impl::ValueMember(value__, "vehicle_year"))
@@ -880,6 +885,8 @@ void ModuleConfig::SafeCopyFrom(const ModuleConfig& from) {
endpoint_properties = from.endpoint_properties;
notifications_per_minute_by_priority =
from.notifications_per_minute_by_priority;
+ subtle_notifications_per_minute_by_priority =
+ from.subtle_notifications_per_minute_by_priority;
lock_screen_dismissal_enabled = from.lock_screen_dismissal_enabled;
certificate.assign_if_valid(from.certificate);
@@ -910,6 +917,9 @@ Json::Value ModuleConfig::ToJsonValue() const {
impl::WriteJsonField("notifications_per_minute_by_priority",
notifications_per_minute_by_priority,
&result__);
+ impl::WriteJsonField("subtle_notifications_per_minute_by_priority",
+ subtle_notifications_per_minute_by_priority,
+ &result__);
impl::WriteJsonField("vehicle_make", vehicle_make, &result__);
impl::WriteJsonField("vehicle_model", vehicle_model, &result__);
impl::WriteJsonField("vehicle_year", vehicle_year, &result__);
@@ -955,6 +965,9 @@ bool ModuleConfig::is_valid() const {
if (!notifications_per_minute_by_priority.is_valid()) {
return false;
}
+ if (!subtle_notifications_per_minute_by_priority.is_valid()) {
+ return false;
+ }
if (!vehicle_make.is_valid()) {
return false;
}
@@ -1019,6 +1032,9 @@ bool ModuleConfig::struct_empty() const {
if (notifications_per_minute_by_priority.is_initialized()) {
return false;
}
+ if (subtle_notifications_per_minute_by_priority.is_initialized()) {
+ return false;
+ }
if (lock_screen_dismissal_enabled.is_initialized()) {
return false;
}
@@ -1080,6 +1096,11 @@ void ModuleConfig::ReportErrors(rpc::ValidationReport* report__) const {
notifications_per_minute_by_priority.ReportErrors(
&report__->ReportSubobject("notifications_per_minute_by_priority"));
}
+ if (!subtle_notifications_per_minute_by_priority.is_valid()) {
+ subtle_notifications_per_minute_by_priority.ReportErrors(
+ &report__->ReportSubobject(
+ "subtle_notifications_per_minute_by_priority"));
+ }
if (!lock_screen_dismissal_enabled.is_valid()) {
lock_screen_dismissal_enabled.ReportErrors(
&report__->ReportSubobject("lock_screen_dismissal_enabled"));
@@ -1143,6 +1164,7 @@ void ModuleConfig::SetPolicyTableType(PolicyTableType pt_type) {
endpoints.SetPolicyTableType(pt_type);
endpoint_properties.SetPolicyTableType(pt_type);
notifications_per_minute_by_priority.SetPolicyTableType(pt_type);
+ subtle_notifications_per_minute_by_priority.SetPolicyTableType(pt_type);
lock_screen_dismissal_enabled.SetPolicyTableType(pt_type);
vehicle_make.SetPolicyTableType(pt_type);
vehicle_model.SetPolicyTableType(pt_type);
diff --git a/src/components/policy/policy_external/src/sql_pt_queries.cc b/src/components/policy/policy_external/src/sql_pt_queries.cc
index 4f858637d7..95c82b6ea6 100644
--- a/src/components/policy/policy_external/src/sql_pt_queries.cc
+++ b/src/components/policy/policy_external/src/sql_pt_queries.cc
@@ -113,6 +113,17 @@ const std::string kCreateSchema =
"CREATE INDEX IF NOT EXISTS "
"`notifications_by_priority.fk_notifications_by_priority_priority1_idx` "
" ON `notifications_by_priority`(`priority_value`); "
+ "CREATE TABLE IF NOT EXISTS `subtle_notifications_by_priority`( "
+ " `priority_value` VARCHAR(45) PRIMARY KEY NOT NULL, "
+ " `value` INTEGER NOT NULL, "
+ " CONSTRAINT `fk_subtle_notifications_by_priority_priority1` "
+ " FOREIGN KEY(`priority_value`) "
+ " REFERENCES `priority`(`value`) "
+ "); "
+ "CREATE INDEX IF NOT EXISTS "
+ "`subtle_notifications_by_priority.fk_subtle_notifications_by_priority_"
+ "priority1_idx` "
+ " ON `subtle_notifications_by_priority`(`priority_value`); "
"CREATE TABLE IF NOT EXISTS `language`( "
" `code` VARCHAR(25) PRIMARY KEY NOT NULL "
"); "
@@ -623,6 +634,10 @@ const std::string kDropSchema =
"DROP INDEX IF EXISTS "
"`notifications_by_priority.fk_notifications_by_priority_priority1_idx`; "
"DROP TABLE IF EXISTS `notifications_by_priority`; "
+ "DROP INDEX IF EXISTS "
+ "`subtle_notifications_by_priority.fk_subtle_notifications_by_priority_"
+ "priority1_idx`; "
+ "DROP TABLE IF EXISTS `subtle_notifications_by_priority`; "
"DROP TABLE IF EXISTS `hmi_level`; "
"DROP TABLE IF EXISTS `hybrid_app_preference`; "
"DROP TABLE IF EXISTS `priority`; "
@@ -664,6 +679,7 @@ const std::string kDeleteData =
"DELETE FROM `message_type`; "
"DELETE FROM `language`; "
"DELETE FROM `notifications_by_priority`; "
+ "DELETE FROM `subtle_notifications_by_priority`; "
"DELETE FROM `hmi_level`; "
"DELETE FROM `priority`; "
"DELETE FROM `functional_group`; "
@@ -875,6 +891,11 @@ const std::string kInsertNotificationsByPriority =
"`value`) "
" VALUES (?, ?)";
+const std::string kInsertSubtleNotificationsByPriority =
+ "INSERT OR REPLACE INTO `subtle_notifications_by_priority` "
+ "(`priority_value`, `value`) "
+ " VALUES (?, ?)";
+
const std::string kInsertDeviceData =
"INSERT OR IGNORE INTO `device` (`id`) VALUES (?)";
@@ -922,6 +943,9 @@ const std::string kSelectEndpoints =
const std::string kSelectNotificationsPerMin =
"SELECT `priority_value`, `value` FROM notifications_by_priority";
+const std::string kSelectSubtleNotificationsPerMin =
+ "SELECT `priority_value`, `value` FROM subtle_notifications_by_priority";
+
const std::string kSelectNotificationsPerPriority =
"SELECT `value` FROM notifications_by_priority WHERE `priority_value` = ? ";
diff --git a/src/components/policy/policy_external/src/sql_pt_representation.cc b/src/components/policy/policy_external/src/sql_pt_representation.cc
index 5e96d0bde0..d368707efa 100644
--- a/src/components/policy/policy_external/src/sql_pt_representation.cc
+++ b/src/components/policy/policy_external/src/sql_pt_representation.cc
@@ -563,6 +563,17 @@ void SQLPTRepresentation::GatherModuleConfig(
notifications.GetInteger(1);
}
}
+ utils::dbms::SQLQuery subtle_notifications(db());
+ if (!subtle_notifications.Prepare(sql_pt::kSelectSubtleNotificationsPerMin)) {
+ LOG4CXX_WARN(logger_,
+ "Incorrect select statement for subtle notifications");
+ } else {
+ while (subtle_notifications.Next()) {
+ config->subtle_notifications_per_minute_by_priority[subtle_notifications
+ .GetString(0)] =
+ subtle_notifications.GetInteger(1);
+ }
+ }
utils::dbms::SQLQuery seconds(db());
if (!seconds.Prepare(sql_pt::kSelectSecondsBetweenRetries)) {
LOG4CXX_INFO(logger_,
@@ -1534,6 +1545,11 @@ bool SQLPTRepresentation::SaveModuleConfig(
return false;
}
+ if (!SaveNumberOfSubtleNotificationsPerMinute(
+ config.subtle_notifications_per_minute_by_priority)) {
+ return false;
+ }
+
if (!SaveServiceEndpoints(config.endpoints)) {
return false;
}
@@ -1860,6 +1876,28 @@ bool SQLPTRepresentation::SaveNumberOfNotificationsPerMinute(
return true;
}
+bool SQLPTRepresentation::SaveNumberOfSubtleNotificationsPerMinute(
+ const policy_table::NumberOfNotificationsPerMinute& notifications) {
+ utils::dbms::SQLQuery query(db());
+ if (!query.Prepare(sql_pt::kInsertSubtleNotificationsByPriority)) {
+ LOG4CXX_WARN(logger_,
+ "Incorrect insert statement for notifications by priority.");
+ return false;
+ }
+
+ policy_table::NumberOfNotificationsPerMinute::const_iterator it;
+ for (it = notifications.begin(); it != notifications.end(); ++it) {
+ query.Bind(0, it->first);
+ query.Bind(1, it->second);
+ if (!query.Exec() || !query.Reset()) {
+ LOG4CXX_WARN(logger_, "Incorrect insert into notifications by priority.");
+ return false;
+ }
+ }
+
+ return true;
+}
+
bool SQLPTRepresentation::SaveDeviceData(
const policy_table::DeviceData& devices) {
utils::dbms::SQLQuery query(db());
diff --git a/src/components/policy/policy_external/test/cache_manager_test.cc b/src/components/policy/policy_external/test/cache_manager_test.cc
index 7bf13c250a..440df431db 100644
--- a/src/components/policy/policy_external/test/cache_manager_test.cc
+++ b/src/components/policy/policy_external/test/cache_manager_test.cc
@@ -123,23 +123,28 @@ TEST_F(CacheManagerTest,
*pt_ = CreateCustomPT(string_table);
std::string priority = "EMERGENCY";
- uint32_t notif_number = cache_manager_->GetNotificationsNumber(priority);
+ uint32_t notif_number =
+ cache_manager_->GetNotificationsNumber(priority, false);
EXPECT_EQ(1u, notif_number);
priority = "NAVIGATION";
- notif_number = cache_manager_->GetNotificationsNumber(priority);
+ notif_number = cache_manager_->GetNotificationsNumber(priority, false);
EXPECT_EQ(2u, notif_number);
priority = "VOICECOM";
- notif_number = cache_manager_->GetNotificationsNumber(priority);
+ notif_number = cache_manager_->GetNotificationsNumber(priority, false);
EXPECT_EQ(3u, notif_number);
+ priority = "COMMUNICATION";
+ notif_number = cache_manager_->GetNotificationsNumber(priority, false);
+ EXPECT_EQ(4u, notif_number);
+
priority = "NORMAL";
- notif_number = cache_manager_->GetNotificationsNumber(priority);
+ notif_number = cache_manager_->GetNotificationsNumber(priority, false);
EXPECT_EQ(5u, notif_number);
priority = "NONE";
- notif_number = cache_manager_->GetNotificationsNumber(priority);
+ notif_number = cache_manager_->GetNotificationsNumber(priority, false);
EXPECT_EQ(6u, notif_number);
}
@@ -162,7 +167,78 @@ TEST_F(CacheManagerTest, GetNotificationsNumber_PriorityNotExist_ReturnZero) {
*pt_ = CreateCustomPT(string_table);
const std::string priority = "OTHER_PRIORITY";
- uint32_t notif_number = cache_manager_->GetNotificationsNumber(priority);
+ uint32_t notif_number =
+ cache_manager_->GetNotificationsNumber(priority, false);
+ EXPECT_EQ(0u, notif_number);
+}
+
+TEST_F(CacheManagerTest,
+ GetNotificationsNumber_Subtle_PriorityExists_ReturnNumberFromPT) {
+ std::string string_table(
+ "{"
+ "\"policy_table\": {"
+ "\"module_config\": {"
+ "\"subtle_notifications_per_minute_by_priority\": {"
+ "\"EMERGENCY\": 7,"
+ "\"NAVIGATION\": 8,"
+ "\"VOICECOM\": 9,"
+ "\"COMMUNICATION\": 10,"
+ "\"NORMAL\": 11,"
+ "\"NONE\": 12"
+ "}"
+ "}"
+ "}"
+ "}");
+ *pt_ = CreateCustomPT(string_table);
+
+ std::string priority = "EMERGENCY";
+ uint32_t notif_number =
+ cache_manager_->GetNotificationsNumber(priority, true);
+ EXPECT_EQ(7u, notif_number);
+
+ priority = "NAVIGATION";
+ notif_number = cache_manager_->GetNotificationsNumber(priority, true);
+ EXPECT_EQ(8u, notif_number);
+
+ priority = "VOICECOM";
+ notif_number = cache_manager_->GetNotificationsNumber(priority, true);
+ EXPECT_EQ(9u, notif_number);
+
+ priority = "COMMUNICATION";
+ notif_number = cache_manager_->GetNotificationsNumber(priority, true);
+ EXPECT_EQ(10u, notif_number);
+
+ priority = "NORMAL";
+ notif_number = cache_manager_->GetNotificationsNumber(priority, true);
+ EXPECT_EQ(11u, notif_number);
+
+ priority = "NONE";
+ notif_number = cache_manager_->GetNotificationsNumber(priority, true);
+ EXPECT_EQ(12u, notif_number);
+}
+
+TEST_F(CacheManagerTest,
+ GetNotificationsNumber_Subtle_PriorityNotExist_ReturnZero) {
+ const std::string string_table(
+ "{"
+ "\"policy_table\": {"
+ "\"module_config\": {"
+ "\"subtle_notifications_per_minute_by_priority\": {"
+ "\"EMERGENCY\": 7,"
+ "\"NAVIGATION\": 8,"
+ "\"VOICECOM\": 9,"
+ "\"COMMUNICATION\": 10,"
+ "\"NORMAL\": 11,"
+ "\"NONE\": 12"
+ "}"
+ "}"
+ "}"
+ "}");
+ *pt_ = CreateCustomPT(string_table);
+
+ const std::string priority = "OTHER_PRIORITY";
+ uint32_t notif_number =
+ cache_manager_->GetNotificationsNumber(priority, true);
EXPECT_EQ(0u, notif_number);
}
diff --git a/src/components/policy/policy_external/test/json/sdl_preloaded_pt_for_merge_initial.json b/src/components/policy/policy_external/test/json/sdl_preloaded_pt_for_merge_initial.json
index dec76dd96c..c949575190 100644
--- a/src/components/policy/policy_external/test/json/sdl_preloaded_pt_for_merge_initial.json
+++ b/src/components/policy/policy_external/test/json/sdl_preloaded_pt_for_merge_initial.json
@@ -2428,10 +2428,21 @@
"COMMUNICATION" : 6,
"EMERGENCY" : 60,
"NAVIGATION" : 15,
+ "PROJECTION" : 15,
"NONE" : 0,
"NORMAL" : 4,
"VOICECOM" : 20
},
+ "subtle_notifications_per_minute_by_priority":
+ {
+ "COMMUNICATION": 15,
+ "EMERGENCY": 60,
+ "NAVIGATION": 20,
+ "PROJECTION": 20,
+ "NONE": 0,
+ "NORMAL": 10,
+ "VOICECOM": 30
+ },
"preloaded_date" : "2012-12-15",
"preloaded_pt" : true,
"seconds_between_retries" : [ 1, 5, 25, 125, 625 ],
diff --git a/src/components/policy/policy_external/test/json/sdl_preloaded_pt_for_merge_latest.json b/src/components/policy/policy_external/test/json/sdl_preloaded_pt_for_merge_latest.json
index 85693ff515..81c2093c72 100644
--- a/src/components/policy/policy_external/test/json/sdl_preloaded_pt_for_merge_latest.json
+++ b/src/components/policy/policy_external/test/json/sdl_preloaded_pt_for_merge_latest.json
@@ -2424,10 +2424,21 @@
"COMMUNICATION" : 6,
"EMERGENCY" : 60,
"NAVIGATION" : 15,
+ "PROJECTION" : 15,
"NONE" : 0,
"NORMAL" : 4,
"VOICECOM" : 20
},
+ "subtle_notifications_per_minute_by_priority":
+ {
+ "COMMUNICATION": 15,
+ "EMERGENCY": 60,
+ "NAVIGATION": 20,
+ "PROJECTION": 20,
+ "NONE": 0,
+ "NORMAL": 10,
+ "VOICECOM": 30
+ },
"preloaded_date" : "2012-12-16",
"preloaded_pt" : true,
"seconds_between_retries" : [ 1, 5, 25, 125, 625 ],
diff --git a/src/components/policy/policy_external/test/sql_pt_ext_representation_test.cc b/src/components/policy/policy_external/test/sql_pt_ext_representation_test.cc
index ce51682f3c..97613550f2 100644
--- a/src/components/policy/policy_external/test/sql_pt_ext_representation_test.cc
+++ b/src/components/policy/policy_external/test/sql_pt_ext_representation_test.cc
@@ -306,6 +306,20 @@ TEST_F(SQLPTExtRepresentationTest,
Json::Value(5);
module_config["notifications_per_minute_by_priority"]["none"] =
Json::Value(6);
+ module_config["subtle_notifications_per_minute_by_priority"] =
+ Json::Value(Json::objectValue);
+ module_config["subtle_notifications_per_minute_by_priority"]["emergency"] =
+ Json::Value(7);
+ module_config["subtle_notifications_per_minute_by_priority"]["navigation"] =
+ Json::Value(8);
+ module_config["subtle_notifications_per_minute_by_priority"]["VOICECOMM"] =
+ Json::Value(9);
+ module_config["subtle_notifications_per_minute_by_priority"]
+ ["communication"] = Json::Value(10);
+ module_config["subtle_notifications_per_minute_by_priority"]["normal"] =
+ Json::Value(11);
+ module_config["subtle_notifications_per_minute_by_priority"]["none"] =
+ Json::Value(12);
module_config["vehicle_make"] = Json::Value("MakeT");
module_config["vehicle_model"] = Json::Value("ModelT");
module_config["vehicle_year"] = Json::Value("2014");
diff --git a/src/components/policy/policy_external/test/sql_pt_representation_test.cc b/src/components/policy/policy_external/test/sql_pt_representation_test.cc
index 2cb5ec1aaf..ae3000fe7c 100644
--- a/src/components/policy/policy_external/test/sql_pt_representation_test.cc
+++ b/src/components/policy/policy_external/test/sql_pt_representation_test.cc
@@ -245,6 +245,20 @@ class SQLPTRepresentationTest : public SQLPTRepresentation,
Json::Value(5);
module_config["notifications_per_minute_by_priority"]["none"] =
Json::Value(6);
+ module_config["subtle_notifications_per_minute_by_priority"] =
+ Json::Value(Json::objectValue);
+ module_config["subtle_notifications_per_minute_by_priority"]["emergency"] =
+ Json::Value(7);
+ module_config["subtle_notifications_per_minute_by_priority"]["navigation"] =
+ Json::Value(8);
+ module_config["subtle_notifications_per_minute_by_priority"]["VOICECOMM"] =
+ Json::Value(9);
+ module_config["subtle_notifications_per_minute_by_priority"]
+ ["communication"] = Json::Value(10);
+ module_config["subtle_notifications_per_minute_by_priority"]["normal"] =
+ Json::Value(11);
+ module_config["subtle_notifications_per_minute_by_priority"]["none"] =
+ Json::Value(12);
module_config["vehicle_make"] = Json::Value("MakeT");
module_config["vehicle_model"] = Json::Value("ModelT");
module_config["vehicle_year"] = Json::Value("2014");
@@ -485,8 +499,8 @@ TEST_F(SQLPTRepresentationTest,
query.Prepare(query_select);
query.Next();
- // 41 - is current total tables number created by schema
- const int policy_tables_number = 41;
+ // 42 - is current total tables number created by schema
+ const int policy_tables_number = 42;
ASSERT_EQ(policy_tables_number, query.GetInteger(0));
const std::string query_select_count_of_iap_buffer_full =
@@ -1712,6 +1726,7 @@ TEST_F(SQLPTRepresentationTest,
EXPECT_EQ(0u, config.seconds_between_retries.size());
EXPECT_EQ(0u, config.endpoints.size());
EXPECT_EQ(0u, config.notifications_per_minute_by_priority.size());
+ EXPECT_EQ(0u, config.subtle_notifications_per_minute_by_priority.size());
policy_table::ConsumerFriendlyMessages messages;
GatherConsumerFriendlyMessages(&messages);
@@ -1818,6 +1833,15 @@ TEST_F(SQLPTRepresentationTest,
ASSERT_EQ(4, config.notifications_per_minute_by_priority["communication"]);
ASSERT_EQ(5, config.notifications_per_minute_by_priority["normal"]);
ASSERT_EQ(6, config.notifications_per_minute_by_priority["none"]);
+ ASSERT_EQ(6u, config.subtle_notifications_per_minute_by_priority.size());
+ ASSERT_EQ(7, config.subtle_notifications_per_minute_by_priority["emergency"]);
+ ASSERT_EQ(8,
+ config.subtle_notifications_per_minute_by_priority["navigation"]);
+ ASSERT_EQ(9, config.subtle_notifications_per_minute_by_priority["VOICECOMM"]);
+ ASSERT_EQ(
+ 10, config.subtle_notifications_per_minute_by_priority["communication"]);
+ ASSERT_EQ(11, config.subtle_notifications_per_minute_by_priority["normal"]);
+ ASSERT_EQ(12, config.subtle_notifications_per_minute_by_priority["none"]);
EXPECT_EQ(1u, config.endpoints.size());
policy_table::ServiceEndpoints& service_endpoints = config.endpoints;
EXPECT_EQ("0x00", service_endpoints.begin()->first);
diff --git a/src/components/policy/policy_regular/include/policy/cache_manager.h b/src/components/policy/policy_regular/include/policy/cache_manager.h
index 053d4dc807..25b4a8bc18 100644
--- a/src/components/policy/policy_regular/include/policy/cache_manager.h
+++ b/src/components/policy/policy_regular/include/policy/cache_manager.h
@@ -292,13 +292,8 @@ class CacheManager : public CacheManagerInterface {
*/
virtual std::string GetIconUrl(const std::string& policy_app_id) const;
- /**
- * @brief Get allowed number of notifications
- * depending on application priority.
- * @param priority Priority of application
- */
virtual rpc::policy_table_interface_base::NumberOfNotificationsType
- GetNotificationsNumber(const std::string& priority);
+ GetNotificationsNumber(const std::string& priority, const bool is_subtle);
/**
* @brief Get priority for given application
diff --git a/src/components/policy/policy_regular/include/policy/cache_manager_interface.h b/src/components/policy/policy_regular/include/policy/cache_manager_interface.h
index f161724671..14130c0316 100644
--- a/src/components/policy/policy_regular/include/policy/cache_manager_interface.h
+++ b/src/components/policy/policy_regular/include/policy/cache_manager_interface.h
@@ -325,9 +325,10 @@ class CacheManagerInterface {
* @brief Get allowed number of notifications
* depending on application priority.
* @param priority Priority of application
+ * @param is_subtle If true, get the number of allowed subtle notifications
*/
virtual policy_table::NumberOfNotificationsType GetNotificationsNumber(
- const std::string& priority) = 0;
+ const std::string& priority, const bool is_subtle) = 0;
/**
* @brief Get priority for given application
diff --git a/src/components/policy/policy_regular/include/policy/policy_manager_impl.h b/src/components/policy/policy_regular/include/policy/policy_manager_impl.h
index 1b87e58310..307697dd64 100644
--- a/src/components/policy/policy_regular/include/policy/policy_manager_impl.h
+++ b/src/components/policy/policy_regular/include/policy/policy_manager_impl.h
@@ -458,9 +458,11 @@ class PolicyManagerImpl : public PolicyManager {
/**
* @brief Get number of notification by priority
* @param priority Specified priority
+ * @param is_subtle If true, get the number of allowed subtle notifications
* @return notification number
*/
- uint32_t GetNotificationsNumber(const std::string& priority) const OVERRIDE;
+ uint32_t GetNotificationsNumber(const std::string& priority,
+ const bool is_subtle) const OVERRIDE;
/**
* @brief Allows to update Vehicle Identification Number in policy table.
diff --git a/src/components/policy/policy_regular/include/policy/policy_table/types.h b/src/components/policy/policy_regular/include/policy/policy_table/types.h
index 1c6442501f..8ef42c822e 100644
--- a/src/components/policy/policy_regular/include/policy/policy_table/types.h
+++ b/src/components/policy/policy_regular/include/policy/policy_table/types.h
@@ -323,6 +323,7 @@ struct ModuleConfig : CompositeType {
ServiceEndpoints endpoints;
Optional<ServiceEndpointProperties> endpoint_properties;
NumberOfNotificationsPerMinute notifications_per_minute_by_priority;
+ NumberOfNotificationsPerMinute subtle_notifications_per_minute_by_priority;
Optional<String<1, 100> > vehicle_make;
Optional<String<1, 100> > vehicle_model;
Optional<String<4, 4> > vehicle_year;
@@ -342,7 +343,9 @@ struct ModuleConfig : CompositeType {
const ServiceEndpoints& endpoints,
const ServiceEndpointProperties& endpoint_properties,
const NumberOfNotificationsPerMinute&
- notifications_per_minute_by_priority);
+ notifications_per_minute_by_priority,
+ const NumberOfNotificationsPerMinute&
+ subtle_notifications_per_minute_by_priority);
~ModuleConfig();
explicit ModuleConfig(const Json::Value* value__);
void SafeCopyFrom(const ModuleConfig& from);
diff --git a/src/components/policy/policy_regular/include/policy/sql_pt_queries.h b/src/components/policy/policy_regular/include/policy/sql_pt_queries.h
index 0b0ae11f3f..5bf85a4bb5 100644
--- a/src/components/policy/policy_regular/include/policy/sql_pt_queries.h
+++ b/src/components/policy/policy_regular/include/policy/sql_pt_queries.h
@@ -52,6 +52,7 @@ extern const std::string kSelectEndpoint;
extern const std::string kSelectModuleConfig;
extern const std::string kSelectEndpoints;
extern const std::string kSelectNotificationsPerMin;
+extern const std::string kSelectSubtleNotificationsPerMin;
extern const std::string kSelectNotificationsPerPriority;
extern const std::string kSelectAppLevels;
extern const std::string kSelectDeviceData;
@@ -93,6 +94,7 @@ extern const std::string kUpdateModuleConfig;
extern const std::string kInsertEndpoint;
extern const std::string kInsertSecondsBetweenRetry;
extern const std::string kInsertNotificationsByPriority;
+extern const std::string kInsertSubtleNotificationsByPriority;
extern const std::string kInsertDeviceData;
extern const std::string kInsertAppLevel;
extern const std::string kDeleteSecondsBetweenRetries;
diff --git a/src/components/policy/policy_regular/include/policy/sql_pt_representation.h b/src/components/policy/policy_regular/include/policy/sql_pt_representation.h
index eeeaeed2cd..512bfd6326 100644
--- a/src/components/policy/policy_regular/include/policy/sql_pt_representation.h
+++ b/src/components/policy/policy_regular/include/policy/sql_pt_representation.h
@@ -249,6 +249,8 @@ class SQLPTRepresentation : public virtual PTRepresentation {
const policy_table::SecondsBetweenRetries& seconds);
bool SaveNumberOfNotificationsPerMinute(
const policy_table::NumberOfNotificationsPerMinute& notifications);
+ bool SaveNumberOfSubtleNotificationsPerMinute(
+ const policy_table::NumberOfNotificationsPerMinute& notifications);
bool SaveMessageType(const std::string& type);
bool SaveLanguage(const std::string& code);
policy_table::VehicleDataItem PopulateVDIFromQuery(
diff --git a/src/components/policy/policy_regular/src/cache_manager.cc b/src/components/policy/policy_regular/src/cache_manager.cc
index 75f0e72113..97e0aa3b4d 100644
--- a/src/components/policy/policy_regular/src/cache_manager.cc
+++ b/src/components/policy/policy_regular/src/cache_manager.cc
@@ -1100,17 +1100,20 @@ std::string CacheManager::GetIconUrl(const std::string& policy_app_id) const {
}
rpc::policy_table_interface_base::NumberOfNotificationsType
-CacheManager::GetNotificationsNumber(const std::string& priority) {
+CacheManager::GetNotificationsNumber(const std::string& priority,
+ const bool is_subtle) {
CACHE_MANAGER_CHECK(0);
- typedef rpc::policy_table_interface_base::NumberOfNotificationsPerMinute NNPM;
sync_primitives::AutoLock auto_lock(cache_lock_);
- const NNPM& nnpm =
- pt_->policy_table.module_config.notifications_per_minute_by_priority;
+ const auto& nnpm = is_subtle
+ ? pt_->policy_table.module_config
+ .subtle_notifications_per_minute_by_priority
+ : pt_->policy_table.module_config
+ .notifications_per_minute_by_priority;
- NNPM::const_iterator priority_iter = nnpm.find(priority);
+ auto priority_iter = nnpm.find(priority);
- const rpc::policy_table_interface_base::NumberOfNotificationsType result =
+ const uint32_t result =
(nnpm.end() != priority_iter ? (*priority_iter).second : 0u);
return result;
}
diff --git a/src/components/policy/policy_regular/src/policy_manager_impl.cc b/src/components/policy/policy_regular/src/policy_manager_impl.cc
index b40d71dd73..8f3f32e9cb 100644
--- a/src/components/policy/policy_regular/src/policy_manager_impl.cc
+++ b/src/components/policy/policy_regular/src/policy_manager_impl.cc
@@ -291,6 +291,12 @@ void FilterPolicyTable(
FilterInvalidPriorityValues(
module_config.notifications_per_minute_by_priority);
}
+ if (module_config.is_initialized() &&
+ module_config.subtle_notifications_per_minute_by_priority
+ .is_initialized()) {
+ FilterInvalidPriorityValues(
+ module_config.subtle_notifications_per_minute_by_priority);
+ }
if (pt.app_policies_section.is_initialized()) {
policy_table::ApplicationPolicies& apps = pt.app_policies_section.apps;
@@ -1231,10 +1237,10 @@ std::string PolicyManagerImpl::GetCCPUVersionFromPT() const {
return cache_->GetCCPUVersionFromPT();
}
-uint32_t PolicyManagerImpl::GetNotificationsNumber(
- const std::string& priority) const {
+uint32_t PolicyManagerImpl::GetNotificationsNumber(const std::string& priority,
+ const bool is_subtle) const {
LOG4CXX_AUTO_TRACE(logger_);
- return cache_->GetNotificationsNumber(priority);
+ return cache_->GetNotificationsNumber(priority, is_subtle);
}
bool PolicyManagerImpl::ExceededIgnitionCycles() {
diff --git a/src/components/policy/policy_regular/src/policy_table/types.cc b/src/components/policy/policy_regular/src/policy_table/types.cc
index 1c7d06dedf..df59afe3d8 100644
--- a/src/components/policy/policy_regular/src/policy_table/types.cc
+++ b/src/components/policy/policy_regular/src/policy_table/types.cc
@@ -720,7 +720,9 @@ ModuleConfig::ModuleConfig(
const SecondsBetweenRetries& seconds_between_retries,
const ServiceEndpoints& endpoints,
const ServiceEndpointProperties& endpoint_properties,
- const NumberOfNotificationsPerMinute& notifications_per_minute_by_priority)
+ const NumberOfNotificationsPerMinute& notifications_per_minute_by_priority,
+ const NumberOfNotificationsPerMinute&
+ subtle_notifications_per_minute_by_priority)
: CompositeType(kUninitialized)
, exchange_after_x_ignition_cycles(exchange_after_x_ignition_cycles)
, exchange_after_x_kilometers(exchange_after_x_kilometers)
@@ -729,8 +731,9 @@ ModuleConfig::ModuleConfig(
, seconds_between_retries(seconds_between_retries)
, endpoints(endpoints)
, endpoint_properties(endpoint_properties)
- , notifications_per_minute_by_priority(
- notifications_per_minute_by_priority) {}
+ , notifications_per_minute_by_priority(notifications_per_minute_by_priority)
+ , subtle_notifications_per_minute_by_priority(
+ subtle_notifications_per_minute_by_priority) {}
ModuleConfig::~ModuleConfig() {}
@@ -752,6 +755,8 @@ ModuleConfig::ModuleConfig(const Json::Value* value__)
, endpoint_properties(impl::ValueMember(value__, "endpoint_properties"))
, notifications_per_minute_by_priority(
impl::ValueMember(value__, "notifications_per_minute_by_priority"))
+ , subtle_notifications_per_minute_by_priority(impl::ValueMember(
+ value__, "subtle_notifications_per_minute_by_priority"))
, vehicle_make(impl::ValueMember(value__, "vehicle_make"))
, vehicle_model(impl::ValueMember(value__, "vehicle_model"))
, vehicle_year(impl::ValueMember(value__, "vehicle_year"))
@@ -772,6 +777,8 @@ void ModuleConfig::SafeCopyFrom(const ModuleConfig& from) {
endpoint_properties = from.endpoint_properties;
notifications_per_minute_by_priority =
from.notifications_per_minute_by_priority;
+ subtle_notifications_per_minute_by_priority =
+ from.subtle_notifications_per_minute_by_priority;
lock_screen_dismissal_enabled = from.lock_screen_dismissal_enabled;
@@ -802,6 +809,9 @@ Json::Value ModuleConfig::ToJsonValue() const {
impl::WriteJsonField("notifications_per_minute_by_priority",
notifications_per_minute_by_priority,
&result__);
+ impl::WriteJsonField("subtle_notifications_per_minute_by_priority",
+ subtle_notifications_per_minute_by_priority,
+ &result__);
impl::WriteJsonField("vehicle_make", vehicle_make, &result__);
impl::WriteJsonField("vehicle_model", vehicle_model, &result__);
impl::WriteJsonField("vehicle_year", vehicle_year, &result__);
@@ -844,6 +854,9 @@ bool ModuleConfig::is_valid() const {
if (!notifications_per_minute_by_priority.is_valid()) {
return false;
}
+ if (!subtle_notifications_per_minute_by_priority.is_valid()) {
+ return false;
+ }
if (!lock_screen_dismissal_enabled.is_valid()) {
return false;
}
@@ -906,6 +919,9 @@ bool ModuleConfig::struct_empty() const {
if (notifications_per_minute_by_priority.is_initialized()) {
return false;
}
+ if (subtle_notifications_per_minute_by_priority.is_initialized()) {
+ return false;
+ }
if (lock_screen_dismissal_enabled.is_initialized()) {
return false;
}
@@ -968,6 +984,11 @@ void ModuleConfig::ReportErrors(rpc::ValidationReport* report__) const {
notifications_per_minute_by_priority.ReportErrors(
&report__->ReportSubobject("notifications_per_minute_by_priority"));
}
+ if (!subtle_notifications_per_minute_by_priority.is_valid()) {
+ subtle_notifications_per_minute_by_priority.ReportErrors(
+ &report__->ReportSubobject(
+ "subtle_notifications_per_minute_by_priority"));
+ }
if (!lock_screen_dismissal_enabled.is_valid()) {
lock_screen_dismissal_enabled.ReportErrors(
&report__->ReportSubobject("lock_screen_dismissal_enabled"));
@@ -1012,6 +1033,7 @@ void ModuleConfig::SetPolicyTableType(PolicyTableType pt_type) {
endpoints.SetPolicyTableType(pt_type);
endpoint_properties.SetPolicyTableType(pt_type);
notifications_per_minute_by_priority.SetPolicyTableType(pt_type);
+ subtle_notifications_per_minute_by_priority.SetPolicyTableType(pt_type);
lock_screen_dismissal_enabled.SetPolicyTableType(pt_type);
vehicle_make.SetPolicyTableType(pt_type);
vehicle_model.SetPolicyTableType(pt_type);
diff --git a/src/components/policy/policy_regular/src/sql_pt_queries.cc b/src/components/policy/policy_regular/src/sql_pt_queries.cc
index 7aa853fd74..4910ee32e9 100644
--- a/src/components/policy/policy_regular/src/sql_pt_queries.cc
+++ b/src/components/policy/policy_regular/src/sql_pt_queries.cc
@@ -103,6 +103,20 @@ const std::string kCreateSchema =
"CREATE TABLE IF NOT EXISTS `language`( "
" `code` VARCHAR(25) PRIMARY KEY NOT NULL "
"); "
+ "CREATE TABLE IF NOT EXISTS `subtle_notifications_by_priority`( "
+ " `priority_value` VARCHAR(45) PRIMARY KEY NOT NULL, "
+ " `value` INTEGER NOT NULL, "
+ " CONSTRAINT `fk_subtle_notifications_by_priority_priority1` "
+ " FOREIGN KEY(`priority_value`) "
+ " REFERENCES `priority`(`value`) "
+ "); "
+ "CREATE INDEX IF NOT EXISTS "
+ "`subtle_notifications_by_priority.fk_subtle_notifications_by_priority_"
+ "priority1_idx` "
+ " ON `subtle_notifications_by_priority`(`priority_value`); "
+ "CREATE TABLE IF NOT EXISTS `language`( "
+ " `code` VARCHAR(25) PRIMARY KEY NOT NULL "
+ "); "
"CREATE TABLE IF NOT EXISTS `message_type`( "
" `name` VARCHAR(45) PRIMARY KEY NOT NULL "
"); "
@@ -586,6 +600,10 @@ const std::string kDropSchema =
"DROP INDEX IF EXISTS "
"`notifications_by_priority.fk_notifications_by_priority_priority1_idx`; "
"DROP TABLE IF EXISTS `notifications_by_priority`; "
+ "DROP INDEX IF EXISTS "
+ "`subtle_notifications_by_priority.fk_subtle_notifications_by_priority_"
+ "priority1_idx`; "
+ "DROP TABLE IF EXISTS `subtle_notifications_by_priority`; "
"DROP TABLE IF EXISTS `hmi_level`; "
"DROP TABLE IF EXISTS `hybrid_app_preference`; "
"DROP TABLE IF EXISTS `priority`; "
@@ -624,6 +642,7 @@ const std::string kDeleteData =
"DELETE FROM `message_type`; "
"DELETE FROM `language`; "
"DELETE FROM `notifications_by_priority`; "
+ "DELETE FROM `subtle_notifications_by_priority`; "
"DELETE FROM `hmi_level`; "
"DELETE FROM `priority`; "
"DELETE FROM `functional_group`; "
@@ -830,6 +849,11 @@ const std::string kInsertNotificationsByPriority =
"`value`) "
" VALUES (?, ?)";
+const std::string kInsertSubtleNotificationsByPriority =
+ "INSERT OR REPLACE INTO `subtle_notifications_by_priority` "
+ "(`priority_value`, `value`) "
+ " VALUES (?, ?)";
+
const std::string kInsertDeviceData =
"INSERT OR IGNORE INTO `device` (`id`) VALUES (?)";
@@ -865,6 +889,9 @@ const std::string kSelectEndpoints =
const std::string kSelectNotificationsPerMin =
"SELECT `priority_value`, `value` FROM notifications_by_priority";
+const std::string kSelectSubtleNotificationsPerMin =
+ "SELECT `priority_value`, `value` FROM subtle_notifications_by_priority";
+
const std::string kSelectNotificationsPerPriority =
"SELECT `value` FROM notifications_by_priority WHERE `priority_value` = ? ";
diff --git a/src/components/policy/policy_regular/src/sql_pt_representation.cc b/src/components/policy/policy_regular/src/sql_pt_representation.cc
index bd4dc6e2c2..8ad278ec72 100644
--- a/src/components/policy/policy_regular/src/sql_pt_representation.cc
+++ b/src/components/policy/policy_regular/src/sql_pt_representation.cc
@@ -551,6 +551,17 @@ void SQLPTRepresentation::GatherModuleConfig(
notifications.GetInteger(1);
}
}
+ utils::dbms::SQLQuery subtle_notifications(db());
+ if (!subtle_notifications.Prepare(sql_pt::kSelectSubtleNotificationsPerMin)) {
+ LOG4CXX_WARN(logger_,
+ "Incorrect select statement for subtle notifications");
+ } else {
+ while (subtle_notifications.Next()) {
+ config->subtle_notifications_per_minute_by_priority[subtle_notifications
+ .GetString(0)] =
+ subtle_notifications.GetInteger(1);
+ }
+ }
utils::dbms::SQLQuery seconds(db());
if (!seconds.Prepare(sql_pt::kSelectSecondsBetweenRetries)) {
LOG4CXX_INFO(logger_,
@@ -1480,6 +1491,11 @@ bool SQLPTRepresentation::SaveModuleConfig(
return false;
}
+ if (!SaveNumberOfSubtleNotificationsPerMinute(
+ config.subtle_notifications_per_minute_by_priority)) {
+ return false;
+ }
+
if (!SaveServiceEndpoints(config.endpoints)) {
return false;
}
@@ -1723,6 +1739,28 @@ bool SQLPTRepresentation::SaveNumberOfNotificationsPerMinute(
return true;
}
+bool SQLPTRepresentation::SaveNumberOfSubtleNotificationsPerMinute(
+ const policy_table::NumberOfNotificationsPerMinute& notifications) {
+ utils::dbms::SQLQuery query(db());
+ if (!query.Prepare(sql_pt::kInsertSubtleNotificationsByPriority)) {
+ LOG4CXX_WARN(logger_,
+ "Incorrect insert statement for notifications by priority.");
+ return false;
+ }
+
+ policy_table::NumberOfNotificationsPerMinute::const_iterator it;
+ for (it = notifications.begin(); it != notifications.end(); ++it) {
+ query.Bind(0, it->first);
+ query.Bind(1, it->second);
+ if (!query.Exec() || !query.Reset()) {
+ LOG4CXX_WARN(logger_, "Incorrect insert into notifications by priority.");
+ return false;
+ }
+ }
+
+ return true;
+}
+
bool SQLPTRepresentation::SaveDeviceData(
const policy_table::DeviceData& devices) {
utils::dbms::SQLQuery query(db());
diff --git a/src/components/policy/policy_regular/test/cache_manager_test.cc b/src/components/policy/policy_regular/test/cache_manager_test.cc
index 206ee53604..5666de03b0 100644
--- a/src/components/policy/policy_regular/test/cache_manager_test.cc
+++ b/src/components/policy/policy_regular/test/cache_manager_test.cc
@@ -122,23 +122,28 @@ TEST_F(CacheManagerTest,
*pt_ = CreateCustomPT(string_table);
std::string priority = "EMERGENCY";
- uint32_t notif_number = cache_manager_->GetNotificationsNumber(priority);
+ uint32_t notif_number =
+ cache_manager_->GetNotificationsNumber(priority, false);
EXPECT_EQ(1u, notif_number);
priority = "NAVIGATION";
- notif_number = cache_manager_->GetNotificationsNumber(priority);
+ notif_number = cache_manager_->GetNotificationsNumber(priority, false);
EXPECT_EQ(2u, notif_number);
priority = "VOICECOM";
- notif_number = cache_manager_->GetNotificationsNumber(priority);
+ notif_number = cache_manager_->GetNotificationsNumber(priority, false);
EXPECT_EQ(3u, notif_number);
+ priority = "COMMUNICATION";
+ notif_number = cache_manager_->GetNotificationsNumber(priority, false);
+ EXPECT_EQ(4u, notif_number);
+
priority = "NORMAL";
- notif_number = cache_manager_->GetNotificationsNumber(priority);
+ notif_number = cache_manager_->GetNotificationsNumber(priority, false);
EXPECT_EQ(5u, notif_number);
priority = "NONE";
- notif_number = cache_manager_->GetNotificationsNumber(priority);
+ notif_number = cache_manager_->GetNotificationsNumber(priority, false);
EXPECT_EQ(6u, notif_number);
}
@@ -162,7 +167,78 @@ TEST_F(CacheManagerTest, GetNotificationsNumber_PriorityNotExist_ReturnZero) {
*pt_ = CreateCustomPT(string_table);
std::string priority = "OTHER_PRIORITY";
- uint32_t notif_number = cache_manager_->GetNotificationsNumber(priority);
+ uint32_t notif_number =
+ cache_manager_->GetNotificationsNumber(priority, false);
+ EXPECT_EQ(0u, notif_number);
+}
+
+TEST_F(CacheManagerTest,
+ GetNotificationsNumber_Subtle_PriorityExists_ReturnNumberFromPT) {
+ std::string string_table(
+ "{"
+ "\"policy_table\": {"
+ "\"module_config\": {"
+ "\"subtle_notifications_per_minute_by_priority\": {"
+ "\"EMERGENCY\": 7,"
+ "\"NAVIGATION\": 8,"
+ "\"VOICECOM\": 9,"
+ "\"COMMUNICATION\": 10,"
+ "\"NORMAL\": 11,"
+ "\"NONE\": 12"
+ "}"
+ "}"
+ "}"
+ "}");
+ *pt_ = CreateCustomPT(string_table);
+
+ std::string priority = "EMERGENCY";
+ uint32_t notif_number =
+ cache_manager_->GetNotificationsNumber(priority, true);
+ EXPECT_EQ(7u, notif_number);
+
+ priority = "NAVIGATION";
+ notif_number = cache_manager_->GetNotificationsNumber(priority, true);
+ EXPECT_EQ(8u, notif_number);
+
+ priority = "VOICECOM";
+ notif_number = cache_manager_->GetNotificationsNumber(priority, true);
+ EXPECT_EQ(9u, notif_number);
+
+ priority = "COMMUNICATION";
+ notif_number = cache_manager_->GetNotificationsNumber(priority, true);
+ EXPECT_EQ(10u, notif_number);
+
+ priority = "NORMAL";
+ notif_number = cache_manager_->GetNotificationsNumber(priority, true);
+ EXPECT_EQ(11u, notif_number);
+
+ priority = "NONE";
+ notif_number = cache_manager_->GetNotificationsNumber(priority, true);
+ EXPECT_EQ(12u, notif_number);
+}
+
+TEST_F(CacheManagerTest,
+ GetNotificationsNumber_Subtle_PriorityNotExist_ReturnZero) {
+ const std::string string_table(
+ "{"
+ "\"policy_table\": {"
+ "\"module_config\": {"
+ "\"subtle_notifications_per_minute_by_priority\": {"
+ "\"EMERGENCY\": 7,"
+ "\"NAVIGATION\": 8,"
+ "\"VOICECOM\": 9,"
+ "\"COMMUNICATION\": 10,"
+ "\"NORMAL\": 11,"
+ "\"NONE\": 12"
+ "}"
+ "}"
+ "}"
+ "}");
+ *pt_ = CreateCustomPT(string_table);
+
+ const std::string priority = "OTHER_PRIORITY";
+ uint32_t notif_number =
+ cache_manager_->GetNotificationsNumber(priority, true);
EXPECT_EQ(0u, notif_number);
}
diff --git a/src/components/policy/policy_regular/test/include/policy/mock_pt_representation.h b/src/components/policy/policy_regular/test/include/policy/mock_pt_representation.h
index 8cf3884c11..80aab3fde5 100644
--- a/src/components/policy/policy_regular/test/include/policy/mock_pt_representation.h
+++ b/src/components/policy/policy_regular/test/include/policy/mock_pt_representation.h
@@ -70,7 +70,8 @@ class MockPTRepresentation : virtual public PTRepresentation {
std::vector<UserFriendlyMessage>(const std::vector<std::string>& msg_code,
const std::string& language));
MOCK_METHOD2(GetUpdateUrls, void(int service_type, EndpointUrls&));
- MOCK_METHOD1(GetNotificationsNumber, int(const std::string& priority));
+ MOCK_METHOD2(GetNotificationsNumber,
+ int(const std::string& priority, const bool is_subtle));
MOCK_METHOD0(Init, InitResult());
MOCK_METHOD0(Close, bool());
MOCK_METHOD0(Clear, bool());
diff --git a/src/components/policy/policy_regular/test/json/sdl_preloaded_pt_for_merge_initial.json b/src/components/policy/policy_regular/test/json/sdl_preloaded_pt_for_merge_initial.json
index 3855ccd481..d17a4b82e4 100644
--- a/src/components/policy/policy_regular/test/json/sdl_preloaded_pt_for_merge_initial.json
+++ b/src/components/policy/policy_regular/test/json/sdl_preloaded_pt_for_merge_initial.json
@@ -2424,10 +2424,21 @@
"COMMUNICATION" : 6,
"EMERGENCY" : 60,
"NAVIGATION" : 15,
+ "PROJECTION" : 15,
"NONE" : 0,
"NORMAL" : 4,
"VOICECOM" : 20
},
+ "subtle_notifications_per_minute_by_priority":
+ {
+ "COMMUNICATION": 15,
+ "EMERGENCY": 60,
+ "NAVIGATION": 20,
+ "PROJECTION": 20,
+ "NONE": 0,
+ "NORMAL": 10,
+ "VOICECOM": 30
+ },
"preloaded_date" : "2012-12-15",
"preloaded_pt" : true,
"seconds_between_retries" : [ 1, 5, 25, 125, 625 ],
diff --git a/src/components/policy/policy_regular/test/json/sdl_preloaded_pt_for_merge_latest.json b/src/components/policy/policy_regular/test/json/sdl_preloaded_pt_for_merge_latest.json
index 85693ff515..81c2093c72 100644
--- a/src/components/policy/policy_regular/test/json/sdl_preloaded_pt_for_merge_latest.json
+++ b/src/components/policy/policy_regular/test/json/sdl_preloaded_pt_for_merge_latest.json
@@ -2424,10 +2424,21 @@
"COMMUNICATION" : 6,
"EMERGENCY" : 60,
"NAVIGATION" : 15,
+ "PROJECTION" : 15,
"NONE" : 0,
"NORMAL" : 4,
"VOICECOM" : 20
},
+ "subtle_notifications_per_minute_by_priority":
+ {
+ "COMMUNICATION": 15,
+ "EMERGENCY": 60,
+ "NAVIGATION": 20,
+ "PROJECTION": 20,
+ "NONE": 0,
+ "NORMAL": 10,
+ "VOICECOM": 30
+ },
"preloaded_date" : "2012-12-16",
"preloaded_pt" : true,
"seconds_between_retries" : [ 1, 5, 25, 125, 625 ],
diff --git a/src/components/policy/policy_regular/test/sql_pt_representation_test.cc b/src/components/policy/policy_regular/test/sql_pt_representation_test.cc
index eadcd0ba4f..8da9158999 100644
--- a/src/components/policy/policy_regular/test/sql_pt_representation_test.cc
+++ b/src/components/policy/policy_regular/test/sql_pt_representation_test.cc
@@ -250,6 +250,20 @@ class SQLPTRepresentationTest : protected SQLPTRepresentation,
Json::Value(5);
module_config["notifications_per_minute_by_priority"]["none"] =
Json::Value(6);
+ module_config["subtle_notifications_per_minute_by_priority"] =
+ Json::Value(Json::objectValue);
+ module_config["subtle_notifications_per_minute_by_priority"]["emergency"] =
+ Json::Value(7);
+ module_config["subtle_notifications_per_minute_by_priority"]["navigation"] =
+ Json::Value(8);
+ module_config["subtle_notifications_per_minute_by_priority"]["VOICECOMM"] =
+ Json::Value(9);
+ module_config["subtle_notifications_per_minute_by_priority"]
+ ["communication"] = Json::Value(10);
+ module_config["subtle_notifications_per_minute_by_priority"]["normal"] =
+ Json::Value(11);
+ module_config["subtle_notifications_per_minute_by_priority"]["none"] =
+ Json::Value(12);
module_config["vehicle_make"] = Json::Value("");
module_config["vehicle_model"] = Json::Value("");
module_config["vehicle_year"] = Json::Value("");
@@ -589,8 +603,8 @@ TEST_F(SQLPTRepresentationTest,
ASSERT_TRUE(reps->RefreshDB());
// Check PT structure destroyed and tables number is 0
- // There are 37 tables in the database, now.
- const int32_t total_tables_number = 37;
+ // There are 38 tables in the database, now.
+ const int32_t total_tables_number = 38;
ASSERT_EQ(total_tables_number, FetchOneInt(query_select));
const std::string query_select_count_of_iap_buffer_full =
@@ -1879,6 +1893,7 @@ TEST_F(SQLPTRepresentationTest, Save_SetPolicyTableThenSave_ExpectSavedToPT) {
EXPECT_EQ(0u, config.seconds_between_retries.size());
EXPECT_EQ(0u, config.endpoints.size());
EXPECT_EQ(0u, config.notifications_per_minute_by_priority.size());
+ EXPECT_EQ(0u, config.subtle_notifications_per_minute_by_priority.size());
policy_table::ConsumerFriendlyMessages messages;
GatherConsumerFriendlyMessages(&messages);
@@ -1986,6 +2001,15 @@ TEST_F(SQLPTRepresentationTest, Save_SetPolicyTableThenSave_ExpectSavedToPT) {
ASSERT_EQ(4, config.notifications_per_minute_by_priority["communication"]);
ASSERT_EQ(5, config.notifications_per_minute_by_priority["normal"]);
ASSERT_EQ(6, config.notifications_per_minute_by_priority["none"]);
+ ASSERT_EQ(6u, config.subtle_notifications_per_minute_by_priority.size());
+ ASSERT_EQ(7, config.subtle_notifications_per_minute_by_priority["emergency"]);
+ ASSERT_EQ(8,
+ config.subtle_notifications_per_minute_by_priority["navigation"]);
+ ASSERT_EQ(9, config.subtle_notifications_per_minute_by_priority["VOICECOMM"]);
+ ASSERT_EQ(
+ 10, config.subtle_notifications_per_minute_by_priority["communication"]);
+ ASSERT_EQ(11, config.subtle_notifications_per_minute_by_priority["normal"]);
+ ASSERT_EQ(12, config.subtle_notifications_per_minute_by_priority["none"]);
EXPECT_EQ(1u, config.endpoints.size());
policy_table::ServiceEndpoints& service_endpoints = config.endpoints;
EXPECT_EQ("0x00", service_endpoints.begin()->first);
diff --git a/tools/rpc_spec b/tools/rpc_spec
-Subproject 082386d01f5277b293badfe9be989d454109b88
+Subproject 45cd76866b1e6dfefe185e60f97ff61dec95c6a