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