• 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_textpicker_bridge.h"
16 
17 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_common_bridge.h"
18 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
19 #include "core/components/picker/picker_theme.h"
20 #include "core/components_ng/pattern/picker/picker_type_define.h"
21 
22 namespace OHOS::Ace::NG {
23 namespace {
24 const std::string FORMAT_FONT = "%s|%s|%s";
25 const std::string DEFAULT_ERR_CODE = "-1";
26 const int32_t DEFAULT_NEGATIVE_NUM = -1;
27 constexpr uint32_t DEFAULT_TIME_PICKER_TEXT_COLOR = 0xFF182431;
28 constexpr uint32_t DEFAULT_TIME_PICKER_SELECTED_TEXT_COLOR = 0xFF0A59F7;
29 
30 constexpr int32_t NODE_INDEX = 0;
31 constexpr int32_t STROKE_WIDTH_INDEX = 1;
32 constexpr int32_t COLOR_INDEX = 2;
33 constexpr int32_t START_MARGIN_INDEX = 3;
34 constexpr int32_t END_MARGIN_INDEX = 4;
35 constexpr int32_t NUM_1 = 1;
36 
37 constexpr int32_t ARG_GROUP_LENGTH = 3;
38 constexpr int PARAM_ARR_LENGTH_2 = 2;
39 constexpr int NUM_0 = 0;
40 constexpr int NUM_2 = 2;
ParseDividerDimension(const EcmaVM * vm,const Local<JSValueRef> & value,CalcDimension & valueDim)41 bool ParseDividerDimension(const EcmaVM* vm, const Local<JSValueRef>& value, CalcDimension& valueDim)
42 {
43     return !ArkTSUtils::ParseJsDimensionVpNG(vm, value, valueDim, false) || LessNotEqual(valueDim.Value(), 0.0f) ||
44         (valueDim.Unit() != DimensionUnit::PX && valueDim.Unit() != DimensionUnit::VP &&
45         valueDim.Unit() != DimensionUnit::LPX && valueDim.Unit() != DimensionUnit::FP);
46 }
47 
PopulateValues(const CalcDimension & dividerStrokeWidth,const CalcDimension & dividerStartMargin,const CalcDimension & dividerEndMargin,ArkUI_Float32 values[],uint32_t size)48 void PopulateValues(const CalcDimension& dividerStrokeWidth, const CalcDimension& dividerStartMargin,
49     const CalcDimension& dividerEndMargin, ArkUI_Float32 values[], uint32_t size)
50 {
51     values[NODE_INDEX] = static_cast<ArkUI_Float32>(dividerStrokeWidth.Value());
52     values[STROKE_WIDTH_INDEX] = static_cast<ArkUI_Float32>(dividerStartMargin.Value());
53     values[COLOR_INDEX] = static_cast<ArkUI_Float32>(dividerEndMargin.Value());
54 }
55 
PopulateUnits(const CalcDimension & dividerStrokeWidth,const CalcDimension & dividerStartMargin,const CalcDimension & dividerEndMargin,int32_t units[],uint32_t size)56 void PopulateUnits(const CalcDimension& dividerStrokeWidth, const CalcDimension& dividerStartMargin,
57     const CalcDimension& dividerEndMargin, int32_t units[], uint32_t size)
58 {
59     units[NODE_INDEX] = static_cast<int32_t>(dividerStrokeWidth.Unit());
60     units[STROKE_WIDTH_INDEX] = static_cast<int32_t>(dividerStartMargin.Unit());
61     units[COLOR_INDEX] = static_cast<int32_t>(dividerEndMargin.Unit());
62 }
63 
ParseFontSize(const EcmaVM * vm,const Local<JSValueRef> & value,CalcDimension & dimen)64 void ParseFontSize(const EcmaVM* vm, const Local<JSValueRef>& value, CalcDimension& dimen)
65 {
66     if (value->IsNull() || value->IsUndefined()) {
67         dimen = Dimension(DEFAULT_NEGATIVE_NUM);
68     } else {
69         if (!ArkTSUtils::ParseJsDimensionNG(vm, value, dimen, DimensionUnit::FP, false)) {
70             dimen = Dimension(DEFAULT_NEGATIVE_NUM);
71         }
72     }
73 }
74 
ParseFontWeight(const EcmaVM * vm,const Local<JSValueRef> & value,std::string & weight)75 void ParseFontWeight(const EcmaVM* vm, const Local<JSValueRef>& value, std::string& weight)
76 {
77     if (!value->IsNull() && !value->IsUndefined()) {
78         if (value->IsNumber()) {
79             weight = std::to_string(value->Int32Value(vm));
80         } else {
81             if (!ArkTSUtils::ParseJsString(vm, value, weight) || weight.empty()) {
82                 weight = DEFAULT_ERR_CODE;
83             }
84         }
85     }
86 }
87 } // namespace
88 
SetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)89 ArkUINativeModuleValue TextPickerBridge::SetBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
90 {
91     EcmaVM* vm = runtimeCallInfo->GetVM();
92     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
93     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
94     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
95     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
96     CommonBridge::SetBackgroundColor(runtimeCallInfo);
97     Color color;
98     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
99         GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerBackgroundColor(nativeNode);
100     } else {
101         GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerBackgroundColor(nativeNode, color.GetValue());
102     }
103     return panda::JSValueRef::Undefined(vm);
104 }
105 
ResetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)106 ArkUINativeModuleValue TextPickerBridge::ResetBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
107 {
108     EcmaVM* vm = runtimeCallInfo->GetVM();
109     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
110     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
111     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
112     CommonBridge::ResetBackgroundColor(runtimeCallInfo);
113     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerBackgroundColor(nativeNode);
114     return panda::JSValueRef::Undefined(vm);
115 }
116 
SetCanLoop(ArkUIRuntimeCallInfo * runtimeCallInfo)117 ArkUINativeModuleValue TextPickerBridge::SetCanLoop(ArkUIRuntimeCallInfo* runtimeCallInfo)
118 {
119     EcmaVM* vm = runtimeCallInfo->GetVM();
120     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
121     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
122     Local<JSValueRef> canLoopArg = runtimeCallInfo->GetCallArgRef(1);
123     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
124     bool canLoop = true;
125     if (canLoopArg->IsBoolean()) {
126         canLoop = canLoopArg->ToBoolean(vm)->Value();
127     }
128     GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerCanLoop(nativeNode, canLoop);
129     return panda::JSValueRef::Undefined(vm);
130 }
131 
SetSelectedIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)132 ArkUINativeModuleValue TextPickerBridge::SetSelectedIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
133 {
134     EcmaVM* vm = runtimeCallInfo->GetVM();
135     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
136     Local<JSValueRef> indexArg = runtimeCallInfo->GetCallArgRef(1);
137     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
138     std::vector<uint32_t> selectedValues;
139 
140     if (indexArg->IsArray(vm)) {
141         if (!ArkTSUtils::ParseJsIntegerArray(vm, indexArg, selectedValues)) {
142             selectedValues.clear();
143             GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedIndex(nativeNode);
144             return panda::JSValueRef::Undefined(vm);
145         }
146         if (selectedValues.size() > 0) {
147             GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerSelectedIndex(
148                 nativeNode, selectedValues.data(), selectedValues.size());
149         } else {
150             GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedIndex(nativeNode);
151         }
152     } else {
153         uint32_t selectedValue = 0;
154         if (indexArg->IsNumber()) {
155             selectedValue = indexArg->Uint32Value(vm);
156             selectedValues.emplace_back(selectedValue);
157             GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerSelectedIndex(
158                 nativeNode, selectedValues.data(), DEFAULT_NEGATIVE_NUM); // represent this is a number.
159         } else {
160             selectedValues.clear();
161             GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedIndex(nativeNode);
162         }
163     }
164     return panda::JSValueRef::Undefined(vm);
165 }
166 
SetTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)167 ArkUINativeModuleValue TextPickerBridge::SetTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
168 {
169     EcmaVM* vm = runtimeCallInfo->GetVM();
170     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
171     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
172     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);      // text color
173     Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(2);   // text font size
174     Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(3); // text font weight
175     Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(4); // text font family
176     Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(5);  // text font style
177     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
178     Color textColor;
179     if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, textColor)) {
180         textColor.SetValue(DEFAULT_TIME_PICKER_TEXT_COLOR);
181     }
182     CalcDimension size;
183     if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined()) {
184         size = Dimension(DEFAULT_NEGATIVE_NUM);
185     } else {
186         if (!ArkTSUtils::ParseJsDimensionNG(vm, fontSizeArg, size, DimensionUnit::FP, false)) {
187             size = Dimension(DEFAULT_NEGATIVE_NUM);
188         }
189     }
190     std::string weight = DEFAULT_ERR_CODE;
191     if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
192         if (fontWeightArg->IsNumber()) {
193             weight = std::to_string(fontWeightArg->Int32Value(vm));
194         } else {
195             if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, weight) || weight.empty()) {
196                 weight = DEFAULT_ERR_CODE;
197             }
198         }
199     }
200     std::string fontFamily;
201     if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
202         fontFamily = DEFAULT_ERR_CODE;
203     }
204     int32_t styleVal = 0;
205     if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined()) {
206         styleVal = fontStyleArg->Int32Value(vm);
207     }
208     std::string fontSizeStr = size.ToString();
209     std::string fontInfo =
210         StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), weight.c_str(), fontFamily.c_str());
211     GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerTextStyle(
212         nativeNode, textColor.GetValue(), fontInfo.c_str(), styleVal);
213     return panda::JSValueRef::Undefined(vm);
214 }
215 
SetSelectedTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)216 ArkUINativeModuleValue TextPickerBridge::SetSelectedTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
217 {
218     EcmaVM* vm = runtimeCallInfo->GetVM();
219     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
220     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
221     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);      // text color
222     Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(2);   // text font size
223     Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(3); // text font weight
224     Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(4); // text font family
225     Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(5);  // text font style
226     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
227     Color textColor;
228     if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, textColor)) {
229         textColor.SetValue(DEFAULT_TIME_PICKER_SELECTED_TEXT_COLOR);
230     }
231     CalcDimension size;
232     if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined()) {
233         size = Dimension(DEFAULT_NEGATIVE_NUM);
234     } else {
235         if (!ArkTSUtils::ParseJsDimensionNG(vm, fontSizeArg, size, DimensionUnit::FP, false)) {
236             size = Dimension(DEFAULT_NEGATIVE_NUM);
237         }
238     }
239     std::string weight = DEFAULT_ERR_CODE;
240     if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
241         if (fontWeightArg->IsNumber()) {
242             weight = std::to_string(fontWeightArg->Int32Value(vm));
243         } else {
244             if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, weight) || weight.empty()) {
245                 weight = DEFAULT_ERR_CODE;
246             }
247         }
248     }
249     std::string fontFamily;
250     if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
251         fontFamily = DEFAULT_ERR_CODE;
252     }
253     int32_t styleVal = 0;
254     if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined()) {
255         styleVal = fontStyleArg->Int32Value(vm);
256     }
257     std::string fontSizeStr = size.ToString();
258     std::string fontInfo =
259         StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), weight.c_str(), fontFamily.c_str());
260     GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerSelectedTextStyle(
261         nativeNode, textColor.GetValue(), fontInfo.c_str(), styleVal);
262     return panda::JSValueRef::Undefined(vm);
263 }
264 
SetDisappearTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)265 ArkUINativeModuleValue TextPickerBridge::SetDisappearTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
266 {
267     EcmaVM* vm = runtimeCallInfo->GetVM();
268     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
269     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
270     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);      // text color
271     Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(2);   // text font size
272     Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(3); // text font weight
273     Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(4); // text font family
274     Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(5);  // text font style
275     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
276     Color textColor;
277     if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, textColor)) {
278         textColor.SetValue(DEFAULT_TIME_PICKER_TEXT_COLOR);
279     }
280     CalcDimension size;
281     if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined()) {
282         size = Dimension(DEFAULT_NEGATIVE_NUM);
283     } else {
284         if (!ArkTSUtils::ParseJsDimensionNG(vm, fontSizeArg, size, DimensionUnit::FP, false)) {
285             size = Dimension(DEFAULT_NEGATIVE_NUM);
286         }
287     }
288     std::string weight = DEFAULT_ERR_CODE;
289     if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
290         if (fontWeightArg->IsNumber()) {
291             weight = std::to_string(fontWeightArg->Int32Value(vm));
292         } else {
293             if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, weight) || weight.empty()) {
294                 weight = DEFAULT_ERR_CODE;
295             }
296         }
297     }
298     std::string fontFamily;
299     if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
300         fontFamily = DEFAULT_ERR_CODE;
301     }
302     int32_t styleVal = 0;
303     if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined()) {
304         styleVal = fontStyleArg->Int32Value(vm);
305     }
306     std::string fontSizeStr = size.ToString();
307     std::string fontInfo =
308         StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), weight.c_str(), fontFamily.c_str());
309     GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDisappearTextStyle(
310         nativeNode, textColor.GetValue(), fontInfo.c_str(), styleVal);
311     return panda::JSValueRef::Undefined(vm);
312 }
313 
SetDefaultPickerItemHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)314 ArkUINativeModuleValue TextPickerBridge::SetDefaultPickerItemHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
315 {
316     EcmaVM* vm = runtimeCallInfo->GetVM();
317     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
318     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
319     Local<JSValueRef> itemHeightValue = runtimeCallInfo->GetCallArgRef(1);
320     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
321 
322     CalcDimension height;
323     if (itemHeightValue->IsNumber() || itemHeightValue->IsString(vm)) {
324         if (!ArkTSUtils::ParseJsDimensionFp(vm, itemHeightValue, height)) {
325             GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDefaultPickerItemHeight(nativeNode);
326             return panda::JSValueRef::Undefined(vm);
327         }
328     }
329 
330     GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDefaultPickerItemHeight(
331         nativeNode, height.Value(), static_cast<int32_t>(height.Unit()));
332 
333     return panda::JSValueRef::Undefined(vm);
334 }
335 
ResetCanLoop(ArkUIRuntimeCallInfo * runtimeCallInfo)336 ArkUINativeModuleValue TextPickerBridge::ResetCanLoop(ArkUIRuntimeCallInfo* runtimeCallInfo)
337 {
338     EcmaVM* vm = runtimeCallInfo->GetVM();
339     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
340     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
341     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
342     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerCanLoop(nativeNode);
343     return panda::JSValueRef::Undefined(vm);
344 }
345 
ResetSelectedIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)346 ArkUINativeModuleValue TextPickerBridge::ResetSelectedIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
347 {
348     EcmaVM* vm = runtimeCallInfo->GetVM();
349     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
350     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
351     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
352     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedIndex(nativeNode);
353     return panda::JSValueRef::Undefined(vm);
354 }
355 
ResetTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)356 ArkUINativeModuleValue TextPickerBridge::ResetTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
357 {
358     EcmaVM* vm = runtimeCallInfo->GetVM();
359     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
360     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
361     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
362     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerTextStyle(nativeNode);
363     return panda::JSValueRef::Undefined(vm);
364 }
365 
ResetSelectedTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)366 ArkUINativeModuleValue TextPickerBridge::ResetSelectedTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
367 {
368     EcmaVM* vm = runtimeCallInfo->GetVM();
369     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
370     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
371     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
372     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedTextStyle(nativeNode);
373     return panda::JSValueRef::Undefined(vm);
374 }
375 
ResetDisappearTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)376 ArkUINativeModuleValue TextPickerBridge::ResetDisappearTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
377 {
378     EcmaVM* vm = runtimeCallInfo->GetVM();
379     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
380     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
381     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
382     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDisappearTextStyle(nativeNode);
383     return panda::JSValueRef::Undefined(vm);
384 }
385 
ResetDefaultPickerItemHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)386 ArkUINativeModuleValue TextPickerBridge::ResetDefaultPickerItemHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
387 {
388     EcmaVM* vm = runtimeCallInfo->GetVM();
389     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
390     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
391     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
392     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDefaultPickerItemHeight(nativeNode);
393     return panda::JSValueRef::Undefined(vm);
394 }
395 
SetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)396 ArkUINativeModuleValue TextPickerBridge::SetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
397 {
398     EcmaVM* vm = runtimeCallInfo->GetVM();
399     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
400     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_INDEX);
401     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
402     Local<JSValueRef> dividerStrokeWidthArgs = runtimeCallInfo->GetCallArgRef(STROKE_WIDTH_INDEX);
403     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(COLOR_INDEX);
404     Local<JSValueRef> dividerStartMarginArgs = runtimeCallInfo->GetCallArgRef(START_MARGIN_INDEX);
405     Local<JSValueRef> dividerEndMarginArgs = runtimeCallInfo->GetCallArgRef(END_MARGIN_INDEX);
406     CalcDimension dividerStrokeWidth;
407     CalcDimension dividerStartMargin;
408     CalcDimension dividerEndMargin;
409     Color colorObj;
410     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
411     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
412     auto context = frameNode->GetContext();
413     CHECK_NULL_RETURN(context, panda::NativePointerRef::New(vm, nullptr));
414     auto themeManager = context->GetThemeManager();
415     CHECK_NULL_RETURN(themeManager, panda::NativePointerRef::New(vm, nullptr));
416     auto pickerTheme = themeManager->GetTheme<PickerTheme>();
417     CHECK_NULL_RETURN(pickerTheme, panda::NativePointerRef::New(vm, nullptr));
418     if (ParseDividerDimension(vm, dividerStrokeWidthArgs, dividerStrokeWidth)) {
419         if (pickerTheme) {
420             dividerStrokeWidth = pickerTheme->GetDividerThickness();
421         } else {
422             dividerStrokeWidth = 0.0_vp;
423         }
424     }
425     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, colorObj)) {
426         if (pickerTheme) {
427             colorObj = pickerTheme->GetDividerColor();
428         } else {
429             colorObj = Color::TRANSPARENT;
430         }
431     }
432     if (ParseDividerDimension(vm, dividerStartMarginArgs, dividerStartMargin)) {
433         dividerStartMargin = 0.0_vp;
434     }
435     if (ParseDividerDimension(vm, dividerEndMarginArgs, dividerEndMargin)) {
436         dividerEndMargin = 0.0_vp;
437     }
438     uint32_t size = ARG_GROUP_LENGTH;
439     ArkUI_Float32 values[size];
440     int32_t units[size];
441     PopulateValues(dividerStrokeWidth, dividerStartMargin, dividerEndMargin, values, size);
442     PopulateUnits(dividerStrokeWidth, dividerStartMargin, dividerEndMargin, units, size);
443     GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDivider(
444         nativeNode, colorObj.GetValue(), values, units, size);
445     return panda::JSValueRef::Undefined(vm);
446 }
447 
ResetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)448 ArkUINativeModuleValue TextPickerBridge::ResetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
449 {
450     EcmaVM* vm = runtimeCallInfo->GetVM();
451     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
452     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_INDEX);
453     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
454     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1);
455     if (valueArg->IsNull()) {
456         GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDividerNull(nativeNode);
457     } else {
458         GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDivider(nativeNode);
459     }
460     return panda::JSValueRef::Undefined(vm);
461 }
462 
SetGradientHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)463 ArkUINativeModuleValue TextPickerBridge::SetGradientHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
464 {
465     EcmaVM* vm = runtimeCallInfo->GetVM();
466     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
467     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
468     Local<JSValueRef> itemHeightValue = runtimeCallInfo->GetCallArgRef(1);
469     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
470     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
471     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
472     auto context = frameNode->GetContext();
473     CHECK_NULL_RETURN(context, panda::NativePointerRef::New(vm, nullptr));
474     auto themeManager = context->GetThemeManager();
475     CHECK_NULL_RETURN(themeManager, panda::NativePointerRef::New(vm, nullptr));
476     auto pickerTheme = themeManager->GetTheme<PickerTheme>();
477     CHECK_NULL_RETURN(pickerTheme, panda::NativePointerRef::New(vm, nullptr));
478     CalcDimension height;
479     if (ArkTSUtils::ParseJsDimensionVpNG(vm, itemHeightValue, height, true)) {
480         GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerGradientHeight(
481             nativeNode, height.Value(), static_cast<int32_t>(height.Unit()));
482     } else {
483         GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerGradientHeight(nativeNode);
484     }
485     return panda::JSValueRef::Undefined(vm);
486 }
487 
ResetGradientHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)488 ArkUINativeModuleValue TextPickerBridge::ResetGradientHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
489 {
490     EcmaVM* vm = runtimeCallInfo->GetVM();
491     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
492     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
493     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
494     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerGradientHeight(nativeNode);
495     return panda::JSValueRef::Undefined(vm);
496 }
497 
SetDisableTextStyleAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)498 ArkUINativeModuleValue TextPickerBridge::SetDisableTextStyleAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
499 {
500     EcmaVM* vm = runtimeCallInfo->GetVM();
501     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
502     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
503     Local<JSValueRef> disableTextStyleAnimationArg = runtimeCallInfo->GetCallArgRef(1);
504     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
505     bool disableTextStyleAnimation = false;
506     if (disableTextStyleAnimationArg->IsBoolean()) {
507         disableTextStyleAnimation = disableTextStyleAnimationArg->ToBoolean(vm)->Value();
508     }
509     GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDisableTextStyleAnimation(
510         nativeNode, disableTextStyleAnimation);
511     return panda::JSValueRef::Undefined(vm);
512 }
513 
ResetDisableTextStyleAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)514 ArkUINativeModuleValue TextPickerBridge::ResetDisableTextStyleAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
515 {
516     EcmaVM* vm = runtimeCallInfo->GetVM();
517     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
518     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
519     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
520     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDisableTextStyleAnimation(nativeNode);
521     return panda::JSValueRef::Undefined(vm);
522 }
523 
SetDefaultTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)524 ArkUINativeModuleValue TextPickerBridge::SetDefaultTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
525 {
526     EcmaVM* vm = runtimeCallInfo->GetVM();
527     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
528     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
529     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);      // text color
530     Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(2);   // text font size
531     Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(3); // text font weight
532     Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(4); // text font family
533     Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(5);  // text font style
534     Local<JSValueRef> minFontSizeArg = runtimeCallInfo->GetCallArgRef(6); // text minFontSize
535     Local<JSValueRef> maxFontSizeArg = runtimeCallInfo->GetCallArgRef(7);  // text maxFontSize
536     Local<JSValueRef> overflowArg = runtimeCallInfo->GetCallArgRef(8);
537     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
538     Color textColor;
539     if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, textColor)) {
540         textColor.SetValue(DEFAULT_TIME_PICKER_TEXT_COLOR);
541     }
542     CalcDimension size;
543     ParseFontSize(vm, fontSizeArg, size);
544     std::string weight = DEFAULT_ERR_CODE;
545     ParseFontWeight(vm, fontWeightArg, weight);
546     std::string fontFamily;
547     if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
548         fontFamily = DEFAULT_ERR_CODE;
549     }
550     int32_t styleVal = 0;
551     if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined() && fontStyleArg->IsNumber()) {
552         styleVal = fontStyleArg->Int32Value(vm);
553     }
554     CalcDimension minSize;
555     ParseFontSize(vm, minFontSizeArg, minSize);
556     CalcDimension maxSize;
557     ParseFontSize(vm, maxFontSizeArg, maxSize);
558     int32_t overflowVal = 0;
559     if (!overflowArg->IsNull() && !overflowArg->IsUndefined() && overflowArg->IsNumber()) {
560         overflowVal = overflowArg->Int32Value(vm);
561     }
562     std::string fontInfo =
563         StringUtils::FormatString(FORMAT_FONT.c_str(), size.ToString().c_str(), weight.c_str(), fontFamily.c_str());
564     GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDefaultTextStyle(
565         nativeNode, textColor.GetValue(), fontInfo.c_str(), styleVal, minSize.ToString().c_str(),
566         maxSize.ToString().c_str(), overflowVal);
567     return panda::JSValueRef::Undefined(vm);
568 }
569 
ResetDefaultTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)570 ArkUINativeModuleValue TextPickerBridge::ResetDefaultTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
571 {
572     EcmaVM* vm = runtimeCallInfo->GetVM();
573     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
574     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
575     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
576     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDefaultTextStyle(nativeNode);
577     return panda::JSValueRef::Undefined(vm);
578 }
579 
SetTextPickerEnableHapticFeedback(ArkUIRuntimeCallInfo * runtimeCallInfo)580 ArkUINativeModuleValue TextPickerBridge::SetTextPickerEnableHapticFeedback(ArkUIRuntimeCallInfo* runtimeCallInfo)
581 {
582     EcmaVM* vm = runtimeCallInfo->GetVM();
583     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
584     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);   // framenode
585     Local<JSValueRef> enableHapticFeedbackArg = runtimeCallInfo->GetCallArgRef(1); // isEnableHapticFeedback
586     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
587     CHECK_NULL_RETURN(nativeNode, panda::NativePointerRef::New(vm, nullptr));
588     auto modifiers = GetArkUINodeModifiers();
589     CHECK_NULL_RETURN(modifiers, panda::NativePointerRef::New(vm, nullptr));
590     auto textPickerModifier = modifiers->getTextPickerModifier();
591     CHECK_NULL_RETURN(textPickerModifier, panda::NativePointerRef::New(vm, nullptr));
592     if (enableHapticFeedbackArg->IsBoolean()) {
593         bool value = enableHapticFeedbackArg->ToBoolean(vm)->Value();
594         textPickerModifier->setTextPickerEnableHapticFeedback(nativeNode, value);
595     } else {
596         textPickerModifier->resetTextPickerEnableHapticFeedback(nativeNode);
597     }
598     return panda::JSValueRef::Undefined(vm);
599 }
600 
ResetTextPickerEnableHapticFeedback(ArkUIRuntimeCallInfo * runtimeCallInfo)601 ArkUINativeModuleValue TextPickerBridge::ResetTextPickerEnableHapticFeedback(ArkUIRuntimeCallInfo* runtimeCallInfo)
602 {
603     EcmaVM* vm = runtimeCallInfo->GetVM();
604     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
605     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); // framenode
606     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
607     CHECK_NULL_RETURN(nativeNode, panda::NativePointerRef::New(vm, nullptr));
608     auto modifiers = GetArkUINodeModifiers();
609     CHECK_NULL_RETURN(modifiers, panda::NativePointerRef::New(vm, nullptr));
610     auto textPickerModifier = modifiers->getTextPickerModifier();
611     CHECK_NULL_RETURN(textPickerModifier, panda::NativePointerRef::New(vm, nullptr));
612     textPickerModifier->resetTextPickerEnableHapticFeedback(nativeNode);
613     return panda::JSValueRef::Undefined(vm);
614 }
615 
SetDigitalCrownSensitivity(ArkUIRuntimeCallInfo * runtimeCallInfo)616 ArkUINativeModuleValue TextPickerBridge::SetDigitalCrownSensitivity(ArkUIRuntimeCallInfo* runtimeCallInfo)
617 {
618     EcmaVM* vm = runtimeCallInfo->GetVM();
619     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
620     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_INDEX);
621     Local<JSValueRef> crownSensitivityArg = runtimeCallInfo->GetCallArgRef(NUM_1);
622     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
623     int32_t crownSensitivity = OHOS::Ace::NG::DEFAULT_CROWNSENSITIVITY;
624     if (crownSensitivityArg->IsNumber()) {
625         crownSensitivity = crownSensitivityArg->ToNumber(vm)->Value();
626     }
627     auto modifier = GetArkUINodeModifiers();
628     CHECK_NULL_RETURN(modifier, panda::NativePointerRef::New(vm, nullptr));
629     modifier->getTextPickerModifier()->setTextPickerDigitalCrownSensitivity(nativeNode, crownSensitivity);
630     return panda::JSValueRef::Undefined(vm);
631 }
632 
ResetDigitalCrownSensitivity(ArkUIRuntimeCallInfo * runtimeCallInfo)633 ArkUINativeModuleValue TextPickerBridge::ResetDigitalCrownSensitivity(ArkUIRuntimeCallInfo* runtimeCallInfo)
634 {
635     EcmaVM* vm = runtimeCallInfo->GetVM();
636     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
637     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_INDEX);
638     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
639     auto modifier = GetArkUINodeModifiers();
640     CHECK_NULL_RETURN(modifier, panda::NativePointerRef::New(vm, nullptr));
641     modifier->getTextPickerModifier()->resetTextPickerDigitalCrownSensitivity(nativeNode);
642     return panda::JSValueRef::Undefined(vm);
643 }
644 template<typename T>
StringToStringValueWithVM(const EcmaVM * vm,T val)645 panda::Local<panda::JSValueRef> StringToStringValueWithVM(const EcmaVM* vm, T val)
646 {
647     if constexpr (std::is_same_v<T, std::string>) {
648         return panda::StringRef::NewFromUtf8(vm, val.c_str());
649     } else if constexpr (std::is_same_v<T, const char*>) {
650         return panda::StringRef::NewFromUtf8(vm, val);
651     } else if constexpr (std::is_same_v<T, std::u16string>) {
652         return panda::StringRef::NewFromUtf16(vm, val.c_str());
653     }
654     return panda::JSValueRef::Undefined(vm);
655 }
SetOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)656 ArkUINativeModuleValue TextPickerBridge::SetOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
657 {
658     EcmaVM* vm = runtimeCallInfo->GetVM();
659     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
660     int32_t argsNumber = runtimeCallInfo->GetArgsNumber();
661     if (argsNumber != NUM_2) {
662         return panda::JSValueRef::Undefined(vm);
663     }
664     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
665     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
666     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
667     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
668     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
669     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
670         GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerOnChange(nativeNode);
671         return panda::JSValueRef::Undefined(vm);
672     }
673     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
674     std::function<void(const std::vector<std::string>&, const std::vector<double>&)> callback =
675         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
676             const std::vector<std::string>& value, const std::vector<double>& index) {
677             panda::LocalScope pandaScope(vm);
678             panda::TryCatch trycatch(vm);
679             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
680             if (value.size() == NUM_1 && index.size() == NUM_1) {
681                 panda::Local<panda::NumberRef> paramIndex = panda::NumberRef::New(vm, index[NUM_0]);
682                 panda::Local<panda::StringRef> paramVaule = StringToStringValueWithVM(vm, value[NUM_0].c_str());
683                 panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = { paramVaule, paramIndex };
684                 func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
685             } else {
686                 int32_t i = NUM_0;
687                 int32_t j = NUM_0;
688                 auto valueArray = panda::ArrayRef::New(vm);
689                 auto indexArray = panda::ArrayRef::New(vm);
690                 for (const double& it : index) {
691                     panda::Local<panda::NumberRef> item = panda::NumberRef::New(vm, it);
692                     panda::ArrayRef::SetValueAt(vm, indexArray, i++, item);
693                 }
694                 for (const std::string& str : value) {
695                     panda::Local<panda::StringRef> item = StringToStringValueWithVM(vm, str.c_str());
696                     panda::ArrayRef::SetValueAt(vm, valueArray, j++, item);
697                 }
698                 panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = { valueArray, indexArray };
699                 func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
700             }
701         };
702     GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerOnChange(
703         nativeNode, reinterpret_cast<void*>(&callback));
704     return panda::JSValueRef::Undefined(vm);
705 }
ResetOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)706 ArkUINativeModuleValue TextPickerBridge::ResetOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
707 {
708     EcmaVM* vm = runtimeCallInfo->GetVM();
709     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
710     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
711     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
712     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerOnChange(nativeNode);
713     return panda::JSValueRef::Undefined(vm);
714 }
SetOnScrollStop(ArkUIRuntimeCallInfo * runtimeCallInfo)715 ArkUINativeModuleValue TextPickerBridge::SetOnScrollStop(ArkUIRuntimeCallInfo* runtimeCallInfo)
716 {
717     EcmaVM* vm = runtimeCallInfo->GetVM();
718     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
719     int32_t argsNumber = runtimeCallInfo->GetArgsNumber();
720     if (argsNumber != NUM_2) {
721         return panda::JSValueRef::Undefined(vm);
722     }
723     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
724     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
725     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
726     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
727     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
728     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
729         GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerOnScrollStop(nativeNode);
730         return panda::JSValueRef::Undefined(vm);
731     }
732     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
733     std::function<void(const std::vector<std::string>&, const std::vector<double>&)> callback =
734         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
735             const std::vector<std::string>& value, const std::vector<double>& index) {
736             panda::LocalScope pandaScope(vm);
737             panda::TryCatch trycatch(vm);
738             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
739             if (value.size() == NUM_1 && index.size() == NUM_1) {
740                 panda::Local<panda::NumberRef> paramIndex = panda::NumberRef::New(vm, index[NUM_0]);
741                 panda::Local<panda::StringRef> paramVaule = StringToStringValueWithVM(vm, value[NUM_0].c_str());
742                 panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = { paramVaule, paramIndex };
743                 func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
744             } else {
745                 int32_t i = NUM_0;
746                 int32_t j = NUM_0;
747                 auto valueArray = panda::ArrayRef::New(vm);
748                 auto indexArray = panda::ArrayRef::New(vm);
749                 for (const double& it : index) {
750                     panda::Local<panda::NumberRef> item = panda::NumberRef::New(vm, it);
751                     panda::ArrayRef::SetValueAt(vm, indexArray, i++, item);
752                 }
753                 for (const std::string& str : value) {
754                     panda::Local<panda::StringRef> item = StringToStringValueWithVM(vm, str.c_str());
755                     panda::ArrayRef::SetValueAt(vm, valueArray, j++, item);
756                 }
757                 panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = { valueArray, indexArray };
758                 func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
759             }
760         };
761     GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerOnScrollStop(
762         nativeNode, reinterpret_cast<void*>(&callback));
763     return panda::JSValueRef::Undefined(vm);
764 }
ResetOnScrollStop(ArkUIRuntimeCallInfo * runtimeCallInfo)765 ArkUINativeModuleValue TextPickerBridge::ResetOnScrollStop(ArkUIRuntimeCallInfo* runtimeCallInfo)
766 {
767     EcmaVM* vm = runtimeCallInfo->GetVM();
768     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
769     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
770     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
771     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerOnScrollStop(nativeNode);
772     return panda::JSValueRef::Undefined(vm);
773 }
774 } // namespace OHOS::Ace::NG
775