• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 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 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_swiper_bridge.h"
16 
17 #include <string>
18 
19 #include "base/geometry/calc_dimension.h"
20 #include "base/geometry/dimension.h"
21 #include "base/log/log_wrapper.h"
22 #include "base/utils/utils.h"
23 #include "base/log/ace_scoring_log.h"
24 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
25 #include "bridge/declarative_frontend/engine/functions/js_swiper_function.h"
26 #include "bridge/declarative_frontend/jsview/js_indicator.h"
27 #include "bridge/declarative_frontend/jsview/js_swiper.h"
28 #include "core/components_ng/pattern/swiper/swiper_model_ng.h"
29 
30 namespace OHOS::Ace::NG {
31 namespace {
32 constexpr int32_t CALL_ARG_NODE_INDEX = 0;
33 constexpr int32_t CALL_ARG_VALUE_INDEX = 1;
34 constexpr int32_t CALL_ARG_TYPE_INDEX = 2;
35 constexpr int32_t DISPLAY_ARROW_VALUE = 1;
36 constexpr int32_t ARROW_IS_SHOW_BACKGROUND = 2;
37 constexpr int32_t ARROW_IS_SIDE_BAR_MIDDLE = 3;
38 constexpr int32_t ARROW_BACKGROUND_SIZE = 4;
39 constexpr int32_t ARROW_BACKGROUND_COLOR = 5;
40 constexpr int32_t ARROW_SIZE = 6;
41 constexpr int32_t ARROW_COLOR = 7;
42 constexpr int32_t DISPLAY_ARROW_IS_HOVER_SHOW_INDEX = 8;
43 constexpr int32_t INDICATOR_VALUE_INDEX = 2;
44 constexpr int32_t DIGIT_INDICATOR_FONT_COLOR = 2;
45 constexpr int32_t DIGIT_INDICATOR_SELECTED_FONT_COLOR = 3;
46 constexpr int32_t DIGIT_INDICATOR_DIGIT_FONT_SIZE = 4;
47 constexpr int32_t DIGIT_INDICATOR_DIGIT_FONT_WEIGHT = 5;
48 constexpr int32_t DIGIT_INDICATOR_SELECTED_DIGIT_FONT_SIZE = 6;
49 constexpr int32_t DIGIT_INDICATOR_SELECTED_DIGIT_FONT_WEIGHT = 7;
50 constexpr int32_t DIGIT_INDICATOR_LEFT = 8;
51 constexpr int32_t DIGIT_INDICATOR_TOP = 9;
52 constexpr int32_t DIGIT_INDICATOR_RIGHT = 10;
53 constexpr int32_t DIGIT_INDICATOR_BOTTOM = 11;
54 constexpr int32_t DIGIT_INDICATOR_IGNORE_SIZE = 12;
55 constexpr int32_t DIGIT_INDICATOR_SET_IGNORE_SIZE = 13;
56 constexpr int32_t DOT_INDICATOR_ITEM_WIDTH = 2;
57 constexpr int32_t DOT_INDICATOR_ITEM_HEIGHT = 3;
58 constexpr int32_t DOT_INDICATOR_SELECTED_ITEM_WIDTH = 4;
59 constexpr int32_t DOT_INDICATOR_SELECTED_ITEM_HEIGHT = 5;
60 constexpr int32_t DOT_INDICATOR_MASK = 6;
61 constexpr int32_t DOT_INDICATOR_COLOR = 7;
62 constexpr int32_t DOT_INDICATOR_SELECTED_COLOR = 8;
63 constexpr int32_t DOT_INDICATOR_LEFT = 9;
64 constexpr int32_t DOT_INDICATOR_TOP = 10;
65 constexpr int32_t DOT_INDICATOR_RIGHT = 11;
66 constexpr int32_t DOT_INDICATOR_BOTTOM = 12;
67 constexpr int32_t DOT_INDICATOR_MAX_DISPLAY_COUNT = 13;
68 constexpr int32_t DOT_INDICATOR_SPACE = 14;
69 constexpr int32_t DOT_INDICATOR_IGNORE_SIZE = 15;
70 constexpr int32_t DOT_INDICATOR_SET_IGNORE_SIZE = 16;
71 constexpr double DEFAULT_PERCENT_VALUE = 100.0;
72 constexpr int32_t DEFAULT_ANIMATION_MODE = 0;
73 constexpr int32_t STOP_WHEN_TOUCHED = 2;
74 } // namespace
75 
SetSwiperInitialize(ArkUIRuntimeCallInfo * runtimeCallInfo)76 ArkUINativeModuleValue SwiperBridge::SetSwiperInitialize(ArkUIRuntimeCallInfo* runtimeCallInfo)
77 {
78     EcmaVM* vm = runtimeCallInfo->GetVM();
79     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
80     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
81     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
82     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
83 
84     auto nodePtr = GetArkUINodeModifiers()->getSwiperModifier()->getSwiperController(nativeNode);
85     auto node = AceType::Claim(reinterpret_cast<OHOS::Ace::SwiperController*>(nodePtr));
86 
87     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
88     Framework::JSSwiperController* jsController =
89         Framework::JSRef<Framework::JSObject>::Cast(info[1])->Unwrap<Framework::JSSwiperController>();
90     if (jsController) {
91         jsController->SetInstanceId(Container::CurrentId());
92         jsController->SetController(node);
93     }
94     return panda::JSValueRef::Undefined(vm);
95 }
ResetSwiperInitialize(ArkUIRuntimeCallInfo * runtimeCallInfo)96 ArkUINativeModuleValue SwiperBridge::ResetSwiperInitialize(ArkUIRuntimeCallInfo* runtimeCallInfo)
97 {
98     EcmaVM* vm = runtimeCallInfo->GetVM();
99     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
100     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
101     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
102     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
103     GetArkUINodeModifiers()->getSwiperModifier()->getSwiperController(nativeNode);
104     return panda::JSValueRef::Undefined(vm);
105 }
SetSwiperNextMargin(ArkUIRuntimeCallInfo * runtimeCallInfo)106 ArkUINativeModuleValue SwiperBridge::SetSwiperNextMargin(ArkUIRuntimeCallInfo* runtimeCallInfo)
107 {
108     EcmaVM* vm = runtimeCallInfo->GetVM();
109     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
110     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
111     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
112     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
113     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
114     Ace::CalcDimension nextMargin;
115     if (valueArg->IsUndefined() || valueArg->IsNull() ||
116         !ArkTSUtils::ParseJsDimension(vm, valueArg, nextMargin, DimensionUnit::VP) ||
117         LessNotEqual(nextMargin.Value(), 0.0)) {
118         nextMargin.SetValue(0.0);
119     }
120     int32_t nextMarginUnit = static_cast<int32_t>(nextMargin.Unit());
121     GetArkUINodeModifiers()->getSwiperModifier()->setSwiperNextMargin(
122         nativeNode, nextMargin.Value(), nextMarginUnit, 0);
123     return panda::JSValueRef::Undefined(vm);
124 }
ResetSwiperNextMargin(ArkUIRuntimeCallInfo * runtimeCallInfo)125 ArkUINativeModuleValue SwiperBridge::ResetSwiperNextMargin(ArkUIRuntimeCallInfo* runtimeCallInfo)
126 {
127     EcmaVM* vm = runtimeCallInfo->GetVM();
128     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
129     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
130     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
131     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
132     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperNextMargin(nativeNode);
133     return panda::JSValueRef::Undefined(vm);
134 }
SetSwiperPrevMargin(ArkUIRuntimeCallInfo * runtimeCallInfo)135 ArkUINativeModuleValue SwiperBridge::SetSwiperPrevMargin(ArkUIRuntimeCallInfo* runtimeCallInfo)
136 {
137     EcmaVM* vm = runtimeCallInfo->GetVM();
138     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
139     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
140     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
141     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
142     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
143     Ace::CalcDimension prevMargin;
144     if (valueArg->IsUndefined() || valueArg->IsNull() ||
145         !ArkTSUtils::ParseJsDimension(vm, valueArg, prevMargin, DimensionUnit::VP) ||
146         LessNotEqual(prevMargin.Value(), 0.0)) {
147         prevMargin.SetValue(0.0);
148     }
149     int32_t prevMarginUnit = static_cast<int32_t>(prevMargin.Unit());
150     GetArkUINodeModifiers()->getSwiperModifier()->setSwiperPrevMargin(
151         nativeNode, prevMargin.Value(), prevMarginUnit, 0);
152     return panda::JSValueRef::Undefined(vm);
153 }
ResetSwiperPrevMargin(ArkUIRuntimeCallInfo * runtimeCallInfo)154 ArkUINativeModuleValue SwiperBridge::ResetSwiperPrevMargin(ArkUIRuntimeCallInfo* runtimeCallInfo)
155 {
156     EcmaVM* vm = runtimeCallInfo->GetVM();
157     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
158     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
159     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
160     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
161     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperPrevMargin(nativeNode);
162     return panda::JSValueRef::Undefined(vm);
163 }
164 
SetNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)165 ArkUINativeModuleValue SwiperBridge::SetNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
166 {
167     EcmaVM* vm = runtimeCallInfo->GetVM();
168     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
169     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
170     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
171     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
172     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
173     if (valueArg->IsNumber()) {
174         int32_t index = valueArg->Int32Value(vm);
175         int32_t values[1] = { 0 };
176         values[0] = index;
177         GetArkUINodeModifiers()->getSwiperModifier()->setSwiperNestedScroll(nativeNode, &values);
178     } else {
179         GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperNestedScroll(nativeNode);
180     }
181     return panda::JSValueRef::Undefined(vm);
182 }
183 
ResetNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)184 ArkUINativeModuleValue SwiperBridge::ResetNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
185 {
186     EcmaVM* vm = runtimeCallInfo->GetVM();
187     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
188     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
189     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
190     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
191     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperNestedScroll(nativeNode);
192     return panda::JSValueRef::Undefined(vm);
193 }
194 
SetIndicatorInteractive(ArkUIRuntimeCallInfo * runtimeCallInfo)195 ArkUINativeModuleValue SwiperBridge::SetIndicatorInteractive(ArkUIRuntimeCallInfo* runtimeCallInfo)
196 {
197     EcmaVM* vm = runtimeCallInfo->GetVM();
198     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
199     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
200     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
201     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
202     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
203     bool interactive = valueArg->ToBoolean(vm)->Value();
204     GetArkUINodeModifiers()->getSwiperModifier()->setIndicatorInteractive(nativeNode, interactive);
205     return panda::JSValueRef::Undefined(vm);
206 }
207 
ResetIndicatorInteractive(ArkUIRuntimeCallInfo * runtimeCallInfo)208 ArkUINativeModuleValue SwiperBridge::ResetIndicatorInteractive(ArkUIRuntimeCallInfo* runtimeCallInfo)
209 {
210     EcmaVM* vm = runtimeCallInfo->GetVM();
211     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
212     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
213     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
214     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
215     GetArkUINodeModifiers()->getSwiperModifier()->resetIndicatorInteractive(nativeNode);
216     return panda::JSValueRef::Undefined(vm);
217 }
218 
SetSwiperDisplayCount(ArkUIRuntimeCallInfo * runtimeCallInfo)219 ArkUINativeModuleValue SwiperBridge::SetSwiperDisplayCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
220 {
221     EcmaVM* vm = runtimeCallInfo->GetVM();
222     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
223     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
224     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
225     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
226     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
227     if (valueArg->IsNumber() || valueArg->IsString(vm)) {
228         Local<JSValueRef> typeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_TYPE_INDEX);
229         std::string displayCountValue;
230         std::string type = typeArg->ToString(vm)->ToString(vm);
231         if (type == "number") {
232             displayCountValue = std::to_string(valueArg->Int32Value(vm));
233         } else {
234             displayCountValue = valueArg->ToString(vm)->ToString(vm);
235         }
236         GetArkUINodeModifiers()->getSwiperModifier()->setSwiperDisplayCount(
237             nativeNode, displayCountValue.c_str(), type.c_str());
238     } else {
239         GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperDisplayCount(nativeNode);
240     }
241     return panda::JSValueRef::Undefined(vm);
242 }
ResetSwiperDisplayCount(ArkUIRuntimeCallInfo * runtimeCallInfo)243 ArkUINativeModuleValue SwiperBridge::ResetSwiperDisplayCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
244 {
245     EcmaVM* vm = runtimeCallInfo->GetVM();
246     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
247     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
248     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
249     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
250     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperDisplayCount(nativeNode);
251     return panda::JSValueRef::Undefined(vm);
252 }
253 
SetSwiperSwipeByGroup(ArkUIRuntimeCallInfo * runtimeCallInfo)254 ArkUINativeModuleValue SwiperBridge::SetSwiperSwipeByGroup(ArkUIRuntimeCallInfo* runtimeCallInfo)
255 {
256     EcmaVM* vm = runtimeCallInfo->GetVM();
257     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
258     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
259     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
260     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
261     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
262     bool swipeByGroup = valueArg->ToBoolean(vm)->Value();
263     GetArkUINodeModifiers()->getSwiperModifier()->setSwiperSwipeByGroup(nativeNode, swipeByGroup);
264     return panda::JSValueRef::Undefined(vm);
265 }
266 
ResetSwiperSwipeByGroup(ArkUIRuntimeCallInfo * runtimeCallInfo)267 ArkUINativeModuleValue SwiperBridge::ResetSwiperSwipeByGroup(ArkUIRuntimeCallInfo* runtimeCallInfo)
268 {
269     EcmaVM* vm = runtimeCallInfo->GetVM();
270     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
271     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
272     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
273     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
274     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperSwipeByGroup(nativeNode);
275     return panda::JSValueRef::Undefined(vm);
276 }
GetDimensionUnitString(DimensionUnit unit)277 std::string GetDimensionUnitString(DimensionUnit unit)
278 {
279     switch (unit) {
280         case DimensionUnit::VP:
281             return "vp";
282         case DimensionUnit::PX:
283             return "px";
284         case DimensionUnit::FP:
285             return "fp";
286         case DimensionUnit::CALC:
287             return "calc";
288         default:
289             return "px";
290     }
291 }
SetSwiperDisplayArrow(ArkUIRuntimeCallInfo * runtimeCallInfo)292 ArkUINativeModuleValue SwiperBridge::SetSwiperDisplayArrow(ArkUIRuntimeCallInfo* runtimeCallInfo)
293 {
294     EcmaVM* vm = runtimeCallInfo->GetVM();
295     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
296     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
297     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
298     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
299     Local<JSValueRef> displayArrowValue = runtimeCallInfo->GetCallArgRef(DISPLAY_ARROW_VALUE);
300     Local<JSValueRef> showBackground = runtimeCallInfo->GetCallArgRef(ARROW_IS_SHOW_BACKGROUND);
301     Local<JSValueRef> isSidebarMiddle = runtimeCallInfo->GetCallArgRef(ARROW_IS_SIDE_BAR_MIDDLE);
302     Local<JSValueRef> backgroundSize = runtimeCallInfo->GetCallArgRef(ARROW_BACKGROUND_SIZE);
303     Local<JSValueRef> backgroundColor = runtimeCallInfo->GetCallArgRef(ARROW_BACKGROUND_COLOR);
304     Local<JSValueRef> arrowSize = runtimeCallInfo->GetCallArgRef(ARROW_SIZE);
305     Local<JSValueRef> arrowColor = runtimeCallInfo->GetCallArgRef(ARROW_COLOR);
306     Local<JSValueRef> isHoverShow = runtimeCallInfo->GetCallArgRef(DISPLAY_ARROW_IS_HOVER_SHOW_INDEX);
307     std::string displayArrowValueStr = std::to_string(displayArrowValue->Int32Value(vm));
308     std::string showBackgroundStr = "2";
309     if (!showBackground->IsUndefined()) {
310         showBackgroundStr = showBackground->ToBoolean(vm)->Value() ? "1" : "0";
311     }
312     std::string isSidebarMiddleStr = "2";
313     if (!isSidebarMiddle->IsUndefined()) {
314         isSidebarMiddleStr = isSidebarMiddle->ToBoolean(vm)->Value() ? "1" : "0";
315     }
316     CalcDimension lengthValue;
317     Color color;
318     std::string backgroundSizeStr =
319         ArkTSUtils::ParseJsDimension(vm, backgroundSize, lengthValue, DimensionUnit::VP, false)
320             ? std::to_string(lengthValue.Value()) + GetDimensionUnitString(lengthValue.Unit())
321             : "-";
322     std::string backgroundColorStr =
323         ArkTSUtils::ParseJsColorAlpha(vm, backgroundColor, color) ? std::to_string(color.GetValue()) : "-";
324     std::string arrowSizeStr = ArkTSUtils::ParseJsDimensionNG(vm, arrowSize, lengthValue, DimensionUnit::VP, false)
325                                    ? std::to_string(lengthValue.Value()) + GetDimensionUnitString(lengthValue.Unit())
326                                    : "-";
327     std::string arrowColorStr =
328         ArkTSUtils::ParseJsColorAlpha(vm, arrowColor, color) ? std::to_string(color.GetValue()) : "-";
329     std::string isHoverShowStr = "2";
330     if (!isHoverShow->IsUndefined()) {
331         isHoverShowStr = isHoverShow->ToBoolean(vm)->Value() ? "1" : "0";
332     }
333     std::string displayArrowStr = displayArrowValueStr + "|" + showBackgroundStr + "|" + isSidebarMiddleStr + "|" +
334                                   backgroundSizeStr + "|" + backgroundColorStr + "|" + arrowSizeStr + "|" +
335                                   arrowColorStr + "|" + isHoverShowStr + "|";
336     GetArkUINodeModifiers()->getSwiperModifier()->setSwiperDisplayArrow(nativeNode, displayArrowStr.c_str());
337     return panda::JSValueRef::Undefined(vm);
338 }
ResetSwiperDisplayArrow(ArkUIRuntimeCallInfo * runtimeCallInfo)339 ArkUINativeModuleValue SwiperBridge::ResetSwiperDisplayArrow(ArkUIRuntimeCallInfo* runtimeCallInfo)
340 {
341     EcmaVM* vm = runtimeCallInfo->GetVM();
342     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
343     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
344     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
345     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
346     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperDisplayArrow(nativeNode);
347     return panda::JSValueRef::Undefined(vm);
348 }
SetSwiperCurve(ArkUIRuntimeCallInfo * runtimeCallInfo)349 ArkUINativeModuleValue SwiperBridge::SetSwiperCurve(ArkUIRuntimeCallInfo* runtimeCallInfo)
350 {
351     EcmaVM* vm = runtimeCallInfo->GetVM();
352     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
353     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
354     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
355     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
356     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
357     if (valueArg->IsString(vm)) {
358         std::string curve = valueArg->ToString(vm)->ToString(vm);
359         GetArkUINodeModifiers()->getSwiperModifier()->setSwiperCurve(nativeNode, curve.c_str());
360     } else {
361         GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperCurve(nativeNode);
362     }
363     return panda::JSValueRef::Undefined(vm);
364 }
ResetSwiperCurve(ArkUIRuntimeCallInfo * runtimeCallInfo)365 ArkUINativeModuleValue SwiperBridge::ResetSwiperCurve(ArkUIRuntimeCallInfo* runtimeCallInfo)
366 {
367     EcmaVM* vm = runtimeCallInfo->GetVM();
368     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
369     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
370     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
371     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
372     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperCurve(nativeNode);
373     return panda::JSValueRef::Undefined(vm);
374 }
SetSwiperDisableSwipe(ArkUIRuntimeCallInfo * runtimeCallInfo)375 ArkUINativeModuleValue SwiperBridge::SetSwiperDisableSwipe(ArkUIRuntimeCallInfo* runtimeCallInfo)
376 {
377     EcmaVM* vm = runtimeCallInfo->GetVM();
378     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
379     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
380     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
381     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
382     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
383     if (valueArg->IsBoolean()) {
384         bool disableswipe = valueArg->ToBoolean(vm)->Value();
385         GetArkUINodeModifiers()->getSwiperModifier()->setSwiperDisableSwipe(nativeNode, disableswipe);
386     } else {
387         GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperDisableSwipe(nativeNode);
388     }
389     return panda::JSValueRef::Undefined(vm);
390 }
ResetSwiperDisableSwipe(ArkUIRuntimeCallInfo * runtimeCallInfo)391 ArkUINativeModuleValue SwiperBridge::ResetSwiperDisableSwipe(ArkUIRuntimeCallInfo* runtimeCallInfo)
392 {
393     EcmaVM* vm = runtimeCallInfo->GetVM();
394     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
395     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
396     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
397     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
398     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperDisableSwipe(nativeNode);
399     return panda::JSValueRef::Undefined(vm);
400 }
SetSwiperEffectMode(ArkUIRuntimeCallInfo * runtimeCallInfo)401 ArkUINativeModuleValue SwiperBridge::SetSwiperEffectMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
402 {
403     EcmaVM* vm = runtimeCallInfo->GetVM();
404     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
405     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
406     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
407     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
408     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
409     if (valueArg->IsNumber()) {
410         auto edgeEffect = valueArg->Int32Value(vm);
411         GetArkUINodeModifiers()->getSwiperModifier()->setSwiperEffectMode(nativeNode, edgeEffect);
412     } else {
413         GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperEffectMode(nativeNode);
414     }
415     return panda::JSValueRef::Undefined(vm);
416 }
ResetSwiperEffectMode(ArkUIRuntimeCallInfo * runtimeCallInfo)417 ArkUINativeModuleValue SwiperBridge::ResetSwiperEffectMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
418 {
419     EcmaVM* vm = runtimeCallInfo->GetVM();
420     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
421     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
422     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
423     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
424     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperEffectMode(nativeNode);
425     return panda::JSValueRef::Undefined(vm);
426 }
SetSwiperCachedCount(ArkUIRuntimeCallInfo * runtimeCallInfo)427 ArkUINativeModuleValue SwiperBridge::SetSwiperCachedCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
428 {
429     EcmaVM* vm = runtimeCallInfo->GetVM();
430     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
431     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
432     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
433     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
434     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
435     if (valueArg->IsNumber()) {
436         int32_t cachedCount = valueArg->Int32Value(vm);
437         GetArkUINodeModifiers()->getSwiperModifier()->setSwiperCachedCount(nativeNode, cachedCount);
438     } else {
439         GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperCachedCount(nativeNode);
440     }
441     return panda::JSValueRef::Undefined(vm);
442 }
ResetSwiperCachedCount(ArkUIRuntimeCallInfo * runtimeCallInfo)443 ArkUINativeModuleValue SwiperBridge::ResetSwiperCachedCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
444 {
445     EcmaVM* vm = runtimeCallInfo->GetVM();
446     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
447     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
448     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
449     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
450     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperCachedCount(nativeNode);
451     return panda::JSValueRef::Undefined(vm);
452 }
SetSwiperIsShown(ArkUIRuntimeCallInfo * runtimeCallInfo)453 ArkUINativeModuleValue SwiperBridge::SetSwiperIsShown(ArkUIRuntimeCallInfo* runtimeCallInfo)
454 {
455     EcmaVM* vm = runtimeCallInfo->GetVM();
456     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
457     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
458     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
459     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
460     bool isShown = valueArg->ToBoolean(vm)->Value();
461     GetArkUINodeModifiers()->getSwiperModifier()->setSwiperIsShown(nativeNode, isShown);
462     return panda::JSValueRef::Undefined(vm);
463 }
ResetSwiperIsShown(ArkUIRuntimeCallInfo * runtimeCallInfo)464 ArkUINativeModuleValue SwiperBridge::ResetSwiperIsShown(ArkUIRuntimeCallInfo* runtimeCallInfo)
465 {
466     EcmaVM* vm = runtimeCallInfo->GetVM();
467     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
468     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
469     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
470     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperIsShown(nativeNode);
471     return panda::JSValueRef::Undefined(vm);
472 }
SetSwiperDisplayMode(ArkUIRuntimeCallInfo * runtimeCallInfo)473 ArkUINativeModuleValue SwiperBridge::SetSwiperDisplayMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
474 {
475     EcmaVM* vm = runtimeCallInfo->GetVM();
476     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
477     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
478     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
479     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
480     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
481     if (valueArg->IsNumber()) {
482         int32_t index = valueArg->Int32Value(vm);
483         GetArkUINodeModifiers()->getSwiperModifier()->setSwiperDisplayMode(nativeNode, index);
484     } else {
485         GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperDisplayMode(nativeNode);
486     }
487     return panda::JSValueRef::Undefined(vm);
488 }
ResetSwiperDisplayMode(ArkUIRuntimeCallInfo * runtimeCallInfo)489 ArkUINativeModuleValue SwiperBridge::ResetSwiperDisplayMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
490 {
491     EcmaVM* vm = runtimeCallInfo->GetVM();
492     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
493     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
494     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
495     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
496     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperDisplayMode(nativeNode);
497     return panda::JSValueRef::Undefined(vm);
498 }
SetSwiperItemSpace(ArkUIRuntimeCallInfo * runtimeCallInfo)499 ArkUINativeModuleValue SwiperBridge::SetSwiperItemSpace(ArkUIRuntimeCallInfo* runtimeCallInfo)
500 {
501     EcmaVM* vm = runtimeCallInfo->GetVM();
502     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
503     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
504     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
505     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
506     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
507     Ace::CalcDimension itemSpace;
508     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, valueArg, itemSpace) || LessNotEqual(itemSpace.Value(), 0.0)) {
509         itemSpace.SetValue(0.0);
510     }
511     int32_t itemSpaceUnit = static_cast<int32_t>(itemSpace.Unit());
512     GetArkUINodeModifiers()->getSwiperModifier()->setSwiperItemSpace(nativeNode, itemSpace.Value(), itemSpaceUnit);
513     return panda::JSValueRef::Undefined(vm);
514 }
ResetSwiperItemSpace(ArkUIRuntimeCallInfo * runtimeCallInfo)515 ArkUINativeModuleValue SwiperBridge::ResetSwiperItemSpace(ArkUIRuntimeCallInfo* runtimeCallInfo)
516 {
517     EcmaVM* vm = runtimeCallInfo->GetVM();
518     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
519     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
520     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
521     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
522     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperItemSpace(nativeNode);
523     return panda::JSValueRef::Undefined(vm);
524 }
SetSwiperVertical(ArkUIRuntimeCallInfo * runtimeCallInfo)525 ArkUINativeModuleValue SwiperBridge::SetSwiperVertical(ArkUIRuntimeCallInfo* runtimeCallInfo)
526 {
527     EcmaVM* vm = runtimeCallInfo->GetVM();
528     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
529     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
530     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
531     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
532     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
533     if (valueArg->IsBoolean()) {
534         bool isVertical = valueArg->ToBoolean(vm)->Value();
535         GetArkUINodeModifiers()->getSwiperModifier()->setSwiperVertical(nativeNode, isVertical);
536     } else {
537         GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperVertical(nativeNode);
538     }
539     return panda::JSValueRef::Undefined(vm);
540 }
ResetSwiperVertical(ArkUIRuntimeCallInfo * runtimeCallInfo)541 ArkUINativeModuleValue SwiperBridge::ResetSwiperVertical(ArkUIRuntimeCallInfo* runtimeCallInfo)
542 {
543     EcmaVM* vm = runtimeCallInfo->GetVM();
544     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
545     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
546     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
547     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
548     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperVertical(nativeNode);
549     return panda::JSValueRef::Undefined(vm);
550 }
SetSwiperLoop(ArkUIRuntimeCallInfo * runtimeCallInfo)551 ArkUINativeModuleValue SwiperBridge::SetSwiperLoop(ArkUIRuntimeCallInfo* runtimeCallInfo)
552 {
553     EcmaVM* vm = runtimeCallInfo->GetVM();
554     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
555     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
556     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
557     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
558     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
559     if (valueArg->IsBoolean()) {
560         bool loop = valueArg->ToBoolean(vm)->Value();
561         GetArkUINodeModifiers()->getSwiperModifier()->setSwiperLoop(nativeNode, loop);
562     } else {
563         GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperLoop(nativeNode);
564     }
565     return panda::JSValueRef::Undefined(vm);
566 }
ResetSwiperLoop(ArkUIRuntimeCallInfo * runtimeCallInfo)567 ArkUINativeModuleValue SwiperBridge::ResetSwiperLoop(ArkUIRuntimeCallInfo* runtimeCallInfo)
568 {
569     EcmaVM* vm = runtimeCallInfo->GetVM();
570     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
571     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
572     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
573     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
574     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperLoop(nativeNode);
575     return panda::JSValueRef::Undefined(vm);
576 }
SetSwiperInterval(ArkUIRuntimeCallInfo * runtimeCallInfo)577 ArkUINativeModuleValue SwiperBridge::SetSwiperInterval(ArkUIRuntimeCallInfo* runtimeCallInfo)
578 {
579     EcmaVM* vm = runtimeCallInfo->GetVM();
580     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
581     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
582     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
583     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
584     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
585     if (valueArg->IsNumber()) {
586         int32_t interval = valueArg->Int32Value(vm);
587         GetArkUINodeModifiers()->getSwiperModifier()->setSwiperInterval(nativeNode, interval);
588     } else {
589         GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperInterval(nativeNode);
590     }
591     return panda::JSValueRef::Undefined(vm);
592 }
ResetSwiperInterval(ArkUIRuntimeCallInfo * runtimeCallInfo)593 ArkUINativeModuleValue SwiperBridge::ResetSwiperInterval(ArkUIRuntimeCallInfo* runtimeCallInfo)
594 {
595     EcmaVM* vm = runtimeCallInfo->GetVM();
596     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
597     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
598     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
599     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
600     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperInterval(nativeNode);
601     return panda::JSValueRef::Undefined(vm);
602 }
SetSwiperAutoPlay(ArkUIRuntimeCallInfo * runtimeCallInfo)603 ArkUINativeModuleValue SwiperBridge::SetSwiperAutoPlay(ArkUIRuntimeCallInfo* runtimeCallInfo)
604 {
605     EcmaVM* vm = runtimeCallInfo->GetVM();
606     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
607     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
608     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
609     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
610     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
611     if (valueArg->IsBoolean()) {
612         bool autoPlay = valueArg->ToBoolean(vm)->Value();
613         GetArkUINodeModifiers()->getSwiperModifier()->setSwiperAutoPlay(nativeNode, autoPlay);
614     } else {
615         GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperAutoPlay(nativeNode);
616         return panda::JSValueRef::Undefined(vm);
617     }
618 
619     Local<JSValueRef> jsStopWhenTouchedArg = runtimeCallInfo->GetCallArgRef(STOP_WHEN_TOUCHED);
620     bool neddStopWhenTouched = true;
621     if (!jsStopWhenTouchedArg->IsNull() && !jsStopWhenTouchedArg->IsUndefined() && jsStopWhenTouchedArg->IsBoolean()) {
622         neddStopWhenTouched = jsStopWhenTouchedArg->ToBoolean(vm)->Value();
623     }
624     GetArkUINodeModifiers()->getSwiperModifier()->setSwiperStopWhenTouched(nativeNode, neddStopWhenTouched);
625     return panda::JSValueRef::Undefined(vm);
626 }
ResetSwiperAutoPlay(ArkUIRuntimeCallInfo * runtimeCallInfo)627 ArkUINativeModuleValue SwiperBridge::ResetSwiperAutoPlay(ArkUIRuntimeCallInfo* runtimeCallInfo)
628 {
629     EcmaVM* vm = runtimeCallInfo->GetVM();
630     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
631     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
632     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
633     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
634     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperAutoPlay(nativeNode);
635     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperStopWhenTouched(nativeNode);
636     return panda::JSValueRef::Undefined(vm);
637 }
SetSwiperIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)638 ArkUINativeModuleValue SwiperBridge::SetSwiperIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
639 {
640     EcmaVM* vm = runtimeCallInfo->GetVM();
641     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
642     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
643     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
644     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
645     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
646     if (valueArg->IsNumber()) {
647         int32_t index = valueArg->Int32Value(vm);
648         GetArkUINodeModifiers()->getSwiperModifier()->setSwiperIndex(nativeNode, index, DEFAULT_ANIMATION_MODE);
649     } else {
650         GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperIndex(nativeNode);
651     }
652     return panda::JSValueRef::Undefined(vm);
653 }
ResetSwiperIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)654 ArkUINativeModuleValue SwiperBridge::ResetSwiperIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
655 {
656     EcmaVM* vm = runtimeCallInfo->GetVM();
657     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
658     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
659     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
660     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
661     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperIndex(nativeNode);
662     return panda::JSValueRef::Undefined(vm);
663 }
GetStringByValueRef(const EcmaVM * vm,const Local<JSValueRef> & jsValue)664 std::string GetStringByValueRef(const EcmaVM* vm, const Local<JSValueRef>& jsValue)
665 {
666     std::string result = "-";
667     if (jsValue->IsUndefined()) {
668         return result;
669     }
670     CalcDimension calc;
671     result = ArkTSUtils::ParseJsDimension(vm, jsValue, calc, DimensionUnit::VP, true)
672                  ? (calc.Unit() == DimensionUnit::PERCENT
673                            ? (std::to_string(calc.Value() * DEFAULT_PERCENT_VALUE) + "%")
674                            : (std::to_string(calc.Value()) + GetDimensionUnitString(calc.Unit())))
675                  : "0.0_vp";
676     return result;
677 }
GetIntStringByValueRef(const EcmaVM * vm,const Local<JSValueRef> & jsValue)678 std::string GetIntStringByValueRef(const EcmaVM* vm, const Local<JSValueRef>& jsValue)
679 {
680     std::string result = "-";
681     if (jsValue->IsUndefined()) {
682         return result;
683     }
684     int32_t intValue;
685     result = ArkTSUtils::ParseJsInteger(vm, jsValue, intValue) ? std::to_string(intValue) : "0";
686     return result;
687 }
688 
ParseBottom(const EcmaVM * vm,const Local<JSValueRef> & jsValue,bool hasIgnoreSize)689 std::string ParseBottom(const EcmaVM* vm, const Local<JSValueRef>& jsValue, bool hasIgnoreSize)
690 {
691     std::string bottom = "-";
692     if (jsValue->IsUndefined()) {
693         return bottom;
694     }
695     if (hasIgnoreSize) {
696         CalcDimension bottomcCalc;
697         bool parseOK =  ArkTSUtils::ParseJsLengthMetrics(vm, jsValue, bottomcCalc);
698         if (!parseOK) {
699             bottom = GetIntStringByValueRef(vm, jsValue);
700             return bottom;
701         } else {
702             bottomcCalc = bottomcCalc > 0.0_vp ? bottomcCalc : 0.0_vp;
703             bottom = bottomcCalc.ToString();
704             return bottom;
705         }
706     } else {
707         bottom = GetIntStringByValueRef(vm, jsValue);
708         return bottom;
709     }
710 }
711 
ParseIgrnoreSize(const EcmaVM * vm,const Local<JSValueRef> & jsValue,bool hasIgrnoreSize)712 std::optional<bool> ParseIgrnoreSize(const EcmaVM* vm, const Local<JSValueRef>& jsValue, bool hasIgrnoreSize)
713 {
714     std::optional<bool> ignoreSize;
715     if (!hasIgrnoreSize) {
716         return ignoreSize;
717     }
718     ignoreSize = false;
719     if (!jsValue->IsNull() && !jsValue->IsUndefined() && jsValue->IsBoolean()) {
720         ignoreSize = jsValue->ToBoolean(vm)->Value();
721     }
722     return ignoreSize;
723 }
724 
ParseSpace(const EcmaVM * vm,const Local<JSValueRef> & jsValue)725 std::string ParseSpace(const EcmaVM* vm, const Local<JSValueRef>& jsValue)
726 {
727     std::string result = "-";
728     if (jsValue->IsUndefined()) {
729         return result;
730     }
731     CalcDimension calc;
732     bool parseOK =  ArkTSUtils::ParseJsLengthMetrics(vm, jsValue, calc);
733     calc = (parseOK && !(calc < 0.0_vp) && calc.Unit() != DimensionUnit::PERCENT) ?
734         calc : 8.0_vp;
735     return calc.ToString();
736 }
737 
GetSpaceAndBottom(ArkUIRuntimeCallInfo * runtimeCallInfo,EcmaVM * vm,std::string & bottom,std::string & spaceAndIgnoreSize)738 void GetSpaceAndBottom(ArkUIRuntimeCallInfo* runtimeCallInfo, EcmaVM* vm, std::string& bottom,
739     std::string& spaceAndIgnoreSize)
740 {
741     Local<JSValueRef> bottomArg = runtimeCallInfo->GetCallArgRef(DOT_INDICATOR_BOTTOM);
742     Local<JSValueRef> spaceArg = runtimeCallInfo->GetCallArgRef(DOT_INDICATOR_SPACE);
743     Local<JSValueRef> ignoreSizeArg = runtimeCallInfo->GetCallArgRef(DOT_INDICATOR_IGNORE_SIZE);
744     Local<JSValueRef> setIgnoreSizeArg = runtimeCallInfo->GetCallArgRef(DOT_INDICATOR_SET_IGNORE_SIZE);
745 
746     auto hasIgnoreSize = (setIgnoreSizeArg->IsBoolean() && setIgnoreSizeArg->ToBoolean(vm)->Value()) ? true : false;
747     std::optional<bool> ignoreSize = ParseIgrnoreSize(vm, ignoreSizeArg, hasIgnoreSize);
748     std::string ignoreSizeStr = "-";
749     if (ignoreSize.has_value()) {
750         ignoreSizeStr = ignoreSize.value()  ? "1" : "0";
751     }
752 
753     std::string setIgnoreSizeStr = "-";
754     if (!setIgnoreSizeArg->IsUndefined()) {
755         setIgnoreSizeStr = setIgnoreSizeArg->ToBoolean(vm)->Value() ? "1" : "0";
756     }
757 
758     bottom = ParseBottom(vm, bottomArg, hasIgnoreSize);
759     std::string space = ParseSpace(vm, spaceArg);
760     spaceAndIgnoreSize =  space + "|" + ignoreSizeStr + "|" + setIgnoreSizeStr;
761 }
762 
GetSwiperDotIndicator(ArkUIRuntimeCallInfo * runtimeCallInfo,EcmaVM * vm)763 std::string GetSwiperDotIndicator(ArkUIRuntimeCallInfo* runtimeCallInfo, EcmaVM* vm)
764 {
765     Local<JSValueRef> itemWidthArg = runtimeCallInfo->GetCallArgRef(DOT_INDICATOR_ITEM_WIDTH);
766     Local<JSValueRef> itemHeightArg = runtimeCallInfo->GetCallArgRef(DOT_INDICATOR_ITEM_HEIGHT);
767     Local<JSValueRef> selectedItemWidthArg = runtimeCallInfo->GetCallArgRef(DOT_INDICATOR_SELECTED_ITEM_WIDTH);
768     Local<JSValueRef> selectedItemHeightArg = runtimeCallInfo->GetCallArgRef(DOT_INDICATOR_SELECTED_ITEM_HEIGHT);
769     Local<JSValueRef> maskArg = runtimeCallInfo->GetCallArgRef(DOT_INDICATOR_MASK);
770     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(DOT_INDICATOR_COLOR);
771     Local<JSValueRef> selectedColorArg = runtimeCallInfo->GetCallArgRef(DOT_INDICATOR_SELECTED_COLOR);
772     Local<JSValueRef> leftArg = runtimeCallInfo->GetCallArgRef(DOT_INDICATOR_LEFT);
773     Local<JSValueRef> topArg = runtimeCallInfo->GetCallArgRef(DOT_INDICATOR_TOP);
774     Local<JSValueRef> rightArg = runtimeCallInfo->GetCallArgRef(DOT_INDICATOR_RIGHT);
775 
776     CalcDimension calc;
777     std::string itemWidth = ArkTSUtils::ParseJsDimension(vm, itemWidthArg, calc, DimensionUnit::VP, false)
778                                 ? std::to_string(calc.Value()) + GetDimensionUnitString(calc.Unit())
779                                 : "-";
780     std::string itemHeight = ArkTSUtils::ParseJsDimension(vm, itemHeightArg, calc, DimensionUnit::VP, false)
781                                  ? std::to_string(calc.Value()) + GetDimensionUnitString(calc.Unit())
782                                  : "-";
783     std::string selectedItemWidth =
784         ArkTSUtils::ParseJsDimension(vm, selectedItemWidthArg, calc, DimensionUnit::VP, false)
785             ? std::to_string(calc.Value()) + GetDimensionUnitString(calc.Unit())
786             : "-";
787     std::string selectedItemHeight =
788         ArkTSUtils::ParseJsDimension(vm, selectedItemHeightArg, calc, DimensionUnit::VP, false)
789             ? std::to_string(calc.Value()) + GetDimensionUnitString(calc.Unit())
790             : "-";
791     std::string mask = "2";
792     if (!maskArg->IsUndefined()) {
793         mask = maskArg->ToBoolean(vm)->Value() ? "1" : "0";
794     }
795     Color color;
796     std::string colorStr = ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color) ? std::to_string(color.GetValue()) : "-";
797     std::string selectedColor =
798         ArkTSUtils::ParseJsColorAlpha(vm, selectedColorArg, color) ? std::to_string(color.GetValue()) : "-";
799     std::string left = GetStringByValueRef(vm, leftArg);
800     std::string top = GetStringByValueRef(vm, topArg);
801     std::string right = GetStringByValueRef(vm, rightArg);
802     Local<JSValueRef> maxDisplayCountArg = runtimeCallInfo->GetCallArgRef(DOT_INDICATOR_MAX_DISPLAY_COUNT);
803     auto maxDisplayCount = GetIntStringByValueRef(vm, maxDisplayCountArg);
804     std::string bottom = "-";
805     std::string spaceAndIgnoreSize = "-";
806     GetSpaceAndBottom(runtimeCallInfo, vm, bottom, spaceAndIgnoreSize);
807     std::string indicatorStr = itemWidth + "|" + itemHeight + "|" + selectedItemWidth + "|" +
808                                selectedItemHeight + "|" + mask + "|" + colorStr + "|" + selectedColor + "|" + left +
809                                "|" + top + "|" + right + "|" + bottom + "|" + maxDisplayCount + "|" +
810                                spaceAndIgnoreSize;
811     return indicatorStr;
812 }
GetSwiperDigitIndicator(ArkUIRuntimeCallInfo * runtimeCallInfo,EcmaVM * vm)813 std::string GetSwiperDigitIndicator(ArkUIRuntimeCallInfo* runtimeCallInfo, EcmaVM* vm)
814 {
815     Local<JSValueRef> fontColorArg = runtimeCallInfo->GetCallArgRef(DIGIT_INDICATOR_FONT_COLOR);
816     Local<JSValueRef> selectedFontColorArg = runtimeCallInfo->GetCallArgRef(DIGIT_INDICATOR_SELECTED_FONT_COLOR);
817     Local<JSValueRef> digitFontSizeArg = runtimeCallInfo->GetCallArgRef(DIGIT_INDICATOR_DIGIT_FONT_SIZE);
818     Local<JSValueRef> digitFontWeightArg = runtimeCallInfo->GetCallArgRef(DIGIT_INDICATOR_DIGIT_FONT_WEIGHT);
819     Local<JSValueRef> selectedDigitFontSizeArg =
820         runtimeCallInfo->GetCallArgRef(DIGIT_INDICATOR_SELECTED_DIGIT_FONT_SIZE);
821     Local<JSValueRef> selectedDigitFontWeightArg =
822         runtimeCallInfo->GetCallArgRef(DIGIT_INDICATOR_SELECTED_DIGIT_FONT_WEIGHT);
823     Local<JSValueRef> leftArg = runtimeCallInfo->GetCallArgRef(DIGIT_INDICATOR_LEFT);
824     Local<JSValueRef> topArg = runtimeCallInfo->GetCallArgRef(DIGIT_INDICATOR_TOP);
825     Local<JSValueRef> rightArg = runtimeCallInfo->GetCallArgRef(DIGIT_INDICATOR_RIGHT);
826     Local<JSValueRef> bottomArg = runtimeCallInfo->GetCallArgRef(DIGIT_INDICATOR_BOTTOM);
827     Local<JSValueRef> ignoreSizeArg = runtimeCallInfo->GetCallArgRef(DIGIT_INDICATOR_IGNORE_SIZE);
828     Local<JSValueRef> setIgnoreSizeArg = runtimeCallInfo->GetCallArgRef(DIGIT_INDICATOR_SET_IGNORE_SIZE);
829     Color color;
830     CalcDimension calc;
831     std::string fontColor =
832         ArkTSUtils::ParseJsColorAlpha(vm, fontColorArg, color) ? std::to_string(color.GetValue()) : "-";
833     std::string selectedFontColor =
834         ArkTSUtils::ParseJsColorAlpha(vm, selectedFontColorArg, color) ? std::to_string(color.GetValue()) : "-";
835     std::string digitFontSize = ArkTSUtils::ParseJsDimension(vm, digitFontSizeArg, calc, DimensionUnit::FP, false)
836                                     ? std::to_string(calc.Value()) + GetDimensionUnitString(calc.Unit())
837                                     : "-";
838     std::string digitFontWeight = digitFontWeightArg->ToString(vm)->ToString(vm);
839     std::string selectedDigitFontSize =
840         ArkTSUtils::ParseJsDimension(vm, selectedDigitFontSizeArg, calc, DimensionUnit::FP, false)
841             ? std::to_string(calc.Value()) + GetDimensionUnitString(calc.Unit())
842             : "-";
843     std::string selectedDigitFontWeight = selectedDigitFontWeightArg->ToString(vm)->ToString(vm);
844     std::string left = GetStringByValueRef(vm, leftArg);
845     std::string top = GetStringByValueRef(vm, topArg);
846     std::string right = GetStringByValueRef(vm, rightArg);
847 
848     std::string setIgnoreSize = "-";
849     if (!setIgnoreSizeArg->IsUndefined()) {
850         setIgnoreSize = setIgnoreSizeArg->ToBoolean(vm)->Value() ? "1" : "0";
851     }
852 
853     auto hasIgnoreSize = (setIgnoreSizeArg->IsBoolean() && setIgnoreSizeArg->ToBoolean(vm)->Value()) ? true : false;
854     std::optional<bool> ignoreSize = ParseIgrnoreSize(vm, ignoreSizeArg, hasIgnoreSize);
855     std::string ignoreSizeStr = "-";
856     if (ignoreSize.has_value()) {
857         ignoreSizeStr = ignoreSize.value()  ? "1" : "0";
858     }
859     std::string bottom = ParseBottom(vm, bottomArg, hasIgnoreSize);
860     std::string indicatorStr = fontColor + "|" + selectedFontColor + "|" + digitFontSize + "|" + digitFontWeight +
861                    "|" + selectedDigitFontSize + "|" + selectedDigitFontWeight + "|" + left + "|" + top + "|" + right +
862                    "|" + bottom + "|" + ignoreSizeStr + "|" + setIgnoreSize;
863     return indicatorStr;
864 }
SetSwiperIndicator(ArkUIRuntimeCallInfo * runtimeCallInfo)865 ArkUINativeModuleValue SwiperBridge::SetSwiperIndicator(ArkUIRuntimeCallInfo* runtimeCallInfo)
866 {
867     EcmaVM* vm = runtimeCallInfo->GetVM();
868     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
869     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
870     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
871     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
872     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
873     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
874     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
875 
876     std::string type = valueArg->ToString(vm)->ToString(vm);
877     std::string indicatorStr = "";
878     if (type == "boolean") {
879         Local<JSValueRef> indicatorArg = runtimeCallInfo->GetCallArgRef(INDICATOR_VALUE_INDEX);
880         std::string indicator = indicatorArg->ToBoolean(vm)->Value() ? "1" : "0";
881         indicatorStr = type + "|" + indicator;
882     } else if (type == "ArkDotIndicator") {
883         indicatorStr = type + "|" + GetSwiperDotIndicator(runtimeCallInfo, vm);
884     } else if (type == "ArkDigitIndicator") {
885         indicatorStr = type + "|" + GetSwiperDigitIndicator(runtimeCallInfo, vm);
886     } else if (type == "IndicatorComponentController") {
887         Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
888         Framework::JSIndicatorController* jsController =
889             Framework::JSRef<Framework::JSObject>::Cast(info[INDICATOR_VALUE_INDEX])
890                 ->Unwrap<Framework::JSIndicatorController>();
891         if (jsController) {
892             WeakPtr<NG::UINode> targetNode = AceType::WeakClaim(frameNode);
893             jsController->SetSwiperNode(targetNode);
894         }
895         indicatorStr = "IndicatorComponentController|";
896     } else {
897         indicatorStr = "boolean|1";
898     }
899     GetArkUINodeModifiers()->getSwiperModifier()->setSwiperIndicator(nativeNode, indicatorStr.c_str());
900     return panda::JSValueRef::Undefined(vm);
901 }
ResetSwiperIndicator(ArkUIRuntimeCallInfo * runtimeCallInfo)902 ArkUINativeModuleValue SwiperBridge::ResetSwiperIndicator(ArkUIRuntimeCallInfo* runtimeCallInfo)
903 {
904     EcmaVM* vm = runtimeCallInfo->GetVM();
905     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
906     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
907     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
908     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
909     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperIndicator(nativeNode);
910     return panda::JSValueRef::Undefined(vm);
911 }
SetSwiperDuration(ArkUIRuntimeCallInfo * runtimeCallInfo)912 ArkUINativeModuleValue SwiperBridge::SetSwiperDuration(ArkUIRuntimeCallInfo* runtimeCallInfo)
913 {
914     EcmaVM* vm = runtimeCallInfo->GetVM();
915     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
916     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
917     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
918     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
919     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
920     if (valueArg->IsNumber()) {
921         int32_t duration = valueArg->Int32Value(vm);
922         GetArkUINodeModifiers()->getSwiperModifier()->setSwiperDuration(nativeNode, duration);
923     } else {
924         GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperDuration(nativeNode);
925     }
926     return panda::JSValueRef::Undefined(vm);
927 }
928 
ResetSwiperDuration(ArkUIRuntimeCallInfo * runtimeCallInfo)929 ArkUINativeModuleValue SwiperBridge::ResetSwiperDuration(ArkUIRuntimeCallInfo* runtimeCallInfo)
930 {
931     EcmaVM* vm = runtimeCallInfo->GetVM();
932     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
933     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
934     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
935     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
936     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperDuration(nativeNode);
937     return panda::JSValueRef::Undefined(vm);
938 }
939 
SetSwiperEnabled(ArkUIRuntimeCallInfo * runtimeCallInfo)940 ArkUINativeModuleValue SwiperBridge::SetSwiperEnabled(ArkUIRuntimeCallInfo* runtimeCallInfo)
941 {
942     EcmaVM* vm = runtimeCallInfo->GetVM();
943     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
944     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
945     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
946     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
947     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
948     if (valueArg->IsBoolean()) {
949         bool enabled = valueArg->ToBoolean(vm)->Value();
950         GetArkUINodeModifiers()->getCommonModifier()->setEnabled(nativeNode, enabled);
951         GetArkUINodeModifiers()->getSwiperModifier()->setSwiperEnabled(nativeNode, enabled);
952     } else {
953         GetArkUINodeModifiers()->getCommonModifier()->resetEnabled(nativeNode);
954         GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperEnabled(nativeNode);
955     }
956     return panda::JSValueRef::Undefined(vm);
957 }
958 
ResetSwiperEnabled(ArkUIRuntimeCallInfo * runtimeCallInfo)959 ArkUINativeModuleValue SwiperBridge::ResetSwiperEnabled(ArkUIRuntimeCallInfo* runtimeCallInfo)
960 {
961     EcmaVM* vm = runtimeCallInfo->GetVM();
962     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
963     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
964     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
965     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
966     GetArkUINodeModifiers()->getCommonModifier()->resetEnabled(nativeNode);
967     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperEnabled(nativeNode);
968     return panda::JSValueRef::Undefined(vm);
969 }
970 
SetSwiperOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)971 ArkUINativeModuleValue SwiperBridge::SetSwiperOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
972 {
973     EcmaVM* vm = runtimeCallInfo->GetVM();
974     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
975     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
976     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
977     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
978     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
979     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
980         GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperOnChange(nativeNode);
981         return panda::JSValueRef::Undefined(vm);
982     }
983     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
984     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
985     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
986     std::function<void(const BaseEventInfo* info)> callback =
987         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](const BaseEventInfo* info) {
988         panda::LocalScope pandaScope(vm);
989         panda::TryCatch trycatch(vm);
990         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
991         const auto* swiperInfo = TypeInfoHelper::DynamicCast<SwiperChangeEvent>(info);
992         if (!swiperInfo) {
993             TAG_LOGW(AceLogTag::ACE_SWIPER, "Swiper onChange callback execute failed.");
994             return;
995         }
996         panda::Local<panda::NumberRef> indexParam = panda::NumberRef::New(vm, swiperInfo->GetIndex());
997         panda::Local<panda::JSValueRef> params[1] = { indexParam }; // 1: Array length
998         func->Call(vm, func.ToLocal(), params, 1); // 1: Array length
999     };
1000     GetArkUINodeModifiers()->getSwiperModifier()->setSwiperOnChange(nativeNode, reinterpret_cast<void*>(&callback));
1001     return panda::JSValueRef::Undefined(vm);
1002 }
1003 
ResetSwiperOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1004 ArkUINativeModuleValue SwiperBridge::ResetSwiperOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1005 {
1006     EcmaVM* vm = runtimeCallInfo->GetVM();
1007     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1008     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
1009     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1010     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1011     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperOnChange(nativeNode);
1012     return panda::JSValueRef::Undefined(vm);
1013 }
1014 
SetSwiperOnSelected(ArkUIRuntimeCallInfo * runtimeCallInfo)1015 ArkUINativeModuleValue SwiperBridge::SetSwiperOnSelected(ArkUIRuntimeCallInfo* runtimeCallInfo)
1016 {
1017     EcmaVM* vm = runtimeCallInfo->GetVM();
1018     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1019     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
1020     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
1021     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1022     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1023         GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperOnSelected(nativeNode);
1024         return panda::JSValueRef::Undefined(vm);
1025     }
1026     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1027     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1028     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1029     std::function<void(const BaseEventInfo* info)> callback =
1030         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](const BaseEventInfo* info) {
1031         panda::LocalScope pandaScope(vm);
1032         panda::TryCatch trycatch(vm);
1033         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1034         const auto* swiperInfo = TypeInfoHelper::DynamicCast<SwiperChangeEvent>(info);
1035         if (!swiperInfo) {
1036             TAG_LOGW(AceLogTag::ACE_SWIPER, "Swiper onSelected callback execute failed.");
1037             return;
1038         }
1039         panda::Local<panda::NumberRef> indexParam = panda::NumberRef::New(vm, swiperInfo->GetIndex());
1040         panda::Local<panda::JSValueRef> params[1] = { indexParam }; // 1: Array length
1041         func->Call(vm, func.ToLocal(), params, 1); // 1: Array length
1042     };
1043     GetArkUINodeModifiers()->getSwiperModifier()->setSwiperOnSelected(nativeNode, reinterpret_cast<void*>(&callback));
1044     return panda::JSValueRef::Undefined(vm);
1045 }
1046 
ResetSwiperOnSelected(ArkUIRuntimeCallInfo * runtimeCallInfo)1047 ArkUINativeModuleValue SwiperBridge::ResetSwiperOnSelected(ArkUIRuntimeCallInfo* runtimeCallInfo)
1048 {
1049     EcmaVM* vm = runtimeCallInfo->GetVM();
1050     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1051     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
1052     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1053     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperOnSelected(nativeNode);
1054     return panda::JSValueRef::Undefined(vm);
1055 }
1056 
SetSwiperOnAnimationStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1057 ArkUINativeModuleValue SwiperBridge::SetSwiperOnAnimationStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1058 {
1059     EcmaVM* vm = runtimeCallInfo->GetVM();
1060     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1061     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
1062     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
1063     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1064     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1065     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1066         GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperOnAnimationStart(nativeNode);
1067         return panda::JSValueRef::Undefined(vm);
1068     }
1069     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1070     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1071     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1072     std::function<void(int32_t, int32_t, const AnimationCallbackInfo&)> callback =
1073         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
1074         int32_t index, int32_t targetIndex, const AnimationCallbackInfo& extraInfo) {
1075         panda::LocalScope pandaScope(vm);
1076         panda::TryCatch trycatch(vm);
1077         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1078         panda::Local<panda::NumberRef> indexParam = panda::NumberRef::New(vm, index);
1079         panda::Local<panda::NumberRef> targetIndexParam = panda::NumberRef::New(vm, targetIndex);
1080         const char* keys[] = {"currentOffset", "targetOffset", "velocity"};
1081         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, extraInfo.currentOffset.value()),
1082             panda::NumberRef::New(vm, extraInfo.targetOffset.value()),
1083             panda::NumberRef::New(vm, extraInfo.velocity.value()) };
1084         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1085         panda::Local<panda::JSValueRef> params[3] = { indexParam, targetIndexParam, eventObject }; // 3: Array length
1086         func->Call(vm, func.ToLocal(), params, 3); // 3: Array length
1087     };
1088     GetArkUINodeModifiers()->getSwiperModifier()->setSwiperOnAnimationStart(nativeNode,
1089         reinterpret_cast<void*>(&callback));
1090     return panda::JSValueRef::Undefined(vm);
1091 }
1092 
ResetSwiperOnAnimationStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1093 ArkUINativeModuleValue SwiperBridge::ResetSwiperOnAnimationStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1094 {
1095     EcmaVM* vm = runtimeCallInfo->GetVM();
1096     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1097     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1098     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1099     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1100     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperOnAnimationStart(nativeNode);
1101     return panda::JSValueRef::Undefined(vm);
1102 }
1103 
SetSwiperOnAnimationEnd(ArkUIRuntimeCallInfo * runtimeCallInfo)1104 ArkUINativeModuleValue SwiperBridge::SetSwiperOnAnimationEnd(ArkUIRuntimeCallInfo* runtimeCallInfo)
1105 {
1106     EcmaVM* vm = runtimeCallInfo->GetVM();
1107     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1108     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
1109     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
1110     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1111     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1112     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1113         GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperOnAnimationEnd(nativeNode);
1114         return panda::JSValueRef::Undefined(vm);
1115     }
1116     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1117     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1118     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1119     std::function<void(int32_t, const AnimationCallbackInfo&)> callback = [vm, frameNode,
1120         func = panda::CopyableGlobal(vm, func)](int32_t index, const AnimationCallbackInfo& extraInfo) {
1121         panda::LocalScope pandaScope(vm);
1122         panda::TryCatch trycatch(vm);
1123         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1124         panda::Local<panda::NumberRef> indexParam = panda::NumberRef::New(vm, index);
1125         const char* keys[] = {"currentOffset", "targetOffset", "velocity"};
1126         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, extraInfo.currentOffset.value()),
1127             panda::NumberRef::New(vm, 0),
1128             panda::NumberRef::New(vm, 0) };
1129         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1130         panda::Local<panda::JSValueRef> params[2] = { indexParam, eventObject }; // 2: Array length
1131         func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
1132     };
1133     GetArkUINodeModifiers()->getSwiperModifier()->setSwiperOnAnimationEnd(nativeNode,
1134         reinterpret_cast<void*>(&callback));
1135     return panda::JSValueRef::Undefined(vm);
1136 }
1137 
ResetSwiperOnAnimationEnd(ArkUIRuntimeCallInfo * runtimeCallInfo)1138 ArkUINativeModuleValue SwiperBridge::ResetSwiperOnAnimationEnd(ArkUIRuntimeCallInfo* runtimeCallInfo)
1139 {
1140     EcmaVM* vm = runtimeCallInfo->GetVM();
1141     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1142     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1143     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1144     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1145     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperOnAnimationEnd(nativeNode);
1146     return panda::JSValueRef::Undefined(vm);
1147 }
1148 
SetSwiperOnGestureSwipe(ArkUIRuntimeCallInfo * runtimeCallInfo)1149 ArkUINativeModuleValue SwiperBridge::SetSwiperOnGestureSwipe(ArkUIRuntimeCallInfo* runtimeCallInfo)
1150 {
1151     EcmaVM* vm = runtimeCallInfo->GetVM();
1152     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1153     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
1154     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
1155     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1156     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1157     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1158         GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperOnGestureSwipe(nativeNode);
1159         return panda::JSValueRef::Undefined(vm);
1160     }
1161     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1162     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1163     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1164     std::function<void(int32_t, const AnimationCallbackInfo&)> callback = [vm, frameNode,
1165         func = panda::CopyableGlobal(vm, func)](int32_t index, const AnimationCallbackInfo& extraInfo) {
1166         panda::LocalScope pandaScope(vm);
1167         panda::TryCatch trycatch(vm);
1168         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1169         panda::Local<panda::NumberRef> indexParam = panda::NumberRef::New(vm, index);
1170         const char* keys[] = {"currentOffset", "targetOffset", "velocity"};
1171         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, extraInfo.currentOffset.value()),
1172             panda::NumberRef::New(vm, 0),
1173             panda::NumberRef::New(vm, 0) };
1174         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1175         panda::Local<panda::JSValueRef> params[2] = { indexParam, eventObject }; // 2: Array length
1176         func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
1177     };
1178     GetArkUINodeModifiers()->getSwiperModifier()->setSwiperOnGestureSwipe(nativeNode,
1179         reinterpret_cast<void*>(&callback));
1180     return panda::JSValueRef::Undefined(vm);
1181 }
1182 
ResetSwiperOnGestureSwipe(ArkUIRuntimeCallInfo * runtimeCallInfo)1183 ArkUINativeModuleValue SwiperBridge::ResetSwiperOnGestureSwipe(ArkUIRuntimeCallInfo* runtimeCallInfo)
1184 {
1185     EcmaVM* vm = runtimeCallInfo->GetVM();
1186     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1187     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1188     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1189     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1190     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperOnGestureSwipe(nativeNode);
1191     return panda::JSValueRef::Undefined(vm);
1192 }
1193 
SetSwiperOnUnselected(ArkUIRuntimeCallInfo * runtimeCallInfo)1194 ArkUINativeModuleValue SwiperBridge::SetSwiperOnUnselected(ArkUIRuntimeCallInfo* runtimeCallInfo)
1195 {
1196     EcmaVM* vm = runtimeCallInfo->GetVM();
1197     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1198     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
1199     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
1200     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1201     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1202         GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperOnUnselected(nativeNode);
1203         return panda::JSValueRef::Undefined(vm);
1204     }
1205     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1206     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1207     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1208     std::function<void(const BaseEventInfo* info)> callback =
1209         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](const BaseEventInfo* info) {
1210         panda::LocalScope pandaScope(vm);
1211         panda::TryCatch trycatch(vm);
1212         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1213         const auto* swiperInfo = TypeInfoHelper::DynamicCast<SwiperChangeEvent>(info);
1214         if (!swiperInfo) {
1215             TAG_LOGW(AceLogTag::ACE_SWIPER, "Swiper OnUnselected callback execute failed.");
1216             return;
1217         }
1218         panda::Local<panda::NumberRef> indexParam = panda::NumberRef::New(vm, swiperInfo->GetIndex());
1219         panda::Local<panda::JSValueRef> params[1] = { indexParam }; // 1: Array length
1220         func->Call(vm, func.ToLocal(), params, 1); // 1: Array length
1221     };
1222     GetArkUINodeModifiers()->getSwiperModifier()->setSwiperOnUnselected(nativeNode, reinterpret_cast<void*>(&callback));
1223     return panda::JSValueRef::Undefined(vm);
1224 }
1225 
ResetSwiperOnUnselected(ArkUIRuntimeCallInfo * runtimeCallInfo)1226 ArkUINativeModuleValue SwiperBridge::ResetSwiperOnUnselected(ArkUIRuntimeCallInfo* runtimeCallInfo)
1227 {
1228     EcmaVM* vm = runtimeCallInfo->GetVM();
1229     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1230     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
1231     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1232     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperOnUnselected(nativeNode);
1233     return panda::JSValueRef::Undefined(vm);
1234 }
1235 
SetSwiperCustomContentTransition(ArkUIRuntimeCallInfo * runtimeCallInfo)1236 ArkUINativeModuleValue SwiperBridge::SetSwiperCustomContentTransition(ArkUIRuntimeCallInfo* runtimeCallInfo)
1237 {
1238     EcmaVM* vm = runtimeCallInfo->GetVM();
1239     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1240     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
1241     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1242     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1243     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1244     using namespace OHOS::Ace::Framework;
1245     JsiCallbackInfo info = JsiCallbackInfo(runtimeCallInfo);
1246     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1247     if (info.Length() < 2 || !info[1]->IsObject()) { // 2: Array length
1248         return panda::JSValueRef::Undefined(vm);
1249     }
1250 
1251     SwiperContentAnimatedTransition transitionInfo;
1252     auto transitionObj = JSRef<JSObject>::Cast(info[1]);
1253     JSRef<JSVal> timeoutProperty = transitionObj->GetProperty("timeout");
1254     if (timeoutProperty->IsNumber()) {
1255         auto timeout = timeoutProperty->ToNumber<int32_t>();
1256         transitionInfo.timeout = timeout < 0 ? 0 : timeout;
1257     } else {
1258         transitionInfo.timeout = 0;
1259     }
1260 
1261     JSRef<JSVal> transition = transitionObj->GetProperty("transition");
1262     if (transition->IsFunction()) {
1263         auto jsOnTransition =
1264             AceType::MakeRefPtr<JsSwiperFunction>(JSRef<JSFunc>::Cast(transition));
1265         auto onTransition = [execCtx = info.GetExecutionContext(), func = std::move(jsOnTransition)](
1266                                 const RefPtr<SwiperContentTransitionProxy>& proxy) {
1267             JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
1268             ACE_SCORING_EVENT("Swiper.customContentTransition");
1269             func->Execute(proxy);
1270         };
1271         transitionInfo.transition = std::move(onTransition);
1272     }
1273     SwiperModelNG::SetCustomContentTransition(frameNode, transitionInfo);
1274     return panda::JSValueRef::Undefined(vm);
1275 }
1276 
ResetSwiperCustomContentTransition(ArkUIRuntimeCallInfo * runtimeCallInfo)1277 ArkUINativeModuleValue SwiperBridge::ResetSwiperCustomContentTransition(ArkUIRuntimeCallInfo* runtimeCallInfo)
1278 {
1279     EcmaVM* vm = runtimeCallInfo->GetVM();
1280     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1281     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
1282     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1283     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1284     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1285     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1286     SwiperContentAnimatedTransition transitionInfo;
1287     SwiperModelNG::SetCustomContentTransition(frameNode, transitionInfo);
1288     return panda::JSValueRef::Undefined(vm);
1289 }
1290 
SetOnContentDidScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)1291 ArkUINativeModuleValue SwiperBridge::SetOnContentDidScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
1292 {
1293     EcmaVM* vm = runtimeCallInfo->GetVM();
1294     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1295     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
1296     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
1297     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1298     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1299     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1300         GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperOnContentDidScroll(nativeNode);
1301         return panda::JSValueRef::Undefined(vm);
1302     }
1303     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1304     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1305     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1306     std::function<void(int32_t, int32_t, float_t, float_t)> callback = [vm, frameNode,
1307         func = panda::CopyableGlobal(vm, func)](int32_t selectedIndex, int32_t index,
1308         float position, float mainAxisLength) {
1309         panda::LocalScope pandaScope(vm);
1310         panda::TryCatch trycatch(vm);
1311         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1312         panda::Local<panda::NumberRef> selectedIndexParam = panda::NumberRef::New(vm, selectedIndex);
1313         panda::Local<panda::NumberRef> indexParam = panda::NumberRef::New(vm, index);
1314         panda::Local<panda::NumberRef> positionParam = panda::NumberRef::New(vm, position);
1315         panda::Local<panda::NumberRef> mainAxisLengthParam = panda::NumberRef::New(vm, mainAxisLength);
1316         panda::Local<panda::JSValueRef> params[4] = { selectedIndexParam, indexParam, // 4: Array length
1317             positionParam, mainAxisLengthParam };
1318         func->Call(vm, func.ToLocal(), params, 4); // 4: Array length
1319     };
1320     GetArkUINodeModifiers()->getSwiperModifier()->setSwiperOnContentDidScroll(nativeNode,
1321         reinterpret_cast<void*>(&callback));
1322     return panda::JSValueRef::Undefined(vm);
1323 }
1324 
ResetOnContentDidScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)1325 ArkUINativeModuleValue SwiperBridge::ResetOnContentDidScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
1326 {
1327     EcmaVM* vm = runtimeCallInfo->GetVM();
1328     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1329     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1330     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1331     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1332     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperOnContentDidScroll(nativeNode);
1333     return panda::JSValueRef::Undefined(vm);
1334 }
1335 
SetSwiperPageFlipMode(ArkUIRuntimeCallInfo * runtimeCallInfo)1336 ArkUINativeModuleValue SwiperBridge::SetSwiperPageFlipMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
1337 {
1338     EcmaVM* vm = runtimeCallInfo->GetVM();
1339     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1340     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
1341     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1342     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1343     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
1344     if (valueArg->IsNumber()) {
1345         int32_t pageFlipMode = valueArg->Int32Value(vm);
1346         GetArkUINodeModifiers()->getSwiperModifier()->setSwiperPageFlipMode(nativeNode, pageFlipMode);
1347     } else {
1348         GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperPageFlipMode(nativeNode);
1349     }
1350     return panda::JSValueRef::Undefined(vm);
1351 }
1352 
ResetSwiperPageFlipMode(ArkUIRuntimeCallInfo * runtimeCallInfo)1353 ArkUINativeModuleValue SwiperBridge::ResetSwiperPageFlipMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
1354 {
1355     EcmaVM* vm = runtimeCallInfo->GetVM();
1356     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1357     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
1358     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1359     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1360     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperPageFlipMode(nativeNode);
1361     return panda::JSValueRef::Undefined(vm);
1362 }
1363 
SetSwiperOnContentWillScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)1364 ArkUINativeModuleValue SwiperBridge::SetSwiperOnContentWillScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
1365 {
1366     EcmaVM* vm = runtimeCallInfo->GetVM();
1367     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1368     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_NODE_INDEX);
1369     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_VALUE_INDEX);
1370     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1371     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1372     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1373         GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperOnContentWillScroll(nativeNode);
1374         return panda::JSValueRef::Undefined(vm);
1375     }
1376     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1377     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1378     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1379     std::function<bool(const SwiperContentWillScrollResult&)> callback =
1380         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](const SwiperContentWillScrollResult& result) -> bool {
1381         panda::LocalScope pandaScope(vm);
1382         panda::TryCatch trycatch(vm);
1383         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1384         const char* keys[] = { "currentIndex", "comingIndex", "offset" };
1385         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, result.currentIndex),
1386             panda::NumberRef::New(vm, result.comingIndex), panda::NumberRef::New(vm, result.offset) };
1387         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1388         panda::Local<panda::JSValueRef> params[1] = { eventObject };
1389         auto ret = func->Call(vm, func.ToLocal(), params, 1);
1390         if (ret->IsBoolean()) {
1391             return ret->ToBoolean(vm)->Value();
1392         }
1393         return true;
1394     };
1395     GetArkUINodeModifiers()->getSwiperModifier()->setSwiperOnContentWillScroll(
1396         nativeNode, reinterpret_cast<bool*>(&callback));
1397     return panda::JSValueRef::Undefined(vm);
1398 }
1399 
ResetSwiperOnContentWillScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)1400 ArkUINativeModuleValue SwiperBridge::ResetSwiperOnContentWillScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
1401 {
1402     EcmaVM* vm = runtimeCallInfo->GetVM();
1403     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1404     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1405     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1406     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1407     GetArkUINodeModifiers()->getSwiperModifier()->resetSwiperOnContentWillScroll(nativeNode);
1408     return panda::JSValueRef::Undefined(vm);
1409 }
1410 } // namespace OHOS::Ace::NG