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