• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "multimodal_input_connect_manager.h"
17 
18 #include <chrono>
19 #include <thread>
20 
21 #include "iservice_registry.h"
22 #include "system_ability_definition.h"
23 
24 #include "mmi_log.h"
25 #include "multimodal_input_connect_death_recipient.h"
26 #include "multimodal_input_connect_define.h"
27 #include "util.h"
28 
29 namespace OHOS {
30 namespace MMI {
31 namespace {
32 std::shared_ptr<MultimodalInputConnectManager> g_instance = nullptr;
33 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, MMI_LOG_DOMAIN, "MultimodalInputConnectManager"};
34 } // namespace
35 
GetInstance()36 std::shared_ptr<MultimodalInputConnectManager> MultimodalInputConnectManager::GetInstance()
37 {
38     static std::once_flag flag;
39     std::call_once(flag, [&]() {
40         g_instance.reset(new (std::nothrow) MultimodalInputConnectManager());
41     });
42 
43     CHKPP(g_instance);
44     if (g_instance != nullptr) {
45         g_instance->ConnectMultimodalInputService();
46     }
47     return g_instance;
48 }
49 
AllocSocketPair(const int32_t moduleType)50 int32_t MultimodalInputConnectManager::AllocSocketPair(const int32_t moduleType)
51 {
52     CALL_DEBUG_ENTER;
53     std::lock_guard<std::mutex> guard(lock_);
54     if (multimodalInputConnectService_ == nullptr) {
55         MMI_HILOGE("Client has not connect server");
56         return RET_ERR;
57     }
58 
59     const std::string programName(GetProgramName());
60     int32_t result = multimodalInputConnectService_->AllocSocketFd(programName, moduleType, socketFd_, tokenType_);
61     if (result != RET_OK) {
62         MMI_HILOGE("AllocSocketFd has error:%{public}d", result);
63         return RET_ERR;
64     }
65 
66     MMI_HILOGI("AllocSocketPair success. socketFd_:%{public}d tokenType_:%{public}d", socketFd_, tokenType_);
67     return RET_OK;
68 }
69 
GetClientSocketFdOfAllocedSocketPair() const70 int32_t MultimodalInputConnectManager::GetClientSocketFdOfAllocedSocketPair() const
71 {
72     CALL_DEBUG_ENTER;
73     return socketFd_;
74 }
75 
AddInputEventFilter(sptr<IEventFilter> filter)76 int32_t MultimodalInputConnectManager::AddInputEventFilter(sptr<IEventFilter> filter)
77 {
78     std::lock_guard<std::mutex> guard(lock_);
79     if (multimodalInputConnectService_ == nullptr) {
80         MMI_HILOGE("The multimodalInputConnectService_ is nullptr");
81         return RET_ERR;
82     }
83     return multimodalInputConnectService_->AddInputEventFilter(filter);
84 }
85 
SetPointerVisible(bool visible)86 int32_t MultimodalInputConnectManager::SetPointerVisible(bool visible)
87 {
88     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
89     return multimodalInputConnectService_->SetPointerVisible(visible);
90 }
91 
IsPointerVisible(bool & visible)92 int32_t MultimodalInputConnectManager::IsPointerVisible(bool &visible)
93 {
94     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
95     return multimodalInputConnectService_->IsPointerVisible(visible);
96 }
97 
SetPointerSpeed(int32_t speed)98 int32_t MultimodalInputConnectManager::SetPointerSpeed(int32_t speed)
99 {
100     CHKPR(multimodalInputConnectService_, RET_ERR);
101     return multimodalInputConnectService_->SetPointerSpeed(speed);
102 }
103 
GetPointerSpeed(int32_t & speed)104 int32_t MultimodalInputConnectManager::GetPointerSpeed(int32_t &speed)
105 {
106     CHKPR(multimodalInputConnectService_, RET_ERR);
107     return multimodalInputConnectService_->GetPointerSpeed(speed);
108 }
109 
SetPointerStyle(int32_t windowId,int32_t pointerStyle)110 int32_t MultimodalInputConnectManager::SetPointerStyle(int32_t windowId, int32_t pointerStyle)
111 {
112     CHKPR(multimodalInputConnectService_, RET_ERR);
113     return multimodalInputConnectService_->SetPointerStyle(windowId, pointerStyle);
114 }
115 
GetPointerStyle(int32_t windowId,int32_t & pointerStyle)116 int32_t MultimodalInputConnectManager::GetPointerStyle(int32_t windowId, int32_t &pointerStyle)
117 {
118     CHKPR(multimodalInputConnectService_, RET_ERR);
119     return multimodalInputConnectService_->GetPointerStyle(windowId, pointerStyle);
120 }
121 
RegisterDevListener()122 int32_t MultimodalInputConnectManager::RegisterDevListener()
123 {
124     CHKPR(multimodalInputConnectService_, RET_ERR);
125     return multimodalInputConnectService_->RegisterDevListener();
126 }
127 
UnregisterDevListener()128 int32_t MultimodalInputConnectManager::UnregisterDevListener()
129 {
130     CHKPR(multimodalInputConnectService_, RET_ERR);
131     return multimodalInputConnectService_->UnregisterDevListener();
132 }
133 
SupportKeys(int32_t userData,int32_t deviceId,std::vector<int32_t> & keys)134 int32_t MultimodalInputConnectManager::SupportKeys(int32_t userData, int32_t deviceId, std::vector<int32_t> &keys)
135 {
136     CHKPR(multimodalInputConnectService_, RET_ERR);
137     return multimodalInputConnectService_->SupportKeys(userData, deviceId, keys);
138 }
139 
GetDeviceIds(int32_t userData)140 int32_t MultimodalInputConnectManager::GetDeviceIds(int32_t userData)
141 {
142     CHKPR(multimodalInputConnectService_, RET_ERR);
143     return multimodalInputConnectService_->GetDeviceIds(userData);
144 }
145 
GetDevice(int32_t userData,int32_t id)146 int32_t MultimodalInputConnectManager::GetDevice(int32_t userData, int32_t id)
147 {
148     CHKPR(multimodalInputConnectService_, RET_ERR);
149     return multimodalInputConnectService_->GetDevice(userData, id);
150 }
151 
GetKeyboardType(int32_t userData,int32_t deviceId)152 int32_t MultimodalInputConnectManager::GetKeyboardType(int32_t userData, int32_t deviceId)
153 {
154     CHKPR(multimodalInputConnectService_, RET_ERR);
155     return multimodalInputConnectService_->GetKeyboardType(userData, deviceId);
156 }
157 
AddInputHandler(InputHandlerType handlerType,HandleEventType eventType)158 int32_t MultimodalInputConnectManager::AddInputHandler(InputHandlerType handlerType, HandleEventType eventType)
159 {
160     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
161     return multimodalInputConnectService_->AddInputHandler(handlerType, eventType);
162 }
163 
RemoveInputHandler(InputHandlerType handlerType,HandleEventType eventType)164 int32_t MultimodalInputConnectManager::RemoveInputHandler(InputHandlerType handlerType, HandleEventType eventType)
165 {
166     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
167     return multimodalInputConnectService_->RemoveInputHandler(handlerType, eventType);
168 }
169 
MarkEventConsumed(int32_t eventId)170 int32_t MultimodalInputConnectManager::MarkEventConsumed(int32_t eventId)
171 {
172     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
173     return multimodalInputConnectService_->MarkEventConsumed(eventId);
174 }
175 
SubscribeKeyEvent(int32_t subscribeId,const std::shared_ptr<KeyOption> option)176 int32_t MultimodalInputConnectManager::SubscribeKeyEvent(int32_t subscribeId, const std::shared_ptr<KeyOption> option)
177 {
178     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
179     return multimodalInputConnectService_->SubscribeKeyEvent(subscribeId, option);
180 }
181 
UnsubscribeKeyEvent(int32_t subscribeId)182 int32_t MultimodalInputConnectManager::UnsubscribeKeyEvent(int32_t subscribeId)
183 {
184     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
185     return multimodalInputConnectService_->UnsubscribeKeyEvent(subscribeId);
186 }
187 
MoveMouseEvent(int32_t offsetX,int32_t offsetY)188 int32_t MultimodalInputConnectManager::MoveMouseEvent(int32_t offsetX, int32_t offsetY)
189 {
190     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
191     return multimodalInputConnectService_->MoveMouseEvent(offsetX, offsetY);
192 }
193 
InjectKeyEvent(const std::shared_ptr<KeyEvent> event)194 int32_t MultimodalInputConnectManager::InjectKeyEvent(const std::shared_ptr<KeyEvent> event)
195 {
196     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
197     return multimodalInputConnectService_->InjectKeyEvent(event);
198 }
199 
InjectPointerEvent(const std::shared_ptr<PointerEvent> pointerEvent)200 int32_t MultimodalInputConnectManager::InjectPointerEvent(const std::shared_ptr<PointerEvent> pointerEvent)
201 {
202     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
203     return multimodalInputConnectService_->InjectPointerEvent(pointerEvent);
204 }
205 
SetAnrObserver()206 int32_t MultimodalInputConnectManager::SetAnrObserver()
207 {
208     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
209     return multimodalInputConnectService_->SetAnrObserver();
210 }
211 
RegisterCooperateListener()212 int32_t MultimodalInputConnectManager::RegisterCooperateListener()
213 {
214     CHKPR(multimodalInputConnectService_, RET_ERR);
215     return multimodalInputConnectService_->RegisterCooperateListener();
216 }
217 
UnregisterCooperateListener()218 int32_t MultimodalInputConnectManager::UnregisterCooperateListener()
219 {
220     CHKPR(multimodalInputConnectService_, RET_ERR);
221     return multimodalInputConnectService_->UnregisterCooperateListener();
222 }
223 
EnableInputDeviceCooperate(int32_t userData,bool enabled)224 int32_t MultimodalInputConnectManager::EnableInputDeviceCooperate(int32_t userData, bool enabled)
225 {
226     CHKPR(multimodalInputConnectService_, RET_ERR);
227     return multimodalInputConnectService_->EnableInputDeviceCooperate(userData, enabled);
228 }
229 
StartInputDeviceCooperate(int32_t userData,const std::string & sinkDeviceId,int32_t srcInputDeviceId)230 int32_t MultimodalInputConnectManager::StartInputDeviceCooperate(int32_t userData,
231     const std::string &sinkDeviceId, int32_t srcInputDeviceId)
232 {
233     CHKPR(multimodalInputConnectService_, RET_ERR);
234     return multimodalInputConnectService_->StartInputDeviceCooperate(userData, sinkDeviceId, srcInputDeviceId);
235 }
236 
StopDeviceCooperate(int32_t userData)237 int32_t MultimodalInputConnectManager::StopDeviceCooperate(int32_t userData)
238 {
239     CHKPR(multimodalInputConnectService_, RET_ERR);
240     return multimodalInputConnectService_->StopDeviceCooperate(userData);
241 }
242 
GetInputDeviceCooperateState(int32_t userData,const std::string & deviceId)243 int32_t MultimodalInputConnectManager::GetInputDeviceCooperateState(int32_t userData, const std::string &deviceId)
244 {
245     CHKPR(multimodalInputConnectService_, RET_ERR);
246     return multimodalInputConnectService_->GetInputDeviceCooperateState(userData, deviceId);
247 }
248 
SetInputDevice(const std::string & dhid,const std::string & screenId)249 int32_t MultimodalInputConnectManager::SetInputDevice(const std::string& dhid, const std::string& screenId)
250 {
251     CHKPR(multimodalInputConnectService_, RET_ERR);
252     return multimodalInputConnectService_->SetInputDevice(dhid, screenId);
253 }
254 
GetFunctionKeyState(int32_t funcKey,bool & state)255 int32_t MultimodalInputConnectManager::GetFunctionKeyState(int32_t funcKey, bool &state)
256 {
257     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
258     return multimodalInputConnectService_->GetFunctionKeyState(funcKey, state);
259 }
260 
SetFunctionKeyState(int32_t funcKey,bool enable)261 int32_t MultimodalInputConnectManager::SetFunctionKeyState(int32_t funcKey, bool enable)
262 {
263     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
264     return multimodalInputConnectService_->SetFunctionKeyState(funcKey, enable);
265 }
266 
ConnectMultimodalInputService()267 bool MultimodalInputConnectManager::ConnectMultimodalInputService()
268 {
269     CALL_DEBUG_ENTER;
270     std::lock_guard<std::mutex> guard(lock_);
271     if (multimodalInputConnectService_ != nullptr) {
272         return true;
273     }
274     auto sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
275     if (sm == nullptr) {
276         MMI_HILOGE("Get system ability manager failed");
277         return false;
278     }
279     auto sa = sm->GetSystemAbility(IMultimodalInputConnect::MULTIMODAL_INPUT_CONNECT_SERVICE_ID);
280     if (sa == nullptr) {
281         MMI_HILOGE("Get sa failed");
282         return false;
283     }
284 
285     std::weak_ptr<MultimodalInputConnectManager> weakPtr = shared_from_this();
286     auto deathCallback = [weakPtr](const wptr<IRemoteObject> &object) {
287         auto sharedPtr = weakPtr.lock();
288         if (sharedPtr != nullptr) {
289             sharedPtr->OnDeath();
290         }
291     };
292 
293     multimodalInputConnectRecipient_ = new (std::nothrow) MultimodalInputConnectDeathRecipient(deathCallback);
294     CHKPF(multimodalInputConnectRecipient_);
295     sa->AddDeathRecipient(multimodalInputConnectRecipient_);
296     multimodalInputConnectService_ = iface_cast<IMultimodalInputConnect>(sa);
297     if (multimodalInputConnectService_ == nullptr) {
298         MMI_HILOGE("Get multimodalinput service failed");
299         return false;
300     }
301     MMI_HILOGI("Get multimodalinput service successful");
302     return true;
303 }
304 
OnDeath()305 void MultimodalInputConnectManager::OnDeath()
306 {
307     CALL_DEBUG_ENTER;
308     Clean();
309     NotifyDeath();
310 }
311 
Clean()312 void MultimodalInputConnectManager::Clean()
313 {
314     CALL_DEBUG_ENTER;
315     std::lock_guard<std::mutex> guard(lock_);
316     if (multimodalInputConnectService_ != nullptr) {
317         multimodalInputConnectService_.clear();
318         multimodalInputConnectService_ = nullptr;
319     }
320 
321     if (multimodalInputConnectRecipient_ != nullptr) {
322         multimodalInputConnectRecipient_.clear();
323         multimodalInputConnectRecipient_ = nullptr;
324     }
325 }
326 
NotifyDeath()327 void MultimodalInputConnectManager::NotifyDeath()
328 {
329     CALL_DEBUG_ENTER;
330 
331     int32_t retryCount = 50;
332     do {
333         std::this_thread::sleep_for(std::chrono::seconds(1));
334         if (ConnectMultimodalInputService()) {
335             MMI_HILOGD("Connect multimodalinput service successful");
336             return;
337         }
338     } while (--retryCount > 0);
339 }
340 } // namespace MMI
341 } // namespace OHOS
342