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