1 /*
2  * Copyright (c) 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/interfaces/native/node/node_gesture_modifier.h"
17 #include <securec.h>
18 
19 #include "base/error/error_code.h"
20 #include "core/components_ng/base/ui_node.h"
21 #include "core/components_ng/gestures/long_press_gesture.h"
22 #include "core/components_ng/gestures/recognizers/gesture_recognizer.h"
23 #include "core/components_ng/gestures/recognizers/pan_recognizer.h"
24 #include "core/components_ng/pattern/gesture/gesture_model_ng.h"
25 #include "core/components_ng/gestures/pan_gesture.h"
26 #include "core/components_ng/gestures/pinch_gesture.h"
27 #include "core/components_ng/gestures/rotation_gesture.h"
28 #include "core/components_ng/gestures/swipe_gesture.h"
29 #include "core/components_ng/base/frame_node.h"
30 #include "core/components_ng/pattern/scrollable/scrollable_pattern.h"
31 #include "core/components_ng/pattern/swiper/swiper_pattern.h"
32 #include "core/interfaces/native/node/touch_event_convertor.h"
33 #include "core/components_ng/base/view_abstract.h"
34 #include "core/components_ng/base/view_abstract_model_ng.h"
35 #include "core/interfaces/arkoala/arkoala_api.h"
36 #include "interfaces/native/event/ui_input_event_impl.h"
37 #include "interfaces/native/ui_input_event.h"
38 
39 namespace OHOS::Ace::NG {
40 namespace {
41     constexpr int32_t MAX_POINTS = 10;
42 }
createPanGesture(ArkUI_Int32 fingers,ArkUI_Int32 direction,ArkUI_Float64 distance,void * userData)43 ArkUIGesture* createPanGesture(ArkUI_Int32 fingers, ArkUI_Int32 direction, ArkUI_Float64 distance, void* userData)
44 {
45     PanDirection panDirection;
46     switch (direction) {
47         case ArkUI_GESTURE_DIRECTION_ALL:
48             panDirection.type = panDirection.ALL;
49             break;
50         case ArkUI_GESTURE_DIRECTION_NONE:
51             panDirection.type = panDirection.NONE;
52             break;
53         case ArkUI_GESTURE_DIRECTION_LEFT:
54             panDirection.type = panDirection.LEFT;
55             break;
56         case ArkUI_GESTURE_DIRECTION_RIGHT:
57             panDirection.type = panDirection.RIGHT;
58             break;
59         case ArkUI_GESTURE_DIRECTION_HORIZONTAL:
60             panDirection.type = panDirection.HORIZONTAL;
61             break;
62         case ArkUI_GESTURE_DIRECTION_UP:
63             panDirection.type = panDirection.UP;
64             break;
65         case  ArkUI_GESTURE_DIRECTION_DOWN:
66             panDirection.type = panDirection.DOWN;
67             break;
68         case ArkUI_GESTURE_DIRECTION_VERTICAL:
69             panDirection.type = panDirection.VERTICAL;
70             break;
71         default:
72             panDirection.type = panDirection.NONE;
73             break;
74     }
75     auto panGestureObject = AceType::MakeRefPtr<PanGesture>(fingers, panDirection, distance);
76     panGestureObject->SetUserData(userData);
77     panGestureObject->IncRefCount();
78     return reinterpret_cast<ArkUIGesture*>(AceType::RawPtr(panGestureObject));
79 }
80 
createTapGesture(ArkUI_Int32 count,ArkUI_Int32 fingers,void * userData)81 ArkUIGesture* createTapGesture(ArkUI_Int32 count, ArkUI_Int32 fingers, void* userData)
82 {
83     auto tapGestureObject = AceType::MakeRefPtr<TapGesture>(count, fingers, std::numeric_limits<double>::infinity());
84     tapGestureObject->SetUserData(userData);
85     tapGestureObject->IncRefCount();
86     return reinterpret_cast<ArkUIGesture*>(AceType::RawPtr(tapGestureObject));
87 }
88 
createTapGestureWithDistanceThreshold(ArkUI_Int32 count,ArkUI_Int32 fingers,double distanceThreshold,void * userData)89 ArkUIGesture* createTapGestureWithDistanceThreshold(
90     ArkUI_Int32 count, ArkUI_Int32 fingers, double distanceThreshold, void* userData)
91 {
92     distanceThreshold = Dimension(distanceThreshold, DimensionUnit::VP).ConvertToPx();
93     auto tapGestureObject = AceType::MakeRefPtr<TapGesture>(count, fingers, distanceThreshold);
94     tapGestureObject->SetUserData(userData);
95     tapGestureObject->IncRefCount();
96     return reinterpret_cast<ArkUIGesture*>(AceType::RawPtr(tapGestureObject));
97 }
98 
createLongPressGesture(ArkUI_Int32 fingers,bool repeat,ArkUI_Int32 duration,void * userData)99 ArkUIGesture* createLongPressGesture(ArkUI_Int32 fingers, bool repeat, ArkUI_Int32 duration, void* userData)
100 {
101     auto longPressGestureObject = AceType::MakeRefPtr<LongPressGesture>(fingers, repeat, duration);
102     longPressGestureObject->SetUserData(userData);
103     longPressGestureObject->IncRefCount();
104     return reinterpret_cast<ArkUIGesture*>(AceType::RawPtr(longPressGestureObject));
105 }
106 
createPinchGesture(ArkUI_Int32 fingers,ArkUI_Float64 distance,void * userData)107 ArkUIGesture* createPinchGesture(ArkUI_Int32 fingers, ArkUI_Float64 distance, void* userData)
108 {
109     auto pinchGestureObject = AceType::MakeRefPtr<PinchGesture>(fingers, distance);
110     pinchGestureObject->SetUserData(userData);
111     pinchGestureObject->IncRefCount();
112     return reinterpret_cast<ArkUIGesture*>(AceType::RawPtr(pinchGestureObject));
113 }
114 
createRotationGesture(ArkUI_Int32 fingers,ArkUI_Float64 angle,void * userData)115 ArkUIGesture* createRotationGesture(ArkUI_Int32 fingers, ArkUI_Float64 angle, void* userData)
116 {
117     auto rotationGestureObject = AceType::MakeRefPtr<RotationGesture>(fingers, angle);
118     rotationGestureObject->SetUserData(userData);
119     rotationGestureObject->IncRefCount();
120     return reinterpret_cast<ArkUIGesture*>(AceType::RawPtr(rotationGestureObject));
121 }
122 
createSwipeGesture(ArkUI_Int32 fingers,ArkUI_Int32 directions,ArkUI_Float64 speed,void * userData)123 ArkUIGesture* createSwipeGesture(ArkUI_Int32 fingers, ArkUI_Int32 directions, ArkUI_Float64 speed, void* userData)
124 {
125     SwipeDirection swipeDirection{SwipeDirection::NONE};
126     if (static_cast<uint32_t>(directions) & ArkUI_GESTURE_DIRECTION_HORIZONTAL) {
127         swipeDirection.type = SwipeDirection::HORIZONTAL;
128     }
129     if (static_cast<uint32_t>(directions) & ArkUI_GESTURE_DIRECTION_VERTICAL) {
130         swipeDirection.type += SwipeDirection::VERTICAL;
131     }
132     auto swipeGestureObject = AceType::MakeRefPtr<SwipeGesture>(fingers, swipeDirection, speed);
133     swipeGestureObject->SetUserData(userData);
134     swipeGestureObject->IncRefCount();
135     return reinterpret_cast<ArkUIGesture*>(AceType::RawPtr(swipeGestureObject));
136 }
137 
createSwipeGestureByModifier(ArkUI_Int32 fingers,ArkUI_Int32 direction,ArkUI_Float64 speed)138 ArkUIGesture* createSwipeGestureByModifier(ArkUI_Int32 fingers, ArkUI_Int32 direction, ArkUI_Float64 speed)
139 {
140     SwipeDirection swipeDirection{ SwipeDirection::NONE};
141     switch (direction) {
142         case ArkUI_SWIPE_GESTURE_DIRECTION_ALL:
143             swipeDirection.type = SwipeDirection::ALL;
144             break;
145         case ArkUI_SWIPE_GESTURE_DIRECTION_NONE:
146             swipeDirection.type = SwipeDirection::NONE;
147             break;
148         case ArkUI_SWIPE_GESTURE_DIRECTION_HORIZONTAL:
149             swipeDirection.type = SwipeDirection::HORIZONTAL;
150             break;
151         case ArkUI_SWIPE_GESTURE_DIRECTION_VERTICAL:
152             swipeDirection.type = SwipeDirection::VERTICAL;
153             break;
154         default:
155             swipeDirection.type = SwipeDirection::NONE;
156             break;
157     }
158     auto swipeGestureObject = AceType::MakeRefPtr<SwipeGesture>(fingers, swipeDirection, speed);
159     swipeGestureObject->IncRefCount();
160     return reinterpret_cast<ArkUIGesture*>(AceType::RawPtr(swipeGestureObject));
161 }
162 
createGestureGroup(ArkUI_Int32 mode)163 ArkUIGesture* createGestureGroup(ArkUI_Int32 mode)
164 {
165     auto gestureMode = static_cast<GestureMode>(mode);
166     auto gestureGroupObject = AceType::MakeRefPtr<GestureGroup>(gestureMode);
167     gestureGroupObject->IncRefCount();
168     return reinterpret_cast<ArkUIGesture*>(AceType::RawPtr(gestureGroupObject));
169 }
170 
addGestureToGestureGroup(ArkUIGesture * group,ArkUIGesture * child)171 void addGestureToGestureGroup(ArkUIGesture* group, ArkUIGesture* child)
172 {
173     auto* gestureGroup = reinterpret_cast<GestureGroup*>(group);
174     auto* childGesture = reinterpret_cast<Gesture*>(child);
175     gestureGroup->AddGesture(AceType::Claim(childGesture));
176 }
177 
addGestureToGestureGroupWithRefCountDecrease(ArkUIGesture * group,ArkUIGesture * child)178 void addGestureToGestureGroupWithRefCountDecrease(ArkUIGesture* group, ArkUIGesture* child)
179 {
180     auto* gestureGroup = reinterpret_cast<GestureGroup*>(group);
181     auto* childGesture = reinterpret_cast<Gesture*>(child);
182     gestureGroup->AddGesture(AceType::Claim(childGesture));
183     // Gesture ptr ref count is not decrease, so need to decrease after attach to gestureEventHub.
184     childGesture->DecRefCount();
185 }
186 
removeGestureFromGestureGroup(ArkUIGesture * group,ArkUIGesture * child)187 void removeGestureFromGestureGroup(ArkUIGesture* group, ArkUIGesture* child)
188 {
189     auto* gestureGroup = reinterpret_cast<GestureGroup*>(group);
190     auto* childGesture = reinterpret_cast<Gesture*>(child);
191     gestureGroup->RemoveGesture(AceType::Claim(childGesture));
192 }
193 
dispose(ArkUIGesture * recognizer)194 void dispose(ArkUIGesture* recognizer)
195 {
196     Gesture* gestureRef = reinterpret_cast<Gesture*>(recognizer);
197     gestureRef->SetDisposeTag(true);
198     gestureRef->DecRefCount();
199 }
200 
ConvertTouchPointsToPoints(GestureEvent & info,std::vector<TouchPoint> & touchPointes,std::array<ArkUITouchPoint,MAX_POINTS> & points)201 void ConvertTouchPointsToPoints(GestureEvent& info, std::vector<TouchPoint>& touchPointes,
202     std::array<ArkUITouchPoint, MAX_POINTS>& points)
203 {
204     if (touchPointes.empty()) {
205         return;
206     }
207     size_t i = 0;
208     auto fingureIterator = std::begin(info.GetFingerList());
209     auto fingureEnd = std::end(info.GetFingerList());
210     for (auto& touchPoint : touchPointes) {
211         if (i >= MAX_POINTS) {
212             break;
213         }
214         points[i].id = touchPoint.id;
215         points[i].nodeX = fingureIterator == fingureEnd ? 0.0f : fingureIterator->localLocation_.GetX();
216         points[i].nodeY = fingureIterator == fingureEnd ? 0.0f : fingureIterator->localLocation_.GetY();
217         points[i].windowX = fingureIterator == fingureEnd ? 0.0f : fingureIterator->globalLocation_.GetX();
218         points[i].windowY = fingureIterator == fingureEnd ? 0.0f : fingureIterator->globalLocation_.GetY();
219         points[i].screenX = touchPoint.screenX;
220         points[i].screenY = touchPoint.screenY;
221         points[i].contactAreaWidth = touchPoint.size;
222         points[i].contactAreaHeight = touchPoint.size;
223         points[i].pressure = touchPoint.force;
224         points[i].tiltX = touchPoint.tiltX.value_or(0.0f);
225         points[i].tiltY = touchPoint.tiltY.value_or(0.0f);
226         points[i].pressedTime = touchPoint.downTime.time_since_epoch().count();
227         points[i].toolType = static_cast<int32_t>(touchPoint.sourceTool);
228         i++;
229         fingureIterator++;
230     }
231 }
232 
ConvertIMMEventToTouchEvent(GestureEvent & info,ArkUITouchEvent & touchEvent,std::array<ArkUITouchPoint,MAX_POINTS> & points)233 void ConvertIMMEventToTouchEvent(GestureEvent& info, ArkUITouchEvent& touchEvent,
234     std::array<ArkUITouchPoint, MAX_POINTS>& points)
235 {
236     CHECK_NULL_VOID(info.GetPointerEvent());
237     auto tempTouchEvent = NG::ConvertToTouchEvent(info.GetPointerEvent());
238     touchEvent.action = static_cast<int32_t>(tempTouchEvent.type);
239     touchEvent.sourceType = static_cast<int32_t>(tempTouchEvent.sourceType);
240     touchEvent.timeStamp = tempTouchEvent.time.time_since_epoch().count();
241     touchEvent.actionTouchPoint.pressure = tempTouchEvent.force;
242     ConvertTouchPointsToPoints(info, tempTouchEvent.pointers, points);
243     if (tempTouchEvent.pointers.size() > 0) {
244         touchEvent.touchPointes = &(points[0]);
245         touchEvent.actionTouchPoint.nodeX = touchEvent.touchPointes[0].nodeX;
246         touchEvent.actionTouchPoint.nodeY = touchEvent.touchPointes[0].nodeY;
247         touchEvent.actionTouchPoint.windowX = touchEvent.touchPointes[0].windowX;
248         touchEvent.actionTouchPoint.windowY = touchEvent.touchPointes[0].windowY;
249         touchEvent.actionTouchPoint.screenX = touchEvent.touchPointes[0].screenX;
250         touchEvent.actionTouchPoint.screenY = touchEvent.touchPointes[0].screenY;
251         touchEvent.actionTouchPoint.toolType = touchEvent.touchPointes[0].toolType;
252     }
253     touchEvent.touchPointSize = tempTouchEvent.pointers.size() < MAX_POINTS ?
254     tempTouchEvent.pointers.size() : MAX_POINTS;
255 }
256 
GetGestureEvent(ArkUIAPIEventGestureAsyncEvent & ret,GestureEvent & info)257 void GetGestureEvent(ArkUIAPIEventGestureAsyncEvent& ret, GestureEvent& info)
258 {
259     ret.repeat = info.GetRepeat();
260     ret.velocityX = info.GetVelocity().GetVelocityX();
261     ret.velocityY = info.GetVelocity().GetVelocityY();
262     ret.velocity = info.GetVelocity().GetVelocityValue();
263     ret.x = info.GetOffsetX();
264     ret.y = info.GetOffsetY();
265     ret.angle = info.GetAngle();
266     ret.scale = info.GetScale();
267     ret.pinchCenterX = info.GetPinchCenter().GetX();
268     ret.pinchCenterY = info.GetPinchCenter().GetY();
269     ret.speed = info.GetSpeed();
270     ret.source = static_cast<int32_t>(info.GetSourceDevice());
271     switch (info.GetInputEventType()) {
272         case InputEventType::TOUCH_SCREEN :
273             ret.inputEventType = static_cast<int32_t>(ARKUI_UIINPUTEVENT_TYPE_TOUCH);
274             break;
275         case InputEventType::MOUSE_BUTTON:
276             ret.inputEventType = static_cast<int32_t>(ARKUI_UIINPUTEVENT_TYPE_MOUSE);
277             break;
278         case InputEventType::AXIS :
279             ret.inputEventType = static_cast<int32_t>(ARKUI_UIINPUTEVENT_TYPE_AXIS);
280             break;
281         default:
282             break;
283     }
284 }
285 
GetBaseGestureEvent(ArkUIAPIEventGestureAsyncEvent * ret,ArkUITouchEvent & rawInputEvent,const std::shared_ptr<BaseGestureEvent> & info)286 void GetBaseGestureEvent(ArkUIAPIEventGestureAsyncEvent* ret, ArkUITouchEvent& rawInputEvent,
287     const std::shared_ptr<BaseGestureEvent>& info)
288 {
289     rawInputEvent.sourceType = static_cast<ArkUI_Int32>(info->GetSourceDevice());
290     rawInputEvent.timeStamp = info->GetTimeStamp().time_since_epoch().count();
291     rawInputEvent.actionTouchPoint.tiltX = info->GetTiltX().value_or(0.0f);
292     rawInputEvent.actionTouchPoint.tiltY = info->GetTiltY().value_or(0.0f);
293     rawInputEvent.actionTouchPoint.toolType = static_cast<ArkUI_Int32>(info->GetSourceTool());
294     rawInputEvent.actionTouchPoint.pressure = info->GetForce();
295     std::array<ArkUITouchPoint, MAX_POINTS> points;
296     auto fingerList = info->GetFingerList();
297     auto fingureIterator = std::begin(fingerList);
298     for (size_t i = 0; i < fingerList.size(); i++) {
299         points[i].id = fingureIterator->fingerId_;
300         points[i].windowX = fingureIterator->globalLocation_.GetX();
301         points[i].windowY = fingureIterator->globalLocation_.GetY();
302         points[i].nodeX = fingureIterator->localLocation_.GetX();
303         points[i].nodeY = fingureIterator->localLocation_.GetY();
304         points[i].tiltX = rawInputEvent.actionTouchPoint.tiltX;
305         points[i].tiltY = rawInputEvent.actionTouchPoint.tiltY;
306         fingureIterator++;
307     }
308     rawInputEvent.touchPointes = &(points[0]);
309     rawInputEvent.touchPointSize = fingerList.size();
310     ret->rawPointerEvent = &rawInputEvent;
311 }
312 
GetUniqueGestureEvent(ArkUIAPIEventGestureAsyncEvent * ret,GestureTypeName typeName,const std::shared_ptr<BaseGestureEvent> & info)313 void GetUniqueGestureEvent(ArkUIAPIEventGestureAsyncEvent* ret, GestureTypeName typeName,
314     const std::shared_ptr<BaseGestureEvent>& info)
315 {
316     switch (typeName) {
317         case OHOS::Ace::GestureTypeName::LONG_PRESS_GESTURE: {
318             auto longPressGestureEvent = TypeInfoHelper::DynamicCast<LongPressGestureEvent>(info.get());
319             if (longPressGestureEvent) {
320                 ret->repeat = longPressGestureEvent->GetRepeat();
321             }
322             break;
323         }
324         case OHOS::Ace::GestureTypeName::PAN_GESTURE: {
325             auto panGestureEvent = TypeInfoHelper::DynamicCast<PanGestureEvent>(info.get());
326             if (panGestureEvent) {
327                 ret->x = panGestureEvent->GetOffsetX();
328                 ret->y = panGestureEvent->GetOffsetY();
329                 ret->velocityX = panGestureEvent->GetVelocity().GetVelocityX();
330                 ret->velocityY = panGestureEvent->GetVelocity().GetVelocityY();
331                 ret->velocity = panGestureEvent->GetVelocity().GetVelocityValue();
332             }
333             break;
334         }
335         case OHOS::Ace::GestureTypeName::PINCH_GESTURE: {
336             auto pinchGestureEvent = TypeInfoHelper::DynamicCast<PinchGestureEvent>(info.get());
337             if (pinchGestureEvent) {
338                 ret->scale = pinchGestureEvent->GetScale();
339                 ret->pinchCenterX = pinchGestureEvent->GetPinchCenter().GetX();
340                 ret->pinchCenterY = pinchGestureEvent->GetPinchCenter().GetY();
341             }
342             break;
343         }
344         case OHOS::Ace::GestureTypeName::ROTATION_GESTURE: {
345             auto rotationGestureEvent = TypeInfoHelper::DynamicCast<RotationGestureEvent>(info.get());
346             if (rotationGestureEvent) {
347                 ret->angle = rotationGestureEvent->GetAngle();
348             }
349             break;
350         }
351         case OHOS::Ace::GestureTypeName::SWIPE_GESTURE: {
352             auto swipeGestureEvent = TypeInfoHelper::DynamicCast<SwipeGestureEvent>(info.get());
353             if (swipeGestureEvent) {
354                 ret->angle = swipeGestureEvent->GetAngle();
355                 ret->speed = swipeGestureEvent->GetSpeed();
356             }
357             break;
358         }
359         default:
360             break;
361     }
362 }
363 
setCancelActionFunc(Gesture * gestureRef,void * extraParam)364 void setCancelActionFunc(Gesture* gestureRef, void* extraParam)
365 {
366     auto onActionCancel = [extraParam]() {
367         ArkUINodeEvent eventData;
368         eventData.kind = GESTURE_ASYNC_EVENT;
369         eventData.nodeId = 0;
370         eventData.extraParam = reinterpret_cast<ArkUI_Int64>(extraParam);
371         eventData.gestureAsyncEvent.subKind = ON_ACTION_CANCEL;
372         SendArkUIAsyncEvent(&eventData);
373     };
374     gestureRef->SetOnActionCancelId(onActionCancel);
375 }
376 
ConvertIMMEventToMouseEvent(GestureEvent & info,ArkUIMouseEvent & mouseEvent)377 void ConvertIMMEventToMouseEvent(GestureEvent& info, ArkUIMouseEvent& mouseEvent)
378 {
379     CHECK_NULL_VOID(info.GetPointerEvent());
380     MouseEvent tempMouseEvent;
381     NG::ConvertToMouseEvent(tempMouseEvent, info.GetPointerEvent());
382     auto fingureBegin = std::begin(info.GetFingerList());
383     auto fingureEnd = std::end(info.GetFingerList());
384     mouseEvent.action = static_cast<int32_t>(tempMouseEvent.action);
385     mouseEvent.sourceType = static_cast<int32_t>(tempMouseEvent.sourceType);
386     mouseEvent.timeStamp = tempMouseEvent.time.time_since_epoch().count();
387     mouseEvent.actionTouchPoint.pressure = 0.0f;
388     mouseEvent.actionTouchPoint.nodeX = fingureBegin == fingureEnd ? 0.0f : fingureBegin->localLocation_.GetX();
389     mouseEvent.actionTouchPoint.nodeY = fingureBegin == fingureEnd ? 0.0f : fingureBegin->localLocation_.GetY();
390     mouseEvent.actionTouchPoint.windowX = fingureBegin == fingureEnd ? 0.0f : fingureBegin->globalLocation_.GetX();
391     mouseEvent.actionTouchPoint.windowY = fingureBegin == fingureEnd ? 0.0f : fingureBegin->globalLocation_.GetY();
392     mouseEvent.actionTouchPoint.screenX = tempMouseEvent.screenX;
393     mouseEvent.actionTouchPoint.screenY = tempMouseEvent.screenY;
394     mouseEvent.actionTouchPoint.toolType = static_cast<int32_t>(tempMouseEvent.sourceTool);
395 }
396 
ConvertIMMEventToAxisEvent(GestureEvent & info,ArkUIAxisEvent & axisEvent)397 void ConvertIMMEventToAxisEvent(GestureEvent& info, ArkUIAxisEvent& axisEvent)
398 {
399     CHECK_NULL_VOID(info.GetPointerEvent());
400     AxisEvent tempAxisEvent;
401     NG::ConvertToAxisEvent(tempAxisEvent, info.GetPointerEvent());
402     auto fingureBegin = std::begin(info.GetFingerList());
403     auto fingureEnd = std::end(info.GetFingerList());
404     axisEvent.action = static_cast<int32_t>(tempAxisEvent.action);
405     axisEvent.sourceType = static_cast<int32_t>(tempAxisEvent.sourceType);
406     axisEvent.timeStamp = tempAxisEvent.time.time_since_epoch().count();
407     axisEvent.horizontalAxis = tempAxisEvent.horizontalAxis;
408     axisEvent.verticalAxis = tempAxisEvent.verticalAxis;
409     axisEvent.pinchAxisScale = tempAxisEvent.pinchAxisScale;
410     axisEvent.actionTouchPoint.nodeX = fingureBegin == fingureEnd ? 0.0f : fingureBegin->localLocation_.GetX();
411     axisEvent.actionTouchPoint.nodeY = fingureBegin == fingureEnd ? 0.0f : fingureBegin->localLocation_.GetY();
412     axisEvent.actionTouchPoint.windowX = fingureBegin == fingureEnd ? 0.0f : fingureBegin->globalLocation_.GetX();
413     axisEvent.actionTouchPoint.windowY = fingureBegin == fingureEnd ? 0.0f : fingureBegin->globalLocation_.GetY();
414     axisEvent.actionTouchPoint.screenX = fingureBegin == fingureEnd ? 0.0f : fingureBegin->screenLocation_.GetX();
415     axisEvent.actionTouchPoint.screenY = fingureBegin == fingureEnd ? 0.0f : fingureBegin->screenLocation_.GetY();
416     axisEvent.actionTouchPoint.toolType = static_cast<int32_t>(tempAxisEvent.sourceTool);
417 }
418 
SendGestureEvent(GestureEvent & info,int32_t eventKind,void * extraParam)419 void SendGestureEvent(GestureEvent& info, int32_t eventKind, void* extraParam)
420 {
421     ArkUINodeEvent eventData;
422     eventData.kind = GESTURE_ASYNC_EVENT;
423     eventData.nodeId = 0;
424     eventData.extraParam = reinterpret_cast<ArkUI_Int64>(extraParam);
425     eventData.gestureAsyncEvent.subKind = eventKind;
426     GetGestureEvent(eventData.gestureAsyncEvent, info);
427     if (info.GetInputEventType() == InputEventType::AXIS) {
428         ArkUIAxisEvent rawInputEvent;
429         ConvertIMMEventToAxisEvent(info, rawInputEvent);
430         eventData.gestureAsyncEvent.rawPointerEvent = &rawInputEvent;
431         SendArkUIAsyncEvent(&eventData);
432         return;
433     }
434     if (info.GetInputEventType() == InputEventType::MOUSE_BUTTON) {
435         ArkUIMouseEvent rawInputEvent;
436         ConvertIMMEventToMouseEvent(info, rawInputEvent);
437         eventData.gestureAsyncEvent.rawPointerEvent = &rawInputEvent;
438         SendArkUIAsyncEvent(&eventData);
439         return;
440     }
441     ArkUITouchEvent rawInputEvent;
442     std::array<ArkUITouchPoint, MAX_POINTS> points;
443     ConvertIMMEventToTouchEvent(info, rawInputEvent, points);
444     eventData.gestureAsyncEvent.rawPointerEvent = &rawInputEvent;
445     SendArkUIAsyncEvent(&eventData);
446 }
447 
registerGestureEvent(ArkUIGesture * gesture,ArkUI_Uint32 actionTypeMask,void * extraParam)448 void registerGestureEvent(ArkUIGesture* gesture, ArkUI_Uint32 actionTypeMask, void* extraParam)
449 {
450     Gesture* gestureRef = reinterpret_cast<Gesture*>(gesture);
451     if (actionTypeMask & ARKUI_GESTURE_EVENT_ACTION_ACCEPT) {
452         auto onActionAccept = [extraParam](GestureEvent& info) {
453             SendGestureEvent(info, static_cast<int32_t>(ON_ACTION_START), extraParam);
454         };
455         gestureRef->SetOnActionId(onActionAccept);
456         gestureRef->SetOnActionStartId(onActionAccept);
457     }
458     if (actionTypeMask & ARKUI_GESTURE_EVENT_ACTION_UPDATE) {
459         auto onActionUpdate = [extraParam](GestureEvent& info) {
460             SendGestureEvent(info, static_cast<int32_t>(ON_ACTION_UPDATE), extraParam);
461         };
462         gestureRef->SetOnActionUpdateId(onActionUpdate);
463     }
464     if (actionTypeMask & ARKUI_GESTURE_EVENT_ACTION_END) {
465         auto onActionEnd = [extraParam](GestureEvent& info) {
466             SendGestureEvent(info, static_cast<int32_t>(ON_ACTION_END), extraParam);
467         };
468         gestureRef->SetOnActionEndId(onActionEnd);
469     }
470     if (actionTypeMask & ARKUI_GESTURE_EVENT_ACTION_CANCEL) {
471         setCancelActionFunc(gestureRef, extraParam);
472     }
473 }
474 
addGestureToNode(ArkUINodeHandle node,ArkUIGesture * gesture,ArkUI_Int32 priorityNum,ArkUI_Int32 mask)475 void addGestureToNode(ArkUINodeHandle node, ArkUIGesture* gesture, ArkUI_Int32 priorityNum, ArkUI_Int32 mask)
476 {
477     auto* frameNode = reinterpret_cast<FrameNode*>(node);
478     auto gestureHub = frameNode->GetOrCreateGestureEventHub();
479     auto gesturePtr = Referenced::Claim(reinterpret_cast<Gesture*>(gesture));
480 
481     GesturePriority priority = GesturePriority::Low;
482     if (priorityNum > static_cast<int32_t>(GesturePriority::Begin) &&
483             priorityNum < static_cast<int32_t>(GesturePriority::End)) {
484         priority = static_cast<GesturePriority>(priorityNum);
485     }
486     gesturePtr->SetPriority(priority);
487 
488     GestureMask gestureMask = GestureMask::Normal;
489     if (mask > static_cast<int32_t>(GestureMask::Begin) &&
490         mask < static_cast<int32_t>(GestureMask::End)) {
491         gestureMask = static_cast<GestureMask>(mask);
492     }
493     gesturePtr->SetGestureMask(gestureMask);
494     gestureHub->AttachGesture(gesturePtr);
495 }
496 
addGestureToNodeWithRefCountDecrease(ArkUINodeHandle node,ArkUIGesture * gesture,ArkUI_Int32 priorityNum,ArkUI_Int32 mask)497 void addGestureToNodeWithRefCountDecrease(
498     ArkUINodeHandle node, ArkUIGesture* gesture, ArkUI_Int32 priorityNum, ArkUI_Int32 mask)
499 {
500     auto* frameNode = reinterpret_cast<FrameNode*>(node);
501     CHECK_NULL_VOID(frameNode);
502     auto gestureHub = frameNode->GetOrCreateGestureEventHub();
503     auto gesturePtr = Referenced::Claim(reinterpret_cast<Gesture*>(gesture));
504 
505     GesturePriority priority = GesturePriority::Low;
506     if (priorityNum > static_cast<int32_t>(GesturePriority::Begin) &&
507             priorityNum < static_cast<int32_t>(GesturePriority::End)) {
508         priority = static_cast<GesturePriority>(priorityNum);
509     }
510     gesturePtr->SetPriority(priority);
511 
512     GestureMask gestureMask = GestureMask::Normal;
513     if (mask > static_cast<int32_t>(GestureMask::Begin) &&
514         mask < static_cast<int32_t>(GestureMask::End)) {
515         gestureMask = static_cast<GestureMask>(mask);
516     }
517     gesturePtr->SetGestureMask(gestureMask);
518     gestureHub->AttachGesture(gesturePtr);
519     // Gesture ptr ref count is not decrease, so need to decrease after attach to gestureEventHub.
520     gesturePtr->DecRefCount();
521 }
522 
removeGestureFromNode(ArkUINodeHandle node,ArkUIGesture * gesture)523 void removeGestureFromNode(ArkUINodeHandle node, ArkUIGesture* gesture)
524 {
525     auto* frameNode = reinterpret_cast<FrameNode*>(node);
526     auto gestureHub = frameNode->GetOrCreateGestureEventHub();
527     auto gesturePtr = Referenced::Claim(reinterpret_cast<Gesture*>(gesture));
528     gestureHub->RemoveGesture(gesturePtr);
529 }
530 
removeGestureFromNodeByTag(ArkUINodeHandle node,ArkUI_CharPtr gestureTag)531 void removeGestureFromNodeByTag(ArkUINodeHandle node, ArkUI_CharPtr gestureTag)
532 {
533     auto* frameNode = reinterpret_cast<FrameNode*>(node);
534     auto gestureHub = frameNode->GetOrCreateGestureEventHub();
535     std::string tag(gestureTag);
536     gestureHub->RemoveGesturesByTag(tag);
537 }
538 
clearGestures(ArkUINodeHandle node)539 void clearGestures(ArkUINodeHandle node)
540 {
541     auto* frameNode = reinterpret_cast<FrameNode*>(node);
542     auto gestureHub = frameNode->GetOrCreateGestureEventHub();
543     gestureHub->ClearModifierGesture();
544 }
545 
setGestureInterrupterToNode(ArkUINodeHandle node,ArkUI_Int32 (* interrupter)(ArkUIGestureInterruptInfo * interrupterInfo))546 void setGestureInterrupterToNode(
547     ArkUINodeHandle node, ArkUI_Int32 (*interrupter)(ArkUIGestureInterruptInfo* interrupterInfo))
548 {
549     auto* frameNode = reinterpret_cast<FrameNode*>(node);
550     auto onGestureRecognizerJudgeBegin = [frameNode, interrupter](const std::shared_ptr<BaseGestureEvent>& info,
551                                    const RefPtr<NG::NGGestureRecognizer>& current,
552                                    const std::list<RefPtr<NG::NGGestureRecognizer>>& others) -> GestureJudgeResult {
553         ArkUIAPIEventGestureAsyncEvent gestureEvent;
554         ArkUITouchEvent rawInputEvent;
555         GetBaseGestureEvent(&gestureEvent, rawInputEvent, info);
556         auto gestureInfo = current->GetGestureInfo();
557         CHECK_NULL_RETURN(gestureInfo, GestureJudgeResult::CONTINUE);
558         GetUniqueGestureEvent(&gestureEvent, gestureInfo->GetRecognizerType(), info);
559         ArkUIGestureInterruptInfo interruptInfo;
560         interruptInfo.isSystemGesture = gestureInfo->IsSystemGesture();
561         interruptInfo.systemRecognizerType = static_cast<ArkUI_Int32>(gestureInfo->GetType());
562         interruptInfo.event = &gestureEvent;
563         interruptInfo.userData = gestureInfo->GetUserData();
564         ArkUIGestureRecognizer* currentArkUIGestureRecognizer = NodeModifier::CreateGestureRecognizer(current);
565         interruptInfo.userData = reinterpret_cast<void*>(currentArkUIGestureRecognizer);
566         auto count = static_cast<int32_t>(others.size());
567         ArkUIGestureRecognizer** othersRecognizer = nullptr;
568         if (count > 0) {
569             othersRecognizer = new ArkUIGestureRecognizer* [count];
570         }
571         int32_t index = 0;
572         for (const auto& item : others) {
573             othersRecognizer[index] = NodeModifier::CreateGestureRecognizer(item);
574             index++;
575         }
576         interruptInfo.responseLinkRecognizer = othersRecognizer;
577         interruptInfo.count = count;
578         ArkUI_UIInputEvent inputEvent { ARKUI_UIINPUTEVENT_TYPE_TOUCH, C_TOUCH_EVENT_ID,
579             &rawInputEvent };
580         ArkUIGestureEvent arkUIGestureEvent { gestureEvent, nullptr };
581         interruptInfo.inputEvent = &inputEvent;
582         interruptInfo.gestureEvent = &arkUIGestureEvent;
583         auto result = interrupter(&interruptInfo);
584         delete[] othersRecognizer;
585         return static_cast<GestureJudgeResult>(result);
586     };
587     ViewAbstract::SetOnGestureRecognizerJudgeBegin(frameNode, std::move(onGestureRecognizerJudgeBegin));
588 }
589 
setInnerGestureParallelTo(ArkUINodeHandle node,void * userData,ArkUIGestureRecognizer * (* parallelInnerGesture)(ArkUIParallelInnerGestureEvent * event))590 ArkUI_Int32 setInnerGestureParallelTo(ArkUINodeHandle node, void* userData,
591     ArkUIGestureRecognizer* (*parallelInnerGesture)(ArkUIParallelInnerGestureEvent* event))
592 {
593     auto* frameNode = reinterpret_cast<FrameNode*>(node);
594     auto parallelInnerGestureTo =
595         [userData, parallelInnerGesture](const RefPtr<NGGestureRecognizer>& current,
596             const std::vector<RefPtr<NGGestureRecognizer>>& others) -> RefPtr<NGGestureRecognizer> {
597         auto* currentArkUIGestureRecognizer = NodeModifier::CreateGestureRecognizer(current);
598         auto count = static_cast<int32_t>(others.size());
599         ArkUIGestureRecognizer** othersArkUIGestureRecognizer = nullptr;
600         if (count > 0) {
601             othersArkUIGestureRecognizer = new ArkUIGestureRecognizer* [count];
602         }
603         for (auto index = 0; index < count; index++) {
604             othersArkUIGestureRecognizer[index] = NodeModifier::CreateGestureRecognizer(others[index]);
605         }
606         ArkUIParallelInnerGestureEvent parallelInnerGestureEvent;
607         parallelInnerGestureEvent.current = currentArkUIGestureRecognizer;
608         parallelInnerGestureEvent.responseLinkRecognizer = othersArkUIGestureRecognizer;
609         parallelInnerGestureEvent.userData = userData;
610         parallelInnerGestureEvent.count = count;
611         auto* result = parallelInnerGesture(&parallelInnerGestureEvent);
612         if (!result || !result->recognizer) {
613             return nullptr;
614         }
615         delete[] othersArkUIGestureRecognizer;
616         return AceType::Claim(reinterpret_cast<NG::NGGestureRecognizer*>(result->recognizer));
617     };
618     ViewAbstract::SetShouldBuiltInRecognizerParallelWith(frameNode, std::move(parallelInnerGestureTo));
619     return ERROR_CODE_NO_ERROR;
620 }
621 
setGestureRecognizerEnabled(ArkUIGestureRecognizer * recognizer,bool enabled)622 ArkUI_Int32 setGestureRecognizerEnabled(ArkUIGestureRecognizer* recognizer, bool enabled)
623 {
624     auto* gestureRecognizer = reinterpret_cast<NG::NGGestureRecognizer*>(recognizer->recognizer);
625     CHECK_NULL_RETURN(gestureRecognizer, ERROR_CODE_PARAM_INVALID);
626     gestureRecognizer->SetEnabled(enabled);
627     return ERROR_CODE_NO_ERROR;
628 }
629 
getGestureRecognizerEnabled(ArkUIGestureRecognizer * recognizer)630 ArkUI_Bool getGestureRecognizerEnabled(ArkUIGestureRecognizer* recognizer)
631 {
632     auto* rawRecognizer = reinterpret_cast<NG::NGGestureRecognizer*>(recognizer->recognizer);
633     CHECK_NULL_RETURN(rawRecognizer, false);
634     auto gestureRecognizer = AceType::Claim(rawRecognizer);
635     return gestureRecognizer->IsEnabled();
636 }
637 
getGestureRecognizerState(ArkUIGestureRecognizer * recognizer,ArkUIGestureRecognizerState * state)638 ArkUI_Int32 getGestureRecognizerState(ArkUIGestureRecognizer* recognizer, ArkUIGestureRecognizerState* state)
639 {
640     auto* rawRecognizer = reinterpret_cast<NG::NGGestureRecognizer*>(recognizer->recognizer);
641     CHECK_NULL_RETURN(rawRecognizer, ERROR_CODE_PARAM_INVALID);
642     auto gestureRecognizer = AceType::Claim(rawRecognizer);
643     switch (gestureRecognizer->GetRefereeState()) {
644         case NG::RefereeState::READY:
645             *state = ArkUIGestureRecognizerState::RECOGNIZER_STATE_READY;
646             return ERROR_CODE_NO_ERROR;
647         case NG::RefereeState::DETECTING:
648             *state = ArkUIGestureRecognizerState::RECOGNIZER_STATE_DETECTING;
649             return ERROR_CODE_NO_ERROR;
650         case NG::RefereeState::PENDING:
651             *state = ArkUIGestureRecognizerState::RECOGNIZER_STATE_PENDING;
652             return ERROR_CODE_NO_ERROR;
653         case NG::RefereeState::PENDING_BLOCKED:
654         case NG::RefereeState::SUCCEED_BLOCKED:
655             *state = ArkUIGestureRecognizerState::RECOGNIZER_STATE_BLOCKED;
656             return ERROR_CODE_NO_ERROR;
657         case NG::RefereeState::SUCCEED:
658             *state = ArkUIGestureRecognizerState::RECOGNIZER_STATE_SUCCESSFUL;
659             return ERROR_CODE_NO_ERROR;
660         case NG::RefereeState::FAIL:
661             *state = ArkUIGestureRecognizerState::RECOGNIZER_STATE_FAILED;
662             return ERROR_CODE_NO_ERROR;
663         default:
664             *state = ArkUIGestureRecognizerState::RECOGNIZER_STATE_READY;
665             return ERROR_CODE_PARAM_INVALID;
666     }
667 }
668 
gestureEventTargetInfoIsScrollBegin(ArkUIGestureEventTargetInfo * info,bool * ret)669 ArkUI_Int32 gestureEventTargetInfoIsScrollBegin(ArkUIGestureEventTargetInfo* info, bool* ret)
670 {
671     auto frameNode = AceType::Claim(reinterpret_cast<NG::FrameNode*>(info->uiNode));
672     CHECK_NULL_RETURN(frameNode, ERROR_CODE_PARAM_INVALID);
673     auto scrollablePattern = frameNode->GetPattern<NG::ScrollablePattern>();
674     if (scrollablePattern) {
675         *ret = scrollablePattern->IsAtTop();
676         return ERROR_CODE_NO_ERROR;
677     }
678     auto swiperPattern = frameNode->GetPattern<NG::SwiperPattern>();
679     if (swiperPattern) {
680         *ret = swiperPattern->IsAtStart();
681         return ERROR_CODE_NO_ERROR;
682     }
683     return ERROR_CODE_NON_SCROLLABLE_CONTAINER;
684 }
685 
gestureEventTargetInfoIsScrollEnd(ArkUIGestureEventTargetInfo * info,bool * ret)686 ArkUI_Int32 gestureEventTargetInfoIsScrollEnd(ArkUIGestureEventTargetInfo* info, bool* ret)
687 {
688     auto frameNode = AceType::Claim(reinterpret_cast<NG::FrameNode*>(info->uiNode));
689     CHECK_NULL_RETURN(frameNode, ERROR_CODE_PARAM_INVALID);
690     auto scrollablePattern = frameNode->GetPattern<NG::ScrollablePattern>();
691     if (scrollablePattern) {
692         *ret = scrollablePattern->IsAtBottom();
693         return ERROR_CODE_NO_ERROR;
694     }
695     auto swiperPattern = frameNode->GetPattern<NG::SwiperPattern>();
696     if (swiperPattern) {
697         *ret = swiperPattern->IsAtEnd();
698         return ERROR_CODE_NO_ERROR;
699     }
700     return ERROR_CODE_NON_SCROLLABLE_CONTAINER;
701 }
702 
getPanGestureDirectionMask(ArkUIGestureRecognizer * recognizer,ArkUIGestureDirection * direction)703 ArkUI_Int32 getPanGestureDirectionMask(ArkUIGestureRecognizer* recognizer, ArkUIGestureDirection* direction)
704 {
705     auto* rawRecognizer = reinterpret_cast<NG::NGGestureRecognizer*>(recognizer->recognizer);
706     CHECK_NULL_RETURN(rawRecognizer, ERROR_CODE_PARAM_INVALID);
707     auto gestureRecognizer = AceType::Claim(rawRecognizer);
708     auto panRecognizer = AceType::DynamicCast<PanRecognizer>(gestureRecognizer);
709     CHECK_NULL_RETURN(panRecognizer, ERROR_CODE_PARAM_INVALID);
710     *direction = static_cast<ArkUIGestureDirection>(panRecognizer->GetDirection().type);
711     return ERROR_CODE_NO_ERROR;
712 }
713 
isBuiltInGesture(ArkUIGestureRecognizer * recognizer)714 ArkUI_Bool isBuiltInGesture(ArkUIGestureRecognizer* recognizer)
715 {
716     auto* rawRecognizer = reinterpret_cast<NG::NGGestureRecognizer*>(recognizer->recognizer);
717     CHECK_NULL_RETURN(rawRecognizer, false);
718     auto gestureRecognizer = AceType::Claim(rawRecognizer);
719     return gestureRecognizer->IsSystemGesture();
720 }
721 
getGestureTag(ArkUIGestureRecognizer * recognizer,char * buffer,ArkUI_Int32 bufferSize,ArkUI_Int32 * result)722 ArkUI_Int32 getGestureTag(ArkUIGestureRecognizer* recognizer, char* buffer, ArkUI_Int32 bufferSize, ArkUI_Int32* result)
723 {
724     auto* rawRecognizer = reinterpret_cast<NG::NGGestureRecognizer*>(recognizer->recognizer);
725     CHECK_NULL_RETURN(rawRecognizer, ERROR_CODE_PARAM_INVALID);
726     auto gestureRecognizer = AceType::Claim(rawRecognizer);
727     auto gestureInfo = gestureRecognizer->GetGestureInfo();
728     CHECK_NULL_RETURN(gestureInfo, ERROR_CODE_PARAM_INVALID);
729     auto gestureTag = gestureInfo->GetTag();
730     CHECK_NULL_RETURN(gestureTag.has_value(), ERROR_CODE_PARAM_INVALID);
731     auto actualSize = static_cast<int32_t>(gestureTag.value().size());
732     *result = actualSize;
733     if (actualSize > bufferSize - 1) {
734         return ERROR_CODE_BUFFER_SIZE_NOT_ENOUGH;
735     }
736     auto count = snprintf_s(buffer, bufferSize, bufferSize - 1, "%s", gestureTag.value().c_str());
737     if (count < 0) {
738         return ERROR_CODE_PARAM_INVALID;
739     }
740     return ERROR_CODE_NO_ERROR;
741 }
742 
getGestureBindNodeId(ArkUIGestureRecognizer * recognizer,char * nodeId,ArkUI_Int32 size,ArkUI_Int32 * result)743 ArkUI_Int32 getGestureBindNodeId(
744     ArkUIGestureRecognizer* recognizer, char* nodeId, ArkUI_Int32 size, ArkUI_Int32* result)
745 {
746     auto* rawRecognizer = reinterpret_cast<NG::NGGestureRecognizer*>(recognizer->recognizer);
747     CHECK_NULL_RETURN(rawRecognizer, ERROR_CODE_PARAM_INVALID);
748     auto gestureRecognizer = AceType::Claim(rawRecognizer);
749     auto attachNode = gestureRecognizer->GetAttachedNode().Upgrade();
750     CHECK_NULL_RETURN(attachNode, ERROR_CODE_PARAM_INVALID);
751     auto inspectorId = attachNode->GetInspectorIdValue("");
752     auto actualSize = static_cast<int32_t>(inspectorId.size());
753     *result = actualSize;
754     if (actualSize > size - 1) {
755         return ERROR_CODE_BUFFER_SIZE_NOT_ENOUGH;
756     }
757     auto count = snprintf_s(nodeId, size, size - 1, "%s", inspectorId.c_str());
758     if (count < 0) {
759         return ERROR_CODE_PARAM_INVALID;
760     }
761     return ERROR_CODE_NO_ERROR;
762 }
763 
isGestureRecognizerValid(ArkUIGestureRecognizer * recognizer)764 ArkUI_Bool isGestureRecognizerValid(ArkUIGestureRecognizer* recognizer)
765 {
766     auto* rawRecognizer = reinterpret_cast<NG::NGGestureRecognizer*>(recognizer->recognizer);
767     CHECK_NULL_RETURN(rawRecognizer, false);
768     auto gestureRecognizer = AceType::Claim(rawRecognizer);
769     return gestureRecognizer->IsInResponseLinkRecognizers();
770 }
771 
setArkUIGestureRecognizerDisposeNotify(ArkUIGestureRecognizer * recognizer,void * userData,void (* callback)(ArkUIGestureRecognizer * recognizer,void * userData))772 ArkUI_Int32 setArkUIGestureRecognizerDisposeNotify(ArkUIGestureRecognizer* recognizer, void* userData,
773     void (*callback)(ArkUIGestureRecognizer* recognizer, void* userData))
774 {
775     auto* rawRecognizer = reinterpret_cast<NG::NGGestureRecognizer*>(recognizer->recognizer);
776     CHECK_NULL_RETURN(rawRecognizer, ERROR_CODE_PARAM_INVALID);
777     auto gestureRecognizer = AceType::Claim(rawRecognizer);
778     auto disposeNotify = [userData, callback](void* recognizer) {
779         auto* arkuiGestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
780         callback(arkuiGestureRecognizer, userData);
781     };
782     gestureRecognizer->SetDisposeNotifyCallback(std::move(disposeNotify));
783     return ERROR_CODE_NO_ERROR;
784 }
785 
786 namespace NodeModifier {
GetGestureModifier()787 const ArkUIGestureModifier* GetGestureModifier()
788 {
789     static const ArkUIGestureModifier modifier = {
790         createTapGesture,
791         createTapGestureWithDistanceThreshold,
792         createLongPressGesture,
793         createPanGesture,
794         createPinchGesture,
795         createRotationGesture,
796         createSwipeGesture,
797         createSwipeGestureByModifier,
798         createGestureGroup,
799         addGestureToGestureGroup,
800         removeGestureFromGestureGroup,
801         dispose,
802         registerGestureEvent,
803         addGestureToNode,
804         removeGestureFromNode,
805         removeGestureFromNodeByTag,
806         clearGestures,
807         setGestureInterrupterToNode,
808         setInnerGestureParallelTo,
809         setGestureRecognizerEnabled,
810         getGestureRecognizerEnabled,
811         getGestureRecognizerState,
812         gestureEventTargetInfoIsScrollBegin,
813         gestureEventTargetInfoIsScrollEnd,
814         getPanGestureDirectionMask,
815         isBuiltInGesture,
816         getGestureTag,
817         getGestureBindNodeId,
818         isGestureRecognizerValid,
819         setArkUIGestureRecognizerDisposeNotify,
820         addGestureToGestureGroupWithRefCountDecrease,
821         addGestureToNodeWithRefCountDecrease,
822         };
823     return &modifier;
824 }
825 
GetCJUIGestureModifier()826 const CJUIGestureModifier* GetCJUIGestureModifier()
827 {
828     static const CJUIGestureModifier modifier = {
829         createTapGesture,
830         createLongPressGesture,
831         createPanGesture,
832         createPinchGesture,
833         createRotationGesture,
834         createSwipeGesture,
835         createSwipeGestureByModifier,
836         createGestureGroup,
837         addGestureToGestureGroup,
838         removeGestureFromGestureGroup,
839         dispose,
840         registerGestureEvent,
841         addGestureToNode,
842         removeGestureFromNode,
843         removeGestureFromNodeByTag,
844         clearGestures,
845         setGestureInterrupterToNode,
846     };
847     return &modifier;
848 }
849 
CreateGestureRecognizer(const RefPtr<NG::NGGestureRecognizer> & recognizer)850 ArkUIGestureRecognizer* CreateGestureRecognizer(const RefPtr<NG::NGGestureRecognizer>& recognizer)
851 {
852     CHECK_NULL_RETURN(recognizer, nullptr);
853     ArkUIGestureRecognizer* arkUIGestureRecognizer;
854     auto gestureInfo = recognizer->GetGestureInfo();
855     CHECK_NULL_RETURN(gestureInfo, nullptr);
856     auto* userData = gestureInfo->GetUserData();
857     if (userData) {
858         arkUIGestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(userData);
859     } else {
860         arkUIGestureRecognizer = new ArkUIGestureRecognizer();
861         arkUIGestureRecognizer->capi = false;
862         gestureInfo->SetUserData(arkUIGestureRecognizer);
863     }
864     arkUIGestureRecognizer->type = static_cast<int32_t>(gestureInfo->GetRecognizerType());
865     arkUIGestureRecognizer->recognizer = reinterpret_cast<void*>(AceType::RawPtr(recognizer));
866     auto attachNode = recognizer->GetAttachedNode().Upgrade();
867     if (attachNode) {
868         arkUIGestureRecognizer->targetInfo.uiNode = reinterpret_cast<void*>(AceType::RawPtr(attachNode));
869     }
870     gestureInfo->SetIsCapi(arkUIGestureRecognizer->capi);
871     gestureInfo->SetDisposeJSRecognizerInfoFunc([arkUIGestureRecognizer]() {
872         delete arkUIGestureRecognizer;
873     });
874     return arkUIGestureRecognizer;
875 }
876 } // namespace NodeModifier
877 } // namespace OHOS::Ace::NG
878