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