• 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_radio_bridge.h"
16 
17 #include "core/interfaces/native/node/api.h"
18 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
19 #include "core/components/checkable/checkable_theme.h"
20 
21 namespace OHOS::Ace::NG {
22 constexpr int NUM_0 = 0;
23 constexpr int NUM_1 = 1;
24 constexpr int NUM_2 = 2;
25 constexpr int NUM_3 = 3;
SetRadioChecked(ArkUIRuntimeCallInfo * runtimeCallInfo)26 ArkUINativeModuleValue RadioBridge::SetRadioChecked(ArkUIRuntimeCallInfo* runtimeCallInfo)
27 {
28     EcmaVM* vm = runtimeCallInfo->GetVM();
29     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
30     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
31     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
32     void* nativeNode = firstArg->ToNativePointer(vm)->Value();
33     bool isCheck = secondArg->ToBoolean(vm)->Value();
34     GetArkUIInternalNodeAPI()->GetRadioModifier().SetRadioChecked(nativeNode, isCheck);
35     return panda::JSValueRef::Undefined(vm);
36 }
37 
ResetRadioChecked(ArkUIRuntimeCallInfo * runtimeCallInfo)38 ArkUINativeModuleValue RadioBridge::ResetRadioChecked(ArkUIRuntimeCallInfo* runtimeCallInfo)
39 {
40     EcmaVM* vm = runtimeCallInfo->GetVM();
41     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
42     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
43     void* nativeNode = firstArg->ToNativePointer(vm)->Value();
44     GetArkUIInternalNodeAPI()->GetRadioModifier().ResetRadioChecked(nativeNode);
45     return panda::JSValueRef::Undefined(vm);
46 }
47 
SetRadioStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)48 ArkUINativeModuleValue RadioBridge::SetRadioStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
49 {
50     EcmaVM* vm = runtimeCallInfo->GetVM();
51     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
52     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
53     Local<JSValueRef> checkedBackgroundColor = runtimeCallInfo->GetCallArgRef(NUM_1);
54     Local<JSValueRef> uncheckedBorderColor = runtimeCallInfo->GetCallArgRef(NUM_2);
55     Local<JSValueRef> indicatorColor = runtimeCallInfo->GetCallArgRef(NUM_3);
56     void* nativeNode = firstArg->ToNativePointer(vm)->Value();
57 
58     auto pipeline = PipelineBase::GetCurrentContext();
59     CHECK_NULL_RETURN(pipeline, panda::NativePointerRef::New(vm, nullptr));
60     auto radioTheme = pipeline->GetTheme<RadioTheme>();
61     CHECK_NULL_RETURN(radioTheme, panda::NativePointerRef::New(vm, nullptr));
62 
63     Color checkedBackgroundColorVal;
64     if (checkedBackgroundColor->IsNull() || checkedBackgroundColor->IsUndefined() ||
65         !ArkTSUtils::ParseJsColorAlpha(vm, checkedBackgroundColor, checkedBackgroundColorVal)) {
66         checkedBackgroundColorVal = radioTheme->GetActiveColor();
67     }
68     Color uncheckedBorderColorVal;
69     if (uncheckedBorderColor->IsNull() || uncheckedBorderColor->IsUndefined() ||
70         !ArkTSUtils::ParseJsColorAlpha(vm, uncheckedBorderColor, uncheckedBorderColorVal)) {
71         uncheckedBorderColorVal = radioTheme->GetInactiveColor();
72     }
73     Color indicatorColorVal;
74     if (indicatorColor->IsNull() || indicatorColor->IsUndefined() ||
75         !ArkTSUtils::ParseJsColorAlpha(vm, indicatorColor, indicatorColorVal)) {
76         indicatorColorVal = radioTheme->GetPointColor();
77     }
78 
79     GetArkUIInternalNodeAPI()->GetRadioModifier().SetRadioStyle(nativeNode,
80         checkedBackgroundColorVal.GetValue(), uncheckedBorderColorVal.GetValue(), indicatorColorVal.GetValue());
81     return panda::JSValueRef::Undefined(vm);
82 }
83 
ResetRadioStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)84 ArkUINativeModuleValue RadioBridge::ResetRadioStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
85 {
86     EcmaVM* vm = runtimeCallInfo->GetVM();
87     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
88     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
89     void* nativeNode = firstArg->ToNativePointer(vm)->Value();
90     GetArkUIInternalNodeAPI()->GetRadioModifier().ResetRadioStyle(nativeNode);
91     return panda::JSValueRef::Undefined(vm);
92 }
93 
SetRadioWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)94 ArkUINativeModuleValue RadioBridge::SetRadioWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
95 {
96     EcmaVM* vm = runtimeCallInfo->GetVM();
97     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
98     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); //0 is node arguments
99     Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1); //1 is JsValue
100     void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
101 
102     CalcDimension width;
103     double valueResult = jsValue->ToNumber(vm)->Value();
104     if (!ArkTSUtils::ParseJsDimensionVp(vm, jsValue, width) || LessNotEqual(valueResult, 0.0)) {
105         GetArkUIInternalNodeAPI()->GetRadioModifier().ResetRadioWidth(nativeNode);
106         return panda::JSValueRef::Undefined(vm);
107     }
108     GetArkUIInternalNodeAPI()->GetRadioModifier().SetRadioWidth(
109         nativeNode, width.Value(), static_cast<int>(width.Unit()));
110     return panda::JSValueRef::Undefined(vm);
111 }
112 
ResetRadioWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)113 ArkUINativeModuleValue RadioBridge::ResetRadioWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
114 {
115     EcmaVM* vm = runtimeCallInfo->GetVM();
116     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
117     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); //0 is node arguments
118     void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
119     GetArkUIInternalNodeAPI()->GetRadioModifier().ResetRadioWidth(nativeNode);
120     return panda::JSValueRef::Undefined(vm);
121 }
122 
SetRadioHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)123 ArkUINativeModuleValue RadioBridge::SetRadioHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
124 {
125     EcmaVM* vm = runtimeCallInfo->GetVM();
126     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
127     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); //0 is node arguments
128     Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1); //1 is Jsvalue
129     void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
130 
131     CalcDimension height;
132     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, jsValue, height)) {
133         GetArkUIInternalNodeAPI()->GetRadioModifier().ResetRadioHeight(nativeNode);
134         return panda::JSValueRef::Undefined(vm);
135     }
136     GetArkUIInternalNodeAPI()->GetRadioModifier().SetRadioHeight(
137         nativeNode, height.Value(), static_cast<int>(height.Unit()));
138     return panda::JSValueRef::Undefined(vm);
139 }
140 
ResetRadioHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)141 ArkUINativeModuleValue RadioBridge::ResetRadioHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
142 {
143     EcmaVM* vm = runtimeCallInfo->GetVM();
144     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
145     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); //0 is node arguments
146     void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
147     GetArkUIInternalNodeAPI()->GetRadioModifier().ResetRadioHeight(nativeNode);
148     return panda::JSValueRef::Undefined(vm);
149 }
150 
SetRadioSize(ArkUIRuntimeCallInfo * runtimeCallInfo)151 ArkUINativeModuleValue RadioBridge::SetRadioSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
152 {
153     EcmaVM* vm = runtimeCallInfo->GetVM();
154     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
155     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);     //0 is node arguments
156     Local<JSValueRef> widthValue = runtimeCallInfo->GetCallArgRef(1);  //1 is width value
157     Local<JSValueRef> heightValue = runtimeCallInfo->GetCallArgRef(2); //2 is height value
158     void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
159 
160     CalcDimension width = 0.0_vp;
161     CalcDimension height = 0.0_vp;
162     bool hasWidth = (!widthValue->IsNull() && !widthValue->IsUndefined() &&
163         ArkTSUtils::ParseJsDimensionVp(vm, widthValue, width));
164     bool hasHeight = (!heightValue->IsNull() && !heightValue->IsUndefined() &&
165         ArkTSUtils::ParseJsDimensionVp(vm, heightValue, height));
166     if (!hasWidth && !hasHeight) {
167         GetArkUIInternalNodeAPI()->GetRadioModifier().ResetRadioSize(nativeNode);
168     } else {
169         GetArkUIInternalNodeAPI()->GetRadioModifier().SetRadioSize(nativeNode,
170             width.Value(), static_cast<int>(width.Unit()), height.Value(), static_cast<int>(height.Unit()));
171     }
172     return panda::JSValueRef::Undefined(vm);
173 }
174 
ResetRadioSize(ArkUIRuntimeCallInfo * runtimeCallInfo)175 ArkUINativeModuleValue RadioBridge::ResetRadioSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
176 {
177     EcmaVM* vm = runtimeCallInfo->GetVM();
178     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
179     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); //0 is node arguments
180     void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
181     GetArkUIInternalNodeAPI()->GetRadioModifier().ResetRadioSize(nativeNode);
182     return panda::JSValueRef::Undefined(vm);
183 }
184 
SetRadioHoverEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)185 ArkUINativeModuleValue RadioBridge::SetRadioHoverEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
186 {
187     EcmaVM* vm = runtimeCallInfo->GetVM();
188     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
189     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);  //0 is node arguments
190     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1); //1 is Jsvalue
191     void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
192 
193     if (valueArg->IsUndefined() || !valueArg->IsNumber()) {
194         GetArkUIInternalNodeAPI()->GetRadioModifier().ResetRadioHoverEffect(nativeNode);
195         return panda::JSValueRef::Undefined(vm);
196     }
197     int32_t intValue = valueArg->Int32Value(vm);
198     GetArkUIInternalNodeAPI()->GetRadioModifier().SetRadioHoverEffect(nativeNode, intValue);
199     return panda::JSValueRef::Undefined(vm);
200 }
201 
ResetRadioHoverEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)202 ArkUINativeModuleValue RadioBridge::ResetRadioHoverEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
203 {
204     EcmaVM* vm = runtimeCallInfo->GetVM();
205     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
206     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); //0 is node arguments
207     void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
208     GetArkUIInternalNodeAPI()->GetRadioModifier().ResetRadioHoverEffect(nativeNode);
209     return panda::JSValueRef::Undefined(vm);
210 }
211 
SetRadioPadding(ArkUIRuntimeCallInfo * runtimeCallInfo)212 ArkUINativeModuleValue RadioBridge::SetRadioPadding(ArkUIRuntimeCallInfo *runtimeCallInfo)
213 {
214     EcmaVM *vm = runtimeCallInfo->GetVM();
215     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
216     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);   //0 is node arguments
217     Local<JSValueRef> topArg = runtimeCallInfo->GetCallArgRef(1);    //1 is top arguments
218     Local<JSValueRef> rightArg = runtimeCallInfo->GetCallArgRef(2);  //2 is right arguments
219     Local<JSValueRef> bottomArg = runtimeCallInfo->GetCallArgRef(3); //3 is bottom arguments
220     Local<JSValueRef> leftArg = runtimeCallInfo->GetCallArgRef(4);   //4 is left arguments
221     void *nativeNode = nodeArg->ToNativePointer(vm)->Value();
222 
223     struct ArkUISizeType top = { 0.0, static_cast<int8_t>(DimensionUnit::VP) };
224     struct ArkUISizeType right = { 0.0, static_cast<int8_t>(DimensionUnit::VP) };
225     struct ArkUISizeType bottom = { 0.0, static_cast<int8_t>(DimensionUnit::VP) };
226     struct ArkUISizeType left = { 0.0, static_cast<int8_t>(DimensionUnit::VP) };
227 
228     CalcDimension topDimen(0, DimensionUnit::VP);
229     CalcDimension rightDimen(0, DimensionUnit::VP);
230     CalcDimension bottomDimen(0, DimensionUnit::VP);
231     CalcDimension leftDimen(0, DimensionUnit::VP);
232     ArkTSUtils::ParsePadding(vm, topArg, topDimen, top);
233     ArkTSUtils::ParsePadding(vm, rightArg, rightDimen, right);
234     ArkTSUtils::ParsePadding(vm, bottomArg, bottomDimen, bottom);
235     ArkTSUtils::ParsePadding(vm, leftArg, leftDimen, left);
236     GetArkUIInternalNodeAPI()->GetRadioModifier().SetRadioPadding(nativeNode, &top, &right, &bottom, &left);
237 
238     return panda::JSValueRef::Undefined(vm);
239 }
240 
ResetRadioPadding(ArkUIRuntimeCallInfo * runtimeCallInfo)241 ArkUINativeModuleValue RadioBridge::ResetRadioPadding(ArkUIRuntimeCallInfo *runtimeCallInfo)
242 {
243     EcmaVM *vm = runtimeCallInfo->GetVM();
244     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
245     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); //0 is node arguments
246     void *nativeNode = nodeArg->ToNativePointer(vm)->Value();
247     GetArkUIInternalNodeAPI()->GetRadioModifier().ResetRadioPadding(nativeNode);
248     return panda::JSValueRef::Undefined(vm);
249 }
250 
SetRadioResponseRegion(ArkUIRuntimeCallInfo * runtimeCallInfo)251 ArkUINativeModuleValue RadioBridge::SetRadioResponseRegion(ArkUIRuntimeCallInfo* runtimeCallInfo)
252 {
253     EcmaVM* vm = runtimeCallInfo->GetVM();
254     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
255     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);   //0 is node arguments
256     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1);  //1 is Jsvalue
257     Local<JSValueRef> lengthArg = runtimeCallInfo->GetCallArgRef(2); //2 is length arguments
258     void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
259     uint32_t length = static_cast<uint32_t>(lengthArg->Int32Value(vm));
260     double regionArray[length];
261     int32_t regionUnits[length];
262     if (!ArkTSUtils::ParseResponseRegion(vm, valueArg, regionArray, regionUnits, length)) {
263         GetArkUIInternalNodeAPI()->GetRadioModifier().ResetRadioResponseRegion(nativeNode);
264         return panda::JSValueRef::Undefined(vm);
265     }
266     GetArkUIInternalNodeAPI()->GetRadioModifier().SetRadioResponseRegion(
267         nativeNode, regionArray, regionUnits, length);
268     return panda::JSValueRef::Undefined(vm);
269 }
270 
ResetRadioResponseRegion(ArkUIRuntimeCallInfo * runtimeCallInfo)271 ArkUINativeModuleValue RadioBridge::ResetRadioResponseRegion(ArkUIRuntimeCallInfo* runtimeCallInfo)
272 {
273     EcmaVM* vm = runtimeCallInfo->GetVM();
274     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
275     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0); //0 is node arguments
276     void* nativeNode = firstArg->ToNativePointer(vm)->Value();
277     GetArkUIInternalNodeAPI()->GetRadioModifier().ResetRadioResponseRegion(nativeNode);
278     return panda::JSValueRef::Undefined(vm);
279 }
280 }
281