• 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 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_common_bridge.h"
17 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
18 #include "core/components/checkable/checkable_theme.h"
19 #include "core/components_ng/base/frame_node.h"
20 #include "core/components_ng/pattern/radio/radio_model_ng.h"
21 
22 namespace OHOS::Ace::NG {
23 constexpr int NUM_0 = 0;
24 constexpr int NUM_1 = 1;
25 constexpr int NUM_2 = 2;
26 constexpr int NUM_3 = 3;
27 constexpr int NUM_4 = 4;
28 constexpr int PARAM_ARR_LENGTH_1 = 1;
29 const char* RADIO_BUILDER_NODEPTR_OF_UINODE = "nodePtr_";
JsRadioChangeCallback(panda::JsiRuntimeCallInfo * runtimeCallInfo)30 panda::Local<panda::JSValueRef> JsRadioChangeCallback(panda::JsiRuntimeCallInfo* runtimeCallInfo)
31 {
32     auto vm = runtimeCallInfo->GetVM();
33     int32_t argc = static_cast<int32_t>(runtimeCallInfo->GetArgsNumber());
34     if (argc != NUM_1) {
35         return panda::JSValueRef::Undefined(vm);
36     }
37     auto firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
38     if (!firstArg->IsBoolean()) {
39         return panda::JSValueRef::Undefined(vm);
40     }
41     bool value = firstArg->ToBoolean(vm)->Value();
42     auto ref = runtimeCallInfo->GetThisRef();
43     auto obj = ref->ToObject(vm);
44     if (obj->GetNativePointerFieldCount(vm) < NUM_1) {
45         return panda::JSValueRef::Undefined(vm);
46     }
47     auto frameNode = static_cast<FrameNode*>(obj->GetNativePointerField(vm, 0));
48     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
49     RadioModelNG::SetChangeValue(frameNode, value);
50     return panda::JSValueRef::Undefined(vm);
51 }
52 
SetRadioChecked(ArkUIRuntimeCallInfo * runtimeCallInfo)53 ArkUINativeModuleValue RadioBridge::SetRadioChecked(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> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
59     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
60     bool isCheck = secondArg->ToBoolean(vm)->Value();
61     GetArkUINodeModifiers()->getRadioModifier()->setRadioChecked(nativeNode, isCheck);
62     return panda::JSValueRef::Undefined(vm);
63 }
64 
ResetRadioChecked(ArkUIRuntimeCallInfo * runtimeCallInfo)65 ArkUINativeModuleValue RadioBridge::ResetRadioChecked(ArkUIRuntimeCallInfo* runtimeCallInfo)
66 {
67     EcmaVM* vm = runtimeCallInfo->GetVM();
68     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
69     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
70     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
71     GetArkUINodeModifiers()->getRadioModifier()->resetRadioChecked(nativeNode);
72     return panda::JSValueRef::Undefined(vm);
73 }
74 
SetRadioStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)75 ArkUINativeModuleValue RadioBridge::SetRadioStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
76 {
77     EcmaVM* vm = runtimeCallInfo->GetVM();
78     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
79     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
80     Local<JSValueRef> checkedBackgroundColor = runtimeCallInfo->GetCallArgRef(NUM_1);
81     Local<JSValueRef> uncheckedBorderColor = runtimeCallInfo->GetCallArgRef(NUM_2);
82     Local<JSValueRef> indicatorColor = runtimeCallInfo->GetCallArgRef(NUM_3);
83     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
84 
85     auto pipeline = PipelineBase::GetCurrentContext();
86     CHECK_NULL_RETURN(pipeline, panda::NativePointerRef::New(vm, nullptr));
87     auto radioTheme = pipeline->GetTheme<RadioTheme>();
88     CHECK_NULL_RETURN(radioTheme, panda::NativePointerRef::New(vm, nullptr));
89 
90     Color checkedBackgroundColorVal;
91     RefPtr<ResourceObject> backgroundColorResObj;
92     RefPtr<ResourceObject> unBorderColorResObj;
93     RefPtr<ResourceObject> indicatorColorResObj;
94     ArkUIRadioColorStruct resObjStru;
95     bool jsBgColorSetByUser = false;
96     bool jsUnBorderColorSetByUser = false;
97     bool jsIndicatorColorSetByUser = false;
98     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
99 
100     if (checkedBackgroundColor->IsNull() || checkedBackgroundColor->IsUndefined() ||
101         !ArkTSUtils::ParseJsColorAlpha(vm, checkedBackgroundColor, checkedBackgroundColorVal, backgroundColorResObj,
102         nodeInfo)) {
103         checkedBackgroundColorVal = radioTheme->GetActiveColor();
104         resObjStru.checkedBackgroundColor = nullptr;
105     } else {
106         jsBgColorSetByUser = true;
107         resObjStru.checkedBackgroundColor = AceType::RawPtr(backgroundColorResObj);
108     }
109     Color uncheckedBorderColorVal;
110     if (uncheckedBorderColor->IsNull() || uncheckedBorderColor->IsUndefined() ||
111         !ArkTSUtils::ParseJsColorAlpha(vm, uncheckedBorderColor, uncheckedBorderColorVal,
112         unBorderColorResObj, nodeInfo)) {
113         uncheckedBorderColorVal = radioTheme->GetInactiveColor();
114         resObjStru.uncheckedBorderColor = nullptr;
115     } else {
116         jsUnBorderColorSetByUser = true;
117         resObjStru.uncheckedBorderColor = AceType::RawPtr(unBorderColorResObj);
118     }
119     Color indicatorColorVal;
120     if (indicatorColor->IsNull() || indicatorColor->IsUndefined() ||
121         !ArkTSUtils::ParseJsColorAlpha(vm, indicatorColor, indicatorColorVal, indicatorColorResObj, nodeInfo)) {
122         indicatorColorVal = radioTheme->GetPointColor();
123         resObjStru.indicatorColor = nullptr;
124     } else {
125         jsIndicatorColorSetByUser = true;
126         resObjStru.indicatorColor = AceType::RawPtr(indicatorColorResObj);
127     }
128 
129     GetArkUINodeModifiers()->getRadioModifier()->setRadioColorSetByUser(
130         nativeNode, jsBgColorSetByUser, jsUnBorderColorSetByUser, jsIndicatorColorSetByUser);
131     GetArkUINodeModifiers()->getRadioModifier()->setRadioStylePtr(nativeNode,
132         checkedBackgroundColorVal.GetValue(), uncheckedBorderColorVal.GetValue(),
133         indicatorColorVal.GetValue(), resObjStru);
134     return panda::JSValueRef::Undefined(vm);
135 }
136 
ResetRadioStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)137 ArkUINativeModuleValue RadioBridge::ResetRadioStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
138 {
139     EcmaVM* vm = runtimeCallInfo->GetVM();
140     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
141     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
142     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
143     GetArkUINodeModifiers()->getRadioModifier()->resetRadioStyle(nativeNode);
144     return panda::JSValueRef::Undefined(vm);
145 }
146 
SetRadioWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)147 ArkUINativeModuleValue RadioBridge::SetRadioWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
148 {
149     EcmaVM* vm = runtimeCallInfo->GetVM();
150     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
151     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
152     Local<JSValueRef> widthArg = runtimeCallInfo->GetCallArgRef(1);
153     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
154     CalcDimension width;
155     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, widthArg, width)) {
156         GetArkUINodeModifiers()->getRadioModifier()->resetRadioWidth(nativeNode);
157         return panda::JSValueRef::Undefined(vm);
158     }
159     if (LessNotEqual(width.Value(), 0.0)) {
160         width.SetValue(0.0);
161     }
162     std::string widthCalc = width.CalcValue();
163     GetArkUINodeModifiers()->getRadioModifier()->setRadioWidth(
164         nativeNode, width.Value(), static_cast<int32_t>(width.Unit()), widthCalc.c_str());
165     return panda::JSValueRef::Undefined(vm);
166 }
167 
ResetRadioWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)168 ArkUINativeModuleValue RadioBridge::ResetRadioWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
169 {
170     EcmaVM* vm = runtimeCallInfo->GetVM();
171     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
172     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); //0 is node arguments
173     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
174     GetArkUINodeModifiers()->getRadioModifier()->resetRadioWidth(nativeNode);
175     return panda::JSValueRef::Undefined(vm);
176 }
177 
SetRadioHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)178 ArkUINativeModuleValue RadioBridge::SetRadioHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
179 {
180     EcmaVM* vm = runtimeCallInfo->GetVM();
181     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
182     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
183     Local<JSValueRef> heightArg = runtimeCallInfo->GetCallArgRef(1);
184     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
185     CalcDimension height;
186     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, heightArg, height)) {
187         GetArkUINodeModifiers()->getRadioModifier()->resetRadioHeight(nativeNode);
188         return panda::JSValueRef::Undefined(vm);
189     }
190     if (LessNotEqual(height.Value(), 0.0)) {
191         height.SetValue(0.0);
192     }
193     std::string heightCalc = height.CalcValue();
194     GetArkUINodeModifiers()->getRadioModifier()->setRadioHeight(
195         nativeNode, height.Value(), static_cast<int32_t>(height.Unit()), heightCalc.c_str());
196     return panda::JSValueRef::Undefined(vm);
197 }
198 
ResetRadioHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)199 ArkUINativeModuleValue RadioBridge::ResetRadioHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
200 {
201     EcmaVM* vm = runtimeCallInfo->GetVM();
202     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
203     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); //0 is node arguments
204     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
205     GetArkUINodeModifiers()->getRadioModifier()->resetRadioHeight(nativeNode);
206     return panda::JSValueRef::Undefined(vm);
207 }
208 
SetRadioSize(ArkUIRuntimeCallInfo * runtimeCallInfo)209 ArkUINativeModuleValue RadioBridge::SetRadioSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
210 {
211     EcmaVM* vm = runtimeCallInfo->GetVM();
212     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
213     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);     //0 is node arguments
214     Local<JSValueRef> widthArg = runtimeCallInfo->GetCallArgRef(1);  //1 is width value
215     Local<JSValueRef> heightArg = runtimeCallInfo->GetCallArgRef(2); //2 is height value
216     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
217 
218     CalcDimension width;
219     CalcDimension height;
220     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, widthArg, width)) {
221         GetArkUINodeModifiers()->getRadioModifier()->resetRadioWidth(nativeNode);
222     } else {
223         std::string widthCalc = width.CalcValue();
224         if (LessNotEqual(width.Value(), 0.0)) {
225             width.SetValue(0.0);
226         }
227         GetArkUINodeModifiers()->getRadioModifier()->setRadioWidth(
228             nativeNode, width.Value(), static_cast<int>(width.Unit()), widthCalc.c_str());
229     }
230     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, heightArg, height)) {
231         GetArkUINodeModifiers()->getRadioModifier()->resetRadioHeight(nativeNode);
232     } else {
233         std::string heightCalc = height.CalcValue();
234         if (LessNotEqual(height.Value(), 0.0)) {
235             height.SetValue(0.0);
236         }
237         GetArkUINodeModifiers()->getRadioModifier()->setRadioHeight(
238             nativeNode, height.Value(), static_cast<int>(height.Unit()), heightCalc.c_str());
239     }
240     return panda::JSValueRef::Undefined(vm);
241 }
242 
ResetRadioSize(ArkUIRuntimeCallInfo * runtimeCallInfo)243 ArkUINativeModuleValue RadioBridge::ResetRadioSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
244 {
245     EcmaVM* vm = runtimeCallInfo->GetVM();
246     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
247     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); //0 is node arguments
248     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
249     GetArkUINodeModifiers()->getRadioModifier()->resetRadioSize(nativeNode);
250     return panda::JSValueRef::Undefined(vm);
251 }
252 
SetRadioHoverEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)253 ArkUINativeModuleValue RadioBridge::SetRadioHoverEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
254 {
255     EcmaVM* vm = runtimeCallInfo->GetVM();
256     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
257     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);  //0 is node arguments
258     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1); //1 is Jsvalue
259     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
260 
261     if (valueArg->IsUndefined() || !valueArg->IsNumber()) {
262         GetArkUINodeModifiers()->getRadioModifier()->resetRadioHoverEffect(nativeNode);
263         return panda::JSValueRef::Undefined(vm);
264     }
265     int32_t intValue = valueArg->Int32Value(vm);
266     GetArkUINodeModifiers()->getRadioModifier()->setRadioHoverEffect(nativeNode, intValue);
267     return panda::JSValueRef::Undefined(vm);
268 }
269 
ResetRadioHoverEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)270 ArkUINativeModuleValue RadioBridge::ResetRadioHoverEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
271 {
272     EcmaVM* vm = runtimeCallInfo->GetVM();
273     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
274     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); //0 is node arguments
275     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
276     GetArkUINodeModifiers()->getRadioModifier()->resetRadioHoverEffect(nativeNode);
277     return panda::JSValueRef::Undefined(vm);
278 }
279 
SetRadioPadding(ArkUIRuntimeCallInfo * runtimeCallInfo)280 ArkUINativeModuleValue RadioBridge::SetRadioPadding(ArkUIRuntimeCallInfo *runtimeCallInfo)
281 {
282     EcmaVM *vm = runtimeCallInfo->GetVM();
283     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
284     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);   //0 is node arguments
285     Local<JSValueRef> topArg = runtimeCallInfo->GetCallArgRef(1);    //1 is top arguments
286     Local<JSValueRef> rightArg = runtimeCallInfo->GetCallArgRef(2);  //2 is right arguments
287     Local<JSValueRef> bottomArg = runtimeCallInfo->GetCallArgRef(3); //3 is bottom arguments
288     Local<JSValueRef> leftArg = runtimeCallInfo->GetCallArgRef(4);   //4 is left arguments
289     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
290 
291     struct ArkUISizeType top = { 0.0, static_cast<int8_t>(DimensionUnit::VP), nullptr };
292     struct ArkUISizeType right = { 0.0, static_cast<int8_t>(DimensionUnit::VP), nullptr };
293     struct ArkUISizeType bottom = { 0.0, static_cast<int8_t>(DimensionUnit::VP), nullptr };
294     struct ArkUISizeType left = { 0.0, static_cast<int8_t>(DimensionUnit::VP), nullptr };
295 
296     CalcDimension topDimen(0, DimensionUnit::VP);
297     CalcDimension rightDimen(0, DimensionUnit::VP);
298     CalcDimension bottomDimen(0, DimensionUnit::VP);
299     CalcDimension leftDimen(0, DimensionUnit::VP);
300     ArkTSUtils::ParsePadding(vm, topArg, topDimen, top);
301     ArkTSUtils::ParsePadding(vm, rightArg, rightDimen, right);
302     ArkTSUtils::ParsePadding(vm, bottomArg, bottomDimen, bottom);
303     ArkTSUtils::ParsePadding(vm, leftArg, leftDimen, left);
304     GetArkUINodeModifiers()->getRadioModifier()->setRadioPadding(nativeNode, &top, &right, &bottom, &left);
305 
306     return panda::JSValueRef::Undefined(vm);
307 }
308 
ResetRadioPadding(ArkUIRuntimeCallInfo * runtimeCallInfo)309 ArkUINativeModuleValue RadioBridge::ResetRadioPadding(ArkUIRuntimeCallInfo *runtimeCallInfo)
310 {
311     EcmaVM *vm = runtimeCallInfo->GetVM();
312     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
313     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); //0 is node arguments
314     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
315     GetArkUINodeModifiers()->getRadioModifier()->resetRadioPadding(nativeNode);
316     return panda::JSValueRef::Undefined(vm);
317 }
318 
SetRadioResponseRegion(ArkUIRuntimeCallInfo * runtimeCallInfo)319 ArkUINativeModuleValue RadioBridge::SetRadioResponseRegion(ArkUIRuntimeCallInfo* runtimeCallInfo)
320 {
321     EcmaVM* vm = runtimeCallInfo->GetVM();
322     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
323     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);   //0 is node arguments
324     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1);  //1 is JsValue
325     Local<JSValueRef> lengthArg = runtimeCallInfo->GetCallArgRef(2); //2 is length arguments
326     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
327     uint32_t length = static_cast<uint32_t>(lengthArg->Int32Value(vm));
328     ArkUI_Float32 regionArray[length];
329     int32_t regionUnits[length];
330     if (!ArkTSUtils::ParseResponseRegion(vm, valueArg, regionArray, regionUnits, length)) {
331         GetArkUINodeModifiers()->getRadioModifier()->resetRadioResponseRegion(nativeNode);
332         return panda::JSValueRef::Undefined(vm);
333     }
334     GetArkUINodeModifiers()->getRadioModifier()->setRadioResponseRegion(
335         nativeNode, regionArray, regionUnits, length);
336     return panda::JSValueRef::Undefined(vm);
337 }
338 
ResetRadioResponseRegion(ArkUIRuntimeCallInfo * runtimeCallInfo)339 ArkUINativeModuleValue RadioBridge::ResetRadioResponseRegion(ArkUIRuntimeCallInfo* runtimeCallInfo)
340 {
341     EcmaVM* vm = runtimeCallInfo->GetVM();
342     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
343     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0); //0 is node arguments
344     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
345     GetArkUINodeModifiers()->getRadioModifier()->resetRadioResponseRegion(nativeNode);
346     return panda::JSValueRef::Undefined(vm);
347 }
348 
SetContentModifierBuilder(ArkUIRuntimeCallInfo * runtimeCallInfo)349 ArkUINativeModuleValue RadioBridge::SetContentModifierBuilder(ArkUIRuntimeCallInfo* runtimeCallInfo)
350 {
351     EcmaVM* vm = runtimeCallInfo->GetVM();
352     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
353     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
354     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
355     auto* frameNode = reinterpret_cast<FrameNode*>(firstArg->ToNativePointer(vm)->Value());
356     if (!secondArg->IsObject(vm)) {
357         RadioModelNG::SetBuilderFunc(frameNode, nullptr);
358         return panda::JSValueRef::Undefined(vm);
359     }
360     panda::CopyableGlobal<panda::ObjectRef> obj(vm, secondArg);
361     RadioModelNG::SetBuilderFunc(frameNode,
362         [vm, frameNode, obj = std::move(obj), containerId = Container::CurrentId()](
363             RadioConfiguration config) -> RefPtr<FrameNode> {
364             ContainerScope scope(containerId);
365             auto context = ArkTSUtils::GetContext(vm);
366             CHECK_EQUAL_RETURN(context->IsUndefined(), true, nullptr);
367             const char* keysOfRadio[] = { "value", "checked", "enabled", "triggerChange"};
368             Local<JSValueRef> valuesOfRadio[] = { panda::StringRef::NewFromUtf8(vm, config.value_.c_str()),
369                 panda::BooleanRef::New(vm, config.checked_), panda::BooleanRef::New(vm, config.enabled_),
370                 panda::FunctionRef::New(vm, JsRadioChangeCallback)};
371             auto radio = panda::ObjectRef::NewWithNamedProperties(vm,
372                 ArraySize(keysOfRadio), keysOfRadio, valuesOfRadio);
373             radio->SetNativePointerFieldCount(vm, 1);
374             radio->SetNativePointerField(vm, 0, static_cast<void*>(frameNode));
375             panda::Local<panda::JSValueRef> params[NUM_2] = { context, radio };
376             LocalScope pandaScope(vm);
377             panda::TryCatch trycatch(vm);
378             auto jsObject = obj.ToLocal();
379             auto makeFunc = jsObject->Get(vm, panda::StringRef::NewFromUtf8(vm, "makeContentModifierNode"));
380             CHECK_EQUAL_RETURN(makeFunc->IsFunction(vm), false, nullptr);
381             panda::Local<panda::FunctionRef> func = makeFunc;
382             auto result = func->Call(vm, jsObject, params, NUM_2);
383             JSNApi::ExecutePendingJob(vm);
384             CHECK_EQUAL_RETURN(result.IsEmpty() || trycatch.HasCaught() || !result->IsObject(vm), true, nullptr);
385             auto resultObj = result->ToObject(vm);
386             panda::Local<panda::JSValueRef> nodeptr =
387                 resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, RADIO_BUILDER_NODEPTR_OF_UINODE));
388             CHECK_EQUAL_RETURN(nodeptr.IsEmpty() || nodeptr->IsUndefined() || nodeptr->IsNull(), true, nullptr);
389             auto* frameNode = reinterpret_cast<FrameNode*>(nodeptr->ToNativePointer(vm)->Value());
390             CHECK_NULL_RETURN(frameNode, nullptr);
391             return AceType::Claim(frameNode);
392         });
393     return panda::JSValueRef::Undefined(vm);
394 }
395 
SetRadioOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)396 ArkUINativeModuleValue RadioBridge::SetRadioOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
397 {
398     EcmaVM* vm = runtimeCallInfo->GetVM();
399     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
400     CHECK_EQUAL_RETURN(runtimeCallInfo->GetArgsNumber() != NUM_4, true, panda::JSValueRef::Undefined(vm));
401     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
402     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(NUM_1);
403     Local<JSValueRef> groupArg = runtimeCallInfo->GetCallArgRef(NUM_2);
404     Local<JSValueRef> indicatorTypeArg = runtimeCallInfo->GetCallArgRef(NUM_3);
405     std::string value;
406     std::string group;
407     auto indicatorType = RadioIndicatorType::TICK;
408 
409     if (!valueArg.IsNull() && valueArg->IsString(vm)) {
410         value = valueArg->ToString(vm)->ToString(vm);
411     }
412     if (!groupArg.IsNull() && groupArg->IsString(vm)) {
413         group = groupArg->ToString(vm)->ToString(vm);
414     }
415     if (!indicatorTypeArg.IsNull() && indicatorTypeArg->IsNumber()) {
416         indicatorType = static_cast<RadioIndicatorType>(indicatorTypeArg->Int32Value(vm));
417         if (indicatorType == RadioIndicatorType::CUSTOM) {
418             indicatorType = RadioIndicatorType::TICK;
419         }
420     }
421     if (!firstArg.IsNull() && !firstArg->IsUndefined()) {
422         auto pointer = firstArg->ToNativePointer(vm);
423         CHECK_EQUAL_RETURN(pointer.IsEmpty(), true, panda::JSValueRef::Undefined(vm));
424         auto nativeNode = nodePtr(pointer->Value());
425         CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
426         GetArkUINodeModifiers()->getRadioModifier()->setRadioOptions(
427             nativeNode, value.c_str(), group.c_str(), static_cast<int32_t>(indicatorType));
428     }
429     return panda::JSValueRef::Undefined(vm);
430 }
431 
ResetRadioOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)432 ArkUINativeModuleValue RadioBridge::ResetRadioOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
433 {
434     EcmaVM* vm = runtimeCallInfo->GetVM();
435     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
436     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
437     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
438     GetArkUINodeModifiers()->getRadioModifier()->resetRadioOnChange(nativeNode);
439     return panda::JSValueRef::Undefined(vm);
440 }
441 
SetRadioOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)442 ArkUINativeModuleValue RadioBridge::SetRadioOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
443 {
444     EcmaVM* vm = runtimeCallInfo->GetVM();
445     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
446     uint32_t argsNumber = runtimeCallInfo->GetArgsNumber();
447     if (argsNumber != NUM_2) {
448         return panda::JSValueRef::Undefined(vm);
449     }
450     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
451     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
452     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
453     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
454     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
455     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
456         GetArkUINodeModifiers()->getRadioModifier()->resetRadioOnChange(nativeNode);
457         return panda::JSValueRef::Undefined(vm);
458     }
459     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
460     std::function<void(bool)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](bool isOnchange) {
461         panda::LocalScope pandaScope(vm);
462         panda::TryCatch trycatch(vm);
463         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
464         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = { panda::BooleanRef::New(vm, isOnchange) };
465         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
466     };
467     GetArkUINodeModifiers()->getRadioModifier()->setRadioOnChange(nativeNode, reinterpret_cast<void*>(&callback));
468     return panda::JSValueRef::Undefined(vm);
469 }
470 
SetMargin(ArkUIRuntimeCallInfo * runtimeCallInfo)471 ArkUINativeModuleValue RadioBridge::SetMargin(ArkUIRuntimeCallInfo* runtimeCallInfo)
472 {
473     EcmaVM* vm = runtimeCallInfo->GetVM();
474     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
475     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
476     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
477     CommonBridge::SetMargin(runtimeCallInfo);
478     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
479     CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
480     GetArkUINodeModifiers()->getRadioModifier()->setIsUserSetMargin(nativeNode);
481     return panda::JSValueRef::Undefined(vm);
482 }
483 
ResetMargin(ArkUIRuntimeCallInfo * runtimeCallInfo)484 ArkUINativeModuleValue RadioBridge::ResetMargin(ArkUIRuntimeCallInfo* runtimeCallInfo)
485 {
486     EcmaVM* vm = runtimeCallInfo->GetVM();
487     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
488     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
489     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
490     CommonBridge::ResetMargin(runtimeCallInfo);
491     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
492     GetArkUINodeModifiers()->getRadioModifier()->setIsUserSetMargin(nativeNode);
493     return panda::JSValueRef::Undefined(vm);
494 }
495 }
496