• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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