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