summaryrefslogtreecommitdiff
path: root/src/components
diff options
context:
space:
mode:
authorAndrey Oleynik <AOleynik@luxoft.com>2015-01-28 14:49:59 +0200
committerAleksandr Galiuzov <AGaliuzov@luxoft.com>2015-02-23 13:57:10 +0200
commitb4e41caedc6c47b3cdf49c35d6ed3414aae73392 (patch)
treeae71d5e40442672c4b7cccccc1dc5605591941d5 /src/components
parent0d909907d12ff75d91479c861692177badc96b8f (diff)
downloadsdl_core-b4e41caedc6c47b3cdf49c35d6ed3414aae73392.tar.gz
APPLINK-11088. Fixed several bugs, changed implementation of SDL.ActivateApp handling. Part 2.
Diffstat (limited to 'src/components')
-rw-r--r--src/components/application_manager/include/application_manager/application_manager_impl.h2
-rw-r--r--src/components/application_manager/include/application_manager/commands/hmi/sdl_activate_app_request.h3
-rw-r--r--src/components/application_manager/include/application_manager/smart_object_keys.h1
-rw-r--r--src/components/application_manager/src/application_manager_impl.cc48
-rw-r--r--src/components/application_manager/src/commands/hmi/sdl_activate_app_request.cc41
-rw-r--r--src/components/application_manager/src/commands/mobile/on_hmi_status_notification_from_mobile.cc3
-rw-r--r--src/components/application_manager/src/message_helper.cc6
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()) {