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