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
RemoveHandler(int32_t handlerId,InputHandlerType handlerType)100 int32_t InputHandlerManager::RemoveHandler(int32_t handlerId, InputHandlerType handlerType)
101 {
102 CALL_DEBUG_ENTER;
103 MMI_HILOGD("Unregister handler:%{public}d,type:%{public}d", handlerId, handlerType);
104 std::lock_guard<std::mutex> guard(mtxHandlers_);
105 const HandleEventType currentType = GetEventType();
106 uint32_t currentTags = GetDeviceTags();
107 uint32_t deviceTags = 0;
108 int32_t ret = RemoveLocal(handlerId, handlerType, deviceTags);
109 if (ret == RET_OK) {
110 const HandleEventType newType = GetEventType();
111 const int32_t newLevel = GetPriority();
112 const uint64_t newTags = GetDeviceTags();
113 if (currentType != newType || ((currentTags & deviceTags) != 0)) {
114 ret = RemoveFromServer(handlerType, newType, newLevel, newTags);
115 if (ret != RET_OK) {
116 return ret;
117 }
118 }
119 MMI_HILOGI("Remove Handler:%{public}d:%{public}d, (eventType,deviceTag): (%{public}d:%{public}d) ",
120 handlerType, handlerId, currentType, currentTags);
121 }
122 return ret;
123 }
124
AddLocal(int32_t handlerId,InputHandlerType handlerType,HandleEventType eventType,int32_t priority,uint32_t deviceTags,std::shared_ptr<IInputEventConsumer> monitor)125 int32_t InputHandlerManager::AddLocal(int32_t handlerId, InputHandlerType handlerType, HandleEventType eventType,
126 int32_t priority, uint32_t deviceTags, std::shared_ptr<IInputEventConsumer> monitor)
127 {
128 InputHandlerManager::Handler handler{
129 .handlerId_ = handlerId,
130 .handlerType_ = handlerType,
131 .eventType_ = eventType,
132 .priority_ = priority,
133 .deviceTags_ = deviceTags,
134 .consumer_ = monitor,
135 };
136 if (handlerType == InputHandlerType::MONITOR) {
137 auto ret = monitorHandlers_.emplace(handler.handlerId_, handler);
138 if (!ret.second) {
139 MMI_HILOGE("Duplicate handler:%{public}d", handler.handlerId_);
140 return RET_ERR;
141 }
142 }
143 if (handlerType == InputHandlerType::INTERCEPTOR) {
144 auto iterIndex = interHandlers_.begin();
145 for (; iterIndex != interHandlers_.end(); ++iterIndex) {
146 if (handler.priority_ < iterIndex->priority_) {
147 break;
148 }
149 }
150 auto iter = interHandlers_.emplace(iterIndex, handler);
151 if (iter == interHandlers_.end()) {
152 MMI_HILOGE("Add new handler failed");
153 return RET_ERR;
154 }
155 }
156 return RET_OK;
157 }
158
AddToServer(InputHandlerType handlerType,HandleEventType eventType,int32_t priority,uint32_t deviceTags)159 int32_t InputHandlerManager::AddToServer(InputHandlerType handlerType, HandleEventType eventType, int32_t priority,
160 uint32_t deviceTags)
161 {
162 int32_t ret = MULTIMODAL_INPUT_CONNECT_MGR->AddInputHandler(handlerType, eventType, priority, deviceTags);
163 if (ret != RET_OK) {
164 MMI_HILOGE("Send to server failed, ret:%{public}d", ret);
165 }
166 return ret;
167 }
168
RemoveLocal(int32_t handlerId,InputHandlerType handlerType,uint32_t & deviceTags)169 int32_t InputHandlerManager::RemoveLocal(int32_t handlerId, InputHandlerType handlerType, uint32_t &deviceTags)
170 {
171 if (handlerType == InputHandlerType::MONITOR) {
172 auto iter = monitorHandlers_.find(handlerId);
173 if (iter == monitorHandlers_.end()) {
174 MMI_HILOGE("No handler with specified");
175 return RET_ERR;
176 }
177 if (handlerType != iter->second.handlerType_) {
178 MMI_HILOGE("Unmatched handler type, InputHandlerType:%{public}d,FindHandlerType:%{public}d", handlerType,
179 iter->second.handlerType_);
180 return RET_ERR;
181 }
182 monitorHandlers_.erase(iter);
183 }
184
185 if (handlerType == InputHandlerType::INTERCEPTOR) {
186 for (auto it = interHandlers_.begin(); it != interHandlers_.end(); ++it) {
187 if (handlerId == it->handlerId_) {
188 deviceTags = it->deviceTags_;
189 interHandlers_.erase(it);
190 break;
191 }
192 }
193 }
194 return RET_OK;
195 }
196
RemoveFromServer(InputHandlerType handlerType,HandleEventType eventType,int32_t priority,uint32_t deviceTags)197 int32_t InputHandlerManager::RemoveFromServer(InputHandlerType handlerType, HandleEventType eventType, int32_t priority,
198 uint32_t deviceTags)
199 {
200 int32_t ret = MULTIMODAL_INPUT_CONNECT_MGR->RemoveInputHandler(handlerType, eventType, priority, deviceTags);
201 if (ret != 0) {
202 MMI_HILOGE("Send to server failed, ret:%{public}d", ret);
203 }
204 return ret;
205 }
206
GetNextId()207 int32_t InputHandlerManager::GetNextId()
208 {
209 if (nextId_ == std::numeric_limits<int32_t>::max()) {
210 MMI_HILOGE("Exceeded limit of 32-bit maximum number of integers");
211 return INVALID_HANDLER_ID;
212 }
213 return nextId_++;
214 }
215
FindHandler(int32_t handlerId)216 std::shared_ptr<IInputEventConsumer> InputHandlerManager::FindHandler(int32_t handlerId)
217 {
218 if (GetHandlerType() == InputHandlerType::MONITOR) {
219 auto iter = monitorHandlers_.find(handlerId);
220 if (iter != monitorHandlers_.end()) {
221 return iter->second.consumer_;
222 }
223 }
224 if (GetHandlerType() == InputHandlerType::INTERCEPTOR) {
225 for (const auto &item : interHandlers_) {
226 if (item.handlerId_ == handlerId) {
227 return item.consumer_;
228 }
229 }
230 }
231 return nullptr;
232 }
233
234 #ifdef OHOS_BUILD_ENABLE_KEYBOARD
OnInputEvent(std::shared_ptr<KeyEvent> keyEvent,uint32_t deviceTags)235 void InputHandlerManager::OnInputEvent(std::shared_ptr<KeyEvent> keyEvent, uint32_t deviceTags)
236 {
237 CHK_PID_AND_TID();
238 CHKPV(keyEvent);
239 std::lock_guard<std::mutex> guard(mtxHandlers_);
240 BytraceAdapter::StartBytrace(keyEvent, BytraceAdapter::TRACE_STOP, BytraceAdapter::KEY_INTERCEPT_EVENT);
241 if (GetHandlerType() == InputHandlerType::MONITOR) {
242 for (const auto &item : monitorHandlers_) {
243 if ((item.second.eventType_ & HANDLE_EVENT_TYPE_KEY) != HANDLE_EVENT_TYPE_KEY) {
244 continue;
245 }
246 int32_t handlerId = item.first;
247 std::shared_ptr<IInputEventConsumer> consumer = item.second.consumer_;
248 CHKPV(consumer);
249 consumer->OnInputEvent(keyEvent);
250 MMI_HILOG_DISPATCHD("Key event id:%{public}d keyCode:%{private}d",
251 handlerId, keyEvent->GetKeyCode());
252 }
253 }
254 if (GetHandlerType() == InputHandlerType::INTERCEPTOR) {
255 for (const auto &item : interHandlers_) {
256 if ((item.eventType_ & HANDLE_EVENT_TYPE_KEY) != HANDLE_EVENT_TYPE_KEY) {
257 continue;
258 }
259 int32_t handlerId = item.handlerId_;
260 std::shared_ptr<IInputEventConsumer> consumer = item.consumer_;
261 CHKPV(consumer);
262 consumer->OnInputEvent(keyEvent);
263 MMI_HILOG_DISPATCHD("Key event id:%{public}d keyCode:%{private}d",
264 handlerId, keyEvent->GetKeyCode());
265 break;
266 }
267 }
268 }
269 #endif // OHOS_BUILD_ENABLE_KEYBOARD
270
271 #if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)
CheckInputDeviceSource(const std::shared_ptr<PointerEvent> pointerEvent,uint32_t deviceTags) const272 bool InputHandlerManager::CheckInputDeviceSource(
273 const std::shared_ptr<PointerEvent> pointerEvent, uint32_t deviceTags) const
274 {
275 if ((pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_TOUCHSCREEN) &&
276 ((deviceTags & CapabilityToTags(InputDeviceCapability::INPUT_DEV_CAP_TOUCH)) ||
277 (deviceTags & CapabilityToTags(InputDeviceCapability::INPUT_DEV_CAP_TABLET_TOOL)))) {
278 return true;
279 } else if ((pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_MOUSE) &&
280 (deviceTags & CapabilityToTags(InputDeviceCapability::INPUT_DEV_CAP_POINTER))) {
281 return true;
282 } else if ((pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_TOUCHPAD) &&
283 (deviceTags & CapabilityToTags(InputDeviceCapability::INPUT_DEV_CAP_POINTER))) {
284 return true;
285 }
286 return false;
287 }
288
GetConsumerInfos(std::shared_ptr<PointerEvent> pointerEvent,uint32_t deviceTags,std::map<int32_t,std::shared_ptr<IInputEventConsumer>> & consumerInfos)289 void InputHandlerManager::GetConsumerInfos(std::shared_ptr<PointerEvent> pointerEvent, uint32_t deviceTags,
290 std::map<int32_t, std::shared_ptr<IInputEventConsumer>> &consumerInfos)
291 {
292 std::lock_guard<std::mutex> guard(mtxHandlers_);
293 int32_t consumerCount = 0;
294 if (GetHandlerType() == InputHandlerType::MONITOR) {
295 lastPointerEvent_ = std::make_shared<PointerEvent>(*pointerEvent);
296 consumerCount = GetMonitorConsumerInfos(pointerEvent, consumerInfos);
297 }
298 if (GetHandlerType() == InputHandlerType::INTERCEPTOR) {
299 for (const auto &item : interHandlers_) {
300 if ((item.eventType_ & HANDLE_EVENT_TYPE_POINTER) != HANDLE_EVENT_TYPE_POINTER) {
301 continue;
302 }
303 if (((deviceTags & item.deviceTags_) == item.deviceTags_) &&
304 !CheckInputDeviceSource(pointerEvent, item.deviceTags_)) {
305 continue;
306 }
307 int32_t handlerId = item.handlerId_;
308 std::shared_ptr<IInputEventConsumer> consumer = item.consumer_;
309 CHKPV(consumer);
310 auto ret = consumerInfos.emplace(handlerId, consumer);
311 if (!ret.second) {
312 MMI_HILOGI("Duplicate handler:%{public}d", handlerId);
313 continue;
314 }
315 consumerCount++;
316 break;
317 }
318 }
319
320 if (consumerCount == 0) {
321 MMI_HILOGE("All task post failed");
322 return;
323 }
324 int32_t tokenType = MULTIMODAL_INPUT_CONNECT_MGR->GetTokenType();
325 if (tokenType != TokenType::TOKEN_HAP && tokenType != TokenType::TOKEN_SYSTEM_HAP) {
326 return;
327 }
328 AddMouseEventId(pointerEvent);
329 }
330
AddMouseEventId(std::shared_ptr<PointerEvent> pointerEvent)331 void InputHandlerManager::AddMouseEventId(std::shared_ptr<PointerEvent> pointerEvent)
332 {
333 if (pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_MOUSE) {
334 mouseEventIds_.emplace(pointerEvent->GetId());
335 }
336 }
337
GetMonitorConsumerInfos(std::shared_ptr<PointerEvent> pointerEvent,std::map<int32_t,std::shared_ptr<IInputEventConsumer>> & consumerInfos)338 int32_t InputHandlerManager::GetMonitorConsumerInfos(std::shared_ptr<PointerEvent> pointerEvent,
339 std::map<int32_t, std::shared_ptr<IInputEventConsumer>> &consumerInfos)
340 {
341 int32_t consumerCount = 0;
342 MMI_HILOG_DISPATCHD("id:%{public}d ac:%{public}d recv", pointerEvent->GetId(), pointerEvent->GetPointerAction());
343 for (const auto &item : monitorHandlers_) {
344 if ((item.second.eventType_ & HANDLE_EVENT_TYPE_POINTER) != HANDLE_EVENT_TYPE_POINTER) {
345 continue;
346 }
347 int32_t handlerId = item.first;
348 std::shared_ptr<IInputEventConsumer> consumer = item.second.consumer_;
349 CHKPR(consumer, INVALID_HANDLER_ID);
350 auto ret = consumerInfos.emplace(handlerId, consumer);
351 if (!ret.second) {
352 MMI_HILOGI("Duplicate handler:%{public}d", handlerId);
353 continue;
354 }
355 consumerCount++;
356 }
357 return consumerCount;
358 }
359
OnInputEvent(std::shared_ptr<PointerEvent> pointerEvent,uint32_t deviceTags)360 void InputHandlerManager::OnInputEvent(std::shared_ptr<PointerEvent> pointerEvent, uint32_t deviceTags)
361 {
362 CHK_PID_AND_TID();
363 CHKPV(pointerEvent);
364 BytraceAdapter::StartBytrace(pointerEvent, BytraceAdapter::TRACE_STOP, BytraceAdapter::POINT_INTERCEPT_EVENT);
365 std::map<int32_t, std::shared_ptr<IInputEventConsumer>> consumerInfos;
366 GetConsumerInfos(pointerEvent, deviceTags, consumerInfos);
367 for (auto iter = consumerInfos.begin(); iter != consumerInfos.end(); ++iter) {
368 auto tempEvent = std::make_shared<PointerEvent>(*pointerEvent);
369 if (std::next(iter) == consumerInfos.end()) {
370 tempEvent->SetProcessedCallback(monitorCallbackConsume_);
371 } else {
372 tempEvent->SetProcessedCallback(monitorCallback_);
373 }
374 CHKPV(iter->second);
375 auto consumer = iter->second;
376 consumer->OnInputEvent(tempEvent);
377 MMI_HILOG_DISPATCHD("Pointer event id:%{public}d pointerId:%{public}d",
378 iter->first, pointerEvent->GetPointerId());
379 }
380 }
381 #endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH
382
383 #if defined(OHOS_BUILD_ENABLE_INTERCEPTOR) || defined(OHOS_BUILD_ENABLE_MONITOR)
384 template<typename T>
RecoverPointerEvent(std::initializer_list<T> pointerActionEvents,T pointerActionEvent)385 bool InputHandlerManager::RecoverPointerEvent(std::initializer_list<T> pointerActionEvents, T pointerActionEvent)
386 {
387 CALL_INFO_TRACE;
388 std::unique_lock<std::mutex> lock(mtxHandlers_);
389 CHKPF(lastPointerEvent_);
390 int32_t pointerAction = lastPointerEvent_->GetPointerAction();
391 for (const auto &it : pointerActionEvents) {
392 if (pointerAction == it) {
393 PointerEvent::PointerItem item;
394 int32_t pointerId = lastPointerEvent_->GetPointerId();
395 if (!lastPointerEvent_->GetPointerItem(pointerId, item)) {
396 MMI_HILOG_DISPATCHD("Get pointer item failed. pointer:%{public}d",
397 pointerId);
398 return false;
399 }
400 item.SetPressed(false);
401 lastPointerEvent_->UpdatePointerItem(pointerId, item);
402 lastPointerEvent_->SetPointerAction(pointerActionEvent);
403 auto copiedPointerEvent = std::make_shared<PointerEvent>(*lastPointerEvent_);
404 lock.unlock();
405 #if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)
406 OnInputEvent(copiedPointerEvent, DEVICE_TAGS);
407 #endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH
408 return true;
409 }
410 }
411 return false;
412 }
413
OnDisconnected()414 void InputHandlerManager::OnDisconnected()
415 {
416 CALL_INFO_TRACE;
417 std::initializer_list<int32_t> pointerActionSwipeEvents { PointerEvent::POINTER_ACTION_SWIPE_UPDATE,
418 PointerEvent::POINTER_ACTION_SWIPE_BEGIN };
419 if (RecoverPointerEvent(pointerActionSwipeEvents, PointerEvent::POINTER_ACTION_SWIPE_END)) {
420 MMI_HILOGE("Swipe end event for service exception re-sending");
421 return;
422 }
423 }
424
OnConnected()425 void InputHandlerManager::OnConnected()
426 {
427 CALL_DEBUG_ENTER;
428 HandleEventType eventType = GetEventType();
429 int32_t priority = GetPriority();
430 uint32_t deviceTags = GetDeviceTags();
431 if (eventType != HANDLE_EVENT_TYPE_NONE) {
432 AddToServer(GetHandlerType(), eventType, priority, deviceTags);
433 }
434 }
435 #endif // OHOS_BUILD_ENABLE_INTERCEPTOR || OHOS_BUILD_ENABLE_MONITOR
436
HasHandler(int32_t handlerId)437 bool InputHandlerManager::HasHandler(int32_t handlerId)
438 {
439 std::lock_guard<std::mutex> guard(mtxHandlers_);
440 if (GetHandlerType() == InputHandlerType::MONITOR) {
441 auto iter = monitorHandlers_.find(handlerId);
442 return (iter != monitorHandlers_.end());
443 }
444 if (GetHandlerType() == InputHandlerType::INTERCEPTOR) {
445 for (const auto &item : interHandlers_) {
446 if (item.handlerId_ == handlerId) {
447 return true;
448 }
449 }
450 }
451 return false;
452 }
453
GetEventType() const454 HandleEventType InputHandlerManager::GetEventType() const
455 {
456 uint32_t eventType{ HANDLE_EVENT_TYPE_NONE };
457 if (GetHandlerType() == InputHandlerType::MONITOR) {
458 if (monitorHandlers_.empty()) {
459 MMI_HILOGD("monitorHandlers_ is empty");
460 return HANDLE_EVENT_TYPE_NONE;
461 }
462 for (const auto &inputHandler : monitorHandlers_) {
463 eventType |= inputHandler.second.eventType_;
464 }
465 }
466
467 if (GetHandlerType() == InputHandlerType::INTERCEPTOR) {
468 if (interHandlers_.empty()) {
469 MMI_HILOGD("interHandlers_ is empty");
470 return HANDLE_EVENT_TYPE_NONE;
471 }
472 for (const auto &interHandler : interHandlers_) {
473 eventType |= interHandler.eventType_;
474 }
475 }
476 return eventType;
477 }
478
GetPriority() const479 int32_t InputHandlerManager::GetPriority() const
480 {
481 int32_t priority{ DEFUALT_INTERCEPTOR_PRIORITY };
482 if (GetHandlerType() == InputHandlerType::INTERCEPTOR) {
483 if (!interHandlers_.empty()) {
484 priority = interHandlers_.front().priority_;
485 }
486 }
487 return priority;
488 }
489
GetDeviceTags() const490 uint32_t InputHandlerManager::GetDeviceTags() const
491 {
492 uint32_t deviceTags = 0;
493 if (GetHandlerType() == InputHandlerType::INTERCEPTOR) {
494 for (const auto &item : interHandlers_) {
495 deviceTags |= item.deviceTags_;
496 }
497 }
498 if (GetHandlerType() == InputHandlerType::MONITOR) {
499 for (const auto &item : monitorHandlers_) {
500 deviceTags |= item.second.deviceTags_;
501 }
502 }
503 return deviceTags;
504 }
505
OnDispatchEventProcessed(int32_t eventId,int64_t actionTime)506 void InputHandlerManager::OnDispatchEventProcessed(int32_t eventId, int64_t actionTime)
507 {
508 std::lock_guard<std::mutex> guard(mtxHandlers_);
509 CALL_DEBUG_ENTER;
510 MMIClientPtr client = MMIEventHdl.GetMMIClient();
511 CHKPV(client);
512 if (mouseEventIds_.find(eventId) != mouseEventIds_.end()) {
513 mouseEventIds_.erase(eventId);
514 return;
515 }
516 }
517
OnDispatchEventProcessed(int32_t eventId,int64_t actionTime,bool isNeedConsume)518 void InputHandlerManager::OnDispatchEventProcessed(int32_t eventId, int64_t actionTime, bool isNeedConsume)
519 {
520 OnDispatchEventProcessed(eventId, actionTime);
521 ANRHDL->SetLastProcessedEventId(ANR_MONITOR, eventId, actionTime);
522 }
523 } // namespace MMI
524 } // namespace OHOS
525