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