• 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 
16 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_date_picker_bridge.h"
17 
18 #include "interfaces/napi/kits/utils/napi_utils.h"
19 
20 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_common_bridge.h"
21 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
22 #include "core/components_ng/pattern/picker/picker_type_define.h"
23 
24 #include "core/components/picker/picker_base_component.h"
25 namespace OHOS::Ace::NG {
26 constexpr int NUM_0 = 0;
27 constexpr int NUM_1 = 1;
28 constexpr int NUM_2 = 2;
29 constexpr int NUM_3 = 3;
30 constexpr int NUM_4 = 4;
31 constexpr int NUM_5 = 5;
32 const std::string FORMAT_FONT = "%s|%s|%s";
33 const std::string DEFAULT_FAMILY = "HarmonyOS Sans";
34 constexpr int PARAM_ARR_LENGTH_1 = 1;
35 
ParseFontSize(const EcmaVM * vm,const Local<JSValueRef> & fontSizeArgs,RefPtr<ResourceObject> & fontSizeResObj)36 std::string ParseFontSize(const EcmaVM* vm, const Local<JSValueRef>& fontSizeArgs,
37     RefPtr<ResourceObject>& fontSizeResObj)
38 {
39     CalcDimension fontSizeData;
40     if (!ArkTSUtils::ParseJsDimensionFp(vm, fontSizeArgs, fontSizeData, fontSizeResObj, true, false) ||
41         fontSizeData.Unit() == DimensionUnit::PERCENT) {
42         fontSizeData = Dimension(-1);
43     }
44     return fontSizeData.ToString();
45 }
46 
ParseFontFamily(const EcmaVM * vm,const Local<JSValueRef> & fontFamilyArgs,RefPtr<ResourceObject> & fontFamilyResObj)47 std::string ParseFontFamily(const EcmaVM* vm, const Local<JSValueRef>& fontFamilyArgs,
48     RefPtr<ResourceObject>& fontFamilyResObj)
49 {
50     std::string fontFamily;
51     if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArgs, fontFamily, fontFamilyResObj) ||
52         fontFamily.empty()) {
53         fontFamily = DEFAULT_FAMILY;
54     }
55     return fontFamily;
56 }
57 
SetSelectedTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)58 ArkUINativeModuleValue DatePickerBridge::SetSelectedTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
59 {
60     EcmaVM* vm = runtimeCallInfo->GetVM();
61     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
62     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
63     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
64     Local<JSValueRef> textColorArgs = runtimeCallInfo->GetCallArgRef(NUM_1);
65     Local<JSValueRef> fontSizeArgs = runtimeCallInfo->GetCallArgRef(NUM_2);
66     Local<JSValueRef> fontWeightArgs = runtimeCallInfo->GetCallArgRef(NUM_3);
67     Local<JSValueRef> fontFamilyArgs = runtimeCallInfo->GetCallArgRef(NUM_4);
68     Local<JSValueRef> fontStyleArgs = runtimeCallInfo->GetCallArgRef(NUM_5);
69 
70     if (textColorArgs->IsUndefined() && fontSizeArgs->IsUndefined() && fontWeightArgs->IsUndefined() &&
71         fontFamilyArgs->IsUndefined() && fontStyleArgs->IsUndefined()) {
72         GetArkUINodeModifiers()->getDatePickerModifier()->resetSelectedTextStyle(nativeNode);
73     }
74 
75     RefPtr<ResourceObject> fontSizeResObj;
76     std::string fontSize = ParseFontSize(vm, fontSizeArgs, fontSizeResObj);
77 
78     std::string weight = "FontWeight.Medium";
79     if (fontWeightArgs->IsString(vm) || fontWeightArgs->IsNumber()) {
80         weight = fontWeightArgs->ToString(vm)->ToString(vm);
81     }
82 
83     RefPtr<ResourceObject> fontFamilyResObj;
84     std::string fontFamily = ParseFontFamily(vm, fontFamilyArgs, fontFamilyResObj);
85 
86     int32_t fontStyle = 0;
87     if (fontStyleArgs->IsNumber()) {
88         fontStyle = fontStyleArgs->Int32Value(vm);
89     }
90     Color color;
91     RefPtr<ResourceObject> textColorResObj;
92     ArkUIPickerTextStyleStruct textStyleStruct;
93     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
94     if (!ArkTSUtils::ParseJsColorAlpha(vm, textColorArgs, color, textColorResObj, nodeInfo)) {
95         Color::ParseColorString("#ff0a59f7", color);
96         textStyleStruct.textColorSetByUser = false;
97     } else {
98         textStyleStruct.textColorSetByUser = true;
99     }
100     std::string fontInfo =
101         StringUtils::FormatString(FORMAT_FONT.c_str(), fontSize.c_str(), weight.c_str(), fontFamily.c_str());
102 
103     textStyleStruct.textColor = color.GetValue();
104     textStyleStruct.fontStyle = fontStyle;
105     textStyleStruct.fontInfo = fontInfo.c_str();
106     textStyleStruct.fontSizeRawPtr = AceType::RawPtr(fontSizeResObj);
107     textStyleStruct.fontFamilyRawPtr = AceType::RawPtr(fontFamilyResObj);
108     textStyleStruct.textColorRawPtr = AceType::RawPtr(textColorResObj);
109     GetArkUINodeModifiers()->getDatePickerModifier()->setSelectedTextStyleWithResObj(nativeNode, &textStyleStruct);
110     return panda::JSValueRef::Undefined(vm);
111 }
112 
ResetSelectedTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)113 ArkUINativeModuleValue DatePickerBridge::ResetSelectedTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
114 {
115     EcmaVM* vm = runtimeCallInfo->GetVM();
116     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
117     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
118     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
119     GetArkUINodeModifiers()->getDatePickerModifier()->resetSelectedTextStyle(nativeNode);
120     return panda::JSValueRef::Undefined(vm);
121 }
122 
SetTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)123 ArkUINativeModuleValue DatePickerBridge::SetTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
124 {
125     EcmaVM* vm = runtimeCallInfo->GetVM();
126     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
127     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
128     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
129     Local<JSValueRef> textColorArgs = runtimeCallInfo->GetCallArgRef(NUM_1);
130     Local<JSValueRef> fontSizeArgs = runtimeCallInfo->GetCallArgRef(NUM_2);
131     Local<JSValueRef> fontWeightArgs = runtimeCallInfo->GetCallArgRef(NUM_3);
132     Local<JSValueRef> fontFamilyArgs = runtimeCallInfo->GetCallArgRef(NUM_4);
133     Local<JSValueRef> fontStyleArgs = runtimeCallInfo->GetCallArgRef(NUM_5);
134 
135     if (textColorArgs->IsUndefined() && fontSizeArgs->IsUndefined() && fontWeightArgs->IsUndefined() &&
136         fontFamilyArgs->IsUndefined() && fontStyleArgs->IsUndefined()) {
137         GetArkUINodeModifiers()->getDatePickerModifier()->resetDatePickerTextStyle(nativeNode);
138     }
139 
140     RefPtr<ResourceObject> fontSizeResObj;
141     std::string fontSize = ParseFontSize(vm, fontSizeArgs, fontSizeResObj);
142 
143     std::string weight = "FontWeight.Regular";
144     if (fontWeightArgs->IsString(vm) || fontWeightArgs->IsNumber()) {
145         weight = fontWeightArgs->ToString(vm)->ToString(vm);
146     }
147 
148     RefPtr<ResourceObject> fontFamilyResObj;
149     std::string fontFamily = ParseFontFamily(vm, fontFamilyArgs, fontFamilyResObj);
150 
151     int32_t fontStyle = 0;
152     if (fontStyleArgs->IsNumber()) {
153         fontStyle = fontStyleArgs->Int32Value(vm);
154     }
155     Color color;
156     RefPtr<ResourceObject> textColorResObj;
157     ArkUIPickerTextStyleStruct textStyleStruct;
158     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
159     if (!ArkTSUtils::ParseJsColorAlpha(vm, textColorArgs, color, textColorResObj, nodeInfo)) {
160         Color::ParseColorString("#ff182431", color);
161         textStyleStruct.textColorSetByUser = false;
162     } else {
163         textStyleStruct.textColorSetByUser = true;
164     }
165     std::string fontInfo =
166         StringUtils::FormatString(FORMAT_FONT.c_str(), fontSize.c_str(), weight.c_str(), fontFamily.c_str());
167 
168     textStyleStruct.textColor = color.GetValue();
169     textStyleStruct.fontStyle = fontStyle;
170     textStyleStruct.fontInfo = fontInfo.c_str();
171     textStyleStruct.fontSizeRawPtr = AceType::RawPtr(fontSizeResObj);
172     textStyleStruct.fontFamilyRawPtr = AceType::RawPtr(fontFamilyResObj);
173     textStyleStruct.textColorRawPtr = AceType::RawPtr(textColorResObj);
174     GetArkUINodeModifiers()->getDatePickerModifier()->setDatePickerTextStyleWithResObj(nativeNode, &textStyleStruct);
175     return panda::JSValueRef::Undefined(vm);
176 }
177 
ResetTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)178 ArkUINativeModuleValue DatePickerBridge::ResetTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
179 {
180     EcmaVM* vm = runtimeCallInfo->GetVM();
181     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
182     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
183     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
184     GetArkUINodeModifiers()->getDatePickerModifier()->resetDatePickerTextStyle(nativeNode);
185     return panda::JSValueRef::Undefined(vm);
186 }
187 
SetDisappearTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)188 ArkUINativeModuleValue DatePickerBridge::SetDisappearTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
189 {
190     EcmaVM* vm = runtimeCallInfo->GetVM();
191     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
192     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
193     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
194     Local<JSValueRef> textColorArgs = runtimeCallInfo->GetCallArgRef(NUM_1);
195     Local<JSValueRef> fontSizeArgs = runtimeCallInfo->GetCallArgRef(NUM_2);
196     Local<JSValueRef> fontWeightArgs = runtimeCallInfo->GetCallArgRef(NUM_3);
197     Local<JSValueRef> fontFamilyArgs = runtimeCallInfo->GetCallArgRef(NUM_4);
198     Local<JSValueRef> fontStyleArgs = runtimeCallInfo->GetCallArgRef(NUM_5);
199 
200     if (textColorArgs->IsUndefined() && fontSizeArgs->IsUndefined() && fontWeightArgs->IsUndefined() &&
201         fontFamilyArgs->IsUndefined() && fontStyleArgs->IsUndefined()) {
202         GetArkUINodeModifiers()->getDatePickerModifier()->resetDisappearTextStyle(nativeNode);
203     }
204 
205     RefPtr<ResourceObject> fontSizeResObj;
206     std::string fontSize = ParseFontSize(vm, fontSizeArgs, fontSizeResObj);
207 
208     std::string weight = "FontWeight.Regular";
209     if (fontWeightArgs->IsString(vm) || fontWeightArgs->IsNumber()) {
210         weight = fontWeightArgs->ToString(vm)->ToString(vm);
211     }
212 
213     RefPtr<ResourceObject> fontFamilyResObj;
214     std::string fontFamily = ParseFontFamily(vm, fontFamilyArgs, fontFamilyResObj);
215 
216     int32_t fontStyle = 0;
217     if (fontStyleArgs->IsNumber()) {
218         fontStyle = fontStyleArgs->Int32Value(vm);
219     }
220     Color color;
221     RefPtr<ResourceObject> textColorResObj;
222     ArkUIPickerTextStyleStruct textStyleStruct;
223     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
224     if (!ArkTSUtils::ParseJsColorAlpha(vm, textColorArgs, color, textColorResObj, nodeInfo)) {
225         Color::ParseColorString("#ff182431", color);
226         textStyleStruct.textColorSetByUser = false;
227     } else {
228         textStyleStruct.textColorSetByUser = true;
229     }
230     std::string fontInfo =
231         StringUtils::FormatString(FORMAT_FONT.c_str(), fontSize.c_str(), weight.c_str(), fontFamily.c_str());
232 
233     textStyleStruct.textColor = color.GetValue();
234     textStyleStruct.fontStyle = fontStyle;
235     textStyleStruct.fontInfo = fontInfo.c_str();
236     textStyleStruct.fontSizeRawPtr = AceType::RawPtr(fontSizeResObj);
237     textStyleStruct.fontFamilyRawPtr = AceType::RawPtr(fontFamilyResObj);
238     textStyleStruct.textColorRawPtr = AceType::RawPtr(textColorResObj);
239     GetArkUINodeModifiers()->getDatePickerModifier()->setDisappearTextStyleWithResObj(nativeNode, &textStyleStruct);
240     return panda::JSValueRef::Undefined(vm);
241 }
242 
ResetDisappearTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)243 ArkUINativeModuleValue DatePickerBridge::ResetDisappearTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
244 {
245     EcmaVM* vm = runtimeCallInfo->GetVM();
246     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
247     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
248     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
249     GetArkUINodeModifiers()->getDatePickerModifier()->resetDisappearTextStyle(nativeNode);
250     return panda::JSValueRef::Undefined(vm);
251 }
252 
SetLunar(ArkUIRuntimeCallInfo * runtimeCallInfo)253 ArkUINativeModuleValue DatePickerBridge::SetLunar(ArkUIRuntimeCallInfo* runtimeCallInfo)
254 {
255     EcmaVM* vm = runtimeCallInfo->GetVM();
256     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
257     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
258     Local<JSValueRef> isLunarArg = runtimeCallInfo->GetCallArgRef(NUM_1);
259     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
260     if (isLunarArg->IsUndefined() || !isLunarArg->IsBoolean()) {
261         GetArkUINodeModifiers()->getDatePickerModifier()->resetLunar(nativeNode);
262         return panda::JSValueRef::Undefined(vm);
263     }
264     bool isLunar = isLunarArg->ToBoolean(vm)->Value();
265     GetArkUINodeModifiers()->getDatePickerModifier()->setLunar(nativeNode, isLunar);
266     return panda::JSValueRef::Undefined(vm);
267 }
268 
ResetLunar(ArkUIRuntimeCallInfo * runtimeCallInfo)269 ArkUINativeModuleValue DatePickerBridge::ResetLunar(ArkUIRuntimeCallInfo* runtimeCallInfo)
270 {
271     EcmaVM* vm = runtimeCallInfo->GetVM();
272     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
273     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
274     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
275     GetArkUINodeModifiers()->getDatePickerModifier()->resetLunar(nativeNode);
276     return panda::JSValueRef::Undefined(vm);
277 }
278 
SetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)279 ArkUINativeModuleValue DatePickerBridge::SetBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
280 {
281     CommonBridge::SetBackgroundColor(runtimeCallInfo);
282 
283     EcmaVM* vm = runtimeCallInfo->GetVM();
284     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
285     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
286     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
287     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
288     Color color;
289     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
290         GetArkUINodeModifiers()->getDatePickerModifier()->resetDatePickerBackgroundColor(nativeNode);
291     } else {
292         GetArkUINodeModifiers()->getDatePickerModifier()->setDatePickerBackgroundColorWithColorSpace(
293             nativeNode, color.GetValue(), color.GetColorSpace());
294     }
295     return panda::JSValueRef::Undefined(vm);
296 }
297 
ResetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)298 ArkUINativeModuleValue DatePickerBridge::ResetBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
299 {
300     CommonBridge::ResetBackgroundColor(runtimeCallInfo);
301     EcmaVM* vm = runtimeCallInfo->GetVM();
302     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
303     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
304     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
305     GetArkUINodeModifiers()->getDatePickerModifier()->resetDatePickerBackgroundColor(nativeNode);
306     return panda::JSValueRef::Undefined(vm);
307 }
308 
SetEnableHapticFeedback(ArkUIRuntimeCallInfo * runtimeCallInfo)309 ArkUINativeModuleValue DatePickerBridge::SetEnableHapticFeedback(ArkUIRuntimeCallInfo* runtimeCallInfo)
310 {
311     EcmaVM* vm = runtimeCallInfo->GetVM();
312     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
313     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
314     Local<JSValueRef> enableHapticFeedbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
315     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
316     CHECK_NULL_RETURN(nativeNode, panda::NativePointerRef::New(vm, nullptr));
317     auto nodeModifiers = GetArkUINodeModifiers();
318     CHECK_NULL_RETURN(nodeModifiers, panda::NativePointerRef::New(vm, nullptr));
319     auto datePickerModifier = nodeModifiers->getDatePickerModifier();
320     CHECK_NULL_RETURN(datePickerModifier, panda::NativePointerRef::New(vm, nullptr));
321     if (enableHapticFeedbackArg->IsBoolean()) {
322         bool value = enableHapticFeedbackArg->ToBoolean(vm)->Value();
323         datePickerModifier->setEnableHapticFeedback(nativeNode, value);
324     } else {
325         datePickerModifier->resetEnableHapticFeedback(nativeNode);
326     }
327     return panda::JSValueRef::Undefined(vm);
328 }
329 
ResetEnableHapticFeedback(ArkUIRuntimeCallInfo * runtimeCallInfo)330 ArkUINativeModuleValue DatePickerBridge::ResetEnableHapticFeedback(ArkUIRuntimeCallInfo* runtimeCallInfo)
331 {
332     EcmaVM* vm = runtimeCallInfo->GetVM();
333     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
334     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
335     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
336     CHECK_NULL_RETURN(nativeNode, panda::NativePointerRef::New(vm, nullptr));
337     auto nodeModifiers = GetArkUINodeModifiers();
338     CHECK_NULL_RETURN(nodeModifiers, panda::NativePointerRef::New(vm, nullptr));
339     auto datePickerModifier = nodeModifiers->getDatePickerModifier();
340     CHECK_NULL_RETURN(datePickerModifier, panda::NativePointerRef::New(vm, nullptr));
341     datePickerModifier->resetEnableHapticFeedback(nativeNode);
342     return panda::JSValueRef::Undefined(vm);
343 }
344 
SetDigitalCrownSensitivity(ArkUIRuntimeCallInfo * runtimeCallInfo)345 ArkUINativeModuleValue DatePickerBridge::SetDigitalCrownSensitivity(ArkUIRuntimeCallInfo* runtimeCallInfo)
346 {
347     EcmaVM* vm = runtimeCallInfo->GetVM();
348     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
349     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
350     Local<JSValueRef> crownSensitivityArg =
351         runtimeCallInfo->GetCallArgRef(NUM_1);
352     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
353     uint32_t crownSensitivity = OHOS::Ace::NG::DEFAULT_CROWNSENSITIVITY;
354     if (crownSensitivityArg->IsNumber()) {
355         crownSensitivity = crownSensitivityArg->ToNumber(vm)->Value();
356     }
357     auto modifier = GetArkUINodeModifiers();
358     CHECK_NULL_RETURN(modifier, panda::NativePointerRef::New(vm, nullptr));
359     modifier->getDatePickerModifier()->setDatePickerDigitalCrownSensitivity(nativeNode, crownSensitivity);
360     return panda::JSValueRef::Undefined(vm);
361 }
362 
ResetDigitalCrownSensitivity(ArkUIRuntimeCallInfo * runtimeCallInfo)363 ArkUINativeModuleValue DatePickerBridge::ResetDigitalCrownSensitivity(ArkUIRuntimeCallInfo* runtimeCallInfo)
364 {
365     EcmaVM* vm = runtimeCallInfo->GetVM();
366     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
367     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
368     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
369     auto modifier = GetArkUINodeModifiers();
370     CHECK_NULL_RETURN(modifier, panda::NativePointerRef::New(vm, nullptr));
371     modifier->getDatePickerModifier()->resetDatePickerDigitalCrownSensitivity(nativeNode);
372     return panda::JSValueRef::Undefined(vm);
373 }
374 
SetCanLoop(ArkUIRuntimeCallInfo * runtimeCallInfo)375 ArkUINativeModuleValue DatePickerBridge::SetCanLoop(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     Local<JSValueRef> canLoopArg = runtimeCallInfo->GetCallArgRef(NUM_1);
381     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
382     CHECK_NULL_RETURN(nativeNode, panda::NativePointerRef::New(vm, nullptr));
383     auto nodeModifiers = GetArkUINodeModifiers();
384     CHECK_NULL_RETURN(nodeModifiers, panda::NativePointerRef::New(vm, nullptr));
385     auto datePickerModifier = nodeModifiers->getDatePickerModifier();
386     CHECK_NULL_RETURN(datePickerModifier, panda::NativePointerRef::New(vm, nullptr));
387     if (canLoopArg->IsBoolean()) {
388         bool value = canLoopArg->ToBoolean(vm)->Value();
389         datePickerModifier->setCanLoop(nativeNode, value);
390     } else {
391         datePickerModifier->resetCanLoop(nativeNode);
392     }
393     return panda::JSValueRef::Undefined(vm);
394 }
395 
ResetCanLoop(ArkUIRuntimeCallInfo * runtimeCallInfo)396 ArkUINativeModuleValue DatePickerBridge::ResetCanLoop(ArkUIRuntimeCallInfo* runtimeCallInfo)
397 {
398     EcmaVM* vm = runtimeCallInfo->GetVM();
399     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
400     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
401     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
402     CHECK_NULL_RETURN(nativeNode, panda::NativePointerRef::New(vm, nullptr));
403     auto nodeModifiers = GetArkUINodeModifiers();
404     CHECK_NULL_RETURN(nodeModifiers, panda::NativePointerRef::New(vm, nullptr));
405     auto datePickerModifier = nodeModifiers->getDatePickerModifier();
406     CHECK_NULL_RETURN(datePickerModifier, panda::NativePointerRef::New(vm, nullptr));
407     datePickerModifier->resetCanLoop(nativeNode);
408     return panda::JSValueRef::Undefined(vm);
409 }
410 
GetMSByDateToDouble(const std::string & date)411 double GetMSByDateToDouble(const std::string& date)
412 {
413     auto json = JsonUtil::ParseJsonString(date);
414     if (!json || json->IsNull()) {
415         return 0.0f;
416     }
417 
418     std::tm dateTime {};
419     auto year = json->GetValue("year");
420     if (year && year->IsNumber()) {
421         dateTime.tm_year = year->GetInt() - 1900; // local date start from 1900
422     }
423     auto month = json->GetValue("month");
424     if (month && month->IsNumber()) {
425         dateTime.tm_mon = month->GetInt();
426     }
427     auto day = json->GetValue("day");
428     if (day && day->IsNumber()) {
429         dateTime.tm_mday = day->GetInt();
430     }
431     auto now = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
432     auto local = std::localtime(&now);
433     CHECK_NULL_RETURN(local, 0.0f);
434     dateTime.tm_hour = local->tm_hour;
435     dateTime.tm_min = local->tm_min;
436     dateTime.tm_sec = local->tm_sec;
437     return Date::GetMilliSecondsByDateTime(dateTime);
438 }
CreateOnChange(EcmaVM * vm,const BaseEventInfo * info)439 panda::Local<panda::ObjectRef> CreateOnChange(EcmaVM* vm, const BaseEventInfo* info)
440 {
441     const auto* eventInfo = TypeInfoHelper::DynamicCast<DatePickerChangeEvent>(info);
442     CHECK_NULL_RETURN(eventInfo, panda::JSValueRef::Undefined(vm));
443     Local<JSValueRef> jsonValue =
444         panda::JSON::Parse(vm, panda::StringRef::NewFromUtf8(vm, eventInfo->GetSelectedStr().c_str()));
445     if (jsonValue->IsUndefined()) {
446         return panda::JSValueRef::Undefined(vm);
447     }
448     auto datePickerResultObj = jsonValue->ToObject(vm);
449     return datePickerResultObj;
450 }
SetDatePickerOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)451 ArkUINativeModuleValue DatePickerBridge::SetDatePickerOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
452 {
453     EcmaVM* vm = runtimeCallInfo->GetVM();
454     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
455     uint32_t argsNumber = runtimeCallInfo->GetArgsNumber();
456     if (argsNumber != NUM_2) {
457         return panda::JSValueRef::Undefined(vm);
458     }
459     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
460     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
461     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
462     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
463     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
464     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
465         GetArkUINodeModifiers()->getDatePickerModifier()->resetDatePickerOnChange(nativeNode);
466         return panda::JSValueRef::Undefined(vm);
467     }
468     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
469     std::function<void(const BaseEventInfo*)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
470                                                              const BaseEventInfo* info) {
471         panda::LocalScope pandaScope(vm);
472         panda::TryCatch trycatch(vm);
473         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
474         auto dateObj = CreateOnChange(vm, info);
475         panda::Local<panda::JSValueRef> params[] = { dateObj };
476         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
477     };
478     GetArkUINodeModifiers()->getDatePickerModifier()->setDatePickerOnChange(
479         nativeNode, reinterpret_cast<void*>(&callback));
480     return panda::JSValueRef::Undefined(vm);
481 }
ResetDatePickerOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)482 ArkUINativeModuleValue DatePickerBridge::ResetDatePickerOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
483 {
484     EcmaVM* vm = runtimeCallInfo->GetVM();
485     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
486     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
487     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
488     GetArkUINodeModifiers()->getDatePickerModifier()->resetDatePickerOnChange(nativeNode);
489     return panda::JSValueRef::Undefined(vm);
490 }
491 
SetDatePickerOnDateChange(ArkUIRuntimeCallInfo * runtimeCallInfo)492 ArkUINativeModuleValue DatePickerBridge::SetDatePickerOnDateChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
493 {
494     EcmaVM* vm = runtimeCallInfo->GetVM();
495     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
496     uint32_t argsNumber = runtimeCallInfo->GetArgsNumber();
497     if (argsNumber != NUM_2) {
498         return panda::JSValueRef::Undefined(vm);
499     }
500     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
501     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
502     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
503     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
504     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
505     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
506         GetArkUINodeModifiers()->getDatePickerModifier()->resetDatePickerOnDateChange(nativeNode);
507         return panda::JSValueRef::Undefined(vm);
508     }
509     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
510     std::function<void(const BaseEventInfo*)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
511                                                              const BaseEventInfo* info) {
512         const auto* eventInfo = TypeInfoHelper::DynamicCast<DatePickerChangeEvent>(info);
513         panda::LocalScope pandaScope(vm);
514         panda::TryCatch trycatch(vm);
515         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
516         panda::Local<panda::DateRef> dateObj =
517             panda::DateRef::New(vm, GetMSByDateToDouble(eventInfo->GetSelectedStr()));
518         panda::Local<panda::JSValueRef> params[] = { dateObj };
519         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
520     };
521     GetArkUINodeModifiers()->getDatePickerModifier()->setDatePickerOnDateChange(
522         nativeNode, reinterpret_cast<void*>(&callback));
523     return panda::JSValueRef::Undefined(vm);
524 }
525 
ResetDatePickerOnDateChange(ArkUIRuntimeCallInfo * runtimeCallInfo)526 ArkUINativeModuleValue DatePickerBridge::ResetDatePickerOnDateChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
527 {
528     EcmaVM* vm = runtimeCallInfo->GetVM();
529     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
530     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
531     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
532     GetArkUINodeModifiers()->getDatePickerModifier()->resetDatePickerOnDateChange(nativeNode);
533     return panda::JSValueRef::Undefined(vm);
534 }
535 } // namespace OHOS::Ace::NG
536