1 /* 2 * Copyright (c) 2021-2023 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 #ifndef INPUT_HANDLER_MANAGER_H 17 #define INPUT_HANDLER_MANAGER_H 18 19 #include <map> 20 #include <mutex> 21 22 #include "input_device.h" 23 #include "i_input_event_consumer.h" 24 25 namespace OHOS { 26 namespace MMI { 27 class InputHandlerManager { 28 public: 29 InputHandlerManager(); 30 virtual ~InputHandlerManager() = default; 31 DISALLOW_COPY_AND_MOVE(InputHandlerManager); 32 33 public: 34 #ifdef OHOS_BUILD_ENABLE_KEYBOARD 35 void OnInputEvent(std::shared_ptr<KeyEvent> keyEvent, uint32_t deviceTags); 36 #endif // OHOS_BUILD_ENABLE_KEYBOARD 37 #if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH) 38 void OnInputEvent(std::shared_ptr<PointerEvent> pointerEvent, uint32_t deviceTags); 39 #endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH 40 #if defined(OHOS_BUILD_ENABLE_INTERCEPTOR) || defined(OHOS_BUILD_ENABLE_MONITOR) 41 template<typename T> 42 bool RecoverPointerEvent(std::initializer_list<T> pointerActionEvents, T pointerActionEvent); 43 void OnConnected(); 44 void OnDisconnected(); 45 #endif // OHOS_BUILD_ENABLE_INTERCEPTOR || OHOS_BUILD_ENABLE_MONITOR 46 bool HasHandler(int32_t handlerId); 47 virtual InputHandlerType GetHandlerType() const = 0; 48 HandleEventType GetEventType() const; 49 int32_t GetPriority() const; 50 uint32_t GetDeviceTags() const; 51 std::vector<int32_t> GetActionsType() const; 52 53 protected: 54 int32_t AddGestureMonitor(InputHandlerType handlerType, std::shared_ptr<IInputEventConsumer> consumer, 55 HandleEventType eventType, TouchGestureType gestureType, int32_t fingers); 56 int32_t RemoveGestureMonitor(int32_t handlerId, InputHandlerType handlerType); 57 int32_t AddHandler(InputHandlerType handlerType, std::shared_ptr<IInputEventConsumer> consumer, 58 HandleEventType eventType = HANDLE_EVENT_TYPE_KP, int32_t priority = DEFUALT_INTERCEPTOR_PRIORITY, 59 uint32_t deviceTags = CapabilityToTags(InputDeviceCapability::INPUT_DEV_CAP_MAX)); 60 int32_t RemoveHandler(int32_t handlerId, InputHandlerType IsValidHandlerType); 61 int32_t AddHandler(InputHandlerType handlerType, std::shared_ptr<IInputEventConsumer> consumer, 62 std::vector<int32_t> actions); 63 64 private: 65 struct GestureHandler { 66 TouchGestureType gestureType { TOUCH_GESTURE_TYPE_NONE }; 67 int32_t fingers { 0 }; 68 bool gestureState { false }; 69 }; 70 struct Handler { 71 int32_t handlerId_ { 0 }; 72 InputHandlerType handlerType_ { NONE }; 73 HandleEventType eventType_ { HANDLE_EVENT_TYPE_KP }; 74 int32_t priority_ { DEFUALT_INTERCEPTOR_PRIORITY }; 75 uint32_t deviceTags_ { CapabilityToTags(InputDeviceCapability::INPUT_DEV_CAP_MAX) }; 76 std::shared_ptr<IInputEventConsumer> consumer_ { nullptr }; 77 GestureHandler gestureHandler_; 78 std::vector<int32_t> actionsType_; 79 }; 80 81 private: 82 int32_t GetNextId(); CheckMonitorValid(TouchGestureType type,int32_t fingers)83 virtual bool CheckMonitorValid(TouchGestureType type, int32_t fingers) 84 { 85 return false; 86 } 87 bool IsMatchGesture(const Handler &handler, int32_t action, int32_t count); 88 int32_t AddGestureToLocal(int32_t handlerId, HandleEventType eventType, 89 TouchGestureType gestureType, int32_t fingers, std::shared_ptr<IInputEventConsumer> consumer); 90 int32_t AddLocal(int32_t handlerId, InputHandlerType handlerType, HandleEventType eventType, 91 int32_t priority, uint32_t deviceTags, std::shared_ptr<IInputEventConsumer> monitor); 92 int32_t AddLocal(int32_t handlerId, InputHandlerType handlerType, std::vector<int32_t> actionsType, 93 std::shared_ptr<IInputEventConsumer> monitor); 94 int32_t AddToServer(InputHandlerType handlerType, HandleEventType eventType, int32_t priority, 95 uint32_t deviceTags, std::vector<int32_t> actionsType = std::vector<int32_t>()); 96 bool IsNeedAddToServer(std::vector<int32_t> actionsType); 97 int32_t RemoveLocal(int32_t handlerId, InputHandlerType handlerType, uint32_t &deviceTags); 98 void UpdateAddToServerActions(); 99 int32_t RemoveLocalActions(int32_t handlerId, InputHandlerType handlerType); 100 int32_t RemoveFromServer(InputHandlerType handlerType, HandleEventType eventType, int32_t priority, 101 uint32_t deviceTags, std::vector<int32_t> actionsType = std::vector<int32_t>()); 102 103 std::shared_ptr<IInputEventConsumer> FindHandler(int32_t handlerId); 104 void OnDispatchEventProcessed(int32_t eventId, int64_t actionTime); 105 void OnDispatchEventProcessed(int32_t eventId, int64_t actionTime, bool isNeedConsume); 106 void AddMouseEventId(std::shared_ptr<PointerEvent> pointerEvent); 107 int32_t GetMonitorConsumerInfos(std::shared_ptr<PointerEvent> pointerEvent, 108 std::map<int32_t, std::shared_ptr<IInputEventConsumer>> &consumerInfos); 109 bool CheckIfNeedAddToConsumerInfos(const Handler &monitor, std::shared_ptr<PointerEvent> pointerEvent); 110 bool IsPinchType(std::shared_ptr<PointerEvent> pointerEvent); 111 bool IsRotateType(std::shared_ptr<PointerEvent> pointerEvent); 112 bool IsThreeFingersSwipeType(std::shared_ptr<PointerEvent> pointerEvent); 113 bool IsFourFingersSwipeType(std::shared_ptr<PointerEvent> pointerEvent); 114 bool IsBeginAndEndType(std::shared_ptr<PointerEvent> pointerEvent); 115 bool IsThreeFingersTapType(std::shared_ptr<PointerEvent> pointerEvent); 116 #ifdef OHOS_BUILD_ENABLE_FINGERPRINT 117 bool IsFingerprintType(std::shared_ptr<PointerEvent> pointerEvent); 118 #endif // OHOS_BUILD_ENABLE_FINGERPRINT 119 #if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH) 120 bool CheckInputDeviceSource(const std::shared_ptr<PointerEvent> pointerEvent, uint32_t deviceTags) const; 121 void GetConsumerInfos(std::shared_ptr<PointerEvent> pointerEvent, uint32_t deviceTags, 122 std::map<int32_t, std::shared_ptr<IInputEventConsumer>> &consumerInfos); 123 #endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH 124 void RegisterGestureMonitors() const; 125 126 private: 127 std::list<Handler> interHandlers_; 128 std::map<int32_t, Handler> monitorHandlers_; 129 std::map<int32_t, Handler> actionsMonitorHandlers_; 130 std::set<int32_t> mouseEventIds_; 131 std::function<void(int32_t, int64_t)> monitorCallback_ { nullptr }; 132 std::function<void(int32_t, int64_t)> monitorCallbackConsume_ { nullptr }; 133 int32_t nextId_ { 1 }; 134 std::mutex mtxHandlers_; 135 std::shared_ptr<PointerEvent> lastPointerEvent_ { nullptr }; 136 std::vector<int32_t> addToServerActions_; 137 }; 138 } // namespace MMI 139 } // namespace OHOS 140 #endif // INPUT_HANDLER_MANAGER_H 141