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