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