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