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