summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Keeler <jacob.keeler@livioradio.com>2018-09-21 11:12:36 -0400
committerGitHub <noreply@github.com>2018-09-21 11:12:36 -0400
commit9136f4f9d181228642a7f64e32a474c2b6acbdd2 (patch)
tree68f400df95328b8adbd622f1d4f8a9ec695e5d3c
parentdd2a56dcc8eed7d5af97143a158314c9d01d97a7 (diff)
parent8fe9d54458b162fb9eb895a45a02af5656b655b0 (diff)
downloadsdl_core-9136f4f9d181228642a7f64e32a474c2b6acbdd2.tar.gz
Merge pull request #2607 from smartdevicelink/fix/video_streaming_in_background
Fix EndService being sent to the wrong connection
-rw-r--r--src/components/application_manager/include/application_manager/application.h12
-rw-r--r--src/components/application_manager/include/application_manager/application_impl.h3
-rw-r--r--src/components/application_manager/include/application_manager/hmi_state.h3
-rw-r--r--src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/set_interior_vehicle_data_request.cc48
-rw-r--r--src/components/application_manager/src/application_impl.cc9
-rw-r--r--src/components/application_manager/src/application_manager_impl.cc2
-rw-r--r--src/components/application_manager/src/hmi_state.cc13
-rw-r--r--src/components/application_manager/test/include/application_manager/mock_application.h2
-rw-r--r--src/components/application_manager/test/state_controller/state_controller_test.cc6
-rw-r--r--src/components/connection_handler/src/connection_handler_impl.cc22
-rw-r--r--src/components/include/connection_handler/connection_handler.h1
-rw-r--r--src/components/protocol_handler/src/protocol_handler_impl.cc4
12 files changed, 82 insertions, 43 deletions
diff --git a/src/components/application_manager/include/application_manager/application.h b/src/components/application_manager/include/application_manager/application.h
index c3a4ecbb30..ad7570955e 100644
--- a/src/components/application_manager/include/application_manager/application.h
+++ b/src/components/application_manager/include/application_manager/application.h
@@ -589,6 +589,18 @@ class Application : public virtual InitialApplicationData,
* @return flag tts_properties_in_full
*/
virtual bool tts_properties_in_full() = 0;
+ /**
+ * @brief sets true if application should keep it's HMI Level after an audio
+ * source change
+ * @param value of keep context
+ */
+ virtual void set_keep_context(bool keep_context) = 0;
+ /**
+ * @brief returns true if application should keep keep it's HMI Level after
+ * an audio source change, otherwise return false
+ * @return value of keep_context flag
+ */
+ virtual bool keep_context() = 0;
virtual void set_version(const Version& version) = 0;
virtual void set_name(const custom_str::CustomString& name) = 0;
virtual void set_is_media_application(bool is_media) = 0;
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 f937ebebe1..8dc3b2da20 100644
--- a/src/components/application_manager/include/application_manager/application_impl.h
+++ b/src/components/application_manager/include/application_manager/application_impl.h
@@ -177,6 +177,8 @@ class ApplicationImpl : public virtual Application,
bool tts_properties_in_none();
void set_tts_properties_in_full(bool active);
bool tts_properties_in_full();
+ void set_keep_context(bool keep_context);
+ bool keep_context();
void set_version(const Version& ver);
void set_name(const custom_str::CustomString& name);
void set_is_media_application(bool is_media);
@@ -481,6 +483,7 @@ class ApplicationImpl : public virtual Application,
bool has_been_activated_;
bool tts_properties_in_none_;
bool tts_properties_in_full_;
+ bool keep_context_;
bool is_foreground_;
bool is_application_data_changed_;
uint32_t put_file_in_none_count_;
diff --git a/src/components/application_manager/include/application_manager/hmi_state.h b/src/components/application_manager/include/application_manager/hmi_state.h
index 4b7779e08c..07d9c8dc23 100644
--- a/src/components/application_manager/include/application_manager/hmi_state.h
+++ b/src/components/application_manager/include/application_manager/hmi_state.h
@@ -368,6 +368,9 @@ class AudioSource : public HmiState {
const OVERRIDE {
return mobile_apis::VideoStreamingState::NOT_STREAMABLE;
}
+
+ private:
+ bool keep_context_;
};
/**
diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/set_interior_vehicle_data_request.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/set_interior_vehicle_data_request.cc
index cfd8caae39..0473dd1791 100644
--- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/set_interior_vehicle_data_request.cc
+++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/set_interior_vehicle_data_request.cc
@@ -506,13 +506,20 @@ void SetInteriorVehicleDataRequest::Execute() {
module_data[message_params::kAudioControlData].keyExists(
message_params::kSource);
- if (app_wants_to_set_audio_src && !app->IsAllowedToChangeAudioSource()) {
- LOG4CXX_WARN(logger_, "App is not allowed to change audio source");
- SetResourceState(ModuleType(), ResourceState::FREE);
- SendResponse(false,
- mobile_apis::Result::REJECTED,
- "App is not allowed to change audio source");
- return;
+ if (app_wants_to_set_audio_src) {
+ if (!app->IsAllowedToChangeAudioSource()) {
+ LOG4CXX_WARN(logger_, "App is not allowed to change audio source");
+ SetResourceState(ModuleType(), ResourceState::FREE);
+ SendResponse(false,
+ mobile_apis::Result::REJECTED,
+ "App is not allowed to change audio source");
+ return;
+ } else if (module_data[message_params::kAudioControlData].keyExists(
+ message_params::kKeepContext)) {
+ app->set_keep_context(
+ module_data[message_params::kAudioControlData]
+ [message_params::kKeepContext].asBool());
+ }
}
SendHMIRequest(hmi_apis::FunctionID::RC_SetInteriorVehicleData,
@@ -555,6 +562,10 @@ void SetInteriorVehicleDataRequest::on_event(
*message_)[app_mngr::strings::msg_params][message_params::kModuleData]
[message_params::kAudioControlData]);
}
+ } else {
+ app_mngr::ApplicationSharedPtr app =
+ application_manager_.application(connection_key());
+ app->set_keep_context(false);
}
std::string info;
GetInfo(hmi_response, info);
@@ -580,27 +591,10 @@ const smart_objects::SmartObject& SetInteriorVehicleDataRequest::ControlData(
void SetInteriorVehicleDataRequest::CheckAudioSource(
const smart_objects::SmartObject& audio_data) {
LOG4CXX_AUTO_TRACE(logger_);
- const bool should_keep_context =
- audio_data.keyExists(message_params::kKeepContext) &&
- audio_data[message_params::kKeepContext].asBool();
- const bool switch_source_from_app =
- mobile_apis::PrimaryAudioSource::MOBILE_APP ==
- application_manager_.get_current_audio_source() &&
- mobile_apis::PrimaryAudioSource::MOBILE_APP !=
- audio_data[message_params::kSource].asInt();
- if (!should_keep_context && switch_source_from_app) {
- app_mngr::ApplicationSharedPtr app =
- application_manager_.application(connection_key());
- if (app->mobile_projection_enabled()) {
- application_manager_.ChangeAppsHMILevel(
- app->app_id(), mobile_apis::HMILevel::eType::HMI_LIMITED);
- } else {
- application_manager_.ChangeAppsHMILevel(
- app->app_id(), mobile_apis::HMILevel::eType::HMI_BACKGROUND);
- }
+ if (audio_data.keyExists(message_params::kSource)) {
+ application_manager_.set_current_audio_source(
+ audio_data[message_params::kSource].asUInt());
}
- application_manager_.set_current_audio_source(
- audio_data[message_params::kSource].asUInt());
}
bool SetInteriorVehicleDataRequest::AreAllParamsReadOnly(
diff --git a/src/components/application_manager/src/application_impl.cc b/src/components/application_manager/src/application_impl.cc
index 1168d94245..8a611195c7 100644
--- a/src/components/application_manager/src/application_impl.cc
+++ b/src/components/application_manager/src/application_impl.cc
@@ -116,6 +116,7 @@ ApplicationImpl::ApplicationImpl(
, has_been_activated_(false)
, tts_properties_in_none_(false)
, tts_properties_in_full_(false)
+ , keep_context_(false)
, is_foreground_(false)
, is_application_data_changed_(false)
, put_file_in_none_count_(0)
@@ -438,6 +439,14 @@ bool ApplicationImpl::tts_properties_in_full() {
return tts_properties_in_full_;
}
+void ApplicationImpl::set_keep_context(bool keep_context) {
+ keep_context_ = keep_context;
+}
+
+bool ApplicationImpl::keep_context() {
+ return keep_context_;
+}
+
void ApplicationImpl::set_video_streaming_approved(bool state) {
video_streaming_approved_ = state;
}
diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc
index b61a405aa4..98d0309253 100644
--- a/src/components/application_manager/src/application_manager_impl.cc
+++ b/src/components/application_manager/src/application_manager_impl.cc
@@ -2696,7 +2696,7 @@ void ApplicationManagerImpl::OnAppStreaming(
media_manager_->StartStreaming(app_id, service_type);
} else {
media_manager_->StopStreaming(app_id, service_type);
- state_ctrl_.OnVideoStreamingStarted(app);
+ state_ctrl_.OnVideoStreamingStopped(app);
}
}
diff --git a/src/components/application_manager/src/hmi_state.cc b/src/components/application_manager/src/hmi_state.cc
index aa4c979ae7..7be9668543 100644
--- a/src/components/application_manager/src/hmi_state.cc
+++ b/src/components/application_manager/src/hmi_state.cc
@@ -199,16 +199,17 @@ mobile_apis::HMILevel::eType DeactivateHMI::hmi_level() const {
AudioSource::AudioSource(std::shared_ptr<Application> app,
const ApplicationManager& app_mngr)
- : HmiState(app, app_mngr, STATE_ID_AUDIO_SOURCE) {}
+ : HmiState(app, app_mngr, STATE_ID_AUDIO_SOURCE)
+ , keep_context_(app->keep_context()) {
+ app_->set_keep_context(false);
+}
mobile_apis::HMILevel::eType AudioSource::hmi_level() const {
// Checking for NONE is necessary to avoid issue during
// calculation of HMI level during setting default HMI level
- if (mobile_apis::HMILevel::HMI_NONE == parent()->hmi_level()) {
- return mobile_apis::HMILevel::HMI_NONE;
- }
- if (mobile_apis::HMILevel::HMI_FULL == parent()->hmi_level()) {
- return mobile_apis::HMILevel::HMI_FULL;
+ if (keep_context_ ||
+ mobile_apis::HMILevel::HMI_NONE == parent()->hmi_level()) {
+ return parent()->hmi_level();
}
return mobile_apis::HMILevel::HMI_BACKGROUND;
diff --git a/src/components/application_manager/test/include/application_manager/mock_application.h b/src/components/application_manager/test/include/application_manager/mock_application.h
index d7552060ff..fe16e8ce6e 100644
--- a/src/components/application_manager/test/include/application_manager/mock_application.h
+++ b/src/components/application_manager/test/include/application_manager/mock_application.h
@@ -118,6 +118,8 @@ class MockApplication : public ::application_manager::Application {
MOCK_METHOD0(tts_properties_in_none, bool());
MOCK_METHOD1(set_tts_properties_in_full, void(bool active));
MOCK_METHOD0(tts_properties_in_full, bool());
+ MOCK_METHOD1(set_keep_context, void(bool keep_context));
+ MOCK_METHOD0(keep_context, bool());
MOCK_METHOD1(set_version,
void(const ::application_manager::Version& version));
MOCK_METHOD1(set_name, void(const custom_str::CustomString& name));
diff --git a/src/components/application_manager/test/state_controller/state_controller_test.cc b/src/components/application_manager/test/state_controller/state_controller_test.cc
index 3731848d89..1d4cead52b 100644
--- a/src/components/application_manager/test/state_controller/state_controller_test.cc
+++ b/src/components/application_manager/test/state_controller/state_controller_test.cc
@@ -2830,7 +2830,8 @@ TEST_F(StateControllerImplTest,
state_ctrl_->SetRegularState(navi_app_, hmi_state, true);
}
-TEST_F(StateControllerImplTest, OnEventChangedAudioSourceAppRemainInFull) {
+TEST_F(StateControllerImplTest,
+ OnEventChangedAudioSource_KeepContext_AppRemainInFull) {
const uint32_t app_id = simple_app_->app_id();
InsertApplication(simple_app_);
smart_objects::SmartObject msg;
@@ -2849,11 +2850,14 @@ TEST_F(StateControllerImplTest, OnEventChangedAudioSourceAppRemainInFull) {
mobile_apis::AudioStreamingState::AUDIBLE,
mobile_apis::VideoStreamingState::NOT_STREAMABLE,
mobile_apis::SystemContext::SYSCTXT_MAIN);
+
+ EXPECT_CALL(*simple_app_ptr_, keep_context()).WillOnce(Return(true));
EXPECT_CALL(*simple_app_ptr_, RegularHmiState()).WillOnce(Return(state));
EXPECT_CALL(*simple_app_ptr_, IsAudioApplication())
.WillRepeatedly(Return(true));
EXPECT_CALL(*simple_app_ptr_, CurrentHmiState())
.WillOnce(Return(FullAudibleState()));
+ EXPECT_CALL(*simple_app_ptr_, set_keep_context(false));
HmiStatePtr new_state;
EXPECT_CALL(*simple_app_ptr_, AddHMIState(_))
diff --git a/src/components/connection_handler/src/connection_handler_impl.cc b/src/components/connection_handler/src/connection_handler_impl.cc
index 045985f650..478127c42a 100644
--- a/src/components/connection_handler/src/connection_handler_impl.cc
+++ b/src/components/connection_handler/src/connection_handler_impl.cc
@@ -354,8 +354,8 @@ void ConnectionHandlerImpl::OnSessionStartedCallback(
// so they can send appropriate Ack or NAK messages on the correct transport.
transport_manager::ConnectionUID primary_connection_handle =
connection_handle;
+ SessionTransports st = GetSessionTransports(session_id);
if (session_id != 0) {
- SessionTransports st = GetSessionTransports(session_id);
if (st.primary_transport == 0) {
LOG4CXX_WARN(logger_,
"OnSessionStartedCallback could not find Session in the "
@@ -424,6 +424,11 @@ void ConnectionHandlerImpl::OnSessionStartedCallback(
}
context.new_session_id_ = session_id;
context.hash_id_ = protocol_handler::HASH_ID_NOT_SUPPORTED;
+
+ if (st.secondary_transport == connection_handle) {
+ sync_primitives::AutoLock auto_lock(session_connection_map_lock_ptr_);
+ st.secondary_transport_services.push_back(service_type);
+ }
}
sync_primitives::AutoReadLock read_lock(connection_handler_observer_lock_);
if (connection_handler_observer_) {
@@ -1444,11 +1449,16 @@ void ConnectionHandlerImpl::SendEndService(uint32_t key, uint8_t service_type) {
<< static_cast<int>(st.primary_transport)
<< " and secondary connection "
<< static_cast<int>(st.secondary_transport));
-
- protocol_handler_->SendEndService(st.primary_transport,
- st.secondary_transport,
- session_id,
- service_type);
+ sync_primitives::AutoLock auto_lock(session_connection_map_lock_ptr_);
+ auto it = std::find(st.secondary_transport_services.begin(),
+ st.secondary_transport_services.end(),
+ service_type);
+ if (it != st.secondary_transport_services.end()) {
+ connection_handle = st.secondary_transport;
+ st.secondary_transport_services.erase(it);
+ }
+ protocol_handler_->SendEndService(
+ st.primary_transport, connection_handle, session_id, service_type);
}
}
}
diff --git a/src/components/include/connection_handler/connection_handler.h b/src/components/include/connection_handler/connection_handler.h
index bfaacf5fc1..a50760b547 100644
--- a/src/components/include/connection_handler/connection_handler.h
+++ b/src/components/include/connection_handler/connection_handler.h
@@ -57,6 +57,7 @@ class ConnectionHandlerObserver;
typedef struct {
transport_manager::ConnectionUID primary_transport;
transport_manager::ConnectionUID secondary_transport;
+ std::vector<protocol_handler::ServiceType> secondary_transport_services;
} SessionTransports;
typedef std::map<uint8_t, SessionTransports> SessionConnectionMap;
diff --git a/src/components/protocol_handler/src/protocol_handler_impl.cc b/src/components/protocol_handler/src/protocol_handler_impl.cc
index 138a18df3f..d03030b747 100644
--- a/src/components/protocol_handler/src/protocol_handler_impl.cc
+++ b/src/components/protocol_handler/src/protocol_handler_impl.cc
@@ -621,9 +621,9 @@ void ProtocolHandlerImpl::SendEndServicePrivate(int32_t primary_connection_id,
impl::RawFordMessageToMobile(ptr, false));
LOG4CXX_DEBUG(logger_,
"SendEndServicePrivate() for connection "
- << primary_connection_id << " for service_type "
+ << connection_id << " for service_type "
<< static_cast<int>(service_type)
- << " service connection " << connection_id
+ << " primary connection " << primary_connection_id
<< " session_id " << static_cast<int32_t>(session_id));
} else {
LOG4CXX_WARN(