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 "input_binder_client_server.h"
25 #include "mmi_log.h"
26 #include "multimodal_input_connect_death_recipient.h"
27 #include "multimodal_input_connect_define.h"
28 #include "util.h"
29
30 #undef MMI_LOG_DOMAIN
31 #define MMI_LOG_DOMAIN MMI_LOG_SERVER
32 #undef MMI_LOG_TAG
33 #define MMI_LOG_TAG "MultimodalInputConnectManager"
34
35 namespace OHOS {
36 namespace MMI {
37 namespace {
38 std::shared_ptr<MultimodalInputConnectManager> g_instance = nullptr;
39 } // namespace
40
GetInstance()41 std::shared_ptr<MultimodalInputConnectManager> MultimodalInputConnectManager::GetInstance()
42 {
43 static std::once_flag flag;
44 std::call_once(flag, [&]() { g_instance.reset(new (std::nothrow) MultimodalInputConnectManager()); });
45
46 CHKPP(g_instance);
47 if (g_instance != nullptr) {
48 g_instance->ConnectMultimodalInputService();
49 }
50 return g_instance;
51 }
52
AllocSocketPair(const int32_t moduleType)53 int32_t MultimodalInputConnectManager::AllocSocketPair(const int32_t moduleType)
54 {
55 CALL_DEBUG_ENTER;
56 std::lock_guard<std::mutex> guard(lock_);
57 CHKPR(multimodalInputConnectService_, RET_ERR);
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_HILOGD("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
GetDisplayBindInfo(DisplayBindInfos & infos)76 int32_t MultimodalInputConnectManager::GetDisplayBindInfo(DisplayBindInfos &infos)
77 {
78 std::lock_guard<std::mutex> guard(lock_);
79 CHKPR(multimodalInputConnectService_, RET_ERR);
80 return multimodalInputConnectService_->GetDisplayBindInfo(infos);
81 }
82
GetAllMmiSubscribedEvents(std::map<std::tuple<int32_t,int32_t,std::string>,int32_t> & datas)83 int32_t MultimodalInputConnectManager::GetAllMmiSubscribedEvents(std::map<std::tuple<int32_t, int32_t, std::string>,
84 int32_t> &datas)
85 {
86 std::lock_guard<std::mutex> guard(lock_);
87 CHKPR(multimodalInputConnectService_, RET_ERR);
88 return multimodalInputConnectService_->GetAllMmiSubscribedEvents(datas);
89 }
90
SetDisplayBind(int32_t deviceId,int32_t displayId,std::string & msg)91 int32_t MultimodalInputConnectManager::SetDisplayBind(int32_t deviceId, int32_t displayId, std::string &msg)
92 {
93 std::lock_guard<std::mutex> guard(lock_);
94 CHKPR(multimodalInputConnectService_, RET_ERR);
95 return multimodalInputConnectService_->SetDisplayBind(deviceId, displayId, msg);
96 }
97
GetWindowPid(int32_t windowId)98 int32_t MultimodalInputConnectManager::GetWindowPid(int32_t windowId)
99 {
100 std::lock_guard<std::mutex> guard(lock_);
101 CHKPR(multimodalInputConnectService_, RET_ERR);
102 return multimodalInputConnectService_->GetWindowPid(windowId);
103 }
104
AddInputEventFilter(sptr<IEventFilter> filter,int32_t filterId,int32_t priority,uint32_t deviceTags)105 int32_t MultimodalInputConnectManager::AddInputEventFilter(sptr<IEventFilter> filter, int32_t filterId,
106 int32_t priority, uint32_t deviceTags)
107 {
108 std::lock_guard<std::mutex> guard(lock_);
109 CHKPR(multimodalInputConnectService_, RET_ERR);
110 return multimodalInputConnectService_->AddInputEventFilter(filter, filterId, priority, deviceTags);
111 }
112
NotifyNapOnline()113 int32_t MultimodalInputConnectManager::NotifyNapOnline()
114 {
115 std::lock_guard<std::mutex> guard(lock_);
116 CHKPR(multimodalInputConnectService_, RET_ERR);
117 return multimodalInputConnectService_->NotifyNapOnline();
118 }
119
RemoveInputEventObserver()120 int32_t MultimodalInputConnectManager::RemoveInputEventObserver()
121 {
122 std::lock_guard<std::mutex> guard(lock_);
123 CHKPR(multimodalInputConnectService_, RET_ERR);
124 return multimodalInputConnectService_->RemoveInputEventObserver();
125 }
126
RemoveInputEventFilter(int32_t filterId)127 int32_t MultimodalInputConnectManager::RemoveInputEventFilter(int32_t filterId)
128 {
129 std::lock_guard<std::mutex> guard(lock_);
130 CHKPR(multimodalInputConnectService_, RET_ERR);
131 return multimodalInputConnectService_->RemoveInputEventFilter(filterId);
132 }
133
SetMouseScrollRows(int32_t rows)134 int32_t MultimodalInputConnectManager::SetMouseScrollRows(int32_t rows)
135 {
136 std::lock_guard<std::mutex> guard(lock_);
137 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
138 return multimodalInputConnectService_->SetMouseScrollRows(rows);
139 }
140
SetCustomCursor(int32_t pid,int32_t windowId,int32_t focusX,int32_t focusY,void * pixelMap)141 int32_t MultimodalInputConnectManager::SetCustomCursor(int32_t pid, int32_t windowId, int32_t focusX, int32_t focusY,
142 void* pixelMap)
143 {
144 std::lock_guard<std::mutex> guard(lock_);
145 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
146 return multimodalInputConnectService_->SetCustomCursor(pid, windowId, focusX, focusY, pixelMap);
147 }
148
SetMouseIcon(int32_t windowId,void * pixelMap)149 int32_t MultimodalInputConnectManager::SetMouseIcon(int32_t windowId, void* pixelMap)
150 {
151 std::lock_guard<std::mutex> guard(lock_);
152 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
153 return multimodalInputConnectService_->SetMouseIcon(windowId, pixelMap);
154 }
155
SetMouseHotSpot(int32_t pid,int32_t windowId,int32_t hotSpotX,int32_t hotSpotY)156 int32_t MultimodalInputConnectManager::SetMouseHotSpot(
157 int32_t pid, int32_t windowId, int32_t hotSpotX, int32_t hotSpotY)
158 {
159 std::lock_guard<std::mutex> guard(lock_);
160 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
161 return multimodalInputConnectService_->SetMouseHotSpot(pid, windowId, hotSpotX, hotSpotY);
162 }
163
GetMouseScrollRows(int32_t & rows)164 int32_t MultimodalInputConnectManager::GetMouseScrollRows(int32_t &rows)
165 {
166 std::lock_guard<std::mutex> guard(lock_);
167 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
168 return multimodalInputConnectService_->GetMouseScrollRows(rows);
169 }
170
SetPointerSize(int32_t size)171 int32_t MultimodalInputConnectManager::SetPointerSize(int32_t size)
172 {
173 std::lock_guard<std::mutex> guard(lock_);
174 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
175 return multimodalInputConnectService_->SetPointerSize(size);
176 }
177
SetNapStatus(int32_t pid,int32_t uid,std::string bundleName,int32_t napStatus)178 int32_t MultimodalInputConnectManager::SetNapStatus(int32_t pid, int32_t uid, std::string bundleName, int32_t napStatus)
179 {
180 std::lock_guard<std::mutex> guard(lock_);
181 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
182 return multimodalInputConnectService_->SetNapStatus(pid, uid, bundleName, napStatus);
183 }
184
GetPointerSize(int32_t & size)185 int32_t MultimodalInputConnectManager::GetPointerSize(int32_t &size)
186 {
187 std::lock_guard<std::mutex> guard(lock_);
188 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
189 return multimodalInputConnectService_->GetPointerSize(size);
190 }
191
SetMousePrimaryButton(int32_t primaryButton)192 int32_t MultimodalInputConnectManager::SetMousePrimaryButton(int32_t primaryButton)
193 {
194 std::lock_guard<std::mutex> guard(lock_);
195 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
196 return multimodalInputConnectService_->SetMousePrimaryButton(primaryButton);
197 }
198
GetMousePrimaryButton(int32_t & primaryButton)199 int32_t MultimodalInputConnectManager::GetMousePrimaryButton(int32_t &primaryButton)
200 {
201 std::lock_guard<std::mutex> guard(lock_);
202 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
203 return multimodalInputConnectService_->GetMousePrimaryButton(primaryButton);
204 }
205
SetHoverScrollState(bool state)206 int32_t MultimodalInputConnectManager::SetHoverScrollState(bool state)
207 {
208 std::lock_guard<std::mutex> guard(lock_);
209 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
210 return multimodalInputConnectService_->SetHoverScrollState(state);
211 }
212
GetHoverScrollState(bool & state)213 int32_t MultimodalInputConnectManager::GetHoverScrollState(bool &state)
214 {
215 std::lock_guard<std::mutex> guard(lock_);
216 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
217 return multimodalInputConnectService_->GetHoverScrollState(state);
218 }
219
SetPointerVisible(bool visible,int32_t priority)220 int32_t MultimodalInputConnectManager::SetPointerVisible(bool visible, int32_t priority)
221 {
222 std::lock_guard<std::mutex> guard(lock_);
223 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
224 return multimodalInputConnectService_->SetPointerVisible(visible, priority);
225 }
226
IsPointerVisible(bool & visible)227 int32_t MultimodalInputConnectManager::IsPointerVisible(bool &visible)
228 {
229 std::lock_guard<std::mutex> guard(lock_);
230 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
231 return multimodalInputConnectService_->IsPointerVisible(visible);
232 }
233
MarkProcessed(int32_t eventType,int32_t eventId)234 int32_t MultimodalInputConnectManager::MarkProcessed(int32_t eventType, int32_t eventId)
235 {
236 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
237 return multimodalInputConnectService_->MarkProcessed(eventType, eventId);
238 }
239
SetPointerColor(int32_t color)240 int32_t MultimodalInputConnectManager::SetPointerColor(int32_t color)
241 {
242 std::lock_guard<std::mutex> guard(lock_);
243 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
244 return multimodalInputConnectService_->SetPointerColor(color);
245 }
246
GetPointerColor(int32_t & color)247 int32_t MultimodalInputConnectManager::GetPointerColor(int32_t &color)
248 {
249 std::lock_guard<std::mutex> guard(lock_);
250 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
251 return multimodalInputConnectService_->GetPointerColor(color);
252 }
253
SetPointerSpeed(int32_t speed)254 int32_t MultimodalInputConnectManager::SetPointerSpeed(int32_t speed)
255 {
256 std::lock_guard<std::mutex> guard(lock_);
257 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
258 return multimodalInputConnectService_->SetPointerSpeed(speed);
259 }
260
GetPointerSpeed(int32_t & speed)261 int32_t MultimodalInputConnectManager::GetPointerSpeed(int32_t &speed)
262 {
263 std::lock_guard<std::mutex> guard(lock_);
264 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
265 return multimodalInputConnectService_->GetPointerSpeed(speed);
266 }
267
SetPointerStyle(int32_t windowId,PointerStyle pointerStyle,bool isUiExtension)268 int32_t MultimodalInputConnectManager::SetPointerStyle(int32_t windowId, PointerStyle pointerStyle, bool isUiExtension)
269 {
270 std::lock_guard<std::mutex> guard(lock_);
271 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
272 return multimodalInputConnectService_->SetPointerStyle(windowId, pointerStyle, isUiExtension);
273 }
274
ClearWindowPointerStyle(int32_t pid,int32_t windowId)275 int32_t MultimodalInputConnectManager::ClearWindowPointerStyle(int32_t pid, int32_t windowId)
276 {
277 std::lock_guard<std::mutex> guard(lock_);
278 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
279 return multimodalInputConnectService_->ClearWindowPointerStyle(pid, windowId);
280 }
281
GetPointerStyle(int32_t windowId,PointerStyle & pointerStyle,bool isUiExtension)282 int32_t MultimodalInputConnectManager::GetPointerStyle(int32_t windowId, PointerStyle &pointerStyle, bool isUiExtension)
283 {
284 std::lock_guard<std::mutex> guard(lock_);
285 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
286 return multimodalInputConnectService_->GetPointerStyle(windowId, pointerStyle, isUiExtension);
287 }
288
RegisterDevListener()289 int32_t MultimodalInputConnectManager::RegisterDevListener()
290 {
291 std::lock_guard<std::mutex> guard(lock_);
292 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
293 return multimodalInputConnectService_->RegisterDevListener();
294 }
295
UnregisterDevListener()296 int32_t MultimodalInputConnectManager::UnregisterDevListener()
297 {
298 std::lock_guard<std::mutex> guard(lock_);
299 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
300 return multimodalInputConnectService_->UnregisterDevListener();
301 }
302
SupportKeys(int32_t deviceId,std::vector<int32_t> & keys,std::vector<bool> & keystroke)303 int32_t MultimodalInputConnectManager::SupportKeys(int32_t deviceId, std::vector<int32_t> &keys,
304 std::vector<bool> &keystroke)
305 {
306 std::lock_guard<std::mutex> guard(lock_);
307 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
308 return multimodalInputConnectService_->SupportKeys(deviceId, keys, keystroke);
309 }
310
GetDeviceIds(std::vector<int32_t> & ids)311 int32_t MultimodalInputConnectManager::GetDeviceIds(std::vector<int32_t> &ids)
312 {
313 std::lock_guard<std::mutex> guard(lock_);
314 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
315 return multimodalInputConnectService_->GetDeviceIds(ids);
316 }
317
GetDevice(int32_t deviceId,std::shared_ptr<InputDevice> & inputDevice)318 int32_t MultimodalInputConnectManager::GetDevice(int32_t deviceId, std::shared_ptr<InputDevice> &inputDevice)
319 {
320 std::lock_guard<std::mutex> guard(lock_);
321 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
322 return multimodalInputConnectService_->GetDevice(deviceId, inputDevice);
323 }
324
GetKeyboardType(int32_t deviceId,int32_t & keyboardType)325 int32_t MultimodalInputConnectManager::GetKeyboardType(int32_t deviceId, int32_t &keyboardType)
326 {
327 std::lock_guard<std::mutex> guard(lock_);
328 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
329 return multimodalInputConnectService_->GetKeyboardType(deviceId, keyboardType);
330 }
331
SetKeyboardRepeatDelay(int32_t delay)332 int32_t MultimodalInputConnectManager::SetKeyboardRepeatDelay(int32_t delay)
333 {
334 std::lock_guard<std::mutex> guard(lock_);
335 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
336 return multimodalInputConnectService_->SetKeyboardRepeatDelay(delay);
337 }
338
SetKeyboardRepeatRate(int32_t rate)339 int32_t MultimodalInputConnectManager::SetKeyboardRepeatRate(int32_t rate)
340 {
341 std::lock_guard<std::mutex> guard(lock_);
342 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
343 return multimodalInputConnectService_->SetKeyboardRepeatRate(rate);
344 }
345
GetKeyboardRepeatDelay(int32_t & delay)346 int32_t MultimodalInputConnectManager::GetKeyboardRepeatDelay(int32_t &delay)
347 {
348 std::lock_guard<std::mutex> guard(lock_);
349 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
350 return multimodalInputConnectService_->GetKeyboardRepeatDelay(delay);
351 }
352
GetKeyboardRepeatRate(int32_t & rate)353 int32_t MultimodalInputConnectManager::GetKeyboardRepeatRate(int32_t &rate)
354 {
355 std::lock_guard<std::mutex> guard(lock_);
356 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
357 return multimodalInputConnectService_->GetKeyboardRepeatRate(rate);
358 }
359
AddInputHandler(InputHandlerType handlerType,HandleEventType eventType,int32_t priority,uint32_t deviceTags)360 int32_t MultimodalInputConnectManager::AddInputHandler(InputHandlerType handlerType, HandleEventType eventType,
361 int32_t priority, uint32_t deviceTags)
362 {
363 std::lock_guard<std::mutex> guard(lock_);
364 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
365 return multimodalInputConnectService_->AddInputHandler(handlerType, eventType, priority, deviceTags);
366 }
367
RemoveInputHandler(InputHandlerType handlerType,HandleEventType eventType,int32_t priority,uint32_t deviceTags)368 int32_t MultimodalInputConnectManager::RemoveInputHandler(InputHandlerType handlerType, HandleEventType eventType,
369 int32_t priority, uint32_t deviceTags)
370 {
371 std::lock_guard<std::mutex> guard(lock_);
372 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
373 return multimodalInputConnectService_->RemoveInputHandler(handlerType, eventType, priority, deviceTags);
374 }
375
MarkEventConsumed(int32_t eventId)376 int32_t MultimodalInputConnectManager::MarkEventConsumed(int32_t eventId)
377 {
378 std::lock_guard<std::mutex> guard(lock_);
379 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
380 return multimodalInputConnectService_->MarkEventConsumed(eventId);
381 }
382
SubscribeKeyEvent(int32_t subscribeId,const std::shared_ptr<KeyOption> option)383 int32_t MultimodalInputConnectManager::SubscribeKeyEvent(int32_t subscribeId, const std::shared_ptr<KeyOption> option)
384 {
385 std::lock_guard<std::mutex> guard(lock_);
386 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
387 return multimodalInputConnectService_->SubscribeKeyEvent(subscribeId, option);
388 }
389
UnsubscribeKeyEvent(int32_t subscribeId)390 int32_t MultimodalInputConnectManager::UnsubscribeKeyEvent(int32_t subscribeId)
391 {
392 std::lock_guard<std::mutex> guard(lock_);
393 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
394 return multimodalInputConnectService_->UnsubscribeKeyEvent(subscribeId);
395 }
396
SubscribeSwitchEvent(int32_t subscribeId,int32_t switchType)397 int32_t MultimodalInputConnectManager::SubscribeSwitchEvent(int32_t subscribeId, int32_t switchType)
398 {
399 std::lock_guard<std::mutex> guard(lock_);
400 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
401 return multimodalInputConnectService_->SubscribeSwitchEvent(subscribeId, switchType);
402 }
403
UnsubscribeSwitchEvent(int32_t subscribeId)404 int32_t MultimodalInputConnectManager::UnsubscribeSwitchEvent(int32_t subscribeId)
405 {
406 std::lock_guard<std::mutex> guard(lock_);
407 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
408 return multimodalInputConnectService_->UnsubscribeSwitchEvent(subscribeId);
409 }
410
MoveMouseEvent(int32_t offsetX,int32_t offsetY)411 int32_t MultimodalInputConnectManager::MoveMouseEvent(int32_t offsetX, int32_t offsetY)
412 {
413 std::lock_guard<std::mutex> guard(lock_);
414 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
415 return multimodalInputConnectService_->MoveMouseEvent(offsetX, offsetY);
416 }
417
InjectKeyEvent(const std::shared_ptr<KeyEvent> event,bool isNativeInject)418 int32_t MultimodalInputConnectManager::InjectKeyEvent(const std::shared_ptr<KeyEvent> event, bool isNativeInject)
419 {
420 std::lock_guard<std::mutex> guard(lock_);
421 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
422 return multimodalInputConnectService_->InjectKeyEvent(event, isNativeInject);
423 }
424
InjectPointerEvent(const std::shared_ptr<PointerEvent> pointerEvent,bool isNativeInject)425 int32_t MultimodalInputConnectManager::InjectPointerEvent(const std::shared_ptr<PointerEvent> pointerEvent,
426 bool isNativeInject)
427 {
428 std::lock_guard<std::mutex> guard(lock_);
429 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
430 return multimodalInputConnectService_->InjectPointerEvent(pointerEvent, isNativeInject);
431 }
432
SetAnrObserver()433 int32_t MultimodalInputConnectManager::SetAnrObserver()
434 {
435 std::lock_guard<std::mutex> guard(lock_);
436 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
437 return multimodalInputConnectService_->SetAnrObserver();
438 }
439
GetFunctionKeyState(int32_t funcKey,bool & state)440 int32_t MultimodalInputConnectManager::GetFunctionKeyState(int32_t funcKey, bool &state)
441 {
442 std::lock_guard<std::mutex> guard(lock_);
443 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
444 return multimodalInputConnectService_->GetFunctionKeyState(funcKey, state);
445 }
446
SetFunctionKeyState(int32_t funcKey,bool enable)447 int32_t MultimodalInputConnectManager::SetFunctionKeyState(int32_t funcKey, bool enable)
448 {
449 std::lock_guard<std::mutex> guard(lock_);
450 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
451 return multimodalInputConnectService_->SetFunctionKeyState(funcKey, enable);
452 }
453
SetPointerLocation(int32_t x,int32_t y)454 int32_t MultimodalInputConnectManager::SetPointerLocation(int32_t x, int32_t y)
455 {
456 std::lock_guard<std::mutex> guard(lock_);
457 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
458 return multimodalInputConnectService_->SetPointerLocation(x, y);
459 }
460
ConnectMultimodalInputService()461 bool MultimodalInputConnectManager::ConnectMultimodalInputService() __attribute__((no_sanitize("cfi")))
462 {
463 CALL_DEBUG_ENTER;
464 std::lock_guard<std::mutex> guard(lock_);
465 if (multimodalInputConnectService_ != nullptr) {
466 return true;
467 }
468 auto sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
469 CHKPF(sm);
470 auto sa = sm->CheckSystemAbility(IMultimodalInputConnect::MULTIMODAL_INPUT_CONNECT_SERVICE_ID);
471 CHKPF(sa);
472
473 std::weak_ptr<MultimodalInputConnectManager> weakPtr = shared_from_this();
474 auto deathCallback = [weakPtr](const wptr<IRemoteObject> &object) {
475 auto sharedPtr = weakPtr.lock();
476 if (sharedPtr != nullptr) {
477 sharedPtr->OnDeath(object);
478 }
479 };
480
481 multimodalInputConnectRecipient_ = new (std::nothrow) MultimodalInputConnectDeathRecipient(deathCallback);
482 CHKPF(multimodalInputConnectRecipient_);
483 if (!sa->AddDeathRecipient(multimodalInputConnectRecipient_)) {
484 MMI_HILOGE("Failed to add death recipient");
485 return false;
486 }
487 multimodalInputConnectService_ = iface_cast<IMultimodalInputConnect>(sa);
488 CHKPF(multimodalInputConnectService_);
489 sptr<IRemoteObject> remoteObject = INPUT_BINDER_CLIENT_SERVICE->GetClientSrv();
490 CHKPF(remoteObject);
491 multimodalInputConnectService_->TransferBinderClientSrv(remoteObject);
492 MMI_HILOGI("Get multimodalinput service successful");
493 return true;
494 }
495
OnDeath(const wptr<IRemoteObject> & remoteObj)496 void MultimodalInputConnectManager::OnDeath(const wptr<IRemoteObject> &remoteObj)
497 {
498 CALL_DEBUG_ENTER;
499 Clean(remoteObj);
500 NotifyServiceDeath();
501 NotifyDeath();
502 }
503
Clean(const wptr<IRemoteObject> & remoteObj)504 void MultimodalInputConnectManager::Clean(const wptr<IRemoteObject> &remoteObj)
505 {
506 std::lock_guard<std::mutex> guard(lock_);
507 if (multimodalInputConnectService_ != nullptr) {
508 auto serviceObj = multimodalInputConnectService_->AsObject();
509 if (serviceObj != nullptr) {
510 if (serviceObj != remoteObj.promote()) {
511 return;
512 }
513 if (multimodalInputConnectRecipient_ != nullptr) {
514 MMI_HILOGI("Remove death recipient on service death");
515 serviceObj->RemoveDeathRecipient(multimodalInputConnectRecipient_);
516 }
517 }
518 MMI_HILOGI("Reset proxy on service death");
519 multimodalInputConnectRecipient_ = nullptr;
520 multimodalInputConnectService_ = nullptr;
521 }
522 }
523
NotifyServiceDeath()524 void MultimodalInputConnectManager::NotifyServiceDeath()
525 {
526 std::lock_guard<std::mutex> guard(lock_);
527 for (const auto &watcher : watchers_) {
528 watcher->OnServiceDied();
529 }
530 }
531
NotifyDeath()532 void MultimodalInputConnectManager::NotifyDeath()
533 {
534 CALL_DEBUG_ENTER;
535 int32_t retryCount = 50;
536 do {
537 std::this_thread::sleep_for(std::chrono::seconds(1));
538 if (ConnectMultimodalInputService()) {
539 MMI_HILOGD("Connect multimodalinput service successful");
540 return;
541 }
542 } while (--retryCount > 0);
543 }
544
SetMouseCaptureMode(int32_t windowId,bool isCaptureMode)545 int32_t MultimodalInputConnectManager::SetMouseCaptureMode(int32_t windowId, bool isCaptureMode)
546 {
547 std::lock_guard<std::mutex> guard(lock_);
548 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
549 return multimodalInputConnectService_->SetMouseCaptureMode(windowId, isCaptureMode);
550 }
551
AppendExtraData(const ExtraData & extraData)552 int32_t MultimodalInputConnectManager::AppendExtraData(const ExtraData &extraData)
553 {
554 std::lock_guard<std::mutex> guard(lock_);
555 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
556 return multimodalInputConnectService_->AppendExtraData(extraData);
557 }
558
EnableCombineKey(bool enable)559 int32_t MultimodalInputConnectManager::EnableCombineKey(bool enable)
560 {
561 std::lock_guard<std::mutex> guard(lock_);
562 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
563 return multimodalInputConnectService_->EnableCombineKey(enable);
564 }
565
EnableInputDevice(bool enable)566 int32_t MultimodalInputConnectManager::EnableInputDevice(bool enable)
567 {
568 std::lock_guard<std::mutex> guard(lock_);
569 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
570 return multimodalInputConnectService_->EnableInputDevice(enable);
571 }
572
SetKeyDownDuration(const std::string & businessId,int32_t delay)573 int32_t MultimodalInputConnectManager::SetKeyDownDuration(const std::string &businessId, int32_t delay)
574 {
575 std::lock_guard<std::mutex> guard(lock_);
576 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
577 return multimodalInputConnectService_->SetKeyDownDuration(businessId, delay);
578 }
579
SetTouchpadScrollSwitch(bool switchFlag)580 int32_t MultimodalInputConnectManager::SetTouchpadScrollSwitch(bool switchFlag)
581 {
582 std::lock_guard<std::mutex> guard(lock_);
583 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
584 return multimodalInputConnectService_->SetTouchpadScrollSwitch(switchFlag);
585 }
586
GetTouchpadScrollSwitch(bool & switchFlag)587 int32_t MultimodalInputConnectManager::GetTouchpadScrollSwitch(bool &switchFlag)
588 {
589 std::lock_guard<std::mutex> guard(lock_);
590 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
591 return multimodalInputConnectService_->GetTouchpadScrollSwitch(switchFlag);
592 }
593
SetTouchpadScrollDirection(bool state)594 int32_t MultimodalInputConnectManager::SetTouchpadScrollDirection(bool state)
595 {
596 std::lock_guard<std::mutex> guard(lock_);
597 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
598 return multimodalInputConnectService_->SetTouchpadScrollDirection(state);
599 }
600
GetTouchpadScrollDirection(bool & state)601 int32_t MultimodalInputConnectManager::GetTouchpadScrollDirection(bool &state)
602 {
603 std::lock_guard<std::mutex> guard(lock_);
604 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
605 return multimodalInputConnectService_->GetTouchpadScrollDirection(state);
606 }
607
SetTouchpadTapSwitch(bool switchFlag)608 int32_t MultimodalInputConnectManager::SetTouchpadTapSwitch(bool switchFlag)
609 {
610 std::lock_guard<std::mutex> guard(lock_);
611 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
612 return multimodalInputConnectService_->SetTouchpadTapSwitch(switchFlag);
613 }
614
GetTouchpadTapSwitch(bool & switchFlag)615 int32_t MultimodalInputConnectManager::GetTouchpadTapSwitch(bool &switchFlag)
616 {
617 std::lock_guard<std::mutex> guard(lock_);
618 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
619 return multimodalInputConnectService_->GetTouchpadTapSwitch(switchFlag);
620 }
621
SetTouchpadPointerSpeed(int32_t speed)622 int32_t MultimodalInputConnectManager::SetTouchpadPointerSpeed(int32_t speed)
623 {
624 std::lock_guard<std::mutex> guard(lock_);
625 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
626 return multimodalInputConnectService_->SetTouchpadPointerSpeed(speed);
627 }
628
GetTouchpadPointerSpeed(int32_t & speed)629 int32_t MultimodalInputConnectManager::GetTouchpadPointerSpeed(int32_t &speed)
630 {
631 std::lock_guard<std::mutex> guard(lock_);
632 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
633 return multimodalInputConnectService_->GetTouchpadPointerSpeed(speed);
634 }
635
SetTouchpadPinchSwitch(bool switchFlag)636 int32_t MultimodalInputConnectManager::SetTouchpadPinchSwitch(bool switchFlag)
637 {
638 std::lock_guard<std::mutex> guard(lock_);
639 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
640 return multimodalInputConnectService_->SetTouchpadPinchSwitch(switchFlag);
641 }
642
GetTouchpadPinchSwitch(bool & switchFlag)643 int32_t MultimodalInputConnectManager::GetTouchpadPinchSwitch(bool &switchFlag)
644 {
645 std::lock_guard<std::mutex> guard(lock_);
646 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
647 return multimodalInputConnectService_->GetTouchpadPinchSwitch(switchFlag);
648 }
649
SetTouchpadSwipeSwitch(bool switchFlag)650 int32_t MultimodalInputConnectManager::SetTouchpadSwipeSwitch(bool switchFlag)
651 {
652 std::lock_guard<std::mutex> guard(lock_);
653 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
654 return multimodalInputConnectService_->SetTouchpadSwipeSwitch(switchFlag);
655 }
656
GetTouchpadSwipeSwitch(bool & switchFlag)657 int32_t MultimodalInputConnectManager::GetTouchpadSwipeSwitch(bool &switchFlag)
658 {
659 std::lock_guard<std::mutex> guard(lock_);
660 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
661 return multimodalInputConnectService_->GetTouchpadSwipeSwitch(switchFlag);
662 }
663
SetTouchpadRightClickType(int32_t type)664 int32_t MultimodalInputConnectManager::SetTouchpadRightClickType(int32_t type)
665 {
666 std::lock_guard<std::mutex> guard(lock_);
667 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
668 return multimodalInputConnectService_->SetTouchpadRightClickType(type);
669 }
670
GetTouchpadRightClickType(int32_t & type)671 int32_t MultimodalInputConnectManager::GetTouchpadRightClickType(int32_t &type)
672 {
673 std::lock_guard<std::mutex> guard(lock_);
674 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
675 return multimodalInputConnectService_->GetTouchpadRightClickType(type);
676 }
677
SetTouchpadRotateSwitch(bool rotateSwitch)678 int32_t MultimodalInputConnectManager::SetTouchpadRotateSwitch(bool rotateSwitch)
679 {
680 CHKPR(multimodalInputConnectService_, RET_ERR);
681 return multimodalInputConnectService_->SetTouchpadRotateSwitch(rotateSwitch);
682 }
683
GetTouchpadRotateSwitch(bool & rotateSwitch)684 int32_t MultimodalInputConnectManager::GetTouchpadRotateSwitch(bool &rotateSwitch)
685 {
686 CHKPR(multimodalInputConnectService_, RET_ERR);
687 return multimodalInputConnectService_->GetTouchpadRotateSwitch(rotateSwitch);
688 }
689
SetTouchpadDoubleTapAndDragState(bool switchFlag)690 int32_t MultimodalInputConnectManager::SetTouchpadDoubleTapAndDragState(bool switchFlag)
691 {
692 std::lock_guard<std::mutex> guard(lock_);
693 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
694 return multimodalInputConnectService_->SetTouchpadDoubleTapAndDragState(switchFlag);
695 }
696
GetTouchpadDoubleTapAndDragState(bool & switchFlag)697 int32_t MultimodalInputConnectManager::GetTouchpadDoubleTapAndDragState(bool &switchFlag)
698 {
699 std::lock_guard<std::mutex> guard(lock_);
700 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
701 return multimodalInputConnectService_->GetTouchpadDoubleTapAndDragState(switchFlag);
702 }
703
SetShieldStatus(int32_t shieldMode,bool isShield)704 int32_t MultimodalInputConnectManager::SetShieldStatus(int32_t shieldMode, bool isShield)
705 {
706 std::lock_guard<std::mutex> guard(lock_);
707 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
708 return multimodalInputConnectService_->SetShieldStatus(shieldMode, isShield);
709 }
710
GetShieldStatus(int32_t shieldMode,bool & isShield)711 int32_t MultimodalInputConnectManager::GetShieldStatus(int32_t shieldMode, bool &isShield)
712 {
713 std::lock_guard<std::mutex> guard(lock_);
714 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
715 return multimodalInputConnectService_->GetShieldStatus(shieldMode, isShield);
716 }
717
GetKeyState(std::vector<int32_t> & pressedKeys,std::map<int32_t,int32_t> & specialKeysState)718 int32_t MultimodalInputConnectManager::GetKeyState(std::vector<int32_t> &pressedKeys,
719 std::map<int32_t, int32_t> &specialKeysState)
720 {
721 std::lock_guard<std::mutex> guard(lock_);
722 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
723 return multimodalInputConnectService_->GetKeyState(pressedKeys, specialKeysState);
724 }
725
AddServiceWatcher(std::shared_ptr<IInputServiceWatcher> watcher)726 void MultimodalInputConnectManager::AddServiceWatcher(std::shared_ptr<IInputServiceWatcher> watcher)
727 {
728 CHKPV(watcher);
729 std::lock_guard<std::mutex> guard(lock_);
730 watchers_.insert(watcher);
731 }
732
RemoveServiceWatcher(std::shared_ptr<IInputServiceWatcher> watcher)733 void MultimodalInputConnectManager::RemoveServiceWatcher(std::shared_ptr<IInputServiceWatcher> watcher)
734 {
735 std::lock_guard<std::mutex> guard(lock_);
736 watchers_.erase(watcher);
737 }
738
Authorize(bool isAuthorize)739 int32_t MultimodalInputConnectManager::Authorize(bool isAuthorize)
740 {
741 std::lock_guard<std::mutex> guard(lock_);
742 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
743 return multimodalInputConnectService_->Authorize(isAuthorize);
744 }
745
CancelInjection()746 int32_t MultimodalInputConnectManager::CancelInjection()
747 {
748 std::lock_guard<std::mutex> guard(lock_);
749 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
750 return multimodalInputConnectService_->CancelInjection();
751 }
752
HasIrEmitter(bool & hasIrEmitter)753 int32_t MultimodalInputConnectManager::HasIrEmitter(bool &hasIrEmitter)
754 {
755 std::lock_guard<std::mutex> guard(lock_);
756 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
757 return multimodalInputConnectService_->HasIrEmitter(hasIrEmitter);
758 }
759
GetInfraredFrequencies(std::vector<InfraredFrequency> & requencys)760 int32_t MultimodalInputConnectManager::GetInfraredFrequencies(std::vector<InfraredFrequency>& requencys)
761 {
762 std::lock_guard<std::mutex> guard(lock_);
763 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
764 return multimodalInputConnectService_->GetInfraredFrequencies(requencys);
765 }
766
TransmitInfrared(int64_t number,std::vector<int64_t> & pattern)767 int32_t MultimodalInputConnectManager::TransmitInfrared(int64_t number, std::vector<int64_t>& pattern)
768 {
769 std::lock_guard<std::mutex> guard(lock_);
770 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
771 return multimodalInputConnectService_->TransmitInfrared(number, pattern);
772 }
773
SetPixelMapData(int32_t infoId,void * pixelMap)774 int32_t MultimodalInputConnectManager::SetPixelMapData(int32_t infoId, void* pixelMap)
775 {
776 std::lock_guard<std::mutex> guard(lock_);
777 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
778 return multimodalInputConnectService_->SetPixelMapData(infoId, pixelMap);
779 }
780
SetCurrentUser(int32_t userId)781 int32_t MultimodalInputConnectManager::SetCurrentUser(int32_t userId)
782 {
783 std::lock_guard<std::mutex> guard(lock_);
784 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
785 return multimodalInputConnectService_->SetCurrentUser(userId);
786 }
787
AddVirtualInputDevice(std::shared_ptr<InputDevice> device,int32_t & deviceId)788 int32_t MultimodalInputConnectManager::AddVirtualInputDevice(std::shared_ptr<InputDevice> device, int32_t &deviceId)
789 {
790 std::lock_guard<std::mutex> guard(lock_);
791 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
792 return multimodalInputConnectService_->AddVirtualInputDevice(device, deviceId);
793 }
794
RemoveVirtualInputDevice(int32_t deviceId)795 int32_t MultimodalInputConnectManager::RemoveVirtualInputDevice(int32_t deviceId)
796 {
797 std::lock_guard<std::mutex> guard(lock_);
798 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
799 return multimodalInputConnectService_->RemoveVirtualInputDevice(deviceId);
800 }
801
EnableHardwareCursorStats(bool enable)802 int32_t MultimodalInputConnectManager::EnableHardwareCursorStats(bool enable)
803 {
804 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
805 return multimodalInputConnectService_->EnableHardwareCursorStats(enable);
806 }
807
GetHardwareCursorStats(uint32_t & frameCount,uint32_t & vsyncCount)808 int32_t MultimodalInputConnectManager::GetHardwareCursorStats(uint32_t &frameCount, uint32_t &vsyncCount)
809 {
810 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
811 return multimodalInputConnectService_->GetHardwareCursorStats(frameCount, vsyncCount);
812 }
813
814 #ifdef OHOS_BUILD_ENABLE_MAGICCURSOR
GetPointerSnapshot(void * pixelMapPtr)815 int32_t MultimodalInputConnectManager::GetPointerSnapshot(void *pixelMapPtr)
816 {
817 std::lock_guard<std::mutex> guard(lock_);
818 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
819 return multimodalInputConnectService_->GetPointerSnapshot(pixelMapPtr);
820 }
821 #endif // OHOS_BUILD_ENABLE_MAGICCURSOR
822
823 #ifdef OHOS_BUILD_ENABLE_ANCO
AncoAddChannel(sptr<IAncoChannel> channel)824 int32_t MultimodalInputConnectManager::AncoAddChannel(sptr<IAncoChannel> channel)
825 {
826 std::lock_guard<std::mutex> guard(lock_);
827 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
828 return multimodalInputConnectService_->AncoAddChannel(channel);
829 }
830
AncoRemoveChannel(sptr<IAncoChannel> channel)831 int32_t MultimodalInputConnectManager::AncoRemoveChannel(sptr<IAncoChannel> channel)
832 {
833 std::lock_guard<std::mutex> guard(lock_);
834 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
835 return multimodalInputConnectService_->AncoRemoveChannel(channel);
836 }
837 #endif // OHOS_BUILD_ENABLE_ANCO
838
SkipPointerLayer(bool isSkip)839 int32_t MultimodalInputConnectManager::SkipPointerLayer(bool isSkip)
840 {
841 std::lock_guard<std::mutex> guard(lock_);
842 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
843 return multimodalInputConnectService_->SkipPointerLayer(isSkip);
844 }
845
GetIntervalSinceLastInput(int64_t & timeInterval)846 int32_t MultimodalInputConnectManager::GetIntervalSinceLastInput(int64_t &timeInterval)
847 {
848 std::lock_guard<std::mutex> guard(lock_);
849 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
850 return multimodalInputConnectService_->GetIntervalSinceLastInput(timeInterval);
851 }
852 } // namespace MMI
853 } // namespace OHOS
854