1 /*
2  * Copyright (c) 2021-2022 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 FOUNDATION_ACE_FRAMEWORKS_CORE_GESTURES_GESTURE_RECOGNIZER_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_GESTURES_GESTURE_RECOGNIZER_H
18 
19 #include <map>
20 #include <memory>
21 #include <set>
22 
23 #include "gesture_referee.h"
24 
25 #include "core/event/axis_event.h"
26 #include "core/event/touch_event.h"
27 #include "core/gestures/gesture_event.h"
28 
29 namespace OHOS::Ace {
30 
31 enum class DetectState { READY, DETECTING, DETECTED };
32 
33 enum class RefereeState { DETECTING, PENDING, BLOCKED, SUCCEED, FAIL };
34 
35 class ACE_EXPORT GestureRecognizer : public TouchEventTarget {
36     DECLARE_ACE_TYPE(GestureRecognizer, TouchEventTarget)
37 
38 public:
39     // Called when request of handling gesture sequence is accepted by gesture referee.
40     virtual void OnAccepted(size_t touchId) = 0;
41 
42     // Called when request of handling gesture sequence is rejected by gesture referee.
43     virtual void OnRejected(size_t touchId) = 0;
44 
45     // Called when request of handling gesture sequence is rejected by gesture referee.
OnPending(size_t touchId)46     virtual void OnPending(size_t touchId) {}
47 
48     // Reconiciles the state from the given recognizer into this. The
49     // implementation must check that the given recognizer type matches the
50     // current one. The return value should be false if the reconciliation fails
51     // and true if it succeeds
ReconcileFrom(const RefPtr<GestureRecognizer> & recognizer)52     virtual bool ReconcileFrom(const RefPtr<GestureRecognizer>& recognizer)
53     {
54         return true;
55     }
56 
DispatchEvent(const TouchEvent & point)57     bool DispatchEvent(const TouchEvent& point) override
58     {
59         return true;
60     }
61     bool HandleEvent(const TouchEvent& point) override;
62     bool HandleEvent(const AxisEvent& event) override;
63 
GetPriority()64     GesturePriority GetPriority() const
65     {
66         return priority_;
67     }
68 
SetPriority(GesturePriority priority)69     void SetPriority(GesturePriority priority)
70     {
71         priority_ = priority;
72     }
73 
GetPriorityMask()74     GestureMask GetPriorityMask() const
75     {
76         return priorityMask_;
77     }
78 
SetPriorityMask(GestureMask priorityMask)79     void SetPriorityMask(GestureMask priorityMask)
80     {
81         priorityMask_ = priorityMask;
82     }
83 
GetRefereeState()84     RefereeState GetRefereeState() const
85     {
86         return refereeState_;
87     }
88 
SetRefereeState(RefereeState refereeState)89     void SetRefereeState(RefereeState refereeState)
90     {
91         refereeState_ = refereeState;
92     }
93 
GetDetectState()94     DetectState GetDetectState() const
95     {
96         return state_;
97     }
98 
SetGestureGroup(const WeakPtr<GestureRecognizer> & gestureGroup)99     void SetGestureGroup(const WeakPtr<GestureRecognizer>& gestureGroup)
100     {
101         gestureGroup_ = gestureGroup;
102     }
103 
SetOnAction(const GestureEventFunc & onAction)104     void SetOnAction(const GestureEventFunc& onAction)
105     {
106         onAction_ = std::make_unique<GestureEventFunc>(onAction);
107     }
108 
SetOnActionStart(const GestureEventFunc & onActionStart)109     void SetOnActionStart(const GestureEventFunc& onActionStart)
110     {
111         onActionStart_ = std::make_unique<GestureEventFunc>(onActionStart);
112     }
113 
SetOnActionUpdate(const GestureEventFunc & onActionUpdate)114     void SetOnActionUpdate(const GestureEventFunc& onActionUpdate)
115     {
116         onActionUpdate_ = std::make_unique<GestureEventFunc>(onActionUpdate);
117     }
118 
SetOnActionEnd(const GestureEventFunc & onActionEnd)119     void SetOnActionEnd(const GestureEventFunc& onActionEnd)
120     {
121         onActionEnd_ = std::make_unique<GestureEventFunc>(onActionEnd);
122     }
123 
SetOnActionCancel(const GestureEventNoParameter & onActionCancel)124     void SetOnActionCancel(const GestureEventNoParameter& onActionCancel)
125     {
126         onActionCancel_ = std::make_unique<GestureEventNoParameter>(onActionCancel);
127     }
128 
SendCancelMsg()129     inline void SendCancelMsg()
130     {
131         if (onActionCancel_ && *onActionCancel_) {
132             (*onActionCancel_)();
133         }
134     }
135 
SetIsExternalGesture(bool isExternalGesture)136     void SetIsExternalGesture(bool isExternalGesture)
137     {
138         isExternalGesture_ = isExternalGesture;
139     }
140 
GetIsExternalGesture()141     bool GetIsExternalGesture() const
142     {
143         return isExternalGesture_;
144     }
145 
146 protected:
147     virtual void HandleTouchDownEvent(const TouchEvent& event) = 0;
148     virtual void HandleTouchUpEvent(const TouchEvent& event) = 0;
149     virtual void HandleTouchMoveEvent(const TouchEvent& event) = 0;
150     virtual void HandleTouchCancelEvent(const TouchEvent& event) = 0;
HandleTouchDownEvent(const AxisEvent & event)151     virtual void HandleTouchDownEvent(const AxisEvent& event) {}
HandleTouchUpEvent(const AxisEvent & event)152     virtual void HandleTouchUpEvent(const AxisEvent& event) {}
HandleTouchMoveEvent(const AxisEvent & event)153     virtual void HandleTouchMoveEvent(const AxisEvent& event) {}
HandleTouchCancelEvent(const AxisEvent & event)154     virtual void HandleTouchCancelEvent(const AxisEvent& event) {}
155 
156     virtual void AddToReferee(size_t touchId, const RefPtr<GestureRecognizer>& recognizer);
157     virtual void DelFromReferee(size_t touchId, const RefPtr<GestureRecognizer>& recognizer);
158     virtual void BatchAdjudicate(
159         const std::set<size_t>& touchIds, const RefPtr<GestureRecognizer>& recognizer, GestureDisposal disposal);
160 
161     DetectState state_ { DetectState::READY };
162     RefereeState refereeState_ { RefereeState::DETECTING };
163     GesturePriority priority_ = GesturePriority::Low;
164     GestureMask priorityMask_ = GestureMask::Normal;
165 
166     int32_t fingers_ = 1;
167     std::list<FingerInfo> fingerList_;
168     bool isExternalGesture_ = false;
169 
170     std::unique_ptr<GestureEventFunc> onAction_;
171     std::unique_ptr<GestureEventFunc> onActionStart_;
172     std::unique_ptr<GestureEventFunc> onActionUpdate_;
173     std::unique_ptr<GestureEventFunc> onActionEnd_;
174     std::unique_ptr<GestureEventNoParameter> onActionCancel_;
175 
176     int64_t deviceId_ = 0;
177     SourceType deviceType_ = SourceType::NONE;
178 
179 private:
180     WeakPtr<GestureRecognizer> gestureGroup_;
181 };
182 
183 } // namespace OHOS::Ace
184 
185 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_GESTURES_GESTURE_RECOGNIZER_H
186