• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_COMPONENTS_NG_GESTURES_RECOGNIZERS_GESTURE_RECOGNIZER_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_GESTURES_RECOGNIZERS_GESTURE_RECOGNIZER_H
18 
19 #include <memory>
20 
21 #include "base/memory/referenced.h"
22 #include "core/components_ng/event/gesture_info.h"
23 #include "core/components_ng/gestures/gesture_info.h"
24 #include "core/components_ng/gestures/gesture_referee.h"
25 #include "core/event/axis_event.h"
26 #include "core/event/touch_event.h"
27 #include "frameworks/base/geometry/ng/point_t.h"
28 
29 namespace OHOS::Ace::NG {
30 
31 struct DelayedTask {
32     WeakPtr<NGGestureRecognizer> recognizer;
33     int64_t timeStamp = 0;
34     int32_t time = 0;
35     std::function<void()> task;
36 };
37 
38 enum class RefereeState { READY, DETECTING, PENDING, PENDING_BLOCKED, SUCCEED_BLOCKED, SUCCEED, FAIL };
39 
TransRefereeState(RefereeState state)40 inline std::string TransRefereeState(RefereeState state)
41 {
42     const char *str[] = { "READY", "DETECTING", "PENDING", "PENDING_BLOCKED", "SUCCEED_BLOCKED", "SUCCEED", "FAIL" };
43     if (state >= RefereeState::READY && state <= RefereeState::FAIL) {
44         return str[static_cast<int32_t>(state)];
45     }
46     return std::string("State:").append(std::to_string(static_cast<int32_t>(state)));
47 }
48 
49 class FrameNode;
50 
51 class ACE_EXPORT NGGestureRecognizer : public TouchEventTarget {
52     DECLARE_ACE_TYPE(NGGestureRecognizer, TouchEventTarget)
53 
54 public:
55     static std::unordered_map<int, TransformConfig>& GetGlobalTransCfg();
56 
57     static std::unordered_map<int, AncestorNodeInfo>& GetGlobalTransIds();
58 
59     static void ResetGlobalTransCfg();
60 
61     // IsRealTime is true when using real-time layouts.
62     static void Transform(
63         PointF& localPointF, const WeakPtr<FrameNode>& node, bool isRealTime = false, bool isPostEventResult = false);
64 
65     // Triggered when the gesture referee finishes collecting gestures and begin a gesture referee.
66     void BeginReferee(int32_t touchId, bool needUpdateChild = false)
67     {
68         OnBeginGestureReferee(touchId, needUpdateChild);
69     }
70 
CreateGestureFromRecognizer()71     virtual RefPtr<Gesture> CreateGestureFromRecognizer() const
72     {
73         return nullptr;
74     }
75 
76     // Triggered when the Gesture referee ends a gesture referee.
77     void FinishReferee(int32_t touchId, bool isBlocked = false)
78     {
79         OnFinishGestureReferee(touchId, isBlocked);
80     }
81 
82     virtual void AboutToAccept();
83 
84     // Called when request of handling gesture sequence is accepted by gesture referee.
85     virtual void OnAccepted() = 0;
86 
87     // Called when request of handling gesture sequence is rejected by gesture referee.
88     virtual void OnRejected() = 0;
89 
90     // Called when request of handling gesture sequence is pending by gesture referee.
OnPending()91     virtual void OnPending()
92     {
93         refereeState_ = RefereeState::PENDING;
94     }
95 
96     // Called when request of handling gesture sequence is blocked by gesture referee.
OnBlocked()97     virtual void OnBlocked()
98     {
99         if (disposal_ == GestureDisposal::ACCEPT) {
100             refereeState_ = RefereeState::SUCCEED_BLOCKED;
101         }
102         if (disposal_ == GestureDisposal::PENDING) {
103             refereeState_ = RefereeState::PENDING_BLOCKED;
104         }
105     }
106 
107     // Reconcile the state from the given recognizer into this. The
108     // implementation must check that the given recognizer type matches the
109     // current one. The return value should be false if the reconciliation fails
110     // and true if it succeeds
ReconcileFrom(const RefPtr<NGGestureRecognizer> & recognizer)111     virtual bool ReconcileFrom(const RefPtr<NGGestureRecognizer>& recognizer)
112     {
113         return true;
114     }
115 
SetInnerFlag(bool value)116     virtual void SetInnerFlag(bool value) {
117         fromCardOrUIExtension_ = value;
118     }
119 
GetInnerFlag()120     bool GetInnerFlag() {
121         return fromCardOrUIExtension_;
122     }
123 
DispatchEvent(const TouchEvent & point)124     bool DispatchEvent(const TouchEvent& point) override
125     {
126         return true;
127     }
128     bool HandleEvent(const TouchEvent& point) override;
129     bool HandleEvent(const AxisEvent& event) override;
130 
GetPriority()131     GesturePriority GetPriority() const
132     {
133         return priority_;
134     }
135 
SetPriority(GesturePriority priority)136     void SetPriority(GesturePriority priority)
137     {
138         priority_ = priority;
139     }
140 
GetPriorityMask()141     GestureMask GetPriorityMask() const
142     {
143         return priorityMask_;
144     }
145 
SetPriorityMask(GestureMask priorityMask)146     void SetPriorityMask(GestureMask priorityMask)
147     {
148         priorityMask_ = priorityMask;
149     }
150 
GetGestureDisposal()151     GestureDisposal GetGestureDisposal() const
152     {
153         return disposal_;
154     }
155 
GetRefereeState()156     RefereeState GetRefereeState() const
157     {
158         return refereeState_;
159     }
160 
161     bool SetGestureGroup(const WeakPtr<NGGestureRecognizer>& gestureGroup);
162 
163     void SetEventImportGestureGroup(const WeakPtr<NGGestureRecognizer>& gestureGroup);
164 
ResetEventImportGestureGroup()165     void ResetEventImportGestureGroup()
166     {
167         eventImportGestureGroup_.Reset();
168     }
169 
GetGestureGroup()170     const WeakPtr<NGGestureRecognizer>& GetGestureGroup() const
171     {
172         return gestureGroup_;
173     }
174 
SetOnAction(const GestureEventFunc & onAction)175     void SetOnAction(const GestureEventFunc& onAction)
176     {
177         onAction_ = std::make_unique<GestureEventFunc>(onAction);
178     }
179 
SetOnActionStart(const GestureEventFunc & onActionStart)180     void SetOnActionStart(const GestureEventFunc& onActionStart)
181     {
182         onActionStart_ = std::make_unique<GestureEventFunc>(onActionStart);
183     }
184 
SetOnActionUpdate(const GestureEventFunc & onActionUpdate)185     void SetOnActionUpdate(const GestureEventFunc& onActionUpdate)
186     {
187         onActionUpdate_ = std::make_unique<GestureEventFunc>(onActionUpdate);
188     }
189 
SetOnActionEnd(const GestureEventFunc & onActionEnd)190     void SetOnActionEnd(const GestureEventFunc& onActionEnd)
191     {
192         onActionEnd_ = std::make_unique<GestureEventFunc>(onActionEnd);
193     }
194 
SetOnActionCancel(const GestureEventNoParameter & onActionCancel)195     void SetOnActionCancel(const GestureEventNoParameter& onActionCancel)
196     {
197         onActionCancel_ = std::make_unique<GestureEventNoParameter>(onActionCancel);
198     }
199 
SendCancelMsg()200     inline void SendCancelMsg()
201     {
202         if (onActionCancel_ && *onActionCancel_) {
203             (*onActionCancel_)();
204         }
205     }
206 
SetIsExternalGesture(bool isExternalGesture)207     void SetIsExternalGesture(bool isExternalGesture)
208     {
209         isExternalGesture_ = isExternalGesture;
210     }
211 
GetIsExternalGesture()212     bool GetIsExternalGesture() const
213     {
214         return isExternalGesture_;
215     }
216 
IsPending()217     bool IsPending() const
218     {
219         return (refereeState_ == RefereeState::PENDING) || (refereeState_ == RefereeState::PENDING_BLOCKED);
220     }
221 
IsRefereeFinished()222     bool IsRefereeFinished() const
223     {
224         return (refereeState_ == RefereeState::SUCCEED) || (refereeState_ == RefereeState::FAIL) ||
225                (refereeState_ == RefereeState::SUCCEED_BLOCKED);
226     }
227 
228     // called when gesture scope is closed.
229     void ResetStatusOnFinish(bool isBlocked = false)
230     {
231         if (isBlocked && refereeState_ == RefereeState::SUCCEED) {
232             OnSucceedCancel();
233         }
234         refereeState_ = RefereeState::READY;
235         disposal_ = GestureDisposal::NONE;
236         currentFingers_ = 0;
237         OnResetStatus();
238     }
239 
240     // called to reset status manually without rejected callback.
ResetStatus()241     void ResetStatus()
242     {
243         refereeState_ = RefereeState::READY;
244         OnResetStatus();
245     }
246     virtual bool CheckTouchId(int32_t touchId) = 0;
247 
getDeviceType()248     SourceType getDeviceType()
249     {
250         return deviceType_;
251     }
252 
253     void SetTransInfo(int id);
254 
255     virtual RefPtr<GestureSnapshot> Dump() const override;
256 
257     // for recognizer
258     void AddGestureProcedure(const std::string& procedure) const;
259     // for recognizer group
260     void AddGestureProcedure(const TouchEvent& point, const RefPtr<NGGestureRecognizer>& recognizer) const;
261 
SetGestureInfo(const RefPtr<GestureInfo> & gestureInfo)262     void SetGestureInfo(const RefPtr<GestureInfo>& gestureInfo)
263     {
264         gestureInfo_ = gestureInfo;
265     }
266 
GetGestureInfo()267     RefPtr<GestureInfo> GetGestureInfo()
268     {
269         return gestureInfo_;
270     }
271 
GetOrCreateGestureInfo()272     RefPtr<GestureInfo> GetOrCreateGestureInfo()
273     {
274         if (!gestureInfo_) {
275             gestureInfo_ = MakeRefPtr<GestureInfo>();
276         }
277         return gestureInfo_;
278     }
279 
SetSysGestureJudge(const GestureJudgeFunc & sysJudge)280     void SetSysGestureJudge(const GestureJudgeFunc& sysJudge)
281     {
282         sysJudge_ = sysJudge;
283     }
284 
SetIsSystemGesture(bool isSystemGesture)285     void SetIsSystemGesture(bool isSystemGesture)
286     {
287         if (gestureInfo_) {
288             gestureInfo_->SetIsSystemGesture(isSystemGesture);
289         } else {
290             gestureInfo_ = MakeRefPtr<GestureInfo>(isSystemGesture);
291         }
292     }
293 
ForceCleanRecognizer()294     virtual void ForceCleanRecognizer() {};
CleanRecognizerState()295     virtual void CleanRecognizerState() {};
296 
AboutToAddCurrentFingers(int32_t touchId)297     virtual bool AboutToAddCurrentFingers(int32_t touchId)
298     {
299         currentFingers_++;
300         return true;
301     }
302 
303     bool IsInAttachedNode(const TouchEvent& event);
304 
305 protected:
Adjudicate(const RefPtr<NGGestureRecognizer> & recognizer,GestureDisposal disposal)306     void Adjudicate(const RefPtr<NGGestureRecognizer>& recognizer, GestureDisposal disposal)
307     {
308         disposal_ = disposal;
309         BatchAdjudicate(recognizer, disposal);
310     }
311     virtual void BatchAdjudicate(const RefPtr<NGGestureRecognizer>& recognizer, GestureDisposal disposal);
312 
313     virtual void OnBeginGestureReferee(int32_t touchId, bool needUpdateChild = false) {}
314     virtual void OnFinishGestureReferee(int32_t touchId, bool isBlocked = false) {}
315 
316     virtual void HandleTouchDownEvent(const TouchEvent& event) = 0;
317     virtual void HandleTouchUpEvent(const TouchEvent& event) = 0;
318     virtual void HandleTouchMoveEvent(const TouchEvent& event) = 0;
319     virtual void HandleTouchCancelEvent(const TouchEvent& event) = 0;
HandleTouchDownEvent(const AxisEvent & event)320     virtual void HandleTouchDownEvent(const AxisEvent& event) {}
HandleTouchUpEvent(const AxisEvent & event)321     virtual void HandleTouchUpEvent(const AxisEvent& event) {}
HandleTouchMoveEvent(const AxisEvent & event)322     virtual void HandleTouchMoveEvent(const AxisEvent& event) {}
HandleTouchCancelEvent(const AxisEvent & event)323     virtual void HandleTouchCancelEvent(const AxisEvent& event) {}
324 
325     virtual void OnResetStatus() = 0;
326 
OnSucceedCancel()327     virtual void OnSucceedCancel() {}
328     bool ShouldResponse() override;
329 
330     RefereeState refereeState_ = RefereeState::READY;
331 
332     GestureDisposal disposal_ = GestureDisposal::NONE;
333 
334     GesturePriority priority_ = GesturePriority::Low;
335 
336     GestureMask priorityMask_ = GestureMask::Normal;
337 
338     bool isExternalGesture_ = false;
339     bool fromCardOrUIExtension_ = false;
340     std::unique_ptr<GestureEventFunc> onAction_;
341     std::unique_ptr<GestureEventFunc> onActionStart_;
342     std::unique_ptr<GestureEventFunc> onActionUpdate_;
343     std::unique_ptr<GestureEventFunc> onActionEnd_;
344     std::unique_ptr<GestureEventNoParameter> onActionCancel_;
345 
346     int64_t deviceId_ = 0;
347     SourceType deviceType_ = SourceType::NONE;
348     int32_t transId_ = 0;
349 
350     int32_t currentFingers_ = 0;
351     RefPtr<GestureInfo> gestureInfo_;
352     GestureJudgeFunc sysJudge_ = nullptr;
353 private:
354     WeakPtr<NGGestureRecognizer> gestureGroup_;
355     WeakPtr<NGGestureRecognizer> eventImportGestureGroup_;
356 };
357 
358 } // namespace OHOS::Ace::NG
359 
360 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_GESTURES_RECOGNIZERS_GESTURE_RECOGNIZER_H
361