diff options
author | JackLivio <jack@livio.io> | 2019-06-20 14:56:35 -0400 |
---|---|---|
committer | JackLivio <jack@livio.io> | 2019-06-20 14:56:35 -0400 |
commit | 87a724577cf93b3632d335e9e67d2524f1937d0e (patch) | |
tree | 48a27a7455bb8502e4478106ed861c6e4b5b91aa | |
parent | 99a756db08cdc0cf4a071c69a332616ba6391cd4 (diff) | |
parent | 65d142c41e3d701a3afe9254ffbdc6d6dd8ad6a4 (diff) | |
download | sdl_core-87a724577cf93b3632d335e9e67d2524f1937d0e.tar.gz |
Merge remote-tracking branch 'origin/develop' into feature/remote_control_radio_and_climate_parameter_update
# Conflicts:
# src/components/interfaces/MOBILE_API.xml
18 files changed, 159 insertions, 7 deletions
diff --git a/src/appMain/smartDeviceLink.ini b/src/appMain/smartDeviceLink.ini index 54c2395c47..40c1bf08a7 100644 --- a/src/appMain/smartDeviceLink.ini +++ b/src/appMain/smartDeviceLink.ini @@ -202,6 +202,9 @@ TCPAdapterPort = 12345 ; If the name is omitted, Core will listen on all network interfaces by binding to INADDR_ANY. TCPAdapterNetworkInterface = +; 128 bit uuid for bluetooth device discovery. Please format as 16 seperate bytes. +;BluetoothUUID = 0x93, 0x6D, 0xA0, 0x1F, 0x9A, 0xBD, 0x4D, 0x9D, 0x80, 0xC7, 0x02, 0xAF, 0x85, 0xC8, 0x22, 0xA8 + [CloudAppConnections] ; Value in milliseconds for time between retry attempts on a failed websocket connection CloudAppRetryTimeout = 1000 diff --git a/src/components/application_manager/include/application_manager/smart_object_keys.h b/src/components/application_manager/include/application_manager/smart_object_keys.h index 65ec4f15c3..fc124f7558 100644 --- a/src/components/application_manager/include/application_manager/smart_object_keys.h +++ b/src/components/application_manager/include/application_manager/smart_object_keys.h @@ -322,6 +322,7 @@ extern const char* service_active; extern const char* app_service_id; extern const char* service_data; extern const char* media_service_data; +extern const char* media_image; extern const char* weather_service_data; extern const char* location; extern const char* current_forecast; diff --git a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/include/app_service_rpc_plugin/commands/hmi/as_get_app_service_data_request_from_hmi.h b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/include/app_service_rpc_plugin/commands/hmi/as_get_app_service_data_request_from_hmi.h index 531d1816e9..d9eb7528e4 100644 --- a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/include/app_service_rpc_plugin/commands/hmi/as_get_app_service_data_request_from_hmi.h +++ b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/include/app_service_rpc_plugin/commands/hmi/as_get_app_service_data_request_from_hmi.h @@ -92,6 +92,8 @@ class ASGetAppServiceDataRequestFromHMI application_manager::ApplicationSharedPtr app); void GetNavigationImagePaths(smart_objects::SmartObject& data, application_manager::ApplicationSharedPtr app); + void GetMediaImagePaths(smart_objects::SmartObject& data, + application_manager::ApplicationSharedPtr app); bool ValidateResponse(smart_objects::SmartObject& message_params); DISALLOW_COPY_AND_ASSIGN(ASGetAppServiceDataRequestFromHMI); diff --git a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/include/app_service_rpc_plugin/commands/hmi/on_as_app_service_data_notification.h b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/include/app_service_rpc_plugin/commands/hmi/on_as_app_service_data_notification.h index cff7c8e5b8..2dcd5ec251 100644 --- a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/include/app_service_rpc_plugin/commands/hmi/on_as_app_service_data_notification.h +++ b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/include/app_service_rpc_plugin/commands/hmi/on_as_app_service_data_notification.h @@ -70,6 +70,8 @@ class OnASAppServiceDataNotification virtual void Run(); private: + void GetMediaImagePaths(smart_objects::SmartObject& data, + application_manager::ApplicationSharedPtr app); void GetWeatherImagePaths(smart_objects::SmartObject& data, application_manager::ApplicationSharedPtr app); void GetNavigationImagePaths(smart_objects::SmartObject& data, diff --git a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/commands/hmi/as_get_app_service_data_request_from_hmi.cc b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/commands/hmi/as_get_app_service_data_request_from_hmi.cc index 2da8834b96..e03c0ad15a 100644 --- a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/commands/hmi/as_get_app_service_data_request_from_hmi.cc +++ b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/commands/hmi/as_get_app_service_data_request_from_hmi.cc @@ -161,6 +161,14 @@ void ASGetAppServiceDataRequestFromHMI::GetNavigationImagePaths( } } +void ASGetAppServiceDataRequestFromHMI::GetMediaImagePaths( + smart_objects::SmartObject& data, ApplicationSharedPtr app) { + if (data.keyExists(strings::media_image)) { + MessageHelper::VerifyImage( + data[strings::media_image], app, application_manager_); + } +} + bool ASGetAppServiceDataRequestFromHMI::ValidateResponse( smart_objects::SmartObject& message_params) { if (!message_params.keyExists(strings::service_data)) { @@ -215,6 +223,11 @@ bool ASGetAppServiceDataRequestFromHMI::ValidateResponse( GetNavigationImagePaths(service_data[strings::navigation_service_data], app); } + + if (service_type_value == mobile_apis::AppServiceType::MEDIA && + service_data.keyExists(strings::media_service_data)) { + GetMediaImagePaths(service_data[strings::media_service_data], app); + } } return true; } diff --git a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/commands/hmi/on_as_app_service_data_notification.cc b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/commands/hmi/on_as_app_service_data_notification.cc index e90de23837..db1716ecb8 100644 --- a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/commands/hmi/on_as_app_service_data_notification.cc +++ b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/commands/hmi/on_as_app_service_data_notification.cc @@ -55,6 +55,14 @@ OnASAppServiceDataNotification::OnASAppServiceDataNotification( OnASAppServiceDataNotification::~OnASAppServiceDataNotification() {} +void OnASAppServiceDataNotification::GetMediaImagePaths( + smart_objects::SmartObject& data, ApplicationSharedPtr app) { + if (data.keyExists(strings::media_image)) { + MessageHelper::VerifyImage( + data[strings::media_image], app, application_manager_); + } +} + void OnASAppServiceDataNotification::GetWeatherImagePaths( smart_objects::SmartObject& data, ApplicationSharedPtr app) { if (data[strings::location].keyExists(strings::location_image)) { @@ -186,6 +194,11 @@ bool OnASAppServiceDataNotification::ValidateParams( GetNavigationImagePaths(service_data[strings::navigation_service_data], app); } + + if (service_type_value == mobile_apis::AppServiceType::MEDIA && + service_data.keyExists(strings::media_service_data)) { + GetMediaImagePaths(service_data[strings::media_service_data], app); + } } return true; } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/get_system_capability_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/get_system_capability_request.cc index 4b34db9934..0655da27c0 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/get_system_capability_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/get_system_capability_request.cc @@ -89,7 +89,7 @@ void GetSystemCapabilityRequest::Run() { bool has_nav_capability = false; if (hmi_capabilities.navigation_capability()) { has_nav_capability = true; - auto nav_capability = *hmi_capabilities.navigation_capability(); + nav_capability = *hmi_capabilities.navigation_capability(); } has_nav_capability = application_manager_.GetAppServiceManager() diff --git a/src/components/application_manager/src/smart_object_keys.cc b/src/components/application_manager/src/smart_object_keys.cc index 48e293a782..872103929f 100644 --- a/src/components/application_manager/src/smart_object_keys.cc +++ b/src/components/application_manager/src/smart_object_keys.cc @@ -289,6 +289,7 @@ const char* service_active = "serviceActive"; const char* app_service_id = "appServiceId"; const char* service_data = "serviceData"; const char* media_service_data = "mediaServiceData"; +const char* media_image = "mediaImage"; const char* weather_service_data = "weatherServiceData"; const char* location = "location"; const char* current_forecast = "currentForecast"; diff --git a/src/components/config_profile/include/config_profile/profile.h b/src/components/config_profile/include/config_profile/profile.h index 1d3766ca97..0a1e8b2c17 100644 --- a/src/components/config_profile/include/config_profile/profile.h +++ b/src/components/config_profile/include/config_profile/profile.h @@ -423,6 +423,8 @@ class Profile : public protocol_handler::ProtocolHandlerSettings, */ uint16_t cloud_app_max_retry_attempts() const OVERRIDE; + const uint8_t* bluetooth_uuid() const OVERRIDE; + // TransportManageMMESettings interface const std::string& event_mq_name() const OVERRIDE; @@ -610,6 +612,10 @@ class Profile : public protocol_handler::ProtocolHandlerSettings, const char* const pKey, bool* out_result) const; + std::vector<uint8_t> ReadUint8Container(const char* const pSection, + const char* const pKey, + bool* out_result) const; + /** * @brief Returns delimiter for SDL-generated TTS chunks * @return TTS delimiter @@ -975,6 +981,7 @@ class Profile : public protocol_handler::ProtocolHandlerSettings, std::string transport_manager_tcp_adapter_network_interface_; uint32_t cloud_app_retry_timeout_; uint16_t cloud_app_max_retry_attempts_; + std::vector<uint8_t> bluetooth_uuid_; std::string tts_delimiter_; uint32_t audio_data_stopped_timeout_; uint32_t video_data_stopped_timeout_; diff --git a/src/components/config_profile/src/profile.cc b/src/components/config_profile/src/profile.cc index a5b2daa130..c38b28db5f 100644 --- a/src/components/config_profile/src/profile.cc +++ b/src/components/config_profile/src/profile.cc @@ -184,6 +184,7 @@ const char* kAppHmiLevelNoneRequestsTimeScaleKey = const char* kPendingRequestsAmoundKey = "PendingRequestsAmount"; const char* kSupportedDiagModesKey = "SupportedDiagModes"; const char* kTransportManagerDisconnectTimeoutKey = "DisconnectTimeout"; +const char* kBluetoothUUIDKey = "BluetoothUUID"; const char* kTTSDelimiterKey = "TTSDelimiter"; const char* kRecordingFileNameKey = "RecordingFileName"; const char* kRecordingFileSourceKey = "RecordingFileSource"; @@ -397,6 +398,22 @@ const bool kDefaultMultipleTransportsEnabled = false; const char* kDefaultLowBandwidthResumptionLevel = "NONE"; const uint32_t kDefaultRpcPassThroughTimeout = 10000; const char* kDefaultHMIOriginId = "HMI_ID"; +const std::vector<uint8_t> kDefaultBluetoothUUID = {0x93, + 0x6D, + 0xA0, + 0x1F, + 0x9A, + 0xBD, + 0x4D, + 0x9D, + 0x80, + 0xC7, + 0x02, + 0xAF, + 0x85, + 0xC8, + 0x22, + 0xA8}; } // namespace namespace profile { @@ -806,6 +823,10 @@ uint16_t Profile::cloud_app_max_retry_attempts() const { return cloud_app_max_retry_attempts_; } +const uint8_t* Profile::bluetooth_uuid() const { + return bluetooth_uuid_.data(); +} + const std::string& Profile::tts_delimiter() const { return tts_delimiter_; } @@ -1821,6 +1842,13 @@ void Profile::UpdateValues() { kCloudAppMaxRetryAttemptsKey, kCloudAppTransportSection); + bool read_result = true; + bluetooth_uuid_ = ReadUint8Container( + kTransportManagerSection, kBluetoothUUIDKey, &read_result); + if (!read_result || bluetooth_uuid_.size() != 16) { + bluetooth_uuid_ = kDefaultBluetoothUUID; + } + // Event MQ ReadStringValue( &event_mq_name_, kDefaultEventMQ, kTransportManagerSection, kEventMQKey); @@ -2449,6 +2477,10 @@ int32_t hex_to_int(const std::string& value) { return static_cast<int32_t>(strtol(value.c_str(), NULL, 16)); } +uint8_t hex_to_uint8(const std::string& value) { + return static_cast<uint8_t>(strtol(value.c_str(), NULL, 16)); +} + std::string trim_string(const std::string& str) { const char* delims = " \t"; @@ -2474,6 +2506,18 @@ std::vector<int> Profile::ReadIntContainer(const char* const pSection, return value_list; } +std::vector<uint8_t> Profile::ReadUint8Container(const char* const pSection, + const char* const pKey, + bool* out_result) const { + const std::vector<std::string> string_list = + ReadStringContainer(pSection, pKey, out_result); + std::vector<uint8_t> value_list; + value_list.resize(string_list.size()); + std::transform( + string_list.begin(), string_list.end(), value_list.begin(), hex_to_uint8); + return value_list; +} + std::vector<std::string> Profile::ReadStringContainer( const char* const pSection, const char* const pKey, diff --git a/src/components/include/test/transport_manager/mock_transport_manager_settings.h b/src/components/include/test/transport_manager/mock_transport_manager_settings.h index 2d9f25a44c..eb12ce1b55 100644 --- a/src/components/include/test/transport_manager/mock_transport_manager_settings.h +++ b/src/components/include/test/transport_manager/mock_transport_manager_settings.h @@ -65,6 +65,7 @@ class MockTransportManagerSettings std::string&()); MOCK_CONST_METHOD0(cloud_app_retry_timeout, uint32_t()); MOCK_CONST_METHOD0(cloud_app_max_retry_attempts, uint16_t()); + MOCK_CONST_METHOD0(bluetooth_uuid, const uint8_t*()); }; } // namespace transport_manager_test diff --git a/src/components/include/transport_manager/transport_manager_settings.h b/src/components/include/transport_manager/transport_manager_settings.h index cbc1516c29..4a183ad22d 100644 --- a/src/components/include/transport_manager/transport_manager_settings.h +++ b/src/components/include/transport_manager/transport_manager_settings.h @@ -79,6 +79,8 @@ class TransportManagerSettings : public TransportManagerMMESettings { * @brief Returns maximum retry attempts for cloud app connections */ virtual uint16_t cloud_app_max_retry_attempts() const = 0; + + virtual const uint8_t* bluetooth_uuid() const = 0; }; } // namespace transport_manager #endif // SRC_COMPONENTS_INCLUDE_TRANSPORT_MANAGER_TRANSPORT_MANAGER_SETTINGS_H_ diff --git a/src/components/interfaces/HMI_API.xml b/src/components/interfaces/HMI_API.xml index bff05fa853..beefad9863 100644 --- a/src/components/interfaces/HMI_API.xml +++ b/src/components/interfaces/HMI_API.xml @@ -3506,6 +3506,14 @@ Audiobook: The total number of sections in the playback queue (e.g. the number of chapters in the book) </description> </param> + + <param name="mediaImage" type="Common.Image" mandatory="false"> + <description> + Music: The album art of the current track + Podcast: The podcast or chapter artwork of the current podcast episode + Audiobook: The book or chapter artwork of the current audiobook + </description> + </param> </struct> <struct name="WeatherServiceManifest"> diff --git a/src/components/interfaces/MOBILE_API.xml b/src/components/interfaces/MOBILE_API.xml index fbbf09db9a..8f08ace721 100644 --- a/src/components/interfaces/MOBILE_API.xml +++ b/src/components/interfaces/MOBILE_API.xml @@ -3852,6 +3852,13 @@ Audiobook: The total number of sections in the playback queue (e.g. the number of chapters in the book) </description> </param> + <param name="mediaImage" type="Image" mandatory="false" since="5.2"> + <description> + Music: The album art of the current track + Podcast: The podcast or chapter artwork of the current podcast episode + Audiobook: The book or chapter artwork of the current audiobook + </description> + </param> </struct> <struct name="WeatherServiceManifest" since="5.1"> diff --git a/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_device_scanner.h b/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_device_scanner.h index 13fef1d017..768d9ebb54 100644 --- a/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_device_scanner.h +++ b/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_device_scanner.h @@ -70,6 +70,11 @@ class BluetoothDeviceScanner : public DeviceScanner { BluetoothDeviceScanner(TransportAdapterController* controller, bool auto_repeat_search, int repeat_search_pause_sec); + + BluetoothDeviceScanner(TransportAdapterController* controller, + bool auto_repeat_search, + int repeat_search_pause_sec, + const uint8_t* smart_device_link_service_uuid_data); /** * @brief Destructor. */ diff --git a/src/components/transport_manager/src/bluetooth/bluetooth_device_scanner.cc b/src/components/transport_manager/src/bluetooth/bluetooth_device_scanner.cc index 7e9b4c1332..4759b2003a 100644 --- a/src/components/transport_manager/src/bluetooth/bluetooth_device_scanner.cc +++ b/src/components/transport_manager/src/bluetooth/bluetooth_device_scanner.cc @@ -133,7 +133,27 @@ BluetoothDeviceScanner::BluetoothDeviceScanner( 0xA8}; sdp_uuid128_create(&smart_device_link_service_uuid_, smart_device_link_service_uuid_data); - thread_ = threads::CreateThread("BT Device Scaner", + thread_ = threads::CreateThread("BT Device Scanner", + new BluetoothDeviceScannerDelegate(this)); +} + +BluetoothDeviceScanner::BluetoothDeviceScanner( + TransportAdapterController* controller, + bool auto_repeat_search, + int auto_repeat_pause_sec, + const uint8_t* smart_device_link_service_uuid_data) + : controller_(controller) + , thread_(NULL) + , shutdown_requested_(false) + , ready_(true) + , device_scan_requested_(false) + , device_scan_requested_lock_() + , device_scan_requested_cv_() + , auto_repeat_search_(auto_repeat_search) + , auto_repeat_pause_sec_(auto_repeat_pause_sec) { + sdp_uuid128_create(&smart_device_link_service_uuid_, + smart_device_link_service_uuid_data); + thread_ = threads::CreateThread("BT Device Scanner", new BluetoothDeviceScannerDelegate(this)); } diff --git a/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc b/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc index 95265cad2e..911658bc56 100644 --- a/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc +++ b/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc @@ -58,11 +58,12 @@ BluetoothTransportAdapter::~BluetoothTransportAdapter() {} BluetoothTransportAdapter::BluetoothTransportAdapter( resumption::LastState& last_state, const TransportManagerSettings& settings) - : TransportAdapterImpl(new BluetoothDeviceScanner(this, true, 0), - new BluetoothConnectionFactory(this), - NULL, - last_state, - settings) {} + : TransportAdapterImpl( + new BluetoothDeviceScanner(this, true, 0, settings.bluetooth_uuid()), + new BluetoothConnectionFactory(this), + NULL, + last_state, + settings) {} DeviceType BluetoothTransportAdapter::GetDeviceType() const { return BLUETOOTH; diff --git a/src/components/transport_manager/test/transport_manager_default_test.cc b/src/components/transport_manager/test/transport_manager_default_test.cc index d8bf51ef88..e102458b96 100644 --- a/src/components/transport_manager/test/transport_manager_default_test.cc +++ b/src/components/transport_manager/test/transport_manager_default_test.cc @@ -57,6 +57,22 @@ const std::string kTransportManager = "TransportManager"; const std::string kTcpAdapter = "TcpAdapter"; const std::string kBluetoothAdapter = "BluetoothAdapter"; const std::string kDevices = "devices"; +std::vector<uint8_t> kBTUUID = {0x93, + 0x6D, + 0xA0, + 0x1F, + 0x9A, + 0xBD, + 0x4D, + 0x9D, + 0x80, + 0xC7, + 0x02, + 0xAF, + 0x85, + 0xC8, + 0x22, + 0xA8}; } // namespace TEST(TestTransportManagerDefault, Init_LastStateNotUsed) { @@ -78,6 +94,8 @@ TEST(TestTransportManagerDefault, Init_LastStateNotUsed) { EXPECT_CALL(transport_manager_settings, transport_manager_tcp_adapter_network_interface()) .WillRepeatedly(ReturnRef(network_interface)); + EXPECT_CALL(transport_manager_settings, bluetooth_uuid()) + .WillRepeatedly(Return(kBTUUID.data())); transport_manager.Init(mock_last_state); transport_manager.Stop(); @@ -114,6 +132,8 @@ TEST(TestTransportManagerDefault, Init_LastStateUsed) { EXPECT_CALL(transport_manager_settings, transport_manager_tcp_adapter_network_interface()) .WillRepeatedly(ReturnRef(network_interface)); + EXPECT_CALL(transport_manager_settings, bluetooth_uuid()) + .WillRepeatedly(Return(kBTUUID.data())); transport_manager.Init(mock_last_state); transport_manager.Stop(); } @@ -149,6 +169,8 @@ TEST(TestTransportManagerDefault, Init_LastStateUsed_InvalidPort) { EXPECT_CALL(transport_manager_settings, transport_manager_tcp_adapter_network_interface()) .WillRepeatedly(ReturnRef(network_interface)); + EXPECT_CALL(transport_manager_settings, bluetooth_uuid()) + .WillRepeatedly(Return(kBTUUID.data())); transport_manager.Init(mock_last_state); transport_manager.Stop(); } |