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 } // namespace
InputHandlerManager()38 InputHandlerManager::InputHandlerManager()
39 {
40     monitorCallback_ =
41         [this] (int32_t eventId, int64_t actionTime) { return this->OnDispatchEventProcessed(eventId, actionTime); };
42     monitorCallbackConsume_ =
43         [this] (int32_t eventId, int64_t actionTime) {
44             return this->OnDispatchEventProcessed(eventId, actionTime, true);
45         };
46 }
47 
AddHandler(InputHandlerType handlerType, std::shared_ptr<IInputEventConsumer> consumer, HandleEventType eventType, int32_t priority, uint32_t deviceTags)48 int32_t InputHandlerManager::AddHandler(InputHandlerType handlerType, std::shared_ptr<IInputEventConsumer> consumer,
49     HandleEventType eventType, int32_t priority, uint32_t deviceTags)
50 {
51     CALL_DEBUG_ENTER;
52     CHKPR(consumer, INVALID_HANDLER_ID);
53     if (handlerType == InputHandlerType::INTERCEPTOR) {
54         eventType = HANDLE_EVENT_TYPE_NONE;
55         if ((deviceTags & CapabilityToTags(InputDeviceCapability::INPUT_DEV_CAP_KEYBOARD)) != 0) {
56             eventType |= HANDLE_EVENT_TYPE_KEY;
57         }
58         if ((deviceTags & (CapabilityToTags(InputDeviceCapability::INPUT_DEV_CAP_MAX) -
59             CapabilityToTags(InputDeviceCapability::INPUT_DEV_CAP_KEYBOARD))) != 0) {
60             eventType |= HANDLE_EVENT_TYPE_POINTER;
61         }
62     }
63     std::lock_guard<std::mutex> guard(mtxHandlers_);
64     CHKFR(((monitorHandlers_.size() + interHandlers_.size()) < MAX_N_INPUT_HANDLERS), ERROR_EXCEED_MAX_COUNT,
65           "The number of handlers exceeds the maximum");
66     int32_t handlerId = GetNextId();
67     CHKFR((handlerId != INVALID_HANDLER_ID), INVALID_HANDLER_ID, "Exceeded limit of 32-bit maximum number of integers");
68     CHKFR((eventType != HANDLE_EVENT_TYPE_NONE), INVALID_HANDLER_ID, "Invalid event type");
69     const HandleEventType currentType = GetEventType();
70     MMI_HILOGD("Register new handler:%{public}d, currentType:%{public}d, deviceTags:%{public}d", handlerId, currentType,
71         deviceTags);
72     uint32_t currentTags = GetDeviceTags();
73     if (RET_OK == AddLocal(handlerId, handlerType, eventType, priority, deviceTags, consumer)) {
74         MMI_HILOGD("New handler successfully registered, report to server");
75         const HandleEventType newType = GetEventType();
76         if (currentType != newType || ((currentTags & deviceTags) != deviceTags)) {
77             uint32_t allDeviceTags = GetDeviceTags();
78             MMI_HILOGD("handlerType:%{public}d, newType:%{public}d, deviceTags:%{public}d, priority:%{public}d",
79                 handlerType, newType, allDeviceTags, priority);
80             int32_t ret = AddToServer(handlerType, newType, priority, allDeviceTags);
81             if (ret != RET_OK) {
82                 MMI_HILOGE("Add Handler:%{public}d:%{public}d to server failed, (eventType,deviceTag) current: "
83                            "(%{public}d, %{public}d), new: (%{public}d, %{public}d), priority:%{public}d",
84                            handlerType, handlerId, currentType, currentTags, newType, deviceTags, priority);
85                 RemoveLocal(handlerId, handlerType, allDeviceTags);
86                 return ret;
87             }
88         }
89         MMI_HILOGI("Finish add Handler:%{public}d:%{public}d, (eventType,deviceTag) current:"
90                    " (%{public}d, %{public}d), new: (%{public}d, %{public}d), priority:%{public}d",
91                    handlerType, handlerId, currentType, currentTags, newType, deviceTags, priority);
92     } else {
93         MMI_HILOGE("Add Handler:%{public}d:%{public}d local failed, (eventType,deviceTag,priority): "
94                    "(%{public}d, %{public}d, %{public}d)", handlerType, handlerId, eventType, deviceTags, priority);
95         handlerId = INVALID_HANDLER_ID;
96     }
97     return handlerId;
98 }
99 
AddGestureMonitor( InputHandlerType handlerType, std::shared_ptr<IInputEventConsumer> consumer, HandleEventType eventType, TouchGestureType gestureType, int32_t fingers)100 int32_t InputHandlerManager::AddGestureMonitor(
101     InputHandlerType handlerType, std::shared_ptr<IInputEventConsumer> consumer,
102     HandleEventType eventType, TouchGestureType gestureType, int32_t fingers)
103 {
104     CHKPR(consumer, INVALID_HANDLER_ID);
105     std::lock_guard<std::mutex> guard(mtxHandlers_);
106     CHKFR(((monitorHandlers_.size() + interHandlers_.size()) < MAX_N_INPUT_HANDLERS), ERROR_EXCEED_MAX_COUNT,
107           "The number of handlers exceeds the maximum");
108     int32_t handlerId = GetNextId();
109     CHKFR((handlerId != INVALID_HANDLER_ID), INVALID_HANDLER_ID,
110         "Exceeded limit of 32-bit maximum number of integers");
111     CHKFR((eventType != HANDLE_EVENT_TYPE_NONE), INVALID_HANDLER_ID, "Invalid event type");
112     int32_t ret = AddGestureToLocal(handlerId, eventType, gestureType, fingers, consumer);
113     if (ret == RET_OK) {
114         const HandleEventType newType = GetEventType();
115         ret = MULTIMODAL_INPUT_CONNECT_MGR->AddGestureMonitor(handlerType, newType, gestureType, fingers);
116         if (ret != RET_OK) {
117             MMI_HILOGE("Add gesture handler:%{public}d to server failed, ret:%{public}d", gestureType, ret);
118             uint32_t deviceTags = 0;
119             RemoveLocal(handlerId, handlerType, deviceTags);
120             return INVALID_HANDLER_ID;
121         }
122         MMI_HILOGI("Finish add gesture handler(%{public}d:%{public}d:%{public}d:%{public}d) to server",
123             handlerId, eventType, gestureType, fingers);
124     } else {
125         handlerId = INVALID_HANDLER_ID;
126     }
127     return handlerId;
128 }
129 
AddHandler(InputHandlerType handlerType, std::shared_ptr<IInputEventConsumer> consumer, std::vector<int32_t> actionsType)130 int32_t InputHandlerManager::AddHandler(InputHandlerType handlerType, std::shared_ptr<IInputEventConsumer> consumer,
131     std::vector<int32_t> actionsType)
132 {
133     CALL_DEBUG_ENTER;
134     CHKPR(consumer, INVALID_HANDLER_ID);
135     std::lock_guard<std::mutex> guard(mtxHandlers_);
136     CHKFR(((actionsMonitorHandlers_.size() + monitorHandlers_.size() + interHandlers_.size()) <
137         MAX_N_INPUT_HANDLERS), ERROR_EXCEED_MAX_COUNT, "The number of handlers exceeds the maximum");
138     int32_t handlerId = GetNextId();
139     CHKFR((handlerId != INVALID_HANDLER_ID), INVALID_HANDLER_ID, "Exceeded limit of 32-bit maximum number of integers");
140     MMI_HILOGD("Register new handler:%{public}d", handlerId);
141     if (RET_OK == AddLocal(handlerId, handlerType, actionsType, consumer)) {
142         MMI_HILOGD("New handler successfully registered, report to server");
143         if (IsNeedAddToServer(actionsType)) {
144             MMI_HILOGD("handlerType:%{public}d", handlerType);
145             int32_t ret = AddToServer(handlerType, HANDLE_EVENT_TYPE_NONE, 0, 0, actionsType);
146             if (ret != RET_OK) {
147                 MMI_HILOGE("Add Handler:%{public}d:%{public}d to server failed", handlerType, handlerId);
148                 RemoveLocalActions(handlerId, handlerType);
149                 return ret;
150             }
151         }
152         MMI_HILOGI("Finish add Handler:%{public}d:%{public}d to server", handlerType, handlerId);
153     } else {
154         MMI_HILOGE("Add Handler:%{public}d:%{public}d local failed", handlerType, handlerId);
155         handlerId = INVALID_HANDLER_ID;
156     }
157     return handlerId;
158 }
159 
RemoveGestureMonitor(int32_t handlerId, InputHandlerType handlerType)160 int32_t InputHandlerManager::RemoveGestureMonitor(int32_t handlerId, InputHandlerType handlerType)
161 {
162     std::lock_guard<std::mutex> guard(mtxHandlers_);
163     auto iter = monitorHandlers_.find(handlerId);
164     if (iter == monitorHandlers_.end()) {
165         MMI_HILOGE("No handler(%{public}d) with specified", handlerId);
166         return RET_ERR;
167     }
168     const auto gestureHandler = iter->second.gestureHandler_;
169     monitorHandlers_.erase(iter);
170     const HandleEventType newType = GetEventType();
171 
172     int32_t ret = MULTIMODAL_INPUT_CONNECT_MGR->RemoveGestureMonitor(handlerType, newType,
173         gestureHandler.gestureType, gestureHandler.fingers);
174     if (ret != RET_OK) {
175         MMI_HILOGE("Remove gesture handler:%{public}d to server failed, ret:%{public}d",
176             gestureHandler.gestureType, ret);
177     } else {
178         MMI_HILOGI("Finish remove gesture handler:%{public}d:%{public}d:%{public}d,(%{public}d,%{public}d)",
179             handlerType, newType, handlerId, gestureHandler.gestureType, gestureHandler.fingers);
180     }
181     return ret;
182 }
183 
IsNeedAddToServer(std::vector<int32_t> actionsType)184 bool InputHandlerManager::IsNeedAddToServer(std::vector<int32_t> actionsType)
185 {
186     bool isNeedAddToServer = false;
187     for (auto action : actionsType) {
188         if (std::find(addToServerActions_.begin(), addToServerActions_.end(), action) == addToServerActions_.end()) {
189             addToServerActions_.push_back(action);
190             isNeedAddToServer = true;
191         }
192     }
193     return isNeedAddToServer;
194 }
195 
RemoveHandler(int32_t handlerId, InputHandlerType handlerType)196 int32_t InputHandlerManager::RemoveHandler(int32_t handlerId, InputHandlerType handlerType)
197 {
198     CALL_DEBUG_ENTER;
199     MMI_HILOGD("Unregister handler:%{public}d,type:%{public}d", handlerId, handlerType);
200     std::lock_guard<std::mutex> guard(mtxHandlers_);
201     uint32_t deviceTags = 0;
202     auto iter = monitorHandlers_.find(handlerId);
203     bool isInterHandlers = false;
204     for (auto inter = interHandlers_.begin(); inter != interHandlers_.end(); ++inter) {
205         if (handlerId == inter->handlerId_) {
206             isInterHandlers = true;
207             break;
208         }
209     }
210     if (iter != monitorHandlers_.end() || isInterHandlers) {
211         const HandleEventType currentType = GetEventType();
212         uint32_t currentTags = GetDeviceTags();
213         int32_t ret = RemoveLocal(handlerId, handlerType, deviceTags);
214         const HandleEventType newType = GetEventType();
215         const int32_t newLevel = GetPriority();
216         const uint64_t newTags = GetDeviceTags();
217         if (ret == RET_OK && (currentType != newType || ((currentTags & deviceTags) != 0))) {
218             ret = RemoveFromServer(handlerType, newType, newLevel, newTags);
219             if (ret != RET_OK) {
220                 return ret;
221             }
222             MMI_HILOGI("Remove Handler:%{public}d:%{public}d, (eventType,deviceTag): (%{public}d:%{public}d) ",
223                 handlerType, handlerId, currentType, currentTags);
224         }
225         return ret;
226     }
227 
228     auto it = actionsMonitorHandlers_.find(handlerId);
229     if (it != actionsMonitorHandlers_.end()) {
230         std::vector<int32_t> actionsType = it->second.actionsType_;
231         size_t currentSize = addToServerActions_.size();
232         int32_t ret = RemoveLocalActions(handlerId, handlerType);
233         size_t newSize = addToServerActions_.size();
234         if (ret == RET_OK && currentSize != newSize) {
235             ret = RemoveFromServer(handlerType, HANDLE_EVENT_TYPE_NONE, 0, 0, actionsType);
236             if (ret != RET_OK) {
237                 return ret;
238             }
239             MMI_HILOGI("Remove Handler:%{public}d:%{public}d", handlerType, handlerId);
240         }
241         return ret;
242     }
243     return RET_ERR;
244 }
245 
AddGestureToLocal(int32_t handlerId, HandleEventType eventType, TouchGestureType gestureType, int32_t fingers, std::shared_ptr<IInputEventConsumer> consumer)246 int32_t InputHandlerManager::AddGestureToLocal(int32_t handlerId, HandleEventType eventType,
247     TouchGestureType gestureType, int32_t fingers, std::shared_ptr<IInputEventConsumer> consumer)
248 {
249     if ((eventType & HANDLE_EVENT_TYPE_TOUCH_GESTURE) != HANDLE_EVENT_TYPE_TOUCH_GESTURE) {
250         MMI_HILOGE("Illegal type:%{public}d", eventType);
251         return RET_ERR;
252     }
253     if (!CheckMonitorValid(gestureType, fingers)) {
254         MMI_HILOGE("Wrong number of fingers:%{public}d", fingers);
255         return RET_ERR;
256     }
257     for (const auto &handler : monitorHandlers_) {
258         if (handler.second.eventType_ == eventType &&
259             handler.second.gestureHandler_.gestureType == gestureType &&
260             handler.second.gestureHandler_.fingers == fingers) {
261             MMI_HILOGE("Gesture(%{public}d) listener already exists", gestureType);
262             return RET_ERR;
263         }
264     }
265     InputHandlerManager::Handler handler {
266         .handlerId_ = handlerId,
267         .handlerType_ = InputHandlerType::MONITOR,
268         .eventType_ = eventType,
269         .consumer_ = consumer,
270         .gestureHandler_ {
271             .gestureType = gestureType,
272             .fingers = fingers
273         }
274     };
275     auto ret = monitorHandlers_.emplace(handlerId, handler);
276     if (!ret.second) {
277         MMI_HILOGE("Duplicate handler:%{public}d", handlerId);
278         return RET_ERR;
279     }
280     return RET_OK;
281 }
282 
AddLocal(int32_t handlerId, InputHandlerType handlerType, HandleEventType eventType, int32_t priority, uint32_t deviceTags, std::shared_ptr<IInputEventConsumer> monitor)283 int32_t InputHandlerManager::AddLocal(int32_t handlerId, InputHandlerType handlerType, HandleEventType eventType,
284     int32_t priority, uint32_t deviceTags, std::shared_ptr<IInputEventConsumer> monitor)
285 {
286     InputHandlerManager::Handler handler {
287         .handlerId_ = handlerId,
288         .handlerType_ = handlerType,
289         .eventType_ = eventType,
290         .priority_ = priority,
291         .deviceTags_ = deviceTags,
292         .consumer_ = monitor,
293     };
294     if (handlerType == InputHandlerType::MONITOR) {
295         auto ret = monitorHandlers_.emplace(handler.handlerId_, handler);
296         if (!ret.second) {
297             MMI_HILOGE("Duplicate handler:%{public}d", handler.handlerId_);
298             return RET_ERR;
299         }
300     }
301     if (handlerType == InputHandlerType::INTERCEPTOR) {
302         auto iterIndex = interHandlers_.begin();
303         for (; iterIndex != interHandlers_.end(); ++iterIndex) {
304             if (handler.priority_ < iterIndex->priority_) {
305                 break;
306             }
307         }
308         auto iter = interHandlers_.emplace(iterIndex, handler);
309         if (iter == interHandlers_.end()) {
310             MMI_HILOGE("Add new handler failed");
311             return RET_ERR;
312         }
313     }
314     return RET_OK;
315 }
316 
AddLocal(int32_t handlerId, InputHandlerType handlerType, std::vector<int32_t> actionsType, std::shared_ptr<IInputEventConsumer> monitor)317 int32_t InputHandlerManager::AddLocal(int32_t handlerId, InputHandlerType handlerType, std::vector<int32_t> actionsType,
318     std::shared_ptr<IInputEventConsumer> monitor)
319 {
320     InputHandlerManager::Handler handler{
321         .handlerId_ = handlerId,
322         .handlerType_ = handlerType,
323         .eventType_ = HANDLE_EVENT_TYPE_NONE,
324         .consumer_ = monitor,
325         .actionsType_ = actionsType,
326     };
327     if (handlerType == InputHandlerType::MONITOR) {
328         auto ret = actionsMonitorHandlers_.emplace(handler.handlerId_, handler);
329         if (!ret.second) {
330             MMI_HILOGE("Actions duplicate handler:%{public}d", handler.handlerId_);
331             return RET_ERR;
332         }
333     }
334     return RET_OK;
335 }
336 
AddToServer(InputHandlerType handlerType, HandleEventType eventType, int32_t priority, uint32_t deviceTags, std::vector<int32_t> actionsType)337 int32_t InputHandlerManager::AddToServer(InputHandlerType handlerType, HandleEventType eventType, int32_t priority,
338     uint32_t deviceTags, std::vector<int32_t> actionsType)
339 {
340     int32_t ret = MULTIMODAL_INPUT_CONNECT_MGR->AddInputHandler(handlerType,
341         eventType, priority, deviceTags, actionsType);
342     if (ret != RET_OK) {
343         MMI_HILOGE("Send to server failed, ret:%{public}d", ret);
344     }
345     return ret;
346 }
347 
RemoveLocal(int32_t handlerId, InputHandlerType handlerType, uint32_t &deviceTags)348 int32_t InputHandlerManager::RemoveLocal(int32_t handlerId, InputHandlerType handlerType, uint32_t &deviceTags)
349 {
350     if (handlerType == InputHandlerType::MONITOR) {
351         auto iter = monitorHandlers_.find(handlerId);
352         if (iter == monitorHandlers_.end()) {
353             MMI_HILOGE("No handler with specified");
354             return RET_ERR;
355         }
356         if (handlerType != iter->second.handlerType_) {
357             MMI_HILOGE("Unmatched handler type, InputHandlerType:%{public}d,FindHandlerType:%{public}d", handlerType,
358                 iter->second.handlerType_);
359             return RET_ERR;
360         }
361         monitorHandlers_.erase(iter);
362     }
363 
364     if (handlerType == InputHandlerType::INTERCEPTOR) {
365         for (auto it = interHandlers_.begin(); it != interHandlers_.end(); ++it) {
366             if (handlerId == it->handlerId_) {
367                 deviceTags = it->deviceTags_;
368                 interHandlers_.erase(it);
369                 break;
370             }
371         }
372     }
373     return RET_OK;
374 }
375 
UpdateAddToServerActions()376 void InputHandlerManager::UpdateAddToServerActions()
377 {
378     std::vector<int32_t> addToServerActions;
379     for (const auto &[key, value] : actionsMonitorHandlers_) {
380         for (auto action : value.actionsType_) {
381             if (std::find(addToServerActions.begin(), addToServerActions.end(), action) ==
382                 addToServerActions.end()) {
383                 addToServerActions.push_back(action);
384             }
385         }
386     }
387     addToServerActions_.clear();
388     addToServerActions_ = addToServerActions;
389 }
390 
RemoveLocalActions(int32_t handlerId, InputHandlerType handlerType)391 int32_t InputHandlerManager::RemoveLocalActions(int32_t handlerId, InputHandlerType handlerType)
392 
393 {
394     if (handlerType == InputHandlerType::MONITOR) {
395         auto iter = actionsMonitorHandlers_.find(handlerId);
396         if (iter == actionsMonitorHandlers_.end()) {
397             MMI_HILOGE("No handler with specified");
398             return RET_ERR;
399         }
400         if (handlerType != iter->second.handlerType_) {
401             MMI_HILOGE("Unmatched handler type, FindHandlerType:%{public}d", iter->second.handlerType_);
402             return RET_ERR;
403         }
404         actionsMonitorHandlers_.erase(iter);
405         UpdateAddToServerActions();
406     }
407     return RET_OK;
408 }
409 
RemoveFromServer(InputHandlerType handlerType, HandleEventType eventType, int32_t priority, uint32_t deviceTags, std::vector<int32_t> actionsType)410 int32_t InputHandlerManager::RemoveFromServer(InputHandlerType handlerType, HandleEventType eventType, int32_t priority,
411     uint32_t deviceTags, std::vector<int32_t> actionsType)
412 {
413     int32_t ret = MULTIMODAL_INPUT_CONNECT_MGR->RemoveInputHandler(handlerType, eventType,
414         priority, deviceTags, actionsType);
415     if (ret != 0) {
416         MMI_HILOGE("Send to server failed, ret:%{public}d", ret);
417     }
418     return ret;
419 }
420 
GetNextId()421 int32_t InputHandlerManager::GetNextId()
422 {
423     if (nextId_ == std::numeric_limits<int32_t>::max()) {
424         MMI_HILOGE("Exceeded limit of 32-bit maximum number of integers");
425         return INVALID_HANDLER_ID;
426     }
427     return nextId_++;
428 }
429 
FindHandler(int32_t handlerId)430 std::shared_ptr<IInputEventConsumer> InputHandlerManager::FindHandler(int32_t handlerId)
431 {
432     if (GetHandlerType() == InputHandlerType::MONITOR) {
433         auto iter = monitorHandlers_.find(handlerId);
434         if (iter != monitorHandlers_.end()) {
435             return iter->second.consumer_;
436         }
437     }
438     if (GetHandlerType() == InputHandlerType::INTERCEPTOR) {
439         for (const auto &item : interHandlers_) {
440             if (item.handlerId_ == handlerId) {
441                 return item.consumer_;
442             }
443         }
444     }
445     return nullptr;
446 }
447 
448 #ifdef OHOS_BUILD_ENABLE_KEYBOARD
OnInputEvent(std::shared_ptr<KeyEvent> keyEvent, uint32_t deviceTags)449 void InputHandlerManager::OnInputEvent(std::shared_ptr<KeyEvent> keyEvent, uint32_t deviceTags)
450 {
451     CHK_PID_AND_TID();
452     CHKPV(keyEvent);
453     std::lock_guard<std::mutex> guard(mtxHandlers_);
454     BytraceAdapter::StartBytrace(keyEvent, BytraceAdapter::TRACE_STOP, BytraceAdapter::KEY_INTERCEPT_EVENT);
455     if (GetHandlerType() == InputHandlerType::MONITOR) {
456         for (const auto &item : monitorHandlers_) {
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             consumer->OnInputEvent(keyEvent);
464             MMI_HILOG_DISPATCHD("Key event id:%{public}d keyCode:%{private}d",
465                 handlerId, keyEvent->GetKeyCode());
466         }
467     }
468     if (GetHandlerType() == InputHandlerType::INTERCEPTOR) {
469         for (const auto &item : interHandlers_) {
470             if ((item.eventType_ & HANDLE_EVENT_TYPE_KEY) != HANDLE_EVENT_TYPE_KEY) {
471                 continue;
472             }
473             int32_t handlerId = item.handlerId_;
474             std::shared_ptr<IInputEventConsumer> consumer = item.consumer_;
475             CHKPV(consumer);
476             consumer->OnInputEvent(keyEvent);
477             MMI_HILOG_DISPATCHD("Key event id:%{public}d keyCode:%{private}d",
478                 handlerId, keyEvent->GetKeyCode());
479             break;
480         }
481     }
482 }
483 #endif // OHOS_BUILD_ENABLE_KEYBOARD
484 
485 #if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)
CheckInputDeviceSource( const std::shared_ptr<PointerEvent> pointerEvent, uint32_t deviceTags) const486 bool InputHandlerManager::CheckInputDeviceSource(
487     const std::shared_ptr<PointerEvent> pointerEvent, uint32_t deviceTags) const
488 {
489     if ((pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_TOUCHSCREEN) &&
490         ((deviceTags & CapabilityToTags(InputDeviceCapability::INPUT_DEV_CAP_TOUCH)) ||
491         (deviceTags & CapabilityToTags(InputDeviceCapability::INPUT_DEV_CAP_TABLET_TOOL)))) {
492         return true;
493     } else if ((pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_MOUSE) &&
494         (deviceTags & CapabilityToTags(InputDeviceCapability::INPUT_DEV_CAP_POINTER))) {
495         return true;
496     } else if ((pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_TOUCHPAD) &&
497         (deviceTags & CapabilityToTags(InputDeviceCapability::INPUT_DEV_CAP_POINTER))) {
498         return true;
499     }
500     return false;
501 }
502 
GetConsumerInfos(std::shared_ptr<PointerEvent> pointerEvent, uint32_t deviceTags, std::map<int32_t, std::shared_ptr<IInputEventConsumer>> &consumerInfos)503 void InputHandlerManager::GetConsumerInfos(std::shared_ptr<PointerEvent> pointerEvent, uint32_t deviceTags,
504     std::map<int32_t, std::shared_ptr<IInputEventConsumer>> &consumerInfos)
505 {
506     std::lock_guard<std::mutex> guard(mtxHandlers_);
507     int32_t consumerCount = 0;
508     if (GetHandlerType() == InputHandlerType::MONITOR) {
509         lastPointerEvent_ = std::make_shared<PointerEvent>(*pointerEvent);
510         consumerCount = GetMonitorConsumerInfos(pointerEvent, consumerInfos);
511     }
512     if (GetHandlerType() == InputHandlerType::INTERCEPTOR) {
513         for (const auto &item : interHandlers_) {
514             if ((item.eventType_ & HANDLE_EVENT_TYPE_POINTER) != HANDLE_EVENT_TYPE_POINTER) {
515                 continue;
516             }
517             if (((deviceTags & item.deviceTags_) == item.deviceTags_) &&
518                 !CheckInputDeviceSource(pointerEvent, item.deviceTags_)) {
519                 continue;
520             }
521             int32_t handlerId = item.handlerId_;
522             std::shared_ptr<IInputEventConsumer> consumer = item.consumer_;
523             CHKPV(consumer);
524             auto ret = consumerInfos.emplace(handlerId, consumer);
525             if (!ret.second) {
526                 MMI_HILOGI("Duplicate handler:%{public}d", handlerId);
527                 continue;
528             }
529             consumerCount++;
530             break;
531         }
532     }
533 
534     if (consumerCount == 0) {
535         MMI_HILOGE("All task post failed");
536         return;
537     }
538     int32_t tokenType = MULTIMODAL_INPUT_CONNECT_MGR->GetTokenType();
539     if (tokenType != TokenType::TOKEN_HAP && tokenType != TokenType::TOKEN_SYSTEM_HAP) {
540         return;
541     }
542     AddMouseEventId(pointerEvent);
543 }
544 
AddMouseEventId(std::shared_ptr<PointerEvent> pointerEvent)545 void InputHandlerManager::AddMouseEventId(std::shared_ptr<PointerEvent> pointerEvent)
546 {
547     if (pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_MOUSE) {
548         mouseEventIds_.emplace(pointerEvent->GetId());
549     }
550 }
551 
GetMonitorConsumerInfos(std::shared_ptr<PointerEvent> pointerEvent, std::map<int32_t, std::shared_ptr<IInputEventConsumer>> &consumerInfos)552 int32_t InputHandlerManager::GetMonitorConsumerInfos(std::shared_ptr<PointerEvent> pointerEvent,
553     std::map<int32_t, std::shared_ptr<IInputEventConsumer>> &consumerInfos)
554 {
555     int32_t consumerCount = 0;
556     CHKPR(pointerEvent, consumerCount);
557     MMI_HILOG_DISPATCHD("id:%{public}d ac:%{public}d recv", pointerEvent->GetId(), pointerEvent->GetPointerAction());
558     for (const auto &item : monitorHandlers_) {
559         if ((item.second.eventType_ & pointerEvent->GetHandlerEventType()) != pointerEvent->GetHandlerEventType()) {
560             continue;
561         }
562         if (!IsMatchGesture(item.second, pointerEvent->GetPointerAction(), pointerEvent->GetPointerCount())) {
563             continue;
564         }
565         int32_t handlerId = item.first;
566         std::shared_ptr<IInputEventConsumer> consumer = item.second.consumer_;
567         CHKPR(consumer, INVALID_HANDLER_ID);
568         auto ret = consumerInfos.emplace(handlerId, consumer);
569         if (!ret.second) {
570             MMI_HILOGI("Duplicate handler:%{public}d", handlerId);
571             continue;
572         }
573         consumerCount++;
574     }
575     for (const auto &item : actionsMonitorHandlers_) {
576         for (auto action : item.second.actionsType_) {
577             if (action != pointerEvent->GetPointerAction()) {
578                 continue;
579             }
580             int32_t handlerId = item.first;
581             std::shared_ptr<IInputEventConsumer> consumer = item.second.consumer_;
582             CHKPR(consumer, INVALID_HANDLER_ID);
583             auto ret = consumerInfos.emplace(handlerId, consumer);
584             if (!ret.second) {
585                 MMI_HILOGI("Duplicate handler:%{public}d", handlerId);
586                 continue;
587             }
588             consumerCount++;
589         }
590     }
591     return consumerCount;
592 }
593 
OnInputEvent(std::shared_ptr<PointerEvent> pointerEvent, uint32_t deviceTags)594 void InputHandlerManager::OnInputEvent(std::shared_ptr<PointerEvent> pointerEvent, uint32_t deviceTags)
595 {
596     CHK_PID_AND_TID();
597     CHKPV(pointerEvent);
598     BytraceAdapter::StartBytrace(pointerEvent, BytraceAdapter::TRACE_STOP, BytraceAdapter::POINT_INTERCEPT_EVENT);
599     std::map<int32_t, std::shared_ptr<IInputEventConsumer>> consumerInfos;
600     GetConsumerInfos(pointerEvent, deviceTags, consumerInfos);
601     for (auto iter = consumerInfos.begin(); iter != consumerInfos.end(); ++iter) {
602         auto tempEvent = std::make_shared<PointerEvent>(*pointerEvent);
603         if (std::next(iter) == consumerInfos.end()) {
604             tempEvent->SetProcessedCallback(monitorCallbackConsume_);
605         } else {
606             tempEvent->SetProcessedCallback(monitorCallback_);
607         }
608         if (tempEvent->GetPointerAction() == PointerEvent::POINTER_ACTION_SWIPE_BEGIN ||
609             tempEvent->GetPointerAction() == PointerEvent::POINTER_ACTION_SWIPE_END) {
610             MMI_HILOGI("Swipe event sended to handler! action type: %{public}d finger count: %{public}d",
611                 tempEvent->GetPointerAction(),
612                 tempEvent->GetFingerCount());
613         }
614         CHKPV(iter->second);
615         auto consumer = iter->second;
616         consumer->OnInputEvent(tempEvent);
617         MMI_HILOG_DISPATCHD("Pointer event id:%{public}d pointerId:%{public}d",
618             iter->first, pointerEvent->GetPointerId());
619     }
620 }
621 #endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH
622 
623 #if defined(OHOS_BUILD_ENABLE_INTERCEPTOR) || defined(OHOS_BUILD_ENABLE_MONITOR)
624 template<typename T>
RecoverPointerEvent(std::initializer_list<T> pointerActionEvents, T pointerActionEvent)625 bool InputHandlerManager::RecoverPointerEvent(std::initializer_list<T> pointerActionEvents, T pointerActionEvent)
626 {
627     CALL_INFO_TRACE;
628     std::unique_lock<std::mutex> lock(mtxHandlers_);
629     CHKPF(lastPointerEvent_);
630     int32_t pointerAction = lastPointerEvent_->GetPointerAction();
631     for (const auto &it : pointerActionEvents) {
632         if (pointerAction == it) {
633             PointerEvent::PointerItem item;
634             int32_t pointerId = lastPointerEvent_->GetPointerId();
635             if (!lastPointerEvent_->GetPointerItem(pointerId, item)) {
636                 MMI_HILOG_DISPATCHD("Get pointer item failed. pointer:%{public}d",
637                     pointerId);
638                 return false;
639             }
640             item.SetPressed(false);
641             lastPointerEvent_->UpdatePointerItem(pointerId, item);
642             lastPointerEvent_->SetPointerAction(pointerActionEvent);
643             auto copiedPointerEvent = std::make_shared<PointerEvent>(*lastPointerEvent_);
644             lock.unlock();
645 #if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)
646             OnInputEvent(copiedPointerEvent, DEVICE_TAGS);
647 #endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH
648             return true;
649         }
650     }
651     return false;
652 }
653 
OnDisconnected()654 void InputHandlerManager::OnDisconnected()
655 {
656     CALL_INFO_TRACE;
657     std::initializer_list<int32_t> pointerActionSwipeEvents { PointerEvent::POINTER_ACTION_SWIPE_UPDATE,
658         PointerEvent::POINTER_ACTION_SWIPE_BEGIN };
659     if (RecoverPointerEvent(pointerActionSwipeEvents, PointerEvent::POINTER_ACTION_SWIPE_END)) {
660         MMI_HILOGE("Swipe end event for service exception re-sending");
661         return;
662     }
663 }
664 
OnConnected()665 void InputHandlerManager::OnConnected()
666 {
667     CALL_DEBUG_ENTER;
668     HandleEventType eventType = GetEventType();
669     int32_t priority = GetPriority();
670     uint32_t deviceTags = GetDeviceTags();
671     std::vector<int32_t> actionsType = GetActionsType();
672     if (eventType != HANDLE_EVENT_TYPE_NONE || !actionsType.empty()) {
673         AddToServer(GetHandlerType(), eventType, priority, deviceTags, actionsType);
674     }
675 }
676 #endif // OHOS_BUILD_ENABLE_INTERCEPTOR || OHOS_BUILD_ENABLE_MONITOR
677 
HasHandler(int32_t handlerId)678 bool InputHandlerManager::HasHandler(int32_t handlerId)
679 {
680     std::lock_guard<std::mutex> guard(mtxHandlers_);
681     bool hasHandler = false;
682     if (GetHandlerType() == InputHandlerType::MONITOR) {
683         auto iter = monitorHandlers_.find(handlerId);
684         hasHandler = (iter != monitorHandlers_.end()) ? true : false;
685         if (!hasHandler) {
686             auto iter = actionsMonitorHandlers_.find(handlerId);
687             return (iter != actionsMonitorHandlers_.end());
688         }
689         return hasHandler;
690     }
691     if (GetHandlerType() == InputHandlerType::INTERCEPTOR) {
692         for (const auto &item : interHandlers_) {
693             if (item.handlerId_ == handlerId) {
694                 return true;
695             }
696         }
697     }
698     return false;
699 }
700 
GetEventType() const701 HandleEventType InputHandlerManager::GetEventType() const
702 {
703     uint32_t eventType{ HANDLE_EVENT_TYPE_NONE };
704     if (GetHandlerType() == InputHandlerType::MONITOR) {
705         if (monitorHandlers_.empty()) {
706             MMI_HILOGD("The monitorHandlers_ is empty");
707             return HANDLE_EVENT_TYPE_NONE;
708         }
709         for (const auto &inputHandler : monitorHandlers_) {
710             eventType |= inputHandler.second.eventType_;
711         }
712     }
713 
714     if (GetHandlerType() == InputHandlerType::INTERCEPTOR) {
715         if (interHandlers_.empty()) {
716             MMI_HILOGD("The interHandlers_ is empty");
717             return HANDLE_EVENT_TYPE_NONE;
718         }
719         for (const auto &interHandler : interHandlers_) {
720             eventType |= interHandler.eventType_;
721         }
722     }
723     return eventType;
724 }
725 
GetPriority() const726 int32_t InputHandlerManager::GetPriority() const
727 {
728     int32_t priority{ DEFUALT_INTERCEPTOR_PRIORITY };
729     if (GetHandlerType() == InputHandlerType::INTERCEPTOR) {
730         if (!interHandlers_.empty()) {
731             priority = interHandlers_.front().priority_;
732         }
733     }
734     return priority;
735 }
736 
GetDeviceTags() const737 uint32_t InputHandlerManager::GetDeviceTags() const
738 {
739     uint32_t deviceTags = 0;
740     if (GetHandlerType() == InputHandlerType::INTERCEPTOR) {
741         for (const auto &item : interHandlers_) {
742             deviceTags |= item.deviceTags_;
743         }
744     }
745     if (GetHandlerType() == InputHandlerType::MONITOR) {
746         for (const auto &item : monitorHandlers_) {
747             deviceTags |= item.second.deviceTags_;
748         }
749     }
750     return deviceTags;
751 }
752 
GetActionsType() const753 std::vector<int32_t> InputHandlerManager::GetActionsType() const
754 {
755     return addToServerActions_;
756 }
757 
OnDispatchEventProcessed(int32_t eventId, int64_t actionTime)758 void InputHandlerManager::OnDispatchEventProcessed(int32_t eventId, int64_t actionTime)
759 {
760     std::lock_guard<std::mutex> guard(mtxHandlers_);
761     CALL_DEBUG_ENTER;
762     MMIClientPtr client = MMIEventHdl.GetMMIClient();
763     CHKPV(client);
764     if (mouseEventIds_.find(eventId) != mouseEventIds_.end()) {
765         mouseEventIds_.erase(eventId);
766         return;
767     }
768 }
769 
OnDispatchEventProcessed(int32_t eventId, int64_t actionTime, bool isNeedConsume)770 void InputHandlerManager::OnDispatchEventProcessed(int32_t eventId, int64_t actionTime, bool isNeedConsume)
771 {
772     OnDispatchEventProcessed(eventId, actionTime);
773     ANRHDL->SetLastProcessedEventId(ANR_MONITOR, eventId, actionTime);
774 }
775 
IsMatchGesture(const Handler &handler, int32_t action, int32_t count)776 bool InputHandlerManager::IsMatchGesture(const Handler &handler, int32_t action, int32_t count)
777 {
778     if ((handler.eventType_ & HANDLE_EVENT_TYPE_TOUCH_GESTURE) != HANDLE_EVENT_TYPE_TOUCH_GESTURE) {
779         return true;
780     }
781     auto iter = monitorHandlers_.find(handler.handlerId_);
782     if (iter == monitorHandlers_.end()) {
783         return false;
784     }
785     GestureHandler &gestureHandler = iter->second.gestureHandler_;
786     TouchGestureType type = TOUCH_GESTURE_TYPE_NONE;
787     switch (action) {
788         case PointerEvent::TOUCH_ACTION_SWIPE_DOWN:
789         case PointerEvent::TOUCH_ACTION_SWIPE_UP:
790         case PointerEvent::TOUCH_ACTION_SWIPE_RIGHT:
791         case PointerEvent::TOUCH_ACTION_SWIPE_LEFT:
792             type = TOUCH_GESTURE_TYPE_SWIPE;
793             break;
794         case PointerEvent::TOUCH_ACTION_PINCH_OPENED:
795         case PointerEvent::TOUCH_ACTION_PINCH_CLOSEED:
796             type = TOUCH_GESTURE_TYPE_PINCH;
797             break;
798         case PointerEvent::TOUCH_ACTION_GESTURE_END: {
799             if (!gestureHandler.gestureState) {
800                 return false;
801             }
802             gestureHandler.gestureState = false;
803             return true;
804         }
805         default: {
806             MMI_HILOGW("Unknown action:%{public}d", action);
807             return false;
808         }
809     }
810     if (((gestureHandler.gestureType & type) == type) &&
811         (gestureHandler.fingers == count || gestureHandler.fingers == ALL_FINGER_COUNT)) {
812         gestureHandler.gestureState = true;
813         return true;
814     }
815     return false;
816 }
817 } // namespace MMI
818 } // namespace OHOS
819