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