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/utils/utils.h"
18 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
19 #include "core/components/common/properties/color.h"
20 #include "frameworks/bridge/common/utils/utils.h"
21 #include "frameworks/bridge/declarative_frontend/engine/js_types.h"
22 #include "frameworks/bridge/declarative_frontend/jsview/js_view_abstract.h"
23 #include "frameworks/core/components/tab_bar/tab_theme.h"
24 #include "frameworks/core/components_ng/pattern/tabs/tabs_node.h"
25 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_common_bridge.h"
26 
27 namespace OHOS::Ace::NG {
28 constexpr int SIZE_OF_FIVE = 5;
29 constexpr int SIZE_OF_THREE = 3;
30 constexpr int SIZE_OF_VALUES = 2;
31 constexpr int TABS_ARG_INDEX_0 = 0;
32 constexpr int TABS_ARG_INDEX_1 = 1;
33 constexpr int TABS_ARG_INDEX_2 = 2;
34 constexpr int TABS_ARG_INDEX_3 = 3;
35 constexpr int TABS_ARG_INDEX_4 = 4;
36 constexpr int TABS_ARG_INDEX_5 = 5;
37 constexpr int32_t SM_COLUMN_NUM = 4;
38 constexpr int32_t MD_COLUMN_NUM = 8;
39 constexpr int32_t LG_COLUMN_NUM = 12;
40 constexpr int32_t DEFAULT_COLUMN = -1;
41 constexpr int REMAINDER = 2;
42 constexpr int TABBARMODE_SCROLLABLE = 1;
SetTabBarMode(ArkUIRuntimeCallInfo * runtimeCallInfo)43 ArkUINativeModuleValue TabsBridge::SetTabBarMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
44 {
45     EcmaVM* vm = runtimeCallInfo->GetVM();
46     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
47     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
48     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
49     Local<JSValueRef> barModeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
50     Local<JSValueRef> marginArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_2);
51     Local<JSValueRef> nonScrollableLayoutStyleArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_3);
52 
53     if (barModeArg->IsNull() || barModeArg->IsUndefined()) {
54         GetArkUINodeModifiers()->getTabsModifier()->resetTabBarMode(nativeNode);
55         return panda::JSValueRef::Undefined(vm);
56     }
57     TabBarMode barMode = TabBarMode::FIXED;
58     barMode = Framework::ConvertStrToTabBarMode(barModeArg->ToString(vm)->ToString(vm));
59     int32_t tabBarMode = static_cast<int32_t>(barMode);
60     GetArkUINodeModifiers()->getTabsModifier()->setTabBarMode(nativeNode, tabBarMode);
61 
62     if (tabBarMode == TABBARMODE_SCROLLABLE) {
63         if (marginArg->IsNull() || marginArg->IsUndefined() || nonScrollableLayoutStyleArg->IsNull() ||
64             nonScrollableLayoutStyleArg->IsUndefined()) {
65             GetArkUINodeModifiers()->getTabsModifier()->resetScrollableBarModeOptions(nativeNode);
66             return panda::JSValueRef::Undefined(vm);
67         }
68         int barModeStyle = nonScrollableLayoutStyleArg->Int32Value(vm);
69         CalcDimension margin(0.0, DimensionUnit::VP);
70         if (!ArkTSUtils::ParseJsDimensionVp(vm, marginArg, margin)) {
71             margin.Reset();
72         }
73 
74         GetArkUINodeModifiers()->getTabsModifier()->setScrollableBarModeOptions(
75             nativeNode, margin.Value(), static_cast<int>(margin.Unit()), barModeStyle);
76     }
77     return panda::JSValueRef::Undefined(vm);
78 }
79 
ResetTabBarMode(ArkUIRuntimeCallInfo * runtimeCallInfo)80 ArkUINativeModuleValue TabsBridge::ResetTabBarMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
81 {
82     EcmaVM* vm = runtimeCallInfo->GetVM();
83     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
84     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
85     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
86     GetArkUINodeModifiers()->getTabsModifier()->resetTabBarMode(nativeNode);
87     return panda::JSValueRef::Undefined(vm);
88 }
89 
SetScrollableBarModeOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)90 ArkUINativeModuleValue TabsBridge::SetScrollableBarModeOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
91 {
92     EcmaVM* vm = runtimeCallInfo->GetVM();
93     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
94     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
95     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
96     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_2);
97     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
98 
99     if (thirdArg->IsUndefined()) {
100         GetArkUINodeModifiers()->getTabsModifier()->resetScrollableBarModeOptions(nativeNode);
101         return panda::JSValueRef::Undefined(vm);
102     }
103     int barModeStyle = thirdArg->Int32Value(vm);
104 
105     CalcDimension margin(0.0, DimensionUnit::VP);
106     if (!ArkTSUtils::ParseJsDimensionVp(vm, secondArg, margin)) {
107         margin.Reset();
108     }
109 
110     GetArkUINodeModifiers()->getTabsModifier()->setScrollableBarModeOptions(
111         nativeNode, margin.Value(), static_cast<int>(margin.Unit()), barModeStyle);
112     return panda::JSValueRef::Undefined(vm);
113 }
114 
ResetScrollableBarModeOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)115 ArkUINativeModuleValue TabsBridge::ResetScrollableBarModeOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
116 {
117     EcmaVM* vm = runtimeCallInfo->GetVM();
118     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
119     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
120     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
121     GetArkUINodeModifiers()->getTabsModifier()->resetScrollableBarModeOptions(nativeNode);
122     return panda::JSValueRef::Undefined(vm);
123 }
124 
SetBarGridAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)125 ArkUINativeModuleValue TabsBridge::SetBarGridAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
126 {
127     EcmaVM* vm = runtimeCallInfo->GetVM();
128     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
129     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
130     Local<JSValueRef> smArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
131     Local<JSValueRef> mdArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_2);
132     Local<JSValueRef> lgArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_3);
133     Local<JSValueRef> gutterArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_4);
134     Local<JSValueRef> marginArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_5);
135     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
136 
137     int32_t sm = DEFAULT_COLUMN;
138     int32_t md = DEFAULT_COLUMN;
139     int32_t lg = DEFAULT_COLUMN;
140     if (smArg->IsNumber() && smArg->Int32Value(vm) >= 0 && smArg->Int32Value(vm) <= SM_COLUMN_NUM &&
141         smArg->Int32Value(vm) % REMAINDER == 0) {
142         sm = smArg->Int32Value(vm);
143     }
144     if (mdArg->IsNumber() && mdArg->Int32Value(vm) >= 0 && mdArg->Int32Value(vm) <= MD_COLUMN_NUM &&
145         mdArg->Int32Value(vm) % REMAINDER == 0) {
146         md = mdArg->Int32Value(vm);
147     }
148     if (lgArg->IsNumber() && lgArg->Int32Value(vm) >= 0 && lgArg->Int32Value(vm) <= LG_COLUMN_NUM &&
149         lgArg->Int32Value(vm) % REMAINDER == 0) {
150         lg = lgArg->Int32Value(vm);
151     }
152 
153     CalcDimension columnGutter;
154     CalcDimension columnMargin;
155     if (!ArkTSUtils::ParseJsDimensionVp(vm, gutterArg, columnGutter) || !NonNegative(columnGutter.Value()) ||
156         columnGutter.Unit() == DimensionUnit::PERCENT) {
157         columnGutter.Reset();
158     }
159     if (!ArkTSUtils::ParseJsDimensionVp(vm, marginArg, columnMargin) || !NonNegative(columnMargin.Value()) ||
160         columnMargin.Unit() == DimensionUnit::PERCENT) {
161         columnMargin.Reset();
162     }
163 
164     int unitsAndColumn[SIZE_OF_FIVE];
165     ArkUI_Float32 values[SIZE_OF_VALUES];
166 
167     values[TABS_ARG_INDEX_0] = static_cast<ArkUI_Float32>(columnGutter.Value());
168     values[TABS_ARG_INDEX_1] = static_cast<ArkUI_Float32>(columnMargin.Value());
169     unitsAndColumn[TABS_ARG_INDEX_0] = static_cast<int>(columnGutter.Unit());
170     unitsAndColumn[TABS_ARG_INDEX_1] = static_cast<int>(columnMargin.Unit());
171     unitsAndColumn[TABS_ARG_INDEX_2] = sm;
172     unitsAndColumn[TABS_ARG_INDEX_3] = md;
173     unitsAndColumn[TABS_ARG_INDEX_4] = lg;
174 
175     GetArkUINodeModifiers()->getTabsModifier()->setBarGridAlign(
176         nativeNode, values, SIZE_OF_VALUES, unitsAndColumn, SIZE_OF_FIVE);
177     return panda::JSValueRef::Undefined(vm);
178 }
179 
ResetBarGridAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)180 ArkUINativeModuleValue TabsBridge::ResetBarGridAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
181 {
182     EcmaVM* vm = runtimeCallInfo->GetVM();
183     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
184     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
185     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
186     GetArkUINodeModifiers()->getTabsModifier()->resetBarGridAlign(nativeNode);
187     return panda::JSValueRef::Undefined(vm);
188 }
189 
SetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)190 ArkUINativeModuleValue TabsBridge::SetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
191 {
192     EcmaVM* vm = runtimeCallInfo->GetVM();
193     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
194     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
195     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
196     Local<JSValueRef> dividerStrokeWidthArgs = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
197     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_2);
198     Local<JSValueRef> dividerStartMarginArgs = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_3);
199     Local<JSValueRef> dividerEndMarginArgs = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_4);
200     auto isDividerStrokeWidthArgsInvalid = dividerStrokeWidthArgs->IsNull() || dividerStrokeWidthArgs->IsUndefined();
201     auto isDividerStartMarginArgsInvalid = dividerStartMarginArgs->IsNull() || dividerStartMarginArgs->IsUndefined();
202     auto isDividerEndMarginArgsInvalid = dividerEndMarginArgs->IsNull() || dividerEndMarginArgs->IsUndefined();
203     auto isColorArgInvalid = colorArg->IsNull() || colorArg->IsUndefined();
204     if (isDividerStrokeWidthArgsInvalid && isDividerStartMarginArgsInvalid && isDividerEndMarginArgsInvalid &&
205         isColorArgInvalid) {
206         GetArkUINodeModifiers()->getTabsModifier()->resetDivider(nativeNode);
207         return panda::JSValueRef::Undefined(vm);
208     }
209 
210     CalcDimension dividerStrokeWidth;
211     CalcDimension dividerStartMargin;
212     CalcDimension dividerEndMargin;
213     uint32_t color;
214     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
215     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
216     auto context = frameNode->GetContext();
217     CHECK_NULL_RETURN(context, panda::NativePointerRef::New(vm, nullptr));
218     auto themeManager = context->GetThemeManager();
219     CHECK_NULL_RETURN(themeManager, panda::NativePointerRef::New(vm, nullptr));
220     auto tabTheme = themeManager->GetTheme<TabTheme>();
221     CHECK_NULL_RETURN(tabTheme, panda::NativePointerRef::New(vm, nullptr));
222 
223     if (isDividerStrokeWidthArgsInvalid ||
224         !ArkTSUtils::ParseJsDimensionVp(vm, dividerStrokeWidthArgs, dividerStrokeWidth) ||
225         LessNotEqual(dividerStrokeWidth.Value(), 0.0f) || dividerStrokeWidth.Unit() == DimensionUnit::PERCENT) {
226         dividerStrokeWidth.Reset();
227     }
228     Color colorObj;
229     if (isColorArgInvalid || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, colorObj)) {
230         color = tabTheme->GetDividerColor().GetValue();
231     } else {
232         color = colorObj.GetValue();
233     }
234     if (isDividerStartMarginArgsInvalid ||
235         !ArkTSUtils::ParseJsDimensionVp(vm, dividerStartMarginArgs, dividerStartMargin) ||
236         LessNotEqual(dividerStartMargin.Value(), 0.0f) || dividerStartMargin.Unit() == DimensionUnit::PERCENT) {
237         dividerStartMargin.Reset();
238     }
239     if (isDividerEndMarginArgsInvalid || !ArkTSUtils::ParseJsDimensionVp(vm, dividerEndMarginArgs, dividerEndMargin) ||
240         LessNotEqual(dividerEndMargin.Value(), 0.0f) || dividerEndMargin.Unit() == DimensionUnit::PERCENT) {
241         dividerEndMargin.Reset();
242     }
243     uint32_t size = SIZE_OF_THREE;
244     ArkUI_Float32 values[size];
245     int32_t units[size];
246     values[TABS_ARG_INDEX_0] = static_cast<ArkUI_Float32>(dividerStrokeWidth.Value());
247     values[TABS_ARG_INDEX_1] = static_cast<ArkUI_Float32>(dividerStartMargin.Value());
248     values[TABS_ARG_INDEX_2] = static_cast<ArkUI_Float32>(dividerEndMargin.Value());
249     units[TABS_ARG_INDEX_0] = static_cast<int32_t>(dividerStrokeWidth.Unit());
250     units[TABS_ARG_INDEX_1] = static_cast<int32_t>(dividerStartMargin.Unit());
251     units[TABS_ARG_INDEX_2] = static_cast<int32_t>(dividerEndMargin.Unit());
252     GetArkUINodeModifiers()->getTabsModifier()->setDivider(nativeNode, color, values, units, size);
253     return panda::JSValueRef::Undefined(vm);
254 }
255 
ResetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)256 ArkUINativeModuleValue TabsBridge::ResetDivider(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     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
262     GetArkUINodeModifiers()->getTabsModifier()->resetDivider(nativeNode);
263     return panda::JSValueRef::Undefined(vm);
264 }
265 
SetFadingEdge(ArkUIRuntimeCallInfo * runtimeCallInfo)266 ArkUINativeModuleValue TabsBridge::SetFadingEdge(ArkUIRuntimeCallInfo* runtimeCallInfo)
267 {
268     EcmaVM* vm = runtimeCallInfo->GetVM();
269     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
270     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
271     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
272     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
273     if (secondArg->IsUndefined() || secondArg->IsNull()) {
274         GetArkUINodeModifiers()->getTabsModifier()->resetFadingEdge(nativeNode);
275         return panda::JSValueRef::Undefined(vm);
276     }
277     bool fadingEdge = secondArg->ToBoolean(vm)->Value();
278     GetArkUINodeModifiers()->getTabsModifier()->setFadingEdge(nativeNode, fadingEdge);
279     return panda::JSValueRef::Undefined(vm);
280 }
281 
ResetFadingEdge(ArkUIRuntimeCallInfo * runtimeCallInfo)282 ArkUINativeModuleValue TabsBridge::ResetFadingEdge(ArkUIRuntimeCallInfo* runtimeCallInfo)
283 {
284     EcmaVM* vm = runtimeCallInfo->GetVM();
285     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
286     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
287     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
288     GetArkUINodeModifiers()->getTabsModifier()->resetFadingEdge(nativeNode);
289     return panda::JSValueRef::Undefined(vm);
290 }
291 
SetBarBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)292 ArkUINativeModuleValue TabsBridge::SetBarBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
293 {
294     EcmaVM* vm = runtimeCallInfo->GetVM();
295     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
296     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
297     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
298     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
299     Color color;
300     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
301         GetArkUINodeModifiers()->getTabsModifier()->resetBarBackgroundColor(nativeNode);
302     } else {
303         GetArkUINodeModifiers()->getTabsModifier()->setBarBackgroundColor(nativeNode, color.GetValue());
304     }
305     return panda::JSValueRef::Undefined(vm);
306 }
307 
ResetBarBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)308 ArkUINativeModuleValue TabsBridge::ResetBarBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
309 {
310     EcmaVM* vm = runtimeCallInfo->GetVM();
311     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
312     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
313     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
314     GetArkUINodeModifiers()->getTabsModifier()->resetBarBackgroundColor(nativeNode);
315     return panda::JSValueRef::Undefined(vm);
316 }
317 
SetBarBackgroundBlurStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)318 ArkUINativeModuleValue TabsBridge::SetBarBackgroundBlurStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
319 {
320     EcmaVM* vm = runtimeCallInfo->GetVM();
321     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
322     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
323     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
324     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
325     if (secondArg->IsNumber()) {
326         auto barBackgroundBlurStyle = secondArg->Int32Value(vm);
327         if (barBackgroundBlurStyle >= static_cast<int32_t>(BlurStyle::NO_MATERIAL) &&
328             barBackgroundBlurStyle <= static_cast<int32_t>(BlurStyle::COMPONENT_ULTRA_THICK)) {
329             GetArkUINodeModifiers()->getTabsModifier()->setBarBackgroundBlurStyle(nativeNode, barBackgroundBlurStyle);
330             return panda::JSValueRef::Undefined(vm);
331         }
332     }
333     GetArkUINodeModifiers()->getTabsModifier()->resetBarBackgroundBlurStyle(nativeNode);
334     return panda::JSValueRef::Undefined(vm);
335 }
336 
ResetBarBackgroundBlurStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)337 ArkUINativeModuleValue TabsBridge::ResetBarBackgroundBlurStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
338 {
339     EcmaVM* vm = runtimeCallInfo->GetVM();
340     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
341     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
342     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
343     GetArkUINodeModifiers()->getTabsModifier()->resetBarBackgroundBlurStyle(nativeNode);
344     return panda::JSValueRef::Undefined(vm);
345 }
346 
SetBarOverlap(ArkUIRuntimeCallInfo * runtimeCallInfo)347 ArkUINativeModuleValue TabsBridge::SetBarOverlap(ArkUIRuntimeCallInfo* runtimeCallInfo)
348 {
349     EcmaVM* vm = runtimeCallInfo->GetVM();
350     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
351     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
352     Local<JSValueRef> overlapArg = runtimeCallInfo->GetCallArgRef(1);
353     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
354     if (overlapArg->IsUndefined()) {
355         GetArkUINodeModifiers()->getTabsModifier()->resetBarOverlap(nativeNode);
356     } else {
357         bool overlap = overlapArg->ToBoolean(vm)->Value();
358         GetArkUINodeModifiers()->getTabsModifier()->setBarOverlap(nativeNode, overlap);
359     }
360 
361     return panda::JSValueRef::Undefined(vm);
362 }
363 
ResetBarOverlap(ArkUIRuntimeCallInfo * runtimeCallInfo)364 ArkUINativeModuleValue TabsBridge::ResetBarOverlap(ArkUIRuntimeCallInfo* runtimeCallInfo)
365 {
366     EcmaVM* vm = runtimeCallInfo->GetVM();
367     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
368     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
369     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
370     GetArkUINodeModifiers()->getTabsModifier()->resetBarOverlap(nativeNode);
371     return panda::JSValueRef::Undefined(vm);
372 }
SetIsVertical(ArkUIRuntimeCallInfo * runtimeCallInfo)373 ArkUINativeModuleValue TabsBridge::SetIsVertical(ArkUIRuntimeCallInfo* runtimeCallInfo)
374 {
375     EcmaVM* vm = runtimeCallInfo->GetVM();
376     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
377     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
378     Local<JSValueRef> isVerticalArg = runtimeCallInfo->GetCallArgRef(1);
379     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
380     if (isVerticalArg->IsNull() || isVerticalArg->IsUndefined()) {
381         GetArkUINodeModifiers()->getTabsModifier()->resetIsVertical(nativeNode);
382         return panda::JSValueRef::Undefined(vm);
383     }
384     bool isVertical = isVerticalArg->ToBoolean(vm)->Value();
385     GetArkUINodeModifiers()->getTabsModifier()->setIsVertical(nativeNode, isVertical);
386     return panda::JSValueRef::Undefined(vm);
387 }
388 
ResetIsVertical(ArkUIRuntimeCallInfo * runtimeCallInfo)389 ArkUINativeModuleValue TabsBridge::ResetIsVertical(ArkUIRuntimeCallInfo* runtimeCallInfo)
390 {
391     EcmaVM* vm = runtimeCallInfo->GetVM();
392     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
393     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
394     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
395     GetArkUINodeModifiers()->getTabsModifier()->resetIsVertical(nativeNode);
396     return panda::JSValueRef::Undefined(vm);
397 }
398 
SetTabBarPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)399 ArkUINativeModuleValue TabsBridge::SetTabBarPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
400 {
401     EcmaVM* vm = runtimeCallInfo->GetVM();
402     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
403     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
404     Local<JSValueRef> barValArg = runtimeCallInfo->GetCallArgRef(1);
405     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
406     if (barValArg->IsNull() || barValArg->IsUndefined()) {
407         GetArkUINodeModifiers()->getTabsModifier()->resetTabBarPosition(nativeNode);
408     } else {
409         int32_t barVal = barValArg->Int32Value(vm);
410         GetArkUINodeModifiers()->getTabsModifier()->setTabBarPosition(nativeNode, barVal);
411     }
412     return panda::JSValueRef::Undefined(vm);
413 }
414 
ResetTabBarPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)415 ArkUINativeModuleValue TabsBridge::ResetTabBarPosition(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     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
421     GetArkUINodeModifiers()->getTabsModifier()->resetTabBarPosition(nativeNode);
422     return panda::JSValueRef::Undefined(vm);
423 }
424 
SetScrollable(ArkUIRuntimeCallInfo * runtimeCallInfo)425 ArkUINativeModuleValue TabsBridge::SetScrollable(ArkUIRuntimeCallInfo* runtimeCallInfo)
426 {
427     EcmaVM* vm = runtimeCallInfo->GetVM();
428     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
429     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
430     Local<JSValueRef> scrollableArg = runtimeCallInfo->GetCallArgRef(1);
431     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
432     ArkUINativeModuleValue undefinedRes = panda::JSValueRef::Undefined(vm);
433 
434     if (scrollableArg->IsNull() || scrollableArg->IsUndefined()) {
435         GetArkUINodeModifiers()->getTabsModifier()->resetScrollable(nativeNode);
436         return undefinedRes;
437     }
438 
439     bool scrollable = scrollableArg->ToBoolean(vm)->Value();
440     GetArkUINodeModifiers()->getTabsModifier()->setScrollable(nativeNode, scrollable);
441     return undefinedRes;
442 }
443 
ResetScrollable(ArkUIRuntimeCallInfo * runtimeCallInfo)444 ArkUINativeModuleValue TabsBridge::ResetScrollable(ArkUIRuntimeCallInfo* runtimeCallInfo)
445 {
446     EcmaVM* vm = runtimeCallInfo->GetVM();
447     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
448     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
449     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
450     GetArkUINodeModifiers()->getTabsModifier()->resetScrollable(nativeNode);
451     return panda::JSValueRef::Undefined(vm);
452 }
453 
SetTabBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)454 ArkUINativeModuleValue TabsBridge::SetTabBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
455 {
456     EcmaVM* vm = runtimeCallInfo->GetVM();
457     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
458     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
459     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
460 
461     Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
462     CalcDimension width;
463     ArkUINativeModuleValue undefinedRes = panda::JSValueRef::Undefined(vm);
464 
465     if (jsValue->IsNull() || jsValue->IsUndefined() || !ArkTSUtils::ParseJsDimensionVpNG(vm, jsValue, width)) {
466         GetArkUINodeModifiers()->getTabsModifier()->resetTabBarWidth(nativeNode);
467         return undefinedRes;
468     }
469 
470     GetArkUINodeModifiers()->getTabsModifier()->setTabBarWidth(
471         nativeNode, width.Value(), static_cast<int>(width.Unit()));
472     return undefinedRes;
473 }
474 
ResetTabBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)475 ArkUINativeModuleValue TabsBridge::ResetTabBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
476 {
477     EcmaVM* vm = runtimeCallInfo->GetVM();
478     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
479     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
480     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
481     GetArkUINodeModifiers()->getTabsModifier()->resetTabBarWidth(nativeNode);
482     return panda::JSValueRef::Undefined(vm);
483 }
484 
SetTabBarHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)485 ArkUINativeModuleValue TabsBridge::SetTabBarHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
486 {
487     EcmaVM* vm = runtimeCallInfo->GetVM();
488     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
489     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
490     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
491     Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
492     CalcDimension height;
493     ArkUINativeModuleValue undefinedRes = panda::JSValueRef::Undefined(vm);
494 
495     if (jsValue->IsNull() || jsValue->IsUndefined() || !ArkTSUtils::ParseJsDimensionVpNG(vm, jsValue, height)) {
496         GetArkUINodeModifiers()->getTabsModifier()->resetTabBarHeight(nativeNode);
497         return undefinedRes;
498     }
499 
500     GetArkUINodeModifiers()->getTabsModifier()->setTabBarHeight(
501         nativeNode, height.Value(), static_cast<int>(height.Unit()));
502     return undefinedRes;
503 }
504 
ResetTabBarHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)505 ArkUINativeModuleValue TabsBridge::ResetTabBarHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
506 {
507     EcmaVM* vm = runtimeCallInfo->GetVM();
508     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
509     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
510     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
511     GetArkUINodeModifiers()->getTabsModifier()->resetTabBarHeight(nativeNode);
512     return panda::JSValueRef::Undefined(vm);
513 }
514 
SetBarAdaptiveHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)515 ArkUINativeModuleValue TabsBridge::SetBarAdaptiveHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
516 {
517     EcmaVM* vm = runtimeCallInfo->GetVM();
518     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
519     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
520     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
521     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
522     bool value = secondArg->ToBoolean(vm)->Value();
523     GetArkUINodeModifiers()->getTabsModifier()->setBarAdaptiveHeight(nativeNode, value);
524     return panda::JSValueRef::Undefined(vm);
525 }
526 
ResetBarAdaptiveHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)527 ArkUINativeModuleValue TabsBridge::ResetBarAdaptiveHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
528 {
529     EcmaVM* vm = runtimeCallInfo->GetVM();
530     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
531     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
532     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
533     GetArkUINodeModifiers()->getTabsModifier()->resetBarAdaptiveHeight(nativeNode);
534     return panda::JSValueRef::Undefined(vm);
535 }
536 
SetAnimationDuration(ArkUIRuntimeCallInfo * runtimeCallInfo)537 ArkUINativeModuleValue TabsBridge::SetAnimationDuration(ArkUIRuntimeCallInfo* runtimeCallInfo)
538 {
539     EcmaVM* vm = runtimeCallInfo->GetVM();
540     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
541     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
542     Local<JSValueRef> durationArg = runtimeCallInfo->GetCallArgRef(1);
543     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
544     if (durationArg->IsNull() || durationArg->IsUndefined()) {
545         GetArkUINodeModifiers()->getTabsModifier()->resetAnimationDuration(nativeNode);
546         return panda::JSValueRef::Undefined(vm);
547     }
548     float duration = durationArg->ToNumber(vm)->Value();
549     GetArkUINodeModifiers()->getTabsModifier()->setAnimationDuration(nativeNode, duration);
550     return panda::JSValueRef::Undefined(vm);
551 }
552 
ResetAnimationDuration(ArkUIRuntimeCallInfo * runtimeCallInfo)553 ArkUINativeModuleValue TabsBridge::ResetAnimationDuration(ArkUIRuntimeCallInfo* runtimeCallInfo)
554 {
555     EcmaVM* vm = runtimeCallInfo->GetVM();
556     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
557     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
558     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
559     GetArkUINodeModifiers()->getTabsModifier()->resetAnimationDuration(nativeNode);
560     return panda::JSValueRef::Undefined(vm);
561 }
562 
SetBarPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)563 ArkUINativeModuleValue TabsBridge::SetBarPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
564 {
565     EcmaVM* vm = runtimeCallInfo->GetVM();
566     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
567     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
568     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
569     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
570     int32_t barVal = secondArg->ToNumber(vm)->Value();
571     GetArkUINodeModifiers()->getTabsModifier()->setTabBarPosition(nativeNode, barVal);
572     return panda::JSValueRef::Undefined(vm);
573 }
574 
ResetBarPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)575 ArkUINativeModuleValue TabsBridge::ResetBarPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
576 {
577     EcmaVM* vm = runtimeCallInfo->GetVM();
578     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
579     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
580     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
581     GetArkUINodeModifiers()->getTabsModifier()->resetTabBarPosition(nativeNode);
582     return panda::JSValueRef::Undefined(vm);
583 }
584 
SetTabClip(ArkUIRuntimeCallInfo * runtimeCallInfo)585 ArkUINativeModuleValue TabsBridge::SetTabClip(ArkUIRuntimeCallInfo* runtimeCallInfo)
586 {
587     EcmaVM* vm = runtimeCallInfo->GetVM();
588     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
589     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
590     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
591     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
592 
593     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
594     if (info[TABS_ARG_INDEX_1]->IsUndefined()) {
595         ViewAbstract::SetClipEdge(frameNode, false);
596         return panda::JSValueRef::Undefined(vm);
597     }
598     if (info[TABS_ARG_INDEX_1]->IsObject()) {
599         CommonBridge::SetClip(runtimeCallInfo);
600     } else if (info[TABS_ARG_INDEX_1]->IsBoolean()) {
601         GetArkUINodeModifiers()->getTabsModifier()->setTabClip(nativeNode, info[TABS_ARG_INDEX_1]->ToBoolean());
602     }
603     return panda::JSValueRef::Undefined(vm);
604 }
605 
ResetTabClip(ArkUIRuntimeCallInfo * runtimeCallInfo)606 ArkUINativeModuleValue TabsBridge::ResetTabClip(ArkUIRuntimeCallInfo* runtimeCallInfo)
607 {
608     EcmaVM* vm = runtimeCallInfo->GetVM();
609     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
610     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
611     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
612     GetArkUINodeModifiers()->getTabsModifier()->resetTabClip(nativeNode);
613     return panda::JSValueRef::Undefined(vm);
614 }
615 
SetTabEdgeEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)616 ArkUINativeModuleValue TabsBridge::SetTabEdgeEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
617 {
618     EcmaVM* vm = runtimeCallInfo->GetVM();
619     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
620     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
621     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
622     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
623 
624     int32_t effect = static_cast<int32_t>(EdgeEffect::SPRING);
625     if (secondArg->IsUndefined() || secondArg->IsNull()) {
626         effect = static_cast<int32_t>(EdgeEffect::SPRING);
627     } else {
628         effect = secondArg->Int32Value(vm);
629     }
630     if (effect < static_cast<int32_t>(EdgeEffect::SPRING) || effect > static_cast<int32_t>(EdgeEffect::NONE)) {
631         effect = static_cast<int32_t>(EdgeEffect::SPRING);
632     }
633     GetArkUINodeModifiers()->getTabsModifier()->setTabEdgeEffect(nativeNode, effect);
634     return panda::JSValueRef::Undefined(vm);
635 }
636 
ResetTabEdgeEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)637 ArkUINativeModuleValue TabsBridge::ResetTabEdgeEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
638 {
639     EcmaVM* vm = runtimeCallInfo->GetVM();
640     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
641     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
642     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
643     GetArkUINodeModifiers()->getTabsModifier()->resetTabEdgeEffect(nativeNode);
644     return panda::JSValueRef::Undefined(vm);
645 }
646 
SetWidthAuto(ArkUIRuntimeCallInfo * runtimeCallInfo)647 ArkUINativeModuleValue TabsBridge::SetWidthAuto(ArkUIRuntimeCallInfo* runtimeCallInfo)
648 {
649     EcmaVM* vm = runtimeCallInfo->GetVM();
650     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
651     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
652     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
653     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
654 
655     CalcDimension width;
656     ArkTSUtils::ParseJsDimensionVpNG(vm, secondArg, width);
657     if (width.Unit() == DimensionUnit::AUTO) {
658         CommonBridge::SetWidth(runtimeCallInfo);
659         GetArkUINodeModifiers()->getTabsModifier()->setTabWidthAuto(nativeNode);
660         return panda::JSValueRef::Undefined(vm);
661     } else {
662         CommonBridge::SetWidth(runtimeCallInfo);
663         GetArkUINodeModifiers()->getTabsModifier()->resetTabWidthAuto(nativeNode);
664     }
665     CommonBridge::SetWidth(runtimeCallInfo);
666     return panda::JSValueRef::Undefined(vm);
667 }
668 
ResetWidthAuto(ArkUIRuntimeCallInfo * runtimeCallInfo)669 ArkUINativeModuleValue TabsBridge::ResetWidthAuto(ArkUIRuntimeCallInfo* runtimeCallInfo)
670 {
671     CommonBridge::ResetWidth(runtimeCallInfo);
672     EcmaVM* vm = runtimeCallInfo->GetVM();
673     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
674     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
675     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
676     GetArkUINodeModifiers()->getTabsModifier()->resetTabWidthAuto(nativeNode);
677     return panda::JSValueRef::Undefined(vm);
678 }
679 
SetHeightAuto(ArkUIRuntimeCallInfo * runtimeCallInfo)680 ArkUINativeModuleValue TabsBridge::SetHeightAuto(ArkUIRuntimeCallInfo* runtimeCallInfo)
681 {
682     EcmaVM* vm = runtimeCallInfo->GetVM();
683     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
684     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
685     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
686     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
687 
688     CalcDimension height;
689     ArkTSUtils::ParseJsDimensionVpNG(vm, secondArg, height);
690     if (height.Unit() == DimensionUnit::AUTO) {
691         CommonBridge::SetHeight(runtimeCallInfo);
692         GetArkUINodeModifiers()->getTabsModifier()->setTabHeightAuto(nativeNode);
693         return panda::JSValueRef::Undefined(vm);
694     } else {
695         CommonBridge::SetHeight(runtimeCallInfo);
696         GetArkUINodeModifiers()->getTabsModifier()->resetTabHeightAuto(nativeNode);
697     }
698     CommonBridge::SetHeight(runtimeCallInfo);
699     return panda::JSValueRef::Undefined(vm);
700 }
701 
ResetHeightAuto(ArkUIRuntimeCallInfo * runtimeCallInfo)702 ArkUINativeModuleValue TabsBridge::ResetHeightAuto(ArkUIRuntimeCallInfo* runtimeCallInfo)
703 {
704     CommonBridge::ResetHeight(runtimeCallInfo);
705     EcmaVM* vm = runtimeCallInfo->GetVM();
706     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
707     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
708     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
709     GetArkUINodeModifiers()->getTabsModifier()->resetTabHeightAuto(nativeNode);
710     return panda::JSValueRef::Undefined(vm);
711 }
712 
SetAnimateMode(ArkUIRuntimeCallInfo * runtimeCallInfo)713 ArkUINativeModuleValue TabsBridge::SetAnimateMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
714 {
715     EcmaVM* vm = runtimeCallInfo->GetVM();
716     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
717     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
718     Local<JSValueRef> animateModeArg = runtimeCallInfo->GetCallArgRef(1);
719     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
720     if (!animateModeArg->IsNumber()) {
721         GetArkUINodeModifiers()->getTabsModifier()->resetAnimateMode(nativeNode);
722         return panda::JSValueRef::Undefined(vm);
723     }
724     uint32_t animateModeValue = animateModeArg->Uint32Value(vm);
725     if (animateModeValue >= static_cast<uint32_t>(TabAnimateMode::MAX_VALUE)) {
726         GetArkUINodeModifiers()->getTabsModifier()->resetAnimateMode(nativeNode);
727         return panda::JSValueRef::Undefined(vm);
728     }
729     GetArkUINodeModifiers()->getTabsModifier()->setAnimateMode(nativeNode, animateModeValue);
730     return panda::JSValueRef::Undefined(vm);
731 }
732 
ResetAnimateMode(ArkUIRuntimeCallInfo * runtimeCallInfo)733 ArkUINativeModuleValue TabsBridge::ResetAnimateMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
734 {
735     EcmaVM* vm = runtimeCallInfo->GetVM();
736     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
737     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
738     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
739     GetArkUINodeModifiers()->getTabsModifier()->resetAnimateMode(nativeNode);
740     return panda::JSValueRef::Undefined(vm);
741 }
742 } // namespace OHOS::Ace::NG
743