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(¶llelInnerGestureEvent);
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