diff options
author | JackLivio <jack@livio.io> | 2018-11-28 12:52:07 -0500 |
---|---|---|
committer | JackLivio <jack@livio.io> | 2018-11-29 11:18:15 -0500 |
commit | 90d1b24267a03cecbf43b7de5331c2d74a876538 (patch) | |
tree | 42f55e3e2a99e770eba7d5e4f6323b3ffbbdff1d | |
parent | 7b8febf95531d5a576332e9c347eb1aa73d0077b (diff) | |
download | sdl_core-90d1b24267a03cecbf43b7de5331c2d74a876538.tar.gz |
Connection Status To Trigger UpdateAppList
19 files changed, 86 insertions, 5 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 58e066461f..d7c03e0fa0 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 @@ -368,10 +368,17 @@ class ApplicationManagerImpl connection_handler::DeviceHandle device_id); /** + * @brief Notifies the applicaiton manager that a cloud connection status has + * updated and should trigger an UpdateAppList RPC to the HMI + */ + void OnConnectionStatusUpdated(); + + /** * @brief Retrieve the current connection status of a cloud app * @param app A cloud application * @return The current CloudConnectionStatus of app */ + hmi_apis::Common_CloudConnectionStatus::eType GetCloudAppConnectionStatus( ApplicationConstSharedPtr app) const; diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index e9a45001c7..8fd7f9e455 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -930,6 +930,10 @@ void ApplicationManagerImpl::CreatePendingApplication( SendUpdateAppList(); } +void ApplicationManagerImpl::OnConnectionStatusUpdated() { + SendUpdateAppList(); +} + hmi_apis::Common_CloudConnectionStatus::eType ApplicationManagerImpl::GetCloudAppConnectionStatus( ApplicationConstSharedPtr app) const { diff --git a/src/components/connection_handler/include/connection_handler/connection_handler_impl.h b/src/components/connection_handler/include/connection_handler/connection_handler_impl.h index cbf829b226..b8153bcf42 100644 --- a/src/components/connection_handler/include/connection_handler/connection_handler_impl.h +++ b/src/components/connection_handler/include/connection_handler/connection_handler_impl.h @@ -176,6 +176,8 @@ class ConnectionHandlerImpl void OnScanDevicesFailed( const transport_manager::SearchDeviceError& error) OVERRIDE; + void OnConnectionStatusUpdated() OVERRIDE; + /** * \brief Notifies about pending connection. * diff --git a/src/components/connection_handler/src/connection_handler_impl.cc b/src/components/connection_handler/src/connection_handler_impl.cc index 77eb38b8bc..88d57e5d2c 100644 --- a/src/components/connection_handler/src/connection_handler_impl.cc +++ b/src/components/connection_handler/src/connection_handler_impl.cc @@ -249,6 +249,10 @@ void ConnectionHandlerImpl::OnScanDevicesFailed( LOG4CXX_WARN(logger_, "Scan devices failed. " << error.text()); } +void ConnectionHandlerImpl::OnConnectionStatusUpdated() { + connection_handler_observer_->OnConnectionStatusUpdated(); +} + void ConnectionHandlerImpl::OnConnectionPending( const transport_manager::DeviceInfo& device_info, const transport_manager::ConnectionUID connection_id) { diff --git a/src/components/include/connection_handler/connection_handler_observer.h b/src/components/include/connection_handler/connection_handler_observer.h index 298f98803a..f683318ada 100644 --- a/src/components/include/connection_handler/connection_handler_observer.h +++ b/src/components/include/connection_handler/connection_handler_observer.h @@ -161,6 +161,8 @@ class ConnectionHandlerObserver { */ virtual void OnSecondaryTransportEndedCallback(const int32_t session_key) = 0; + virtual void OnConnectionStatusUpdated() = 0; + virtual void CreatePendingApplication( const transport_manager::ConnectionUID connection_id, const transport_manager::DeviceInfo& device_info, diff --git a/src/components/include/test/connection_handler/mock_connection_handler_observer.h b/src/components/include/test/connection_handler/mock_connection_handler_observer.h index 2984b2e471..0a8e71c085 100644 --- a/src/components/include/test/connection_handler/mock_connection_handler_observer.h +++ b/src/components/include/test/connection_handler/mock_connection_handler_observer.h @@ -74,6 +74,7 @@ class MockConnectionHandlerObserver const int32_t session_key)); MOCK_METHOD1(OnSecondaryTransportEndedCallback, void(const int32_t session_key)); + MOCK_METHOD0(OnConnectionStatusUpdated, void()); MOCK_METHOD3(CreatePendingApplication, void(const transport_manager::ConnectionUID connection_id, const transport_manager::DeviceInfo& device_info, diff --git a/src/components/include/test/transport_manager/mock_transport_manager_listener.h b/src/components/include/test/transport_manager/mock_transport_manager_listener.h index 734651f455..04408f945b 100644 --- a/src/components/include/test/transport_manager/mock_transport_manager_listener.h +++ b/src/components/include/test/transport_manager/mock_transport_manager_listener.h @@ -55,6 +55,7 @@ class MockTransportManagerListener : public TransportManagerListener { MOCK_METHOD1(OnDeviceRemoved, void(const DeviceInfo& device_info)); MOCK_METHOD0(OnScanDevicesFinished, void()); MOCK_METHOD1(OnScanDevicesFailed, void(const SearchDeviceError& error)); + MOCK_METHOD0(OnConnectionStatusUpdated, void()); MOCK_METHOD2(OnConnectionPending, void(const DeviceInfo& device_info, const ConnectionUID connection_id)); diff --git a/src/components/include/test/transport_manager/transport_adapter/mock_transport_adapter.h b/src/components/include/test/transport_manager/transport_adapter/mock_transport_adapter.h index 65cfdae4d5..c993f245b9 100644 --- a/src/components/include/test/transport_manager/transport_adapter/mock_transport_adapter.h +++ b/src/components/include/test/transport_manager/transport_adapter/mock_transport_adapter.h @@ -69,6 +69,7 @@ class MockTransportAdapter MOCK_CONST_METHOD1(GetConnectionStatus, ::transport_manager::ConnectionStatus( const ::transport_manager::DeviceUID& device_handle)); + MOCK_METHOD0(ConnectionStatusUpdated, void()); MOCK_METHOD2(RunAppOnDevice, void(const std::string&, const std::string&)); MOCK_CONST_METHOD0(IsClientOriginatedConnectSupported, bool()); MOCK_METHOD0( diff --git a/src/components/include/transport_manager/transport_adapter/transport_adapter.h b/src/components/include/transport_manager/transport_adapter/transport_adapter.h index 184ee79a13..303f677720 100644 --- a/src/components/include/transport_manager/transport_adapter/transport_adapter.h +++ b/src/components/include/transport_manager/transport_adapter/transport_adapter.h @@ -227,6 +227,8 @@ class TransportAdapter { virtual ConnectionStatus GetConnectionStatus( const DeviceUID& device_handle) const = 0; + virtual void ConnectionStatusUpdated() = 0; + /** * @brief RunAppOnDevice allows to run specific application on the certain *device. diff --git a/src/components/include/transport_manager/transport_adapter/transport_adapter_event.h b/src/components/include/transport_manager/transport_adapter/transport_adapter_event.h index 921562333b..63d1678ed0 100644 --- a/src/components/include/transport_manager/transport_adapter/transport_adapter_event.h +++ b/src/components/include/transport_manager/transport_adapter/transport_adapter_event.h @@ -59,7 +59,8 @@ enum class EventTypeEnum { ON_UNEXPECTED_DISCONNECT, ON_TRANSPORT_SWITCH_REQUESTED, ON_TRANSPORT_CONFIG_UPDATED, - ON_CONNECT_PENDING + ON_CONNECT_PENDING, + ON_CONNECTION_STATUS_UPDATED }; class TransportAdapterEvent { diff --git a/src/components/include/transport_manager/transport_manager_listener.h b/src/components/include/transport_manager/transport_manager_listener.h index 7da4bcc2f5..22ee519a67 100644 --- a/src/components/include/transport_manager/transport_manager_listener.h +++ b/src/components/include/transport_manager/transport_manager_listener.h @@ -101,6 +101,11 @@ class TransportManagerListener { virtual void OnScanDevicesFailed(const SearchDeviceError& error) = 0; /** + * @brief Reaction to the event, when the cloud connection status is updated. + */ + virtual void OnConnectionStatusUpdated() = 0; + + /** * @brief Reaction to the event, when connection is pending. * * @param devcie_info Variable that hold information about device. diff --git a/src/components/include/transport_manager/transport_manager_listener_empty.h b/src/components/include/transport_manager/transport_manager_listener_empty.h index c0a713f38e..193a86819c 100644 --- a/src/components/include/transport_manager/transport_manager_listener_empty.h +++ b/src/components/include/transport_manager/transport_manager_listener_empty.h @@ -59,6 +59,8 @@ class TransportManagerListenerEmpty : public TransportManagerListener { void OnFindNewApplicationsRequest() OVERRIDE {} + void OnConnectionStatusUpdated() OVERRIDE {} + /** * @brief Reaction to the event, when the device is found. * diff --git a/src/components/transport_manager/include/transport_manager/transport_adapter/transport_adapter_impl.h b/src/components/transport_manager/include/transport_manager/transport_adapter/transport_adapter_impl.h index 9b860841e9..8d03bdb2c7 100644 --- a/src/components/transport_manager/include/transport_manager/transport_adapter/transport_adapter_impl.h +++ b/src/components/transport_manager/include/transport_manager/transport_adapter/transport_adapter_impl.h @@ -159,6 +159,8 @@ class TransportAdapterImpl : public TransportAdapter, ConnectionStatus GetConnectionStatus( const DeviceUID& device_handle) const OVERRIDE; + void ConnectionStatusUpdated() OVERRIDE; + /** * @brief Disconnect from specified session. * @@ -567,7 +569,7 @@ class TransportAdapterImpl : public TransportAdapter, /** * @brief Clear any retry timers which have been completed */ - void TransportAdapterImpl::ClearCompletedTimers(); + void ClearCompletedTimers(); /** * @brief Retrieve the next device available for a reattempted connection diff --git a/src/components/transport_manager/include/transport_manager/transport_adapter/transport_adapter_listener.h b/src/components/transport_manager/include/transport_manager/transport_adapter/transport_adapter_listener.h index b0368869e7..a0e0a51c1e 100644 --- a/src/components/transport_manager/include/transport_manager/transport_adapter/transport_adapter_listener.h +++ b/src/components/transport_manager/include/transport_manager/transport_adapter/transport_adapter_listener.h @@ -92,6 +92,12 @@ class TransportAdapterListener { const TransportAdapter* adapter) = 0; /** + * @brief Reaction to connection status update + * @param adapter Current transport adapter + */ + virtual void OnConnectionStatusUpdated(const TransportAdapter* adapter) = 0; + + /** * @brief Search specified device adapter in the container of shared pointers * to device adapters to be sure it is available, * launch event ON_CONNECT_PENDING in transport manager. diff --git a/src/components/transport_manager/include/transport_manager/transport_adapter/transport_adapter_listener_impl.h b/src/components/transport_manager/include/transport_manager/transport_adapter/transport_adapter_listener_impl.h index 76271229ad..0c9c6ef6a2 100644 --- a/src/components/transport_manager/include/transport_manager/transport_adapter/transport_adapter_listener_impl.h +++ b/src/components/transport_manager/include/transport_manager/transport_adapter/transport_adapter_listener_impl.h @@ -88,6 +88,11 @@ class TransportAdapterListenerImpl virtual void OnFindNewApplicationsRequest(const TransportAdapter* adapter); /** + * @brief Passes notification to that the cloud conection status has updated + */ + virtual void OnConnectionStatusUpdated(const TransportAdapter* adapter); + + /** * @brief Search specified device adapter in the container of shared pointers * to device adapters to be sure it is available, * launch event ON_CONNECT_PENDING in transport manager. diff --git a/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc b/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc index ecf04300bb..7079a55264 100644 --- a/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc +++ b/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc @@ -252,12 +252,14 @@ TransportAdapter::Error TransportAdapterImpl::ConnectDevice( if (device->connection_status() == ConnectionStatus::PENDING) { device->set_connection_status(ConnectionStatus::RETRY); device->reset_retry_count(); + ConnectionStatusUpdated(); } if (device->retry_count() > get_settings().cloud_app_max_retry_attempts()) { device->set_connection_status(ConnectionStatus::PENDING); device->reset_retry_count(); + ConnectionStatusUpdated(); return err; } @@ -272,6 +274,7 @@ TransportAdapter::Error TransportAdapterImpl::ConnectDevice( timer::kSingleShot); } else if (OK == err) { device->set_connection_status(ConnectionStatus::CONNECTED); + ConnectionStatusUpdated(); } LOG4CXX_TRACE(logger_, "exit with error: " << err); return err; @@ -303,14 +306,14 @@ void TransportAdapterImpl::ClearCompletedTimers() { } DeviceUID TransportAdapterImpl::GetNextRetryDevice() { - sync_primitives::AutoLock locker(retry_timer_pool_lock_); + sync_primitives::AutoLock retry_locker(retry_timer_pool_lock_); if (retry_timer_pool_.empty()) { return std::string(); } auto timer_entry = retry_timer_pool_.front(); retry_timer_pool_.pop(); - sync_primitives::AutoLock locker(completed_timer_pool_lock_); - completed_timer_pool_.push_back(timer_entry); + sync_primitives::AutoLock completed_locker(completed_timer_pool_lock_); + completed_timer_pool_.push(timer_entry); return timer_entry.second; } @@ -321,6 +324,14 @@ ConnectionStatus TransportAdapterImpl::GetConnectionStatus( : device->connection_status(); } +void TransportAdapterImpl::ConnectionStatusUpdated() { + for (TransportAdapterListenerList::iterator it = listeners_.begin(); + it != listeners_.end(); + ++it) { + (*it)->OnConnectionStatusUpdated(this); + } +} + TransportAdapter::Error TransportAdapterImpl::Disconnect( const DeviceUID& device_id, const ApplicationHandle& app_handle) { LOG4CXX_TRACE(logger_, @@ -352,6 +363,7 @@ TransportAdapter::Error TransportAdapterImpl::DisconnectDevice( Error error = OK; DeviceSptr device = FindDevice(device_id); device->set_connection_status(ConnectionStatus::CLOSING); + ConnectionStatusUpdated(); std::vector<ConnectionInfo> to_disconnect; connections_lock_.AcquireForReading(); diff --git a/src/components/transport_manager/src/transport_adapter/transport_adapter_listener_impl.cc b/src/components/transport_manager/src/transport_adapter/transport_adapter_listener_impl.cc index 73750fe2f3..4ef685adbc 100644 --- a/src/components/transport_manager/src/transport_adapter/transport_adapter_listener_impl.cc +++ b/src/components/transport_manager/src/transport_adapter/transport_adapter_listener_impl.cc @@ -116,6 +116,23 @@ void TransportAdapterListenerImpl::OnFindNewApplicationsRequest( LOG4CXX_TRACE(logger_, "exit"); } +void TransportAdapterListenerImpl::OnConnectionStatusUpdated( + const TransportAdapter* adapter) { + LOG4CXX_TRACE(logger_, "enter. adapter* " << adapter); + const TransportAdapterEvent event(EventTypeEnum::ON_CONNECTION_STATUS_UPDATED, + transport_adapter_, + "", + 0, + ::protocol_handler::RawMessagePtr(), + BaseErrorPtr(new BaseError())); + if (transport_manager_ != NULL && + transport_manager::E_SUCCESS != + transport_manager_->ReceiveEventFromDevice(event)) { + LOG4CXX_WARN(logger_, "Failed to receive event from device"); + } + LOG4CXX_TRACE(logger_, "exit"); +} + void TransportAdapterListenerImpl::OnConnectPending( const TransportAdapter* adapter, const DeviceUID& device, diff --git a/src/components/transport_manager/src/transport_manager_impl.cc b/src/components/transport_manager/src/transport_manager_impl.cc index 1c5a6dae32..518a5639db 100644 --- a/src/components/transport_manager/src/transport_manager_impl.cc +++ b/src/components/transport_manager/src/transport_manager_impl.cc @@ -990,6 +990,11 @@ void TransportManagerImpl::Handle(TransportAdapterEvent event) { LOG4CXX_DEBUG(logger_, "event_type = ON_FIND_NEW_APPLICATIONS_REQUEST"); break; } + case EventTypeEnum::ON_CONNECTION_STATUS_UPDATED: { + RaiseEvent(&TransportManagerListener::OnConnectionStatusUpdated); + LOG4CXX_DEBUG(logger_, "event_type = ON_CONNECTION_STATUS_UPDATED"); + break; + } case EventTypeEnum::ON_CONNECT_PENDING: { const DeviceHandle device_handle = converter_.UidToHandle( event.device_uid, event.transport_adapter->GetConnectionType()); diff --git a/src/components/transport_manager/test/include/transport_manager/transport_adapter/mock_transport_adapter_listener.h b/src/components/transport_manager/test/include/transport_manager/transport_adapter/mock_transport_adapter_listener.h index 81e133ec2b..f7bebf69c3 100644 --- a/src/components/transport_manager/test/include/transport_manager/transport_adapter/mock_transport_adapter_listener.h +++ b/src/components/transport_manager/test/include/transport_manager/transport_adapter/mock_transport_adapter_listener.h @@ -59,6 +59,8 @@ class MockTransportAdapterListener : public TransportAdapterListener { const SearchDeviceError& error)); MOCK_METHOD1(OnFindNewApplicationsRequest, void(const TransportAdapter* adapter)); + MOCK_METHOD1(OnConnectionStatusUpdated, + void(const TransportAdapter* adapter)); MOCK_METHOD3(OnConnectPending, void(const TransportAdapter* adapter, const DeviceUID& device_handle, |