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