diff options
author | Andrey Oleynik <AOleynik@luxoft.com> | 2015-01-28 14:49:59 +0200 |
---|---|---|
committer | Aleksandr Galiuzov <AGaliuzov@luxoft.com> | 2015-02-23 13:57:10 +0200 |
commit | b4e41caedc6c47b3cdf49c35d6ed3414aae73392 (patch) | |
tree | ae71d5e40442672c4b7cccccc1dc5605591941d5 /src/components | |
parent | 0d909907d12ff75d91479c861692177badc96b8f (diff) | |
download | sdl_core-b4e41caedc6c47b3cdf49c35d6ed3414aae73392.tar.gz |
APPLINK-11088. Fixed several bugs, changed implementation of SDL.ActivateApp handling. Part 2.
Diffstat (limited to 'src/components')
7 files changed, 98 insertions, 6 deletions
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 2a1be546f3..c9666da567 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 @@ -809,6 +809,8 @@ class ApplicationManagerImpl : public ApplicationManager, // typedef for Applications list const iterator typedef ApplictionSet::const_iterator ApplictionSetConstIt; + DataAccessor<AppsWaitRegistrationSet> apps_waiting_for_registration() const; + ApplicationConstSharedPtr waiting_app(const uint32_t hmi_id) const; /** * Class for thread-safe access to applications list diff --git a/src/components/application_manager/include/application_manager/commands/hmi/sdl_activate_app_request.h b/src/components/application_manager/include/application_manager/commands/hmi/sdl_activate_app_request.h index 77960e5f60..a06aeaeefd 100644 --- a/src/components/application_manager/include/application_manager/commands/hmi/sdl_activate_app_request.h +++ b/src/components/application_manager/include/application_manager/commands/hmi/sdl_activate_app_request.h @@ -34,6 +34,7 @@ #define SRC_COMPONENTS_APPLICATION_MANAGER_INCLUDE_APPLICATION_MANAGER_COMMANDS_HMI_SDL_ACTIVATE_APP_REQUEST_H_ #include "application_manager/commands/hmi/request_from_hmi.h" +#include "application_manager/application_manager_impl.h" namespace application_manager { @@ -75,6 +76,8 @@ class SDLActivateAppRequest : public RequestFromHMI { virtual void on_event(const event_engine::Event& event); private: uint32_t app_id() const; + ApplicationSharedPtr FindRegularAppOnSameConnection( + int32_t connection_id); DISALLOW_COPY_AND_ASSIGN(SDLActivateAppRequest); }; 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 f9748cc667..0317c421f0 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 @@ -78,6 +78,7 @@ const char language_desired[] = "languageDesired"; const char auto_activated_id[] = "autoActivateID"; const char app_type[] = "appType"; const char app_hmi_type[] = "appHMIType"; +const char json_app_hmi_type[] = "appHmiType"; const char tts_name[] = "ttsName"; const char binary_data[] = "binary_data"; const char timeout_prompt[] = "timeoutPrompt"; diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index edd04b2c02..c130eebe30 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -756,6 +756,29 @@ void ApplicationManagerImpl::OnMessageReceived( messages_from_hmi_.PostMessage(impl::MessageFromHmi(message)); } +ApplicationConstSharedPtr ApplicationManagerImpl::waiting_app( + const uint32_t hmi_id) const { + AppsWaitRegistrationSet app_list = apps_waiting_for_registration().GetData(); + + AppsWaitRegistrationSet::const_iterator it = app_list.begin(); + AppsWaitRegistrationSet::const_iterator it_end = app_list.end(); + + HmiAppIdPredicate finder(hmi_id); + ApplicationSharedPtr result; + ApplictionSetConstIt it_app = std::find_if(it, it_end, finder); + if (it != it_end) { + result = *it_app; + } + return result; +} + +DataAccessor<ApplicationManagerImpl::AppsWaitRegistrationSet> +ApplicationManagerImpl::apps_waiting_for_registration() const { + return DataAccessor<AppsWaitRegistrationSet>( + ApplicationManagerImpl::instance()->apps_to_register_, + ApplicationManagerImpl::instance()->apps_to_register_list_lock_); +} + bool ApplicationManagerImpl::IsAppsQueriedFrom(int32_t connection_id) const { sync_primitives::AutoLock lock(apps_to_register_list_lock_); AppsWaitRegistrationSet::iterator it = apps_to_register_.begin(); @@ -1889,17 +1912,22 @@ void ApplicationManagerImpl::CreateApplications(SmartArray& obj_array, if (app_data.isValid()) { std::string url_scheme; std::string package_name; + std::string os_type; if (app_data.keyExists(strings::ios)) { - url_scheme = app_data[strings::ios][strings::urlScheme].asString(); + os_type = strings::ios; + url_scheme = app_data[os_type][strings::urlScheme].asString(); } else if (app_data.keyExists(strings::android)) { + os_type = strings::android; package_name = - app_data[strings::android][strings::packageName].asString(); + app_data[os_type][strings::packageName].asString(); } else { LOG4CXX_ERROR(logger_, "Can't find mobile OS type in json file."); return; } const std::string mobile_app_id(app_data[strings::jsonAppId].asString()); const std::string appName(app_data[strings::jsonAppName].asString()); + const bool is_media( + app_data[os_type][strings::is_media_application].asBool()); const uint32_t hmi_app_id(GenerateNewHMIAppID()); @@ -1925,6 +1953,22 @@ void ApplicationManagerImpl::CreateApplications(SmartArray& obj_array, return; } + uint32_t device_id = 0; + connection_handler::ConnectionHandlerImpl* con_handler_impl = + static_cast<connection_handler::ConnectionHandlerImpl*>( + connection_handler_); + + if (-1 == con_handler_impl->GetDataOnSessionKey( + connection_key, NULL, NULL, &device_id)) { + LOG4CXX_ERROR(logger_, + "Failed to create application: no connection info."); + return; + } + + app->set_device(device_id); + app->set_app_types(app_data[os_type][strings::json_app_hmi_type]); + app->set_is_media_application(is_media); + sync_primitives::AutoLock lock(apps_to_register_list_lock_); apps_to_register_.insert(app); } diff --git a/src/components/application_manager/src/commands/hmi/sdl_activate_app_request.cc b/src/components/application_manager/src/commands/hmi/sdl_activate_app_request.cc index a65fd981bc..5d2888023a 100644 --- a/src/components/application_manager/src/commands/hmi/sdl_activate_app_request.cc +++ b/src/components/application_manager/src/commands/hmi/sdl_activate_app_request.cc @@ -50,11 +50,32 @@ void SDLActivateAppRequest::Run() { using namespace hmi_apis::FunctionID; const uint32_t application_id = app_id(); + ApplicationConstSharedPtr app = ApplicationManagerImpl::instance()->application(application_id); - if (app && !app->IsRegistered()) { - MessageHelper::SendLaunchApp(application_id, + if (!app) { + LOG4CXX_WARN(logger_, "Can't find application within regular apps: " + << application_id); + + app = ApplicationManagerImpl::instance()->waiting_app(application_id); + + if (!app) { + LOG4CXX_WARN(logger_, "Can't find application within waiting apps: " + << application_id); + return; + } + } + + if (!app->IsRegistered()) { + ApplicationSharedPtr app_for_sending = + FindRegularAppOnSameConnection(app->connection_id()); + if (!app_for_sending) { + LOG4CXX_ERROR(logger_, "Can't find regular app with the same " + "connection id:" << app->connection_id()); + return; + } + MessageHelper::SendLaunchApp(app_for_sending->app_id(), app->SchemaUrl(), app->PackageName()); subscribe_on_event(BasicCommunication_OnAppRegistered); @@ -95,6 +116,22 @@ uint32_t SDLActivateAppRequest::app_id() const { return 0; } +ApplicationSharedPtr +SDLActivateAppRequest::FindRegularAppOnSameConnection(int32_t connection_id) { + ApplicationManagerImpl::ApplicationListAccessor accessor; + ApplicationManagerImpl::ApplictionSet app_list = accessor.GetData(); + + ApplicationManagerImpl::ApplictionSetIt it = app_list.begin(); + ApplicationManagerImpl::ApplictionSetIt it_end = app_list.end(); + + for (;it != it_end; ++it) { + if (connection_id == (*it)->connection_id()) { + return *it; + } + } + return ApplicationSharedPtr(); +} + } // namespace commands } // namespace application_manager diff --git a/src/components/application_manager/src/commands/mobile/on_hmi_status_notification_from_mobile.cc b/src/components/application_manager/src/commands/mobile/on_hmi_status_notification_from_mobile.cc index 0ebf2eeddf..854a8257e2 100644 --- a/src/components/application_manager/src/commands/mobile/on_hmi_status_notification_from_mobile.cc +++ b/src/components/application_manager/src/commands/mobile/on_hmi_status_notification_from_mobile.cc @@ -94,7 +94,8 @@ void OnHMIStatusNotificationFromMobile::Run() { } if (is_apps_requested_before) { - LOG4CXX_DEBUG(logger_, "Remote apps list had been requested already."); + LOG4CXX_DEBUG(logger_, "Remote apps list had been requested already " + " for connection id: " << connection_id); if (ProtocolVersion::kV4 == app->protocol_version()) { ApplicationManagerImpl::ApplicationListAccessor accessor; diff --git a/src/components/application_manager/src/message_helper.cc b/src/components/application_manager/src/message_helper.cc index 7f31a09227..688fa4b4ec 100644 --- a/src/components/application_manager/src/message_helper.cc +++ b/src/components/application_manager/src/message_helper.cc @@ -1211,7 +1211,11 @@ bool MessageHelper::CreateHMIApplicationStruct(ApplicationConstSharedPtr app, output[strings::icon] = app->app_icon_path(); output[strings::device_name] = device_name; output[strings::app_id] = app->hmi_app_id(); - output[strings::hmi_display_language_desired] = app->ui_language(); + + if (app->IsRegistered()) { + output[strings::hmi_display_language_desired] = app->ui_language(); + } + output[strings::is_media_application] = app->is_media_application(); if (!app->IsRegistered()) { |