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
19 namespace OHOS::Ace::NG {
20 const std::string DEFAULT_ERR_CODE = "-1";
21 const std::string FORMAT_FONT = "%s|%s|%s";
22 constexpr int NUM_0 = 0;
23 constexpr int NUM_1 = 1;
24 constexpr int NUM_2 = 2;
25 constexpr int NUM_3 = 3;
26 constexpr int NUM_4 = 4;
27 constexpr int NUM_5 = 5;
28 constexpr uint32_t DEFAULT_TIME_PICKER_TEXT_COLOR = 0xFF182431;
29 constexpr uint32_t DEFAULT_TIME_PICKER_SELECTED_TEXT_COLOR = 0xFF0A59F7;
30
SetTimepickerBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)31 ArkUINativeModuleValue TimepickerBridge::SetTimepickerBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
32 {
33 EcmaVM* vm = runtimeCallInfo->GetVM();
34 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
35 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
36 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
37 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
38 uint32_t color = secondArg->Uint32Value(vm);
39 GetArkUINodeModifiers()->getTimepickerModifier()->setTimepickerBackgroundColor(nativeNode, color);
40 return panda::JSValueRef::Undefined(vm);
41 }
42
ResetTimepickerBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)43 ArkUINativeModuleValue TimepickerBridge::ResetTimepickerBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
44 {
45 EcmaVM* vm = runtimeCallInfo->GetVM();
46 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
47 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
48 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
49 GetArkUINodeModifiers()->getTimepickerModifier()->resetTimepickerBackgroundColor(nativeNode);
50 return panda::JSValueRef::Undefined(vm);
51 }
52
SetTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)53 ArkUINativeModuleValue TimepickerBridge::SetTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
54 {
55 EcmaVM* vm = runtimeCallInfo->GetVM();
56 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
57 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
58 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(NUM_1);
59 Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(NUM_2);
60 Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(NUM_3);
61 Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(NUM_4);
62 Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(NUM_5);
63 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
64 Color color;
65 if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
66 color.SetValue(DEFAULT_TIME_PICKER_TEXT_COLOR);
67 }
68 CalcDimension size;
69 if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined()) {
70 size = Dimension(-1);
71 } else {
72 if (!ArkTSUtils::ParseJsDimensionNG(vm, fontSizeArg, size, DimensionUnit::FP, false)) {
73 size = Dimension(-1);
74 }
75 }
76 std::string weight = DEFAULT_ERR_CODE;
77 if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
78 if (fontWeightArg->IsNumber()) {
79 weight = std::to_string(fontWeightArg->Int32Value(vm));
80 } else {
81 if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, weight) || weight.empty()) {
82 weight = DEFAULT_ERR_CODE;
83 }
84 }
85 }
86 std::string fontFamily;
87 if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
88 fontFamily = DEFAULT_ERR_CODE;
89 }
90 int32_t styleVal = 0;
91 if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined()) {
92 styleVal = fontStyleArg->Int32Value(vm);
93 }
94 std::string fontSizeStr = size.ToString();
95 std::string fontInfo = StringUtils::FormatString(
96 FORMAT_FONT.c_str(), fontSizeStr.c_str(), weight.c_str(), fontFamily.c_str());
97 GetArkUINodeModifiers()->getTimepickerModifier()->setTimepickerTextStyle(
98 nativeNode, color.GetValue(), fontInfo.c_str(), styleVal);
99 return panda::JSValueRef::Undefined(vm);
100 }
101
SetSelectedTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)102 ArkUINativeModuleValue TimepickerBridge::SetSelectedTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
103 {
104 EcmaVM* vm = runtimeCallInfo->GetVM();
105 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
106 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
107 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(NUM_1);
108 Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(NUM_2);
109 Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(NUM_3);
110 Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(NUM_4);
111 Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(NUM_5);
112 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
113 Color color;
114 if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
115 color.SetValue(DEFAULT_TIME_PICKER_SELECTED_TEXT_COLOR);
116 }
117 CalcDimension size;
118 if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined()) {
119 size = Dimension(-1);
120 } else {
121 if (!ArkTSUtils::ParseJsDimensionNG(vm, fontSizeArg, size, DimensionUnit::FP, false)) {
122 size = Dimension(-1);
123 }
124 }
125 std::string weight = DEFAULT_ERR_CODE;
126 if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
127 if (fontWeightArg->IsNumber()) {
128 weight = std::to_string(fontWeightArg->Int32Value(vm));
129 } else {
130 if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, weight) || weight.empty()) {
131 weight = DEFAULT_ERR_CODE;
132 }
133 }
134 }
135 std::string fontFamily;
136 if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
137 fontFamily = DEFAULT_ERR_CODE;
138 }
139 int32_t styleVal = 0;
140 if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined()) {
141 styleVal = fontStyleArg->Int32Value(vm);
142 }
143 std::string fontSizeStr = size.ToString();
144 std::string fontInfo = StringUtils::FormatString(
145 FORMAT_FONT.c_str(), fontSizeStr.c_str(), weight.c_str(), fontFamily.c_str());
146 GetArkUINodeModifiers()->getTimepickerModifier()->setTimepickerSelectedTextStyle(
147 nativeNode, color.GetValue(), fontInfo.c_str(), styleVal);
148 return panda::JSValueRef::Undefined(vm);
149 }
150
SetDisappearTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)151 ArkUINativeModuleValue TimepickerBridge::SetDisappearTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
152 {
153 EcmaVM* vm = runtimeCallInfo->GetVM();
154 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
155 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
156 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(NUM_1);
157 Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(NUM_2);
158 Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(NUM_3);
159 Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(NUM_4);
160 Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(NUM_5);
161 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
162 Color color;
163 if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
164 color.SetValue(DEFAULT_TIME_PICKER_TEXT_COLOR);
165 }
166 CalcDimension size;
167 if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined()) {
168 size = Dimension(-1);
169 } else {
170 if (!ArkTSUtils::ParseJsDimensionNG(vm, fontSizeArg, size, DimensionUnit::FP, false)) {
171 size = Dimension(-1);
172 }
173 }
174 std::string weight = DEFAULT_ERR_CODE;
175 if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
176 if (fontWeightArg->IsNumber()) {
177 weight = std::to_string(fontWeightArg->Int32Value(vm));
178 } else {
179 if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, weight) || weight.empty()) {
180 weight = DEFAULT_ERR_CODE;
181 }
182 }
183 }
184 std::string fontFamily;
185 if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
186 fontFamily = DEFAULT_ERR_CODE;
187 }
188 int32_t styleVal = 0;
189 if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined()) {
190 styleVal = fontStyleArg->Int32Value(vm);
191 }
192 std::string fontSizeStr = size.ToString();
193 std::string fontInfo = StringUtils::FormatString(
194 FORMAT_FONT.c_str(), fontSizeStr.c_str(), weight.c_str(), fontFamily.c_str());
195 GetArkUINodeModifiers()->getTimepickerModifier()->setTimepickerDisappearTextStyle(
196 nativeNode, color.GetValue(), fontInfo.c_str(), styleVal);
197 return panda::JSValueRef::Undefined(vm);
198 }
199
ResetTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)200 ArkUINativeModuleValue TimepickerBridge::ResetTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
201 {
202 EcmaVM* vm = runtimeCallInfo->GetVM();
203 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
204 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
205 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
206 GetArkUINodeModifiers()->getTimepickerModifier()->resetTimepickerTextStyle(nativeNode);
207 return panda::JSValueRef::Undefined(vm);
208 }
209
ResetSelectedTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)210 ArkUINativeModuleValue TimepickerBridge::ResetSelectedTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
211 {
212 EcmaVM* vm = runtimeCallInfo->GetVM();
213 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
214 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
215 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
216 GetArkUINodeModifiers()->getTimepickerModifier()->resetTimepickerSelectedTextStyle(nativeNode);
217 return panda::JSValueRef::Undefined(vm);
218 }
219
ResetDisappearTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)220 ArkUINativeModuleValue TimepickerBridge::ResetDisappearTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
221 {
222 EcmaVM* vm = runtimeCallInfo->GetVM();
223 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
224 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
225 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
226 GetArkUINodeModifiers()->getTimepickerModifier()->resetTimepickerDisappearTextStyle(nativeNode);
227 return panda::JSValueRef::Undefined(vm);
228 }
229
SetTimepickerUseMilitaryTime(ArkUIRuntimeCallInfo * runtimeCallInfo)230 ArkUINativeModuleValue TimepickerBridge::SetTimepickerUseMilitaryTime(ArkUIRuntimeCallInfo* runtimeCallInfo)
231 {
232 EcmaVM* vm = runtimeCallInfo->GetVM();
233 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
234 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
235 Local<JSValueRef> useMilitaryArg = runtimeCallInfo->GetCallArgRef(NUM_1);
236 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
237 if (useMilitaryArg->IsBoolean()) {
238 bool value = useMilitaryArg->ToBoolean(vm)->Value();
239 GetArkUINodeModifiers()->getTimepickerModifier()->setTimepickerUseMilitaryTime(nativeNode, value);
240 } else {
241 GetArkUINodeModifiers()->getTimepickerModifier()->resetTimepickerUseMilitaryTime(nativeNode);
242 }
243 return panda::JSValueRef::Undefined(vm);
244 }
245
ResetTimepickerUseMilitaryTime(ArkUIRuntimeCallInfo * runtimeCallInfo)246 ArkUINativeModuleValue TimepickerBridge::ResetTimepickerUseMilitaryTime(ArkUIRuntimeCallInfo* runtimeCallInfo)
247 {
248 EcmaVM* vm = runtimeCallInfo->GetVM();
249 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
250 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
251 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
252 GetArkUINodeModifiers()->getTimepickerModifier()->resetTimepickerUseMilitaryTime(nativeNode);
253 return panda::JSValueRef::Undefined(vm);
254 }
255
SetTimepickerLoop(ArkUIRuntimeCallInfo * runtimeCallInfo)256 ArkUINativeModuleValue TimepickerBridge::SetTimepickerLoop(ArkUIRuntimeCallInfo* runtimeCallInfo)
257 {
258 EcmaVM* vm = runtimeCallInfo->GetVM();
259 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
260 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
261 Local<JSValueRef> loopArg = runtimeCallInfo->GetCallArgRef(NUM_1);
262 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
263 if (loopArg->IsBoolean()) {
264 bool value = loopArg->ToBoolean(vm)->Value();
265 GetArkUINodeModifiers()->getTimepickerModifier()->setTimepickerLoop(nativeNode, value);
266 } else {
267 GetArkUINodeModifiers()->getTimepickerModifier()->resetTimepickerLoop(nativeNode);
268 }
269 return panda::JSValueRef::Undefined(vm);
270 }
271
ResetTimepickerLoop(ArkUIRuntimeCallInfo * runtimeCallInfo)272 ArkUINativeModuleValue TimepickerBridge::ResetTimepickerLoop(ArkUIRuntimeCallInfo* runtimeCallInfo)
273 {
274 EcmaVM* vm = runtimeCallInfo->GetVM();
275 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
276 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
277 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
278 GetArkUINodeModifiers()->getTimepickerModifier()->resetTimepickerLoop(nativeNode);
279 return panda::JSValueRef::Undefined(vm);
280 }
281
SetTimepickerDateTimeOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)282 ArkUINativeModuleValue TimepickerBridge::SetTimepickerDateTimeOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
283 {
284 EcmaVM* vm = runtimeCallInfo->GetVM();
285 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
286 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
287 Local<JSValueRef> hourArg = runtimeCallInfo->GetCallArgRef(NUM_1);
288 Local<JSValueRef> minuteArg = runtimeCallInfo->GetCallArgRef(NUM_2);
289 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_3);
290 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
291 ZeroPrefixType hourType = ZeroPrefixType::AUTO;
292 ZeroPrefixType minuteType = ZeroPrefixType::AUTO;
293 ZeroPrefixType secondType = ZeroPrefixType::AUTO;
294 std::string hour = "hour";
295 if (hourArg->IsString(vm)) {
296 std::string hour = hourArg->ToString(vm)->ToString(vm);
297 if (hour == "2-digit") {
298 hourType = ZeroPrefixType::SHOW;
299 } else if (hour == "numeric") {
300 hourType = ZeroPrefixType::HIDE;
301 }
302 }
303 std::string minute = "minute";
304 if (minuteArg->IsString(vm)) {
305 minuteType = ZeroPrefixType::SHOW;
306 std::string minute = minuteArg->ToString(vm)->ToString(vm);
307 if (minute == "numeric") {
308 minuteType = ZeroPrefixType::HIDE;
309 }
310 }
311 std::string second = "second";
312 if (secondArg->IsString(vm)) {
313 secondType = ZeroPrefixType::SHOW;
314 std::string second = secondArg->ToString(vm)->ToString(vm);
315 if (second == "numeric") {
316 secondType = ZeroPrefixType::HIDE;
317 }
318 }
319 GetArkUINodeModifiers()->getTimepickerModifier()->setTimepickerDateTimeOptions(
320 nativeNode, static_cast<ArkUI_Int32>(hourType), static_cast<ArkUI_Int32>(minuteType),
321 static_cast<ArkUI_Int32>(secondType));
322 return panda::JSValueRef::Undefined(vm);
323 }
324
ResetTimepickerDateTimeOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)325 ArkUINativeModuleValue TimepickerBridge::ResetTimepickerDateTimeOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
326 {
327 EcmaVM* vm = runtimeCallInfo->GetVM();
328 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
329 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
330 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
331 GetArkUINodeModifiers()->getTimepickerModifier()->resetTimepickerDateTimeOptions(nativeNode);
332 return panda::JSValueRef::Undefined(vm);
333 }
334 } // namespace OHOS::Ace::NG