diff --git a/common/include/constants_dinput.h b/common/include/constants_dinput.h index 4152677..9c4a22b 100644 --- a/common/include/constants_dinput.h +++ b/common/include/constants_dinput.h @@ -93,6 +93,8 @@ namespace DistributedInput { */ constexpr uint32_t INPUT_TYPE_ALL = INPUT_TYPE_MOUSE | INPUT_TYPE_KEYBOARD | INPUT_TYPE_TOUCH; + constexpr int32_t INPUT_SUBSCRIBESA_DELAY_MS = 5; + constexpr int32_t INPUT_LOADSA_TIMEOUT_MS = 10000; constexpr int32_t SESSION_WAIT_TIMEOUT_SECOND = 5; diff --git a/interfaces/inner_kits/test/unittest/mock/mock_distributed_input_client.cpp b/interfaces/inner_kits/test/unittest/mock/mock_distributed_input_client.cpp index 0836fad..307546d 100644 --- a/interfaces/inner_kits/test/unittest/mock/mock_distributed_input_client.cpp +++ b/interfaces/inner_kits/test/unittest/mock/mock_distributed_input_client.cpp @@ -24,10 +24,15 @@ namespace OHOS { namespace DistributedHardware { namespace DistributedInput { +std::shared_ptr DistributedInputClient::instance(new DistributedInputClient()); + +DistributedInputClient::DistributedInputClient() +{ +} + DistributedInputClient &DistributedInputClient::GetInstance() { - static DistributedInputClient instance; - return instance; + return *instance.get(); } void DistributedInputClient::RegisterDInputCb::OnResult( diff --git a/interfaces/ipc/include/distributed_input_client.h b/interfaces/ipc/include/distributed_input_client.h index 44ac6b4..f4041b9 100644 --- a/interfaces/ipc/include/distributed_input_client.h +++ b/interfaces/ipc/include/distributed_input_client.h @@ -16,6 +16,7 @@ #ifndef DISTRIBUTED_INPUT_CLIENT_H #define DISTRIBUTED_INPUT_CLIENT_H +#include #include #include #include @@ -30,12 +31,15 @@ #include "idistributed_hardware_source.h" #include "idistributed_hardware_sink.h" +#include "system_ability_status_change_stub.h" namespace OHOS { namespace DistributedHardware { namespace DistributedInput { class DistributedInputClient { public: + ~DistributedInputClient(){}; + static DistributedInputClient &GetInstance(); int32_t InitSource(); @@ -110,7 +114,15 @@ public: void OnResult(const std::string &deviceId); }; + class SystemAbilityListener : public SystemAbilityStatusChangeStub { + public: + void OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId) override; + void OnRemoveSystemAbility(int32_t systemAbilityId, const std::string& deviceId) override; + }; + private: + DistributedInputClient(); + void Init(); bool GetDInputSourceProxy(); bool GetDInputSinkProxy(); bool IsJsonData(std::string strData) const; @@ -118,7 +130,12 @@ private: void DelWhiteListInfos(const std::string &deviceId) const; private: + static std::shared_ptr instance; std::mutex mutex_; + std::atomic dInputSourceSAOnline = false; + std::atomic dInputSinkSAOnline = false; + std::atomic isSubscribeSrcSAChangeListener = false; + std::atomic isSubscribeSinkSAChangeListener = false; sptr dInputSourceProxy_ = nullptr; sptr dInputSinkProxy_ = nullptr; @@ -134,7 +151,8 @@ private: sptr sourceTypeCallback = nullptr; sptr addWhiteListCallback = nullptr; sptr delWhiteListCallback = nullptr; - + sptr saListenerCallback = nullptr; + struct DHardWareFwkRegistInfo { std::string devId; std::string dhId; diff --git a/interfaces/ipc/src/distributed_input_client.cpp b/interfaces/ipc/src/distributed_input_client.cpp index 19c7b03..390a698 100644 --- a/interfaces/ipc/src/distributed_input_client.cpp +++ b/interfaces/ipc/src/distributed_input_client.cpp @@ -29,10 +29,50 @@ namespace OHOS { namespace DistributedHardware { namespace DistributedInput { +std::shared_ptr DistributedInputClient::instance(new DistributedInputClient()); + +DistributedInputClient::DistributedInputClient() +{ + Init(); +} + +void DistributedInputClient::Init() +{ + saListenerCallback = new(std::nothrow) SystemAbilityListener(); + sptr systemAbilityManager = + SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); + + if (!systemAbilityManager) { + DHLOGE("get system ability manager failed."); + return; + } + + if (!isSubscribeSrcSAChangeListener.load()) { + DHLOGI("try subscribe source sa change listener, sa id: %d", DISTRIBUTED_HARDWARE_INPUT_SOURCE_SA_ID); + int32_t ret = systemAbilityManager->SubscribeSystemAbility(DISTRIBUTED_HARDWARE_INPUT_SOURCE_SA_ID, + saListenerCallback); + if (ret != DH_SUCCESS) { + DHLOGE("subscribe source sa change failed: %d", ret); + return; + } + isSubscribeSrcSAChangeListener.store(true); + } + + if (!isSubscribeSinkSAChangeListener.load()) { + DHLOGI("try subscribe sink sa change listener, sa id: %d", DISTRIBUTED_HARDWARE_INPUT_SINK_SA_ID); + int32_t ret = systemAbilityManager->SubscribeSystemAbility(DISTRIBUTED_HARDWARE_INPUT_SINK_SA_ID, + saListenerCallback); + if (ret != DH_SUCCESS) { + DHLOGE("subscribe sink sa change failed: %d", ret); + return; + } + isSubscribeSinkSAChangeListener.store(true); + } +} + DistributedInputClient &DistributedInputClient::GetInstance() { - static DistributedInputClient instance; - return instance; + return *instance.get(); } void DistributedInputClient::RegisterDInputCb::OnResult( @@ -92,6 +132,32 @@ void DistributedInputClient::DelWhiteListInfosCb::OnResult(const std::string& de DistributedInputClient::GetInstance().DelWhiteListInfos(deviceId); } +void DistributedInputClient::SystemAbilityListener::OnAddSystemAbility(int32_t systemAbilityId, + const std::string& deviceId) +{ + if (systemAbilityId == DISTRIBUTED_HARDWARE_INPUT_SOURCE_SA_ID) { + DistributedInputClient::GetInstance().dInputSourceSAOnline.store(true); + } else if (systemAbilityId == DISTRIBUTED_HARDWARE_INPUT_SINK_SA_ID) { + DistributedInputClient::GetInstance().dInputSinkSAOnline.store(true); + } + DHLOGI("sa %d is added.", systemAbilityId); +} + +void DistributedInputClient::SystemAbilityListener::OnRemoveSystemAbility(int32_t systemAbilityId, + const std::string& deviceId) +{ + if (systemAbilityId == DISTRIBUTED_HARDWARE_INPUT_SOURCE_SA_ID) { + DistributedInputClient::GetInstance().dInputSourceSAOnline.store(false); + std::lock_guard lock(DistributedInputClient::GetInstance().mutex_); + DistributedInputClient::GetInstance().dInputSourceProxy_ = nullptr; + } else if (systemAbilityId == DISTRIBUTED_HARDWARE_INPUT_SINK_SA_ID) { + DistributedInputClient::GetInstance().dInputSinkSAOnline.store(false); + std::lock_guard lock(DistributedInputClient::GetInstance().mutex_); + DistributedInputClient::GetInstance().dInputSinkProxy_ = nullptr; + } + DHLOGI("sa %d is removed.", systemAbilityId); +} + int32_t DistributedInputClient::InitSource() { if (!GetDInputSourceProxy()) { @@ -330,12 +396,38 @@ DInputServerType DistributedInputClient::IsStartDistributedInput(const uint32_t& bool DistributedInputClient::GetDInputSourceProxy() { - if (!dInputSourceProxy_) { + if (!isSubscribeSrcSAChangeListener.load()) { std::lock_guard lock(mutex_); + if (!isSubscribeSrcSAChangeListener.load()) { + sptr systemAbilityManager = + SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); + if (!systemAbilityManager) { + DHLOGE("get system ability manager failed."); + return false; + } + + DHLOGI("try subscribe source sa change listener, sa id: %d", DISTRIBUTED_HARDWARE_INPUT_SOURCE_SA_ID); + int32_t ret = systemAbilityManager->SubscribeSystemAbility(DISTRIBUTED_HARDWARE_INPUT_SOURCE_SA_ID, + saListenerCallback); + if (ret != DH_SUCCESS) { + DHLOGE("subscribe source sa change failed: %d", ret); + return false; + } + isSubscribeSrcSAChangeListener.store(true); + } + } + + if (dInputSourceSAOnline.load() && !dInputSourceProxy_) { + std::lock_guard lock(mutex_); + if (dInputSourceProxy_ != nullptr) { + DHLOGI("dinput source proxy has already got."); + return true; + } sptr systemAbilityManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); if (!systemAbilityManager) { + DHLOGE("get system ability manager failed."); return false; } DHLOGI("%s try get sa: %d", __func__, DISTRIBUTED_HARDWARE_INPUT_SOURCE_SA_ID); @@ -351,7 +443,7 @@ bool DistributedInputClient::GetDInputSourceProxy() return false; } } - return true; + return dInputSourceProxy_ != nullptr; } bool DistributedInputClient::HasDInputSourceProxy() @@ -388,11 +480,37 @@ bool DistributedInputClient::SetDInputSinkProxy(const sptr &remot bool DistributedInputClient::GetDInputSinkProxy() { - if (!dInputSinkProxy_) { + if (!isSubscribeSinkSAChangeListener.load()) { std::lock_guard lock(mutex_); + if (!isSubscribeSinkSAChangeListener.load()) { + sptr systemAbilityManager = + SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); + if (!systemAbilityManager) { + DHLOGE("get system ability manager failed."); + return false; + } + + DHLOGI("try subscribe sink sa change listener, sa id: %d", DISTRIBUTED_HARDWARE_INPUT_SINK_SA_ID); + int32_t ret = systemAbilityManager->SubscribeSystemAbility(DISTRIBUTED_HARDWARE_INPUT_SINK_SA_ID, + saListenerCallback); + if (ret != DH_SUCCESS) { + DHLOGE("subscribe sink sa change failed: %d", ret); + return false; + } + isSubscribeSinkSAChangeListener.store(true); + } + } + + if (dInputSinkSAOnline.load() && !dInputSinkProxy_) { + std::lock_guard lock(mutex_); + if (dInputSinkProxy_ != nullptr) { + DHLOGI("dinput sink proxy has already got."); + return true; + } sptr systemAbilityManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); if (!systemAbilityManager) { + DHLOGE("get system ability manager failed."); return false; } @@ -408,7 +526,7 @@ bool DistributedInputClient::GetDInputSinkProxy() return false; } } - return true; + return dInputSinkProxy_ != nullptr; } bool DistributedInputClient::IsJsonData(std::string strData) const diff --git a/services/source/inputinject/src/distributed_input_inject.cpp b/services/source/inputinject/src/distributed_input_inject.cpp index 744360a..3c52ce1 100644 --- a/services/source/inputinject/src/distributed_input_inject.cpp +++ b/services/source/inputinject/src/distributed_input_inject.cpp @@ -103,7 +103,7 @@ int32_t DistributedInputInject::RegisterDistributedEvent(RawEvent* buffer, size_ DHLOGE("the DistributedInputNodeManager is null\n"); return ERR_DH_INPUT_SERVER_SOURCE_INJECT_NODE_MANAGER_IS_NULL; } - DHLOGE("RegisterDistributedEvent start %zu\n", bufferSize); + DHLOGI("RegisterDistributedEvent start %zu\n", bufferSize); for (size_t i = 0; i < bufferSize; i++) { inputNodeManager_->ReportEvent(buffer[i]); } diff --git a/services/source/inputinject/src/virtual_device.cpp b/services/source/inputinject/src/virtual_device.cpp index a4aefb1..3f5352e 100644 --- a/services/source/inputinject/src/virtual_device.cpp +++ b/services/source/inputinject/src/virtual_device.cpp @@ -152,7 +152,7 @@ bool VirtualDevice::InjectInputEvent(const input_event& event) return false; } RecordEventLog(event); - DHLOGE("InjectInputEvent end\n"); + DHLOGI("InjectInputEvent end\n"); return true; } diff --git a/services/source/transport/src/distributed_input_source_transport.cpp b/services/source/transport/src/distributed_input_source_transport.cpp index dc0d225..7eb21af 100644 --- a/services/source/transport/src/distributed_input_source_transport.cpp +++ b/services/source/transport/src/distributed_input_source_transport.cpp @@ -158,7 +158,10 @@ int32_t DistributedInputSourceTransport::OpenInputSoftbus(const std::string &rem GetAnonyString(remoteDevId).c_str(), GetAnonyInt32(sessionId).c_str()); return ERR_DH_INPUT_SERVER_SOURCE_TRANSPORT_OPEN_SESSION_FAIL; } - + { + std::unique_lock sessionLock(operationMutex_); + sessionDevMap_[remoteDevId] = sessionId; + } DHLOGI("Wait for channel session opened."); { std::unique_lock waitLock(operationMutex_); @@ -173,10 +176,6 @@ int32_t DistributedInputSourceTransport::OpenInputSoftbus(const std::string &rem DHLOGI("OpenSession success, remoteDevId:%s, sessionId:%s", GetAnonyString(remoteDevId).c_str(), GetAnonyInt32(sessionId).c_str()); - { - std::unique_lock sessionLock(operationMutex_); - sessionDevMap_[remoteDevId] = sessionId; - } return DH_SUCCESS; }