• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2025 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 "input_handler_manager.h"
17 
18 #include "anr_handler.h"
19 #include "bytrace_adapter.h"
20 #include "multimodal_event_handler.h"
21 #include "multimodal_input_connect_manager.h"
22 #include "mmi_log.h"
23 #include "error_multimodal.h"
24 
25 #undef MMI_LOG_TAG
26 #define MMI_LOG_TAG "InputHandlerManager"
27 
28 namespace OHOS {
29 namespace MMI {
30 namespace {
31 constexpr int32_t DEVICE_TAGS { 1 };
32 constexpr int32_t THREE_FINGERS { 3 };
33 constexpr int32_t FOUR_FINGERS { 4 };
34 } // namespace
InputHandlerManager()35 InputHandlerManager::InputHandlerManager()
36 {
37     monitorCallback_ =
38         [this] (int32_t eventId, int64_t actionTime) { return this->OnDispatchEventProcessed(eventId, actionTime); };
39     monitorCallbackConsume_ =
40         [this] (int32_t eventId, int64_t actionTime) {
41             return this->OnDispatchEventProcessed(eventId, actionTime, true);
42         };
43 }
44 
AddHandler(InputHandlerType handlerType,std::shared_ptr<IInputEventConsumer> consumer,HandleEventType eventType,int32_t priority,uint32_t deviceTags)45 int32_t InputHandlerManager::AddHandler(InputHandlerType handlerType, std::shared_ptr<IInputEventConsumer> consumer,
46     HandleEventType eventType, int32_t priority, uint32_t deviceTags)
47 {
48     CALL_DEBUG_ENTER;
49     CHKPR(consumer, INVALID_HANDLER_ID);
50     if (handlerType == InputHandlerType::INTERCEPTOR) {
51         eventType = HANDLE_EVENT_TYPE_NONE;
52         if ((deviceTags & CapabilityToTags(InputDeviceCapability::INPUT_DEV_CAP_KEYBOARD)) != 0) {
53             eventType |= HANDLE_EVENT_TYPE_KEY;
54         }
55         if ((deviceTags & (CapabilityToTags(InputDeviceCapability::INPUT_DEV_CAP_MAX) -
56             CapabilityToTags(InputDeviceCapability::INPUT_DEV_CAP_KEYBOARD))) != 0) {
57             eventType |= HANDLE_EVENT_TYPE_POINTER;
58         }
59     }
60     std::lock_guard guard(mtxHandlers_);
61     CHKFR(((monitorHandlers_.size() + interHandlers_.size()) < MAX_N_INPUT_HANDLERS), ERROR_EXCEED_MAX_COUNT,
62           "The number of handlers exceeds the maximum");
63     int32_t handlerId = GetNextId();
64     CHKFR((handlerId != INVALID_HANDLER_ID), INVALID_HANDLER_ID, "Exceeded limit of 32-bit maximum number of integers");
65     CHKFR((eventType != HANDLE_EVENT_TYPE_NONE), INVALID_HANDLER_ID, "Invalid event type");
66     const HandleEventType currentType = GetEventType();
67     MMI_HILOGD("Register new handler:%{public}d, currentType:%{public}d, deviceTags:%{public}d", handlerId, currentType,
68         deviceTags);
69     uint32_t currentTags = GetDeviceTags();
70     if (RET_OK == AddLocal(handlerId, handlerType, eventType, priority, deviceTags, consumer)) {
71         MMI_HILOGD("New handler successfully registered, report to server");
72         const HandleEventType newType = GetEventType();
73         if (currentType != newType || ((currentTags & deviceTags) != deviceTags)) {
74             uint32_t allDeviceTags = GetDeviceTags();
75             MMI_HILOGD("The handlerType:%{public}d, newType:%{public}d, deviceTags:%{public}d, priority:%{public}d",
76                 handlerType, newType, allDeviceTags, priority);
77             int32_t ret = AddToServer(handlerType, newType, priority, allDeviceTags);
78             if (ret != RET_OK) {
79                 MMI_HILOGE("Add Handler:%{public}d:%{public}d to server failed, (eventType,deviceTag) current: "
80                            "(%{public}d, %{public}d), new: (%{public}d, %{public}d), priority:%{public}d",
81                            handlerType, handlerId, currentType, currentTags, newType, deviceTags, priority);
82                 RemoveLocal(handlerId, handlerType, allDeviceTags);
83                 return ret;
84             }
85         }
86         MMI_HILOGI("Finish add Handler:%{public}d:%{public}d, (eventType,deviceTag) current:"
87                    " (%{public}d, %{public}d), new: (%{public}d, %{public}d), priority:%{public}d",
88                    handlerType, handlerId, currentType, currentTags, newType, deviceTags, priority);
89     } else {
90         MMI_HILOGE("Add Handler:%{public}d:%{public}d local failed, (eventType,deviceTag,priority): "
91                    "(%{public}d, %{public}d, %{public}d)", handlerType, handlerId, eventType, deviceTags, priority);
92         handlerId = INVALID_HANDLER_ID;
93     }
94     return handlerId;
95 }
96 
AddGestureMonitor(InputHandlerType handlerType,std::shared_ptr<IInputEventConsumer> consumer,HandleEventType eventType,TouchGestureType gestureType,int32_t fingers)97 int32_t InputHandlerManager::AddGestureMonitor(
98     InputHandlerType handlerType, std::shared_ptr<IInputEventConsumer> consumer,
99     HandleEventType eventType, TouchGestureType gestureType, int32_t fingers)
100 {
101     CHKPR(consumer, INVALID_HANDLER_ID);
102     std::lock_guard guard(mtxHandlers_);
103     CHKFR(((monitorHandlers_.size() + interHandlers_.size()) < MAX_N_INPUT_HANDLERS), ERROR_EXCEED_MAX_COUNT,
104           "The number of handlers exceeds the maximum");
105     int32_t handlerId = GetNextId();
106     CHKFR((handlerId != INVALID_HANDLER_ID), INVALID_HANDLER_ID,
107         "Exceeded limit of 32-bit maximum number of integers");
108     CHKFR((eventType != HANDLE_EVENT_TYPE_NONE), INVALID_HANDLER_ID, "Invalid event type");
109     int32_t ret = AddGestureToLocal(handlerId, eventType, gestureType, fingers, consumer);
110     if (ret == RET_OK) {
111         const HandleEventType newType = GetEventType();
112         ret = MULTIMODAL_INPUT_CONNECT_MGR->AddGestureMonitor(handlerType, newType, gestureType, fingers);
113         if (ret != RET_OK) {
114             MMI_HILOGE("Add gesture handler:%{public}d to server failed, ret:%{public}d", gestureType, ret);
115             uint32_t deviceTags = 0;
116             RemoveLocal(handlerId, handlerType, deviceTags);
117             return INVALID_HANDLER_ID;
118         }
119         MMI_HILOGI("Finish add gesture handler(%{public}d:%{public}d:%{public}d:%{public}d) to server",
120             handlerId, eventType, gestureType, fingers);
121     } else {
122         handlerId = INVALID_HANDLER_ID;
123     }
124     return handlerId;
125 }
126 
AddHandler(InputHandlerType handlerType,std::shared_ptr<IInputEventConsumer> consumer,std::vector<int32_t> actionsType)127 int32_t InputHandlerManager::AddHandler(InputHandlerType handlerType, std::shared_ptr<IInputEventConsumer> consumer,
128     std::vector<int32_t> actionsType)
129 {
130     CALL_DEBUG_ENTER;
131     CHKPR(consumer, INVALID_HANDLER_ID);
132     std::lock_guard guard(mtxHandlers_);
133     CHKFR(((actionsMonitorHandlers_.size() + monitorHandlers_.size() + interHandlers_.size()) <
134         MAX_N_INPUT_HANDLERS), ERROR_EXCEED_MAX_COUNT, "The number of handlers exceeds the maximum");
135     int32_t handlerId = GetNextId();
136     CHKFR((handlerId != INVALID_HANDLER_ID), INVALID_HANDLER_ID, "Exceeded limit of 32-bit maximum number of integers");
137     MMI_HILOGD("Register new handler:%{public}d", handlerId);
138     if (RET_OK == AddLocal(handlerId, handlerType, actionsType, consumer)) {
139         MMI_HILOGD("New handler successfully registered, report to server");
140         if (IsNeedAddToServer(actionsType)) {
141             MMI_HILOGD("The handlerType:%{public}d", handlerType);
142             int32_t ret = AddToServer(handlerType, HANDLE_EVENT_TYPE_NONE, 0, 0, actionsType);
143             if (ret != RET_OK) {
144                 MMI_HILOGE("Add Handler:%{public}d:%{public}d to server failed", handlerType, handlerId);
145                 RemoveLocalActions(handlerId, handlerType);
146                 return ret;
147             }
148         }
149         MMI_HILOGI("Finish add Handler:%{public}d:%{public}d to server", handlerType, handlerId);
150     } else {
151         MMI_HILOGE("Add Handler:%{public}d:%{public}d local failed", handlerType, handlerId);
152         handlerId = INVALID_HANDLER_ID;
153     }
154     return handlerId;
155 }
156 
RemoveGestureMonitor(int32_t handlerId,InputHandlerType handlerType)157 int32_t InputHandlerManager::RemoveGestureMonitor(int32_t handlerId, InputHandlerType handlerType)
158 {
159     std::lock_guard guard(mtxHandlers_);
160     auto iter = monitorHandlers_.find(handlerId);
161     if (iter == monitorHandlers_.end()) {
162         MMI_HILOGE("No handler(%{public}d) with specified", handlerId);
163         return RET_ERR;
164     }
165     const auto gestureHandler = iter->second.gestureHandler_;
166     monitorHandlers_.erase(iter);
167     const HandleEventType newType = GetEventType();
168 
169     int32_t ret = MULTIMODAL_INPUT_CONNECT_MGR->RemoveGestureMonitor(handlerType, newType,
170         gestureHandler.gestureType, gestureHandler.fingers);
171     if (ret != RET_OK) {
172         MMI_HILOGE("Remove gesture handler:%{public}d to server failed, ret:%{public}d",
173             gestureHandler.gestureType, ret);
174     } else {
175         MMI_HILOGI("Finish remove gesture handler:%{public}d:%{public}d:%{public}d,(%{public}d,%{public}d)",
176             handlerType, newType, handlerId, gestureHandler.gestureType, gestureHandler.fingers);
177     }
178     return ret;
179 }
180 
IsNeedAddToServer(std::vector<int32_t> actionsType)181 bool InputHandlerManager::IsNeedAddToServer(std::vector<int32_t> actionsType)
182 {
183     bool isNeedAddToServer = false;
184     for (auto action : actionsType) {
185         if (std::find(addToServerActions_.begin(), addToServerActions_.end(), action) == addToServerActions_.end()) {
186             addToServerActions_.push_back(action);
187             isNeedAddToServer = true;
188         }
189     }
190     return isNeedAddToServer;
191 }
192 
RemoveHandler(int32_t handlerId,InputHandlerType handlerType)193 int32_t InputHandlerManager::RemoveHandler(int32_t handlerId, InputHandlerType handlerType)
194 {
195     CALL_DEBUG_ENTER;
196     MMI_HILOGD("Unregister handler:%{public}d,type:%{public}d", handlerId, handlerType);
197     std::lock_guard guard(mtxHandlers_);
198     uint32_t deviceTags = 0;
199     auto iter = monitorHandlers_.find(handlerId);
200     bool isInterHandlers = false;
201     for (auto inter = interHandlers_.begin(); inter != interHandlers_.end(); ++inter) {
202         if (handlerId == inter->handlerId_) {
203             isInterHandlers = true;
204             break;
205         }
206     }
207     if (iter != monitorHandlers_.end() || isInterHandlers) {
208         const HandleEventType currentType = GetEventType();
209         uint32_t currentTags = GetDeviceTags();
210         int32_t ret = RemoveLocal(handlerId, handlerType, deviceTags);
211         const HandleEventType newType = GetEventType();
212         const int32_t newLevel = GetPriority();
213         const uint64_t newTags = GetDeviceTags();
214         if (ret == RET_OK && (currentType != newType || ((currentTags & deviceTags) != 0))) {
215             ret = RemoveFromServer(handlerType, newType, newLevel, newTags);
216             if (ret != RET_OK) {
217                 return ret;
218             }
219             MMI_HILOGI("Remove Handler:%{public}d:%{public}d, (eventType,deviceTag): (%{public}d:%{public}d) ",
220                 handlerType, handlerId, currentType, currentTags);
221         }
222         return ret;
223     }
224 
225     auto it = actionsMonitorHandlers_.find(handlerId);
226     if (it != actionsMonitorHandlers_.end()) {
227         std::vector<int32_t> actionsType = it->second.actionsType_;
228         size_t currentSize = addToServerActions_.size();
229         int32_t ret = RemoveLocalActions(handlerId, handlerType);
230         size_t newSize = addToServerActions_.size();
231         if (ret == RET_OK && currentSize != newSize) {
232             ret = RemoveFromServer(handlerType, HANDLE_EVENT_TYPE_NONE, 0, 0, actionsType);
233             if (ret != RET_OK) {
234                 return ret;
235             }
236             MMI_HILOGI("Remove Handler:%{public}d:%{public}d", handlerType, handlerId);
237         }
238         return ret;
239     }
240     return RET_ERR;
241 }
242 
AddGestureToLocal(int32_t handlerId,HandleEventType eventType,TouchGestureType gestureType,int32_t fingers,std::shared_ptr<IInputEventConsumer> consumer)243 int32_t InputHandlerManager::AddGestureToLocal(int32_t handlerId, HandleEventType eventType,
244     TouchGestureType gestureType, int32_t fingers, std::shared_ptr<IInputEventConsumer> consumer)
245 {
246     if ((eventType & HANDLE_EVENT_TYPE_TOUCH_GESTURE) != HANDLE_EVENT_TYPE_TOUCH_GESTURE) {
247         MMI_HILOGE("Illegal type:%{public}d", eventType);
248         return RET_ERR;
249     }
250     if (!CheckMonitorValid(gestureType, fingers)) {
251         MMI_HILOGE("Wrong number of fingers:%{public}d", fingers);
252         return RET_ERR;
253     }
254     for (const auto &handler : monitorHandlers_) {
255         if (handler.second.eventType_ == eventType &&
256             handler.second.gestureHandler_.gestureType == gestureType &&
257             handler.second.gestureHandler_.fingers == fingers) {
258             MMI_HILOGE("Gesture(%{public}d) listener already exists", gestureType);
259             return RET_ERR;
260         }
261     }
262     InputHandlerManager::Handler handler {
263         .handlerId_ = handlerId,
264         .handlerType_ = InputHandlerType::MONITOR,
265         .eventType_ = eventType,
266         .consumer_ = consumer,
267         .gestureHandler_ {
268             .gestureType = gestureType,
269             .fingers = fingers
270         }
271     };
272     auto ret = monitorHandlers_.emplace(handlerId, handler);
273     if (!ret.second) {
274         MMI_HILOGE("Duplicate handler:%{public}d", handlerId);
275         return RET_ERR;
276     }
277     return RET_OK;
278 }
279 
AddLocal(int32_t handlerId,InputHandlerType handlerType,HandleEventType eventType,int32_t priority,uint32_t deviceTags,std::shared_ptr<IInputEventConsumer> monitor)280 int32_t InputHandlerManager::AddLocal(int32_t handlerId, InputHandlerType handlerType, HandleEventType eventType,
281     int32_t priority, uint32_t deviceTags, std::shared_ptr<IInputEventConsumer> monitor)
282 {
283     InputHandlerManager::Handler handler {
284         .handlerId_ = handlerId,
285         .handlerType_ = handlerType,
286         .eventType_ = eventType,
287         .priority_ = priority,
288         .deviceTags_ = deviceTags,
289         .consumer_ = monitor,
290     };
291     if (handlerType == InputHandlerType::MONITOR) {
292         auto ret = monitorHandlers_.emplace(handler.handlerId_, handler);
293         if (!ret.second) {
294             MMI_HILOGE("Duplicate handler:%{public}d", handler.handlerId_);
295             return RET_ERR;
296         }
297     }
298     if (handlerType == InputHandlerType::INTERCEPTOR) {
299         auto iterIndex = interHandlers_.begin();
300         for (; iterIndex != interHandlers_.end(); ++iterIndex) {
301             if (handler.priority_ < iterIndex->priority_) {
302                 break;
303             }
304         }
305         auto iter = interHandlers_.emplace(iterIndex, handler);
306         if (iter == interHandlers_.end()) {
307             MMI_HILOGE("Add new handler failed");
308             return RET_ERR;
309         }
310     }
311     return RET_OK;
312 }
313 
AddLocal(int32_t handlerId,InputHandlerType handlerType,std::vector<int32_t> actionsType,std::shared_ptr<IInputEventConsumer> monitor)314 int32_t InputHandlerManager::AddLocal(int32_t handlerId, InputHandlerType handlerType, std::vector<int32_t> actionsType,
315     std::shared_ptr<IInputEventConsumer> monitor)
316 {
317     InputHandlerManager::Handler handler{
318         .handlerId_ = handlerId,
319         .handlerType_ = handlerType,
320         .eventType_ = HANDLE_EVENT_TYPE_NONE,
321         .consumer_ = monitor,
322         .actionsType_ = actionsType,
323     };
324     if (handlerType == InputHandlerType::MONITOR) {
325         auto ret = actionsMonitorHandlers_.emplace(handler.handlerId_, handler);
326         if (!ret.second) {
327             MMI_HILOGE("Actions duplicate handler:%{public}d", handler.handlerId_);
328             return RET_ERR;
329         }
330     }
331     return RET_OK;
332 }
333 
AddToServer(InputHandlerType handlerType,HandleEventType eventType,int32_t priority,uint32_t deviceTags,std::vector<int32_t> actionsType)334 int32_t InputHandlerManager::AddToServer(InputHandlerType handlerType, HandleEventType eventType, int32_t priority,
335     uint32_t deviceTags, std::vector<int32_t> actionsType)
336 {
337     int32_t ret = MULTIMODAL_INPUT_CONNECT_MGR->AddInputHandler(handlerType,
338         eventType, priority, deviceTags, actionsType);
339     if (ret != RET_OK) {
340         MMI_HILOGE("Send to server failed, ret:%{public}d", ret);
341     }
342     return ret;
343 }
344 
RemoveLocal(int32_t handlerId,InputHandlerType handlerType,uint32_t & deviceTags)345 int32_t InputHandlerManager::RemoveLocal(int32_t handlerId, InputHandlerType handlerType, uint32_t &deviceTags)
346 {
347     if (handlerType == InputHandlerType::MONITOR) {
348         auto iter = monitorHandlers_.find(handlerId);
349         if (iter == monitorHandlers_.end()) {
350             MMI_HILOGE("No handler with specified");
351             return RET_ERR;
352         }
353         if (handlerType != iter->second.handlerType_) {
354             MMI_HILOGE("Unmatched handler type, InputHandlerType:%{public}d,FindHandlerType:%{public}d", handlerType,
355                 iter->second.handlerType_);
356             return RET_ERR;
357         }
358         monitorHandlers_.erase(iter);
359     }
360 
361     if (handlerType == InputHandlerType::INTERCEPTOR) {
362         for (auto it = interHandlers_.begin(); it != interHandlers_.end(); ++it) {
363             if (handlerId == it->handlerId_) {
364                 deviceTags = it->deviceTags_;
365                 interHandlers_.erase(it);
366                 break;
367             }
368         }
369     }
370     return RET_OK;
371 }
372 
UpdateAddToServerActions()373 void InputHandlerManager::UpdateAddToServerActions()
374 {
375     std::vector<int32_t> addToServerActions;
376     for (const auto &[key, value] : actionsMonitorHandlers_) {
377         for (auto action : value.actionsType_) {
378             if (std::find(addToServerActions.begin(), addToServerActions.end(), action) ==
379                 addToServerActions.end()) {
380                 addToServerActions.push_back(action);
381             }
382         }
383     }
384     addToServerActions_.clear();
385     addToServerActions_ = addToServerActions;
386 }
387 
RemoveLocalActions(int32_t handlerId,InputHandlerType handlerType)388 int32_t InputHandlerManager::RemoveLocalActions(int32_t handlerId, InputHandlerType handlerType)
389 {
390     if (handlerType == InputHandlerType::MONITOR) {
391         auto iter = actionsMonitorHandlers_.find(handlerId);
392         if (iter == actionsMonitorHandlers_.end()) {
393             MMI_HILOGE("No handler with specified");
394             return RET_ERR;
395         }
396         if (handlerType != iter->second.handlerType_) {
397             MMI_HILOGE("Unmatched handler type, FindHandlerType:%{public}d", iter->second.handlerType_);
398             return RET_ERR;
399         }
400         actionsMonitorHandlers_.erase(iter);
401         UpdateAddToServerActions();
402     }
403     return RET_OK;
404 }
405 
RemoveFromServer(InputHandlerType handlerType,HandleEventType eventType,int32_t priority,uint32_t deviceTags,std::vector<int32_t> actionsType)406 int32_t InputHandlerManager::RemoveFromServer(InputHandlerType handlerType, HandleEventType eventType, int32_t priority,
407     uint32_t deviceTags, std::vector<int32_t> actionsType)
408 {
409     int32_t ret = MULTIMODAL_INPUT_CONNECT_MGR->RemoveInputHandler(handlerType, eventType,
410         priority, deviceTags, actionsType);
411     if (ret != 0) {
412         MMI_HILOGE("Send to server failed, ret:%{public}d", ret);
413     }
414     return ret;
415 }
416 
GetNextId()417 int32_t InputHandlerManager::GetNextId()
418 {
419     if (nextId_ == std::numeric_limits<int32_t>::max()) {
420         MMI_HILOGE("Exceeded limit of 32-bit maximum number of integers");
421         return INVALID_HANDLER_ID;
422     }
423     return nextId_++;
424 }
425 
FindHandler(int32_t handlerId)426 std::shared_ptr<IInputEventConsumer> InputHandlerManager::FindHandler(int32_t handlerId)
427 {
428     if (GetHandlerType() == InputHandlerType::MONITOR) {
429         auto iter = monitorHandlers_.find(handlerId);
430         if (iter != monitorHandlers_.end()) {
431             return iter->second.consumer_;
432         }
433     }
434     if (GetHandlerType() == InputHandlerType::INTERCEPTOR) {
435         for (const auto &item : interHandlers_) {
436             if (item.handlerId_ == handlerId) {
437                 return item.consumer_;
438             }
439         }
440     }
441     return nullptr;
442 }
443 
444 #ifdef OHOS_BUILD_ENABLE_KEYBOARD
OnInputEvent(std::shared_ptr<KeyEvent> keyEvent,uint32_t deviceTags)445 void InputHandlerManager::OnInputEvent(std::shared_ptr<KeyEvent> keyEvent, uint32_t deviceTags)
446 {
447     CHK_PID_AND_TID();
448     CHKPV(keyEvent);
449     BytraceAdapter::StartBytrace(keyEvent, BytraceAdapter::TRACE_STOP, BytraceAdapter::KEY_INTERCEPT_EVENT);
450     if (GetHandlerType() == InputHandlerType::MONITOR) {
451         std::map<int32_t, Handler> tempMonitorHandlers;
452         {
453             std::lock_guard guard(mtxHandlers_);
454             tempMonitorHandlers = monitorHandlers_;
455         }
456         for (const auto &item : tempMonitorHandlers) {
457             if ((item.second.eventType_ & HANDLE_EVENT_TYPE_KEY) != HANDLE_EVENT_TYPE_KEY) {
458                 continue;
459             }
460             int32_t handlerId = item.first;
461             std::shared_ptr<IInputEventConsumer> consumer = item.second.consumer_;
462             CHKPV(consumer);
463             {
464                 std::lock_guard guard(mtxHandlers_);
465                 auto iter = monitorHandlers_.find(handlerId);
466                 if (iter == monitorHandlers_.end()) {
467                     MMI_HILOGE("No handler with specified");
468                     continue;
469                 }
470             }
471             consumer->OnInputEvent(keyEvent);
472             MMI_HILOG_DISPATCHD("Key event id:%{public}d keyCode:%{private}d",
473                 handlerId, keyEvent->GetKeyCode());
474         }
475     }
476     if (GetHandlerType() == InputHandlerType::INTERCEPTOR) {
477         std::lock_guard guard(mtxHandlers_);
478         for (const auto &item : interHandlers_) {
479             if ((item.eventType_ & HANDLE_EVENT_TYPE_KEY) != HANDLE_EVENT_TYPE_KEY) {
480                 continue;
481             }
482             int32_t handlerId = item.handlerId_;
483             std::shared_ptr<IInputEventConsumer> consumer = item.consumer_;
484             CHKPV(consumer);
485             consumer->OnInputEvent(keyEvent);
486             MMI_HILOG_DISPATCHD("Key event id:%{public}d keyCode:%{private}d",
487                 handlerId, keyEvent->GetKeyCode());
488             break;
489         }
490     }
491 }
492 #endif // OHOS_BUILD_ENABLE_KEYBOARD
493 
494 #if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)
CheckInputDeviceSource(const std::shared_ptr<PointerEvent> pointerEvent,uint32_t deviceTags) const495 bool InputHandlerManager::CheckInputDeviceSource(
496     const std::shared_ptr<PointerEvent> pointerEvent, uint32_t deviceTags) const
497 {
498     if ((pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_TOUCHSCREEN) &&
499         ((deviceTags & CapabilityToTags(InputDeviceCapability::INPUT_DEV_CAP_TOUCH)) ||
500         (deviceTags & CapabilityToTags(InputDeviceCapability::INPUT_DEV_CAP_TABLET_TOOL)))) {
501         return true;
502     } else if ((pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_MOUSE) &&
503         (deviceTags & CapabilityToTags(InputDeviceCapability::INPUT_DEV_CAP_POINTER))) {
504         return true;
505     } else if ((pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_TOUCHPAD) &&
506         (deviceTags & CapabilityToTags(InputDeviceCapability::INPUT_DEV_CAP_POINTER))) {
507         return true;
508     }
509     return false;
510 }
511 
GetConsumerInfos(std::shared_ptr<PointerEvent> pointerEvent,uint32_t deviceTags,std::map<int32_t,std::shared_ptr<IInputEventConsumer>> & consumerInfos)512 void InputHandlerManager::GetConsumerInfos(std::shared_ptr<PointerEvent> pointerEvent, uint32_t deviceTags,
513     std::map<int32_t, std::shared_ptr<IInputEventConsumer>> &consumerInfos)
514 {
515     std::lock_guard guard(mtxHandlers_);
516     int32_t consumerCount = 0;
517     if (GetHandlerType() == InputHandlerType::MONITOR) {
518         lastPointerEvent_ = std::make_shared<PointerEvent>(*pointerEvent);
519         consumerCount = GetMonitorConsumerInfos(pointerEvent, consumerInfos);
520     }
521     if (GetHandlerType() == InputHandlerType::INTERCEPTOR) {
522         for (const auto &item : interHandlers_) {
523             if ((item.eventType_ & HANDLE_EVENT_TYPE_POINTER) != HANDLE_EVENT_TYPE_POINTER) {
524                 continue;
525             }
526             if (((deviceTags & item.deviceTags_) == item.deviceTags_) &&
527                 !CheckInputDeviceSource(pointerEvent, item.deviceTags_)) {
528                 continue;
529             }
530             int32_t handlerId = item.handlerId_;
531             std::shared_ptr<IInputEventConsumer> consumer = item.consumer_;
532             CHKPV(consumer);
533             auto ret = consumerInfos.emplace(handlerId, consumer);
534             if (!ret.second) {
535                 MMI_HILOGI("Duplicate handler:%{public}d", handlerId);
536                 continue;
537             }
538             consumerCount++;
539             break;
540         }
541     }
542 
543     if (consumerCount == 0) {
544         MMI_HILOGD("All task post failed");
545         return;
546     }
547     int32_t tokenType = MULTIMODAL_INPUT_CONNECT_MGR->GetTokenType();
548     if (tokenType != TokenType::TOKEN_HAP && tokenType != TokenType::TOKEN_SYSTEM_HAP) {
549         return;
550     }
551     AddMouseEventId(pointerEvent);
552 }
553 
AddMouseEventId(std::shared_ptr<PointerEvent> pointerEvent)554 void InputHandlerManager::AddMouseEventId(std::shared_ptr<PointerEvent> pointerEvent)
555 {
556     if (pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_MOUSE) {
557         mouseEventIds_.emplace(pointerEvent->GetId());
558     }
559 }
560 
IsPinchType(std::shared_ptr<PointerEvent> pointerEvent)561 bool InputHandlerManager::IsPinchType(std::shared_ptr<PointerEvent> pointerEvent)
562 {
563     CHKPF(pointerEvent);
564     if (pointerEvent->GetSourceType() != PointerEvent::SOURCE_TYPE_MOUSE &&
565         pointerEvent->GetSourceType() != PointerEvent::SOURCE_TYPE_TOUCHPAD) {
566         return false;
567     }
568     if ((pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_AXIS_BEGIN &&
569         pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_AXIS_UPDATE &&
570         pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_AXIS_END)) {
571         return false;
572     }
573     return true;
574 }
575 
IsRotateType(std::shared_ptr<PointerEvent> pointerEvent)576 bool InputHandlerManager::IsRotateType(std::shared_ptr<PointerEvent> pointerEvent)
577 {
578     CHKPF(pointerEvent);
579     if (pointerEvent->GetSourceType() != PointerEvent::SOURCE_TYPE_MOUSE ||
580         (pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_ROTATE_BEGIN &&
581         pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_ROTATE_UPDATE &&
582         pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_ROTATE_END)) {
583         return false;
584     }
585     return true;
586 }
587 
588 
IsThreeFingersSwipeType(std::shared_ptr<PointerEvent> pointerEvent)589 bool InputHandlerManager::IsThreeFingersSwipeType(std::shared_ptr<PointerEvent> pointerEvent)
590 {
591     CHKPF(pointerEvent);
592     if (pointerEvent->GetSourceType() != PointerEvent::SOURCE_TYPE_TOUCHPAD ||
593         pointerEvent->GetFingerCount() != THREE_FINGERS ||
594         (pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_SWIPE_BEGIN &&
595         pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_SWIPE_UPDATE &&
596         pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_SWIPE_END)) {
597         return false;
598     }
599     return true;
600 }
601 
IsFourFingersSwipeType(std::shared_ptr<PointerEvent> pointerEvent)602 bool InputHandlerManager::IsFourFingersSwipeType(std::shared_ptr<PointerEvent> pointerEvent)
603 {
604     CHKPF(pointerEvent);
605     if (pointerEvent->GetSourceType() != PointerEvent::SOURCE_TYPE_TOUCHPAD ||
606         pointerEvent->GetFingerCount() != FOUR_FINGERS ||
607         (pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_SWIPE_BEGIN &&
608         pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_SWIPE_UPDATE &&
609         pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_SWIPE_END)) {
610         return false;
611     }
612     return true;
613 }
614 
IsThreeFingersTapType(std::shared_ptr<PointerEvent> pointerEvent)615 bool InputHandlerManager::IsThreeFingersTapType(std::shared_ptr<PointerEvent> pointerEvent)
616 {
617     CHKPF(pointerEvent);
618     if (pointerEvent->GetSourceType() != PointerEvent::SOURCE_TYPE_TOUCHPAD ||
619         pointerEvent->GetFingerCount() != THREE_FINGERS ||
620         (pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_TRIPTAP)) {
621         return false;
622     }
623     return true;
624 }
625 
626 #ifdef OHOS_BUILD_ENABLE_FINGERPRINT
IsFingerprintType(std::shared_ptr<PointerEvent> pointerEvent)627 bool InputHandlerManager::IsFingerprintType(std::shared_ptr<PointerEvent> pointerEvent)
628 {
629     CHKPF(pointerEvent);
630     if (pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_FINGERPRINT &&
631         ((PointerEvent::POINTER_ACTION_FINGERPRINT_DOWN <= pointerEvent->GetPointerAction() &&
632         pointerEvent->GetPointerAction() <= PointerEvent::POINTER_ACTION_FINGERPRINT_CLICK) ||
633         pointerEvent->GetPointerAction() == PointerEvent::POINTER_ACTION_FINGERPRINT_CANCEL ||
634         pointerEvent->GetPointerAction() == PointerEvent::POINTER_ACTION_FINGERPRINT_HOLD ||
635         pointerEvent->GetPointerAction() == PointerEvent::POINTER_ACTION_FINGERPRINT_TOUCH)) {
636             return true;
637     }
638     MMI_HILOGD("not fingerprint event");
639     return false;
640 }
641 #endif // OHOS_BUILD_ENABLE_FINGERPRINT
642 
643 #ifdef OHOS_BUILD_ENABLE_X_KEY
IsXKeyType(std::shared_ptr<PointerEvent> pointerEvent)644 bool InputHandlerManager::IsXKeyType(std::shared_ptr<PointerEvent> pointerEvent)
645 {
646     CHKPF(pointerEvent);
647     if (pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_X_KEY) {
648         return true;
649     }
650     MMI_HILOGD("Not X-key event");
651     return false;
652 }
653 #endif // OHOS_BUILD_ENABLE_X_KEY
654 
CheckIfNeedAddToConsumerInfos(const Handler & monitor,std::shared_ptr<PointerEvent> pointerEvent)655 bool InputHandlerManager::CheckIfNeedAddToConsumerInfos(const Handler &monitor,
656     std::shared_ptr<PointerEvent> pointerEvent)
657 {
658     CHKPF(pointerEvent);
659 #ifdef OHOS_BUILD_ENABLE_FINGERPRINT
660     if ((monitor.eventType_ & HANDLE_EVENT_TYPE_FINGERPRINT) == HANDLE_EVENT_TYPE_FINGERPRINT &&
661         IsFingerprintType(pointerEvent)) {
662         return true;
663     }
664 #endif // OHOS_BUILD_ENABLE_FINGERPRINT
665 #ifdef OHOS_BUILD_ENABLE_X_KEY
666     if ((monitor.eventType_ & HANDLE_EVENT_TYPE_X_KEY) == HANDLE_EVENT_TYPE_X_KEY &&
667         IsXKeyType(pointerEvent)) {
668         return true;
669     }
670 #endif // OHOS_BUILD_ENABLE_X_KEY
671     if ((monitor.eventType_ & HANDLE_EVENT_TYPE_POINTER) == HANDLE_EVENT_TYPE_POINTER) {
672         return true;
673     } else if ((monitor.eventType_ & HANDLE_EVENT_TYPE_TOUCH_GESTURE) == HANDLE_EVENT_TYPE_TOUCH_GESTURE) {
674         return true;
675     } else if ((monitor.eventType_ & HANDLE_EVENT_TYPE_SWIPEINWARD) == HANDLE_EVENT_TYPE_SWIPEINWARD) {
676         return true;
677     } else if ((monitor.eventType_ & HANDLE_EVENT_TYPE_TOUCH) == HANDLE_EVENT_TYPE_TOUCH &&
678         pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_TOUCHSCREEN) {
679         return true;
680     } else if ((monitor.eventType_ & HANDLE_EVENT_TYPE_MOUSE) == HANDLE_EVENT_TYPE_MOUSE &&
681         pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_MOUSE) {
682         return true;
683     } else if ((monitor.eventType_ & HANDLE_EVENT_TYPE_PINCH) == HANDLE_EVENT_TYPE_PINCH &&
684         IsPinchType(pointerEvent)) {
685         return true;
686     } else if ((monitor.eventType_ & HANDLE_EVENT_TYPE_THREEFINGERSSWIP) == HANDLE_EVENT_TYPE_THREEFINGERSSWIP &&
687         IsThreeFingersSwipeType(pointerEvent)) {
688         return true;
689     } else if ((monitor.eventType_ & HANDLE_EVENT_TYPE_FOURFINGERSSWIP) == HANDLE_EVENT_TYPE_FOURFINGERSSWIP &&
690         IsFourFingersSwipeType(pointerEvent)) {
691         return true;
692     } else if ((monitor.eventType_ & HANDLE_EVENT_TYPE_ROTATE) == HANDLE_EVENT_TYPE_ROTATE &&
693         IsRotateType(pointerEvent)) {
694         return true;
695     } else if ((monitor.eventType_ & HANDLE_EVENT_TYPE_THREEFINGERSTAP) == HANDLE_EVENT_TYPE_THREEFINGERSTAP &&
696         IsThreeFingersTapType(pointerEvent)) {
697         return true;
698     }
699     return false;
700 }
701 
GetMonitorConsumerInfos(std::shared_ptr<PointerEvent> pointerEvent,std::map<int32_t,std::shared_ptr<IInputEventConsumer>> & consumerInfos)702 int32_t InputHandlerManager::GetMonitorConsumerInfos(std::shared_ptr<PointerEvent> pointerEvent,
703     std::map<int32_t, std::shared_ptr<IInputEventConsumer>> &consumerInfos)
704 {
705     int32_t consumerCount = 0;
706     CHKPR(pointerEvent, consumerCount);
707     MMI_HILOG_DISPATCHD("id:%{public}d ac:%{public}d recv", pointerEvent->GetId(), pointerEvent->GetPointerAction());
708     for (const auto &item : monitorHandlers_) {
709         if (!CheckIfNeedAddToConsumerInfos(item.second, pointerEvent)) {
710             continue;
711         }
712         if (!IsMatchGesture(item.second, pointerEvent->GetPointerAction(), pointerEvent->GetPointerCount())) {
713             continue;
714         }
715         int32_t handlerId = item.first;
716         std::shared_ptr<IInputEventConsumer> consumer = item.second.consumer_;
717         CHKPR(consumer, INVALID_HANDLER_ID);
718         auto ret = consumerInfos.emplace(handlerId, consumer);
719         if (!ret.second) {
720             MMI_HILOGI("Duplicate handler:%{public}d", handlerId);
721             continue;
722         }
723         consumerCount++;
724     }
725     for (const auto &item : actionsMonitorHandlers_) {
726         for (auto action : item.second.actionsType_) {
727             if (action != pointerEvent->GetPointerAction()) {
728                 continue;
729             }
730             int32_t handlerId = item.first;
731             std::shared_ptr<IInputEventConsumer> consumer = item.second.consumer_;
732             CHKPR(consumer, INVALID_HANDLER_ID);
733             auto ret = consumerInfos.emplace(handlerId, consumer);
734             if (!ret.second) {
735                 MMI_HILOGI("Duplicate handler:%{public}d", handlerId);
736                 continue;
737             }
738             consumerCount++;
739         }
740     }
741     return consumerCount;
742 }
743 
OnInputEvent(std::shared_ptr<PointerEvent> pointerEvent,uint32_t deviceTags)744 void InputHandlerManager::OnInputEvent(std::shared_ptr<PointerEvent> pointerEvent, uint32_t deviceTags)
745 {
746     CHK_PID_AND_TID();
747     CHKPV(pointerEvent);
748     BytraceAdapter::StartBytrace(pointerEvent, BytraceAdapter::TRACE_STOP, BytraceAdapter::POINT_INTERCEPT_EVENT);
749     std::map<int32_t, std::shared_ptr<IInputEventConsumer>> consumerInfos;
750     GetConsumerInfos(pointerEvent, deviceTags, consumerInfos);
751     for (auto iter = consumerInfos.begin(); iter != consumerInfos.end(); ++iter) {
752         auto tempEvent = std::make_shared<PointerEvent>(*pointerEvent);
753         PointerEvent::PointerItem pointerItem;
754         tempEvent->GetPointerItem(tempEvent->GetPointerId(), pointerItem);
755         if (std::next(iter) == consumerInfos.end()) {
756             tempEvent->SetProcessedCallback(monitorCallbackConsume_);
757         } else {
758             tempEvent->SetProcessedCallback(monitorCallback_);
759         }
760         if (tempEvent->GetPointerAction() == PointerEvent::POINTER_ACTION_SWIPE_BEGIN ||
761             tempEvent->GetPointerAction() == PointerEvent::POINTER_ACTION_SWIPE_END) {
762             MMI_HILOGI("Swipe event sended to handler! action type:%{public}d finger count:%{public}d",
763                 tempEvent->GetPointerAction(),
764                 tempEvent->GetFingerCount());
765         }
766         CHKPV(iter->second);
767         auto consumer = iter->second;
768         consumer->OnInputEvent(tempEvent);
769         MMI_HILOG_DISPATCHD("Pointer event id:%{public}d pointerId:%{public}d",
770             iter->first, pointerEvent->GetPointerId());
771     }
772 }
773 #endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH
774 
775 #if defined(OHOS_BUILD_ENABLE_INTERCEPTOR) || defined(OHOS_BUILD_ENABLE_MONITOR)
776 template<typename T>
RecoverPointerEvent(std::initializer_list<T> pointerActionEvents,T pointerActionEvent)777 bool InputHandlerManager::RecoverPointerEvent(std::initializer_list<T> pointerActionEvents, T pointerActionEvent)
778 {
779     CALL_INFO_TRACE;
780     std::unique_lock lock(mtxHandlers_);
781     CHKPF(lastPointerEvent_);
782     int32_t pointerAction = lastPointerEvent_->GetPointerAction();
783     for (const auto &it : pointerActionEvents) {
784         if (pointerAction == it) {
785             PointerEvent::PointerItem item;
786             int32_t pointerId = lastPointerEvent_->GetPointerId();
787             if (!lastPointerEvent_->GetPointerItem(pointerId, item)) {
788                 MMI_HILOG_DISPATCHD("Get pointer item failed. pointer:%{public}d",
789                     pointerId);
790                 return false;
791             }
792             item.SetPressed(false);
793             lastPointerEvent_->UpdatePointerItem(pointerId, item);
794             lastPointerEvent_->SetPointerAction(pointerActionEvent);
795             auto copiedPointerEvent = std::make_shared<PointerEvent>(*lastPointerEvent_);
796             lock.unlock();
797 #if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)
798             OnInputEvent(copiedPointerEvent, DEVICE_TAGS);
799 #endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH
800             return true;
801         }
802     }
803     return false;
804 }
805 
OnDisconnected()806 void InputHandlerManager::OnDisconnected()
807 {
808     CALL_INFO_TRACE;
809     std::initializer_list<int32_t> pointerActionSwipeEvents { PointerEvent::POINTER_ACTION_SWIPE_UPDATE,
810         PointerEvent::POINTER_ACTION_SWIPE_BEGIN };
811     if (RecoverPointerEvent(pointerActionSwipeEvents, PointerEvent::POINTER_ACTION_SWIPE_END)) {
812         MMI_HILOGE("Swipe end event for service exception re-sending");
813         return;
814     }
815 }
816 
OnConnected()817 void InputHandlerManager::OnConnected()
818 {
819     std::lock_guard guard(mtxHandlers_);
820     MMI_HILOGI("Reregister gesture monitors on reconnection");
821     RegisterGestureMonitors();
822     MMI_HILOGI("Enable event monitors(interceptors) on reconnection");
823     HandleEventType eventType = GetEventType();
824     int32_t priority = GetPriority();
825     uint32_t deviceTags = GetDeviceTags();
826     std::vector<int32_t> actionsType = GetActionsType();
827     if (eventType != HANDLE_EVENT_TYPE_NONE || !actionsType.empty()) {
828         AddToServer(GetHandlerType(), eventType, priority, deviceTags, actionsType);
829     }
830 }
831 #endif // OHOS_BUILD_ENABLE_INTERCEPTOR || OHOS_BUILD_ENABLE_MONITOR
832 
HasHandler(int32_t handlerId)833 bool InputHandlerManager::HasHandler(int32_t handlerId)
834 {
835     std::lock_guard guard(mtxHandlers_);
836     bool hasHandler = false;
837     if (GetHandlerType() == InputHandlerType::MONITOR) {
838         auto iter = monitorHandlers_.find(handlerId);
839         hasHandler = (iter != monitorHandlers_.end()) ? true : false;
840         if (!hasHandler) {
841             auto iter = actionsMonitorHandlers_.find(handlerId);
842             return (iter != actionsMonitorHandlers_.end());
843         }
844         return hasHandler;
845     }
846     if (GetHandlerType() == InputHandlerType::INTERCEPTOR) {
847         for (const auto &item : interHandlers_) {
848             if (item.handlerId_ == handlerId) {
849                 return true;
850             }
851         }
852     }
853     return false;
854 }
855 
GetEventType() const856 HandleEventType InputHandlerManager::GetEventType() const
857 {
858     uint32_t eventType{ HANDLE_EVENT_TYPE_NONE };
859     if (GetHandlerType() == InputHandlerType::MONITOR) {
860         if (monitorHandlers_.empty()) {
861             MMI_HILOGD("The monitorHandlers_ is empty");
862             return HANDLE_EVENT_TYPE_NONE;
863         }
864         for (const auto &inputHandler : monitorHandlers_) {
865             eventType |= inputHandler.second.eventType_;
866         }
867     }
868 
869     if (GetHandlerType() == InputHandlerType::INTERCEPTOR) {
870         if (interHandlers_.empty()) {
871             MMI_HILOGD("The interHandlers_ is empty");
872             return HANDLE_EVENT_TYPE_NONE;
873         }
874         for (const auto &interHandler : interHandlers_) {
875             eventType |= interHandler.eventType_;
876         }
877     }
878     return eventType;
879 }
880 
GetPriority() const881 int32_t InputHandlerManager::GetPriority() const
882 {
883     int32_t priority{ DEFUALT_INTERCEPTOR_PRIORITY };
884     if (GetHandlerType() == InputHandlerType::INTERCEPTOR) {
885         if (!interHandlers_.empty()) {
886             priority = interHandlers_.front().priority_;
887         }
888     }
889     return priority;
890 }
891 
GetDeviceTags() const892 uint32_t InputHandlerManager::GetDeviceTags() const
893 {
894     uint32_t deviceTags = 0;
895     if (GetHandlerType() == InputHandlerType::INTERCEPTOR) {
896         for (const auto &item : interHandlers_) {
897             deviceTags |= item.deviceTags_;
898         }
899     }
900     if (GetHandlerType() == InputHandlerType::MONITOR) {
901         for (const auto &item : monitorHandlers_) {
902             deviceTags |= item.second.deviceTags_;
903         }
904     }
905     return deviceTags;
906 }
907 
GetActionsType() const908 std::vector<int32_t> InputHandlerManager::GetActionsType() const
909 {
910     return addToServerActions_;
911 }
912 
OnDispatchEventProcessed(int32_t eventId,int64_t actionTime)913 void InputHandlerManager::OnDispatchEventProcessed(int32_t eventId, int64_t actionTime)
914 {
915     std::lock_guard guard(mtxHandlers_);
916     CALL_DEBUG_ENTER;
917     MMIClientPtr client = MMIEventHdl.GetMMIClient();
918     CHKPV(client);
919     if (mouseEventIds_.find(eventId) != mouseEventIds_.end()) {
920         mouseEventIds_.erase(eventId);
921         return;
922     }
923 }
924 
OnDispatchEventProcessed(int32_t eventId,int64_t actionTime,bool isNeedConsume)925 void InputHandlerManager::OnDispatchEventProcessed(int32_t eventId, int64_t actionTime, bool isNeedConsume)
926 {
927     OnDispatchEventProcessed(eventId, actionTime);
928     ANRHDL->SetLastProcessedEventId(ANR_MONITOR, eventId, actionTime);
929 }
930 
IsMatchGesture(const Handler & handler,int32_t action,int32_t count)931 bool InputHandlerManager::IsMatchGesture(const Handler &handler, int32_t action, int32_t count)
932 {
933     if ((handler.eventType_ & HANDLE_EVENT_TYPE_TOUCH_GESTURE) != HANDLE_EVENT_TYPE_TOUCH_GESTURE) {
934         return true;
935     }
936     auto iter = monitorHandlers_.find(handler.handlerId_);
937     if (iter == monitorHandlers_.end()) {
938         return false;
939     }
940     GestureHandler &gestureHandler = iter->second.gestureHandler_;
941     TouchGestureType type = TOUCH_GESTURE_TYPE_NONE;
942     switch (action) {
943         case PointerEvent::TOUCH_ACTION_SWIPE_DOWN:
944         case PointerEvent::TOUCH_ACTION_SWIPE_UP:
945         case PointerEvent::TOUCH_ACTION_SWIPE_RIGHT:
946         case PointerEvent::TOUCH_ACTION_SWIPE_LEFT:
947             type = TOUCH_GESTURE_TYPE_SWIPE;
948             break;
949         case PointerEvent::TOUCH_ACTION_PINCH_OPENED:
950         case PointerEvent::TOUCH_ACTION_PINCH_CLOSEED:
951             type = TOUCH_GESTURE_TYPE_PINCH;
952             break;
953         case PointerEvent::TOUCH_ACTION_GESTURE_END: {
954             if (!gestureHandler.gestureState) {
955                 return false;
956             }
957             gestureHandler.gestureState = false;
958             return true;
959         }
960         default: {
961             MMI_HILOGD("Unknown action:%{public}d", action);
962             return false;
963         }
964     }
965     if (((gestureHandler.gestureType & type) == type) &&
966         (gestureHandler.fingers == count || gestureHandler.fingers == ALL_FINGER_COUNT)) {
967         gestureHandler.gestureState = true;
968         return true;
969     }
970     return false;
971 }
972 
RegisterGestureMonitors() const973 void InputHandlerManager::RegisterGestureMonitors() const
974 {
975     for (const auto &[_, handler] : monitorHandlers_) {
976         if ((handler.eventType_ & HANDLE_EVENT_TYPE_TOUCH_GESTURE) != HANDLE_EVENT_TYPE_TOUCH_GESTURE) {
977             continue;
978         }
979         MMI_HILOGI("AddGestureMonitor(%{public}u, %{public}d) to server",
980             handler.gestureHandler_.gestureType, handler.gestureHandler_.fingers);
981         auto ret = MULTIMODAL_INPUT_CONNECT_MGR->AddGestureMonitor(
982             InputHandlerType::MONITOR, HANDLE_EVENT_TYPE_TOUCH_GESTURE,
983             handler.gestureHandler_.gestureType, handler.gestureHandler_.fingers);
984         if (ret != RET_OK) {
985             MMI_HILOGE("AddGestureMonitor to server fail, ret:%{public}d", ret);
986         }
987     }
988 }
989 } // namespace MMI
990 } // namespace OHOS
991