summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJackLivio <jack@livio.io>2019-11-25 12:59:16 -0500
committerGitHub <noreply@github.com>2019-11-25 12:59:16 -0500
commit3dcc409766b49f9914963a5c7b2ef0c0dc5fddc8 (patch)
tree4c17e3e06bf42d9dda4e8cf7bec954d869b89765
parent891497bc9fb23434242dbe92e1f13dd1273fcb21 (diff)
parent3bfddead54dec6b961297456ec1a987c83968871 (diff)
downloadsdl_core-fix/cpp.tar.gz
Merge pull request #3137 from smartdevicelink/release/6.0.16.0.1webfix/cpp
Hotfix Release 6.0.1
-rw-r--r--src/appMain/sdl_preloaded_pt.json34
-rw-r--r--src/components/application_manager/include/application_manager/application_impl.h2
-rw-r--r--src/components/application_manager/include/application_manager/application_manager_impl.h19
-rw-r--r--src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin.h3
-rw-r--r--src/components/application_manager/include/application_manager/resumption/resume_ctrl.h4
-rw-r--r--src/components/application_manager/include/application_manager/resumption/resume_ctrl_impl.h5
-rw-r--r--src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_helpers.cc1
-rw-r--r--src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_rpc_plugin.cc12
-rw-r--r--src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/resource_allocation_manager_impl.cc1
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/register_app_interface_request.h25
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc165
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc22
-rw-r--r--src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_plugin.cc1
-rw-r--r--src/components/application_manager/src/application_impl.cc3
-rw-r--r--src/components/application_manager/src/application_manager_impl.cc99
-rw-r--r--src/components/application_manager/src/resumption/resume_ctrl_impl.cc16
-rw-r--r--src/components/application_manager/test/application_manager_impl_test.cc7
-rw-r--r--src/components/application_manager/test/include/application_manager/mock_resume_ctrl.h4
-rw-r--r--src/components/application_manager/test/resumption/resume_ctrl_test.cc2
-rw-r--r--src/components/connection_handler/src/connection_handler_impl.cc8
-rw-r--r--src/components/include/application_manager/application_manager.h13
-rw-r--r--src/components/include/test/application_manager/mock_application_manager.h9
-rw-r--r--src/components/transport_manager/include/transport_manager/usb/libusb/usb_handler.h1
-rw-r--r--src/components/transport_manager/src/usb/libusb/usb_handler.cc20
24 files changed, 339 insertions, 137 deletions
diff --git a/src/appMain/sdl_preloaded_pt.json b/src/appMain/sdl_preloaded_pt.json
index bdd7b4e8c8..4f97d90b09 100644
--- a/src/appMain/sdl_preloaded_pt.json
+++ b/src/appMain/sdl_preloaded_pt.json
@@ -3160,20 +3160,20 @@
"name": "hdop",
"key": "OEM_REF_HDOP",
"type": "Float",
- "mandatory": true,
+ "mandatory": false,
"minvalue": 0,
"maxvalue": 1000,
- "since": "2.0",
- "until": "5.0"
+ "since": "5.0"
},
{
"name": "hdop",
"key": "OEM_REF_HDOP",
"type": "Float",
- "mandatory": false,
+ "mandatory": true,
"minvalue": 0,
- "maxvalue": 1000,
- "since": "5.0"
+ "maxvalue": 10,
+ "since": "2.0",
+ "until": "5.0"
},
{
"name": "vdop",
@@ -3181,7 +3181,7 @@
"type": "Float",
"mandatory": false,
"minvalue": 0,
- "maxvalue": 10,
+ "maxvalue": 1000,
"since": "5.0"
},
{
@@ -3216,7 +3216,7 @@
"mandatory": false,
"minvalue": 0,
"maxvalue": 31,
- "until": "5.0"
+ "since": "5.0"
},
{
"name": "satellites",
@@ -3269,7 +3269,7 @@
"mandatory": false,
"minvalue": 0,
"maxvalue": 359.99,
- "until": "5.0"
+ "since": "5.0"
},
{
"name": "heading",
@@ -3288,7 +3288,7 @@
"mandatory": false,
"minvalue": 0,
"maxvalue": 500,
- "until": "5.0"
+ "since": "5.0"
},
{
"name": "speed",
@@ -3305,8 +3305,6 @@
"key": "OEM_REF_SHIFT",
"type": "Boolean",
"mandatory": false,
- "minvalue": 0,
- "maxvalue": 500,
"since": "6.0"
}
],
@@ -3358,16 +3356,16 @@
{
"name": "type",
"key": "OEM_REF_FUEL_RAN_TYPE",
- "type": "Float",
- "mandatory": false,
- "minvalue": 0,
- "maxvalue": 10000
+ "type": "FuelType",
+ "mandatory": false
},
{
"name": "range",
"key": "OEM_REF_FUEL_RAN_RANG",
- "type": "FuelType",
- "mandatory": false
+ "type": "Float",
+ "mandatory": false,
+ "minvalue": 0,
+ "maxvalue": 10000
}
],
"key": "OEM_REF_FUEL_RAN",
diff --git a/src/components/application_manager/include/application_manager/application_impl.h b/src/components/application_manager/include/application_manager/application_impl.h
index 27b6c8123e..185d700d58 100644
--- a/src/components/application_manager/include/application_manager/application_impl.h
+++ b/src/components/application_manager/include/application_manager/application_impl.h
@@ -601,6 +601,7 @@ class ApplicationImpl : public virtual Application,
std::atomic_bool is_resuming_;
mobile_api::HMILevel::eType deferred_resumption_hmi_level_;
bool is_hash_changed_during_suspend_;
+ smart_objects::SmartObject user_location_;
uint32_t video_stream_retry_number_;
uint32_t audio_stream_retry_number_;
@@ -617,7 +618,6 @@ class ApplicationImpl : public virtual Application,
std::string cloud_transport_type_;
mobile_apis::HybridAppPreference::eType hybrid_app_preference_;
std::string certificate_;
- smart_objects::SmartObject user_location_;
/**
* @brief Defines number per time in seconds limits
diff --git a/src/components/application_manager/include/application_manager/application_manager_impl.h b/src/components/application_manager/include/application_manager/application_manager_impl.h
index e88c954c18..25e28515d4 100644
--- a/src/components/application_manager/include/application_manager/application_manager_impl.h
+++ b/src/components/application_manager/include/application_manager/application_manager_impl.h
@@ -175,17 +175,21 @@ class ApplicationManagerImpl
ApplicationSharedPtr active_application() const OVERRIDE;
+ ApplicationSharedPtr get_full_or_limited_application() const OVERRIDE;
+
ApplicationSharedPtr application_by_hmi_app(
uint32_t hmi_app_id) const OVERRIDE;
ApplicationSharedPtr application_by_policy_id(
const std::string& policy_app_id) const OVERRIDE;
- ApplicationSharedPtr application_by_name(
- const std::string& app_name) const OVERRIDE;
+ DEPRECATED ApplicationSharedPtr
+ application_by_name(const std::string& app_name) const OVERRIDE;
ApplicationSharedPtr pending_application_by_policy_id(
const std::string& policy_app_id) const OVERRIDE;
ApplicationSharedPtr reregister_application_by_policy_id(
const std::string& policy_app_id) const OVERRIDE;
+ std::vector<ApplicationSharedPtr> applications_by_name(
+ const std::string& app_name) const OVERRIDE;
std::vector<ApplicationSharedPtr> applications_by_button(
uint32_t button) OVERRIDE;
std::vector<ApplicationSharedPtr> applications_with_navi() OVERRIDE;
@@ -1136,8 +1140,19 @@ class ApplicationManagerImpl
*/
protocol_handler::MajorProtocolVersion SupportedSDLVersion() const OVERRIDE;
+ void ApplyFunctorForEachPlugin(
+ std::function<void(plugin_manager::RPCPlugin&)> functor) OVERRIDE;
+
private:
/**
+ * @brief Adds application to registered applications list and marks it as
+ * registered
+ * @param application Application that should be added to registered
+ * applications list.
+ */
+ void AddAppToRegisteredAppList(const ApplicationSharedPtr application);
+
+ /**
* @brief Removes service status record for service that failed to start
* @param app Application whose service status record should be removed
* @param Service type which status record should be removed
diff --git a/src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin.h b/src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin.h
index 61b146f024..3af87a0c9e 100644
--- a/src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin.h
+++ b/src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin.h
@@ -65,7 +65,8 @@ enum ApplicationEvent {
kApplicationRegistered,
kApplicationUnregistered,
kDeleteApplicationData,
- kGlobalPropertiesUpdated
+ kGlobalPropertiesUpdated,
+ kRCStatusChanged
};
class RPCPlugin {
diff --git a/src/components/application_manager/include/application_manager/resumption/resume_ctrl.h b/src/components/application_manager/include/application_manager/resumption/resume_ctrl.h
index 11b1bcf926..78366ea96a 100644
--- a/src/components/application_manager/include/application_manager/resumption/resume_ctrl.h
+++ b/src/components/application_manager/include/application_manager/resumption/resume_ctrl.h
@@ -113,9 +113,9 @@ class ResumeCtrl {
* @brief RestoreAppWidgets add widgets for the application
* @param application application which will be resumed
* @param saved_app application specific section from backup file
- * @return true if widgets resumed successfully otherwise - false
+ * @return the number of widget windows to be resumed
*/
- virtual void RestoreAppWidgets(
+ virtual size_t RestoreAppWidgets(
application_manager::ApplicationSharedPtr application,
const smart_objects::SmartObject& saved_app) = 0;
diff --git a/src/components/application_manager/include/application_manager/resumption/resume_ctrl_impl.h b/src/components/application_manager/include/application_manager/resumption/resume_ctrl_impl.h
index 5e6fb58671..f0d5dc39e4 100644
--- a/src/components/application_manager/include/application_manager/resumption/resume_ctrl_impl.h
+++ b/src/components/application_manager/include/application_manager/resumption/resume_ctrl_impl.h
@@ -124,8 +124,9 @@ class ResumeCtrlImpl : public ResumeCtrl,
* @param application application which will be resumed
* @param saved_app application specific section from backup file
*/
- void RestoreAppWidgets(application_manager::ApplicationSharedPtr application,
- const smart_objects::SmartObject& saved_app) OVERRIDE;
+ size_t RestoreAppWidgets(
+ application_manager::ApplicationSharedPtr application,
+ const smart_objects::SmartObject& saved_app) OVERRIDE;
/**
* @brief Remove application from list of saved applications
diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_helpers.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_helpers.cc
index ca0edc90b1..f344dd15a7 100644
--- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_helpers.cc
+++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_helpers.cc
@@ -175,6 +175,7 @@ const std::vector<std::string> RCHelpers::GetModuleTypesList() {
RCAppExtensionPtr RCHelpers::GetRCExtension(
application_manager::Application& app) {
+ LOG4CXX_AUTO_TRACE(logger_);
auto extension_interface = app.QueryInterface(RCRPCPlugin::kRCPluginID);
auto extension =
std::static_pointer_cast<RCAppExtension>(extension_interface);
diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_rpc_plugin.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_rpc_plugin.cc
index 9005eb7fd0..4e43cff58d 100644
--- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_rpc_plugin.cc
+++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_rpc_plugin.cc
@@ -107,7 +107,12 @@ void RCRPCPlugin::OnPolicyEvent(
void RCRPCPlugin::OnApplicationEvent(
application_manager::plugin_manager::ApplicationEvent event,
application_manager::ApplicationSharedPtr application) {
+ LOG4CXX_AUTO_TRACE(logger_);
if (!application->is_remote_control_supported()) {
+ LOG4CXX_DEBUG(
+ logger_,
+ "Remote control is not supported for application with app_id: "
+ << application->app_id());
return;
}
switch (event) {
@@ -119,8 +124,6 @@ void RCRPCPlugin::OnApplicationEvent(
rc_capabilities_manager_
->GetDriverLocationFromSeatLocationCapability();
extension->SetUserLocation(driver_location);
- resource_allocation_manager_->SendOnRCStatusNotifications(
- NotificationTrigger::APP_REGISTRATION, application);
break;
}
case plugins::kApplicationExit: {
@@ -139,6 +142,11 @@ void RCRPCPlugin::OnApplicationEvent(
extension->SetUserLocation(user_location);
break;
}
+ case plugins::kRCStatusChanged: {
+ resource_allocation_manager_->SendOnRCStatusNotifications(
+ NotificationTrigger::APP_REGISTRATION, application);
+ break;
+ }
default:
break;
}
diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/resource_allocation_manager_impl.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/resource_allocation_manager_impl.cc
index 97ff2b23da..049f9a3cf3 100644
--- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/resource_allocation_manager_impl.cc
+++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/resource_allocation_manager_impl.cc
@@ -156,6 +156,7 @@ bool ResourceAllocationManagerImpl::IsUserLocationValid(
ModuleUid& module, application_manager::ApplicationSharedPtr app) {
LOG4CXX_AUTO_TRACE(logger_);
const auto extension = RCHelpers::GetRCExtension(*app);
+ DCHECK_OR_RETURN(extension, false);
const auto user_location = extension->GetUserLocation();
const auto module_service_area =
rc_capabilities_manager_.GetModuleServiceArea(module);
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/register_app_interface_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/register_app_interface_request.h
index c55dcb65fc..d59964bbc7 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/register_app_interface_request.h
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/register_app_interface_request.h
@@ -134,30 +134,39 @@ class RegisterAppInterfaceRequest
app_mngr::ApplicationConstSharedPtr app,
bool resumption = false,
bool need_restore_vr = false);
- /*
+
+ /**
* @brief Check new ID along with known mobile application ID
*
* return TRUE if ID is known already, otherwise - FALSE
*/
bool IsApplicationWithSameAppIdRegistered();
- /*
+ /**
* @brief Check new application parameters (name, tts, vr) for
* coincidence with already known parameters of registered applications
- * @param out_duplicate_apps In the case other apps was found with duplicate
- * names, this field will be filled with a list of said apps
*
- * return SUCCESS if there is no coincidence of app.name/TTS/VR synonyms,
+ * @return SUCCESS if there is no coincidence of app.name/TTS/VR synonyms,
* otherwise appropriate error code returns
*/
- mobile_apis::Result::eType CheckCoincidence(
+ mobile_apis::Result::eType CheckCoincidence();
+
+ /**
+ * @brief Search for any apps with the same appName as the one being
+ * registered
+ * @param out_duplicate_apps To be filled with a list of all of the apps which
+ * have duplicate appNames to the app being registered (registered or pending)
+ *
+ * @return TRUE if at least one duplicate app was found, otherwise FALSE
+ */
+ bool GetDuplicateNames(
std::vector<app_mngr::ApplicationSharedPtr>& out_duplicate_apps);
- /*
+ /**
* @brief Predicate for using with CheckCoincidence method to compare with VR
* synonym SO
*
- * return TRUE if there is coincidence of VR, otherwise FALSE
+ * @return TRUE if there is coincidence of VR, otherwise FALSE
*/
struct CoincidencePredicateVR {
CoincidencePredicateVR(const custom_str::CustomString& newItem)
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc
index 14a94fd1a2..c2f4418b66 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc
@@ -43,6 +43,7 @@
#include "application_manager/application_manager.h"
#include "application_manager/helpers/application_helper.h"
#include "application_manager/message_helper.h"
+#include "application_manager/plugin_manager/plugin_keys.h"
#include "application_manager/policies/policy_handler.h"
#include "application_manager/policies/policy_handler_interface.h"
#include "application_manager/resumption/resume_ctrl.h"
@@ -296,53 +297,73 @@ void RegisterAppInterfaceRequest::Run() {
return;
}
+ mobile_apis::Result::eType coincidence_result = CheckCoincidence();
+
+ if (mobile_apis::Result::SUCCESS != coincidence_result) {
+ LOG4CXX_ERROR(logger_, "Coincidence check failed.");
+ SendResponse(false, coincidence_result);
+ return;
+ }
+
std::vector<ApplicationSharedPtr> duplicate_apps;
- mobile_apis::Result::eType coincidence_result =
- CheckCoincidence(duplicate_apps);
-
- if (mobile_apis::Result::DUPLICATE_NAME == coincidence_result &&
- duplicate_apps.size() == 1) {
- ApplicationSharedPtr duplicate_app = duplicate_apps.front();
- bool error_response = true;
- if (duplicate_app->is_cloud_app()) {
- if (duplicate_app->hybrid_app_preference() ==
- mobile_apis::HybridAppPreference::MOBILE) {
- // Unregister cloud application and allow mobile application to register
- // in it's place
- application_manager_.UnregisterApplication(
- duplicate_app->app_id(), mobile_apis::Result::USER_DISALLOWED);
- error_response = false;
- }
+ if (GetDuplicateNames(duplicate_apps)) {
+ LOG4CXX_ERROR(logger_,
+ "Found duplicate app names, checking for hybrid apps.");
+ // Default preference to BOTH
+ mobile_apis::HybridAppPreference::eType preference =
+ mobile_apis::HybridAppPreference::BOTH;
+ ApplicationSharedPtr app =
+ application_manager_.pending_application_by_policy_id(policy_app_id);
+ bool is_cloud_app = app.use_count() != 0 && app->is_cloud_app();
+ if (is_cloud_app) {
+ // Retrieve hybrid app preference from registering app
+ preference = app->hybrid_app_preference();
} else {
- ApplicationSharedPtr cloud_app =
- application_manager_.pending_application_by_policy_id(policy_app_id);
- // If the duplicate name was not because of a mobile/cloud app pair, go
- // through the normal process for handling duplicate names
- if (cloud_app.use_count() == 0 || !cloud_app->is_cloud_app()) {
- usage_statistics::AppCounter count_of_rejections_duplicate_name(
- GetPolicyHandler().GetStatisticManager(),
- policy_app_id,
- usage_statistics::REJECTIONS_DUPLICATE_NAME);
- ++count_of_rejections_duplicate_name;
- } else if (cloud_app->hybrid_app_preference() ==
- mobile_apis::HybridAppPreference::CLOUD) {
- // Unregister mobile application and allow cloud application to
- // register in it's place
- application_manager_.UnregisterApplication(
- duplicate_app->app_id(), mobile_apis::Result::USER_DISALLOWED);
- error_response = false;
+ // Search for the hybrid app preference in the duplicate app list
+ for (auto duplicate_app : duplicate_apps) {
+ if (duplicate_app->is_cloud_app()) {
+ preference = duplicate_app->hybrid_app_preference();
+ break;
+ }
}
}
- if (error_response) {
- LOG4CXX_ERROR(logger_, "Coincidence check failed.");
- SendResponse(false, coincidence_result);
- return;
+ if (preference == mobile_apis::HybridAppPreference::MOBILE ||
+ preference == mobile_apis::HybridAppPreference::CLOUD) {
+ bool cloud_app_exists = is_cloud_app;
+ bool mobile_app_exists = !is_cloud_app;
+ for (auto duplicate_app : duplicate_apps) {
+ cloud_app_exists = cloud_app_exists || (duplicate_app->IsRegistered() &&
+ duplicate_app->is_cloud_app());
+ mobile_app_exists = mobile_app_exists || !duplicate_app->is_cloud_app();
+ if (is_cloud_app && !duplicate_app->is_cloud_app() &&
+ preference == mobile_apis::HybridAppPreference::CLOUD) {
+ // Unregister mobile application and allow cloud application to
+ // register in it's place
+ LOG4CXX_ERROR(
+ logger_,
+ "Unregistering app because a preferred version is registered.");
+ application_manager_.UnregisterApplication(
+ duplicate_app->app_id(),
+ mobile_apis::Result::USER_DISALLOWED,
+ "App is disabled by user preferences");
+ }
+ }
+
+ bool mobile_app_matches =
+ !is_cloud_app &&
+ preference == mobile_apis::HybridAppPreference::MOBILE;
+ bool cloud_app_matches =
+ is_cloud_app && preference == mobile_apis::HybridAppPreference::CLOUD;
+
+ bool is_preferred_application = mobile_app_matches || cloud_app_matches;
+ if (mobile_app_exists && cloud_app_exists && !is_preferred_application) {
+ SendResponse(false,
+ mobile_apis::Result::USER_DISALLOWED,
+ "App is disabled by user preferences");
+ return;
+ }
}
- } else if (mobile_apis::Result::SUCCESS != coincidence_result) {
- LOG4CXX_ERROR(logger_, "Coincidence check failed.");
- SendResponse(false, coincidence_result);
- return;
}
if (IsWhiteSpaceExist()) {
@@ -458,6 +479,12 @@ void RegisterAppInterfaceRequest::Run() {
}
}
+ auto on_app_registered = [application](plugin_manager::RPCPlugin& plugin) {
+ plugin.OnApplicationEvent(plugin_manager::kApplicationRegistered,
+ application);
+ };
+ application_manager_.ApplyFunctorForEachPlugin(on_app_registered);
+
if (msg_params.keyExists(strings::day_color_scheme)) {
application->set_day_color_scheme(msg_params[strings::day_color_scheme]);
}
@@ -875,6 +902,12 @@ void RegisterAppInterfaceRequest::SendRegisterAppInterfaceResponseToMobile(
// Default HMI level should be set before any permissions validation, since it
// relies on HMI level.
application_manager_.OnApplicationRegistered(application);
+
+ auto send_rc_status = [application](plugin_manager::RPCPlugin& plugin) {
+ plugin.OnApplicationEvent(plugin_manager::kRCStatusChanged, application);
+ };
+ application_manager_.ApplyFunctorForEachPlugin(send_rc_status);
+
SendOnAppRegisteredNotificationToHMI(
application, resumption, need_restore_vr);
(*notify_upd_manager)();
@@ -983,8 +1016,7 @@ void RegisterAppInterfaceRequest::SendOnAppRegisteredNotificationToHMI(
DCHECK(rpc_service_.ManageHMICommand(notification));
}
-mobile_apis::Result::eType RegisterAppInterfaceRequest::CheckCoincidence(
- std::vector<ApplicationSharedPtr>& out_duplicate_apps) {
+mobile_apis::Result::eType RegisterAppInterfaceRequest::CheckCoincidence() {
LOG4CXX_AUTO_TRACE(logger_);
const smart_objects::SmartObject& msg_params =
(*message_)[strings::msg_params];
@@ -1008,8 +1040,7 @@ mobile_apis::Result::eType RegisterAppInterfaceRequest::CheckCoincidence(
const auto& cur_name = app->name();
if (app_name.CompareIgnoreCase(cur_name)) {
LOG4CXX_ERROR(logger_, "Application name is known already.");
- out_duplicate_apps.push_back(app);
- continue;
+ return mobile_apis::Result::DUPLICATE_NAME;
}
const auto vr = app->vr_synonyms();
if (vr) {
@@ -1018,8 +1049,7 @@ mobile_apis::Result::eType RegisterAppInterfaceRequest::CheckCoincidence(
if (0 != std::count_if(curr_vr->begin(), curr_vr->end(), v)) {
LOG4CXX_ERROR(logger_, "Application name is known already.");
- out_duplicate_apps.push_back(app);
- continue;
+ return mobile_apis::Result::DUPLICATE_NAME;
}
}
@@ -1030,8 +1060,7 @@ mobile_apis::Result::eType RegisterAppInterfaceRequest::CheckCoincidence(
CoincidencePredicateVR v(cur_name);
if (0 != std::count_if(new_vr->begin(), new_vr->end(), v)) {
LOG4CXX_ERROR(logger_, "vr_synonyms duplicated with app_name .");
- out_duplicate_apps.push_back(app);
- continue;
+ return mobile_apis::Result::DUPLICATE_NAME;
}
} // End vr check
@@ -1056,12 +1085,44 @@ mobile_apis::Result::eType RegisterAppInterfaceRequest::CheckCoincidence(
} // Application for end
- if (!out_duplicate_apps.empty()) {
- return mobile_apis::Result::DUPLICATE_NAME;
- }
return mobile_apis::Result::SUCCESS;
} // method end
+bool RegisterAppInterfaceRequest::GetDuplicateNames(
+ std::vector<ApplicationSharedPtr>& out_duplicate_apps) {
+ LOG4CXX_AUTO_TRACE(logger_);
+ const smart_objects::SmartObject& msg_params =
+ (*message_)[strings::msg_params];
+
+ const auto& app_name = msg_params[strings::app_name].asCustomString();
+ {
+ const auto& accessor = application_manager_.applications().GetData();
+
+ for (const auto& app : accessor) {
+ const auto& cur_name = app->name();
+ if (app_name.CompareIgnoreCase(cur_name)) {
+ out_duplicate_apps.push_back(app);
+ }
+ }
+ }
+
+ const std::string policy_app_id =
+ application_manager_.GetCorrectMobileIDFromMessage(message_);
+ {
+ const auto& accessor =
+ application_manager_.pending_applications().GetData();
+
+ for (const auto& app : accessor) {
+ const auto& cur_name = app->name();
+ if (app_name.CompareIgnoreCase(cur_name) &&
+ policy_app_id != app->policy_app_id()) {
+ out_duplicate_apps.push_back(app);
+ }
+ }
+ }
+ return !out_duplicate_apps.empty();
+}
+
mobile_apis::Result::eType RegisterAppInterfaceRequest::CheckWithPolicyData() {
LOG4CXX_AUTO_TRACE(logger_);
// TODO(AOleynik): Check is necessary to allow register application in case
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc
index 636175c56f..d5e001b7ac 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc
@@ -83,6 +83,8 @@ const hmi_apis::Common_Language::eType kHmiLanguage =
hmi_apis::Common_Language::EN_US;
const mobile_apis::Language::eType kMobileLanguage =
mobile_apis::Language::EN_US;
+const mobile_apis::HybridAppPreference::eType kHybridAppPreference =
+ mobile_apis::HybridAppPreference::INVALID_ENUM;
const std::string kMacAddress1 = "test_mac_address1";
const std::string kMacAddress2 = "test_mac_address2";
const std::string kAppId1 = "test_app1_id";
@@ -102,6 +104,7 @@ class RegisterAppInterfaceRequestTest
, app_name_("test_app_name_")
, app2_name_("test_app2_name_")
, lock_ptr_(std::make_shared<sync_primitives::Lock>())
+ , pending_lock_ptr_(std::make_shared<sync_primitives::Lock>())
, mock_application_helper_(
application_manager_test::MockApplicationHelper::
application_helper_mock()) {
@@ -141,6 +144,9 @@ class RegisterAppInterfaceRequestTest
ON_CALL(*mock_app, app_icon_path()).WillByDefault(ReturnRef(kDummyString));
ON_CALL(*mock_app, language()).WillByDefault(ReturnRef(kMobileLanguage));
ON_CALL(*mock_app, ui_language()).WillByDefault(ReturnRef(kMobileLanguage));
+ ON_CALL(*mock_app, is_cloud_app()).WillByDefault(Return(false));
+ ON_CALL(*mock_app, hybrid_app_preference())
+ .WillByDefault(ReturnRef(kHybridAppPreference));
ON_CALL(*mock_app, policy_app_id()).WillByDefault(Return(kAppId1));
ON_CALL(*mock_app, msg_version())
.WillByDefault(ReturnRef(mock_semantic_version));
@@ -190,6 +196,8 @@ class RegisterAppInterfaceRequestTest
ON_CALL(app_mngr_, IsAppInReconnectMode(_, _)).WillByDefault(Return(false));
ON_CALL(app_mngr_, application_by_policy_id(_))
.WillByDefault(Return(ApplicationSharedPtr()));
+ ON_CALL(app_mngr_, pending_application_by_policy_id(_))
+ .WillByDefault(Return(ApplicationSharedPtr()));
ON_CALL(mock_hmi_interfaces_, GetInterfaceState(_))
.WillByDefault(Return(am::HmiInterfaces::STATE_NOT_AVAILABLE));
ON_CALL(
@@ -260,6 +268,8 @@ class RegisterAppInterfaceRequestTest
const utils::custom_string::CustomString app2_name_;
std::shared_ptr<sync_primitives::Lock> lock_ptr_;
am::ApplicationSet app_set_;
+ std::shared_ptr<sync_primitives::Lock> pending_lock_ptr_;
+ am::AppsWaitRegistrationSet pending_app_set_;
typedef IsNiceMock<policy_test::MockPolicyHandlerInterface,
kMocksAreNice>::Result MockPolicyHandlerInterface;
@@ -313,6 +323,9 @@ TEST_F(RegisterAppInterfaceRequestTest, Run_MinimalData_SUCCESS) {
ON_CALL(app_mngr_, applications())
.WillByDefault(
Return(DataAccessor<am::ApplicationSet>(app_set_, lock_ptr_)));
+ ON_CALL(app_mngr_, pending_applications())
+ .WillByDefault(Return(DataAccessor<am::AppsWaitRegistrationSet>(
+ pending_app_set_, pending_lock_ptr_)));
EXPECT_CALL(app_mngr_, application(kConnectionKey))
.WillOnce(Return(mock_app));
@@ -432,6 +445,9 @@ TEST_F(RegisterAppInterfaceRequestTest,
ON_CALL(app_mngr_, applications())
.WillByDefault(
Return(DataAccessor<am::ApplicationSet>(app_set_, lock_ptr_)));
+ ON_CALL(app_mngr_, pending_applications())
+ .WillByDefault(Return(DataAccessor<am::AppsWaitRegistrationSet>(
+ pending_app_set_, pending_lock_ptr_)));
ON_CALL(mock_policy_handler_, PolicyEnabled()).WillByDefault(Return(true));
ON_CALL(mock_policy_handler_, GetInitialAppData(kAppId1, _, _))
.WillByDefault(Return(true));
@@ -622,6 +638,9 @@ TEST_F(RegisterAppInterfaceRequestTest,
ON_CALL(app_mngr_, applications())
.WillByDefault(
Return(DataAccessor<am::ApplicationSet>(app_set_, lock_ptr_)));
+ ON_CALL(app_mngr_, pending_applications())
+ .WillByDefault(Return(DataAccessor<am::AppsWaitRegistrationSet>(
+ pending_app_set_, pending_lock_ptr_)));
MockAppPtr mock_app2 = CreateBasicMockedApp();
@@ -659,6 +678,9 @@ TEST_F(RegisterAppInterfaceRequestTest,
ON_CALL(app_mngr_, applications())
.WillByDefault(
Return(DataAccessor<am::ApplicationSet>(app_set_, lock_ptr_)));
+ ON_CALL(app_mngr_, pending_applications())
+ .WillByDefault(Return(DataAccessor<am::AppsWaitRegistrationSet>(
+ pending_app_set_, pending_lock_ptr_)));
InitBasicMessage();
(*msg_)[am::strings::params][am::strings::connection_key] = kConnectionKey2;
diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_plugin.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_plugin.cc
index 40da7501c1..3017b6712f 100644
--- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_plugin.cc
+++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_plugin.cc
@@ -98,6 +98,7 @@ void VehicleInfoPlugin::OnApplicationEvent(
}
void VehicleInfoPlugin::UnsubscribeFromRemovedVDItems() {
+ LOG4CXX_AUTO_TRACE(logger_);
typedef std::vector<std::string> StringsVector;
auto get_items_to_unsubscribe = [this]() -> StringsVector {
diff --git a/src/components/application_manager/src/application_impl.cc b/src/components/application_manager/src/application_impl.cc
index 2b328ae9a1..f66c87b47b 100644
--- a/src/components/application_manager/src/application_impl.cc
+++ b/src/components/application_manager/src/application_impl.cc
@@ -132,7 +132,7 @@ ApplicationImpl::ApplicationImpl(
protocol_handler::MajorProtocolVersion::PROTOCOL_VERSION_3)
, is_voice_communication_application_(false)
, is_resuming_(false)
- , deferred_resumption_hmi_level_(mobile_api::HMILevel::eType::INVALID_ENUM)
+ , deferred_resumption_hmi_level_(mobile_api::HMILevel::INVALID_ENUM)
, is_hash_changed_during_suspend_(false)
, video_stream_retry_number_(0)
, audio_stream_retry_number_(0)
@@ -144,6 +144,7 @@ ApplicationImpl::ApplicationImpl(
"AudioStreamSuspend",
new ::timer::TimerTaskImpl<ApplicationImpl>(
this, &ApplicationImpl::OnAudioStreamSuspend))
+ , hybrid_app_preference_(mobile_api::HybridAppPreference::INVALID_ENUM)
, vi_lock_ptr_(std::make_shared<sync_primitives::Lock>())
, button_lock_ptr_(std::make_shared<sync_primitives::Lock>())
, application_manager_(application_manager) {
diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc
index 8044e8b6cd..6187a6daba 100644
--- a/src/components/application_manager/src/application_manager_impl.cc
+++ b/src/components/application_manager/src/application_manager_impl.cc
@@ -295,13 +295,6 @@ ApplicationSharedPtr ApplicationManagerImpl::application_by_policy_id(
return FindApp(accessor, finder);
}
-ApplicationSharedPtr ApplicationManagerImpl::application_by_name(
- const std::string& app_name) const {
- AppNamePredicate finder(app_name);
- DataAccessor<ApplicationSet> accessor = applications();
- return FindApp(accessor, finder);
-}
-
ApplicationSharedPtr ApplicationManagerImpl::pending_application_by_policy_id(
const std::string& policy_app_id) const {
PolicyAppIdPredicate finder(policy_app_id);
@@ -309,6 +302,13 @@ ApplicationSharedPtr ApplicationManagerImpl::pending_application_by_policy_id(
return FindPendingApp(accessor, finder);
}
+ApplicationSharedPtr ApplicationManagerImpl::application_by_name(
+ const std::string& app_name) const {
+ AppNamePredicate finder(app_name);
+ DataAccessor<ApplicationSet> accessor = applications();
+ return FindApp(accessor, finder);
+}
+
ApplicationSharedPtr
ApplicationManagerImpl::reregister_application_by_policy_id(
const std::string& policy_app_id) const {
@@ -327,6 +327,20 @@ ApplicationSharedPtr ApplicationManagerImpl::active_application() const {
return FindApp(accessor, ActiveAppPredicate);
}
+bool FullOrLimitedAppPredicate(const ApplicationSharedPtr app) {
+ return app ? app->IsFullscreen() ||
+ app->hmi_level(
+ mobile_api::PredefinedWindows::DEFAULT_WINDOW) ==
+ mobile_api::HMILevel::HMI_LIMITED
+ : false;
+}
+
+ApplicationSharedPtr ApplicationManagerImpl::get_full_or_limited_application()
+ const {
+ DataAccessor<ApplicationSet> accessor = applications();
+ return FindApp(accessor, FullOrLimitedAppPredicate);
+}
+
bool LimitedAppPredicate(const ApplicationSharedPtr app) {
return app ? app->hmi_level(mobile_api::PredefinedWindows::DEFAULT_WINDOW) ==
mobile_api::HMILevel::HMI_LIMITED
@@ -406,6 +420,13 @@ ApplicationManagerImpl::applications_by_button(uint32_t button) {
return FindAllApps(accessor, finder);
}
+std::vector<ApplicationSharedPtr> ApplicationManagerImpl::applications_by_name(
+ const std::string& app_name) const {
+ AppNamePredicate finder(app_name);
+ DataAccessor<ApplicationSet> accessor = applications();
+ return FindAllApps(accessor, finder);
+}
+
struct IsApplication {
IsApplication(connection_handler::DeviceHandle device_handle,
const std::string& policy_app_id)
@@ -434,12 +455,6 @@ void ApplicationManagerImpl::OnApplicationRegistered(ApplicationSharedPtr app) {
sync_primitives::AutoLock lock(applications_list_lock_ptr_);
const mobile_apis::HMILevel::eType default_level = GetDefaultHmiLevel(app);
state_ctrl_.OnApplicationRegistered(app, default_level);
-
- std::function<void(plugin_manager::RPCPlugin&)> on_app_registered =
- [app](plugin_manager::RPCPlugin& plugin) {
- plugin.OnApplicationEvent(plugin_manager::kApplicationRegistered, app);
- };
- plugin_manager_->ForEachPlugin(on_app_registered);
}
void ApplicationManagerImpl::OnApplicationSwitched(ApplicationSharedPtr app) {
@@ -729,14 +744,7 @@ ApplicationSharedPtr ApplicationManagerImpl::RegisterApplication(
// Timer will be started after hmi level resumption.
resume_controller().OnAppRegistrationStart(policy_app_id, device_mac);
- // Add application to registered app list and set appropriate mark.
- // Lock has to be released before adding app to policy DB to avoid possible
- // deadlock with simultaneous PTU processing
- applications_list_lock_ptr_->Acquire();
- application->MarkRegistered();
- applications_.insert(application);
- apps_size_ = applications_.size();
- applications_list_lock_ptr_->Release();
+ AddAppToRegisteredAppList(application);
// Update cloud app information, in case any pending apps are unable to be
// registered due to a mobile app taking precedence
@@ -1025,15 +1033,23 @@ void ApplicationManagerImpl::RefreshCloudAppInformation() {
} else if (mobile_apis::HybridAppPreference::MOBILE ==
hybrid_app_preference) {
auto nickname_it = nicknames.begin();
+ bool duplicate_found = false;
for (; nickname_it != nicknames.end(); ++nickname_it) {
- auto app = application_by_name(*nickname_it);
- if (app.use_count() != 0) {
- LOG4CXX_ERROR(
- logger_,
- "Mobile app already registered for cloud app: " << *nickname_it);
- continue;
+ auto apps = applications_by_name(*nickname_it);
+ for (auto app : apps) {
+ if (app.use_count() != 0 && !app->is_cloud_app()) {
+ LOG4CXX_ERROR(logger_,
+ "Mobile app already registered for cloud app: "
+ << *nickname_it);
+ duplicate_found = true;
+ break;
+ }
}
}
+
+ if (duplicate_found) {
+ continue;
+ }
}
pending_device_map_.insert(
@@ -3129,13 +3145,10 @@ void ApplicationManagerImpl::UnregisterApplication(
"There is no more SDL4 apps with device handle: " << handle);
RemoveAppsWaitingForRegistration(handle);
- RefreshCloudAppInformation();
- SendUpdateAppList();
- } else if (app_to_remove->is_cloud_app()) {
- RefreshCloudAppInformation();
- SendUpdateAppList();
}
}
+ RefreshCloudAppInformation();
+ SendUpdateAppList();
}
commands_holder_->Clear(app_to_remove);
@@ -4176,6 +4189,28 @@ ApplicationManagerImpl::SupportedSDLVersion() const {
get_settings().max_supported_protocol_version());
}
+void ApplicationManagerImpl::AddAppToRegisteredAppList(
+ const ApplicationSharedPtr application) {
+ LOG4CXX_AUTO_TRACE(logger_);
+ DCHECK_OR_RETURN_VOID(application);
+ sync_primitives::AutoLock lock(applications_list_lock_ptr_);
+
+ // Add application to registered app list and set appropriate mark.
+ application->MarkRegistered();
+ applications_.insert(application);
+ LOG4CXX_DEBUG(
+ logger_,
+ "App with app_id: " << application->app_id()
+ << " has been added to registered applications list");
+ apps_size_ = static_cast<uint32_t>(applications_.size());
+}
+
+void ApplicationManagerImpl::ApplyFunctorForEachPlugin(
+ std::function<void(plugin_manager::RPCPlugin&)> functor) {
+ LOG4CXX_AUTO_TRACE(logger_);
+ plugin_manager_->ForEachPlugin(functor);
+}
+
event_engine::EventDispatcher& ApplicationManagerImpl::event_dispatcher() {
return event_dispatcher_;
}
diff --git a/src/components/application_manager/src/resumption/resume_ctrl_impl.cc b/src/components/application_manager/src/resumption/resume_ctrl_impl.cc
index 0e1840e867..1be336c685 100644
--- a/src/components/application_manager/src/resumption/resume_ctrl_impl.cc
+++ b/src/components/application_manager/src/resumption/resume_ctrl_impl.cc
@@ -214,12 +214,19 @@ bool ResumeCtrlImpl::RestoreAppHMIState(ApplicationSharedPtr application) {
"High-bandwidth transport not available, app will resume into : "
<< saved_hmi_level);
}
-
+ const bool app_exists_in_full_or_limited =
+ application_manager_.get_full_or_limited_application().use_count() !=
+ 0;
const bool app_hmi_state_is_set =
SetAppHMIState(application, saved_hmi_level, true);
+ size_t restored_widgets = 0;
if (app_hmi_state_is_set &&
application->is_app_data_resumption_allowed()) {
- RestoreAppWidgets(application, saved_app);
+ restored_widgets = RestoreAppWidgets(application, saved_app);
+ }
+ if (0 == restored_widgets && app_exists_in_full_or_limited) {
+ LOG4CXX_DEBUG(logger_, "App exists in full or limited. Do not resume");
+ return false;
}
} else {
result = false;
@@ -399,7 +406,7 @@ bool ResumeCtrlImpl::SetAppHMIState(
return true;
}
-void ResumeCtrlImpl::RestoreAppWidgets(
+size_t ResumeCtrlImpl::RestoreAppWidgets(
application_manager::ApplicationSharedPtr application,
const smart_objects::SmartObject& saved_app) {
using namespace mobile_apis;
@@ -407,7 +414,7 @@ void ResumeCtrlImpl::RestoreAppWidgets(
DCHECK(application);
if (!saved_app.keyExists(strings::windows_info)) {
LOG4CXX_ERROR(logger_, "windows_info section does not exist");
- return;
+ return 0;
}
const auto& windows_info = saved_app[strings::windows_info];
auto request_list = MessageHelper::CreateUICreateWindowRequestsToHMI(
@@ -419,6 +426,7 @@ void ResumeCtrlImpl::RestoreAppWidgets(
(*request)[strings::params][strings::correlation_id].asInt(), request));
}
ProcessHMIRequests(request_list);
+ return request_list.size();
}
bool ResumeCtrlImpl::IsHMIApplicationIdExist(uint32_t hmi_app_id) {
diff --git a/src/components/application_manager/test/application_manager_impl_test.cc b/src/components/application_manager/test/application_manager_impl_test.cc
index 152d577cda..aa82c6b86b 100644
--- a/src/components/application_manager/test/application_manager_impl_test.cc
+++ b/src/components/application_manager/test/application_manager_impl_test.cc
@@ -90,6 +90,7 @@ using ::testing::SaveArg;
using ::testing::SetArgPointee;
using ::testing::SetArgReferee;
+using application_manager::plugin_manager::MockRPCPluginManager;
using test::components::application_manager_test::MockStateController;
using test::components::policy_test::MockPolicyHandlerInterface;
@@ -1607,6 +1608,9 @@ TEST_F(ApplicationManagerImplTest,
smart_objects::SmartObjectSPtr request_for_registration_ptr =
std::make_shared<smart_objects::SmartObject>(request_for_registration);
+ std::unique_ptr<plugin_manager::RPCPluginManager> rpc_plugin_manager(
+ new MockRPCPluginManager());
+ app_manager_impl_->SetPluginManager(rpc_plugin_manager);
ApplicationSharedPtr application =
app_manager_impl_->RegisterApplication(request_for_registration_ptr);
EXPECT_STREQ(kAppName.c_str(), application->name().c_str());
@@ -1774,6 +1778,9 @@ TEST_F(ApplicationManagerImplTest,
smart_objects::SmartObjectSPtr request_for_registration_ptr =
std::make_shared<smart_objects::SmartObject>(request_for_registration);
+ std::unique_ptr<plugin_manager::RPCPluginManager> rpc_plugin_manager(
+ new MockRPCPluginManager());
+ app_manager_impl_->SetPluginManager(rpc_plugin_manager);
ApplicationSharedPtr application =
app_manager_impl_->RegisterApplication(request_for_registration_ptr);
diff --git a/src/components/application_manager/test/include/application_manager/mock_resume_ctrl.h b/src/components/application_manager/test/include/application_manager/mock_resume_ctrl.h
index 56c2ae3cd4..b657f0e86b 100644
--- a/src/components/application_manager/test/include/application_manager/mock_resume_ctrl.h
+++ b/src/components/application_manager/test/include/application_manager/mock_resume_ctrl.h
@@ -102,8 +102,8 @@ class MockResumeCtrl : public resumption::ResumeCtrl {
MOCK_CONST_METHOD0(LaunchTime, time_t());
MOCK_METHOD2(RestoreAppWidgets,
- void(app_mngr::ApplicationSharedPtr application,
- const smart_objects::SmartObject& saved_app));
+ size_t(app_mngr::ApplicationSharedPtr application,
+ const smart_objects::SmartObject& saved_app));
MOCK_METHOD1(RestoreWidgetsHMIState,
void(const smart_objects::SmartObject& response_message));
diff --git a/src/components/application_manager/test/resumption/resume_ctrl_test.cc b/src/components/application_manager/test/resumption/resume_ctrl_test.cc
index 9f0430a937..909ebbbb92 100644
--- a/src/components/application_manager/test/resumption/resume_ctrl_test.cc
+++ b/src/components/application_manager/test/resumption/resume_ctrl_test.cc
@@ -128,6 +128,8 @@ class ResumeCtrlTest : public ::testing::Test {
EXPECT_CALL(mock_app_mngr_, CheckResumptionRequiredTransportAvailable(_))
.Times(AtLeast(0))
.WillRepeatedly(Return(true));
+ ON_CALL(mock_app_mngr_, get_full_or_limited_application())
+ .WillByDefault(Return(ApplicationSharedPtr()));
ON_CALL(mock_application_manager_settings_, use_db_for_resumption())
.WillByDefault(Return(false));
diff --git a/src/components/connection_handler/src/connection_handler_impl.cc b/src/components/connection_handler/src/connection_handler_impl.cc
index db1ee2dce5..1bb1ecbde3 100644
--- a/src/components/connection_handler/src/connection_handler_impl.cc
+++ b/src/components/connection_handler/src/connection_handler_impl.cc
@@ -258,10 +258,10 @@ void ConnectionHandlerImpl::OnConnectionPending(
const transport_manager::ConnectionUID connection_id) {
LOG4CXX_AUTO_TRACE(logger_);
LOG4CXX_DEBUG(logger_,
- "OnConnectionEstablished!!!: "
- << device_info.device_handle() << " " << device_info.name()
- << " " << device_info.mac_address() << " "
- << device_info.connection_type());
+ "OnConnectionPending!!!: " << device_info.device_handle() << " "
+ << device_info.name() << " "
+ << device_info.mac_address() << " "
+ << device_info.connection_type());
DeviceMap::iterator it = device_list_.find(device_info.device_handle());
if (device_list_.end() == it) {
LOG4CXX_ERROR(logger_, "Unknown device!");
diff --git a/src/components/include/application_manager/application_manager.h b/src/components/include/application_manager/application_manager.h
index fa2e8941b8..9343d7d973 100644
--- a/src/components/include/application_manager/application_manager.h
+++ b/src/components/include/application_manager/application_manager.h
@@ -171,6 +171,8 @@ class ApplicationManager {
virtual ApplicationSharedPtr application(uint32_t app_id) const = 0;
virtual ApplicationSharedPtr active_application() const = 0;
+ virtual ApplicationSharedPtr get_full_or_limited_application() const = 0;
+
/**
* Function used only by HMI request/response/notification base classes
* to change HMI app id to Mobile app id and vice versa.
@@ -182,7 +184,7 @@ class ApplicationManager {
virtual ApplicationSharedPtr application_by_policy_id(
const std::string& policy_app_id) const = 0;
- virtual ApplicationSharedPtr application_by_name(
+ DEPRECATED virtual ApplicationSharedPtr application_by_name(
const std::string& app_name) const = 0;
virtual ApplicationSharedPtr pending_application_by_policy_id(
@@ -191,6 +193,8 @@ class ApplicationManager {
virtual ApplicationSharedPtr reregister_application_by_policy_id(
const std::string& policy_app_id) const = 0;
+ virtual AppSharedPtrs applications_by_name(
+ const std::string& app_name) const = 0;
virtual AppSharedPtrs applications_by_button(uint32_t button) = 0;
virtual AppSharedPtrs applications_with_navi() = 0;
@@ -664,6 +668,13 @@ class ApplicationManager {
virtual protocol_handler::MajorProtocolVersion SupportedSDLVersion()
const = 0;
+ /**
+ * @brief Applies functor for each plugin
+ * @param functor Functor that will be applied to each plugin
+ */
+ virtual void ApplyFunctorForEachPlugin(
+ std::function<void(plugin_manager::RPCPlugin&)> functor) = 0;
+
/*
* @brief Converts connection string transport type representation
* to HMI Common_TransportType
diff --git a/src/components/include/test/application_manager/mock_application_manager.h b/src/components/include/test/application_manager/mock_application_manager.h
index e533228656..60ad7196a8 100644
--- a/src/components/include/test/application_manager/mock_application_manager.h
+++ b/src/components/include/test/application_manager/mock_application_manager.h
@@ -86,6 +86,8 @@ class MockApplicationManager : public application_manager::ApplicationManager {
application, application_manager::ApplicationSharedPtr(uint32_t app_id));
MOCK_CONST_METHOD0(active_application,
application_manager::ApplicationSharedPtr());
+ MOCK_CONST_METHOD0(get_full_or_limited_application,
+ application_manager::ApplicationSharedPtr());
MOCK_CONST_METHOD2(application,
application_manager::ApplicationSharedPtr(
const std::string& device_id,
@@ -116,6 +118,9 @@ class MockApplicationManager : public application_manager::ApplicationManager {
MOCK_CONST_METHOD1(reregister_application_by_policy_id,
application_manager::ApplicationSharedPtr(
const std::string& policy_app_id));
+ MOCK_CONST_METHOD1(applications_by_name,
+ std::vector<application_manager::ApplicationSharedPtr>(
+ const std::string& app_name));
MOCK_METHOD1(
applications_by_button,
std::vector<application_manager::ApplicationSharedPtr>(uint32_t button));
@@ -269,6 +274,10 @@ class MockApplicationManager : public application_manager::ApplicationManager {
MOCK_CONST_METHOD0(SupportedSDLVersion,
protocol_handler::MajorProtocolVersion());
MOCK_METHOD1(
+ ApplyFunctorForEachPlugin,
+ void(std::function<void(application_manager::plugin_manager::RPCPlugin&)>
+ functor));
+ MOCK_METHOD1(
GetDeviceTransportType,
hmi_apis::Common_TransportType::eType(const std::string& transport_type));
MOCK_METHOD1(AddAppToTTSGlobalPropertiesList, void(const uint32_t app_id));
diff --git a/src/components/transport_manager/include/transport_manager/usb/libusb/usb_handler.h b/src/components/transport_manager/include/transport_manager/usb/libusb/usb_handler.h
index 6b15229522..9c16b49df6 100644
--- a/src/components/transport_manager/include/transport_manager/usb/libusb/usb_handler.h
+++ b/src/components/transport_manager/include/transport_manager/usb/libusb/usb_handler.h
@@ -76,6 +76,7 @@ class UsbHandler {
public:
explicit UsbHandlerDelegate(UsbHandler* handler);
void threadMain() OVERRIDE;
+ void exitThreadMain() OVERRIDE;
private:
UsbHandler* handler_;
diff --git a/src/components/transport_manager/src/usb/libusb/usb_handler.cc b/src/components/transport_manager/src/usb/libusb/usb_handler.cc
index 975f71e84c..d1fc0af7f7 100644
--- a/src/components/transport_manager/src/usb/libusb/usb_handler.cc
+++ b/src/components/transport_manager/src/usb/libusb/usb_handler.cc
@@ -77,12 +77,12 @@ class UsbHandler::ControlTransferSequenceState {
UsbHandler::UsbHandler()
: shutdown_requested_(false)
- , thread_(NULL)
+ , thread_(nullptr)
, usb_device_listeners_()
, devices_()
, transfer_sequences_()
, device_handles_to_close_()
- , libusb_context_(NULL)
+ , libusb_context_(nullptr)
, arrived_callback_handle_()
, left_callback_handle_() {
thread_ = threads::CreateThread("UsbHandler", new UsbHandlerDelegate(this));
@@ -90,19 +90,23 @@ UsbHandler::UsbHandler()
UsbHandler::~UsbHandler() {
shutdown_requested_ = true;
- thread_->stop();
LOG4CXX_INFO(logger_, "UsbHandler thread finished");
- if (libusb_context_ != 0) { // This wakes up libusb_handle_events()
+
+ if (libusb_context_) {
+ // The libusb_hotplug_deregister_callback() wakes up blocking call of
+ // libusb_handle_events_completed() in the Thread() method of delegate
libusb_hotplug_deregister_callback(libusb_context_,
arrived_callback_handle_);
libusb_hotplug_deregister_callback(libusb_context_, left_callback_handle_);
}
+
thread_->join();
delete thread_->delegate();
threads::DeleteThread(thread_);
+
if (libusb_context_) {
libusb_exit(libusb_context_);
- libusb_context_ = 0;
+ libusb_context_ = nullptr;
}
}
@@ -518,5 +522,11 @@ void UsbHandler::UsbHandlerDelegate::threadMain() {
handler_->Thread();
}
+void UsbHandler::UsbHandlerDelegate::exitThreadMain() {
+ LOG4CXX_AUTO_TRACE(logger_);
+ // Empty method required in order to avoid force delegate thread
+ // finishing by exitThreadMain() of the base class
+}
+
} // namespace transport_adapter
} // namespace transport_manager