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