• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2024 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 #include "core/components_ng/event/gesture_event_hub.h"
17 
18 #include "base/memory/ace_type.h"
19 #include "base/utils/time_util.h"
20 #include "core/components_ng/base/frame_node.h"
21 #include "core/components_ng/event/click_event.h"
22 #include "core/components_ng/event/event_hub.h"
23 #include "core/components_ng/gestures/gesture_group.h"
24 #include "core/components_ng/gestures/recognizers/click_recognizer.h"
25 #include "core/components_ng/gestures/recognizers/exclusive_recognizer.h"
26 #include "core/components_ng/pattern/pattern.h"
27 
28 namespace OHOS::Ace::NG {
29 constexpr int32_t MAX_FRAME_NODE_DEPTH = 2;
30 constexpr int32_t MIN_RECOGNIZER_GROUP_LOOP_SIZE = 3;
31 constexpr const char* HIT_TEST_MODE[] = {
32     "HitTestMode.Default",
33     "HitTestMode.Block",
34     "HitTestMode.Transparent",
35     "HitTestMode.None",
36 };
37 
IsDifferentFrameNodeCollected(const RefPtr<NGGestureRecognizer> & current,const RefPtr<FrameNode> & host,int32_t depth=0)38 bool IsDifferentFrameNodeCollected(
39     const RefPtr<NGGestureRecognizer>& current, const RefPtr<FrameNode>& host, int32_t depth = 0)
40 {
41     CHECK_NULL_RETURN(current, true);
42     if (depth >= MAX_FRAME_NODE_DEPTH) {
43         return false;
44     }
45 
46     auto recognizerGroup = AceType::DynamicCast<RecognizerGroup>(current);
47     if (!recognizerGroup) {
48         auto recognizerNode = current->GetAttachedNode().Upgrade();
49         if (recognizerNode != host) {
50             return false;
51         }
52         return true;
53     }
54 
55     auto recognizerList = recognizerGroup->GetGroupRecognizer();
56     for (auto recognizer : recognizerList) {
57         if (!recognizer) {
58             continue;
59         }
60         if (AceType::InstanceOf<RecognizerGroup>(recognizer) &&
61             !IsDifferentFrameNodeCollected(recognizer, host, depth + 1)) {
62             return false;
63         } else {
64             auto recognizerNode = recognizer->GetAttachedNode().Upgrade();
65             if (recognizerNode != host) {
66                 return false;
67             }
68         }
69     }
70     return true;
71 }
72 
IsSystemRecognizerCollected(const RefPtr<NGGestureRecognizer> & current)73 bool IsSystemRecognizerCollected(const RefPtr<NGGestureRecognizer>& current)
74 {
75     CHECK_NULL_RETURN(current, false);
76     auto recognizerGroup = AceType::DynamicCast<RecognizerGroup>(current);
77     CHECK_NULL_RETURN(recognizerGroup, false);
78     auto recognizerList = recognizerGroup->GetGroupRecognizer();
79     for (const auto &recognizer : recognizerList) {
80         if (!recognizer) {
81             continue;
82         }
83         if (AceType::InstanceOf<RecognizerGroup>(recognizer) && IsSystemRecognizerCollected(recognizer)) {
84             return true;
85         } else {
86             if (recognizer->IsSystemGesture()) {
87                 return true;
88             }
89         }
90     }
91     return false;
92 }
93 
GestureEventHub(const WeakPtr<EventHub> & eventHub)94 GestureEventHub::GestureEventHub(const WeakPtr<EventHub>& eventHub) : eventHub_(eventHub) {}
95 
GetFrameNode() const96 RefPtr<FrameNode> GestureEventHub::GetFrameNode() const
97 {
98     auto eventHub = eventHub_.Upgrade();
99     return eventHub ? eventHub->GetFrameNode() : nullptr;
100 }
101 
ProcessTouchTestHit(const OffsetF & coordinateOffset,const TouchRestrict & touchRestrict,TouchTestResult & innerTargets,TouchTestResult & finalResult,int32_t touchId,const PointF & localPoint,const RefPtr<TargetComponent> & targetComponent,ResponseLinkResult & responseLinkResult)102 bool GestureEventHub::ProcessTouchTestHit(const OffsetF& coordinateOffset, const TouchRestrict& touchRestrict,
103     TouchTestResult& innerTargets, TouchTestResult& finalResult, int32_t touchId, const PointF& localPoint,
104     const RefPtr<TargetComponent>& targetComponent, ResponseLinkResult& responseLinkResult)
105 {
106     auto host = GetFrameNode();
107     CHECK_NULL_RETURN(host, false);
108     auto eventHub = eventHub_.Upgrade();
109     auto getEventTargetImpl = eventHub ? eventHub->CreateGetEventTargetImpl() : nullptr;
110     if (scrollableActuator_) {
111         scrollableActuator_->CollectTouchTarget(coordinateOffset, touchRestrict, getEventTargetImpl, innerTargets,
112             localPoint, host, targetComponent, responseLinkResult, touchId);
113     }
114     size_t idx = innerTargets.size();
115     size_t newIdx = 0;
116     ProcessEventTouchTestHit(coordinateOffset, touchRestrict, innerTargets,
117         finalResult, touchId, localPoint, targetComponent, responseLinkResult);
118     ProcessDragEventTouchTestHit(coordinateOffset, touchRestrict, innerTargets,
119         finalResult, touchId, localPoint, targetComponent, responseLinkResult);
120 
121     std::list<RefPtr<NGGestureRecognizer>> innerRecognizers;
122     for (auto const& eventTarget : innerTargets) {
123         auto recognizer = AceType::DynamicCast<NGGestureRecognizer>(eventTarget);
124         if (recognizer) {
125             auto recognizerGroup = AceType::DynamicCast<RecognizerGroup>(recognizer);
126             if (!recognizerGroup && newIdx >= idx) {
127                 recognizer->SetNodeId(host->GetId());
128                 recognizer->AttachFrameNode(WeakPtr<FrameNode>(host));
129                 recognizer->SetTargetComponent(targetComponent);
130                 recognizer->SetIsSystemGesture(true);
131             }
132             recognizer->BeginReferee(touchId);
133             innerRecognizers.push_back(std::move(recognizer));
134         } else {
135             eventTarget->SetNodeId(host->GetId());
136             eventTarget->AttachFrameNode(WeakPtr<FrameNode>(host));
137             eventTarget->SetTargetComponent(targetComponent);
138             finalResult.push_back(eventTarget);
139         }
140         newIdx++; // not process previous recognizers
141     }
142 
143     ProcessTouchTestHierarchy(
144         coordinateOffset, touchRestrict, innerRecognizers, finalResult, touchId, targetComponent, responseLinkResult);
145 
146     return false;
147 }
148 
ProcessEventTouchTestHit(const OffsetF & coordinateOffset,const TouchRestrict & touchRestrict,TouchTestResult & innerTargets,TouchTestResult & finalResult,int32_t touchId,const PointF & localPoint,const RefPtr<TargetComponent> & targetComponent,ResponseLinkResult & responseLinkResult)149 bool GestureEventHub::ProcessEventTouchTestHit(const OffsetF& coordinateOffset, const TouchRestrict& touchRestrict,
150     TouchTestResult& innerTargets, TouchTestResult& finalResult, int32_t touchId, const PointF& localPoint,
151     const RefPtr<TargetComponent>& targetComponent, ResponseLinkResult& responseLinkResult)
152 {
153     auto host = GetFrameNode();
154     CHECK_NULL_RETURN(host, false);
155     auto eventHub = eventHub_.Upgrade();
156     auto getEventTargetImpl = eventHub ? eventHub->CreateGetEventTargetImpl() : nullptr;
157     if (dragEventActuator_ && !dragEventActuator_->GetIsNewFwk()) {
158         dragEventActuator_->AddTouchListener(touchRestrict);
159     }
160     if (touchEventActuator_) {
161         touchEventActuator_->OnCollectTouchTarget(
162             coordinateOffset, touchRestrict, getEventTargetImpl, innerTargets, responseLinkResult);
163     }
164     if (clickEventActuator_ && !redirectClick_) {
165         clickEventActuator_->OnCollectTouchTarget(
166             coordinateOffset, touchRestrict, getEventTargetImpl, innerTargets, responseLinkResult);
167     }
168     if (userParallelClickEventActuator_) {
169         auto clickRecognizer = userParallelClickEventActuator_->GetClickRecognizer();
170         if (clickRecognizer) {
171             clickRecognizer->SetGestureInfo(
172                 MakeRefPtr<GestureInfo>(GestureTypeName::CLICK, GestureTypeName::CLICK, true));
173             clickRecognizer->SetOnAction(userParallelClickEventActuator_->GetClickEvent());
174             clickRecognizer->SetCoordinateOffset(Offset(coordinateOffset.GetX(), coordinateOffset.GetY()));
175             clickRecognizer->SetGetEventTargetImpl(getEventTargetImpl);
176         }
177     }
178     if (panEventActuator_) {
179         panEventActuator_->OnCollectTouchTarget(
180             coordinateOffset, touchRestrict, getEventTargetImpl, innerTargets, responseLinkResult);
181     }
182     return false;
183 }
184 
ProcessDragEventTouchTestHit(const OffsetF & coordinateOffset,const TouchRestrict & touchRestrict,TouchTestResult & innerTargets,TouchTestResult & finalResult,int32_t touchId,const PointF & localPoint,const RefPtr<TargetComponent> & targetComponent,ResponseLinkResult & responseLinkResult)185 bool GestureEventHub::ProcessDragEventTouchTestHit(const OffsetF& coordinateOffset, const TouchRestrict& touchRestrict,
186     TouchTestResult& innerTargets, TouchTestResult& finalResult, int32_t touchId, const PointF& localPoint,
187     const RefPtr<TargetComponent>& targetComponent, ResponseLinkResult& responseLinkResult)
188 {
189     auto host = GetFrameNode();
190     CHECK_NULL_RETURN(host, false);
191     auto eventHub = eventHub_.Upgrade();
192     auto getEventTargetImpl = eventHub ? eventHub->CreateGetEventTargetImpl() : nullptr;
193     TouchTestResult dragTargets;
194     if (longPressEventActuator_) {
195         longPressEventActuator_->OnCollectTouchTarget(
196             coordinateOffset, touchRestrict, getEventTargetImpl, dragTargets, responseLinkResult);
197     }
198     if (dragEventActuator_) {
199         dragEventActuator_->OnCollectTouchTarget(
200             coordinateOffset, touchRestrict, getEventTargetImpl, dragTargets, responseLinkResult);
201     }
202 
203     std::list<RefPtr<NGGestureRecognizer>> longPressRecognizers;
204     for (const auto& item : dragTargets) {
205         auto recognizer = AceType::DynamicCast<NGGestureRecognizer>(item);
206         if (recognizer) {
207             recognizer->BeginReferee(touchId);
208             recognizer->AttachFrameNode(WeakPtr<FrameNode>(host));
209             recognizer->SetTargetComponent(targetComponent);
210             auto group = AceType::DynamicCast<RecognizerGroup>(recognizer);
211             if (group) {
212                 group->SetChildrenTargetComponent(targetComponent);
213             }
214         }
215         longPressRecognizers.emplace_back(AceType::DynamicCast<NGGestureRecognizer>(item));
216     }
217     if (!longPressRecognizers.empty()) {
218         // this node has long press and drag event, combine into parallelRecognizer.
219         if (!nodeParallelRecognizer_) {
220             nodeParallelRecognizer_ = MakeRefPtr<ParallelRecognizer>(std::move(longPressRecognizers));
221         } else {
222             nodeParallelRecognizer_->AddChildren(longPressRecognizers);
223         }
224         innerTargets.emplace_back(nodeParallelRecognizer_);
225     } else {
226         nodeParallelRecognizer_.Reset();
227     }
228     return false;
229 }
230 
OnModifyDone()231 void GestureEventHub::OnModifyDone()
232 {
233     if (recreateGesture_) {
234         UpdateGestureHierarchy();
235         recreateGesture_ = false;
236     }
237 }
238 
PackInnerRecognizer(const Offset & offset,std::list<RefPtr<NGGestureRecognizer>> & innerRecognizers,int32_t touchId,const RefPtr<TargetComponent> & targetComponent)239 RefPtr<NGGestureRecognizer> GestureEventHub::PackInnerRecognizer(
240     const Offset& offset, std::list<RefPtr<NGGestureRecognizer>>& innerRecognizers, int32_t touchId,
241     const RefPtr<TargetComponent>& targetComponent)
242 {
243     RefPtr<NGGestureRecognizer> current;
244     // Pack inner recognizer include self inner recognizer and children.
245     if (innerRecognizers.size() == 1) {
246         current = *innerRecognizers.begin();
247     } else if (innerRecognizers.size() > 1) {
248         if (!innerExclusiveRecognizer_) {
249             innerExclusiveRecognizer_ = AceType::MakeRefPtr<ExclusiveRecognizer>(std::move(innerRecognizers));
250         } else {
251             innerExclusiveRecognizer_->AddChildren(innerRecognizers);
252         }
253         innerExclusiveRecognizer_->SetCoordinateOffset(offset);
254         innerExclusiveRecognizer_->BeginReferee(touchId);
255         auto host = GetFrameNode();
256         innerExclusiveRecognizer_->AttachFrameNode(WeakPtr<FrameNode>(host));
257         innerExclusiveRecognizer_->SetTargetComponent(targetComponent);
258         current = innerExclusiveRecognizer_;
259     }
260 
261     return current;
262 }
263 
ProcessParallelPriorityGesture(const Offset & offset,int32_t touchId,const RefPtr<TargetComponent> & targetComponent,const RefPtr<FrameNode> & host,RefPtr<NGGestureRecognizer> & current,std::list<RefPtr<NGGestureRecognizer>> & recognizers,int32_t & parallelIndex,bool needRebuildForCurrent)264 void GestureEventHub::ProcessParallelPriorityGesture(const Offset& offset, int32_t touchId,
265     const RefPtr<TargetComponent>& targetComponent, const RefPtr<FrameNode>& host, RefPtr<NGGestureRecognizer>& current,
266     std::list<RefPtr<NGGestureRecognizer>>& recognizers, int32_t& parallelIndex, bool needRebuildForCurrent)
267 {
268     auto recognizer = recognizers.front();
269     if (current) {
270         recognizers.push_front(current);
271     }
272     if (recognizers.size() > 1) {
273         if ((static_cast<int32_t>(externalParallelRecognizer_.size()) <= parallelIndex)) {
274             externalParallelRecognizer_.emplace_back(AceType::MakeRefPtr<ParallelRecognizer>(std::move(recognizers)));
275         } else if (needRebuildForCurrent) {
276             externalParallelRecognizer_.insert(externalParallelRecognizer_.begin(),
277                 AceType::MakeRefPtr<ParallelRecognizer>(std::move(recognizers)));
278             auto recognizerTouches = recognizer->GetTouchPoints();
279             for (const auto& iter : recognizerTouches) {
280                 externalParallelRecognizer_[parallelIndex]->BeginReferee(iter.first);
281             }
282         } else {
283             externalParallelRecognizer_[parallelIndex]->AddChildren(recognizers);
284         }
285         externalParallelRecognizer_[parallelIndex]->SetCoordinateOffset(offset);
286         externalParallelRecognizer_[parallelIndex]->BeginReferee(touchId);
287         externalParallelRecognizer_[parallelIndex]->AttachFrameNode(WeakPtr<FrameNode>(host));
288         externalParallelRecognizer_[parallelIndex]->SetTargetComponent(targetComponent);
289         current = externalParallelRecognizer_[parallelIndex];
290         parallelIndex++;
291     } else if (static_cast<int32_t>(externalParallelRecognizer_.size()) > parallelIndex) {
292         externalParallelRecognizer_[parallelIndex]->BeginReferee(touchId);
293         current = *recognizers.begin();
294     } else if (recognizers.size() == 1) {
295         current = *recognizers.begin();
296     }
297 }
298 
ProcessExternalExclusiveRecognizer(const Offset & offset,int32_t touchId,const RefPtr<TargetComponent> & targetComponent,const RefPtr<FrameNode> & host,GesturePriority priority,RefPtr<NGGestureRecognizer> & current,std::list<RefPtr<NGGestureRecognizer>> & recognizers,int32_t & exclusiveIndex,bool needRebuildForCurrent)299 void GestureEventHub::ProcessExternalExclusiveRecognizer(const Offset& offset, int32_t touchId,
300     const RefPtr<TargetComponent>& targetComponent, const RefPtr<FrameNode>& host, GesturePriority priority,
301     RefPtr<NGGestureRecognizer>& current, std::list<RefPtr<NGGestureRecognizer>>& recognizers,
302     int32_t& exclusiveIndex, bool needRebuildForCurrent)
303 {
304     auto recognizer = recognizers.front();
305     if (current) {
306         if (priority == GesturePriority::Low) {
307             recognizers.push_front(current);
308         } else {
309             recognizers.push_back(current);
310         }
311     }
312 
313     if (recognizers.size() > 1) {
314         if ((static_cast<int32_t>(externalExclusiveRecognizer_.size()) <= exclusiveIndex)) {
315             externalExclusiveRecognizer_.emplace_back(AceType::MakeRefPtr<ExclusiveRecognizer>(std::move(recognizers)));
316         } else if (needRebuildForCurrent) {
317             externalExclusiveRecognizer_.insert(externalExclusiveRecognizer_.begin(),
318                 AceType::MakeRefPtr<ExclusiveRecognizer>(std::move(recognizers)));
319             auto recognizerTouches = recognizer->GetTouchPoints();
320             for (const auto& iter : recognizerTouches) {
321                 externalExclusiveRecognizer_[exclusiveIndex]->BeginReferee(iter.first);
322             }
323         } else {
324             externalExclusiveRecognizer_[exclusiveIndex]->AddChildren(recognizers);
325         }
326         externalExclusiveRecognizer_[exclusiveIndex]->SetCoordinateOffset(offset);
327         externalExclusiveRecognizer_[exclusiveIndex]->BeginReferee(touchId);
328         externalExclusiveRecognizer_[exclusiveIndex]->AttachFrameNode(WeakPtr<FrameNode>(host));
329         externalExclusiveRecognizer_[exclusiveIndex]->SetTargetComponent(targetComponent);
330         current = externalExclusiveRecognizer_[exclusiveIndex];
331         exclusiveIndex++;
332     } else if (recognizers.size() == 1) {
333         current = *recognizers.begin();
334     }
335 }
336 
CheckLastInnerRecognizerCollected(GesturePriority priority,int32_t gestureGroupIndex)337 bool GestureEventHub::CheckLastInnerRecognizerCollected(GesturePriority priority, int32_t gestureGroupIndex)
338 {
339     auto host = GetFrameNode();
340     CHECK_NULL_RETURN(host, false);
341     std::list<RefPtr<NGGestureRecognizer>> recognizerList;
342     if (priority == GesturePriority::Parallel) {
343         if (static_cast<int32_t>(externalParallelRecognizer_.size()) <= gestureGroupIndex) {
344             return false;
345         }
346         return !IsSystemRecognizerCollected(externalParallelRecognizer_[gestureGroupIndex]) &&
347                IsDifferentFrameNodeCollected(externalParallelRecognizer_[gestureGroupIndex], host);
348     } else {
349         if (static_cast<int32_t>(externalExclusiveRecognizer_.size()) <= gestureGroupIndex) {
350             return false;
351         }
352         return !IsSystemRecognizerCollected(externalExclusiveRecognizer_[gestureGroupIndex]) &&
353                IsDifferentFrameNodeCollected(externalExclusiveRecognizer_[gestureGroupIndex], host);
354     }
355 }
356 
ProcessTouchTestHierarchy(const OffsetF & coordinateOffset,const TouchRestrict & touchRestrict,std::list<RefPtr<NGGestureRecognizer>> & innerRecognizers,TouchTestResult & finalResult,int32_t touchId,const RefPtr<TargetComponent> & targetComponent,ResponseLinkResult & responseLinkResult)357 void GestureEventHub::ProcessTouchTestHierarchy(const OffsetF& coordinateOffset, const TouchRestrict& touchRestrict,
358     std::list<RefPtr<NGGestureRecognizer>>& innerRecognizers, TouchTestResult& finalResult, int32_t touchId,
359     const RefPtr<TargetComponent>& targetComponent, ResponseLinkResult& responseLinkResult)
360 {
361     auto host = GetFrameNode();
362     if (!host) {
363         for (auto&& recognizer : innerRecognizers) {
364             finalResult.emplace_back(std::move(recognizer));
365         }
366         return;
367     }
368 
369     auto offset = Offset(coordinateOffset.GetX(), coordinateOffset.GetY());
370     RefPtr<NGGestureRecognizer> current;
371     current = PackInnerRecognizer(offset, innerRecognizers, touchId, targetComponent);
372     auto eventHub = eventHub_.Upgrade();
373     auto getEventTargetImpl = eventHub ? eventHub->CreateGetEventTargetImpl() : nullptr;
374     int32_t parallelIndex = 0;
375     int32_t exclusiveIndex = 0;
376     auto userRecognizers = gestureHierarchy_;
377     auto userModifierRecognizers = modifierGestureHierarchy_;
378     userRecognizers.splice(userRecognizers.end(), userModifierRecognizers);
379     bool overMinRecognizerGroupLoopSize = userRecognizers.size() >= MIN_RECOGNIZER_GROUP_LOOP_SIZE;
380     for (auto const& recognizer : userRecognizers) {
381         if (!recognizer) {
382             continue;
383         }
384         auto recognizerGroup = AceType::DynamicCast<RecognizerGroup>(recognizer);
385         if (recognizerGroup) {
386             recognizerGroup->SetRecognizerInfoRecursively(offset, host, targetComponent, getEventTargetImpl);
387             recognizerGroup->CollectResponseLinkRecognizersRecursively(responseLinkResult);
388         } else {
389             responseLinkResult.emplace_back(recognizer);
390         }
391 
392         recognizer->AttachFrameNode(WeakPtr<FrameNode>(host));
393         recognizer->SetTargetComponent(targetComponent);
394         recognizer->SetCoordinateOffset(offset);
395         recognizer->BeginReferee(touchId, true);
396         recognizer->SetGetEventTargetImpl(getEventTargetImpl);
397         auto gestureMask = recognizer->GetPriorityMask();
398         if (gestureMask == GestureMask::IgnoreInternal) {
399             // In ignore case, dropped the self inner recognizer and children recognizer.
400             current = recognizer;
401             continue;
402         }
403         auto priority = recognizer->GetPriority();
404         std::list<RefPtr<NGGestureRecognizer>> recognizers { 1, recognizer };
405         auto checkCurrentRecognizer = false;
406         auto parentRecognizer = recognizer->GetGestureGroup().Upgrade();
407         if (priority == GesturePriority::Parallel) {
408             checkCurrentRecognizer = overMinRecognizerGroupLoopSize && (recognizer == userRecognizers.front()) &&
409                 CheckLastInnerRecognizerCollected(priority, parallelIndex);
410             ProcessParallelPriorityGesture(
411                 offset, touchId, targetComponent, host, current, recognizers, parallelIndex, checkCurrentRecognizer);
412         } else {
413             checkCurrentRecognizer = overMinRecognizerGroupLoopSize && (recognizer == userRecognizers.front()) &&
414                 CheckLastInnerRecognizerCollected(priority, exclusiveIndex);
415             ProcessExternalExclusiveRecognizer(offset, touchId, targetComponent,
416                 host, priority, current, recognizers, exclusiveIndex, checkCurrentRecognizer);
417         }
418         auto parentGroupRecognizer = AceType::DynamicCast<RecognizerGroup>(parentRecognizer);
419         if (checkCurrentRecognizer && parentGroupRecognizer) {
420             parentGroupRecognizer->RemoveRecognizerInGroup(recognizer);
421         }
422     }
423 
424     if (current) {
425         finalResult.emplace_back(std::move(current));
426     }
427 }
428 
UpdateGestureHierarchy()429 void GestureEventHub::UpdateGestureHierarchy()
430 {
431     auto host = GetFrameNode();
432     CHECK_NULL_VOID(host);
433     bool success = gestures_.size() == gestureHierarchy_.size();
434     if (success) {
435         auto iter = gestures_.begin();
436         auto recognizerIter = gestureHierarchy_.begin();
437         for (; iter != gestures_.end(); iter++, recognizerIter++) {
438             auto newRecognizer = (*iter)->CreateRecognizer();
439             success = success && (*recognizerIter)->ReconcileFrom(newRecognizer);
440             if (!success) {
441                 break;
442             }
443         }
444     }
445     if (success) {
446         gestures_.clear();
447         return;
448     }
449 
450     gestureHierarchy_.clear();
451     for (const auto& gesture : gestures_) {
452         AddGestureToGestureHierarchy(gesture, false);
453     }
454     gestures_.clear();
455 }
456 
UpdateModifierGestureHierarchy()457 void GestureEventHub::UpdateModifierGestureHierarchy()
458 {
459     auto host = GetFrameNode();
460     CHECK_NULL_VOID(host);
461     bool success = modifierGestures_.size() == modifierGestureHierarchy_.size() && !needRecollect_;
462     if (success) {
463         auto iter = modifierGestures_.begin();
464         auto recognizerIter = modifierGestureHierarchy_.begin();
465         for (; iter != modifierGestures_.end(); iter++, recognizerIter++) {
466             auto newRecognizer = (*iter)->CreateRecognizer();
467             success = success && (*recognizerIter)->ReconcileFrom(newRecognizer);
468             if (!success) {
469                 break;
470             }
471         }
472     }
473     if (success) {
474         return;
475     }
476 
477     modifierGestureHierarchy_.clear();
478     for (const auto& gesture : modifierGestures_) {
479         AddGestureToGestureHierarchy(gesture, true);
480     }
481     needRecollect_ = false;
482 }
483 
AddGestureToGestureHierarchy(const RefPtr<NG::Gesture> & gesture,bool isModifier)484 void GestureEventHub::AddGestureToGestureHierarchy(const RefPtr<NG::Gesture>& gesture, bool isModifier)
485 {
486     if (!gesture) {
487         return;
488     }
489     auto recognizer = gesture->CreateRecognizer();
490 
491     auto clickRecognizer = AceType::DynamicCast<ClickRecognizer>(recognizer);
492     if (clickRecognizer) {
493         clickRecognizer->SetOnAccessibility(GetOnAccessibilityEventFunc());
494     }
495 
496     auto longPressRecognizer = AceType::DynamicCast<LongPressRecognizer>(recognizer);
497     if (longPressRecognizer) {
498         longPressRecognizer->SetOnAccessibility(GetOnAccessibilityEventFunc());
499         auto host = GetFrameNode();
500         CHECK_NULL_VOID(host);
501         auto pattern = host->GetPattern();
502         if (pattern && longPressRecognizer->HasAction()) {
503             longPressRecognizer->SetOnLongPressRecorder(pattern->GetLongPressEventRecorder());
504         }
505     }
506 
507     if (!recognizer) {
508         return;
509     }
510     auto priority = gesture->GetPriority();
511     auto gestureMask = gesture->GetGestureMask();
512     recognizer->SetPriority(priority);
513     recognizer->SetPriorityMask(gestureMask);
514     if (isModifier) {
515         modifierGestureHierarchy_.emplace_back(recognizer);
516         return;
517     }
518     gestureHierarchy_.emplace_back(recognizer);
519 }
520 
CombineIntoExclusiveRecognizer(const PointF & globalPoint,const PointF & localPoint,TouchTestResult & result,int32_t touchId)521 void GestureEventHub::CombineIntoExclusiveRecognizer(
522     const PointF& globalPoint, const PointF& localPoint, TouchTestResult& result, int32_t touchId)
523 {
524     TouchTestResult finalResult;
525     std::list<RefPtr<NGGestureRecognizer>> recognizers;
526     const auto coordinateOffset = globalPoint - localPoint;
527     auto offset = Offset(coordinateOffset.GetX(), coordinateOffset.GetY());
528     for (auto const& eventTarget : result) {
529         auto recognizer = AceType::DynamicCast<NGGestureRecognizer>(eventTarget);
530         if (recognizer) {
531             recognizers.push_back(std::move(recognizer));
532         } else {
533             finalResult.push_back(eventTarget);
534         }
535     }
536 
537     RefPtr<NGGestureRecognizer> current;
538     if (recognizers.size() == 1) {
539         current = *recognizers.begin();
540     } else if (recognizers.size() > 1) {
541         if (!nodeExclusiveRecognizer_) {
542             nodeExclusiveRecognizer_ = AceType::MakeRefPtr<ExclusiveRecognizer>(std::move(recognizers));
543         } else {
544             nodeExclusiveRecognizer_->AddChildren(recognizers);
545         }
546         nodeExclusiveRecognizer_->SetCoordinateOffset(offset);
547         nodeExclusiveRecognizer_->BeginReferee(touchId);
548         current = nodeExclusiveRecognizer_;
549     }
550 
551     if (current) {
552         finalResult.emplace_back(std::move(current));
553     }
554     result.swap(finalResult);
555 }
556 
SetFocusClickEvent(GestureEventFunc && clickEvent)557 void GestureEventHub::SetFocusClickEvent(GestureEventFunc&& clickEvent)
558 {
559     auto eventHub = eventHub_.Upgrade();
560     CHECK_NULL_VOID(eventHub);
561     auto focusHub = eventHub->GetOrCreateFocusHub();
562     CHECK_NULL_VOID(focusHub);
563     focusHub->SetOnClickCallback(std::move(clickEvent));
564 }
565 
566 // helper function to ensure clickActuator is initialized
CheckClickActuator()567 void GestureEventHub::CheckClickActuator()
568 {
569     if (!clickEventActuator_) {
570         clickEventActuator_ = MakeRefPtr<ClickEventActuator>(WeakClaim(this));
571         clickEventActuator_->SetOnAccessibility(GetOnAccessibilityEventFunc());
572     }
573 
574     if (parallelCombineClick && !userParallelClickEventActuator_) {
575         userParallelClickEventActuator_ = MakeRefPtr<ClickEventActuator>(WeakClaim(this));
576         userParallelClickEventActuator_->SetOnAccessibility(GetOnAccessibilityEventFunc());
577     }
578 }
579 
SetUserOnClick(GestureEventFunc && clickEvent,double distanceThreshold)580 void GestureEventHub::SetUserOnClick(GestureEventFunc&& clickEvent, double distanceThreshold)
581 {
582     auto dimensionDistanceThreshold = Dimension(
583         Dimension(distanceThreshold, DimensionUnit::PX).ConvertToVp(), DimensionUnit::VP);
584     CheckClickActuator();
585     if (parallelCombineClick) {
586         userParallelClickEventActuator_->SetUserCallback(std::move(clickEvent));
587         SetFocusClickEvent(userParallelClickEventActuator_->GetClickEvent());
588         auto clickRecognizer = userParallelClickEventActuator_->GetClickRecognizer();
589         clickRecognizer->SetDistanceThreshold(dimensionDistanceThreshold);
590         clickEventActuator_->AddDistanceThreshold(dimensionDistanceThreshold);
591     } else {
592         clickEventActuator_->SetUserCallback(std::move(clickEvent));
593         SetFocusClickEvent(clickEventActuator_->GetClickEvent());
594         auto clickRecognizer = clickEventActuator_->GetClickRecognizer();
595         clickRecognizer->SetDistanceThreshold(dimensionDistanceThreshold);
596         clickEventActuator_->AddDistanceThreshold(dimensionDistanceThreshold);
597     }
598 }
599 
SetUserOnClick(GestureEventFunc && clickEvent,Dimension distanceThreshold)600 void GestureEventHub::SetUserOnClick(GestureEventFunc&& clickEvent, Dimension distanceThreshold)
601 {
602     CheckClickActuator();
603     if (parallelCombineClick) {
604         userParallelClickEventActuator_->SetUserCallback(std::move(clickEvent));
605         SetFocusClickEvent(userParallelClickEventActuator_->GetClickEvent());
606         auto clickRecognizer = userParallelClickEventActuator_->GetClickRecognizer();
607         clickRecognizer->SetDistanceThreshold(distanceThreshold);
608         clickEventActuator_->AddDistanceThreshold(distanceThreshold);
609     } else {
610         clickEventActuator_->SetUserCallback(std::move(clickEvent));
611         SetFocusClickEvent(clickEventActuator_->GetClickEvent());
612         auto clickRecognizer = clickEventActuator_->GetClickRecognizer();
613         clickRecognizer->SetDistanceThreshold(distanceThreshold);
614         clickEventActuator_->AddDistanceThreshold(distanceThreshold);
615     }
616 }
617 
SetNodeClickDistance(double distanceThreshold)618 void GestureEventHub::SetNodeClickDistance(double distanceThreshold)
619 {
620     auto dimensionDistanceThreshold = Dimension(
621         Dimension(distanceThreshold, DimensionUnit::PX).ConvertToVp(), DimensionUnit::VP);
622     CheckClickActuator();
623     if (parallelCombineClick) {
624         auto clickRecognizer = userParallelClickEventActuator_->GetClickRecognizer();
625         clickRecognizer->SetDistanceThreshold(dimensionDistanceThreshold);
626         clickEventActuator_->AddDistanceThreshold(dimensionDistanceThreshold);
627     } else {
628         auto clickRecognizer = clickEventActuator_->GetClickRecognizer();
629         clickRecognizer->SetDistanceThreshold(dimensionDistanceThreshold);
630         clickEventActuator_->AddDistanceThreshold(dimensionDistanceThreshold);
631     }
632 }
633 
SetJSFrameNodeOnClick(GestureEventFunc && clickEvent)634 void GestureEventHub::SetJSFrameNodeOnClick(GestureEventFunc&& clickEvent)
635 {
636     CheckClickActuator();
637     if (parallelCombineClick) {
638         userParallelClickEventActuator_->SetJSFrameNodeCallback(std::move(clickEvent));
639         SetFocusClickEvent(userParallelClickEventActuator_->GetClickEvent());
640     } else {
641         clickEventActuator_->SetJSFrameNodeCallback(std::move(clickEvent));
642         SetFocusClickEvent(clickEventActuator_->GetClickEvent());
643     }
644 }
645 
SetOnGestureJudgeBegin(GestureJudgeFunc && gestureJudgeFunc)646 void GestureEventHub::SetOnGestureJudgeBegin(GestureJudgeFunc&& gestureJudgeFunc)
647 {
648     gestureJudgeFunc_ = std::move(gestureJudgeFunc);
649 }
650 
GetOnTouchTestDoneCallbackForInner() const651 TouchTestDoneCallback GestureEventHub::GetOnTouchTestDoneCallbackForInner() const
652 {
653     return touchTestDoneCallbackForInner_;
654 }
655 
SetOnTouchTestDoneCallbackForInner(TouchTestDoneCallback && touchTestDoneFunc)656 void GestureEventHub::SetOnTouchTestDoneCallbackForInner(TouchTestDoneCallback&& touchTestDoneFunc)
657 {
658     touchTestDoneCallbackForInner_ = touchTestDoneFunc;
659 }
660 
GetOnTouchTestDoneCallback() const661 TouchTestDoneCallback GestureEventHub::GetOnTouchTestDoneCallback() const
662 {
663     return touchTestDoneCallback_;
664 }
665 
SetOnTouchTestDoneCallback(TouchTestDoneCallback && touchTestDoneFunc)666 void GestureEventHub::SetOnTouchTestDoneCallback(TouchTestDoneCallback&& touchTestDoneFunc)
667 {
668     touchTestDoneCallback_ = touchTestDoneFunc;
669 }
670 
SetOnTouchIntercept(TouchInterceptFunc && touchInterceptFunc)671 void GestureEventHub::SetOnTouchIntercept(TouchInterceptFunc&& touchInterceptFunc)
672 {
673     touchInterceptFunc_ = std::move(touchInterceptFunc);
674 }
675 
CreateGetEventTargetImpl() const676 GetEventTargetImpl GestureEventHub::CreateGetEventTargetImpl() const
677 {
678     auto eventHub = eventHub_.Upgrade();
679     return eventHub ? eventHub->CreateGetEventTargetImpl() : nullptr;
680 }
681 
GetOnTouchIntercept() const682 TouchInterceptFunc GestureEventHub::GetOnTouchIntercept() const
683 {
684     return touchInterceptFunc_;
685 }
686 
SetShouldBuildinRecognizerParallelWithFunc(ShouldBuiltInRecognizerParallelWithFunc && parallelGestureToFunc)687 void GestureEventHub::SetShouldBuildinRecognizerParallelWithFunc(
688     ShouldBuiltInRecognizerParallelWithFunc&& parallelGestureToFunc)
689 {
690     shouldBuildinRecognizerParallelWithFunc_ = std::move(parallelGestureToFunc);
691 }
692 
GetParallelInnerGestureToFunc() const693 ShouldBuiltInRecognizerParallelWithFunc GestureEventHub::GetParallelInnerGestureToFunc() const
694 {
695     return shouldBuildinRecognizerParallelWithFunc_;
696 }
697 
SetOnGestureRecognizerJudgeBegin(GestureRecognizerJudgeFunc && gestureRecognizerJudgeFunc)698 void GestureEventHub::SetOnGestureRecognizerJudgeBegin(GestureRecognizerJudgeFunc&& gestureRecognizerJudgeFunc)
699 {
700     gestureRecognizerJudgeFunc_ = std::move(gestureRecognizerJudgeFunc);
701 }
702 
GetOnGestureRecognizerJudgeBegin() const703 GestureRecognizerJudgeFunc GestureEventHub::GetOnGestureRecognizerJudgeBegin() const
704 {
705     return gestureRecognizerJudgeFunc_;
706 }
707 
SetOnGestureJudgeNativeBegin(GestureJudgeFunc && gestureJudgeFunc)708 void GestureEventHub::SetOnGestureJudgeNativeBegin(GestureJudgeFunc&& gestureJudgeFunc)
709 {
710     gestureJudgeNativeFunc_ = std::move(gestureJudgeFunc);
711 }
712 
SetOnGestureJudgeNativeBeginForMenu(GestureJudgeFunc && gestureJudgeFunc)713 void GestureEventHub::SetOnGestureJudgeNativeBeginForMenu(GestureJudgeFunc&& gestureJudgeFunc)
714 {
715     gestureJudgeNativeFuncForMenu_ = std::move(gestureJudgeFunc);
716 }
717 
AddClickEvent(const RefPtr<ClickEvent> & clickEvent)718 void GestureEventHub::AddClickEvent(const RefPtr<ClickEvent>& clickEvent)
719 {
720     CheckClickActuator();
721     clickEventActuator_->AddClickEvent(clickEvent);
722 
723     SetFocusClickEvent(clickEventActuator_->GetClickEvent());
724 
725     auto uiNode = AceType::DynamicCast<UINode>(GetFrameNode());
726     CHECK_NULL_VOID(uiNode);
727     uiNode->SetBuiltInEventRegistrationState(true);
728 }
729 
AddClickAfterEvent(const RefPtr<ClickEvent> & clickEvent)730 void GestureEventHub::AddClickAfterEvent(const RefPtr<ClickEvent>& clickEvent)
731 {
732     CheckClickActuator();
733     clickEventActuator_->AddClickAfterEvent(clickEvent);
734 
735     SetFocusClickEvent(clickEventActuator_->GetClickEvent());
736 }
737 
738 // replace last showMenu callback
BindMenu(GestureEventFunc && showMenu)739 void GestureEventHub::BindMenu(GestureEventFunc&& showMenu)
740 {
741     if (showMenu_) {
742         RemoveClickEvent(showMenu_);
743     }
744     showMenu_ = MakeRefPtr<ClickEvent>(std::move(showMenu));
745     AddClickEvent(showMenu_);
746 }
747 
RegisterMenuOnTouch(TouchEventFunc && callback)748 void GestureEventHub::RegisterMenuOnTouch(TouchEventFunc&& callback)
749 {
750     if (bindMenuTouch_) {
751         RemoveTouchEvent(bindMenuTouch_);
752     }
753     bindMenuTouch_ = MakeRefPtr<TouchEventImpl>(std::move(callback));
754     AddTouchEvent(bindMenuTouch_);
755 }
756 
GetOnAccessibilityEventFunc()757 OnAccessibilityEventFunc GestureEventHub::GetOnAccessibilityEventFunc()
758 {
759     auto callback = [weak = WeakClaim(this)](AccessibilityEventType eventType) {
760         auto gestureHub = weak.Upgrade();
761         CHECK_NULL_VOID(gestureHub);
762         auto node = gestureHub->GetFrameNode();
763         CHECK_NULL_VOID(node);
764         node->OnAccessibilityEvent(eventType);
765     };
766     return callback;
767 }
768 
769 template<typename T>
AccessibilityRecursionSearchRecognizer(const RefPtr<NGGestureRecognizer> & recognizer)770 const RefPtr<T> GestureEventHub::AccessibilityRecursionSearchRecognizer(const RefPtr<NGGestureRecognizer>& recognizer)
771 {
772     auto CheckRecognizer = [](const RefPtr<NGGestureRecognizer>& recognizer) {
773         const auto re = AceType::DynamicCast<ClickRecognizer>(recognizer);
774         if (re != nullptr && re->GetFingers() == 1 && re->GetCount() == 1) {
775             return true;
776         } else if (AceType::DynamicCast<LongPressRecognizer>(recognizer) != nullptr &&
777                    AceType::DynamicCast<LongPressRecognizer>(recognizer)->GetFingers() == 1) {
778             return true;
779         }
780         return false;
781     };
782 
783     const auto re = AceType::DynamicCast<T>(recognizer);
784     if (re != nullptr && CheckRecognizer(recognizer)) {
785         return re;
786     } else if (AceType::DynamicCast<RecognizerGroup>(recognizer) != nullptr) {
787         for (const auto& recognizerElement : AceType::DynamicCast<RecognizerGroup>(recognizer)->GetGroupRecognizer()) {
788             const auto& tmpRecognizer = AccessibilityRecursionSearchRecognizer<T>(recognizerElement);
789             if (tmpRecognizer != nullptr) {
790                 return tmpRecognizer;
791             }
792         }
793     }
794     return nullptr;
795 }
796 
797 template<typename T>
GetAccessibilityRecognizer()798 const RefPtr<T> GestureEventHub::GetAccessibilityRecognizer()
799 {
800     for (const auto& recognizer : gestureHierarchy_) {
801         const auto& re = AccessibilityRecursionSearchRecognizer<T>(recognizer);
802         if (re != nullptr) {
803             return re;
804         }
805     }
806     for (const auto& recognizer : modifierGestureHierarchy_) {
807         const auto& re = AccessibilityRecursionSearchRecognizer<T>(recognizer);
808         if (re != nullptr) {
809             return re;
810         }
811     }
812     return nullptr;
813 }
814 
ActClick(std::shared_ptr<JsonValue> secComphandle)815 bool GestureEventHub::ActClick(std::shared_ptr<JsonValue> secComphandle)
816 {
817     auto host = GetFrameNode();
818     CHECK_NULL_RETURN(host, false);
819     GestureEventFunc click;
820     GestureEvent info;
821     std::chrono::microseconds microseconds(GetMicroTickCount());
822     TimeStamp time(microseconds);
823     info.SetTimeStamp(time);
824     EventTarget clickEventTarget;
825     clickEventTarget.id = host->GetInspectorId().value_or("").c_str();
826     clickEventTarget.type = host->GetTag();
827 #ifdef SECURITY_COMPONENT_ENABLE
828     info.SetSecCompHandleEvent(secComphandle);
829 #endif
830     auto geometryNode = host->GetGeometryNode();
831     CHECK_NULL_RETURN(geometryNode, false);
832     auto offset = geometryNode->GetFrameOffset();
833     auto size = geometryNode->GetFrameSize();
834     clickEventTarget.area.SetOffset(DimensionOffset(offset));
835     clickEventTarget.area.SetHeight(Dimension(size.Height()));
836     clickEventTarget.area.SetWidth(Dimension(size.Width()));
837     clickEventTarget.origin = DimensionOffset(host->GetOffsetRelativeToWindow() - offset);
838     info.SetTarget(clickEventTarget);
839     Offset globalOffset(offset.GetX(), offset.GetY());
840     info.SetGlobalLocation(globalOffset);
841     if (clickEventActuator_) {
842         click = clickEventActuator_->GetClickEvent();
843         CHECK_NULL_RETURN(click, true);
844         click(info);
845         return true;
846     }
847     const RefPtr<ClickRecognizer> clickRecognizer = GetAccessibilityRecognizer<ClickRecognizer>();
848     if (clickRecognizer) {
849         click = clickRecognizer->GetTapActionFunc();
850         click(info);
851         host->OnAccessibilityEvent(AccessibilityEventType::CLICK);
852         return true;
853     }
854     return false;
855 }
856 
ActLongClick()857 bool GestureEventHub::ActLongClick()
858 {
859     auto host = GetFrameNode();
860     CHECK_NULL_RETURN(host, false);
861     GestureEventFunc click;
862     GestureEvent info;
863     std::chrono::microseconds microseconds(GetMicroTickCount());
864     TimeStamp time(microseconds);
865     info.SetTimeStamp(time);
866     EventTarget longPressTarget;
867     longPressTarget.id = host->GetInspectorId().value_or("").c_str();
868     longPressTarget.type = host->GetTag();
869     auto geometryNode = host->GetGeometryNode();
870     CHECK_NULL_RETURN(geometryNode, false);
871     auto offset = geometryNode->GetFrameOffset();
872     auto size = geometryNode->GetFrameSize();
873     longPressTarget.area.SetOffset(DimensionOffset(offset));
874     longPressTarget.area.SetHeight(Dimension(size.Height()));
875     longPressTarget.area.SetWidth(Dimension(size.Width()));
876     longPressTarget.origin = DimensionOffset(host->GetOffsetRelativeToWindow() - offset);
877     info.SetTarget(longPressTarget);
878     Offset globalOffset(offset.GetX(), offset.GetY());
879     info.SetGlobalLocation(globalOffset);
880     if (longPressEventActuator_) {
881         click = longPressEventActuator_->GetGestureEventFunc();
882         CHECK_NULL_RETURN(click, true);
883         click(info);
884         return true;
885     }
886     RefPtr<LongPressRecognizer> longPressRecognizer;
887     for (auto gestureRecognizer : gestureHierarchy_) {
888         longPressRecognizer = AceType::DynamicCast<LongPressRecognizer>(gestureRecognizer);
889         if (longPressRecognizer && longPressRecognizer->GetFingers() == 1) {
890             click = longPressRecognizer->GetLongPressActionFunc();
891             click(info);
892             host->OnAccessibilityEvent(AccessibilityEventType::LONG_PRESS);
893             return true;
894         }
895     }
896     return false;
897 }
898 
GetHitTestModeStr(const RefPtr<GestureEventHub> & gestureEventHub)899 std::string GestureEventHub::GetHitTestModeStr(const RefPtr<GestureEventHub>& gestureEventHub)
900 {
901     if (!gestureEventHub) {
902         return HIT_TEST_MODE[0];
903     }
904     auto mode = static_cast<int32_t>(gestureEventHub->GetHitTestMode());
905     if (mode < 0 || mode >= static_cast<int32_t>(std::size(HIT_TEST_MODE))) {
906         return HIT_TEST_MODE[0];
907     }
908     return HIT_TEST_MODE[mode];
909 }
910 
KeyBoardShortCutClick(const KeyEvent & event,const WeakPtr<NG::FrameNode> & node)911 bool GestureEventHub::KeyBoardShortCutClick(const KeyEvent& event, const WeakPtr<NG::FrameNode>& node)
912 {
913     auto host = node.Upgrade();
914     CHECK_NULL_RETURN(host, false);
915     CHECK_NULL_RETURN(clickEventActuator_, false);
916     auto click = clickEventActuator_->GetClickEvent();
917     CHECK_NULL_RETURN(click, false);
918     GestureEvent info;
919     info.SetSourceDevice(event.sourceType);
920     info.SetTimeStamp(event.timeStamp);
921     EventTarget target;
922     target.id = host->GetInspectorId().value_or("").c_str();
923     target.type = host->GetTag();
924     auto geometryNode = host->GetGeometryNode();
925     CHECK_NULL_RETURN(geometryNode, false);
926     auto offset = geometryNode->GetFrameOffset();
927     auto size = geometryNode->GetFrameSize();
928     target.area.SetOffset(DimensionOffset(offset));
929     target.area.SetHeight(Dimension(size.Height()));
930     target.area.SetWidth(Dimension(size.Width()));
931     target.origin = DimensionOffset(host->GetOffsetRelativeToWindow() - offset);
932     info.SetTarget(target);
933     click(info);
934     return true;
935 }
936 
IsAccessibilityClickable()937 bool GestureEventHub::IsAccessibilityClickable()
938 {
939     return IsClickable() || GetAccessibilityRecognizer<ClickRecognizer>() != nullptr;
940 }
941 
IsAccessibilityLongClickable()942 bool GestureEventHub::IsAccessibilityLongClickable()
943 {
944     return IsLongClickable() || GetAccessibilityRecognizer<LongPressRecognizer>() != nullptr;
945 }
946 
GetMonopolizeEvents() const947 bool GestureEventHub::GetMonopolizeEvents() const
948 {
949     return monopolizeEvents_;
950 }
951 
SetMonopolizeEvents(bool monopolizeEvents)952 void GestureEventHub::SetMonopolizeEvents(bool monopolizeEvents)
953 {
954     monopolizeEvents_ = monopolizeEvents;
955 }
956 
ClearUserOnClick()957 void GestureEventHub::ClearUserOnClick()
958 {
959     if (clickEventActuator_) {
960         clickEventActuator_->ClearUserCallback();
961     }
962 }
963 
ClearUserOnTouch()964 void GestureEventHub::ClearUserOnTouch()
965 {
966     if (touchEventActuator_) {
967         touchEventActuator_->ClearUserCallback();
968     }
969 }
970 
ClearJSFrameNodeOnClick()971 void GestureEventHub::ClearJSFrameNodeOnClick()
972 {
973     if (clickEventActuator_) {
974         clickEventActuator_->ClearJSFrameNodeCallback();
975     }
976 }
977 
ClearJSFrameNodeOnTouch()978 void GestureEventHub::ClearJSFrameNodeOnTouch()
979 {
980     if (touchEventActuator_) {
981         touchEventActuator_->ClearJSFrameNodeCallback();
982     }
983 }
984 
CopyGestures(const RefPtr<GestureEventHub> & gestureEventHub)985 void GestureEventHub::CopyGestures(const RefPtr<GestureEventHub>& gestureEventHub)
986 {
987     CHECK_NULL_VOID(gestureEventHub);
988     gestures_ = gestureEventHub->backupGestures_;
989     modifierGestures_ = gestureEventHub->backupModifierGestures_;
990     recreateGesture_ = true;
991     UpdateModifierGestureHierarchy();
992 }
993 
CopyEvent(const RefPtr<GestureEventHub> & gestureEventHub)994 void GestureEventHub::CopyEvent(const RefPtr<GestureEventHub>& gestureEventHub)
995 {
996     CHECK_NULL_VOID(gestureEventHub);
997     auto originalTouchEventActuator = gestureEventHub->touchEventActuator_;
998     if (originalTouchEventActuator) {
999         touchEventActuator_ = MakeRefPtr<TouchEventActuator>();
1000         touchEventActuator_->CopyTouchEvent(originalTouchEventActuator);
1001     }
1002 
1003     auto originalClickEventActuator = gestureEventHub->clickEventActuator_;
1004     if (originalClickEventActuator) {
1005         clickEventActuator_ = MakeRefPtr<ClickEventActuator>(WeakClaim(this));
1006         clickEventActuator_->CopyClickEvent(originalClickEventActuator);
1007     }
1008 
1009     auto originalLongPressEventActuator = gestureEventHub->longPressEventActuator_;
1010     if (originalLongPressEventActuator) {
1011         longPressEventActuator_ = MakeRefPtr<LongPressEventActuator>(WeakClaim(this));
1012         longPressEventActuator_->CopyLongPressEvent(originalLongPressEventActuator);
1013     }
1014 
1015     auto originalDragEventActuator = gestureEventHub->dragEventActuator_;
1016     if (originalDragEventActuator) {
1017         dragEventActuator_ = MakeRefPtr<DragEventActuator>(WeakClaim(this), originalDragEventActuator->GetDirection(),
1018             originalDragEventActuator->GetFingers(), originalDragEventActuator->GetDistance());
1019         dragEventActuator_->CopyDragEvent(originalDragEventActuator);
1020         InitDragDropEvent();
1021     }
1022     auto originalShowMenu = gestureEventHub->showMenu_;
1023     if (originalShowMenu) {
1024         if (showMenu_) {
1025             RemoveClickEvent(showMenu_);
1026         }
1027         auto originalGetGestureEventFunc = originalShowMenu->GetGestureEventFunc();
1028         showMenu_= MakeRefPtr<ClickEvent>(std::move(originalGetGestureEventFunc));
1029         AddClickEvent(showMenu_);
1030     }
1031 }
1032 
IsTextCategoryComponent(const std::string & frameTag)1033 bool GestureEventHub::IsTextCategoryComponent(const std::string& frameTag)
1034 {
1035     return frameTag == V2::TEXTAREA_ETS_TAG || frameTag == V2::TEXT_ETS_TAG ||
1036            frameTag == V2::TEXTINPUT_ETS_TAG || frameTag == V2::SEARCH_Field_ETS_TAG ||
1037            frameTag == V2::RICH_EDITOR_ETS_TAG;
1038 }
1039 
SetResponseRegion(const std::vector<DimensionRect> & responseRegion)1040 void GestureEventHub::SetResponseRegion(const std::vector<DimensionRect>& responseRegion)
1041 {
1042     responseRegion_ = responseRegion;
1043     if (!responseRegion_.empty()) {
1044         isResponseRegion_ = true;
1045     }
1046     if (responseRegionFunc_) {
1047         responseRegionFunc_(responseRegion_);
1048     }
1049 }
1050 
RemoveLastResponseRect()1051 void GestureEventHub::RemoveLastResponseRect()
1052 {
1053     if (responseRegion_.empty()) {
1054         isResponseRegion_ = false;
1055         return;
1056     }
1057     responseRegion_.pop_back();
1058     if (responseRegion_.empty()) {
1059         isResponseRegion_ = false;
1060     }
1061 
1062     if (responseRegionFunc_) {
1063         responseRegionFunc_(responseRegion_);
1064     }
1065 }
1066 
SetOnTouchEvent(TouchEventFunc && touchEventFunc)1067 void GestureEventHub::SetOnTouchEvent(TouchEventFunc&& touchEventFunc)
1068 {
1069     if (!touchEventActuator_) {
1070         touchEventActuator_ = MakeRefPtr<TouchEventActuator>();
1071     }
1072     touchEventActuator_->SetOnTouchEvent(std::move(touchEventFunc));
1073 }
1074 
SetJSFrameNodeOnTouchEvent(TouchEventFunc && touchEventFunc)1075 void GestureEventHub::SetJSFrameNodeOnTouchEvent(TouchEventFunc&& touchEventFunc)
1076 {
1077     if (!touchEventActuator_) {
1078         touchEventActuator_ = MakeRefPtr<TouchEventActuator>();
1079     }
1080     touchEventActuator_->SetJSFrameNodeOnTouchEvent(std::move(touchEventFunc));
1081 }
1082 
RemoveGesturesByTag(const std::string & gestureTag)1083 void GestureEventHub::RemoveGesturesByTag(const std::string& gestureTag)
1084 {
1085     bool needRecollect = false;
1086     for (auto iter = modifierGestures_.begin(); iter != modifierGestures_.end();) {
1087         auto tag = (*iter)->GetTag();
1088         if (tag.has_value() && tag.value() == gestureTag) {
1089             backupModifierGestures_.remove(*iter);
1090             iter = modifierGestures_.erase(iter);
1091             needRecollect = true;
1092         } else {
1093             auto group = AceType::DynamicCast<GestureGroup>(*iter);
1094             if (group) {
1095                 group->RemoveChildrenByTag(gestureTag, needRecollect);
1096             }
1097             iter++;
1098         }
1099     }
1100     if (needRecollect) {
1101         needRecollect_ = true;
1102         UpdateModifierGestureHierarchy();
1103     }
1104 }
1105 
ClearModifierGesture()1106 void GestureEventHub::ClearModifierGesture()
1107 {
1108     modifierGestures_.clear();
1109     backupModifierGestures_.clear();
1110     UpdateModifierGestureHierarchy();
1111 }
1112 
AddGesture(const RefPtr<NG::Gesture> & gesture)1113 void GestureEventHub::AddGesture(const RefPtr<NG::Gesture>& gesture)
1114 {
1115     if (!recreateGesture_) {
1116         gestures_.clear();
1117         backupGestures_.clear();
1118     }
1119     gestures_.emplace_back(gesture);
1120     backupGestures_.emplace_back(gesture);
1121     recreateGesture_ = true;
1122 }
1123 
ClearGesture()1124 void GestureEventHub::ClearGesture()
1125 {
1126     gestures_.clear();
1127     backupGestures_.clear();
1128     recreateGesture_ = true;
1129 }
1130 
AttachGesture(const RefPtr<NG::Gesture> & gesture)1131 void GestureEventHub::AttachGesture(const RefPtr<NG::Gesture>& gesture)
1132 {
1133     modifierGestures_.emplace_back(gesture);
1134     backupModifierGestures_.emplace_back(gesture);
1135     UpdateModifierGestureHierarchy();
1136 }
1137 
RemoveGesture(const RefPtr<NG::Gesture> & gesture)1138 void GestureEventHub::RemoveGesture(const RefPtr<NG::Gesture>& gesture)
1139 {
1140     modifierGestures_.remove(gesture);
1141     backupModifierGestures_.remove(gesture);
1142     UpdateModifierGestureHierarchy();
1143 }
1144 
AddScrollableEvent(const RefPtr<ScrollableEvent> & scrollableEvent)1145 void GestureEventHub::AddScrollableEvent(const RefPtr<ScrollableEvent>& scrollableEvent)
1146 {
1147     if (!scrollableActuator_) {
1148         scrollableActuator_ = MakeRefPtr<ScrollableActuator>(WeakClaim(this));
1149     }
1150     scrollableActuator_->AddScrollableEvent(scrollableEvent);
1151 }
1152 
RemoveScrollableEvent(const RefPtr<ScrollableEvent> & scrollableEvent)1153 void GestureEventHub::RemoveScrollableEvent(const RefPtr<ScrollableEvent>& scrollableEvent)
1154 {
1155     if (!scrollableActuator_) {
1156         return;
1157     }
1158     scrollableActuator_->RemoveScrollableEvent(scrollableEvent);
1159 }
1160 
AddScrollEdgeEffect(const Axis & axis,RefPtr<ScrollEdgeEffect> & scrollEffect)1161 void GestureEventHub::AddScrollEdgeEffect(const Axis& axis, RefPtr<ScrollEdgeEffect>& scrollEffect)
1162 {
1163     if (!scrollableActuator_) {
1164         scrollableActuator_ = MakeRefPtr<ScrollableActuator>(WeakClaim(this));
1165     }
1166     scrollableActuator_->AddScrollEdgeEffect(axis, scrollEffect);
1167 }
1168 
RemoveScrollEdgeEffect(const RefPtr<ScrollEdgeEffect> & scrollEffect)1169 void GestureEventHub::RemoveScrollEdgeEffect(const RefPtr<ScrollEdgeEffect>& scrollEffect)
1170 {
1171     if (!scrollableActuator_) {
1172         return;
1173     }
1174     scrollableActuator_->RemoveScrollEdgeEffect(scrollEffect);
1175 }
1176 
1177 // Set by user define, which will replace old one.
SetTouchEvent(TouchEventFunc && touchEventFunc)1178 void GestureEventHub::SetTouchEvent(TouchEventFunc&& touchEventFunc)
1179 {
1180     if (!touchEventActuator_) {
1181         touchEventActuator_ = MakeRefPtr<TouchEventActuator>();
1182     }
1183     touchEventActuator_->ReplaceTouchEvent(std::move(touchEventFunc));
1184 }
1185 
AddTouchEvent(const RefPtr<TouchEventImpl> & touchEvent)1186 void GestureEventHub::AddTouchEvent(const RefPtr<TouchEventImpl>& touchEvent)
1187 {
1188     if (!touchEventActuator_) {
1189         touchEventActuator_ = MakeRefPtr<TouchEventActuator>();
1190     }
1191     touchEventActuator_->AddTouchEvent(touchEvent);
1192 }
1193 
AddTouchAfterEvent(const RefPtr<TouchEventImpl> & touchEvent)1194 void GestureEventHub::AddTouchAfterEvent(const RefPtr<TouchEventImpl>& touchEvent)
1195 {
1196     if (!touchEventActuator_) {
1197         touchEventActuator_ = MakeRefPtr<TouchEventActuator>();
1198     }
1199     touchEventActuator_->AddTouchAfterEvent(touchEvent);
1200 }
1201 
RemoveTouchEvent(const RefPtr<TouchEventImpl> & touchEvent)1202 void GestureEventHub::RemoveTouchEvent(const RefPtr<TouchEventImpl>& touchEvent)
1203 {
1204     if (!touchEventActuator_) {
1205         return;
1206     }
1207     touchEventActuator_->RemoveTouchEvent(touchEvent);
1208 }
1209 
IsClickable() const1210 bool GestureEventHub::IsClickable() const
1211 {
1212     return clickEventActuator_ != nullptr;
1213 }
1214 
IsComponentClickable() const1215 bool GestureEventHub::IsComponentClickable() const
1216 {
1217     return clickEventActuator_ && clickEventActuator_->IsComponentClickable();
1218 }
1219 
IsUserClickable() const1220 bool GestureEventHub::IsUserClickable() const
1221 {
1222     return clickEventActuator_ != nullptr && clickEventActuator_->IsUserClickable();
1223 }
1224 
GetOnGestureJudgeBeginCallback() const1225 GestureJudgeFunc GestureEventHub::GetOnGestureJudgeBeginCallback() const
1226 {
1227     return gestureJudgeFunc_;
1228 }
1229 
GetOnGestureJudgeNativeBeginCallback()1230 GestureJudgeFunc GestureEventHub::GetOnGestureJudgeNativeBeginCallback()
1231 {
1232     auto callback = [weakNode = WeakClaim(this)](const RefPtr<GestureInfo>& gestureInfo,
1233         const std::shared_ptr<BaseGestureEvent>& info) -> GestureJudgeResult {
1234         auto gestureHub = weakNode.Upgrade();
1235         CHECK_NULL_RETURN(gestureHub, GestureJudgeResult::CONTINUE);
1236         auto gestureJudgeNativeFunc = gestureHub->gestureJudgeNativeFunc_;
1237         if (gestureJudgeNativeFunc && gestureJudgeNativeFunc(gestureInfo, info) == GestureJudgeResult::REJECT) {
1238             return GestureJudgeResult::REJECT;
1239         }
1240         auto gestureJudgeNativeFuncForMenu = gestureHub->gestureJudgeNativeFuncForMenu_;
1241         if (gestureJudgeNativeFuncForMenu &&
1242             gestureJudgeNativeFuncForMenu(gestureInfo, info) == GestureJudgeResult::REJECT) {
1243             return GestureJudgeResult::REJECT;
1244         }
1245         return GestureJudgeResult::CONTINUE;
1246     };
1247     return callback;
1248 }
1249 
RemoveClickEvent(const RefPtr<ClickEvent> & clickEvent)1250 void GestureEventHub::RemoveClickEvent(const RefPtr<ClickEvent>& clickEvent)
1251 {
1252     if (!clickEventActuator_) {
1253         return;
1254     }
1255     clickEventActuator_->RemoveClickEvent(clickEvent);
1256 }
1257 
IsClickEventsEmpty() const1258 bool GestureEventHub::IsClickEventsEmpty() const
1259 {
1260     if (!clickEventActuator_) {
1261         return true;
1262     }
1263     return clickEventActuator_->IsClickEventsEmpty();
1264 }
1265 
GetClickEvent()1266 GestureEventFunc GestureEventHub::GetClickEvent()
1267 {
1268     if (!IsClickable()) {
1269         return nullptr;
1270     }
1271     return clickEventActuator_->GetClickEvent();
1272 }
1273 
IsLongClickable() const1274 bool GestureEventHub::IsLongClickable() const
1275 {
1276     return longPressEventActuator_ != nullptr;
1277 }
1278 
SetRedirectClick(bool redirectClick)1279 void GestureEventHub::SetRedirectClick(bool redirectClick)
1280 {
1281     redirectClick_ = redirectClick;
1282 }
1283 
SetLongPressEvent(const RefPtr<LongPressEvent> & event,bool isForDrag,bool isDisableMouseLeft,int32_t duration)1284 void GestureEventHub::SetLongPressEvent(
1285     const RefPtr<LongPressEvent>& event, bool isForDrag, bool isDisableMouseLeft, int32_t duration)
1286 {
1287     if (!longPressEventActuator_) {
1288         longPressEventActuator_ = MakeRefPtr<LongPressEventActuator>(WeakClaim(this));
1289         longPressEventActuator_->SetOnAccessibility(GetOnAccessibilityEventFunc());
1290     }
1291     longPressEventActuator_->SetLongPressEvent(event, isForDrag, isDisableMouseLeft);
1292     longPressEventActuator_->SetDuration(duration);
1293 }
1294 
1295 // Set by user define, which will replace old one.
SetPanEvent(const RefPtr<PanEvent> & panEvent,PanDirection direction,int32_t fingers,Dimension distance)1296 void GestureEventHub::SetPanEvent(
1297     const RefPtr<PanEvent>& panEvent, PanDirection direction, int32_t fingers, Dimension distance)
1298 {
1299     if (!panEventActuator_) {
1300         panEventActuator_ = MakeRefPtr<PanEventActuator>(WeakClaim(this), direction, fingers, distance.ConvertToPx());
1301     }
1302     panEventActuator_->ReplacePanEvent(panEvent);
1303 }
1304 
1305 // Set by user define, which will replace old one.
SetPanEvent(const RefPtr<PanEvent> & panEvent,PanDirection direction,int32_t fingers,PanDistanceMap distanceMap)1306 void GestureEventHub::SetPanEvent(
1307     const RefPtr<PanEvent>& panEvent, PanDirection direction, int32_t fingers, PanDistanceMap distanceMap)
1308 {
1309     if (!panEventActuator_) {
1310         panEventActuator_ = MakeRefPtr<PanEventActuator>(WeakClaim(this), direction, fingers, distanceMap);
1311     }
1312     panEventActuator_->ReplacePanEvent(panEvent);
1313 }
1314 
AddPanEvent(const RefPtr<PanEvent> & panEvent,PanDirection direction,int32_t fingers,Dimension distance)1315 void GestureEventHub::AddPanEvent(
1316     const RefPtr<PanEvent>& panEvent, PanDirection direction, int32_t fingers, Dimension distance)
1317 {
1318     if (!panEventActuator_ || direction.type != panEventActuator_->GetDirection().type) {
1319         panEventActuator_ = MakeRefPtr<PanEventActuator>(WeakClaim(this), direction, fingers, distance.ConvertToPx());
1320     }
1321     panEventActuator_->AddPanEvent(panEvent);
1322 }
1323 
AddPanEvent(const RefPtr<PanEvent> & panEvent,PanDirection direction,int32_t fingers,PanDistanceMap distanceMap)1324 void GestureEventHub::AddPanEvent(
1325     const RefPtr<PanEvent>& panEvent, PanDirection direction, int32_t fingers, PanDistanceMap distanceMap)
1326 {
1327     if (!panEventActuator_ || direction.type != panEventActuator_->GetDirection().type) {
1328         panEventActuator_ = MakeRefPtr<PanEventActuator>(WeakClaim(this), direction, fingers, distanceMap);
1329     }
1330     panEventActuator_->AddPanEvent(panEvent);
1331 }
1332 
AddPanEvent(const RefPtr<PanEvent> & panEvent,PanDirection direction,int32_t fingers,const PanDistanceMapDimension & distanceMap)1333 void GestureEventHub::AddPanEvent(const RefPtr<PanEvent>& panEvent,
1334     PanDirection direction, int32_t fingers, const PanDistanceMapDimension& distanceMap)
1335 {
1336     if (!panEventActuator_ || direction.type != panEventActuator_->GetDirection().type) {
1337         panEventActuator_ = MakeRefPtr<PanEventActuator>(WeakClaim(this), direction, fingers, distanceMap);
1338     }
1339     panEventActuator_->AddPanEvent(panEvent);
1340 }
1341 
RemovePanEvent(const RefPtr<PanEvent> & panEvent)1342 void GestureEventHub::RemovePanEvent(const RefPtr<PanEvent>& panEvent)
1343 {
1344     if (!panEventActuator_) {
1345         return;
1346     }
1347     panEventActuator_->RemovePanEvent(panEvent);
1348 }
1349 
SetPanEventType(GestureTypeName typeName)1350 void GestureEventHub::SetPanEventType(GestureTypeName typeName)
1351 {
1352     CHECK_NULL_VOID(panEventActuator_);
1353     panEventActuator_->SetPanEventType(typeName);
1354 }
1355 
SetLongPressEventType(GestureTypeName typeName)1356 void GestureEventHub::SetLongPressEventType(GestureTypeName typeName)
1357 {
1358     CHECK_NULL_VOID(longPressEventActuator_);
1359     longPressEventActuator_->SetLongPressEventType(typeName);
1360 }
1361 
GetHitTestMode() const1362 HitTestMode GestureEventHub::GetHitTestMode() const
1363 {
1364     return hitTestMode_;
1365 }
1366 
SetHitTestMode(HitTestMode hitTestMode)1367 void GestureEventHub::SetHitTestMode(HitTestMode hitTestMode)
1368 {
1369     hitTestMode_ = hitTestMode;
1370 }
1371 
GetResponseRegion() const1372 const std::vector<DimensionRect>& GestureEventHub::GetResponseRegion() const
1373 {
1374     return responseRegion_;
1375 }
1376 
GetMouseResponseRegion() const1377 const std::vector<DimensionRect>& GestureEventHub::GetMouseResponseRegion() const
1378 {
1379     return mouseResponseRegion_;
1380 }
1381 
SetResponseRegionFunc(const OnReponseRegionFunc & func)1382 void GestureEventHub::SetResponseRegionFunc(const OnReponseRegionFunc& func)
1383 {
1384     responseRegionFunc_ = func;
1385 }
1386 
SetOnTouchTestFunc(OnChildTouchTestFunc && callback)1387 void GestureEventHub::SetOnTouchTestFunc(OnChildTouchTestFunc&& callback)
1388 {
1389     onChildTouchTestFunc_ = callback;
1390 }
1391 
GetOnTouchTestFunc()1392 const OnChildTouchTestFunc& GestureEventHub::GetOnTouchTestFunc()
1393 {
1394     return onChildTouchTestFunc_;
1395 }
1396 
SetMouseResponseRegion(const std::vector<DimensionRect> & mouseResponseRegion)1397 void GestureEventHub::SetMouseResponseRegion(const std::vector<DimensionRect>& mouseResponseRegion)
1398 {
1399     mouseResponseRegion_ = mouseResponseRegion;
1400     if (!mouseResponseRegion_.empty()) {
1401         isResponseRegion_ = true;
1402     }
1403 }
1404 
AddResponseRect(const DimensionRect & responseRect)1405 void GestureEventHub::AddResponseRect(const DimensionRect& responseRect)
1406 {
1407     responseRegion_.emplace_back(responseRect);
1408     isResponseRegion_ = true;
1409 
1410     if (responseRegionFunc_) {
1411         responseRegionFunc_(responseRegion_);
1412     }
1413 }
1414 
GetTouchable() const1415 bool GestureEventHub::GetTouchable() const
1416 {
1417     return touchable_;
1418 }
1419 
SetTouchable(bool touchable)1420 void GestureEventHub::SetTouchable(bool touchable)
1421 {
1422     touchable_ = touchable;
1423 }
1424 
GetLongPressRecognizer() const1425 RefPtr<LongPressRecognizer> GestureEventHub::GetLongPressRecognizer() const
1426 {
1427     CHECK_NULL_RETURN(longPressEventActuator_, nullptr);
1428     return longPressEventActuator_->GetLongPressRecognizer();
1429 }
1430 
SetIsAllowMouse(bool isAllowMouse) const1431 void GestureEventHub::SetIsAllowMouse(bool isAllowMouse) const
1432 {
1433     CHECK_NULL_VOID(panEventActuator_);
1434     panEventActuator_->SetIsAllowMouse(isAllowMouse);
1435 }
1436 
GetUserClickEventActuator()1437 const RefPtr<ClickEventActuator>& GestureEventHub::GetUserClickEventActuator()
1438 {
1439     return userParallelClickEventActuator_;
1440 }
1441 
CleanExternalRecognizers()1442 void GestureEventHub::CleanExternalRecognizers()
1443 {
1444     externalParallelRecognizer_.clear();
1445     externalExclusiveRecognizer_.clear();
1446 }
1447 
CleanInnerRecognizer()1448 void GestureEventHub::CleanInnerRecognizer()
1449 {
1450     innerExclusiveRecognizer_ = nullptr;
1451 }
1452 
CleanNodeRecognizer()1453 void GestureEventHub::CleanNodeRecognizer()
1454 {
1455     nodeParallelRecognizer_ = nullptr;
1456     nodeExclusiveRecognizer_ = nullptr;
1457 }
1458 
WillRecreateGesture() const1459 bool GestureEventHub::WillRecreateGesture() const
1460 {
1461     return recreateGesture_;
1462 }
1463 
IsGestureEmpty() const1464 bool GestureEventHub::IsGestureEmpty() const
1465 {
1466     return gestures_.empty();
1467 }
1468 
IsPanEventEmpty() const1469 bool GestureEventHub::IsPanEventEmpty() const
1470 {
1471     if (panEventActuator_) {
1472         return panEventActuator_->IsPanEventEmpty();
1473     }
1474     return true;
1475 }
1476 
SetExcludedAxisForPanEvent(bool isExcludedAxis)1477 void GestureEventHub::SetExcludedAxisForPanEvent(bool isExcludedAxis)
1478 {
1479     CHECK_NULL_VOID(panEventActuator_);
1480     panEventActuator_->SetExcludedAxis(isExcludedAxis);
1481 }
1482 
DumpVelocityInfoFroPanEvent(int32_t fingerId)1483 void GestureEventHub::DumpVelocityInfoFroPanEvent(int32_t fingerId)
1484 {
1485     CHECK_NULL_VOID(panEventActuator_);
1486     panEventActuator_->DumpVelocityInfo(fingerId);
1487 }
1488 
GetGestureEventInfo()1489 const GestureEvent GestureEventHub::GetGestureEventInfo()
1490 {
1491     RefPtr<ClickRecognizer> clickRecognizer;
1492     if (clickEventActuator_) {
1493         clickRecognizer = clickEventActuator_->GetClickRecognizer();
1494     } else {
1495         clickRecognizer = GetAccessibilityRecognizer<ClickRecognizer>();
1496     }
1497     GestureEvent info;
1498     CHECK_NULL_RETURN(clickRecognizer, info);
1499     return clickRecognizer->GetGestureEventInfo();
1500 }
1501 
GetClickInfo()1502 const ClickInfo GestureEventHub::GetClickInfo()
1503 {
1504     RefPtr<ClickRecognizer> clickRecognizer;
1505     if (clickEventActuator_) {
1506         clickRecognizer = clickEventActuator_->GetClickRecognizer();
1507     } else {
1508         clickRecognizer = GetAccessibilityRecognizer<ClickRecognizer>();
1509     }
1510     CHECK_NULL_RETURN(clickRecognizer, ClickInfo(-1));
1511     return clickRecognizer->GetClickInfo();
1512 }
1513 
TriggerTouchEvent(const TouchEvent & point)1514 bool GestureEventHub::TriggerTouchEvent(const TouchEvent& point)
1515 {
1516     CHECK_NULL_RETURN(touchEventActuator_, false);
1517     return touchEventActuator_->HandleEvent(point);
1518 }
1519 } // namespace OHOS::Ace::NG
1520