• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <cstdint>
17 
18 #include "native_gesture.h"
19 #include "native_node.h"
20 #include "native_type.h"
21 #include "node_model.h"
22 #include "gesture_impl.h"
23 
24 #include "base/utils/utils.h"
25 #include "core/gestures/gesture_event.h"
26 #include "frameworks/core/interfaces/arkoala/arkoala_api.h"
27 #include "interfaces/native/event/ui_input_event_impl.h"
28 
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32 
33 struct ArkUI_GestureRecognizer {
34     int32_t type = -1;
35     ArkUIGesture* gesture = nullptr;
36     void* extraData = nullptr;
37     void* attachNode = nullptr;
38     bool capi = true;
39     void* recognizer = nullptr;
40     ArkUIGestureEventTargetInfo targetInfo = {};
41 };
42 
43 struct ArkUI_GestureEventTargetInfo {
44     void* uiNode = nullptr;
45 };
46 
47 #ifdef __cplusplus
48 };
49 
50 // the ArkUI_GestureEvent struct actually same as ArkUIAPIEventGestureAsyncEvent;
51 struct ArkUI_GestureEvent {
52     ArkUIAPIEventGestureAsyncEvent eventData;
53     void* attachNode;
54 };
55 
56 struct ArkUI_GestureInterruptInfo {
57     ArkUIGestureInterruptInfo interruptData;
58 };
59 
60 struct ArkUI_ParallelInnerGestureEvent {
61     ArkUIGestureRecognizer* current = nullptr;
62     ArkUIGestureRecognizer** responseLinkRecognizer = nullptr;
63     void* userData = nullptr;
64     int32_t count;
65 };
66 
67 #endif
68 
69 
OH_ArkUI_GestureEvent_GetActionType(const ArkUI_GestureEvent * event)70 ArkUI_GestureEventActionType OH_ArkUI_GestureEvent_GetActionType(const ArkUI_GestureEvent* event)
71 {
72     ArkUI_GestureEventActionType ret;
73     switch (event->eventData.subKind) {
74         case ON_ACTION:
75         case ON_ACTION_START:
76             ret = GESTURE_EVENT_ACTION_ACCEPT;
77             break;
78         case ON_ACTION_UPDATE:
79             ret = GESTURE_EVENT_ACTION_UPDATE;
80             break;
81         case ON_ACTION_END:
82             ret = GESTURE_EVENT_ACTION_END;
83             break;
84         case ON_ACTION_CANCEL:
85             ret = GESTURE_EVENT_ACTION_CANCEL;
86             break;
87         default:
88             ret = GESTURE_EVENT_ACTION_ACCEPT;
89             break;
90     }
91     return ret;
92 }
93 
OH_ArkUI_GestureEvent_GetRawInputEvent(const ArkUI_GestureEvent * event)94 const ArkUI_UIInputEvent* OH_ArkUI_GestureEvent_GetRawInputEvent(const ArkUI_GestureEvent* event)
95 {
96     if (!event) {
97         return nullptr;
98     }
99     return reinterpret_cast<ArkUI_UIInputEvent*>(event->eventData.rawPointerEvent);
100 }
101 
OH_ArkUI_LongPress_GetRepeatCount(const ArkUI_GestureEvent * event)102 int32_t OH_ArkUI_LongPress_GetRepeatCount(const ArkUI_GestureEvent* event)
103 {
104     return event->eventData.repeat;
105 }
106 
OH_ArkUI_PanGesture_GetVelocity(const ArkUI_GestureEvent * event)107 float OH_ArkUI_PanGesture_GetVelocity(const ArkUI_GestureEvent* event)
108 {
109     return event->eventData.velocity;
110 }
111 
OH_ArkUI_PanGesture_GetVelocityX(const ArkUI_GestureEvent * event)112 float OH_ArkUI_PanGesture_GetVelocityX(const ArkUI_GestureEvent* event)
113 {
114     return event->eventData.velocityX;
115 }
116 
OH_ArkUI_PanGesture_GetVelocityY(const ArkUI_GestureEvent * event)117 float OH_ArkUI_PanGesture_GetVelocityY(const ArkUI_GestureEvent* event)
118 {
119     return event->eventData.velocityY;
120 }
121 
OH_ArkUI_PanGesture_GetOffsetX(const ArkUI_GestureEvent * event)122 float OH_ArkUI_PanGesture_GetOffsetX(const ArkUI_GestureEvent* event)
123 {
124     return event->eventData.x;
125 }
126 
OH_ArkUI_PanGesture_GetOffsetY(const ArkUI_GestureEvent * event)127 float OH_ArkUI_PanGesture_GetOffsetY(const ArkUI_GestureEvent* event)
128 {
129     return event->eventData.y;
130 }
131 
OH_ArkUI_SwipeGesture_GetAngle(const ArkUI_GestureEvent * event)132 float OH_ArkUI_SwipeGesture_GetAngle(const ArkUI_GestureEvent* event)
133 {
134     return event->eventData.angle;
135 }
136 
OH_ArkUI_SwipeGesture_GetVelocity(const ArkUI_GestureEvent * event)137 float OH_ArkUI_SwipeGesture_GetVelocity(const ArkUI_GestureEvent* event)
138 {
139     return event->eventData.speed;
140 }
141 
OH_ArkUI_RotationGesture_GetAngle(const ArkUI_GestureEvent * event)142 float OH_ArkUI_RotationGesture_GetAngle(const ArkUI_GestureEvent* event)
143 {
144     return event->eventData.angle;
145 }
146 
OH_ArkUI_PinchGesture_GetScale(const ArkUI_GestureEvent * event)147 float OH_ArkUI_PinchGesture_GetScale(const ArkUI_GestureEvent* event)
148 {
149     return event->eventData.scale;
150 }
151 
OH_ArkUI_PinchGesture_GetCenterX(const ArkUI_GestureEvent * event)152 float OH_ArkUI_PinchGesture_GetCenterX(const ArkUI_GestureEvent* event)
153 {
154     return event->eventData.pinchCenterX;
155 }
156 
OH_ArkUI_PinchGesture_GetCenterY(const ArkUI_GestureEvent * event)157 float OH_ArkUI_PinchGesture_GetCenterY(const ArkUI_GestureEvent* event)
158 {
159     return event->eventData.pinchCenterY;
160 }
161 
OH_ArkUI_GestureEvent_GetNode(const ArkUI_GestureEvent * event)162 ArkUI_NodeHandle OH_ArkUI_GestureEvent_GetNode(const ArkUI_GestureEvent* event)
163 {
164     if (!event) {
165         return nullptr;
166     }
167     return reinterpret_cast<ArkUI_NodeHandle>(event->attachNode);
168 }
169 
OH_ArkUI_GestureInterruptInfo_GetSystemFlag(const ArkUI_GestureInterruptInfo * event)170 bool OH_ArkUI_GestureInterruptInfo_GetSystemFlag(const ArkUI_GestureInterruptInfo* event)
171 {
172     return event->interruptData.isSystemGesture;
173 }
174 
OH_ArkUI_GestureInterruptInfo_GetRecognizer(const ArkUI_GestureInterruptInfo * event)175 ArkUI_GestureRecognizer* OH_ArkUI_GestureInterruptInfo_GetRecognizer(const ArkUI_GestureInterruptInfo* event)
176 {
177     return reinterpret_cast<ArkUI_GestureRecognizer *>(event->interruptData.userData);
178 }
179 
OH_ArkUI_GestureInterruptInfo_GetGestureEvent(const ArkUI_GestureInterruptInfo * event)180 ArkUI_GestureEvent* OH_ArkUI_GestureInterruptInfo_GetGestureEvent(const ArkUI_GestureInterruptInfo* event)
181 {
182     CHECK_NULL_RETURN(event, nullptr);
183     ArkUI_GestureEvent* gestureEvent = reinterpret_cast<ArkUI_GestureEvent*>(event->interruptData.gestureEvent);
184     CHECK_NULL_RETURN(gestureEvent, nullptr);
185 
186     ArkUI_UIInputEvent* uiEvent = reinterpret_cast<ArkUI_UIInputEvent*>(event->interruptData.inputEvent);
187     gestureEvent->eventData.rawPointerEvent = uiEvent;
188 
189     auto* gestureRecognizer = reinterpret_cast<ArkUI_GestureRecognizer*>(event->interruptData.userData);
190     CHECK_NULL_RETURN(gestureRecognizer, nullptr);
191     gestureEvent->attachNode = gestureRecognizer->attachNode;
192     return gestureEvent;
193 }
194 
OH_ArkUI_GestureInterruptInfo_GetSystemRecognizerType(const ArkUI_GestureInterruptInfo * event)195 int32_t OH_ArkUI_GestureInterruptInfo_GetSystemRecognizerType(const ArkUI_GestureInterruptInfo* event)
196 {
197     if (event->interruptData.isSystemGesture) {
198         return event->interruptData.systemRecognizerType;
199     }
200     return -1;
201 }
202 
OH_ArkUI_GestureInterruptInfo_GetTouchRecognizers(const ArkUI_GestureInterruptInfo * info,ArkUI_TouchRecognizerHandleArray * recognizers,int32_t * size)203 int32_t OH_ArkUI_GestureInterruptInfo_GetTouchRecognizers(
204     const ArkUI_GestureInterruptInfo* info, ArkUI_TouchRecognizerHandleArray* recognizers, int32_t* size)
205 {
206     CHECK_NULL_RETURN(info, ARKUI_ERROR_CODE_PARAM_INVALID);
207     CHECK_NULL_RETURN(recognizers, ARKUI_ERROR_CODE_PARAM_INVALID);
208     CHECK_NULL_RETURN(size, ARKUI_ERROR_CODE_PARAM_INVALID);
209     *recognizers = reinterpret_cast<ArkUI_TouchRecognizerHandleArray>(info->interruptData.touchRecognizers);
210     *size = info->interruptData.touchRecognizerCnt;
211     return ARKUI_ERROR_CODE_NO_ERROR;
212 }
213 
OH_ArkUI_TouchRecognizer_GetNodeHandle(const ArkUI_TouchRecognizerHandle recognizer)214 ArkUI_NodeHandle OH_ArkUI_TouchRecognizer_GetNodeHandle(const ArkUI_TouchRecognizerHandle recognizer)
215 {
216     CHECK_NULL_RETURN(recognizer, nullptr);
217     auto node =
218         OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->touchRecognizerGetNodeHandle(
219             static_cast<void*>(recognizer));
220 
221     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
222     ArkUI_Node* arkUINode = new ArkUI_Node({ -1, node, false });
223     impl->getExtendedAPI()->setAttachNodePtr((arkUINode)->uiNodeHandle, reinterpret_cast<void*>(arkUINode));
224     return reinterpret_cast<ArkUI_NodeHandle>(arkUINode);
225 }
226 
OH_ArkUI_TouchRecognizer_CancelTouch(ArkUI_TouchRecognizerHandle recognizer,ArkUI_GestureInterruptInfo * info)227 int32_t OH_ArkUI_TouchRecognizer_CancelTouch(ArkUI_TouchRecognizerHandle recognizer, ArkUI_GestureInterruptInfo* info)
228 {
229     CHECK_NULL_RETURN(recognizer, ARKUI_ERROR_CODE_PARAM_INVALID);
230     CHECK_NULL_RETURN(info, ARKUI_ERROR_CODE_PARAM_INVALID);
231     bool ret =
232         OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->touchRecognizerCancelTouch(
233             static_cast<void*>(recognizer));
234     return ret ? ARKUI_ERROR_CODE_NO_ERROR : ARKUI_ERROR_CODE_PARAM_INVALID;
235 }
236 
OH_ArkUI_GetResponseRecognizersFromInterruptInfo(const ArkUI_GestureInterruptInfo * event,ArkUI_GestureRecognizerHandleArray * responseChain,int32_t * count)237 int32_t OH_ArkUI_GetResponseRecognizersFromInterruptInfo(
238     const ArkUI_GestureInterruptInfo* event, ArkUI_GestureRecognizerHandleArray* responseChain, int32_t* count)
239 {
240     CHECK_NULL_RETURN(responseChain, ARKUI_ERROR_CODE_PARAM_INVALID);
241     CHECK_NULL_RETURN(count, ARKUI_ERROR_CODE_PARAM_INVALID);
242     *responseChain = reinterpret_cast<ArkUI_GestureRecognizer**>(event->interruptData.responseLinkRecognizer);
243     *count = event->interruptData.count;
244     return 0;
245 }
246 
OH_ArkUI_SetGestureRecognizerEnabled(ArkUI_GestureRecognizer * recognizer,bool enabled)247 int32_t OH_ArkUI_SetGestureRecognizerEnabled(ArkUI_GestureRecognizer* recognizer, bool enabled)
248 {
249     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
250     if (!gestureRecognizer) {
251         return ARKUI_ERROR_CODE_PARAM_INVALID;
252     }
253     return OHOS::Ace::NodeModel::GetFullImpl()
254         ->getNodeModifiers()
255         ->getGestureModifier()
256         ->setGestureRecognizerEnabled(gestureRecognizer, enabled);
257 }
258 
OH_ArkUI_SetGestureRecognizerLimitFingerCount(ArkUI_GestureRecognizer * recognizer,bool limitFingerCount)259 int32_t OH_ArkUI_SetGestureRecognizerLimitFingerCount(ArkUI_GestureRecognizer* recognizer, bool limitFingerCount)
260 {
261     auto* gesture = reinterpret_cast<ArkUIGesture*>(recognizer->gesture);
262     if (!gesture) {
263         return ARKUI_ERROR_CODE_PARAM_INVALID;
264     }
265     return OHOS::Ace::NodeModel::GetFullImpl()
266         ->getNodeModifiers()
267         ->getGestureModifier()
268         ->setGestureRecognizerLimitFingerCount(gesture, limitFingerCount);
269 }
270 
OH_ArkUI_GetGestureRecognizerEnabled(ArkUI_GestureRecognizer * recognizer)271 bool OH_ArkUI_GetGestureRecognizerEnabled(ArkUI_GestureRecognizer* recognizer)
272 {
273     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
274     if (!gestureRecognizer) {
275         return false;
276     }
277     return OHOS::Ace::NodeModel::GetFullImpl()
278         ->getNodeModifiers()
279         ->getGestureModifier()
280         ->getGestureRecognizerEnabled(gestureRecognizer);
281 }
282 
OH_ArkUI_GetGestureRecognizerState(ArkUI_GestureRecognizer * recognizer,ArkUI_GestureRecognizerState * state)283 int32_t OH_ArkUI_GetGestureRecognizerState(ArkUI_GestureRecognizer* recognizer, ArkUI_GestureRecognizerState* state)
284 {
285     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
286     if (!gestureRecognizer) {
287         return ARKUI_ERROR_CODE_PARAM_INVALID;
288     }
289     ArkUIGestureRecognizerState recognizerState;
290     auto result =
291         OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->getGestureRecognizerState(
292             gestureRecognizer, &recognizerState);
293     *state = static_cast<ArkUI_GestureRecognizerState>(recognizerState);
294     return result;
295 }
296 
OH_ArkUI_GetGestureEventTargetInfo(ArkUI_GestureRecognizer * recognizer,ArkUI_GestureEventTargetInfo ** info)297 int32_t OH_ArkUI_GetGestureEventTargetInfo(ArkUI_GestureRecognizer* recognizer, ArkUI_GestureEventTargetInfo** info)
298 {
299     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
300     if (!gestureRecognizer) {
301         return ARKUI_ERROR_CODE_PARAM_INVALID;
302     }
303     *info = reinterpret_cast<ArkUI_GestureEventTargetInfo*>(&gestureRecognizer->targetInfo);
304     return 0;
305 }
306 
OH_ArkUI_GestureEventTargetInfo_IsScrollBegin(ArkUI_GestureEventTargetInfo * info,bool * ret)307 int32_t OH_ArkUI_GestureEventTargetInfo_IsScrollBegin(ArkUI_GestureEventTargetInfo* info, bool* ret)
308 {
309     auto* targetInfo = reinterpret_cast<ArkUIGestureEventTargetInfo*>(info);
310     if (!targetInfo) {
311         return ARKUI_ERROR_CODE_PARAM_INVALID;
312     }
313     return OHOS::Ace::NodeModel::GetFullImpl()
314         ->getNodeModifiers()
315         ->getGestureModifier()
316         ->gestureEventTargetInfoIsScrollBegin(targetInfo, ret);
317 }
318 
OH_ArkUI_GestureEventTargetInfo_IsScrollEnd(ArkUI_GestureEventTargetInfo * info,bool * ret)319 int32_t OH_ArkUI_GestureEventTargetInfo_IsScrollEnd(ArkUI_GestureEventTargetInfo* info, bool* ret)
320 {
321     auto* targetInfo = reinterpret_cast<ArkUIGestureEventTargetInfo*>(info);
322     if (!targetInfo) {
323         return ARKUI_ERROR_CODE_PARAM_INVALID;
324     }
325     return OHOS::Ace::NodeModel::GetFullImpl()
326         ->getNodeModifiers()
327         ->getGestureModifier()
328         ->gestureEventTargetInfoIsScrollEnd(targetInfo, ret);
329 }
330 
OH_ArkUI_GetPanGestureDirectionMask(ArkUI_GestureRecognizer * recognizer,ArkUI_GestureDirectionMask * directionMask)331 int32_t OH_ArkUI_GetPanGestureDirectionMask(
332     ArkUI_GestureRecognizer* recognizer, ArkUI_GestureDirectionMask* directionMask)
333 {
334     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
335     if (!gestureRecognizer) {
336         return ARKUI_ERROR_CODE_PARAM_INVALID;
337     }
338     ArkUIGestureDirection direction = ArkUIGestureDirection::ArkUI_GESTURE_DIRECTION_ALL;
339     auto result =
340         OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->getPanGestureDirectionMask(
341             gestureRecognizer, &direction);
342     *directionMask = static_cast<ArkUI_GestureDirectionMask>(direction);
343     return result;
344 }
345 
OH_ArkUI_IsBuiltInGesture(ArkUI_GestureRecognizer * recognizer)346 bool OH_ArkUI_IsBuiltInGesture(ArkUI_GestureRecognizer* recognizer)
347 {
348     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
349     if (!gestureRecognizer) {
350         return false;
351     }
352     return OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->isBuiltInGesture(
353         gestureRecognizer);
354 }
355 
OH_ArkUI_GetGestureTag(ArkUI_GestureRecognizer * recognizer,char * buffer,int32_t bufferSize,int32_t * result)356 int32_t OH_ArkUI_GetGestureTag(ArkUI_GestureRecognizer* recognizer, char* buffer, int32_t bufferSize, int32_t* result)
357 {
358     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
359     if (!gestureRecognizer) {
360         return ARKUI_ERROR_CODE_PARAM_INVALID;
361     }
362     return OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->getGestureTag(
363         gestureRecognizer, buffer, bufferSize, result);
364 }
365 
OH_ArkUI_GetGestureBindNodeId(ArkUI_GestureRecognizer * recognizer,char * nodeId,int32_t size,int32_t * result)366 int32_t OH_ArkUI_GetGestureBindNodeId(ArkUI_GestureRecognizer* recognizer, char* nodeId, int32_t size, int32_t* result)
367 {
368     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
369     if (!gestureRecognizer) {
370         return ARKUI_ERROR_CODE_PARAM_INVALID;
371     }
372     return OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->getGestureBindNodeId(
373         gestureRecognizer, nodeId, size, result);
374 }
375 
OH_ArkUI_IsGestureRecognizerValid(ArkUI_GestureRecognizer * recognizer)376 bool OH_ArkUI_IsGestureRecognizerValid(ArkUI_GestureRecognizer* recognizer)
377 {
378     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
379     if (!gestureRecognizer) {
380         return false;
381     }
382     return OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->isGestureRecognizerValid(
383         gestureRecognizer);
384 }
385 
OH_ArkUI_ParallelInnerGestureEvent_GetUserData(ArkUI_ParallelInnerGestureEvent * event)386 void* OH_ArkUI_ParallelInnerGestureEvent_GetUserData(ArkUI_ParallelInnerGestureEvent* event)
387 {
388     return event->userData;
389 }
390 
OH_ArkUI_ParallelInnerGestureEvent_GetCurrentRecognizer(ArkUI_ParallelInnerGestureEvent * event)391 ArkUI_GestureRecognizer* OH_ArkUI_ParallelInnerGestureEvent_GetCurrentRecognizer(ArkUI_ParallelInnerGestureEvent* event)
392 {
393     return reinterpret_cast<ArkUI_GestureRecognizer*>(event->current);
394 }
395 
OH_ArkUI_ParallelInnerGestureEvent_GetConflictRecognizers(ArkUI_ParallelInnerGestureEvent * event,ArkUI_GestureRecognizerHandleArray * array,int32_t * size)396 int32_t OH_ArkUI_ParallelInnerGestureEvent_GetConflictRecognizers(
397     ArkUI_ParallelInnerGestureEvent* event, ArkUI_GestureRecognizerHandleArray* array, int32_t* size)
398 {
399     CHECK_NULL_RETURN(array, ARKUI_ERROR_CODE_PARAM_INVALID);
400     CHECK_NULL_RETURN(size, ARKUI_ERROR_CODE_PARAM_INVALID);
401     *array = reinterpret_cast<ArkUI_GestureRecognizer**>(event->responseLinkRecognizer);
402     *size = event->count;
403     return 0;
404 }
405 
OH_ArkUI_SetArkUIGestureRecognizerDisposeNotify(ArkUI_GestureRecognizer * recognizer,ArkUI_GestureRecognizerDisposeNotifyCallback callback,void * userData)406 int32_t OH_ArkUI_SetArkUIGestureRecognizerDisposeNotify(
407     ArkUI_GestureRecognizer* recognizer, ArkUI_GestureRecognizerDisposeNotifyCallback callback, void* userData)
408 {
409     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
410     if (!gestureRecognizer || gestureRecognizer->capi) {
411         return ARKUI_ERROR_CODE_PARAM_INVALID;
412     }
413     auto disposeCallback = reinterpret_cast<void (*)(ArkUIGestureRecognizer * recognizer, void* userData)>(callback);
414     OHOS::Ace::NodeModel::GetFullImpl()
415         ->getNodeModifiers()
416         ->getGestureModifier()
417         ->setArkUIGestureRecognizerDisposeNotify(gestureRecognizer, userData, disposeCallback);
418     return 0;
419 }
420 
421 namespace OHOS::Ace::GestureModel {
422 
423 constexpr int32_t DEFAULT_PAN_FINGERS = 1;
424 constexpr int32_t MAX_PAN_FINGERS = 10;
425 constexpr double DEFAULT_PINCH_DISTANCE = 5.0f;
426 constexpr double DEFAULT_SWIPE_SPEED = 100.0f;
427 constexpr int32_t DEFAULT_TAP_COUNT = 1;
428 constexpr int32_t DEFAULT_TAP_FINGERS = 1;
429 constexpr int32_t MAX_TAP_FINGERS = 10;
430 
431 struct GestureInnerData {
432     void (*targetReceiver)(ArkUI_GestureEvent* event, void* extraParam);
433     void* extraParam;
434     void* gesture;
435 };
436 
CreatePanGesture(int32_t fingersNum,ArkUI_GestureDirectionMask mask,double distanceNum)437 ArkUI_GestureRecognizer* CreatePanGesture(int32_t fingersNum, ArkUI_GestureDirectionMask mask, double distanceNum)
438 {
439     int32_t fingers = DEFAULT_PAN_FINGERS;
440     if (fingersNum < DEFAULT_PAN_FINGERS || fingersNum > MAX_PAN_FINGERS) {
441         fingers = DEFAULT_PAN_FINGERS;
442     } else {
443         fingers = fingersNum;
444     }
445     auto* ndkGesture = new ArkUI_GestureRecognizer{ PAN_GESTURE, nullptr, nullptr };
446     auto* gesture = OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->createPanGesture(
447         fingers, mask, distanceNum, false, ndkGesture);
448     ndkGesture->gesture = gesture;
449     return ndkGesture;
450 }
451 
CreateTapGesture(int32_t count,int32_t fingers)452 ArkUI_GestureRecognizer* CreateTapGesture(int32_t count, int32_t fingers)
453 {
454     count = std::max(count, DEFAULT_TAP_COUNT);
455     fingers = std::clamp(fingers, DEFAULT_TAP_FINGERS, MAX_TAP_FINGERS);
456     auto* ndkGesture = new ArkUI_GestureRecognizer{ TAP_GESTURE, nullptr, nullptr, nullptr };
457     auto* gesture = OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->createTapGesture(
458         count, fingers, false, ndkGesture);
459     ndkGesture->gesture = gesture;
460     return ndkGesture;
461 }
462 
CreateTapGestureWithDistanceThreshold(int32_t count,int32_t fingers,double distanceThreshold)463 ArkUI_GestureRecognizer* CreateTapGestureWithDistanceThreshold(
464     int32_t count, int32_t fingers, double distanceThreshold)
465 {
466     count = std::max(count, DEFAULT_TAP_COUNT);
467     fingers = std::clamp(fingers, DEFAULT_TAP_FINGERS, MAX_TAP_FINGERS);
468     auto* ndkGesture = new ArkUI_GestureRecognizer{ TAP_GESTURE, nullptr, nullptr, nullptr };
469     auto* gesture = OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->
470         createTapGestureWithDistanceThreshold(count, fingers, distanceThreshold, false, ndkGesture);
471     ndkGesture->gesture = gesture;
472     return ndkGesture;
473 }
474 
CreateLongPressGesture(int32_t fingers,bool repeatResult,int32_t duration)475 ArkUI_GestureRecognizer* CreateLongPressGesture(int32_t fingers, bool repeatResult, int32_t duration)
476 {
477     auto* ndkGesture = new ArkUI_GestureRecognizer{ LONG_PRESS_GESTURE, nullptr, nullptr, nullptr };
478     auto* gesture =
479         OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->createLongPressGesture(fingers,
480         repeatResult, duration, false, ndkGesture);
481     ndkGesture->gesture = gesture;
482     return ndkGesture;
483 }
484 
CreatePinchGesture(int32_t fingers,double distance)485 ArkUI_GestureRecognizer* CreatePinchGesture(int32_t fingers, double distance)
486 {
487     if (LessOrEqual(distance, 0.0f)) {
488         distance = DEFAULT_PINCH_DISTANCE;
489     }
490     double distanceNum = OHOS::Ace::NodeModel::GetFullImpl()->getBasicAPI()->convertLengthMetricsUnit(
491         distance, static_cast<int32_t>(ARKUI_LENGTH_METRIC_UNIT_PX), static_cast<int32_t>(ARKUI_LENGTH_METRIC_UNIT_VP));
492     auto* ndkGesture = new ArkUI_GestureRecognizer{ PINCH_GESTURE, nullptr, nullptr, nullptr };
493     auto* gesture =
494         OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->createPinchGesture(fingers,
495         distanceNum, false, ndkGesture);
496     ndkGesture->gesture = gesture;
497     return ndkGesture;
498 }
499 
CreateRotationGesture(int32_t fingers,double angle)500 ArkUI_GestureRecognizer* CreateRotationGesture(int32_t fingers, double angle)
501 {
502     auto* ndkGesture = new ArkUI_GestureRecognizer{ ROTATION_GESTURE, nullptr, nullptr, nullptr };
503     auto* gesture =
504         OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->createRotationGesture(fingers,
505         angle, false, ndkGesture);
506     ndkGesture->gesture = gesture;
507     return ndkGesture;
508 }
509 
CreateSwipeGesture(int32_t fingers,ArkUI_GestureDirectionMask directions,double speed)510 ArkUI_GestureRecognizer* CreateSwipeGesture(
511     int32_t fingers, ArkUI_GestureDirectionMask directions, double speed)
512 {
513     if (LessOrEqual(speed, 0.0f)) {
514         speed = DEFAULT_SWIPE_SPEED;
515     }
516     double speedNum = OHOS::Ace::NodeModel::GetFullImpl()->getBasicAPI()->convertLengthMetricsUnit(
517         speed, static_cast<int32_t>(ARKUI_LENGTH_METRIC_UNIT_PX), static_cast<int32_t>(ARKUI_LENGTH_METRIC_UNIT_VP));
518     auto* ndkGesture = new ArkUI_GestureRecognizer{ SWIPE_GESTURE, nullptr, nullptr, nullptr };
519     auto* gesture =
520         OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->createSwipeGesture(fingers,
521         directions, speedNum, false, ndkGesture);
522     ndkGesture->gesture = gesture;
523     return ndkGesture;
524 }
525 
DisposeGesture(ArkUI_GestureRecognizer * recognizer)526 void DisposeGesture(ArkUI_GestureRecognizer* recognizer)
527 {
528     OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->dispose(recognizer->gesture);
529     delete reinterpret_cast<GestureInnerData*>(recognizer->extraData);
530     recognizer->extraData = nullptr;
531     delete recognizer;
532     recognizer = nullptr;
533 }
534 
SetGestureEventTarget(ArkUI_GestureRecognizer * recognizer,ArkUI_GestureEventActionTypeMask mask,void * extraParam,void (* targetReceiver)(ArkUI_GestureEvent * event,void * extraParam))535 int32_t SetGestureEventTarget(ArkUI_GestureRecognizer* recognizer, ArkUI_GestureEventActionTypeMask mask,
536     void* extraParam, void (*targetReceiver)(ArkUI_GestureEvent* event, void* extraParam))
537 {
538     // 手势事件通过通用的异步事件接口进行处理。(HandleGestureEvent)
539     // 把回调函数和上下文都封装到内部结构体中。
540     if (recognizer->extraData) {
541         delete reinterpret_cast<GestureInnerData*>(recognizer->extraData);
542         recognizer->extraData = nullptr;
543     }
544     recognizer->extraData = new GestureInnerData { targetReceiver, extraParam, recognizer };
545     OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->registerGestureEvent(
546         recognizer->gesture, mask, recognizer->extraData);
547     return 0;
548 }
549 
AddGestureToNode(ArkUI_NodeHandle node,ArkUI_GestureRecognizer * recognizer,ArkUI_GesturePriority priorityNum,ArkUI_GestureMask mask)550 int32_t AddGestureToNode(ArkUI_NodeHandle node, ArkUI_GestureRecognizer* recognizer, ArkUI_GesturePriority priorityNum,
551     ArkUI_GestureMask mask)
552 {
553     recognizer->attachNode = node;
554     OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->addGestureToNode(
555         node->uiNodeHandle, recognizer->gesture, priorityNum, mask);
556     recognizer->targetInfo.uiNode = reinterpret_cast<void*>(node->uiNodeHandle);
557     return 0;
558 }
559 
RemoveGestureFromNode(ArkUI_NodeHandle node,ArkUI_GestureRecognizer * recognizer)560 int32_t RemoveGestureFromNode(ArkUI_NodeHandle node, ArkUI_GestureRecognizer* recognizer)
561 {
562     OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->removeGestureFromNode(
563         node->uiNodeHandle, recognizer->gesture);
564     recognizer->targetInfo.uiNode = nullptr;
565     return 0;
566 }
567 
GetGestureType(ArkUI_GestureRecognizer * recognizer)568 ArkUI_GestureRecognizerType GetGestureType(ArkUI_GestureRecognizer* recognizer)
569 {
570     return static_cast<ArkUI_GestureRecognizerType>(recognizer->type);
571 }
572 
CreateGroupGesture(ArkUI_GroupGestureMode gestureMode)573 ArkUI_GestureRecognizer* CreateGroupGesture(ArkUI_GroupGestureMode gestureMode)
574 {
575     auto* gesture =
576         OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->createGestureGroup(gestureMode);
577     return new ArkUI_GestureRecognizer { GROUP_GESTURE, gesture, nullptr };
578 }
579 
AddChildGesture(ArkUI_GestureRecognizer * group,ArkUI_GestureRecognizer * child)580 int32_t AddChildGesture(ArkUI_GestureRecognizer* group, ArkUI_GestureRecognizer* child)
581 {
582     OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->addGestureToGestureGroup(
583         group->gesture, child->gesture);
584     return 0;
585 }
586 
RemoveChildGesture(ArkUI_GestureRecognizer * group,ArkUI_GestureRecognizer * child)587 int32_t RemoveChildGesture(ArkUI_GestureRecognizer* group, ArkUI_GestureRecognizer* child)
588 {
589     OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->removeGestureFromGestureGroup(
590         group->gesture, child->gesture);
591     return 0;
592 }
593 
HandleGestureEvent(ArkUINodeEvent * event)594 void HandleGestureEvent(ArkUINodeEvent* event)
595 {
596     if (event == nullptr) {
597         return;
598     }
599     auto* extraData = reinterpret_cast<GestureInnerData*>(event->extraParam);
600     if (extraData == nullptr) {
601         return;
602     }
603     ArkUI_GestureEvent* gestureEvent = reinterpret_cast<ArkUI_GestureEvent *>(&event->gestureAsyncEvent);
604     if (gestureEvent == nullptr || extraData->targetReceiver == nullptr) {
605         return;
606     }
607     ArkUI_UIInputEvent uiEvent;
608     if (gestureEvent->eventData.inputEventType == static_cast<int32_t>(ARKUI_UIINPUTEVENT_TYPE_MOUSE)) {
609         uiEvent.eventTypeId = C_MOUSE_EVENT_ID;
610         uiEvent.inputType = ARKUI_UIINPUTEVENT_TYPE_MOUSE;
611     } else if (gestureEvent->eventData.inputEventType == static_cast<int32_t>(ARKUI_UIINPUTEVENT_TYPE_AXIS)) {
612         uiEvent.eventTypeId = C_AXIS_EVENT_ID;
613         uiEvent.inputType = ARKUI_UIINPUTEVENT_TYPE_AXIS;
614     } else {
615         uiEvent.eventTypeId = C_TOUCH_EVENT_ID;
616         uiEvent.inputType = ARKUI_UIINPUTEVENT_TYPE_TOUCH;
617     }
618     uiEvent.inputEvent = gestureEvent->eventData.rawPointerEvent;
619     gestureEvent->eventData.rawPointerEvent = &uiEvent;
620     if (extraData->gesture) {
621         ArkUI_GestureRecognizer* recognizer = reinterpret_cast<ArkUI_GestureRecognizer*>(extraData->gesture);
622         gestureEvent->attachNode = recognizer->attachNode;
623     }
624     extraData->targetReceiver(gestureEvent, extraData->extraParam);
625 }
626 
SetGestureInterrupterToNode(ArkUI_NodeHandle node,ArkUI_GestureInterruptResult (* interrupter)(ArkUI_GestureInterruptInfo * info))627 int32_t SetGestureInterrupterToNode(
628     ArkUI_NodeHandle node,  ArkUI_GestureInterruptResult (*interrupter)(ArkUI_GestureInterruptInfo* info))
629 {
630     auto callback = reinterpret_cast<int32_t (*)(ArkUIGestureInterruptInfo*)>(interrupter);
631     OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->setGestureInterrupterToNode(
632         node->uiNodeHandle, callback);
633     return 0;
634 }
635 
SetInnerGestureParallelTo(ArkUI_NodeHandle node,void * userData,ArkUI_GestureRecognizer * (* parallelInnerGesture)(ArkUI_ParallelInnerGestureEvent * event))636 int32_t SetInnerGestureParallelTo(ArkUI_NodeHandle node, void* userData,
637     ArkUI_GestureRecognizer* (*parallelInnerGesture)(ArkUI_ParallelInnerGestureEvent* event))
638 {
639     auto callback =
640         reinterpret_cast<ArkUIGestureRecognizer* (*)(ArkUIParallelInnerGestureEvent * current)>(parallelInnerGesture);
641     OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->setInnerGestureParallelTo(
642         node->uiNodeHandle, userData, callback);
643     return 0;
644 }
645 
646 }; // namespace OHOS::Ace::GestureModel