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     // IsRealTime is true when using real-time layouts.
56     static void Transform(PointF& localPointF, const WeakPtr<FrameNode>& node, bool isRealTime = false,
57         bool isPostEventResult = false, int32_t postEventNodeId = -1);
58 
59     // Triggered when the gesture referee finishes collecting gestures and begin a gesture referee.
60     void BeginReferee(int32_t touchId, bool needUpdateChild = false)
61     {
62         OnBeginGestureReferee(touchId, needUpdateChild);
63     }
64 
CreateGestureFromRecognizer()65     virtual RefPtr<Gesture> CreateGestureFromRecognizer() const
66     {
67         return nullptr;
68     }
69 
70     // Triggered when the Gesture referee ends a gesture referee.
71     void FinishReferee(int32_t touchId, bool isBlocked = false)
72     {
73         OnFinishGestureReferee(touchId, isBlocked);
74     }
75 
76     virtual void AboutToAccept();
77 
78     // Called when request of handling gesture sequence is accepted by gesture referee.
79     virtual void OnAccepted() = 0;
80 
81     // Called when request of handling gesture sequence is rejected by gesture referee.
82     virtual void OnRejected() = 0;
83 
84     void OnRejectBridgeObj();
85 
86     // Called when request of handling gesture sequence is pending by gesture referee.
OnPending()87     virtual void OnPending()
88     {
89         refereeState_ = RefereeState::PENDING;
90     }
91 
92     // Called when request of handling gesture sequence is blocked by gesture referee.
OnBlocked()93     virtual void OnBlocked()
94     {
95         if (disposal_ == GestureDisposal::ACCEPT) {
96             refereeState_ = RefereeState::SUCCEED_BLOCKED;
97         }
98         if (disposal_ == GestureDisposal::PENDING) {
99             refereeState_ = RefereeState::PENDING_BLOCKED;
100         }
101     }
102 
103     // Reconcile the state from the given recognizer into this. The
104     // implementation must check that the given recognizer type matches the
105     // current one. The return value should be false if the reconciliation fails
106     // and true if it succeeds
ReconcileFrom(const RefPtr<NGGestureRecognizer> & recognizer)107     virtual bool ReconcileFrom(const RefPtr<NGGestureRecognizer>& recognizer)
108     {
109         return true;
110     }
111 
SetInnerFlag(bool value)112     virtual void SetInnerFlag(bool value) {
113         fromCardOrUIExtension_ = value;
114     }
115 
GetInnerFlag()116     bool GetInnerFlag() {
117         return fromCardOrUIExtension_;
118     }
119 
DispatchEvent(const TouchEvent & point)120     bool DispatchEvent(const TouchEvent& point) override
121     {
122         return true;
123     }
124     bool HandleEvent(const TouchEvent& point) override;
125     bool HandleEvent(const AxisEvent& event) override;
126 
127     void HandleBridgeModeEvent(const TouchEvent& point);
128     void HandleEventToBridgeObjList(
129         const TouchEvent& point, const std::list<WeakPtr<NGGestureRecognizer>>& bridgeObjList);
130     void HandleBridgeModeEvent(const AxisEvent& event);
131 
GetPriority()132     GesturePriority GetPriority() const
133     {
134         return priority_;
135     }
136 
SetPriority(GesturePriority priority)137     void SetPriority(GesturePriority priority)
138     {
139         priority_ = priority;
140     }
141 
GetPriorityMask()142     GestureMask GetPriorityMask() const
143     {
144         return priorityMask_;
145     }
146 
SetPriorityMask(GestureMask priorityMask)147     void SetPriorityMask(GestureMask priorityMask)
148     {
149         priorityMask_ = priorityMask;
150     }
151 
GetGestureDisposal()152     GestureDisposal GetGestureDisposal() const
153     {
154         return disposal_;
155     }
156 
GetRefereeState()157     RefereeState GetRefereeState() const
158     {
159         return refereeState_;
160     }
161 
162     bool SetGestureGroup(const WeakPtr<NGGestureRecognizer>& gestureGroup);
163 
164     void SetEventImportGestureGroup(const WeakPtr<NGGestureRecognizer>& gestureGroup);
165 
ResetEventImportGestureGroup()166     void ResetEventImportGestureGroup()
167     {
168         eventImportGestureGroup_.Reset();
169     }
170 
GetGestureGroup()171     const WeakPtr<NGGestureRecognizer>& GetGestureGroup() const
172     {
173         return gestureGroup_;
174     }
175 
SetOnAction(const GestureEventFunc & onAction)176     void SetOnAction(const GestureEventFunc& onAction)
177     {
178         onAction_ = std::make_unique<GestureEventFunc>(onAction);
179     }
180 
SetOnActionStart(const GestureEventFunc & onActionStart)181     void SetOnActionStart(const GestureEventFunc& onActionStart)
182     {
183         onActionStart_ = std::make_unique<GestureEventFunc>(onActionStart);
184     }
185 
SetOnActionUpdate(const GestureEventFunc & onActionUpdate)186     void SetOnActionUpdate(const GestureEventFunc& onActionUpdate)
187     {
188         onActionUpdate_ = std::make_unique<GestureEventFunc>(onActionUpdate);
189     }
190 
SetOnActionEnd(const GestureEventFunc & onActionEnd)191     void SetOnActionEnd(const GestureEventFunc& onActionEnd)
192     {
193         onActionEnd_ = std::make_unique<GestureEventFunc>(onActionEnd);
194     }
195 
SetOnActionCancel(const GestureEventNoParameter & onActionCancel)196     void SetOnActionCancel(const GestureEventNoParameter& onActionCancel)
197     {
198         onActionCancel_ = std::make_unique<GestureEventNoParameter>(onActionCancel);
199     }
200 
SetOnReject(const GestureEventNoParameter & onReject)201     void SetOnReject(const GestureEventNoParameter& onReject)
202     {
203         onReject_ = std::make_unique<GestureEventNoParameter>(onReject);
204     }
205 
SendCancelMsg()206     inline void SendCancelMsg()
207     {
208         if (onActionCancel_ && *onActionCancel_ && (!gestureInfo_ || !gestureInfo_->GetDisposeTag())) {
209             (*onActionCancel_)();
210         }
211     }
212 
SendRejectMsg()213     inline void SendRejectMsg()
214     {
215         if (onReject_ && *onReject_) {
216             (*onReject_)();
217         }
218     }
219 
SetIsExternalGesture(bool isExternalGesture)220     void SetIsExternalGesture(bool isExternalGesture)
221     {
222         isExternalGesture_ = isExternalGesture;
223     }
224 
GetIsExternalGesture()225     bool GetIsExternalGesture() const
226     {
227         return isExternalGesture_;
228     }
229 
IsPending()230     bool IsPending() const
231     {
232         return (refereeState_ == RefereeState::PENDING) || (refereeState_ == RefereeState::PENDING_BLOCKED);
233     }
234 
IsRefereeFinished()235     bool IsRefereeFinished() const
236     {
237         return (refereeState_ == RefereeState::SUCCEED) || (refereeState_ == RefereeState::FAIL) ||
238                (refereeState_ == RefereeState::SUCCEED_BLOCKED);
239     }
240 
241     // called when gesture scope is closed.
242     void ResetStatusOnFinish(bool isBlocked = false)
243     {
244         if (isBlocked && refereeState_ == RefereeState::SUCCEED) {
245             OnSucceedCancel();
246         }
247         refereeState_ = RefereeState::READY;
248         disposal_ = GestureDisposal::NONE;
249         currentFingers_ = 0;
250         SetBridgeMode(false);
251         ClearBridgeObjList();
252         responseLinkRecognizer_.clear();
253         enabled_ = true;
254         OnResetStatus();
255     }
256 
257     // called to reset status manually without rejected callback.
ResetStatus()258     void ResetStatus()
259     {
260         refereeState_ = RefereeState::READY;
261         OnResetStatus();
262         SetBridgeMode(false);
263         ClearBridgeObjList();
264         responseLinkRecognizer_.clear();
265         enabled_ = true;
266     }
267     virtual bool CheckTouchId(int32_t touchId) = 0;
268 
getDeviceType()269     SourceType getDeviceType()
270     {
271         return deviceType_;
272     }
273 
274     void SetTransInfo(int id);
275 
276     virtual RefPtr<GestureSnapshot> Dump() const override;
277 
278     // for recognizer
279     void AddGestureProcedure(const std::string& procedure) const;
280     // for recognizer group
281     void AddGestureProcedure(const TouchEvent& point, const RefPtr<NGGestureRecognizer>& recognizer) const;
282 
IsSystemGesture()283     bool IsSystemGesture() const
284     {
285         if (!gestureInfo_) {
286             return false;
287         }
288         return gestureInfo_->IsSystemGesture();
289     }
290 
GetRecognizerType()291     GestureTypeName GetRecognizerType() const
292     {
293         if (!gestureInfo_) {
294             return GestureTypeName::UNKNOWN;
295         }
296         return gestureInfo_->GetRecognizerType();
297     }
298 
SetRecognizerType(GestureTypeName trueType)299     void SetRecognizerType(GestureTypeName trueType)
300     {
301         if (!gestureInfo_) {
302             gestureInfo_ = MakeRefPtr<GestureInfo>();
303         }
304         gestureInfo_->SetRecognizerType(trueType);
305     }
306 
ForceCleanRecognizer()307     virtual void ForceCleanRecognizer() {};
308 
SetGestureInfo(const RefPtr<GestureInfo> & gestureInfo)309     void SetGestureInfo(const RefPtr<GestureInfo>& gestureInfo)
310     {
311         gestureInfo_ = gestureInfo;
312     }
313 
GetGestureInfo()314     RefPtr<GestureInfo> GetGestureInfo()
315     {
316         return gestureInfo_;
317     }
318 
GetOrCreateGestureInfo()319     RefPtr<GestureInfo> GetOrCreateGestureInfo()
320     {
321         if (!gestureInfo_) {
322             gestureInfo_ = MakeRefPtr<GestureInfo>();
323         }
324         return gestureInfo_;
325     }
326 
SetSysGestureJudge(const GestureJudgeFunc & sysJudge)327     void SetSysGestureJudge(const GestureJudgeFunc& sysJudge)
328     {
329         sysJudge_ = sysJudge;
330     }
331 
SetIsSystemGesture(bool isSystemGesture)332     void SetIsSystemGesture(bool isSystemGesture)
333     {
334         if (gestureInfo_) {
335             gestureInfo_->SetIsSystemGesture(isSystemGesture);
336         } else {
337             gestureInfo_ = MakeRefPtr<GestureInfo>(isSystemGesture);
338         }
339     }
340 
CleanRecognizerState()341     virtual void CleanRecognizerState() {};
342 
343     bool AboutToAddCurrentFingers(const TouchEvent& event);
344 
345     bool AboutToMinusCurrentFingers(int32_t touchId);
346 
347     bool IsInAttachedNode(const TouchEvent& event, bool isRealTime = true);
348 
349 
SetUserData(void * userData)350     void SetUserData(void* userData)
351     {
352         if (gestureInfo_) {
353             gestureInfo_->SetUserData(userData);
354         }
355     }
356 
IsReady()357     virtual bool IsReady()
358     {
359         return refereeState_ == RefereeState::READY;
360     }
361 
SetDisposeNotifyCallback(std::function<void (void *)> && callback)362     void SetDisposeNotifyCallback(std::function<void(void*)>&& callback)
363     {
364         if (gestureInfo_) {
365             gestureInfo_->SetDisposeNotifyFunc(std::move(callback));
366         }
367     }
368 
SetBridgeMode(bool bridgeMode)369     void SetBridgeMode(bool bridgeMode)
370     {
371         bridgeMode_ = bridgeMode;
372     }
373 
IsBridgeMode()374     bool IsBridgeMode() const
375     {
376         return bridgeMode_;
377     }
378 
AddBridgeObj(const WeakPtr<NGGestureRecognizer> & bridgeObj)379     void AddBridgeObj(const WeakPtr<NGGestureRecognizer>& bridgeObj)
380     {
381         bridgeObjList_.emplace_back(bridgeObj);
382     }
383 
GetBridgeObj()384     std::list<WeakPtr<NGGestureRecognizer>> GetBridgeObj() const
385     {
386         return bridgeObjList_;
387     }
388 
ClearBridgeObjList()389     void ClearBridgeObjList()
390     {
391         bridgeObjList_.clear();
392     }
393 
SetEnabled(bool enabled)394     void SetEnabled(bool enabled)
395     {
396         enabled_ = enabled;
397     }
398 
IsEnabled()399     bool IsEnabled() const
400     {
401         return enabled_;
402     }
403 
GetGestureState()404     RefereeState GetGestureState() const
405     {
406         return refereeState_;
407     }
408 
409     void SetResponseLinkRecognizers(const ResponseLinkResult& responseLinkResult);
410 
411     bool IsInResponseLinkRecognizers();
412 
413     bool IsAllowedType(SourceTool type);
414 
GetExtraInfo()415     std::string GetExtraInfo() const
416     {
417         return extraInfo_;
418     }
419 protected:
Adjudicate(const RefPtr<NGGestureRecognizer> & recognizer,GestureDisposal disposal)420     void Adjudicate(const RefPtr<NGGestureRecognizer>& recognizer, GestureDisposal disposal)
421     {
422         disposal_ = disposal;
423         BatchAdjudicate(recognizer, disposal);
424     }
425     virtual void BatchAdjudicate(const RefPtr<NGGestureRecognizer>& recognizer, GestureDisposal disposal);
426 
427     virtual void OnBeginGestureReferee(int32_t touchId, bool needUpdateChild = false) {}
428     virtual void OnFinishGestureReferee(int32_t touchId, bool isBlocked = false) {}
429 
430     virtual void HandleTouchDownEvent(const TouchEvent& event) = 0;
431     virtual void HandleTouchUpEvent(const TouchEvent& event) = 0;
432     virtual void HandleTouchMoveEvent(const TouchEvent& event) = 0;
433     virtual void HandleTouchCancelEvent(const TouchEvent& event) = 0;
HandleTouchDownEvent(const AxisEvent & event)434     virtual void HandleTouchDownEvent(const AxisEvent& event) {}
HandleTouchUpEvent(const AxisEvent & event)435     virtual void HandleTouchUpEvent(const AxisEvent& event) {}
HandleTouchMoveEvent(const AxisEvent & event)436     virtual void HandleTouchMoveEvent(const AxisEvent& event) {}
HandleTouchCancelEvent(const AxisEvent & event)437     virtual void HandleTouchCancelEvent(const AxisEvent& event) {}
438 
439     virtual void OnResetStatus() = 0;
440 
OnSucceedCancel()441     virtual void OnSucceedCancel() {}
RemoveUnsupportEvent(int32_t touchId)442     virtual void RemoveUnsupportEvent(int32_t touchId) {}
443     bool ShouldResponse() override;
444 
445     void HandleWillAccept();
446     void HandleDidAccept();
447 
448     void ReconcileGestureInfoFrom(const RefPtr<NGGestureRecognizer>& recognizer);
449     bool ProcessTouchEvent(const TouchEvent& point);
450     void HandleTouchDown(const TouchEvent& point);
451     void HandleTouchUp(const TouchEvent& point);
452     void HandleTouchCancel(const TouchEvent& point);
453 
454     RefereeState refereeState_ = RefereeState::READY;
455 
456     GestureDisposal disposal_ = GestureDisposal::NONE;
457 
458     GesturePriority priority_ = GesturePriority::Low;
459 
460     GestureMask priorityMask_ = GestureMask::Normal;
461 
462     bool isExternalGesture_ = false;
463     bool fromCardOrUIExtension_ = false;
464     std::unique_ptr<GestureEventFunc> onAction_;
465     std::unique_ptr<GestureEventFunc> onActionStart_;
466     std::unique_ptr<GestureEventFunc> onActionUpdate_;
467     std::unique_ptr<GestureEventFunc> onActionEnd_;
468     std::unique_ptr<GestureEventNoParameter> onActionCancel_;
469     // triggered when the recongnizer is rejected
470     std::unique_ptr<GestureEventNoParameter> onReject_;
471 
472     int64_t deviceId_ = 0;
473     SourceType deviceType_ = SourceType::NONE;
474     InputEventType inputEventType_ = InputEventType::TOUCH_SCREEN;
475     int32_t transId_ = 0;
476 
477     int32_t currentFingers_ = 0;
478     std::set<int32_t> fingersId_;
479     RefPtr<GestureInfo> gestureInfo_;
480     GestureJudgeFunc sysJudge_ = nullptr;
481     bool isTouchEventFinished_ = false;
482     bool bridgeMode_ = false;
483     std::list<WeakPtr<NGGestureRecognizer>> bridgeObjList_;
484     bool enabled_ = true;
485     ResponseLinkResult responseLinkRecognizer_;
486     std::string extraInfo_;
487 private:
488     WeakPtr<NGGestureRecognizer> gestureGroup_;
489     WeakPtr<NGGestureRecognizer> eventImportGestureGroup_;
490 };
491 
492 } // namespace OHOS::Ace::NG
493 
494 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_GESTURES_RECOGNIZERS_GESTURE_RECOGNIZER_H
495