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