• 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_tabs_bridge.h"
16 
17 #include "base/log/ace_scoring_log.h"
18 #include "base/utils/utils.h"
19 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
20 #include "bridge/declarative_frontend/engine/functions/js_tabs_function.h"
21 #include "bridge/declarative_frontend/jsview/js_tabs.h"
22 #include "bridge/declarative_frontend/jsview/js_tabs_controller.h"
23 #include "core/components/common/properties/color.h"
24 #include "frameworks/bridge/common/utils/utils.h"
25 #include "frameworks/bridge/declarative_frontend/engine/js_types.h"
26 #include "frameworks/bridge/declarative_frontend/jsview/js_view_abstract.h"
27 #include "frameworks/core/components/tab_bar/tabs_event.h"
28 #include "core/components_ng/pattern/tabs/tabs_model_ng.h"
29 
30 namespace OHOS::Ace::NG {
31 constexpr int SIZE_OF_FIVE = 5;
32 constexpr int SIZE_OF_THREE = 3;
33 constexpr int SIZE_OF_VALUES = 2;
34 constexpr int TABS_ARG_INDEX_0 = 0;
35 constexpr int TABS_ARG_INDEX_1 = 1;
36 constexpr int TABS_ARG_INDEX_2 = 2;
37 constexpr int TABS_ARG_INDEX_3 = 3;
38 constexpr int TABS_ARG_INDEX_4 = 4;
39 constexpr int TABS_ARG_INDEX_5 = 5;
40 constexpr int TABS_ARG_INDEX_6 = 6;
41 constexpr int TABS_ARG_INDEX_7 = 7;
42 constexpr int TABS_ARG_INDEX_8 = 8;
43 constexpr int TABS_ARG_INDEX_9 = 9;
44 constexpr int32_t SM_COLUMN_NUM = 4;
45 constexpr int32_t MD_COLUMN_NUM = 8;
46 constexpr int32_t LG_COLUMN_NUM = 12;
47 constexpr int32_t DEFAULT_COLUMN = -1;
48 constexpr int REMAINDER = 2;
49 constexpr int TABBARMODE_SCROLLABLE = 1;
50 constexpr int32_t DEFAULT_CUSTOM_ANIMATION_TIMEOUT = 1000;
51 constexpr int ANIMATION_CURVE_TYPE_DEFAULT = 0;
52 constexpr int ANIMATION_CURVE_TYPE_STR = 1;
53 constexpr int ANIMATION_CURVE_TYPE_FUNC = 2;
54 namespace {
GetAnimationCurveInfo(ArkUIRuntimeCallInfo * runtimeCallInfo,ArkUI_Uint32 & type,std::string & aniTimFunc,std::function<float (float)> & customCallBack)55 void GetAnimationCurveInfo(ArkUIRuntimeCallInfo* runtimeCallInfo, ArkUI_Uint32& type, std::string& aniTimFunc,
56     std::function<float(float)>& customCallBack)
57 {
58     type = ANIMATION_CURVE_TYPE_DEFAULT;
59     aniTimFunc.clear();
60     customCallBack = nullptr;
61     CHECK_NULL_VOID(runtimeCallInfo);
62     EcmaVM* vm = runtimeCallInfo->GetVM();
63     CHECK_NULL_VOID(vm);
64     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
65     if (!valueArg->IsObject(vm)) {
66         return;
67     }
68     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
69     auto object = Framework::JSRef<Framework::JSObject>::Cast(info[TABS_ARG_INDEX_1]);
70     Framework::JSRef<Framework::JSVal> onCallBack = object->GetProperty("__curveCustomFunc");
71     if (onCallBack->IsFunction()) {
72         RefPtr<Framework::JsFunction> jsFuncCallBack =
73             AceType::MakeRefPtr<Framework::JsFunction>(Framework::JSRef<Framework::JSObject>(),
74             Framework::JSRef<Framework::JSFunc>::Cast(onCallBack));
75         customCallBack = [func = std::move(jsFuncCallBack), id = Container::CurrentId()](float time) -> float {
76             ContainerScope scope(id);
77             Framework::JSRef<Framework::JSVal> params[1];
78             params[0] = Framework::JSRef<Framework::JSVal>::Make(Framework::ToJSValue(time));
79             auto result = func->ExecuteJS(1, params);
80             auto resultValue = result->IsNumber() ? result->ToNumber<float>() : 1.0f;
81             return resultValue;
82         };
83     }
84     auto jsCurveString = object->GetProperty("__curveString");
85     if (jsCurveString->IsString()) {
86         aniTimFunc = jsCurveString->ToString();
87         if (aniTimFunc == DOM_ANIMATION_TIMING_FUNCTION_CUSTOM && customCallBack) {
88             type = ANIMATION_CURVE_TYPE_FUNC;
89         } else if (aniTimFunc != DOM_ANIMATION_TIMING_FUNCTION_CUSTOM) {
90             type = ANIMATION_CURVE_TYPE_STR;
91         }
92     }
93 }
94 } // namespace
95 
SetTabBarMode(ArkUIRuntimeCallInfo * runtimeCallInfo)96 ArkUINativeModuleValue TabsBridge::SetTabBarMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
97 {
98     EcmaVM* vm = runtimeCallInfo->GetVM();
99     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
100     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
101     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
102     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
103     Local<JSValueRef> barModeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
104     Local<JSValueRef> marginArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_2);
105     Local<JSValueRef> nonScrollableLayoutStyleArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_3);
106 
107     if (barModeArg->IsNull() || barModeArg->IsUndefined()) {
108         GetArkUINodeModifiers()->getTabsModifier()->resetTabBarMode(nativeNode);
109         return panda::JSValueRef::Undefined(vm);
110     }
111     TabBarMode barMode = TabBarMode::FIXED;
112     barMode = Framework::ConvertStrToTabBarMode(barModeArg->ToString(vm)->ToString(vm));
113     int32_t tabBarMode = static_cast<int32_t>(barMode);
114     GetArkUINodeModifiers()->getTabsModifier()->setTabBarMode(nativeNode, tabBarMode);
115 
116     GetArkUINodeModifiers()->getTabsModifier()->createScrollableBarModeOptionsWithResourceObj(nativeNode, nullptr);
117     if (tabBarMode == TABBARMODE_SCROLLABLE) {
118         if (marginArg->IsNull() || marginArg->IsUndefined() || nonScrollableLayoutStyleArg->IsNull() ||
119             nonScrollableLayoutStyleArg->IsUndefined()) {
120             GetArkUINodeModifiers()->getTabsModifier()->resetScrollableBarModeOptions(nativeNode);
121             return panda::JSValueRef::Undefined(vm);
122         }
123         int barModeStyle = nonScrollableLayoutStyleArg->Int32Value(vm);
124         CalcDimension margin(0.0, DimensionUnit::VP);
125         RefPtr<ResourceObject> marginResObj;
126         if (!ArkTSUtils::ParseJsDimensionVp(vm, marginArg, margin, marginResObj)) {
127             margin.Reset();
128         }
129 
130         GetArkUINodeModifiers()->getTabsModifier()->setScrollableBarModeOptions(
131             nativeNode, margin.Value(), static_cast<int>(margin.Unit()), barModeStyle);
132         GetArkUINodeModifiers()->getTabsModifier()->createScrollableBarModeOptionsWithResourceObj(
133             nativeNode, AceType::RawPtr(marginResObj));
134     }
135     return panda::JSValueRef::Undefined(vm);
136 }
137 
ResetTabBarMode(ArkUIRuntimeCallInfo * runtimeCallInfo)138 ArkUINativeModuleValue TabsBridge::ResetTabBarMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
139 {
140     EcmaVM* vm = runtimeCallInfo->GetVM();
141     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
142     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
143     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
144     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
145     GetArkUINodeModifiers()->getTabsModifier()->resetTabBarMode(nativeNode);
146     return panda::JSValueRef::Undefined(vm);
147 }
148 
SetScrollableBarModeOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)149 ArkUINativeModuleValue TabsBridge::SetScrollableBarModeOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
150 {
151     EcmaVM* vm = runtimeCallInfo->GetVM();
152     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
153     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
154     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
155     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_2);
156     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
157     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
158 
159     if (thirdArg->IsUndefined()) {
160         GetArkUINodeModifiers()->getTabsModifier()->resetScrollableBarModeOptions(nativeNode);
161         return panda::JSValueRef::Undefined(vm);
162     }
163     int barModeStyle = thirdArg->Int32Value(vm);
164 
165     CalcDimension margin(0.0, DimensionUnit::VP);
166     RefPtr<ResourceObject> marginResObj;
167     if (!ArkTSUtils::ParseJsDimensionVp(vm, secondArg, margin, marginResObj)) {
168         margin.Reset();
169     }
170 
171     GetArkUINodeModifiers()->getTabsModifier()->setScrollableBarModeOptions(
172         nativeNode, margin.Value(), static_cast<int>(margin.Unit()), barModeStyle);
173     GetArkUINodeModifiers()->getTabsModifier()->createScrollableBarModeOptionsWithResourceObj(
174         nativeNode, AceType::RawPtr(marginResObj));
175     return panda::JSValueRef::Undefined(vm);
176 }
177 
ResetScrollableBarModeOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)178 ArkUINativeModuleValue TabsBridge::ResetScrollableBarModeOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
179 {
180     EcmaVM* vm = runtimeCallInfo->GetVM();
181     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
182     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
183     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
184     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
185     GetArkUINodeModifiers()->getTabsModifier()->resetScrollableBarModeOptions(nativeNode);
186     return panda::JSValueRef::Undefined(vm);
187 }
188 
SetBarGridAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)189 ArkUINativeModuleValue TabsBridge::SetBarGridAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
190 {
191     EcmaVM* vm = runtimeCallInfo->GetVM();
192     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
193     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
194     Local<JSValueRef> smArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
195     Local<JSValueRef> mdArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_2);
196     Local<JSValueRef> lgArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_3);
197     Local<JSValueRef> gutterArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_4);
198     Local<JSValueRef> marginArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_5);
199     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
200     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
201 
202     int32_t sm = DEFAULT_COLUMN;
203     int32_t md = DEFAULT_COLUMN;
204     int32_t lg = DEFAULT_COLUMN;
205     if (smArg->IsNumber() && smArg->Int32Value(vm) >= 0 && smArg->Int32Value(vm) <= SM_COLUMN_NUM &&
206         smArg->Int32Value(vm) % REMAINDER == 0) {
207         sm = smArg->Int32Value(vm);
208     }
209     if (mdArg->IsNumber() && mdArg->Int32Value(vm) >= 0 && mdArg->Int32Value(vm) <= MD_COLUMN_NUM &&
210         mdArg->Int32Value(vm) % REMAINDER == 0) {
211         md = mdArg->Int32Value(vm);
212     }
213     if (lgArg->IsNumber() && lgArg->Int32Value(vm) >= 0 && lgArg->Int32Value(vm) <= LG_COLUMN_NUM &&
214         lgArg->Int32Value(vm) % REMAINDER == 0) {
215         lg = lgArg->Int32Value(vm);
216     }
217 
218     CalcDimension columnGutter;
219     CalcDimension columnMargin;
220     RefPtr<ResourceObject> columnGutterResObj;
221     RefPtr<ResourceObject> columnMarginResObj;
222     if (!ArkTSUtils::ParseJsDimensionVp(vm, gutterArg, columnGutter, columnGutterResObj) ||
223         !NonNegative(columnGutter.Value()) ||
224         columnGutter.Unit() == DimensionUnit::PERCENT) {
225         columnGutter.Reset();
226     }
227     if (!ArkTSUtils::ParseJsDimensionVp(vm, marginArg, columnMargin, columnMarginResObj) ||
228         !NonNegative(columnMargin.Value()) ||
229         columnMargin.Unit() == DimensionUnit::PERCENT) {
230         columnMargin.Reset();
231     }
232 
233     ArkUI_Float32 values[SIZE_OF_VALUES] = { static_cast<ArkUI_Float32>(columnGutter.Value()),
234         static_cast<ArkUI_Float32>(columnMargin.Value()) };
235     int unitsAndColumn[SIZE_OF_FIVE] = { static_cast<int>(columnGutter.Unit()), static_cast<int>(columnMargin.Unit()),
236         sm, md, lg };
237 
238     GetArkUINodeModifiers()->getTabsModifier()->setBarGridAlign(
239         nativeNode, values, SIZE_OF_VALUES, unitsAndColumn, SIZE_OF_FIVE);
240     GetArkUINodeModifiers()->getTabsModifier()->createBarGridAlignWithResourceObj(
241         nativeNode, AceType::RawPtr(columnGutterResObj), AceType::RawPtr(columnMarginResObj));
242     return panda::JSValueRef::Undefined(vm);
243 }
244 
ResetBarGridAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)245 ArkUINativeModuleValue TabsBridge::ResetBarGridAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
246 {
247     EcmaVM* vm = runtimeCallInfo->GetVM();
248     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
249     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
250     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
251     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
252     GetArkUINodeModifiers()->getTabsModifier()->resetBarGridAlign(nativeNode);
253     return panda::JSValueRef::Undefined(vm);
254 }
255 
SetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)256 ArkUINativeModuleValue TabsBridge::SetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
257 {
258     EcmaVM* vm = runtimeCallInfo->GetVM();
259     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
260     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
261     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
262     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
263     Local<JSValueRef> dividerStrokeWidthArgs = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
264     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_2);
265     Local<JSValueRef> dividerStartMarginArgs = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_3);
266     Local<JSValueRef> dividerEndMarginArgs = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_4);
267     auto isDividerStrokeWidthArgsInvalid = dividerStrokeWidthArgs->IsNull() || dividerStrokeWidthArgs->IsUndefined();
268     auto isDividerStartMarginArgsInvalid = dividerStartMarginArgs->IsNull() || dividerStartMarginArgs->IsUndefined();
269     auto isDividerEndMarginArgsInvalid = dividerEndMarginArgs->IsNull() || dividerEndMarginArgs->IsUndefined();
270     auto isColorArgInvalid = colorArg->IsNull() || colorArg->IsUndefined();
271     if (isDividerStrokeWidthArgsInvalid && isDividerStartMarginArgsInvalid && isDividerEndMarginArgsInvalid &&
272         isColorArgInvalid) {
273         GetArkUINodeModifiers()->getTabsModifier()->resetDivider(nativeNode);
274         return panda::JSValueRef::Undefined(vm);
275     }
276 
277     CalcDimension dividerStrokeWidth;
278     CalcDimension dividerStartMargin;
279     CalcDimension dividerEndMargin;
280     uint32_t color;
281     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
282     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
283     auto context = frameNode->GetContext();
284     CHECK_NULL_RETURN(context, panda::NativePointerRef::New(vm, nullptr));
285     auto themeManager = context->GetThemeManager();
286     CHECK_NULL_RETURN(themeManager, panda::NativePointerRef::New(vm, nullptr));
287     auto tabTheme = themeManager->GetTheme<TabTheme>();
288     CHECK_NULL_RETURN(tabTheme, panda::NativePointerRef::New(vm, nullptr));
289 
290     RefPtr<ResourceObject> strokeWidthResObj;
291     RefPtr<ResourceObject> colorResObj;
292     RefPtr<ResourceObject> startMarginResObj;
293     RefPtr<ResourceObject> endMarginResObj;
294     if (isDividerStrokeWidthArgsInvalid ||
295         !ArkTSUtils::ParseJsDimensionVp(vm, dividerStrokeWidthArgs, dividerStrokeWidth, strokeWidthResObj) ||
296         LessNotEqual(dividerStrokeWidth.Value(), 0.0f) || dividerStrokeWidth.Unit() == DimensionUnit::PERCENT) {
297         dividerStrokeWidth.Reset();
298     }
299     Color colorObj;
300     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
301     if (isColorArgInvalid || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, colorObj, colorResObj, nodeInfo)) {
302         color = tabTheme->GetDividerColor().GetValue();
303         GetArkUINodeModifiers()->getTabsModifier()->setDividerColorByUser(nativeNode, false);
304     } else {
305         color = colorObj.GetValue();
306         GetArkUINodeModifiers()->getTabsModifier()->setDividerColorByUser(nativeNode, true);
307     }
308     if (isDividerStartMarginArgsInvalid ||
309         !ArkTSUtils::ParseJsDimensionVp(vm, dividerStartMarginArgs, dividerStartMargin, startMarginResObj) ||
310         LessNotEqual(dividerStartMargin.Value(), 0.0f) || dividerStartMargin.Unit() == DimensionUnit::PERCENT) {
311         dividerStartMargin.Reset();
312     }
313     if (isDividerEndMarginArgsInvalid ||
314         !ArkTSUtils::ParseJsDimensionVp(vm, dividerEndMarginArgs, dividerEndMargin, endMarginResObj) ||
315         LessNotEqual(dividerEndMargin.Value(), 0.0f) || dividerEndMargin.Unit() == DimensionUnit::PERCENT) {
316         dividerEndMargin.Reset();
317     }
318     uint32_t size = SIZE_OF_THREE;
319     ArkUI_Float32 values[size];
320     int32_t units[size];
321     values[TABS_ARG_INDEX_0] = static_cast<ArkUI_Float32>(dividerStrokeWidth.Value());
322     values[TABS_ARG_INDEX_1] = static_cast<ArkUI_Float32>(dividerStartMargin.Value());
323     values[TABS_ARG_INDEX_2] = static_cast<ArkUI_Float32>(dividerEndMargin.Value());
324     units[TABS_ARG_INDEX_0] = static_cast<int32_t>(dividerStrokeWidth.Unit());
325     units[TABS_ARG_INDEX_1] = static_cast<int32_t>(dividerStartMargin.Unit());
326     units[TABS_ARG_INDEX_2] = static_cast<int32_t>(dividerEndMargin.Unit());
327     GetArkUINodeModifiers()->getTabsModifier()->setDivider(nativeNode, color, values, units, size);
328     GetArkUINodeModifiers()->getTabsModifier()->createDividerWithResourceObj(nativeNode,
329         AceType::RawPtr(strokeWidthResObj), AceType::RawPtr(colorResObj), AceType::RawPtr(startMarginResObj),
330         AceType::RawPtr(endMarginResObj));
331     return panda::JSValueRef::Undefined(vm);
332 }
333 
ResetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)334 ArkUINativeModuleValue TabsBridge::ResetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
335 {
336     EcmaVM* vm = runtimeCallInfo->GetVM();
337     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
338     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
339     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
340     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
341     GetArkUINodeModifiers()->getTabsModifier()->resetDivider(nativeNode);
342     return panda::JSValueRef::Undefined(vm);
343 }
344 
SetFadingEdge(ArkUIRuntimeCallInfo * runtimeCallInfo)345 ArkUINativeModuleValue TabsBridge::SetFadingEdge(ArkUIRuntimeCallInfo* runtimeCallInfo)
346 {
347     EcmaVM* vm = runtimeCallInfo->GetVM();
348     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
349     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
350     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
351     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
352     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
353     if (secondArg->IsUndefined() || secondArg->IsNull()) {
354         GetArkUINodeModifiers()->getTabsModifier()->resetFadingEdge(nativeNode);
355         return panda::JSValueRef::Undefined(vm);
356     }
357     bool fadingEdge = secondArg->ToBoolean(vm)->Value();
358     GetArkUINodeModifiers()->getTabsModifier()->setFadingEdge(nativeNode, fadingEdge);
359     return panda::JSValueRef::Undefined(vm);
360 }
361 
ResetFadingEdge(ArkUIRuntimeCallInfo * runtimeCallInfo)362 ArkUINativeModuleValue TabsBridge::ResetFadingEdge(ArkUIRuntimeCallInfo* runtimeCallInfo)
363 {
364     EcmaVM* vm = runtimeCallInfo->GetVM();
365     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
366     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
367     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
368     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
369     GetArkUINodeModifiers()->getTabsModifier()->resetFadingEdge(nativeNode);
370     return panda::JSValueRef::Undefined(vm);
371 }
372 
SetTabOnUnselected(ArkUIRuntimeCallInfo * runtimeCallInfo)373 ArkUINativeModuleValue TabsBridge::SetTabOnUnselected(ArkUIRuntimeCallInfo* runtimeCallInfo)
374 {
375     EcmaVM* vm = runtimeCallInfo->GetVM();
376     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
377     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
378     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
379     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
380     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
381         GetArkUINodeModifiers()->getTabsModifier()->resetTabOnUnselected(nativeNode);
382         return panda::JSValueRef::Undefined(vm);
383     }
384     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
385     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
386     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
387     std::function<void(const BaseEventInfo* info)> callback =
388         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](const BaseEventInfo* info) {
389         panda::LocalScope pandaScope(vm);
390         panda::TryCatch trycatch(vm);
391         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
392         const auto* tabsInfo = TypeInfoHelper::DynamicCast<TabContentChangeEvent>(info);
393         if (!tabsInfo) {
394             TAG_LOGW(AceLogTag::ACE_TABS, "Tabs  OnUnselected callback execute failed.");
395             return;
396         }
397         panda::Local<panda::NumberRef> indexParam = panda::NumberRef::New(vm, tabsInfo->GetIndex());
398         panda::Local<panda::JSValueRef> params[1] = { indexParam }; // 1: Array length
399         func->Call(vm, func.ToLocal(), params, 1); // 1: Array length
400     };
401     GetArkUINodeModifiers()->getTabsModifier()->setTabOnUnselected(nativeNode, reinterpret_cast<void*>(&callback));
402     return panda::JSValueRef::Undefined(vm);
403 }
404 
ResetTabOnUnselected(ArkUIRuntimeCallInfo * runtimeCallInfo)405 ArkUINativeModuleValue TabsBridge::ResetTabOnUnselected(ArkUIRuntimeCallInfo* runtimeCallInfo)
406 {
407     EcmaVM* vm = runtimeCallInfo->GetVM();
408     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
409     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
410     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
411     GetArkUINodeModifiers()->getTabsModifier()->resetTabOnUnselected(nativeNode);
412     return panda::JSValueRef::Undefined(vm);
413 }
414 
SetBarBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)415 ArkUINativeModuleValue TabsBridge::SetBarBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
416 {
417     EcmaVM* vm = runtimeCallInfo->GetVM();
418     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
419     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
420     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
421     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
422     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
423     Color color;
424     RefPtr<ResourceObject> backgroundColorResObj;
425     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
426     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color, backgroundColorResObj, nodeInfo)) {
427         GetArkUINodeModifiers()->getTabsModifier()->resetBarBackgroundColor(nativeNode);
428     } else {
429         GetArkUINodeModifiers()->getTabsModifier()->setBarBackgroundColor(nativeNode, color.GetValue());
430         auto bgColorRawPtr = AceType::RawPtr(backgroundColorResObj);
431         GetArkUINodeModifiers()->getTabsModifier()->createBarBackgroundColorWithResourceObj(nativeNode, bgColorRawPtr);
432     }
433     return panda::JSValueRef::Undefined(vm);
434 }
435 
ResetBarBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)436 ArkUINativeModuleValue TabsBridge::ResetBarBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
437 {
438     EcmaVM* vm = runtimeCallInfo->GetVM();
439     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
440     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
441     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
442     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
443     GetArkUINodeModifiers()->getTabsModifier()->resetBarBackgroundColor(nativeNode);
444     return panda::JSValueRef::Undefined(vm);
445 }
446 
ParseJsInt32(const EcmaVM * vm,const Local<JSValueRef> & value,int32_t & result)447 bool ParseJsInt32(const EcmaVM *vm, const Local<JSValueRef> &value, int32_t &result)
448 {
449     if (value->IsNumber()) {
450         result = value->Int32Value(vm);
451         return true;
452     }
453     if (value->IsString(vm)) {
454         result = StringUtils::StringToInt(value->ToString(vm)->ToString(vm));
455         return true;
456     }
457 
458     return false;
459 }
460 
SetBarBackgroundBlurStyleParam(ArkUIRuntimeCallInfo * runtimeCallInfo,ArkUI_Bool & isValidColor,Color & inactiveColor,ArkUI_Int32 & policy,ArkUI_Int32 & blurType,ArkUINodeHandle nativeNode)461 RefPtr<ResourceObject> SetBarBackgroundBlurStyleParam(ArkUIRuntimeCallInfo* runtimeCallInfo, ArkUI_Bool& isValidColor,
462     Color& inactiveColor, ArkUI_Int32& policy, ArkUI_Int32& blurType, ArkUINodeHandle nativeNode)
463 {
464     EcmaVM *vm = runtimeCallInfo->GetVM();
465     Local<JSValueRef> policyArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_6);
466     Local<JSValueRef> inactiveColorArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_7);
467     Local<JSValueRef> typeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_8);
468     RefPtr<ResourceObject> inactiveColorResObj;
469     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
470     if (ArkTSUtils::ParseJsColor(vm, inactiveColorArg, inactiveColor, inactiveColorResObj, nodeInfo)) {
471         isValidColor = true;
472     }
473     ParseJsInt32(vm, policyArg, policy);
474     if (policy < static_cast<int32_t>(BlurStyleActivePolicy::FOLLOWS_WINDOW_ACTIVE_STATE) ||
475         policy > static_cast<int32_t>(BlurStyleActivePolicy::ALWAYS_INACTIVE)) {
476         policy = static_cast<int32_t>(BlurStyleActivePolicy::ALWAYS_ACTIVE);
477     }
478     ParseJsInt32(vm, typeArg, blurType);
479     if (blurType < static_cast<int32_t>(BlurType::WITHIN_WINDOW) ||
480         blurType > static_cast<int32_t>(BlurType::BEHIND_WINDOW)) {
481         blurType = static_cast<int32_t>(BlurType::WITHIN_WINDOW);
482     }
483     return inactiveColorResObj;
484 }
485 
SetBarBackgroundBlurStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)486 ArkUINativeModuleValue TabsBridge::SetBarBackgroundBlurStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
487 {
488     EcmaVM* vm = runtimeCallInfo->GetVM();
489     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
490     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
491     Local<JSValueRef> blurStyleArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
492     Local<JSValueRef> colorModeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_2);
493     Local<JSValueRef> adaptiveColorArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_3);
494     Local<JSValueRef> scaleArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_4);
495     Local<JSValueRef> blurOptionsArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_5);
496     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
497     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
498     BlurOption blurOption;
499     ArkUITabBarBackgroundBlurStyle styleOption = { static_cast<int32_t>(BlurStyle::NO_MATERIAL),
500         static_cast<int32_t>(ThemeColorMode::SYSTEM), static_cast<int32_t>(AdaptiveColor::DEFAULT),
501         1.0, blurOption.grayscale.data(), static_cast<ArkUI_Int32>(blurOption.grayscale.size()),
502         static_cast<int32_t>(BlurStyleActivePolicy::ALWAYS_ACTIVE), Color::TRANSPARENT.GetValue(),
503         false, static_cast<int32_t>(BlurType::WITHIN_WINDOW) };
504     if (blurStyleArg->IsNumber()) {
505         styleOption.blurStyle = blurStyleArg->Int32Value(vm);
506     }
507     bool isHasOptions = !(colorModeArg->IsUndefined() && adaptiveColorArg->IsUndefined() && scaleArg->IsUndefined() &&
508                           blurOptionsArg->IsUndefined());
509     if (isHasOptions) {
510         ParseJsInt32(vm, colorModeArg, styleOption.colorMode);
511         ParseJsInt32(vm, adaptiveColorArg, styleOption.adaptiveColor);
512         if (scaleArg->IsNumber()) {
513             styleOption.scale = scaleArg->ToNumber(vm)->Value();
514         }
515         if (blurOptionsArg->IsArray(vm)) {
516             Local<panda::ArrayRef> params = static_cast<Local<panda::ArrayRef>>(blurOptionsArg);
517             auto grey1 = params->GetValueAt(vm, blurOptionsArg, 0)->Uint32Value(vm);
518             auto grey2 = params->GetValueAt(vm, blurOptionsArg, 1)->Uint32Value(vm);
519             std::vector<float> greyVec = {0.0f, 0.0f};
520             greyVec[0] = grey1;
521             greyVec[1] = grey2;
522             blurOption.grayscale = greyVec;
523             styleOption.blurValues = blurOption.grayscale.data();
524             styleOption.blurValuesSize = static_cast<ArkUI_Int32>(blurOption.grayscale.size());
525         }
526     }
527     Color inactiveColor = Color::TRANSPARENT;
528     auto inactiveColorResObj = SetBarBackgroundBlurStyleParam(runtimeCallInfo, styleOption.isValidColor, inactiveColor,
529         styleOption.policy, styleOption.blurType, nativeNode);
530     styleOption.inactiveColor = inactiveColor.GetValue();
531     GetArkUINodeModifiers()->getTabsModifier()->setBarBackgroundBlurStyle(nativeNode, &styleOption);
532     GetArkUINodeModifiers()->getTabsModifier()->createBarBackgroundBlurStyleWithResourceObj(nativeNode,
533         AceType::RawPtr(inactiveColorResObj));
534     return panda::JSValueRef::Undefined(vm);
535 }
536 
ResetBarBackgroundBlurStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)537 ArkUINativeModuleValue TabsBridge::ResetBarBackgroundBlurStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
538 {
539     EcmaVM* vm = runtimeCallInfo->GetVM();
540     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
541     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
542     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
543     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
544     GetArkUINodeModifiers()->getTabsModifier()->resetBarBackgroundBlurStyle(nativeNode);
545     return panda::JSValueRef::Undefined(vm);
546 }
547 
SetBarBackgroundEffectParam(ArkUIRuntimeCallInfo * runtimeCallInfo,ArkUI_Int32 & policy,ArkUI_Int32 & blurType,Color & inactiveColor,ArkUI_Bool & isValidColor,ArkUINodeHandle nativeNode)548 RefPtr<ResourceObject> SetBarBackgroundEffectParam(ArkUIRuntimeCallInfo* runtimeCallInfo, ArkUI_Int32& policy,
549     ArkUI_Int32& blurType, Color& inactiveColor, ArkUI_Bool& isValidColor, ArkUINodeHandle nativeNode)
550 {
551     EcmaVM* vm = runtimeCallInfo->GetVM();
552     Local<JSValueRef> policyArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_7);
553     Local<JSValueRef> inactiveColorArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_8);
554     Local<JSValueRef> typeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_9);
555     ParseJsInt32(vm, policyArg, policy);
556     if (policy < static_cast<int32_t>(BlurStyleActivePolicy::FOLLOWS_WINDOW_ACTIVE_STATE) ||
557         policy > static_cast<int32_t>(BlurStyleActivePolicy::ALWAYS_INACTIVE)) {
558         policy = static_cast<int32_t>(BlurStyleActivePolicy::ALWAYS_ACTIVE);
559     }
560     ParseJsInt32(vm, typeArg, blurType);
561     if (blurType < static_cast<int32_t>(BlurType::WITHIN_WINDOW) ||
562         blurType > static_cast<int32_t>(BlurType::BEHIND_WINDOW)) {
563         blurType = static_cast<int32_t>(BlurType::WITHIN_WINDOW);
564     }
565     RefPtr<ResourceObject> inactiveColorResObj;
566     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
567     if (ArkTSUtils::ParseJsColor(vm, inactiveColorArg, inactiveColor, inactiveColorResObj, nodeInfo)) {
568         isValidColor = true;
569     }
570     return inactiveColorResObj;
571 }
572 
SetAdaptiveColorAndBlurOptionParam(ArkUIRuntimeCallInfo * runtimeCallInfo,AdaptiveColor & adaptiveColor,BlurOption & blurOption)573 void SetAdaptiveColorAndBlurOptionParam(ArkUIRuntimeCallInfo* runtimeCallInfo, AdaptiveColor& adaptiveColor,
574     BlurOption& blurOption)
575 {
576     EcmaVM* vm = runtimeCallInfo->GetVM();
577     Local<JSValueRef> adaptiveColorArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_5);
578     Local<JSValueRef> blurOptionsArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_6);
579     auto adaptiveColorValue = static_cast<int32_t>(AdaptiveColor::DEFAULT);
580     if (adaptiveColorArg->IsNumber()) {
581         adaptiveColorValue = adaptiveColorArg->Int32Value(vm);
582         if (adaptiveColorValue >= static_cast<int32_t>(AdaptiveColor::DEFAULT) &&
583             adaptiveColorValue <= static_cast<int32_t>(AdaptiveColor::AVERAGE)) {
584             adaptiveColor = static_cast<AdaptiveColor>(adaptiveColorValue);
585         }
586     }
587     if (blurOptionsArg->IsArray(vm)) {
588         Local<panda::ArrayRef> params = static_cast<Local<panda::ArrayRef>>(blurOptionsArg);
589         auto grey1 = params->GetValueAt(vm, blurOptionsArg, 0)->Uint32Value(vm);
590         auto grey2 = params->GetValueAt(vm, blurOptionsArg, 1)->Uint32Value(vm);
591         std::vector<float> greyVec = {0.0f, 0.0f};
592         greyVec[0] = grey1;
593         greyVec[1] = grey2;
594         blurOption.grayscale = greyVec;
595     }
596 }
597 
SetSaturationAndBrightnessEffectOptionParam(const EcmaVM * vm,const Local<JSValueRef> & saturationArg,const Local<JSValueRef> & brightnessArg,ArkUITabBarBackgroundEffect & effectOption)598 void SetSaturationAndBrightnessEffectOptionParam(const EcmaVM* vm, const Local<JSValueRef>& saturationArg,
599     const Local<JSValueRef>& brightnessArg, ArkUITabBarBackgroundEffect& effectOption)
600 {
601     if (saturationArg->IsNumber()) {
602         effectOption.saturation = saturationArg->ToNumber(vm)->Value();
603         effectOption.saturation = (effectOption.saturation > 0.0f || NearZero(effectOption.saturation)) ?
604                                     effectOption.saturation : 1.0f;
605     }
606     if (brightnessArg->IsNumber()) {
607         effectOption.brightness = brightnessArg->ToNumber(vm)->Value();
608         effectOption.brightness = (effectOption.brightness > 0.0f || NearZero(effectOption.brightness)) ?
609                                     effectOption.brightness : 1.0f;
610     }
611 }
612 
SetBarBackgroundEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)613 ArkUINativeModuleValue TabsBridge::SetBarBackgroundEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
614 {
615     EcmaVM* vm = runtimeCallInfo->GetVM();
616     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
617     Local<JSValueRef> frameNodeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
618     Local<JSValueRef> radiusArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
619     Local<JSValueRef> saturationArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_2);
620     Local<JSValueRef> brightnessArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_3);
621     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_4);
622     CHECK_NULL_RETURN(frameNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
623     auto nativeNode = nodePtr(frameNodeArg->ToNativePointer(vm)->Value());
624     BlurOption blurOption;
625     ArkUITabBarBackgroundEffect effectOption = { 0.0f, 1.0f, 1.0f, Color::TRANSPARENT.GetValue(),
626         static_cast<int32_t>(AdaptiveColor::DEFAULT), blurOption.grayscale.data(),
627         static_cast<int32_t>(blurOption.grayscale.size()),
628         static_cast<int32_t>(BlurStyleActivePolicy::ALWAYS_ACTIVE), static_cast<int32_t>(BlurType::WITHIN_WINDOW),
629         static_cast<ArkUI_Bool>(Color::TRANSPARENT.GetValue()), false };
630     CalcDimension radius;
631     if (!ArkTSUtils::ParseJsDimensionVp(vm, radiusArg, radius) || LessNotEqual(radius.Value(), 0.0f)) {
632         radius.SetValue(0.0f);
633     }
634     effectOption.radius = static_cast<ArkUI_Float32>(radius.Value());
635     SetSaturationAndBrightnessEffectOptionParam(vm, saturationArg, brightnessArg, effectOption);
636     RefPtr<ResourceObject> colorResObj;
637     Color color = Color::TRANSPARENT;
638     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
639     if (!ArkTSUtils::ParseJsColor(vm, colorArg, color, colorResObj, nodeInfo)) {
640         color.SetValue(Color::TRANSPARENT.GetValue());
641     }
642     effectOption.color = color.GetValue();
643     auto adaptiveColor = AdaptiveColor::DEFAULT;
644     SetAdaptiveColorAndBlurOptionParam(runtimeCallInfo, adaptiveColor, blurOption);
645     effectOption.adaptiveColor = static_cast<ArkUI_Int32>(adaptiveColor);
646     effectOption.blurValues = blurOption.grayscale.data();
647     effectOption.blurValuesSize = static_cast<ArkUI_Int32>(blurOption.grayscale.size());
648     Color inactiveColor = Color::TRANSPARENT;
649     auto inactiveColorResObj = SetBarBackgroundEffectParam(runtimeCallInfo, effectOption.policy, effectOption.blurType,
650         inactiveColor, effectOption.isValidColor, nativeNode);
651     effectOption.inactiveColor = inactiveColor.GetValue();
652     GetArkUINodeModifiers()->getTabsModifier()->setBarBackgroundEffect(nativeNode, &effectOption);
653     GetArkUINodeModifiers()->getTabsModifier()->createBarBackgroundEffectWithResourceObj(nativeNode,
654         AceType::RawPtr(colorResObj), AceType::RawPtr(inactiveColorResObj));
655     return panda::JSValueRef::Undefined(vm);
656 }
657 
ResetBarBackgroundEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)658 ArkUINativeModuleValue TabsBridge::ResetBarBackgroundEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
659 {
660     EcmaVM* vm = runtimeCallInfo->GetVM();
661     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
662     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
663     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
664     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
665     GetArkUINodeModifiers()->getTabsModifier()->resetBarBackgroundEffect(nativeNode);
666     return panda::JSValueRef::Undefined(vm);
667 }
668 
SetBarOverlap(ArkUIRuntimeCallInfo * runtimeCallInfo)669 ArkUINativeModuleValue TabsBridge::SetBarOverlap(ArkUIRuntimeCallInfo* runtimeCallInfo)
670 {
671     EcmaVM* vm = runtimeCallInfo->GetVM();
672     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
673     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
674     Local<JSValueRef> overlapArg = runtimeCallInfo->GetCallArgRef(1);
675     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
676     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
677     if (overlapArg->IsUndefined()) {
678         GetArkUINodeModifiers()->getTabsModifier()->resetBarOverlap(nativeNode);
679     } else {
680         bool overlap = overlapArg->ToBoolean(vm)->Value();
681         GetArkUINodeModifiers()->getTabsModifier()->setBarOverlap(nativeNode, overlap);
682     }
683     return panda::JSValueRef::Undefined(vm);
684 }
685 
ResetBarOverlap(ArkUIRuntimeCallInfo * runtimeCallInfo)686 ArkUINativeModuleValue TabsBridge::ResetBarOverlap(ArkUIRuntimeCallInfo* runtimeCallInfo)
687 {
688     EcmaVM* vm = runtimeCallInfo->GetVM();
689     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
690     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
691     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
692     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
693     GetArkUINodeModifiers()->getTabsModifier()->resetBarOverlap(nativeNode);
694     return panda::JSValueRef::Undefined(vm);
695 }
SetIsVertical(ArkUIRuntimeCallInfo * runtimeCallInfo)696 ArkUINativeModuleValue TabsBridge::SetIsVertical(ArkUIRuntimeCallInfo* runtimeCallInfo)
697 {
698     EcmaVM* vm = runtimeCallInfo->GetVM();
699     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
700     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
701     Local<JSValueRef> isVerticalArg = runtimeCallInfo->GetCallArgRef(1);
702     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
703     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
704     if (isVerticalArg->IsNull() || isVerticalArg->IsUndefined()) {
705         GetArkUINodeModifiers()->getTabsModifier()->resetIsVertical(nativeNode);
706         return panda::JSValueRef::Undefined(vm);
707     }
708     bool isVertical = isVerticalArg->ToBoolean(vm)->Value();
709     GetArkUINodeModifiers()->getTabsModifier()->setIsVertical(nativeNode, isVertical);
710     return panda::JSValueRef::Undefined(vm);
711 }
712 
ResetIsVertical(ArkUIRuntimeCallInfo * runtimeCallInfo)713 ArkUINativeModuleValue TabsBridge::ResetIsVertical(ArkUIRuntimeCallInfo* runtimeCallInfo)
714 {
715     EcmaVM* vm = runtimeCallInfo->GetVM();
716     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
717     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
718     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
719     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
720     GetArkUINodeModifiers()->getTabsModifier()->resetIsVertical(nativeNode);
721     return panda::JSValueRef::Undefined(vm);
722 }
723 
SetTabBarPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)724 ArkUINativeModuleValue TabsBridge::SetTabBarPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
725 {
726     EcmaVM* vm = runtimeCallInfo->GetVM();
727     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
728     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
729     Local<JSValueRef> barValArg = runtimeCallInfo->GetCallArgRef(1);
730     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
731     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
732     if (barValArg->IsNull() || barValArg->IsUndefined()) {
733         GetArkUINodeModifiers()->getTabsModifier()->resetTabBarPosition(nativeNode);
734     } else {
735         int32_t barVal = barValArg->Int32Value(vm);
736         GetArkUINodeModifiers()->getTabsModifier()->setTabBarPosition(nativeNode, barVal);
737     }
738 
739     return panda::JSValueRef::Undefined(vm);
740 }
741 
ResetTabBarPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)742 ArkUINativeModuleValue TabsBridge::ResetTabBarPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
743 {
744     EcmaVM* vm = runtimeCallInfo->GetVM();
745     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
746     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
747     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
748     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
749     GetArkUINodeModifiers()->getTabsModifier()->resetTabBarPosition(nativeNode);
750     return panda::JSValueRef::Undefined(vm);
751 }
752 
SetTabsOptionsIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)753 ArkUINativeModuleValue TabsBridge::SetTabsOptionsIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
754 {
755     EcmaVM* vm = runtimeCallInfo->GetVM();
756     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
757     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
758     Local<JSValueRef> indexValArg = runtimeCallInfo->GetCallArgRef(1);
759     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
760     if (indexValArg->IsNull() || indexValArg->IsUndefined()) {
761         GetArkUINodeModifiers()->getTabsModifier()->resetTabsOptionsIndex(nativeNode);
762     } else {
763         int32_t indexVal = indexValArg->Int32Value(vm);
764         GetArkUINodeModifiers()->getTabsModifier()->setTabsOptionsIndex(nativeNode, indexVal);
765     }
766     return panda::JSValueRef::Undefined(vm);
767 }
768 
ResetTabsOptionsIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)769 ArkUINativeModuleValue TabsBridge::ResetTabsOptionsIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
770 {
771     EcmaVM* vm = runtimeCallInfo->GetVM();
772     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
773     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
774     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
775     GetArkUINodeModifiers()->getTabsModifier()->resetTabsOptionsIndex(nativeNode);
776     return panda::JSValueRef::Undefined(vm);
777 }
778 
SetTabsOptionsController(ArkUIRuntimeCallInfo * runtimeCallInfo)779 ArkUINativeModuleValue TabsBridge::SetTabsOptionsController(ArkUIRuntimeCallInfo* runtimeCallInfo)
780 {
781     EcmaVM* vm = runtimeCallInfo->GetVM();
782     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
783     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
784     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
785 
786     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
787     RefPtr<NG::TabsControllerNG> tabsController = AceType::MakeRefPtr<NG::TabsControllerNG>();
788     if (info[1]->IsObject()) {
789         auto* jsTabsController =
790             Framework::JSRef<Framework::JSObject>::Cast(info[1])->Unwrap<Framework::JSTabsController>();
791             if (jsTabsController) {
792                 jsTabsController->SetInstanceId(Container::CurrentId());
793                 jsTabsController->SetTabsController(tabsController);
794             }
795     }
796     GetArkUINodeModifiers()->getTabsModifier()->setTabsOptionsController(nativeNode,
797         reinterpret_cast<ArkUINodeHandle>(AceType::RawPtr(tabsController)));
798     return panda::JSValueRef::Undefined(vm);
799 }
800 
ResetTabsOptionsController(ArkUIRuntimeCallInfo * runtimeCallInfo)801 ArkUINativeModuleValue TabsBridge::ResetTabsOptionsController(ArkUIRuntimeCallInfo* runtimeCallInfo)
802 {
803     EcmaVM* vm = runtimeCallInfo->GetVM();
804     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
805     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
806     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
807     RefPtr<NG::TabsControllerNG> tabsController = AceType::MakeRefPtr<NG::TabsControllerNG>();
808     GetArkUINodeModifiers()->getTabsModifier()->setTabsOptionsController(nativeNode,
809         reinterpret_cast<ArkUINodeHandle>(AceType::RawPtr(tabsController)));
810     return panda::JSValueRef::Undefined(vm);
811 }
812 
SetTabsOptionsBarModifier(ArkUIRuntimeCallInfo * runtimeCallInfo)813 ArkUINativeModuleValue TabsBridge::SetTabsOptionsBarModifier(ArkUIRuntimeCallInfo* runtimeCallInfo)
814 {
815     EcmaVM* vm = runtimeCallInfo->GetVM();
816     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
817     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
818     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
819     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
820     std::function<void(WeakPtr<NG::FrameNode>)> onApply;
821     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
822     Framework::JSTabs::SetBarModifierApply(runtimeCallInfo, onApply, info[1]);
823     GetArkUINodeModifiers()->getTabsModifier()->setTabsOptionsBarModifier(
824         nativeNode, reinterpret_cast<void*>(&onApply));
825     return panda::JSValueRef::Undefined(runtimeCallInfo->GetVM());
826 }
827 
ResetTabsOptionsBarModifier(ArkUIRuntimeCallInfo * runtimeCallInfo)828 ArkUINativeModuleValue TabsBridge::ResetTabsOptionsBarModifier(ArkUIRuntimeCallInfo* runtimeCallInfo)
829 {
830     EcmaVM* vm = runtimeCallInfo->GetVM();
831     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
832     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
833     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
834     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
835     GetArkUINodeModifiers()->getTabsModifier()->resetTabsOptionsBarModifier(nativeNode);
836     return panda::JSValueRef::Undefined(vm);
837 }
838 
SetScrollable(ArkUIRuntimeCallInfo * runtimeCallInfo)839 ArkUINativeModuleValue TabsBridge::SetScrollable(ArkUIRuntimeCallInfo* runtimeCallInfo)
840 {
841     EcmaVM* vm = runtimeCallInfo->GetVM();
842     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
843     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
844     Local<JSValueRef> scrollableArg = runtimeCallInfo->GetCallArgRef(1);
845     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
846     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
847     ArkUINativeModuleValue undefinedRes = panda::JSValueRef::Undefined(vm);
848 
849     if (scrollableArg->IsNull() || scrollableArg->IsUndefined()) {
850         GetArkUINodeModifiers()->getTabsModifier()->resetScrollable(nativeNode);
851         return undefinedRes;
852     }
853 
854     bool scrollable = scrollableArg->ToBoolean(vm)->Value();
855     GetArkUINodeModifiers()->getTabsModifier()->setScrollable(nativeNode, scrollable);
856     return undefinedRes;
857 }
858 
ResetScrollable(ArkUIRuntimeCallInfo * runtimeCallInfo)859 ArkUINativeModuleValue TabsBridge::ResetScrollable(ArkUIRuntimeCallInfo* runtimeCallInfo)
860 {
861     EcmaVM* vm = runtimeCallInfo->GetVM();
862     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
863     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
864     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
865     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
866     GetArkUINodeModifiers()->getTabsModifier()->resetScrollable(nativeNode);
867     return panda::JSValueRef::Undefined(vm);
868 }
869 
SetTabBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)870 ArkUINativeModuleValue TabsBridge::SetTabBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
871 {
872     EcmaVM* vm = runtimeCallInfo->GetVM();
873     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
874     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
875     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
876     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
877     Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
878     CalcDimension width;
879     ArkUINativeModuleValue undefinedRes = panda::JSValueRef::Undefined(vm);
880 
881     RefPtr<ResourceObject> widthResObj;
882     if (jsValue->IsNull() || jsValue->IsUndefined() || !ArkTSUtils::ParseJsDimensionVpNG(vm, jsValue, width,
883         widthResObj)) {
884         GetArkUINodeModifiers()->getTabsModifier()->resetTabBarWidth(nativeNode);
885         return undefinedRes;
886     }
887 
888     GetArkUINodeModifiers()->getTabsModifier()->setTabBarWidth(
889         nativeNode, width.Value(), static_cast<int>(width.Unit()));
890     auto widthRawPtr = AceType::RawPtr(widthResObj);
891     GetArkUINodeModifiers()->getTabsModifier()->createTabBarWidthWithResourceObj(nativeNode, widthRawPtr);
892     return undefinedRes;
893 }
894 
ResetTabBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)895 ArkUINativeModuleValue TabsBridge::ResetTabBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
896 {
897     EcmaVM* vm = runtimeCallInfo->GetVM();
898     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
899     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
900     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
901     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
902     GetArkUINodeModifiers()->getTabsModifier()->resetTabBarWidth(nativeNode);
903     return panda::JSValueRef::Undefined(vm);
904 }
905 
SetTabBarHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)906 ArkUINativeModuleValue TabsBridge::SetTabBarHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
907 {
908     EcmaVM* vm = runtimeCallInfo->GetVM();
909     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
910     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
911     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
912     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
913     Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
914     CalcDimension height;
915     ArkUINativeModuleValue undefinedRes = panda::JSValueRef::Undefined(vm);
916 
917     RefPtr<ResourceObject> heightResObj;
918     if (jsValue->IsNull() || jsValue->IsUndefined() || !ArkTSUtils::ParseJsDimensionVpNG(vm, jsValue, height,
919         heightResObj)) {
920         GetArkUINodeModifiers()->getTabsModifier()->resetTabBarHeight(nativeNode);
921         return undefinedRes;
922     }
923 
924     GetArkUINodeModifiers()->getTabsModifier()->setTabBarHeight(
925         nativeNode, height.Value(), static_cast<int>(height.Unit()));
926     auto heightRawPtr = AceType::RawPtr(heightResObj);
927     GetArkUINodeModifiers()->getTabsModifier()->createTabBarHeightWithResourceObj(nativeNode, heightRawPtr);
928     return undefinedRes;
929 }
930 
ResetTabBarHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)931 ArkUINativeModuleValue TabsBridge::ResetTabBarHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
932 {
933     EcmaVM* vm = runtimeCallInfo->GetVM();
934     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
935     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
936     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
937     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
938     GetArkUINodeModifiers()->getTabsModifier()->resetTabBarHeight(nativeNode);
939     return panda::JSValueRef::Undefined(vm);
940 }
941 
SetBarAdaptiveHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)942 ArkUINativeModuleValue TabsBridge::SetBarAdaptiveHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
943 {
944     EcmaVM* vm = runtimeCallInfo->GetVM();
945     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
946     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
947     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
948     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
949     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
950     bool value = secondArg->ToBoolean(vm)->Value();
951     GetArkUINodeModifiers()->getTabsModifier()->setBarAdaptiveHeight(nativeNode, value);
952     return panda::JSValueRef::Undefined(vm);
953 }
954 
ResetBarAdaptiveHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)955 ArkUINativeModuleValue TabsBridge::ResetBarAdaptiveHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
956 {
957     EcmaVM* vm = runtimeCallInfo->GetVM();
958     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
959     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
960     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
961     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
962     GetArkUINodeModifiers()->getTabsModifier()->resetBarAdaptiveHeight(nativeNode);
963     return panda::JSValueRef::Undefined(vm);
964 }
965 
SetAnimationCurve(ArkUIRuntimeCallInfo * runtimeCallInfo)966 ArkUINativeModuleValue TabsBridge::SetAnimationCurve(ArkUIRuntimeCallInfo* runtimeCallInfo)
967 {
968     EcmaVM* vm = runtimeCallInfo->GetVM();
969     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
970     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
971     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
972     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
973     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
974     if (valueArg->IsString(vm)) {
975         std::string curve = valueArg->ToString(vm)->ToString(vm);
976         GetArkUINodeModifiers()->getTabsModifier()->setAnimationCurve(nativeNode,
977             ANIMATION_CURVE_TYPE_STR, curve.c_str(), nullptr);
978     } else if (valueArg->IsObject(vm)) {
979         ArkUI_Uint32 type = ANIMATION_CURVE_TYPE_DEFAULT;
980         std::string aniTimFunc;
981         std::function<float(float)> customCallBack = nullptr;
982         GetAnimationCurveInfo(runtimeCallInfo, type, aniTimFunc, customCallBack);
983         GetArkUINodeModifiers()->getTabsModifier()->setAnimationCurve(nativeNode,
984             type, aniTimFunc.c_str(), reinterpret_cast<void*>(&customCallBack));
985     } else {
986         GetArkUINodeModifiers()->getTabsModifier()->resetAnimationCurve(nativeNode);
987     }
988     return panda::JSValueRef::Undefined(vm);
989 }
990 
ResetAnimationCurve(ArkUIRuntimeCallInfo * runtimeCallInfo)991 ArkUINativeModuleValue TabsBridge::ResetAnimationCurve(ArkUIRuntimeCallInfo* runtimeCallInfo)
992 {
993     EcmaVM* vm = runtimeCallInfo->GetVM();
994     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
995     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
996     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
997     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
998     GetArkUINodeModifiers()->getTabsModifier()->resetAnimationCurve(nativeNode);
999     return panda::JSValueRef::Undefined(vm);
1000 }
1001 
SetNoMinHeightLimit(ArkUIRuntimeCallInfo * runtimeCallInfo)1002 ArkUINativeModuleValue TabsBridge::SetNoMinHeightLimit(ArkUIRuntimeCallInfo* runtimeCallInfo)
1003 {
1004     EcmaVM* vm = runtimeCallInfo->GetVM();
1005     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1006     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1007     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1008     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1009     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1010     bool value = secondArg->ToBoolean(vm)->Value();
1011     GetArkUINodeModifiers()->getTabsModifier()->setNoMinHeightLimit(nativeNode, value);
1012     return panda::JSValueRef::Undefined(vm);
1013 }
1014 
ResetNoMinHeightLimit(ArkUIRuntimeCallInfo * runtimeCallInfo)1015 ArkUINativeModuleValue TabsBridge::ResetNoMinHeightLimit(ArkUIRuntimeCallInfo* runtimeCallInfo)
1016 {
1017     EcmaVM* vm = runtimeCallInfo->GetVM();
1018     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1019     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1020     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1021     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1022     GetArkUINodeModifiers()->getTabsModifier()->resetNoMinHeightLimit(nativeNode);
1023     return panda::JSValueRef::Undefined(vm);
1024 }
1025 
SetAnimationDuration(ArkUIRuntimeCallInfo * runtimeCallInfo)1026 ArkUINativeModuleValue TabsBridge::SetAnimationDuration(ArkUIRuntimeCallInfo* runtimeCallInfo)
1027 {
1028     EcmaVM* vm = runtimeCallInfo->GetVM();
1029     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1030     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1031     Local<JSValueRef> durationArg = runtimeCallInfo->GetCallArgRef(1);
1032     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1033     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1034     if (durationArg->IsNull() || durationArg->IsUndefined()) {
1035         GetArkUINodeModifiers()->getTabsModifier()->resetAnimationDuration(nativeNode);
1036         return panda::JSValueRef::Undefined(vm);
1037     }
1038     float duration = durationArg->ToNumber(vm)->Value();
1039     GetArkUINodeModifiers()->getTabsModifier()->setAnimationDuration(nativeNode, duration);
1040     return panda::JSValueRef::Undefined(vm);
1041 }
1042 
ResetAnimationDuration(ArkUIRuntimeCallInfo * runtimeCallInfo)1043 ArkUINativeModuleValue TabsBridge::ResetAnimationDuration(ArkUIRuntimeCallInfo* runtimeCallInfo)
1044 {
1045     EcmaVM* vm = runtimeCallInfo->GetVM();
1046     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1047     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1048     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1049     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1050     GetArkUINodeModifiers()->getTabsModifier()->resetAnimationDuration(nativeNode);
1051     return panda::JSValueRef::Undefined(vm);
1052 }
1053 
SetBarPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)1054 ArkUINativeModuleValue TabsBridge::SetBarPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
1055 {
1056     EcmaVM* vm = runtimeCallInfo->GetVM();
1057     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1058     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1059     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1060     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1061     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1062     int32_t barVal = secondArg->ToNumber(vm)->Value();
1063     GetArkUINodeModifiers()->getTabsModifier()->setTabBarPosition(nativeNode, barVal);
1064     return panda::JSValueRef::Undefined(vm);
1065 }
1066 
ResetBarPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)1067 ArkUINativeModuleValue TabsBridge::ResetBarPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
1068 {
1069     EcmaVM* vm = runtimeCallInfo->GetVM();
1070     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1071     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1072     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1073     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1074     GetArkUINodeModifiers()->getTabsModifier()->resetTabBarPosition(nativeNode);
1075     return panda::JSValueRef::Undefined(vm);
1076 }
1077 
SetTabClip(ArkUIRuntimeCallInfo * runtimeCallInfo)1078 ArkUINativeModuleValue TabsBridge::SetTabClip(ArkUIRuntimeCallInfo* runtimeCallInfo)
1079 {
1080     EcmaVM* vm = runtimeCallInfo->GetVM();
1081     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1082     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1083     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1084     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1085     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1086 
1087     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1088     if (info[TABS_ARG_INDEX_1]->IsUndefined()) {
1089         ViewAbstract::SetClipEdge(frameNode, false);
1090         return panda::JSValueRef::Undefined(vm);
1091     }
1092     if (info[TABS_ARG_INDEX_1]->IsObject()) {
1093         CommonBridge::SetClip(runtimeCallInfo);
1094     } else if (info[TABS_ARG_INDEX_1]->IsBoolean()) {
1095         GetArkUINodeModifiers()->getTabsModifier()->setTabClip(nativeNode, info[TABS_ARG_INDEX_1]->ToBoolean());
1096     }
1097     return panda::JSValueRef::Undefined(vm);
1098 }
1099 
ResetTabClip(ArkUIRuntimeCallInfo * runtimeCallInfo)1100 ArkUINativeModuleValue TabsBridge::ResetTabClip(ArkUIRuntimeCallInfo* runtimeCallInfo)
1101 {
1102     EcmaVM* vm = runtimeCallInfo->GetVM();
1103     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1104     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1105     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1106     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1107     GetArkUINodeModifiers()->getTabsModifier()->resetTabClip(nativeNode);
1108     return panda::JSValueRef::Undefined(vm);
1109 }
1110 
SetTabEdgeEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)1111 ArkUINativeModuleValue TabsBridge::SetTabEdgeEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
1112 {
1113     EcmaVM* vm = runtimeCallInfo->GetVM();
1114     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1115     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1116     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1117     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1118     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1119 
1120     int32_t effect = static_cast<int32_t>(EdgeEffect::SPRING);
1121     if (secondArg->IsUndefined() || secondArg->IsNull()) {
1122         effect = static_cast<int32_t>(EdgeEffect::SPRING);
1123     } else {
1124         effect = secondArg->Int32Value(vm);
1125     }
1126     if (effect < static_cast<int32_t>(EdgeEffect::SPRING) || effect > static_cast<int32_t>(EdgeEffect::NONE)) {
1127         effect = static_cast<int32_t>(EdgeEffect::SPRING);
1128     }
1129     GetArkUINodeModifiers()->getTabsModifier()->setTabEdgeEffect(nativeNode, effect);
1130     return panda::JSValueRef::Undefined(vm);
1131 }
1132 
ResetTabEdgeEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)1133 ArkUINativeModuleValue TabsBridge::ResetTabEdgeEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
1134 {
1135     EcmaVM* vm = runtimeCallInfo->GetVM();
1136     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1137     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1138     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1139     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1140     GetArkUINodeModifiers()->getTabsModifier()->resetTabEdgeEffect(nativeNode);
1141     return panda::JSValueRef::Undefined(vm);
1142 }
1143 
SetTabPageFlipMode(ArkUIRuntimeCallInfo * runtimeCallInfo)1144 ArkUINativeModuleValue TabsBridge::SetTabPageFlipMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
1145 {
1146     EcmaVM* vm = runtimeCallInfo->GetVM();
1147     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1148     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1149     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1150     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1151     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1);
1152     if (valueArg->IsNumber()) {
1153         int32_t pageFlipMode = valueArg->Int32Value(vm);
1154         GetArkUINodeModifiers()->getTabsModifier()->setTabPageFlipMode(nativeNode, pageFlipMode);
1155     } else {
1156         GetArkUINodeModifiers()->getTabsModifier()->resetTabPageFlipMode(nativeNode);
1157     }
1158     return panda::JSValueRef::Undefined(vm);
1159 }
1160 
ResetTabPageFlipMode(ArkUIRuntimeCallInfo * runtimeCallInfo)1161 ArkUINativeModuleValue TabsBridge::ResetTabPageFlipMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
1162 {
1163     EcmaVM* vm = runtimeCallInfo->GetVM();
1164     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1165     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1166     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1167     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1168     GetArkUINodeModifiers()->getTabsModifier()->resetTabPageFlipMode(nativeNode);
1169     return panda::JSValueRef::Undefined(vm);
1170 }
1171 
SetWidthAuto(ArkUIRuntimeCallInfo * runtimeCallInfo)1172 ArkUINativeModuleValue TabsBridge::SetWidthAuto(ArkUIRuntimeCallInfo* runtimeCallInfo)
1173 {
1174     EcmaVM* vm = runtimeCallInfo->GetVM();
1175     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1176     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1177     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1178     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1179     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1180 
1181     CalcDimension width;
1182     ArkTSUtils::ParseJsDimensionVpNG(vm, secondArg, width);
1183     if (width.Unit() == DimensionUnit::AUTO) {
1184         CommonBridge::SetWidth(runtimeCallInfo);
1185         GetArkUINodeModifiers()->getTabsModifier()->setTabWidthAuto(nativeNode);
1186         return panda::JSValueRef::Undefined(vm);
1187     } else {
1188         CommonBridge::SetWidth(runtimeCallInfo);
1189         GetArkUINodeModifiers()->getTabsModifier()->resetTabWidthAuto(nativeNode);
1190     }
1191     CommonBridge::SetWidth(runtimeCallInfo);
1192     return panda::JSValueRef::Undefined(vm);
1193 }
1194 
ResetWidthAuto(ArkUIRuntimeCallInfo * runtimeCallInfo)1195 ArkUINativeModuleValue TabsBridge::ResetWidthAuto(ArkUIRuntimeCallInfo* runtimeCallInfo)
1196 {
1197     CommonBridge::ResetWidth(runtimeCallInfo);
1198     EcmaVM* vm = runtimeCallInfo->GetVM();
1199     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1200     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1201     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1202     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1203     GetArkUINodeModifiers()->getTabsModifier()->resetTabWidthAuto(nativeNode);
1204     return panda::JSValueRef::Undefined(vm);
1205 }
1206 
SetHeightAuto(ArkUIRuntimeCallInfo * runtimeCallInfo)1207 ArkUINativeModuleValue TabsBridge::SetHeightAuto(ArkUIRuntimeCallInfo* runtimeCallInfo)
1208 {
1209     EcmaVM* vm = runtimeCallInfo->GetVM();
1210     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1211     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1212     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1213     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1214     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1215 
1216     CalcDimension height;
1217     ArkTSUtils::ParseJsDimensionVpNG(vm, secondArg, height);
1218     if (height.Unit() == DimensionUnit::AUTO) {
1219         CommonBridge::SetHeight(runtimeCallInfo);
1220         GetArkUINodeModifiers()->getTabsModifier()->setTabHeightAuto(nativeNode);
1221         return panda::JSValueRef::Undefined(vm);
1222     } else {
1223         CommonBridge::SetHeight(runtimeCallInfo);
1224         GetArkUINodeModifiers()->getTabsModifier()->resetTabHeightAuto(nativeNode);
1225     }
1226     CommonBridge::SetHeight(runtimeCallInfo);
1227     return panda::JSValueRef::Undefined(vm);
1228 }
1229 
ResetHeightAuto(ArkUIRuntimeCallInfo * runtimeCallInfo)1230 ArkUINativeModuleValue TabsBridge::ResetHeightAuto(ArkUIRuntimeCallInfo* runtimeCallInfo)
1231 {
1232     CommonBridge::ResetHeight(runtimeCallInfo);
1233     EcmaVM* vm = runtimeCallInfo->GetVM();
1234     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1235     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1236     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1237     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1238     GetArkUINodeModifiers()->getTabsModifier()->resetTabHeightAuto(nativeNode);
1239     return panda::JSValueRef::Undefined(vm);
1240 }
1241 
SetAnimateMode(ArkUIRuntimeCallInfo * runtimeCallInfo)1242 ArkUINativeModuleValue TabsBridge::SetAnimateMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
1243 {
1244     EcmaVM* vm = runtimeCallInfo->GetVM();
1245     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1246     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1247     Local<JSValueRef> animateModeArg = runtimeCallInfo->GetCallArgRef(1);
1248     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1249     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1250     if (!animateModeArg->IsNumber()) {
1251         GetArkUINodeModifiers()->getTabsModifier()->resetAnimateMode(nativeNode);
1252         return panda::JSValueRef::Undefined(vm);
1253     }
1254     uint32_t animateModeValue = animateModeArg->Uint32Value(vm);
1255     if (animateModeValue >= static_cast<uint32_t>(TabAnimateMode::MAX_VALUE)) {
1256         GetArkUINodeModifiers()->getTabsModifier()->resetAnimateMode(nativeNode);
1257         return panda::JSValueRef::Undefined(vm);
1258     }
1259     GetArkUINodeModifiers()->getTabsModifier()->setAnimateMode(nativeNode, animateModeValue);
1260     return panda::JSValueRef::Undefined(vm);
1261 }
1262 
ResetAnimateMode(ArkUIRuntimeCallInfo * runtimeCallInfo)1263 ArkUINativeModuleValue TabsBridge::ResetAnimateMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
1264 {
1265     EcmaVM* vm = runtimeCallInfo->GetVM();
1266     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1267     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1268     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1269     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1270     GetArkUINodeModifiers()->getTabsModifier()->resetAnimateMode(nativeNode);
1271     return panda::JSValueRef::Undefined(vm);
1272 }
1273 
SetTabsOnSelected(ArkUIRuntimeCallInfo * runtimeCallInfo)1274 ArkUINativeModuleValue TabsBridge::SetTabsOnSelected(ArkUIRuntimeCallInfo* runtimeCallInfo)
1275 {
1276     EcmaVM* vm = runtimeCallInfo->GetVM();
1277     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1278     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1279     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
1280     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1281     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1282         GetArkUINodeModifiers()->getTabsModifier()->resetTabsOnSelected(nativeNode);
1283         return panda::JSValueRef::Undefined(vm);
1284     }
1285     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1286     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1287     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1288     std::function<void(const BaseEventInfo* info)> callback =
1289         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](const BaseEventInfo* info) {
1290         panda::LocalScope pandaScope(vm);
1291         panda::TryCatch trycatch(vm);
1292         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1293         const auto* tabsInfo = TypeInfoHelper::DynamicCast<TabContentChangeEvent>(info);
1294         if (!tabsInfo) {
1295             TAG_LOGW(AceLogTag::ACE_TABS, "Tabs onSelected callback execute failed.");
1296             return;
1297         }
1298         panda::Local<panda::NumberRef> indexParam = panda::NumberRef::New(vm, tabsInfo->GetIndex());
1299         panda::Local<panda::JSValueRef> params[1] = { indexParam }; // 1: Array length
1300         func->Call(vm, func.ToLocal(), params, 1); // 1: Array length
1301     };
1302     GetArkUINodeModifiers()->getTabsModifier()->setTabsOnSelected(nativeNode, reinterpret_cast<void*>(&callback));
1303     return panda::JSValueRef::Undefined(vm);
1304 }
1305 
ResetTabsOnSelected(ArkUIRuntimeCallInfo * runtimeCallInfo)1306 ArkUINativeModuleValue TabsBridge::ResetTabsOnSelected(ArkUIRuntimeCallInfo* runtimeCallInfo)
1307 {
1308     EcmaVM* vm = runtimeCallInfo->GetVM();
1309     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1310     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1311     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1312     GetArkUINodeModifiers()->getTabsModifier()->resetTabsOnSelected(nativeNode);
1313     return panda::JSValueRef::Undefined(vm);
1314 }
1315 
SetCachedMaxCount(ArkUIRuntimeCallInfo * runtimeCallInfo)1316 ArkUINativeModuleValue TabsBridge::SetCachedMaxCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
1317 {
1318     EcmaVM* vm = runtimeCallInfo->GetVM();
1319     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1320     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1321     Local<JSValueRef> countArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
1322     Local<JSValueRef> modeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_2);
1323     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1324     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1325 
1326     int32_t count = 0;
1327     if (countArg->IsNumber() && countArg->Int32Value(vm) >= 0) {
1328         count = countArg->Int32Value(vm);
1329     } else {
1330         GetArkUINodeModifiers()->getTabsModifier()->resetCachedMaxCount(nativeNode);
1331         return panda::JSValueRef::Undefined(vm);
1332     }
1333     int32_t mode = 0;
1334     if (modeArg->IsNumber()) {
1335         mode = modeArg->Int32Value(vm);
1336     }
1337     GetArkUINodeModifiers()->getTabsModifier()->setCachedMaxCount(nativeNode, count, mode);
1338     return panda::JSValueRef::Undefined(vm);
1339 }
1340 
ResetCachedMaxCount(ArkUIRuntimeCallInfo * runtimeCallInfo)1341 ArkUINativeModuleValue TabsBridge::ResetCachedMaxCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
1342 {
1343     EcmaVM* vm = runtimeCallInfo->GetVM();
1344     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1345     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1346     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1347     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1348     GetArkUINodeModifiers()->getTabsModifier()->resetCachedMaxCount(nativeNode);
1349     return panda::JSValueRef::Undefined(vm);
1350 }
SetTabsOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1351 ArkUINativeModuleValue TabsBridge::SetTabsOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1352 {
1353     EcmaVM* vm = runtimeCallInfo->GetVM();
1354     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1355     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1356     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
1357     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1358     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1359     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1360     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1361         GetArkUINodeModifiers()->getTabsModifier()->resetTabsOnChange(nativeNode);
1362         return panda::JSValueRef::Undefined(vm);
1363     }
1364     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1365 
1366     std::function<void(const BaseEventInfo* info)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
1367                                                                   const BaseEventInfo* info) {
1368         panda::LocalScope pandaScope(vm);
1369         panda::TryCatch trycatch(vm);
1370         const auto* tabsInfo = TypeInfoHelper::DynamicCast<TabContentChangeEvent>(info);
1371         if (!tabsInfo) {
1372             TAG_LOGW(AceLogTag::ACE_TABS, "Tabs onChange callback execute failed.");
1373             return;
1374         }
1375         ACE_SCORING_EVENT("Tabs.onChange");
1376         ACE_SCOPED_TRACE("Tabs.onChange index %d", tabsInfo->GetIndex());
1377         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1378         panda::Local<panda::JSValueRef> params[1] = { panda::NumberRef::New(vm, tabsInfo->GetIndex()) };
1379         func->Call(vm, func.ToLocal(), params, 1);
1380     };
1381     GetArkUINodeModifiers()->getTabsModifier()->setTabsOnChange(nativeNode, reinterpret_cast<void*>(&callback));
1382     return panda::JSValueRef::Undefined(vm);
1383 }
1384 
ResetTabsOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1385 ArkUINativeModuleValue TabsBridge::ResetTabsOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1386 {
1387     EcmaVM* vm = runtimeCallInfo->GetVM();
1388     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1389     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1390     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1391     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1392     GetArkUINodeModifiers()->getTabsModifier()->resetTabsOnChange(nativeNode);
1393     return panda::JSValueRef::Undefined(vm);
1394 }
1395 
SetTabsOnTabBarClick(ArkUIRuntimeCallInfo * runtimeCallInfo)1396 ArkUINativeModuleValue TabsBridge::SetTabsOnTabBarClick(ArkUIRuntimeCallInfo* runtimeCallInfo)
1397 {
1398     EcmaVM* vm = runtimeCallInfo->GetVM();
1399     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1400     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1401     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
1402     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1403     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1404     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1405     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1406         GetArkUINodeModifiers()->getTabsModifier()->resetTabsOnTabBarClick(nativeNode);
1407         return panda::JSValueRef::Undefined(vm);
1408     }
1409     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1410 
1411     std::function<void(const BaseEventInfo* info)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
1412                                                                   const BaseEventInfo* info) {
1413         panda::LocalScope pandaScope(vm);
1414         panda::TryCatch trycatch(vm);
1415         const auto* tabsInfo = TypeInfoHelper::DynamicCast<TabContentChangeEvent>(info);
1416         if (!tabsInfo) {
1417             TAG_LOGW(AceLogTag::ACE_TABS, "Tabs onTabBarClick callback execute failed.");
1418             return;
1419         }
1420         ACE_SCORING_EVENT("Tabs.onTabBarClick");
1421         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1422         panda::Local<panda::JSValueRef> params[1] = { panda::NumberRef::New(vm, tabsInfo->GetIndex()) };
1423         func->Call(vm, func.ToLocal(), params, 1);
1424     };
1425     GetArkUINodeModifiers()->getTabsModifier()->setTabsOnTabBarClick(nativeNode, reinterpret_cast<void*>(&callback));
1426     return panda::JSValueRef::Undefined(vm);
1427 }
1428 
ResetTabsOnTabBarClick(ArkUIRuntimeCallInfo * runtimeCallInfo)1429 ArkUINativeModuleValue TabsBridge::ResetTabsOnTabBarClick(ArkUIRuntimeCallInfo* runtimeCallInfo)
1430 {
1431     EcmaVM* vm = runtimeCallInfo->GetVM();
1432     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1433     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1434     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1435     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1436     GetArkUINodeModifiers()->getTabsModifier()->resetTabsOnTabBarClick(nativeNode);
1437     return panda::JSValueRef::Undefined(vm);
1438 }
1439 
SetTabsOnAnimationStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1440 ArkUINativeModuleValue TabsBridge::SetTabsOnAnimationStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1441 {
1442     EcmaVM* vm = runtimeCallInfo->GetVM();
1443     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1444     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1445     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1446     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1447     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1448     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1449         GetArkUINodeModifiers()->getTabsModifier()->resetTabsOnAnimationStart(nativeNode);
1450         return panda::JSValueRef::Undefined(vm);
1451     }
1452     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1453     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1454     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1455 
1456     std::function<void(int32_t, int32_t, const AnimationCallbackInfo&)> callback =
1457         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
1458             int32_t index, int32_t targetIndex, const AnimationCallbackInfo& extraInfo) {
1459             panda::LocalScope pandaScope(vm);
1460             panda::TryCatch trycatch(vm);
1461             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1462             panda::Local<panda::NumberRef> indexParam = panda::NumberRef::New(vm, index);
1463             panda::Local<panda::NumberRef> targetIndexParam = panda::NumberRef::New(vm, targetIndex);
1464             const char* keys[] = { "currentOffset", "targetOffset", "velocity" };
1465             Local<JSValueRef> values[] = { panda::NumberRef::New(vm, extraInfo.currentOffset.value_or(0.0f)),
1466                 panda::NumberRef::New(vm, extraInfo.targetOffset.value_or(0.0f)),
1467                 panda::NumberRef::New(vm, extraInfo.velocity.value_or(0.0f)) };
1468             auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1469             panda::Local<panda::JSValueRef> params[3] = { indexParam, targetIndexParam,
1470                 eventObject };                         // 3: Array length
1471             func->Call(vm, func.ToLocal(), params, 3); // 3: Array length
1472         };
1473     GetArkUINodeModifiers()->getTabsModifier()->setTabsOnAnimationStart(nativeNode, reinterpret_cast<void*>(&callback));
1474     return panda::JSValueRef::Undefined(vm);
1475 }
ResetTabsOnAnimationStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1476 ArkUINativeModuleValue TabsBridge::ResetTabsOnAnimationStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1477 {
1478     EcmaVM* vm = runtimeCallInfo->GetVM();
1479     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1480     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1481     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1482     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1483     GetArkUINodeModifiers()->getTabsModifier()->resetTabsOnAnimationStart(nativeNode);
1484     return panda::JSValueRef::Undefined(vm);
1485 }
1486 
SetTabsOnAnimationEnd(ArkUIRuntimeCallInfo * runtimeCallInfo)1487 ArkUINativeModuleValue TabsBridge::SetTabsOnAnimationEnd(ArkUIRuntimeCallInfo* runtimeCallInfo)
1488 {
1489     EcmaVM* vm = runtimeCallInfo->GetVM();
1490     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1491     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1492     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1493     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1494     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1495     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1496         GetArkUINodeModifiers()->getTabsModifier()->resetTabsOnAnimationEnd(nativeNode);
1497         return panda::JSValueRef::Undefined(vm);
1498     }
1499     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1500     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1501     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1502     std::function<void(int32_t, const AnimationCallbackInfo&)> callback =
1503         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](int32_t index, const AnimationCallbackInfo& extraInfo) {
1504             panda::LocalScope pandaScope(vm);
1505             panda::TryCatch trycatch(vm);
1506             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1507             panda::Local<panda::NumberRef> indexParam = panda::NumberRef::New(vm, index);
1508             const char* keys[] = { "currentOffset", "targetOffset", "velocity" };
1509             Local<JSValueRef> values[] = { panda::NumberRef::New(vm, extraInfo.currentOffset.value_or(0.0f)),
1510                 panda::NumberRef::New(vm, 0), panda::NumberRef::New(vm, 0) };
1511             auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1512             panda::Local<panda::JSValueRef> params[2] = { indexParam, eventObject }; // 2: Array length
1513             func->Call(vm, func.ToLocal(), params, 2);                               // 2: Array length
1514         };
1515     GetArkUINodeModifiers()->getTabsModifier()->setTabsOnAnimationEnd(nativeNode, reinterpret_cast<void*>(&callback));
1516     return panda::JSValueRef::Undefined(vm);
1517 }
1518 
ResetTabsOnAnimationEnd(ArkUIRuntimeCallInfo * runtimeCallInfo)1519 ArkUINativeModuleValue TabsBridge::ResetTabsOnAnimationEnd(ArkUIRuntimeCallInfo* runtimeCallInfo)
1520 {
1521     EcmaVM* vm = runtimeCallInfo->GetVM();
1522     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1523     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1524     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1525     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1526     GetArkUINodeModifiers()->getTabsModifier()->resetTabsOnAnimationEnd(nativeNode);
1527     return panda::JSValueRef::Undefined(vm);
1528 }
1529 
SetTabsOnGestureSwipe(ArkUIRuntimeCallInfo * runtimeCallInfo)1530 ArkUINativeModuleValue TabsBridge::SetTabsOnGestureSwipe(ArkUIRuntimeCallInfo* runtimeCallInfo)
1531 {
1532     EcmaVM* vm = runtimeCallInfo->GetVM();
1533     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1534     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1535     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
1536     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1537     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1538     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1539     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1540         GetArkUINodeModifiers()->getTabsModifier()->resetTabsOnGestureSwipe(nativeNode);
1541         return panda::JSValueRef::Undefined(vm);
1542     }
1543     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1544 
1545     std::function<void(int32_t, const AnimationCallbackInfo&)> callback =
1546         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](int32_t index, const AnimationCallbackInfo& extraInfo) {
1547             panda::LocalScope pandaScope(vm);
1548             panda::TryCatch trycatch(vm);
1549             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1550             panda::Local<panda::NumberRef> indexParam = panda::NumberRef::New(vm, index);
1551             const char* keys[] = { "currentOffset", "targetOffset", "velocity" };
1552             Local<JSValueRef> values[] = { panda::NumberRef::New(vm, extraInfo.currentOffset.value_or(0.0f)),
1553                 panda::NumberRef::New(vm, 0), panda::NumberRef::New(vm, 0) };
1554             auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1555             panda::Local<panda::JSValueRef> params[2] = { indexParam, eventObject }; // 2: Array length
1556             func->Call(vm, func.ToLocal(), params, 2);                               // 2: Array length
1557         };
1558     GetArkUINodeModifiers()->getTabsModifier()->setTabsOnGestureSwipe(nativeNode, reinterpret_cast<void*>(&callback));
1559     return panda::JSValueRef::Undefined(vm);
1560 }
1561 
ResetTabsOnGestureSwipe(ArkUIRuntimeCallInfo * runtimeCallInfo)1562 ArkUINativeModuleValue TabsBridge::ResetTabsOnGestureSwipe(ArkUIRuntimeCallInfo* runtimeCallInfo)
1563 {
1564     EcmaVM* vm = runtimeCallInfo->GetVM();
1565     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1566     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1567     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1568     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1569     GetArkUINodeModifiers()->getTabsModifier()->resetTabsOnGestureSwipe(nativeNode);
1570     return panda::JSValueRef::Undefined(vm);
1571 }
1572 
SetTabsOnContentWillChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1573 ArkUINativeModuleValue TabsBridge::SetTabsOnContentWillChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1574 {
1575     EcmaVM* vm = runtimeCallInfo->GetVM();
1576     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1577     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1578     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
1579     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1580     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1581     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1582     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1583         GetArkUINodeModifiers()->getTabsModifier()->resetTabsOnContentWillChange(nativeNode);
1584         return panda::JSValueRef::Undefined(vm);
1585     }
1586 
1587     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1588     std::function<bool(int32_t, int32_t)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
1589                                                          int32_t currentIndex, int32_t comingIndex) -> bool {
1590         panda::LocalScope pandaScope(vm);
1591         panda::TryCatch trycatch(vm);
1592         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1593 
1594         panda::Local<panda::NumberRef> currentIndexParam = panda::NumberRef::New(vm, currentIndex);
1595         panda::Local<panda::NumberRef> comingIndexParam = panda::NumberRef::New(vm, comingIndex);
1596         // 2: Array length
1597         panda::Local<panda::JSValueRef> params[2] = { currentIndexParam, comingIndexParam };
1598         auto result = func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
1599         if (result->IsBoolean()) {
1600             return result->ToBoolean(vm)->Value();
1601         }
1602         return false;
1603     };
1604     GetArkUINodeModifiers()->getTabsModifier()->setTabsOnContentWillChange(
1605         nativeNode, reinterpret_cast<void*>(&callback));
1606     return panda::JSValueRef::Undefined(vm);
1607 }
1608 
ResetTabsOnContentWillChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1609 ArkUINativeModuleValue TabsBridge::ResetTabsOnContentWillChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1610 {
1611     EcmaVM* vm = runtimeCallInfo->GetVM();
1612     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1613     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1614     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1615     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1616     GetArkUINodeModifiers()->getTabsModifier()->resetTabsOnContentWillChange(nativeNode);
1617     return panda::JSValueRef::Undefined(vm);
1618 }
1619 
SetTabsCustomContentTransition(ArkUIRuntimeCallInfo * runtimeCallInfo)1620 ArkUINativeModuleValue TabsBridge::SetTabsCustomContentTransition(ArkUIRuntimeCallInfo* runtimeCallInfo)
1621 {
1622     EcmaVM* vm = runtimeCallInfo->GetVM();
1623     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1624     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1625     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1626     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1627     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1628     using namespace OHOS::Ace::Framework;
1629     JsiCallbackInfo info = JsiCallbackInfo(runtimeCallInfo);
1630     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1631     if (info.Length() != 2) { // 2: Array length
1632         return panda::JSValueRef::Undefined(vm);
1633     }
1634 
1635     if (!info[1]->IsFunction()) {
1636         GetArkUINodeModifiers()->getTabsModifier()->resetTabsIsCustomAnimation(nativeNode);
1637         return panda::JSValueRef::Undefined(vm);
1638     }
1639     auto transitionFunc = JSRef<JSFunc>::Cast(info[1]);
1640 
1641     ParseCustomContentTransition(transitionFunc, info);
1642 
1643     GetArkUINodeModifiers()->getTabsModifier()->setTabsIsCustomAnimation(nativeNode, true);
1644     return panda::JSValueRef::Undefined(vm);
1645 }
1646 
ResetTabsCustomContentTransition(ArkUIRuntimeCallInfo * runtimeCallInfo)1647 ArkUINativeModuleValue TabsBridge::ResetTabsCustomContentTransition(ArkUIRuntimeCallInfo* runtimeCallInfo)
1648 {
1649     EcmaVM* vm = runtimeCallInfo->GetVM();
1650     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1651     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1652     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1653     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1654     GetArkUINodeModifiers()->getTabsModifier()->resetTabsIsCustomAnimation(nativeNode);
1655     return panda::JSValueRef::Undefined(vm);
1656 }
1657 
ParseCustomContentTransition(const Framework::JSRef<Framework::JSFunc> & transitionFunc,const Framework::JsiCallbackInfo & info)1658 void TabsBridge::ParseCustomContentTransition(
1659     const Framework::JSRef<Framework::JSFunc>& transitionFunc, const Framework::JsiCallbackInfo& info)
1660 {
1661     using namespace OHOS::Ace::Framework;
1662     RefPtr<JsTabsFunction> jsCustomAnimationFunc =
1663         AceType::MakeRefPtr<JsTabsFunction>(transitionFunc);
1664     auto onCustomAnimation = [execCtx = info.GetExecutionContext(), func = std::move(jsCustomAnimationFunc)](
1665                                  int32_t from, int32_t to) -> TabContentAnimatedTransition {
1666         TabContentAnimatedTransition transitionInfo;
1667         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx, transitionInfo);
1668 
1669         auto ret = func->Execute(from, to);
1670         if (!ret->IsObject()) {
1671             return transitionInfo;
1672         }
1673 
1674         auto transitionObj = JSRef<JSObject>::Cast(ret);
1675         JSRef<JSVal> timeoutProperty = transitionObj->GetProperty("timeout");
1676         transitionInfo.timeout = DEFAULT_CUSTOM_ANIMATION_TIMEOUT;
1677         if (timeoutProperty->IsNumber()) {
1678             auto timeout = timeoutProperty->ToNumber<int32_t>();
1679             transitionInfo.timeout = timeout < 0 ? DEFAULT_CUSTOM_ANIMATION_TIMEOUT : timeout;
1680         }
1681 
1682         JSRef<JSVal> transition = transitionObj->GetProperty("transition");
1683         if (transition->IsFunction()) {
1684             RefPtr<JsTabsFunction> jsOnTransition =
1685                 AceType::MakeRefPtr<JsTabsFunction>(transition);
1686             auto onTransition = [execCtx, func = std::move(jsOnTransition)](
1687                                     const RefPtr<TabContentTransitionProxy>& proxy) {
1688                 JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
1689                 ACE_SCORING_EVENT("onTransition");
1690                 func->Execute(proxy);
1691             };
1692 
1693             transitionInfo.transition = std::move(onTransition);
1694         }
1695 
1696         return transitionInfo;
1697     };
1698 
1699     TabsModel::GetInstance()->SetOnCustomAnimation(std::move(onCustomAnimation));
1700 }
1701 } // namespace OHOS::Ace::NG
1702