• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2024 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, [&]() { g_instance.reset(new (std::nothrow) MultimodalInputConnectManager()); });
40 
41     CHKPP(g_instance);
42     if (g_instance != nullptr) {
43         g_instance->ConnectMultimodalInputService();
44     }
45     return g_instance;
46 }
47 
AllocSocketPair(const int32_t moduleType)48 int32_t MultimodalInputConnectManager::AllocSocketPair(const int32_t moduleType)
49 {
50     CALL_DEBUG_ENTER;
51     std::lock_guard<std::mutex> guard(lock_);
52     if (multimodalInputConnectService_ == nullptr) {
53         MMI_HILOGE("Client has not connect server");
54         return RET_ERR;
55     }
56 
57     const std::string programName(GetProgramName());
58     int32_t result = multimodalInputConnectService_->AllocSocketFd(programName, moduleType, socketFd_, tokenType_);
59     if (result != RET_OK) {
60         MMI_HILOGE("AllocSocketFd has error:%{public}d", result);
61         return RET_ERR;
62     }
63 
64     MMI_HILOGD("AllocSocketPair success. socketFd_:%{public}d tokenType_:%{public}d", socketFd_, tokenType_);
65     return RET_OK;
66 }
67 
GetClientSocketFdOfAllocedSocketPair() const68 int32_t MultimodalInputConnectManager::GetClientSocketFdOfAllocedSocketPair() const
69 {
70     CALL_DEBUG_ENTER;
71     return socketFd_;
72 }
73 
GetDisplayBindInfo(DisplayBindInfos & infos)74 int32_t MultimodalInputConnectManager::GetDisplayBindInfo(DisplayBindInfos &infos)
75 {
76     std::lock_guard<std::mutex> guard(lock_);
77     if (multimodalInputConnectService_ == nullptr) {
78         MMI_HILOGE("The multimodalInputConnectService_ is nullptr");
79         return RET_ERR;
80     }
81     return multimodalInputConnectService_->GetDisplayBindInfo(infos);
82 }
83 
GetAllMmiSubscribedEvents(std::map<std::tuple<int32_t,int32_t,std::string>,int32_t> & datas)84 int32_t MultimodalInputConnectManager::GetAllMmiSubscribedEvents(std::map<std::tuple<int32_t, int32_t, std::string>,
85     int32_t> &datas)
86 {
87     std::lock_guard<std::mutex> guard(lock_);
88     if (multimodalInputConnectService_ == nullptr) {
89         MMI_HILOGE("The multimodalInputConnectService_ is nullptr");
90         return RET_ERR;
91     }
92     return multimodalInputConnectService_->GetAllMmiSubscribedEvents(datas);
93 }
94 
SetDisplayBind(int32_t deviceId,int32_t displayId,std::string & msg)95 int32_t MultimodalInputConnectManager::SetDisplayBind(int32_t deviceId, int32_t displayId, std::string &msg)
96 {
97     std::lock_guard<std::mutex> guard(lock_);
98     if (multimodalInputConnectService_ == nullptr) {
99         MMI_HILOGE("The multimodalInputConnectService_ is nullptr");
100         return RET_ERR;
101     }
102     return multimodalInputConnectService_->SetDisplayBind(deviceId, displayId, msg);
103 }
104 
GetWindowPid(int32_t windowId)105 int32_t MultimodalInputConnectManager::GetWindowPid(int32_t windowId)
106 {
107     std::lock_guard<std::mutex> guard(lock_);
108     if (multimodalInputConnectService_ == nullptr) {
109         MMI_HILOGE("The multimodalInputConnectService_ is nullptr");
110         return RET_ERR;
111     }
112     return multimodalInputConnectService_->GetWindowPid(windowId);
113 }
114 
AddInputEventFilter(sptr<IEventFilter> filter,int32_t filterId,int32_t priority,uint32_t deviceTags)115 int32_t MultimodalInputConnectManager::AddInputEventFilter(sptr<IEventFilter> filter, int32_t filterId,
116     int32_t priority, uint32_t deviceTags)
117 {
118     std::lock_guard<std::mutex> guard(lock_);
119     if (multimodalInputConnectService_ == nullptr) {
120         MMI_HILOGE("The multimodalInputConnectService_ is nullptr");
121         return RET_ERR;
122     }
123     return multimodalInputConnectService_->AddInputEventFilter(filter, filterId, priority, deviceTags);
124 }
125 
NotifyNapOnline()126 int32_t MultimodalInputConnectManager::NotifyNapOnline()
127 {
128     std::lock_guard<std::mutex> guard(lock_);
129     if (multimodalInputConnectService_ == nullptr) {
130         MMI_HILOGE("The multimodalInputConnectService_ is nullptr");
131         return RET_ERR;
132     }
133     return multimodalInputConnectService_->NotifyNapOnline();
134 }
135 
RemoveInputEventObserver()136 int32_t MultimodalInputConnectManager::RemoveInputEventObserver()
137 {
138     std::lock_guard<std::mutex> guard(lock_);
139     if (multimodalInputConnectService_ == nullptr) {
140         MMI_HILOGE("The multimodalInputConnectService_ is nullptr");
141         return RET_ERR;
142     }
143     return multimodalInputConnectService_->RemoveInputEventObserver();
144 }
145 
RemoveInputEventFilter(int32_t filterId)146 int32_t MultimodalInputConnectManager::RemoveInputEventFilter(int32_t filterId)
147 {
148     std::lock_guard<std::mutex> guard(lock_);
149     if (multimodalInputConnectService_ == nullptr) {
150         MMI_HILOGE("The multimodalInputConnectService_ is nullptr");
151         return RET_ERR;
152     }
153     return multimodalInputConnectService_->RemoveInputEventFilter(filterId);
154 }
155 
SetMouseScrollRows(int32_t rows)156 int32_t MultimodalInputConnectManager::SetMouseScrollRows(int32_t rows)
157 {
158     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
159     return multimodalInputConnectService_->SetMouseScrollRows(rows);
160 }
161 
SetCustomCursor(int32_t pid,int32_t windowId,int32_t focusX,int32_t focusY,void * pixelMap)162 int32_t MultimodalInputConnectManager::SetCustomCursor(int32_t pid, int32_t windowId, int32_t focusX, int32_t focusY,
163     void* pixelMap)
164 {
165     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
166     return multimodalInputConnectService_->SetCustomCursor(pid, windowId, focusX, focusY, pixelMap);
167 }
168 
SetMouseIcon(int32_t pid,int32_t windowId,void * pixelMap)169 int32_t MultimodalInputConnectManager::SetMouseIcon(int32_t pid, int32_t windowId, void* pixelMap)
170 {
171     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
172     return multimodalInputConnectService_->SetMouseIcon(pid, windowId, pixelMap);
173 }
174 
SetMouseHotSpot(int32_t pid,int32_t windowId,int32_t hotSpotX,int32_t hotSpotY)175 int32_t MultimodalInputConnectManager::SetMouseHotSpot(
176     int32_t pid, int32_t windowId, int32_t hotSpotX, int32_t hotSpotY)
177 {
178     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
179     return multimodalInputConnectService_->SetMouseHotSpot(pid, windowId, hotSpotX, hotSpotY);
180 }
181 
GetMouseScrollRows(int32_t & rows)182 int32_t MultimodalInputConnectManager::GetMouseScrollRows(int32_t &rows)
183 {
184     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
185     return multimodalInputConnectService_->GetMouseScrollRows(rows);
186 }
187 
SetPointerSize(int32_t size)188 int32_t MultimodalInputConnectManager::SetPointerSize(int32_t size)
189 {
190     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
191     return multimodalInputConnectService_->SetPointerSize(size);
192 }
193 
SetNapStatus(int32_t pid,int32_t uid,std::string bundleName,int32_t napStatus)194 int32_t MultimodalInputConnectManager::SetNapStatus(int32_t pid, int32_t uid, std::string bundleName, int32_t napStatus)
195 {
196     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
197     return multimodalInputConnectService_->SetNapStatus(pid, uid, bundleName, napStatus);
198 }
199 
GetPointerSize(int32_t & size)200 int32_t MultimodalInputConnectManager::GetPointerSize(int32_t &size)
201 {
202     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
203     return multimodalInputConnectService_->GetPointerSize(size);
204 }
205 
SetMousePrimaryButton(int32_t primaryButton)206 int32_t MultimodalInputConnectManager::SetMousePrimaryButton(int32_t primaryButton)
207 {
208     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
209     return multimodalInputConnectService_->SetMousePrimaryButton(primaryButton);
210 }
211 
GetMousePrimaryButton(int32_t & primaryButton)212 int32_t MultimodalInputConnectManager::GetMousePrimaryButton(int32_t &primaryButton)
213 {
214     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
215     return multimodalInputConnectService_->GetMousePrimaryButton(primaryButton);
216 }
217 
SetHoverScrollState(bool state)218 int32_t MultimodalInputConnectManager::SetHoverScrollState(bool state)
219 {
220     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
221     return multimodalInputConnectService_->SetHoverScrollState(state);
222 }
223 
GetHoverScrollState(bool & state)224 int32_t MultimodalInputConnectManager::GetHoverScrollState(bool &state)
225 {
226     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
227     return multimodalInputConnectService_->GetHoverScrollState(state);
228 }
229 
SetPointerVisible(bool visible)230 int32_t MultimodalInputConnectManager::SetPointerVisible(bool visible)
231 {
232     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
233     return multimodalInputConnectService_->SetPointerVisible(visible);
234 }
235 
IsPointerVisible(bool & visible)236 int32_t MultimodalInputConnectManager::IsPointerVisible(bool &visible)
237 {
238     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
239     return multimodalInputConnectService_->IsPointerVisible(visible);
240 }
241 
MarkProcessed(int32_t eventType,int32_t eventId)242 int32_t MultimodalInputConnectManager::MarkProcessed(int32_t eventType, int32_t eventId)
243 {
244     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
245     return multimodalInputConnectService_->MarkProcessed(eventType, eventId);
246 }
247 
SetPointerColor(int32_t color)248 int32_t MultimodalInputConnectManager::SetPointerColor(int32_t color)
249 {
250     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
251     return multimodalInputConnectService_->SetPointerColor(color);
252 }
253 
GetPointerColor(int32_t & color)254 int32_t MultimodalInputConnectManager::GetPointerColor(int32_t &color)
255 {
256     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
257     return multimodalInputConnectService_->GetPointerColor(color);
258 }
259 
SetPointerSpeed(int32_t speed)260 int32_t MultimodalInputConnectManager::SetPointerSpeed(int32_t speed)
261 {
262     CHKPR(multimodalInputConnectService_, RET_ERR);
263     return multimodalInputConnectService_->SetPointerSpeed(speed);
264 }
265 
GetPointerSpeed(int32_t & speed)266 int32_t MultimodalInputConnectManager::GetPointerSpeed(int32_t &speed)
267 {
268     CHKPR(multimodalInputConnectService_, RET_ERR);
269     return multimodalInputConnectService_->GetPointerSpeed(speed);
270 }
271 
SetPointerStyle(int32_t windowId,PointerStyle pointerStyle)272 int32_t MultimodalInputConnectManager::SetPointerStyle(int32_t windowId, PointerStyle pointerStyle)
273 {
274     CHKPR(multimodalInputConnectService_, RET_ERR);
275     return multimodalInputConnectService_->SetPointerStyle(windowId, pointerStyle);
276 }
277 
ClearWindowPointerStyle(int32_t pid,int32_t windowId)278 int32_t MultimodalInputConnectManager::ClearWindowPointerStyle(int32_t pid, int32_t windowId)
279 {
280     CHKPR(multimodalInputConnectService_, RET_ERR);
281     return multimodalInputConnectService_->ClearWindowPointerStyle(pid, windowId);
282 }
283 
GetPointerStyle(int32_t windowId,PointerStyle & pointerStyle)284 int32_t MultimodalInputConnectManager::GetPointerStyle(int32_t windowId, PointerStyle &pointerStyle)
285 {
286     CHKPR(multimodalInputConnectService_, RET_ERR);
287     return multimodalInputConnectService_->GetPointerStyle(windowId, pointerStyle);
288 }
289 
RegisterDevListener()290 int32_t MultimodalInputConnectManager::RegisterDevListener()
291 {
292     CHKPR(multimodalInputConnectService_, RET_ERR);
293     return multimodalInputConnectService_->RegisterDevListener();
294 }
295 
UnregisterDevListener()296 int32_t MultimodalInputConnectManager::UnregisterDevListener()
297 {
298     CHKPR(multimodalInputConnectService_, RET_ERR);
299     return multimodalInputConnectService_->UnregisterDevListener();
300 }
301 
SupportKeys(int32_t deviceId,std::vector<int32_t> & keys,std::vector<bool> & keystroke)302 int32_t MultimodalInputConnectManager::SupportKeys(int32_t deviceId, std::vector<int32_t> &keys,
303     std::vector<bool> &keystroke)
304 {
305     CHKPR(multimodalInputConnectService_, RET_ERR);
306     return multimodalInputConnectService_->SupportKeys(deviceId, keys, keystroke);
307 }
308 
GetDeviceIds(std::vector<int32_t> & ids)309 int32_t MultimodalInputConnectManager::GetDeviceIds(std::vector<int32_t> &ids)
310 {
311     CHKPR(multimodalInputConnectService_, RET_ERR);
312     return multimodalInputConnectService_->GetDeviceIds(ids);
313 }
314 
GetDevice(int32_t deviceId,std::shared_ptr<InputDevice> & inputDevice)315 int32_t MultimodalInputConnectManager::GetDevice(int32_t deviceId, std::shared_ptr<InputDevice> &inputDevice)
316 {
317     CHKPR(multimodalInputConnectService_, RET_ERR);
318     return multimodalInputConnectService_->GetDevice(deviceId, inputDevice);
319 }
320 
GetKeyboardType(int32_t deviceId,int32_t & keyboardType)321 int32_t MultimodalInputConnectManager::GetKeyboardType(int32_t deviceId, int32_t &keyboardType)
322 {
323     CHKPR(multimodalInputConnectService_, RET_ERR);
324     return multimodalInputConnectService_->GetKeyboardType(deviceId, keyboardType);
325 }
326 
SetKeyboardRepeatDelay(int32_t delay)327 int32_t MultimodalInputConnectManager::SetKeyboardRepeatDelay(int32_t delay)
328 {
329     CHKPR(multimodalInputConnectService_, RET_ERR);
330     return multimodalInputConnectService_->SetKeyboardRepeatDelay(delay);
331 }
332 
SetKeyboardRepeatRate(int32_t rate)333 int32_t MultimodalInputConnectManager::SetKeyboardRepeatRate(int32_t rate)
334 {
335     CHKPR(multimodalInputConnectService_, RET_ERR);
336     return multimodalInputConnectService_->SetKeyboardRepeatRate(rate);
337 }
338 
GetKeyboardRepeatDelay(int32_t & delay)339 int32_t MultimodalInputConnectManager::GetKeyboardRepeatDelay(int32_t &delay)
340 {
341     CHKPR(multimodalInputConnectService_, RET_ERR);
342     return multimodalInputConnectService_->GetKeyboardRepeatDelay(delay);
343 }
344 
GetKeyboardRepeatRate(int32_t & rate)345 int32_t MultimodalInputConnectManager::GetKeyboardRepeatRate(int32_t &rate)
346 {
347     CHKPR(multimodalInputConnectService_, RET_ERR);
348     return multimodalInputConnectService_->GetKeyboardRepeatRate(rate);
349 }
350 
AddInputHandler(InputHandlerType handlerType,HandleEventType eventType,int32_t priority,uint32_t deviceTags)351 int32_t MultimodalInputConnectManager::AddInputHandler(InputHandlerType handlerType, HandleEventType eventType,
352     int32_t priority, uint32_t deviceTags)
353 {
354     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
355     return multimodalInputConnectService_->AddInputHandler(handlerType, eventType, priority, deviceTags);
356 }
357 
RemoveInputHandler(InputHandlerType handlerType,HandleEventType eventType,int32_t priority,uint32_t deviceTags)358 int32_t MultimodalInputConnectManager::RemoveInputHandler(InputHandlerType handlerType, HandleEventType eventType,
359     int32_t priority, uint32_t deviceTags)
360 {
361     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
362     return multimodalInputConnectService_->RemoveInputHandler(handlerType, eventType, priority, deviceTags);
363 }
364 
MarkEventConsumed(int32_t eventId)365 int32_t MultimodalInputConnectManager::MarkEventConsumed(int32_t eventId)
366 {
367     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
368     return multimodalInputConnectService_->MarkEventConsumed(eventId);
369 }
370 
SubscribeKeyEvent(int32_t subscribeId,const std::shared_ptr<KeyOption> option)371 int32_t MultimodalInputConnectManager::SubscribeKeyEvent(int32_t subscribeId, const std::shared_ptr<KeyOption> option)
372 {
373     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
374     return multimodalInputConnectService_->SubscribeKeyEvent(subscribeId, option);
375 }
376 
UnsubscribeKeyEvent(int32_t subscribeId)377 int32_t MultimodalInputConnectManager::UnsubscribeKeyEvent(int32_t subscribeId)
378 {
379     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
380     return multimodalInputConnectService_->UnsubscribeKeyEvent(subscribeId);
381 }
382 
SubscribeSwitchEvent(int32_t subscribeId)383 int32_t MultimodalInputConnectManager::SubscribeSwitchEvent(int32_t subscribeId)
384 {
385     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
386     return multimodalInputConnectService_->SubscribeSwitchEvent(subscribeId);
387 }
388 
UnsubscribeSwitchEvent(int32_t subscribeId)389 int32_t MultimodalInputConnectManager::UnsubscribeSwitchEvent(int32_t subscribeId)
390 {
391     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
392     return multimodalInputConnectService_->SubscribeSwitchEvent(subscribeId);
393 }
394 
MoveMouseEvent(int32_t offsetX,int32_t offsetY)395 int32_t MultimodalInputConnectManager::MoveMouseEvent(int32_t offsetX, int32_t offsetY)
396 {
397     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
398     return multimodalInputConnectService_->MoveMouseEvent(offsetX, offsetY);
399 }
400 
InjectKeyEvent(const std::shared_ptr<KeyEvent> event)401 int32_t MultimodalInputConnectManager::InjectKeyEvent(const std::shared_ptr<KeyEvent> event)
402 {
403     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
404     return multimodalInputConnectService_->InjectKeyEvent(event);
405 }
406 
InjectPointerEvent(const std::shared_ptr<PointerEvent> pointerEvent)407 int32_t MultimodalInputConnectManager::InjectPointerEvent(const std::shared_ptr<PointerEvent> pointerEvent)
408 {
409     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
410     return multimodalInputConnectService_->InjectPointerEvent(pointerEvent);
411 }
412 
SetAnrObserver()413 int32_t MultimodalInputConnectManager::SetAnrObserver()
414 {
415     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
416     return multimodalInputConnectService_->SetAnrObserver();
417 }
418 
GetFunctionKeyState(int32_t funcKey,bool & state)419 int32_t MultimodalInputConnectManager::GetFunctionKeyState(int32_t funcKey, bool &state)
420 {
421     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
422     return multimodalInputConnectService_->GetFunctionKeyState(funcKey, state);
423 }
424 
SetFunctionKeyState(int32_t funcKey,bool enable)425 int32_t MultimodalInputConnectManager::SetFunctionKeyState(int32_t funcKey, bool enable)
426 {
427     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
428     return multimodalInputConnectService_->SetFunctionKeyState(funcKey, enable);
429 }
430 
SetPointerLocation(int32_t x,int32_t y)431 int32_t MultimodalInputConnectManager::SetPointerLocation(int32_t x, int32_t y)
432 {
433     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
434     return multimodalInputConnectService_->SetPointerLocation(x, y);
435 }
436 
ConnectMultimodalInputService()437 bool MultimodalInputConnectManager::ConnectMultimodalInputService()
438 {
439     CALL_DEBUG_ENTER;
440     std::lock_guard<std::mutex> guard(lock_);
441     if (multimodalInputConnectService_ != nullptr) {
442         return true;
443     }
444     auto sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
445     if (sm == nullptr) {
446         MMI_HILOGE("Get system ability manager failed");
447         return false;
448     }
449     auto sa = sm->GetSystemAbility(IMultimodalInputConnect::MULTIMODAL_INPUT_CONNECT_SERVICE_ID);
450     if (sa == nullptr) {
451         MMI_HILOGE("Get sa failed");
452         return false;
453     }
454 
455     std::weak_ptr<MultimodalInputConnectManager> weakPtr = shared_from_this();
456     auto deathCallback = [weakPtr](const wptr<IRemoteObject> &object) {
457         auto sharedPtr = weakPtr.lock();
458         if (sharedPtr != nullptr) {
459             sharedPtr->OnDeath();
460         }
461     };
462 
463     multimodalInputConnectRecipient_ = new (std::nothrow) MultimodalInputConnectDeathRecipient(deathCallback);
464     CHKPF(multimodalInputConnectRecipient_);
465     sa->AddDeathRecipient(multimodalInputConnectRecipient_);
466     multimodalInputConnectService_ = iface_cast<IMultimodalInputConnect>(sa);
467     if (multimodalInputConnectService_ == nullptr) {
468         MMI_HILOGE("Get multimodalinput service failed");
469         return false;
470     }
471     MMI_HILOGI("Get multimodalinput service successful");
472     return true;
473 }
474 
OnDeath()475 void MultimodalInputConnectManager::OnDeath()
476 {
477     CALL_DEBUG_ENTER;
478     Clean();
479     NotifyServiceDeath();
480     NotifyDeath();
481 }
482 
Clean()483 void MultimodalInputConnectManager::Clean()
484 {
485     CALL_DEBUG_ENTER;
486     std::lock_guard<std::mutex> guard(lock_);
487     if (multimodalInputConnectService_ != nullptr) {
488         multimodalInputConnectService_.clear();
489         multimodalInputConnectService_ = nullptr;
490     }
491 
492     if (multimodalInputConnectRecipient_ != nullptr) {
493         multimodalInputConnectRecipient_.clear();
494         multimodalInputConnectRecipient_ = nullptr;
495     }
496 }
497 
NotifyServiceDeath()498 void MultimodalInputConnectManager::NotifyServiceDeath()
499 {
500     std::lock_guard<std::mutex> guard(lock_);
501     for (const auto &watcher : watchers_) {
502         watcher->OnServiceDied();
503     }
504 }
505 
NotifyDeath()506 void MultimodalInputConnectManager::NotifyDeath()
507 {
508     CALL_DEBUG_ENTER;
509     int32_t retryCount = 50;
510     do {
511         std::this_thread::sleep_for(std::chrono::seconds(1));
512         if (ConnectMultimodalInputService()) {
513             MMI_HILOGD("Connect multimodalinput service successful");
514             return;
515         }
516     } while (--retryCount > 0);
517 }
518 
SetMouseCaptureMode(int32_t windowId,bool isCaptureMode)519 int32_t MultimodalInputConnectManager::SetMouseCaptureMode(int32_t windowId, bool isCaptureMode)
520 {
521     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
522     return multimodalInputConnectService_->SetMouseCaptureMode(windowId, isCaptureMode);
523 }
524 
AppendExtraData(const ExtraData & extraData)525 int32_t MultimodalInputConnectManager::AppendExtraData(const ExtraData &extraData)
526 {
527     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
528     return multimodalInputConnectService_->AppendExtraData(extraData);
529 }
530 
EnableCombineKey(bool enable)531 int32_t MultimodalInputConnectManager::EnableCombineKey(bool enable)
532 {
533     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
534     return multimodalInputConnectService_->EnableCombineKey(enable);
535 }
536 
EnableInputDevice(bool enable)537 int32_t MultimodalInputConnectManager::EnableInputDevice(bool enable)
538 {
539     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
540     return multimodalInputConnectService_->EnableInputDevice(enable);
541 }
542 
SetKeyDownDuration(const std::string & businessId,int32_t delay)543 int32_t MultimodalInputConnectManager::SetKeyDownDuration(const std::string &businessId, int32_t delay)
544 {
545     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
546     return multimodalInputConnectService_->SetKeyDownDuration(businessId, delay);
547 }
548 
SetTouchpadScrollSwitch(bool switchFlag)549 int32_t MultimodalInputConnectManager::SetTouchpadScrollSwitch(bool switchFlag)
550 {
551     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
552     return multimodalInputConnectService_->SetTouchpadScrollSwitch(switchFlag);
553 }
554 
GetTouchpadScrollSwitch(bool & switchFlag)555 int32_t MultimodalInputConnectManager::GetTouchpadScrollSwitch(bool &switchFlag)
556 {
557     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
558     return multimodalInputConnectService_->GetTouchpadScrollSwitch(switchFlag);
559 }
560 
SetTouchpadScrollDirection(bool state)561 int32_t MultimodalInputConnectManager::SetTouchpadScrollDirection(bool state)
562 {
563     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
564     return multimodalInputConnectService_->SetTouchpadScrollDirection(state);
565 }
566 
GetTouchpadScrollDirection(bool & state)567 int32_t MultimodalInputConnectManager::GetTouchpadScrollDirection(bool &state)
568 {
569     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
570     return multimodalInputConnectService_->GetTouchpadScrollDirection(state);
571 }
572 
SetTouchpadTapSwitch(bool switchFlag)573 int32_t MultimodalInputConnectManager::SetTouchpadTapSwitch(bool switchFlag)
574 {
575     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
576     return multimodalInputConnectService_->SetTouchpadTapSwitch(switchFlag);
577 }
578 
GetTouchpadTapSwitch(bool & switchFlag)579 int32_t MultimodalInputConnectManager::GetTouchpadTapSwitch(bool &switchFlag)
580 {
581     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
582     return multimodalInputConnectService_->GetTouchpadTapSwitch(switchFlag);
583 }
584 
SetTouchpadPointerSpeed(int32_t speed)585 int32_t MultimodalInputConnectManager::SetTouchpadPointerSpeed(int32_t speed)
586 {
587     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
588     return multimodalInputConnectService_->SetTouchpadPointerSpeed(speed);
589 }
590 
GetTouchpadPointerSpeed(int32_t & speed)591 int32_t MultimodalInputConnectManager::GetTouchpadPointerSpeed(int32_t &speed)
592 {
593     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
594     return multimodalInputConnectService_->GetTouchpadPointerSpeed(speed);
595 }
596 
SetTouchpadPinchSwitch(bool switchFlag)597 int32_t MultimodalInputConnectManager::SetTouchpadPinchSwitch(bool switchFlag)
598 {
599     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
600     return multimodalInputConnectService_->SetTouchpadPinchSwitch(switchFlag);
601 }
602 
GetTouchpadPinchSwitch(bool & switchFlag)603 int32_t MultimodalInputConnectManager::GetTouchpadPinchSwitch(bool &switchFlag)
604 {
605     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
606     return multimodalInputConnectService_->GetTouchpadPinchSwitch(switchFlag);
607 }
608 
SetTouchpadSwipeSwitch(bool switchFlag)609 int32_t MultimodalInputConnectManager::SetTouchpadSwipeSwitch(bool switchFlag)
610 {
611     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
612     return multimodalInputConnectService_->SetTouchpadSwipeSwitch(switchFlag);
613 }
614 
GetTouchpadSwipeSwitch(bool & switchFlag)615 int32_t MultimodalInputConnectManager::GetTouchpadSwipeSwitch(bool &switchFlag)
616 {
617     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
618     return multimodalInputConnectService_->GetTouchpadSwipeSwitch(switchFlag);
619 }
620 
SetTouchpadRightClickType(int32_t type)621 int32_t MultimodalInputConnectManager::SetTouchpadRightClickType(int32_t type)
622 {
623     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
624     return multimodalInputConnectService_->SetTouchpadRightClickType(type);
625 }
626 
GetTouchpadRightClickType(int32_t & type)627 int32_t MultimodalInputConnectManager::GetTouchpadRightClickType(int32_t &type)
628 {
629     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
630     return multimodalInputConnectService_->GetTouchpadRightClickType(type);
631 }
632 
SetShieldStatus(int32_t shieldMode,bool isShield)633 int32_t MultimodalInputConnectManager::SetShieldStatus(int32_t shieldMode, bool isShield)
634 {
635     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
636     return multimodalInputConnectService_->SetShieldStatus(shieldMode, isShield);
637 }
638 
GetShieldStatus(int32_t shieldMode,bool & isShield)639 int32_t MultimodalInputConnectManager::GetShieldStatus(int32_t shieldMode, bool &isShield)
640 {
641     CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
642     return multimodalInputConnectService_->GetShieldStatus(shieldMode, isShield);
643 }
644 
AddServiceWatcher(std::shared_ptr<IInputServiceWatcher> watcher)645 void MultimodalInputConnectManager::AddServiceWatcher(std::shared_ptr<IInputServiceWatcher> watcher)
646 {
647     CHKPV(watcher);
648     std::lock_guard<std::mutex> guard(lock_);
649     watchers_.insert(watcher);
650 }
651 
RemoveServiceWatcher(std::shared_ptr<IInputServiceWatcher> watcher)652 void MultimodalInputConnectManager::RemoveServiceWatcher(std::shared_ptr<IInputServiceWatcher> watcher)
653 {
654     std::lock_guard<std::mutex> guard(lock_);
655     watchers_.erase(watcher);
656 }
657 } // namespace MMI
658 } // namespace OHOS
659