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 <cinttypes>
19 
20 #include "anr_handler.h"
21 #include "bytrace_adapter.h"
22 #include "input_handler_type.h"
23 #include "mmi_log.h"
24 #include "multimodal_event_handler.h"
25 #include "multimodal_input_connect_manager.h"
26 #include "napi_constants.h"
27 #include "net_packet.h"
28 #include "proto.h"
29 
30 #undef MMI_LOG_TAG
31 #define MMI_LOG_TAG "InputHandlerManager"
32 
33 namespace OHOS {
34 namespace MMI {
35 namespace {
36 constexpr int32_t DEVICE_TAGS { 1 };
37 constexpr int32_t THREE_FINGERS { 3 };
38 constexpr int32_t FOUR_FINGERS { 4 };
39 } // namespace
InputHandlerManager()40 InputHandlerManager::InputHandlerManager()
41 {
42     monitorCallback_ =
43         [this] (int32_t eventId, int64_t actionTime) { return this->OnDispatchEventProcessed(eventId, actionTime); };
44     monitorCallbackConsume_ =
45         [this] (int32_t eventId, int64_t actionTime) {
46             return this->OnDispatchEventProcessed(eventId, actionTime, true);
47         };
48 }
49 
AddHandler(InputHandlerType handlerType,std::shared_ptr<IInputEventConsumer> consumer,HandleEventType eventType,int32_t priority,uint32_t deviceTags)50 int32_t InputHandlerManager::AddHandler(InputHandlerType handlerType, std::shared_ptr<IInputEventConsumer> consumer,
51     HandleEventType eventType, int32_t priority, uint32_t deviceTags)
52 {
53     CALL_DEBUG_ENTER;
54     CHKPR(consumer, INVALID_HANDLER_ID);
55     if (handlerType == InputHandlerType::INTERCEPTOR) {
56         eventType = HANDLE_EVENT_TYPE_NONE;
57         if ((deviceTags & CapabilityToTags(InputDeviceCapability::INPUT_DEV_CAP_KEYBOARD)) != 0) {
58             eventType |= HANDLE_EVENT_TYPE_KEY;
59         }
60         if ((deviceTags & (CapabilityToTags(InputDeviceCapability::INPUT_DEV_CAP_MAX) -
61             CapabilityToTags(InputDeviceCapability::INPUT_DEV_CAP_KEYBOARD))) != 0) {
62             eventType |= HANDLE_EVENT_TYPE_POINTER;
63         }
64     }
65     std::lock_guard<std::mutex> guard(mtxHandlers_);
66     CHKFR(((monitorHandlers_.size() + interHandlers_.size()) < MAX_N_INPUT_HANDLERS), ERROR_EXCEED_MAX_COUNT,
67           "The number of handlers exceeds the maximum");
68     int32_t handlerId = GetNextId();
69     CHKFR((handlerId != INVALID_HANDLER_ID), INVALID_HANDLER_ID, "Exceeded limit of 32-bit maximum number of integers");
70     CHKFR((eventType != HANDLE_EVENT_TYPE_NONE), INVALID_HANDLER_ID, "Invalid event type");
71     const HandleEventType currentType = GetEventType();
72     MMI_HILOGD("Register new handler:%{public}d, currentType:%{public}d, deviceTags:%{public}d", handlerId, currentType,
73         deviceTags);
74     uint32_t currentTags = GetDeviceTags();
75     if (RET_OK == AddLocal(handlerId, handlerType, eventType, priority, deviceTags, consumer)) {
76         MMI_HILOGD("New handler successfully registered, report to server");
77         const HandleEventType newType = GetEventType();
78         if (currentType != newType || ((currentTags & deviceTags) != deviceTags)) {
79             uint32_t allDeviceTags = GetDeviceTags();
80             MMI_HILOGD("handlerType:%{public}d, newType:%{public}d, deviceTags:%{public}d, priority:%{public}d",
81                 handlerType, newType, allDeviceTags, priority);
82             int32_t ret = AddToServer(handlerType, newType, priority, allDeviceTags);
83             if (ret != RET_OK) {
84                 MMI_HILOGE("Add Handler:%{public}d:%{public}d to server failed, (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                 RemoveLocal(handlerId, handlerType, allDeviceTags);
88                 return ret;
89             }
90         }
91         MMI_HILOGI("Finish add Handler:%{public}d:%{public}d, (eventType,deviceTag) current:"
92                    " (%{public}d, %{public}d), new: (%{public}d, %{public}d), priority:%{public}d",
93                    handlerType, handlerId, currentType, currentTags, newType, deviceTags, priority);
94     } else {
95         MMI_HILOGE("Add Handler:%{public}d:%{public}d local failed, (eventType,deviceTag,priority): "
96                    "(%{public}d, %{public}d, %{public}d)", handlerType, handlerId, eventType, deviceTags, priority);
97         handlerId = INVALID_HANDLER_ID;
98     }
99     return handlerId;
100 }
101 
RemoveHandler(int32_t handlerId,InputHandlerType handlerType)102 int32_t InputHandlerManager::RemoveHandler(int32_t handlerId, InputHandlerType handlerType)
103 {
104     CALL_DEBUG_ENTER;
105     MMI_HILOGD("Unregister handler:%{public}d,type:%{public}d", handlerId, handlerType);
106     std::lock_guard<std::mutex> guard(mtxHandlers_);
107     const HandleEventType currentType = GetEventType();
108     uint32_t currentTags = GetDeviceTags();
109     uint32_t deviceTags = 0;
110     int32_t ret = RemoveLocal(handlerId, handlerType, deviceTags);
111     if (ret == RET_OK) {
112         const HandleEventType newType = GetEventType();
113         const int32_t newLevel = GetPriority();
114         const uint64_t newTags = GetDeviceTags();
115         if (currentType != newType || ((currentTags & deviceTags) != 0)) {
116             ret = RemoveFromServer(handlerType, newType, newLevel, newTags);
117             if (ret != RET_OK) {
118                 return ret;
119             }
120         }
121         MMI_HILOGI("Remove Handler:%{public}d:%{public}d, (eventType,deviceTag): (%{public}d:%{public}d) ",
122                    handlerType, handlerId, currentType, currentTags);
123     }
124     return ret;
125 }
126 
AddLocal(int32_t handlerId,InputHandlerType handlerType,HandleEventType eventType,int32_t priority,uint32_t deviceTags,std::shared_ptr<IInputEventConsumer> monitor)127 int32_t InputHandlerManager::AddLocal(int32_t handlerId, InputHandlerType handlerType, HandleEventType eventType,
128     int32_t priority, uint32_t deviceTags, std::shared_ptr<IInputEventConsumer> monitor)
129 {
130     InputHandlerManager::Handler handler{
131         .handlerId_ = handlerId,
132         .handlerType_ = handlerType,
133         .eventType_ = eventType,
134         .priority_ = priority,
135         .deviceTags_ = deviceTags,
136         .consumer_ = monitor,
137     };
138     if (handlerType == InputHandlerType::MONITOR) {
139         auto ret = monitorHandlers_.emplace(handler.handlerId_, handler);
140         if (!ret.second) {
141             MMI_HILOGE("Duplicate handler:%{public}d", handler.handlerId_);
142             return RET_ERR;
143         }
144     }
145     if (handlerType == InputHandlerType::INTERCEPTOR) {
146         auto iterIndex = interHandlers_.begin();
147         for (; iterIndex != interHandlers_.end(); ++iterIndex) {
148             if (handler.priority_ < iterIndex->priority_) {
149                 break;
150             }
151         }
152         auto iter = interHandlers_.emplace(iterIndex, handler);
153         if (iter == interHandlers_.end()) {
154             MMI_HILOGE("Add new handler failed");
155             return RET_ERR;
156         }
157     }
158     return RET_OK;
159 }
160 
AddToServer(InputHandlerType handlerType,HandleEventType eventType,int32_t priority,uint32_t deviceTags)161 int32_t InputHandlerManager::AddToServer(InputHandlerType handlerType, HandleEventType eventType, int32_t priority,
162     uint32_t deviceTags)
163 {
164     int32_t ret = MULTIMODAL_INPUT_CONNECT_MGR->AddInputHandler(handlerType, eventType, priority, deviceTags);
165     if (ret != RET_OK) {
166         MMI_HILOGE("Send to server failed, ret:%{public}d", ret);
167     }
168     return ret;
169 }
170 
RemoveLocal(int32_t handlerId,InputHandlerType handlerType,uint32_t & deviceTags)171 int32_t InputHandlerManager::RemoveLocal(int32_t handlerId, InputHandlerType handlerType, uint32_t &deviceTags)
172 {
173     if (handlerType == InputHandlerType::MONITOR) {
174         auto iter = monitorHandlers_.find(handlerId);
175         if (iter == monitorHandlers_.end()) {
176             MMI_HILOGE("No handler with specified");
177             return RET_ERR;
178         }
179         if (handlerType != iter->second.handlerType_) {
180             MMI_HILOGE("Unmatched handler type, InputHandlerType:%{public}d,FindHandlerType:%{public}d", handlerType,
181                 iter->second.handlerType_);
182             return RET_ERR;
183         }
184         monitorHandlers_.erase(iter);
185     }
186 
187     if (handlerType == InputHandlerType::INTERCEPTOR) {
188         for (auto it = interHandlers_.begin(); it != interHandlers_.end(); ++it) {
189             if (handlerId == it->handlerId_) {
190                 deviceTags = it->deviceTags_;
191                 interHandlers_.erase(it);
192                 break;
193             }
194         }
195     }
196     return RET_OK;
197 }
198 
RemoveFromServer(InputHandlerType handlerType,HandleEventType eventType,int32_t priority,uint32_t deviceTags)199 int32_t InputHandlerManager::RemoveFromServer(InputHandlerType handlerType, HandleEventType eventType, int32_t priority,
200     uint32_t deviceTags)
201 {
202     int32_t ret = MULTIMODAL_INPUT_CONNECT_MGR->RemoveInputHandler(handlerType, eventType, priority, deviceTags);
203     if (ret != 0) {
204         MMI_HILOGE("Send to server failed, ret:%{public}d", ret);
205     }
206     return ret;
207 }
208 
GetNextId()209 int32_t InputHandlerManager::GetNextId()
210 {
211     if (nextId_ == std::numeric_limits<int32_t>::max()) {
212         MMI_HILOGE("Exceeded limit of 32-bit maximum number of integers");
213         return INVALID_HANDLER_ID;
214     }
215     return nextId_++;
216 }
217 
FindHandler(int32_t handlerId)218 std::shared_ptr<IInputEventConsumer> InputHandlerManager::FindHandler(int32_t handlerId)
219 {
220     if (GetHandlerType() == InputHandlerType::MONITOR) {
221         auto iter = monitorHandlers_.find(handlerId);
222         if (iter != monitorHandlers_.end()) {
223             return iter->second.consumer_;
224         }
225     }
226     if (GetHandlerType() == InputHandlerType::INTERCEPTOR) {
227         for (const auto &item : interHandlers_) {
228             if (item.handlerId_ == handlerId) {
229                 return item.consumer_;
230             }
231         }
232     }
233     return nullptr;
234 }
235 
236 #ifdef OHOS_BUILD_ENABLE_KEYBOARD
OnInputEvent(std::shared_ptr<KeyEvent> keyEvent,uint32_t deviceTags)237 void InputHandlerManager::OnInputEvent(std::shared_ptr<KeyEvent> keyEvent, uint32_t deviceTags)
238 {
239     CHK_PID_AND_TID();
240     CHKPV(keyEvent);
241     std::lock_guard<std::mutex> guard(mtxHandlers_);
242     BytraceAdapter::StartBytrace(keyEvent, BytraceAdapter::TRACE_STOP, BytraceAdapter::KEY_INTERCEPT_EVENT);
243     if (GetHandlerType() == InputHandlerType::MONITOR) {
244         for (const auto &item : monitorHandlers_) {
245             if ((item.second.eventType_ & HANDLE_EVENT_TYPE_KEY) != HANDLE_EVENT_TYPE_KEY) {
246                 continue;
247             }
248             int32_t handlerId = item.first;
249             std::shared_ptr<IInputEventConsumer> consumer = item.second.consumer_;
250             CHKPV(consumer);
251             consumer->OnInputEvent(keyEvent);
252             MMI_HILOG_DISPATCHD("Key event id:%{public}d keyCode:%{private}d",
253                 handlerId, keyEvent->GetKeyCode());
254         }
255     }
256     if (GetHandlerType() == InputHandlerType::INTERCEPTOR) {
257         for (const auto &item : interHandlers_) {
258             if ((item.eventType_ & HANDLE_EVENT_TYPE_KEY) != HANDLE_EVENT_TYPE_KEY) {
259                 continue;
260             }
261             int32_t handlerId = item.handlerId_;
262             std::shared_ptr<IInputEventConsumer> consumer = item.consumer_;
263             CHKPV(consumer);
264             consumer->OnInputEvent(keyEvent);
265             MMI_HILOG_DISPATCHD("Key event id:%{public}d keyCode:%{private}d",
266                 handlerId, keyEvent->GetKeyCode());
267             break;
268         }
269     }
270 }
271 #endif // OHOS_BUILD_ENABLE_KEYBOARD
272 
273 #if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)
CheckInputDeviceSource(const std::shared_ptr<PointerEvent> pointerEvent,uint32_t deviceTags) const274 bool InputHandlerManager::CheckInputDeviceSource(
275     const std::shared_ptr<PointerEvent> pointerEvent, uint32_t deviceTags) const
276 {
277     if ((pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_TOUCHSCREEN) &&
278         ((deviceTags & CapabilityToTags(InputDeviceCapability::INPUT_DEV_CAP_TOUCH)) ||
279         (deviceTags & CapabilityToTags(InputDeviceCapability::INPUT_DEV_CAP_TABLET_TOOL)))) {
280         return true;
281     } else if ((pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_MOUSE) &&
282         (deviceTags & CapabilityToTags(InputDeviceCapability::INPUT_DEV_CAP_POINTER))) {
283         return true;
284     } else if ((pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_TOUCHPAD) &&
285         (deviceTags & CapabilityToTags(InputDeviceCapability::INPUT_DEV_CAP_POINTER))) {
286         return true;
287     }
288     return false;
289 }
290 
GetConsumerInfos(std::shared_ptr<PointerEvent> pointerEvent,uint32_t deviceTags,std::map<int32_t,std::shared_ptr<IInputEventConsumer>> & consumerInfos)291 void InputHandlerManager::GetConsumerInfos(std::shared_ptr<PointerEvent> pointerEvent, uint32_t deviceTags,
292     std::map<int32_t, std::shared_ptr<IInputEventConsumer>> &consumerInfos)
293 {
294     std::lock_guard<std::mutex> guard(mtxHandlers_);
295     int32_t consumerCount = 0;
296     if (GetHandlerType() == InputHandlerType::MONITOR) {
297         lastPointerEvent_ = std::make_shared<PointerEvent>(*pointerEvent);
298         consumerCount = GetMonitorConsumerInfos(pointerEvent, consumerInfos);
299     }
300     if (GetHandlerType() == InputHandlerType::INTERCEPTOR) {
301         for (const auto &item : interHandlers_) {
302             if ((item.eventType_ & HANDLE_EVENT_TYPE_POINTER) != HANDLE_EVENT_TYPE_POINTER) {
303                 continue;
304             }
305             if (((deviceTags & item.deviceTags_) == item.deviceTags_) &&
306                 !CheckInputDeviceSource(pointerEvent, item.deviceTags_)) {
307                 continue;
308             }
309             int32_t handlerId = item.handlerId_;
310             std::shared_ptr<IInputEventConsumer> consumer = item.consumer_;
311             CHKPV(consumer);
312             auto ret = consumerInfos.emplace(handlerId, consumer);
313             if (!ret.second) {
314                 MMI_HILOGI("Duplicate handler:%{public}d", handlerId);
315                 continue;
316             }
317             consumerCount++;
318             break;
319         }
320     }
321 
322     if (consumerCount == 0) {
323         MMI_HILOGE("All task post failed");
324         return;
325     }
326     int32_t tokenType = MULTIMODAL_INPUT_CONNECT_MGR->GetTokenType();
327     if (tokenType != TokenType::TOKEN_HAP && tokenType != TokenType::TOKEN_SYSTEM_HAP) {
328         return;
329     }
330     AddMouseEventId(pointerEvent);
331 }
332 
AddMouseEventId(std::shared_ptr<PointerEvent> pointerEvent)333 void InputHandlerManager::AddMouseEventId(std::shared_ptr<PointerEvent> pointerEvent)
334 {
335     if (pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_MOUSE) {
336         mouseEventIds_.emplace(pointerEvent->GetId());
337     }
338 }
339 
340 
IsPinchType(std::shared_ptr<PointerEvent> pointerEvent)341 bool InputHandlerManager::IsPinchType(std::shared_ptr<PointerEvent> pointerEvent)
342 {
343     CHKPF(pointerEvent);
344     if (pointerEvent->GetSourceType() != PointerEvent::SOURCE_TYPE_MOUSE &&
345         pointerEvent->GetSourceType() != PointerEvent::SOURCE_TYPE_TOUCHPAD) {
346         return false;
347     }
348     if ((pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_AXIS_BEGIN &&
349         pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_AXIS_UPDATE &&
350         pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_AXIS_END)) {
351         return false;
352     }
353     return true;
354 }
355 
IsRotateType(std::shared_ptr<PointerEvent> pointerEvent)356 bool InputHandlerManager::IsRotateType(std::shared_ptr<PointerEvent> pointerEvent)
357 {
358     CHKPF(pointerEvent);
359     if (pointerEvent->GetSourceType() != PointerEvent::SOURCE_TYPE_MOUSE ||
360         (pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_ROTATE_BEGIN &&
361         pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_ROTATE_UPDATE &&
362         pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_ROTATE_END)) {
363         return false;
364     }
365     return true;
366 }
367 
368 
IsThreeFingersSwipeType(std::shared_ptr<PointerEvent> pointerEvent)369 bool InputHandlerManager::IsThreeFingersSwipeType(std::shared_ptr<PointerEvent> pointerEvent)
370 {
371     CHKPF(pointerEvent);
372     if (pointerEvent->GetSourceType() != PointerEvent::SOURCE_TYPE_TOUCHPAD ||
373         pointerEvent->GetFingerCount() != THREE_FINGERS ||
374         (pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_SWIPE_BEGIN &&
375         pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_SWIPE_UPDATE &&
376         pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_SWIPE_END)) {
377         return false;
378     }
379     return true;
380 }
381 
IsFourFingersSwipeType(std::shared_ptr<PointerEvent> pointerEvent)382 bool InputHandlerManager::IsFourFingersSwipeType(std::shared_ptr<PointerEvent> pointerEvent)
383 {
384     CHKPF(pointerEvent);
385     if (pointerEvent->GetSourceType() != PointerEvent::SOURCE_TYPE_TOUCHPAD ||
386         pointerEvent->GetFingerCount() != FOUR_FINGERS ||
387         (pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_SWIPE_BEGIN &&
388         pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_SWIPE_UPDATE &&
389         pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_SWIPE_END)) {
390         return false;
391     }
392     return true;
393 }
394 
IsThreeFingersTapType(std::shared_ptr<PointerEvent> pointerEvent)395 bool InputHandlerManager::IsThreeFingersTapType(std::shared_ptr<PointerEvent> pointerEvent)
396 {
397     CHKPR(pointerEvent, ERROR_NULL_POINTER);
398     if (pointerEvent->GetSourceType() != PointerEvent::SOURCE_TYPE_TOUCHPAD ||
399         pointerEvent->GetFingerCount() != THREE_FINGERS ||
400         (pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_TRIPTAP)) {
401         return false;
402     }
403     return true;
404 }
405 
406 #ifdef OHOS_BUILD_ENABLE_FINGERPRINT
IsFingerprintType(std::shared_ptr<PointerEvent> pointerEvent)407 bool InputHandlerManager::IsFingerprintType(std::shared_ptr<PointerEvent> pointerEvent)
408 {
409     CHKPR(pointerEvent, ERROR_NULL_POINTER);
410     if (pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_FINGERPRINT &&
411         (PointerEvent::POINTER_ACTION_FINGERPRINT_DOWN <= pointerEvent->GetPointerAction() &&
412         pointerEvent->GetPointerAction() <= PointerEvent::POINTER_ACTION_FINGERPRINT_CLICK)) {
413             return true;
414     }
415     MMI_HILOGD("not fingerprint event");
416     return false;
417 }
418 #endif
419 
CheckIfNeedAddToConsumerInfos(const Handler & monitor,std::shared_ptr<PointerEvent> pointerEvent)420 bool InputHandlerManager::CheckIfNeedAddToConsumerInfos(const Handler &monitor,
421     std::shared_ptr<PointerEvent> pointerEvent)
422 {
423 #ifdef OHOS_BUILD_ENABLE_FINGERPRINT
424     if ((monitor.eventType_ & HANDLE_EVENT_TYPE_FINGERPRINT) == HANDLE_EVENT_TYPE_FINGERPRINT &&
425         IsFingerprintType(pointerEvent)) {
426         return true;
427     }
428 #endif // OHOS_BUILD_ENABLE_FINGERPRINT
429     if ((monitor.eventType_ & HANDLE_EVENT_TYPE_POINTER) == HANDLE_EVENT_TYPE_POINTER) {
430         return true;
431     } else if ((monitor.eventType_ & HANDLE_EVENT_TYPE_SWIPEINWARD) == HANDLE_EVENT_TYPE_SWIPEINWARD) {
432         return true;
433     } else if ((monitor.eventType_ & HANDLE_EVENT_TYPE_TOUCH) == HANDLE_EVENT_TYPE_TOUCH &&
434         pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_TOUCHSCREEN) {
435         return true;
436     } else if ((monitor.eventType_ & HANDLE_EVENT_TYPE_MOUSE) == HANDLE_EVENT_TYPE_MOUSE &&
437         pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_MOUSE) {
438         return true;
439     } else if ((monitor.eventType_ & HANDLE_EVENT_TYPE_PINCH) == HANDLE_EVENT_TYPE_PINCH &&
440         IsPinchType(pointerEvent)) {
441         return true;
442     } else if ((monitor.eventType_ & HANDLE_EVENT_TYPE_THREEFINGERSSWIP) == HANDLE_EVENT_TYPE_THREEFINGERSSWIP &&
443         IsThreeFingersSwipeType(pointerEvent)) {
444         return true;
445     } else if ((monitor.eventType_ & HANDLE_EVENT_TYPE_FOURFINGERSSWIP) == HANDLE_EVENT_TYPE_FOURFINGERSSWIP &&
446         IsFourFingersSwipeType(pointerEvent)) {
447         return true;
448     } else if ((monitor.eventType_ & HANDLE_EVENT_TYPE_ROTATE) == HANDLE_EVENT_TYPE_ROTATE &&
449         IsRotateType(pointerEvent)) {
450         return true;
451     } else if ((monitor.eventType_ & HANDLE_EVENT_TYPE_THREEFINGERSTAP) == HANDLE_EVENT_TYPE_THREEFINGERSTAP &&
452         IsThreeFingersTapType(pointerEvent)) {
453         return true;
454     }
455     return false;
456 }
457 
GetMonitorConsumerInfos(std::shared_ptr<PointerEvent> pointerEvent,std::map<int32_t,std::shared_ptr<IInputEventConsumer>> & consumerInfos)458 int32_t InputHandlerManager::GetMonitorConsumerInfos(std::shared_ptr<PointerEvent> pointerEvent,
459     std::map<int32_t, std::shared_ptr<IInputEventConsumer>> &consumerInfos)
460 {
461     int32_t consumerCount = 0;
462     MMI_HILOG_DISPATCHD("id:%{public}d ac:%{public}d recv", pointerEvent->GetId(), pointerEvent->GetPointerAction());
463     for (const auto &item : monitorHandlers_) {
464         if (!CheckIfNeedAddToConsumerInfos(item.second, pointerEvent)) {
465             continue;
466         }
467         int32_t handlerId = item.first;
468         std::shared_ptr<IInputEventConsumer> consumer = item.second.consumer_;
469         CHKPR(consumer, INVALID_HANDLER_ID);
470         auto ret = consumerInfos.emplace(handlerId, consumer);
471         if (!ret.second) {
472             MMI_HILOGI("Duplicate handler:%{public}d", handlerId);
473             continue;
474         }
475         consumerCount++;
476     }
477     return consumerCount;
478 }
479 
OnInputEvent(std::shared_ptr<PointerEvent> pointerEvent,uint32_t deviceTags)480 void InputHandlerManager::OnInputEvent(std::shared_ptr<PointerEvent> pointerEvent, uint32_t deviceTags)
481 {
482     CHK_PID_AND_TID();
483     CHKPV(pointerEvent);
484     BytraceAdapter::StartBytrace(pointerEvent, BytraceAdapter::TRACE_STOP, BytraceAdapter::POINT_INTERCEPT_EVENT);
485     std::map<int32_t, std::shared_ptr<IInputEventConsumer>> consumerInfos;
486     GetConsumerInfos(pointerEvent, deviceTags, consumerInfos);
487     for (auto iter = consumerInfos.begin(); iter != consumerInfos.end(); ++iter) {
488         auto tempEvent = std::make_shared<PointerEvent>(*pointerEvent);
489         if (std::next(iter) == consumerInfos.end()) {
490             tempEvent->SetProcessedCallback(monitorCallbackConsume_);
491         } else {
492             tempEvent->SetProcessedCallback(monitorCallback_);
493         }
494         CHKPV(iter->second);
495         auto consumer = iter->second;
496         consumer->OnInputEvent(tempEvent);
497         MMI_HILOG_DISPATCHD("Pointer event id:%{public}d pointerId:%{public}d",
498             iter->first, pointerEvent->GetPointerId());
499     }
500 }
501 #endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH
502 
503 #if defined(OHOS_BUILD_ENABLE_INTERCEPTOR) || defined(OHOS_BUILD_ENABLE_MONITOR)
504 template<typename T>
RecoverPointerEvent(std::initializer_list<T> pointerActionEvents,T pointerActionEvent)505 bool InputHandlerManager::RecoverPointerEvent(std::initializer_list<T> pointerActionEvents, T pointerActionEvent)
506 {
507     CALL_INFO_TRACE;
508     std::unique_lock<std::mutex> lock(mtxHandlers_);
509     CHKPF(lastPointerEvent_);
510     int32_t pointerAction = lastPointerEvent_->GetPointerAction();
511     for (const auto &it : pointerActionEvents) {
512         if (pointerAction == it) {
513             PointerEvent::PointerItem item;
514             int32_t pointerId = lastPointerEvent_->GetPointerId();
515             if (!lastPointerEvent_->GetPointerItem(pointerId, item)) {
516                 MMI_HILOG_DISPATCHD("Get pointer item failed. pointer:%{public}d",
517                     pointerId);
518                 return false;
519             }
520             item.SetPressed(false);
521             lastPointerEvent_->UpdatePointerItem(pointerId, item);
522             lastPointerEvent_->SetPointerAction(pointerActionEvent);
523             auto copiedPointerEvent = std::make_shared<PointerEvent>(*lastPointerEvent_);
524             lock.unlock();
525 #if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)
526             OnInputEvent(copiedPointerEvent, DEVICE_TAGS);
527 #endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH
528             return true;
529         }
530     }
531     return false;
532 }
533 
OnDisconnected()534 void InputHandlerManager::OnDisconnected()
535 {
536     CALL_INFO_TRACE;
537     std::initializer_list<int32_t> pointerActionSwipeEvents { PointerEvent::POINTER_ACTION_SWIPE_UPDATE,
538         PointerEvent::POINTER_ACTION_SWIPE_BEGIN };
539     if (RecoverPointerEvent(pointerActionSwipeEvents, PointerEvent::POINTER_ACTION_SWIPE_END)) {
540         MMI_HILOGE("Swipe end event for service exception re-sending");
541         return;
542     }
543 }
544 
OnConnected()545 void InputHandlerManager::OnConnected()
546 {
547     CALL_DEBUG_ENTER;
548     HandleEventType eventType = GetEventType();
549     int32_t priority = GetPriority();
550     uint32_t deviceTags = GetDeviceTags();
551     if (eventType != HANDLE_EVENT_TYPE_NONE) {
552         AddToServer(GetHandlerType(), eventType, priority, deviceTags);
553     }
554 }
555 #endif // OHOS_BUILD_ENABLE_INTERCEPTOR || OHOS_BUILD_ENABLE_MONITOR
556 
HasHandler(int32_t handlerId)557 bool InputHandlerManager::HasHandler(int32_t handlerId)
558 {
559     std::lock_guard<std::mutex> guard(mtxHandlers_);
560     if (GetHandlerType() == InputHandlerType::MONITOR) {
561         auto iter = monitorHandlers_.find(handlerId);
562         return (iter != monitorHandlers_.end());
563     }
564     if (GetHandlerType() == InputHandlerType::INTERCEPTOR) {
565         for (const auto &item : interHandlers_) {
566             if (item.handlerId_ == handlerId) {
567                 return true;
568             }
569         }
570     }
571     return false;
572 }
573 
GetEventType() const574 HandleEventType InputHandlerManager::GetEventType() const
575 {
576     uint32_t eventType{ HANDLE_EVENT_TYPE_NONE };
577     if (GetHandlerType() == InputHandlerType::MONITOR) {
578         if (monitorHandlers_.empty()) {
579             MMI_HILOGD("monitorHandlers_ is empty");
580             return HANDLE_EVENT_TYPE_NONE;
581         }
582         for (const auto &inputHandler : monitorHandlers_) {
583             eventType |= inputHandler.second.eventType_;
584         }
585     }
586 
587     if (GetHandlerType() == InputHandlerType::INTERCEPTOR) {
588         if (interHandlers_.empty()) {
589             MMI_HILOGD("interHandlers_ is empty");
590             return HANDLE_EVENT_TYPE_NONE;
591         }
592         for (const auto &interHandler : interHandlers_) {
593             eventType |= interHandler.eventType_;
594         }
595     }
596     return eventType;
597 }
598 
GetPriority() const599 int32_t InputHandlerManager::GetPriority() const
600 {
601     int32_t priority{ DEFUALT_INTERCEPTOR_PRIORITY };
602     if (GetHandlerType() == InputHandlerType::INTERCEPTOR) {
603         if (!interHandlers_.empty()) {
604             priority = interHandlers_.front().priority_;
605         }
606     }
607     return priority;
608 }
609 
GetDeviceTags() const610 uint32_t InputHandlerManager::GetDeviceTags() const
611 {
612     uint32_t deviceTags = 0;
613     if (GetHandlerType() == InputHandlerType::INTERCEPTOR) {
614         for (const auto &item : interHandlers_) {
615             deviceTags |= item.deviceTags_;
616         }
617     }
618     if (GetHandlerType() == InputHandlerType::MONITOR) {
619         for (const auto &item : monitorHandlers_) {
620             deviceTags |= item.second.deviceTags_;
621         }
622     }
623     return deviceTags;
624 }
625 
OnDispatchEventProcessed(int32_t eventId,int64_t actionTime)626 void InputHandlerManager::OnDispatchEventProcessed(int32_t eventId, int64_t actionTime)
627 {
628     std::lock_guard<std::mutex> guard(mtxHandlers_);
629     CALL_DEBUG_ENTER;
630     MMIClientPtr client = MMIEventHdl.GetMMIClient();
631     CHKPV(client);
632     if (mouseEventIds_.find(eventId) != mouseEventIds_.end()) {
633         mouseEventIds_.erase(eventId);
634         return;
635     }
636 }
637 
OnDispatchEventProcessed(int32_t eventId,int64_t actionTime,bool isNeedConsume)638 void InputHandlerManager::OnDispatchEventProcessed(int32_t eventId, int64_t actionTime, bool isNeedConsume)
639 {
640     OnDispatchEventProcessed(eventId, actionTime);
641     ANRHDL->SetLastProcessedEventId(ANR_MONITOR, eventId, actionTime);
642 }
643 } // namespace MMI
644 } // namespace OHOS
645