• 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_timepicker_bridge.h"
16 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
17 #include "frameworks/base/i18n/time_format.h"
18 #include "core/components_ng/pattern/picker/picker_type_define.h"
19 #include "core/components/picker/picker_base_component.h"
20 
21 namespace OHOS::Ace::NG {
22 const std::string DEFAULT_ERR_CODE = "-1";
23 const std::string FORMAT_FONT = "%s|%s|%s";
24 constexpr int NUM_0 = 0;
25 constexpr int NUM_1 = 1;
26 constexpr int NUM_2 = 2;
27 constexpr int NUM_3 = 3;
28 constexpr int NUM_4 = 4;
29 constexpr int NUM_5 = 5;
30 constexpr uint32_t DEFAULT_TIME_PICKER_TEXT_COLOR = 0xFF182431;
31 constexpr uint32_t DEFAULT_TIME_PICKER_SELECTED_TEXT_COLOR = 0xFF0A59F7;
32 constexpr int PARAM_ARR_LENGTH_1 = 1;
33 
SetTimepickerBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)34 ArkUINativeModuleValue TimepickerBridge::SetTimepickerBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
35 {
36     EcmaVM* vm = runtimeCallInfo->GetVM();
37     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
38     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
39     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
40     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
41     uint32_t color = secondArg->Uint32Value(vm);
42     GetArkUINodeModifiers()->getTimepickerModifier()->setTimepickerBackgroundColor(nativeNode, color);
43     return panda::JSValueRef::Undefined(vm);
44 }
45 
ResetTimepickerBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)46 ArkUINativeModuleValue TimepickerBridge::ResetTimepickerBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
47 {
48     EcmaVM* vm = runtimeCallInfo->GetVM();
49     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
50     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
51     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
52     GetArkUINodeModifiers()->getTimepickerModifier()->resetTimepickerBackgroundColor(nativeNode);
53     return panda::JSValueRef::Undefined(vm);
54 }
55 
SetTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)56 ArkUINativeModuleValue TimepickerBridge::SetTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
57 {
58     EcmaVM* vm = runtimeCallInfo->GetVM();
59     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
60     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
61     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(NUM_1);
62     Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(NUM_2);
63     Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(NUM_3);
64     Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(NUM_4);
65     Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(NUM_5);
66     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
67     Color color;
68     if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
69         color.SetValue(DEFAULT_TIME_PICKER_TEXT_COLOR);
70     }
71     CalcDimension size;
72     if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined()) {
73         size = Dimension(-1);
74     } else {
75         if (!ArkTSUtils::ParseJsDimensionNG(vm, fontSizeArg, size, DimensionUnit::FP, false)) {
76             size = Dimension(-1);
77         }
78     }
79     std::string weight = DEFAULT_ERR_CODE;
80     if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
81         if (fontWeightArg->IsNumber()) {
82             weight = std::to_string(fontWeightArg->Int32Value(vm));
83         } else {
84             if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, weight) || weight.empty()) {
85                 weight = DEFAULT_ERR_CODE;
86             }
87         }
88     }
89     std::string fontFamily;
90     if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
91         fontFamily = DEFAULT_ERR_CODE;
92     }
93     int32_t styleVal = 0;
94     if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined()) {
95         styleVal = fontStyleArg->Int32Value(vm);
96     }
97     std::string fontSizeStr = size.ToString();
98     std::string fontInfo = StringUtils::FormatString(
99         FORMAT_FONT.c_str(), fontSizeStr.c_str(), weight.c_str(), fontFamily.c_str());
100     GetArkUINodeModifiers()->getTimepickerModifier()->setTimepickerTextStyle(
101         nativeNode, color.GetValue(), fontInfo.c_str(), styleVal);
102     return panda::JSValueRef::Undefined(vm);
103 }
104 
SetSelectedTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)105 ArkUINativeModuleValue TimepickerBridge::SetSelectedTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
106 {
107     EcmaVM* vm = runtimeCallInfo->GetVM();
108     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
109     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
110     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(NUM_1);
111     Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(NUM_2);
112     Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(NUM_3);
113     Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(NUM_4);
114     Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(NUM_5);
115     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
116     Color color;
117     if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
118         color.SetValue(DEFAULT_TIME_PICKER_SELECTED_TEXT_COLOR);
119     }
120     CalcDimension size;
121     if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined()) {
122         size = Dimension(-1);
123     } else {
124         if (!ArkTSUtils::ParseJsDimensionNG(vm, fontSizeArg, size, DimensionUnit::FP, false)) {
125             size = Dimension(-1);
126         }
127     }
128     std::string weight = DEFAULT_ERR_CODE;
129     if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
130         if (fontWeightArg->IsNumber()) {
131             weight = std::to_string(fontWeightArg->Int32Value(vm));
132         } else {
133             if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, weight) || weight.empty()) {
134                 weight = DEFAULT_ERR_CODE;
135             }
136         }
137     }
138     std::string fontFamily;
139     if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
140         fontFamily = DEFAULT_ERR_CODE;
141     }
142     int32_t styleVal = 0;
143     if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined()) {
144         styleVal = fontStyleArg->Int32Value(vm);
145     }
146     std::string fontSizeStr = size.ToString();
147     std::string fontInfo = StringUtils::FormatString(
148         FORMAT_FONT.c_str(), fontSizeStr.c_str(), weight.c_str(), fontFamily.c_str());
149     GetArkUINodeModifiers()->getTimepickerModifier()->setTimepickerSelectedTextStyle(
150         nativeNode, color.GetValue(), fontInfo.c_str(), styleVal);
151     return panda::JSValueRef::Undefined(vm);
152 }
153 
SetDisappearTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)154 ArkUINativeModuleValue TimepickerBridge::SetDisappearTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
155 {
156     EcmaVM* vm = runtimeCallInfo->GetVM();
157     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
158     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
159     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(NUM_1);
160     Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(NUM_2);
161     Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(NUM_3);
162     Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(NUM_4);
163     Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(NUM_5);
164     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
165     Color color;
166     if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
167         color.SetValue(DEFAULT_TIME_PICKER_TEXT_COLOR);
168     }
169     CalcDimension size;
170     if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined()) {
171         size = Dimension(-1);
172     } else {
173         if (!ArkTSUtils::ParseJsDimensionNG(vm, fontSizeArg, size, DimensionUnit::FP, false)) {
174             size = Dimension(-1);
175         }
176     }
177     std::string weight = DEFAULT_ERR_CODE;
178     if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
179         if (fontWeightArg->IsNumber()) {
180             weight = std::to_string(fontWeightArg->Int32Value(vm));
181         } else {
182             if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, weight) || weight.empty()) {
183                 weight = DEFAULT_ERR_CODE;
184             }
185         }
186     }
187     std::string fontFamily;
188     if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
189         fontFamily = DEFAULT_ERR_CODE;
190     }
191     int32_t styleVal = 0;
192     if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined()) {
193         styleVal = fontStyleArg->Int32Value(vm);
194     }
195     std::string fontSizeStr = size.ToString();
196     std::string fontInfo = StringUtils::FormatString(
197         FORMAT_FONT.c_str(), fontSizeStr.c_str(), weight.c_str(), fontFamily.c_str());
198     GetArkUINodeModifiers()->getTimepickerModifier()->setTimepickerDisappearTextStyle(
199         nativeNode, color.GetValue(), fontInfo.c_str(), styleVal);
200     return panda::JSValueRef::Undefined(vm);
201 }
202 
ResetTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)203 ArkUINativeModuleValue TimepickerBridge::ResetTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
204 {
205     EcmaVM* vm = runtimeCallInfo->GetVM();
206     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
207     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
208     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
209     GetArkUINodeModifiers()->getTimepickerModifier()->resetTimepickerTextStyle(nativeNode);
210     return panda::JSValueRef::Undefined(vm);
211 }
212 
ResetSelectedTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)213 ArkUINativeModuleValue TimepickerBridge::ResetSelectedTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
214 {
215     EcmaVM* vm = runtimeCallInfo->GetVM();
216     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
217     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
218     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
219     GetArkUINodeModifiers()->getTimepickerModifier()->resetTimepickerSelectedTextStyle(nativeNode);
220     return panda::JSValueRef::Undefined(vm);
221 }
222 
ResetDisappearTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)223 ArkUINativeModuleValue TimepickerBridge::ResetDisappearTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
224 {
225     EcmaVM* vm = runtimeCallInfo->GetVM();
226     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
227     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
228     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
229     GetArkUINodeModifiers()->getTimepickerModifier()->resetTimepickerDisappearTextStyle(nativeNode);
230     return panda::JSValueRef::Undefined(vm);
231 }
232 
SetTimepickerUseMilitaryTime(ArkUIRuntimeCallInfo * runtimeCallInfo)233 ArkUINativeModuleValue TimepickerBridge::SetTimepickerUseMilitaryTime(ArkUIRuntimeCallInfo* runtimeCallInfo)
234 {
235     EcmaVM* vm = runtimeCallInfo->GetVM();
236     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
237     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
238     Local<JSValueRef> useMilitaryArg = runtimeCallInfo->GetCallArgRef(NUM_1);
239     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
240     if (useMilitaryArg->IsBoolean()) {
241         bool value = useMilitaryArg->ToBoolean(vm)->Value();
242         GetArkUINodeModifiers()->getTimepickerModifier()->setTimepickerUseMilitaryTime(nativeNode, value);
243     } else {
244         GetArkUINodeModifiers()->getTimepickerModifier()->resetTimepickerUseMilitaryTime(nativeNode);
245     }
246     return panda::JSValueRef::Undefined(vm);
247 }
248 
ResetTimepickerUseMilitaryTime(ArkUIRuntimeCallInfo * runtimeCallInfo)249 ArkUINativeModuleValue TimepickerBridge::ResetTimepickerUseMilitaryTime(ArkUIRuntimeCallInfo* runtimeCallInfo)
250 {
251     EcmaVM* vm = runtimeCallInfo->GetVM();
252     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
253     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
254     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
255     GetArkUINodeModifiers()->getTimepickerModifier()->resetTimepickerUseMilitaryTime(nativeNode);
256     return panda::JSValueRef::Undefined(vm);
257 }
258 
SetTimepickerLoop(ArkUIRuntimeCallInfo * runtimeCallInfo)259 ArkUINativeModuleValue TimepickerBridge::SetTimepickerLoop(ArkUIRuntimeCallInfo* runtimeCallInfo)
260 {
261     EcmaVM* vm = runtimeCallInfo->GetVM();
262     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
263     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
264     Local<JSValueRef> loopArg = runtimeCallInfo->GetCallArgRef(NUM_1);
265     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
266     if (loopArg->IsBoolean()) {
267         bool value = loopArg->ToBoolean(vm)->Value();
268         GetArkUINodeModifiers()->getTimepickerModifier()->setTimepickerLoop(nativeNode, value);
269     } else {
270         GetArkUINodeModifiers()->getTimepickerModifier()->resetTimepickerLoop(nativeNode);
271     }
272     return panda::JSValueRef::Undefined(vm);
273 }
274 
ResetTimepickerLoop(ArkUIRuntimeCallInfo * runtimeCallInfo)275 ArkUINativeModuleValue TimepickerBridge::ResetTimepickerLoop(ArkUIRuntimeCallInfo* runtimeCallInfo)
276 {
277     EcmaVM* vm = runtimeCallInfo->GetVM();
278     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
279     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
280     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
281     GetArkUINodeModifiers()->getTimepickerModifier()->resetTimepickerLoop(nativeNode);
282     return panda::JSValueRef::Undefined(vm);
283 }
284 
SetTimepickerDateTimeOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)285 ArkUINativeModuleValue TimepickerBridge::SetTimepickerDateTimeOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
286 {
287     EcmaVM* vm = runtimeCallInfo->GetVM();
288     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
289     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
290     Local<JSValueRef> hourArg = runtimeCallInfo->GetCallArgRef(NUM_1);
291     Local<JSValueRef> minuteArg = runtimeCallInfo->GetCallArgRef(NUM_2);
292     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_3);
293     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
294     ZeroPrefixType hourType = ZeroPrefixType::AUTO;
295     ZeroPrefixType minuteType = ZeroPrefixType::AUTO;
296     ZeroPrefixType secondType = ZeroPrefixType::AUTO;
297     std::string hour = "hour";
298     if (hourArg->IsString(vm)) {
299         std::string hour = hourArg->ToString(vm)->ToString(vm);
300         if (hour == "2-digit") {
301             hourType = ZeroPrefixType::SHOW;
302         } else if (hour == "numeric") {
303             hourType = ZeroPrefixType::HIDE;
304         }
305     }
306     std::string minute = "minute";
307     if (minuteArg->IsString(vm)) {
308         minuteType = ZeroPrefixType::SHOW;
309         std::string minute = minuteArg->ToString(vm)->ToString(vm);
310         if (minute == "numeric") {
311             minuteType = ZeroPrefixType::HIDE;
312         }
313     }
314     std::string second = "second";
315     if (secondArg->IsString(vm)) {
316         secondType = ZeroPrefixType::SHOW;
317         std::string second = secondArg->ToString(vm)->ToString(vm);
318         if (second == "numeric") {
319             secondType = ZeroPrefixType::HIDE;
320         }
321     }
322     GetArkUINodeModifiers()->getTimepickerModifier()->setTimepickerDateTimeOptions(
323         nativeNode, static_cast<ArkUI_Int32>(hourType), static_cast<ArkUI_Int32>(minuteType),
324         static_cast<ArkUI_Int32>(secondType));
325     return panda::JSValueRef::Undefined(vm);
326 }
327 
ResetTimepickerDateTimeOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)328 ArkUINativeModuleValue TimepickerBridge::ResetTimepickerDateTimeOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
329 {
330     EcmaVM* vm = runtimeCallInfo->GetVM();
331     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
332     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
333     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
334     GetArkUINodeModifiers()->getTimepickerModifier()->resetTimepickerDateTimeOptions(nativeNode);
335     return panda::JSValueRef::Undefined(vm);
336 }
337 
SetTimepickerEnableHapticFeedback(ArkUIRuntimeCallInfo * runtimeCallInfo)338 ArkUINativeModuleValue TimepickerBridge::SetTimepickerEnableHapticFeedback(ArkUIRuntimeCallInfo* runtimeCallInfo)
339 {
340     EcmaVM* vm = runtimeCallInfo->GetVM();
341     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
342     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
343     Local<JSValueRef> enableHapticFeedbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
344     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
345     if (enableHapticFeedbackArg->IsBoolean()) {
346         bool value = enableHapticFeedbackArg->ToBoolean(vm)->Value();
347         GetArkUINodeModifiers()->getTimepickerModifier()->setTimepickerEnableHapticFeedback(nativeNode, value);
348     } else {
349         GetArkUINodeModifiers()->getTimepickerModifier()->resetTimepickerEnableHapticFeedback(nativeNode);
350     }
351     return panda::JSValueRef::Undefined(vm);
352 }
353 
ResetTimepickerEnableHapticFeedback(ArkUIRuntimeCallInfo * runtimeCallInfo)354 ArkUINativeModuleValue TimepickerBridge::ResetTimepickerEnableHapticFeedback(ArkUIRuntimeCallInfo* runtimeCallInfo)
355 {
356     EcmaVM* vm = runtimeCallInfo->GetVM();
357     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
358     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
359     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
360     GetArkUINodeModifiers()->getTimepickerModifier()->resetTimepickerEnableHapticFeedback(nativeNode);
361     return panda::JSValueRef::Undefined(vm);
362 }
363 
SetTimepickerEnableCascade(ArkUIRuntimeCallInfo * runtimeCallInfo)364 ArkUINativeModuleValue TimepickerBridge::SetTimepickerEnableCascade(ArkUIRuntimeCallInfo* runtimeCallInfo)
365 {
366     EcmaVM* vm = runtimeCallInfo->GetVM();
367     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
368     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); // 0: index of parameter frameNode
369     Local<JSValueRef> enableCascadeArg = runtimeCallInfo->GetCallArgRef(1); // 1: index of parameter enableCascade
370     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
371     if (enableCascadeArg->IsBoolean()) {
372         bool value = enableCascadeArg->ToBoolean(vm)->Value();
373         GetArkUINodeModifiers()->getTimepickerModifier()->setTimepickerEnableCascade(nativeNode, value);
374     } else {
375         GetArkUINodeModifiers()->getTimepickerModifier()->resetTimepickerEnableCascade(nativeNode);
376     }
377     return panda::JSValueRef::Undefined(vm);
378 }
379 
ResetTimepickerEnableCascade(ArkUIRuntimeCallInfo * runtimeCallInfo)380 ArkUINativeModuleValue TimepickerBridge::ResetTimepickerEnableCascade(ArkUIRuntimeCallInfo* runtimeCallInfo)
381 {
382     EcmaVM* vm = runtimeCallInfo->GetVM();
383     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
384     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); // 0: index of parameter frameNode
385     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
386     GetArkUINodeModifiers()->getTimepickerModifier()->resetTimepickerEnableCascade(nativeNode);
387     return panda::JSValueRef::Undefined(vm);
388 }
389 
SetDigitalCrownSensitivity(ArkUIRuntimeCallInfo * runtimeCallInfo)390 ArkUINativeModuleValue TimepickerBridge::SetDigitalCrownSensitivity(ArkUIRuntimeCallInfo* runtimeCallInfo)
391 {
392     EcmaVM* vm = runtimeCallInfo->GetVM();
393     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
394     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
395     Local<JSValueRef> crownSensitivityArg =
396         runtimeCallInfo->GetCallArgRef(NUM_1);
397     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
398     int32_t crownSensitivity = OHOS::Ace::NG::DEFAULT_CROWNSENSITIVITY;
399     if (crownSensitivityArg->IsNumber()) {
400         crownSensitivity = crownSensitivityArg->ToNumber(vm)->Value();
401     }
402     auto modifier = GetArkUINodeModifiers();
403     CHECK_NULL_RETURN(modifier, panda::NativePointerRef::New(vm, nullptr));
404     modifier->getTimepickerModifier()->setTimePickerDigitalCrownSensitivity(nativeNode, crownSensitivity);
405     return panda::JSValueRef::Undefined(vm);
406 }
407 
ResetDigitalCrownSensitivity(ArkUIRuntimeCallInfo * runtimeCallInfo)408 ArkUINativeModuleValue TimepickerBridge::ResetDigitalCrownSensitivity(ArkUIRuntimeCallInfo* runtimeCallInfo)
409 {
410     EcmaVM* vm = runtimeCallInfo->GetVM();
411     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
412     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
413     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
414     auto modifier = GetArkUINodeModifiers();
415     CHECK_NULL_RETURN(modifier, panda::NativePointerRef::New(vm, nullptr));
416     modifier->getTimepickerModifier()->resetTimePickerDigitalCrownSensitivity(nativeNode);
417     return panda::JSValueRef::Undefined(vm);
418 }
CreateTimePickerOnChange(EcmaVM * vm,const BaseEventInfo * info)419 panda::Local<panda::ObjectRef> CreateTimePickerOnChange(EcmaVM* vm, const BaseEventInfo* info)
420 {
421     const auto* eventInfo = TypeInfoHelper::DynamicCast<DatePickerChangeEvent>(info);
422     auto jsonValue = JsonUtil::Create(true);
423     std::unique_ptr<JsonValue> argsPtr = JsonUtil::ParseJsonString(eventInfo->GetSelectedStr());
424     if (!argsPtr) {
425         return panda::JSValueRef::Undefined(vm);
426     }
427     std::vector<std::string> keys = { "year", "month", "day", "hour", "minute", "second" };
428     for (auto iter = keys.begin(); iter != keys.end(); iter++) {
429         const std::string key = *iter;
430         const auto value = argsPtr->GetValue(key);
431         if (!value || value->ToString().empty()) {
432             continue;
433         }
434         jsonValue->Put(key.c_str(), value->ToString().c_str());
435     }
436     Local<JSValueRef> jsValue =
437         panda::JSON::Parse(vm, panda::StringRef::NewFromUtf8(vm, jsonValue->ToString().c_str()));
438     if (jsValue->IsUndefined()) {
439         return panda::JSValueRef::Undefined(vm);
440     }
441     return jsValue->ToObject(vm);
442 }
SetTimepickerOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)443 ArkUINativeModuleValue TimepickerBridge::SetTimepickerOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
444 {
445     EcmaVM* vm = runtimeCallInfo->GetVM();
446     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
447     int32_t argsNumber = runtimeCallInfo->GetArgsNumber();
448     if (argsNumber != NUM_2) {
449         return panda::JSValueRef::Undefined(vm);
450     }
451     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
452     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
453     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
454     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
455     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
456     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
457         GetArkUINodeModifiers()->getTimepickerModifier()->resetTimepickerOnChange(nativeNode);
458         return panda::JSValueRef::Undefined(vm);
459     }
460     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
461     std::function<void(const BaseEventInfo*)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
462                                                              const BaseEventInfo* info) {
463         panda::LocalScope pandaScope(vm);
464         panda::TryCatch trycatch(vm);
465         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
466         auto dateObj = CreateTimePickerOnChange(vm, info);
467         panda::Local<panda::JSValueRef> params[] = { dateObj };
468         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
469     };
470     GetArkUINodeModifiers()->getTimepickerModifier()->setTimepickerOnChange(
471         nativeNode, reinterpret_cast<void*>(&callback));
472     return panda::JSValueRef::Undefined(vm);
473 }
ResetTimepickerOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)474 ArkUINativeModuleValue TimepickerBridge::ResetTimepickerOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
475 {
476     EcmaVM* vm = runtimeCallInfo->GetVM();
477     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
478     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
479     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
480     GetArkUINodeModifiers()->getTimepickerModifier()->resetTimepickerOnChange(nativeNode);
481     return panda::JSValueRef::Undefined(vm);
482 }
483 } // namespace OHOS::Ace::NG
484