• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #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