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