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