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