• 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 
16 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_toggle_bridge.h"
17 
18 #include "base/utils/utils.h"
19 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
20 #include "core/components_ng/base/frame_node.h"
21 #include "core/components_ng/pattern/toggle/toggle_model_ng.h"
22 
23 namespace OHOS::Ace::NG {
24 namespace {
25 constexpr int PARAM_ARR_LENGTH_1 = 1;
26 constexpr uint32_t INDEX_FRAME_NODE_0 = 0;
27 constexpr uint32_t INDEX_ARGUMENT_1 = 1;
28 constexpr uint32_t INDEX_ARGUMENT_2 = 2;
29 constexpr uint32_t INDEX_ARGUMENT_3 = 3;
30 constexpr uint32_t INDEX_ARGUMENT_4 = 4;
31 const char* TOGGLE_NODEPTR_OF_UINODE = "nodePtr_";
JsToggleChangeCallback(panda::JsiRuntimeCallInfo * runtimeCallInfo)32 panda::Local<panda::JSValueRef> JsToggleChangeCallback(panda::JsiRuntimeCallInfo* runtimeCallInfo)
33 {
34     auto vm = runtimeCallInfo->GetVM();
35     int32_t argc = static_cast<int32_t>(runtimeCallInfo->GetArgsNumber());
36     if (argc != 1) {
37         return panda::JSValueRef::Undefined(vm);
38     }
39     auto firstArg = runtimeCallInfo->GetCallArgRef(0);
40     if (!firstArg->IsBoolean()) {
41         return panda::JSValueRef::Undefined(vm);
42     }
43     bool value = firstArg->ToBoolean(vm)->Value();
44     auto ref = runtimeCallInfo->GetThisRef();
45     auto obj = ref->ToObject(vm);
46     if (obj->GetNativePointerFieldCount(vm) < 1) {
47         return panda::JSValueRef::Undefined(vm);
48     }
49     auto frameNode = static_cast<FrameNode*>(obj->GetNativePointerField(vm, 0));
50     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
51     ToggleModelNG::SetChangeValue(frameNode, value);
52     return panda::JSValueRef::Undefined(vm);
53 }
54 
SetHeightInner(const EcmaVM * vm,const Local<JSValueRef> & nodeArg,const Local<JSValueRef> & heightArg)55 void SetHeightInner(const EcmaVM* vm, const Local<JSValueRef>& nodeArg, const Local<JSValueRef>& heightArg)
56 {
57     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
58     CalcDimension height;
59     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, heightArg, height)) {
60         GetArkUINodeModifiers()->getToggleModifier()->resetToggleHeight(nativeNode);
61     } else {
62         if (height.IsNegative()) {
63             GetArkUINodeModifiers()->getToggleModifier()->resetToggleHeight(nativeNode);
64         } else {
65             GetArkUINodeModifiers()->getToggleModifier()->setToggleHeight(
66                 nativeNode, height.Value(), static_cast<int32_t>(height.Unit()));
67         }
68     }
69 }
70 
PushDimensionVector(const std::optional<Dimension> & valueDimen,std::vector<ArkUI_Float32> & dimensions)71 void PushDimensionVector(const std::optional<Dimension>& valueDimen, std::vector<ArkUI_Float32>& dimensions)
72 {
73     dimensions.push_back(static_cast<double>(valueDimen.has_value()));
74     if (valueDimen.has_value()) {
75         dimensions.push_back(static_cast<double>(valueDimen.value().Value()));
76         dimensions.push_back(static_cast<double>(valueDimen.value().Unit()));
77     } else {
78         dimensions.push_back(0);
79         dimensions.push_back(0);
80     }
81 }
82 
PushToggleDimension(ArkUIRuntimeCallInfo * runtimeCallInfo,EcmaVM * vm,std::vector<ArkUI_Float32> & fontSizesVector,int32_t argIndex)83 void PushToggleDimension(
84     ArkUIRuntimeCallInfo* runtimeCallInfo, EcmaVM* vm, std::vector<ArkUI_Float32>& fontSizesVector, int32_t argIndex)
85 {
86     Local<JSValueRef> arg = runtimeCallInfo->GetCallArgRef(argIndex);
87     std::optional<CalcDimension> dimensionOptional = std::nullopt;
88     CalcDimension parsedDimension;
89     if (ArkTSUtils::ParseJsDimensionVp(vm, arg, parsedDimension)) {
90         dimensionOptional = parsedDimension;
91     }
92     PushDimensionVector(dimensionOptional, fontSizesVector);
93 }
94 
PutToggleDimensionParameters(ArkUIRuntimeCallInfo * runtimeCallInfo,EcmaVM * vm,std::vector<ArkUI_Float32> & lengthVector)95 void PutToggleDimensionParameters(
96     ArkUIRuntimeCallInfo* runtimeCallInfo, EcmaVM* vm, std::vector<ArkUI_Float32>& lengthVector)
97 {
98     std::vector<int32_t> indexVector = { INDEX_ARGUMENT_1, INDEX_ARGUMENT_2, INDEX_ARGUMENT_3, INDEX_ARGUMENT_4 };
99     for (size_t index = 0; index < indexVector.size(); index++) {
100         PushToggleDimension(runtimeCallInfo, vm, lengthVector, indexVector[index]);
101     }
102 }
103 } // namespace
104 
SetContentModifierBuilder(ArkUIRuntimeCallInfo * runtimeCallInfo)105 ArkUINativeModuleValue ToggleBridge::SetContentModifierBuilder(ArkUIRuntimeCallInfo* runtimeCallInfo)
106 {
107     EcmaVM* vm = runtimeCallInfo->GetVM();
108     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
109     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
110     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
111     void* nativeNode = firstArg->ToNativePointer(vm)->Value();
112     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
113     if (!secondArg->IsObject(vm)) {
114         ToggleModelNG::SetBuilderFunc(frameNode, nullptr);
115         return panda::JSValueRef::Undefined(vm);
116     }
117     panda::CopyableGlobal<panda::ObjectRef> obj(vm, secondArg);
118     auto containerId = Container::CurrentId();
119     ToggleModelNG::SetBuilderFunc(frameNode, [vm, frameNode, obj = std::move(obj), containerId](
120                                   ToggleConfiguration config) -> RefPtr<FrameNode> {
121         ContainerScope scope(containerId);
122         auto context = ArkTSUtils::GetContext(vm);
123         CHECK_EQUAL_RETURN(context->IsUndefined(), true, nullptr);
124         const char* keysOfToggle[] = { "isOn", "enabled", "triggerChange"};
125             Local<JSValueRef> valuesOfToggle[] = { panda::BooleanRef::New(vm, config.isOn_),
126                 panda::BooleanRef::New(vm, config.enabled_),
127                 panda::FunctionRef::New(vm, JsToggleChangeCallback)};
128         auto toggle = panda::ObjectRef::NewWithNamedProperties(vm,
129             ArraySize(keysOfToggle), keysOfToggle, valuesOfToggle);
130         toggle->SetNativePointerFieldCount(vm, 1);
131         toggle->SetNativePointerField(vm, 0, static_cast<void*>(frameNode));
132         panda::Local<panda::JSValueRef> params[INDEX_ARGUMENT_2] = { context, toggle };
133         LocalScope pandaScope(vm);
134         panda::TryCatch trycatch(vm);
135         auto jsObject = obj.ToLocal();
136         auto makeFunc = jsObject->Get(vm, panda::StringRef::NewFromUtf8(vm, "makeContentModifierNode"));
137         CHECK_EQUAL_RETURN(makeFunc->IsFunction(vm), false, nullptr);
138         panda::Local<panda::FunctionRef> func = makeFunc;
139         auto result = func->Call(vm, jsObject, params, 2);
140         JSNApi::ExecutePendingJob(vm);
141         CHECK_EQUAL_RETURN(result.IsEmpty() || trycatch.HasCaught() || !result->IsObject(vm), true, nullptr);
142         auto resultObj = result->ToObject(vm);
143         panda::Local<panda::JSValueRef> nodeptr =
144             resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, TOGGLE_NODEPTR_OF_UINODE));
145         CHECK_EQUAL_RETURN(nodeptr.IsEmpty() || nodeptr->IsUndefined() || nodeptr->IsNull(), true, nullptr);
146         auto* node = nodeptr->ToNativePointer(vm)->Value();
147         auto* frameNode = reinterpret_cast<FrameNode*>(node);
148         CHECK_NULL_RETURN(frameNode, nullptr);
149         return AceType::Claim(frameNode);
150     });
151     return panda::JSValueRef::Undefined(vm);
152 }
153 
SetOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)154 ArkUINativeModuleValue ToggleBridge::SetOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
155 {
156     EcmaVM* vm = runtimeCallInfo->GetVM();
157     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
158     int32_t argsNumber = runtimeCallInfo->GetArgsNumber();
159     if (argsNumber != INDEX_ARGUMENT_2) {
160         return panda::JSValueRef::Undefined(vm);
161     }
162     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
163     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_1);
164     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
165     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
166     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
167     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
168         GetArkUINodeModifiers()->getToggleModifier()->resetToggleOnChange(nativeNode);
169         return panda::JSValueRef::Undefined(vm);
170     }
171     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
172     std::function<void(bool)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](bool isOnchange) {
173         panda::LocalScope pandaScope(vm);
174         panda::TryCatch trycatch(vm);
175         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
176         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = { panda::BooleanRef::New(vm, isOnchange) };
177         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
178     };
179     GetArkUINodeModifiers()->getToggleModifier()->setToggleOnChange(nativeNode, reinterpret_cast<void*>(&callback));
180     return panda::JSValueRef::Undefined(vm);
181 }
182 
ResetOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)183 ArkUINativeModuleValue ToggleBridge::ResetOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
184 {
185     EcmaVM* vm = runtimeCallInfo->GetVM();
186     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
187     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
188     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
189     GetArkUINodeModifiers()->getToggleModifier()->resetToggleOnChange(nativeNode);
190     return panda::JSValueRef::Undefined(vm);
191 }
192 
SetSelectedColor(ArkUIRuntimeCallInfo * runtimeCallInfo)193 ArkUINativeModuleValue ToggleBridge::SetSelectedColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
194 {
195     EcmaVM* vm = runtimeCallInfo->GetVM();
196     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
197     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
198     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
199     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
200 
201     Color color;
202     if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
203         GetArkUINodeModifiers()->getToggleModifier()->resetToggleSelectedColor(nativeNode);
204     } else {
205         GetArkUINodeModifiers()->getToggleModifier()->setToggleSelectedColor(nativeNode, color.GetValue());
206     }
207 
208     return panda::JSValueRef::Undefined(vm);
209 }
210 
ResetSelectedColor(ArkUIRuntimeCallInfo * runtimeCallInfo)211 ArkUINativeModuleValue ToggleBridge::ResetSelectedColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
212 {
213     EcmaVM* vm = runtimeCallInfo->GetVM();
214     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
215     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
216     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
217     GetArkUINodeModifiers()->getToggleModifier()->resetToggleSelectedColor(nativeNode);
218     return panda::JSValueRef::Undefined(vm);
219 }
220 
SetSwitchPointColor(ArkUIRuntimeCallInfo * runtimeCallInfo)221 ArkUINativeModuleValue ToggleBridge::SetSwitchPointColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
222 {
223     EcmaVM* vm = runtimeCallInfo->GetVM();
224     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
225     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
226     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
227     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
228 
229     Color color;
230     if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
231         GetArkUINodeModifiers()->getToggleModifier()->resetToggleSwitchPointColor(nativeNode);
232     } else {
233         GetArkUINodeModifiers()->getToggleModifier()->setToggleSwitchPointColor(nativeNode, color.GetValue());
234     }
235     return panda::JSValueRef::Undefined(vm);
236 }
237 
ResetSwitchPointColor(ArkUIRuntimeCallInfo * runtimeCallInfo)238 ArkUINativeModuleValue ToggleBridge::ResetSwitchPointColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
239 {
240     EcmaVM* vm = runtimeCallInfo->GetVM();
241     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
242     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
243     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
244     GetArkUINodeModifiers()->getToggleModifier()->resetToggleSwitchPointColor(nativeNode);
245     return panda::JSValueRef::Undefined(vm);
246 }
247 
SetSwitchStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)248 ArkUINativeModuleValue ToggleBridge::SetSwitchStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
249 {
250     EcmaVM* vm = runtimeCallInfo->GetVM();
251     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
252     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
253     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
254     Local<JSValueRef> pointRadiusArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_1);
255     Local<JSValueRef> unselectedColorArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_2);
256     Local<JSValueRef> pointColorArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_3);
257     Local<JSValueRef> trackRadiusArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_4);
258     CalcDimension pointRadius;
259     if (!pointRadiusArg->IsUndefined() &&
260         ArkTSUtils::ParseJsDimensionNG(vm, pointRadiusArg, pointRadius, DimensionUnit::VP) &&
261         !pointRadius.IsNegative()) {
262         GetArkUINodeModifiers()->getToggleModifier()->setTogglePointRadius(
263             nativeNode, pointRadius.Value(), static_cast<int>(pointRadius.Unit()));
264     } else {
265         GetArkUINodeModifiers()->getToggleModifier()->resetTogglePointRadius(nativeNode);
266     }
267     Color unselectedColor;
268     if (unselectedColorArg->IsNull() || unselectedColorArg->IsUndefined() ||
269         !ArkTSUtils::ParseJsColorAlpha(vm, unselectedColorArg, unselectedColor)) {
270         GetArkUINodeModifiers()->getToggleModifier()->resetToggleUnselectedColor(nativeNode);
271     } else {
272         GetArkUINodeModifiers()->getToggleModifier()->setToggleUnselectedColor(nativeNode, unselectedColor.GetValue());
273     }
274     Color pointColor;
275     if (pointColorArg->IsNull() || pointColorArg->IsUndefined() ||
276         !ArkTSUtils::ParseJsColorAlpha(vm, pointColorArg, pointColor)) {
277         GetArkUINodeModifiers()->getToggleModifier()->resetToggleSwitchPointColor(nativeNode);
278     } else {
279         GetArkUINodeModifiers()->getToggleModifier()->setToggleSwitchPointColor(nativeNode, pointColor.GetValue());
280     }
281     CalcDimension trackRadius;
282     if (!trackRadiusArg->IsUndefined() &&
283         ArkTSUtils::ParseJsDimensionNG(vm, trackRadiusArg, trackRadius, DimensionUnit::VP) &&
284         !trackRadius.IsNegative()) {
285         GetArkUINodeModifiers()->getToggleModifier()->setToggleTrackBorderRadius(
286             nativeNode, trackRadius.Value(), static_cast<int>(trackRadius.Unit()));
287     } else {
288         GetArkUINodeModifiers()->getToggleModifier()->resetToggleTrackBorderRadius(nativeNode);
289     }
290     return panda::JSValueRef::Undefined(vm);
291 }
292 
ResetSwitchStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)293 ArkUINativeModuleValue ToggleBridge::ResetSwitchStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
294 {
295     EcmaVM* vm = runtimeCallInfo->GetVM();
296     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
297     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
298     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
299     GetArkUINodeModifiers()->getToggleModifier()->resetTogglePointRadius(nativeNode);
300     GetArkUINodeModifiers()->getToggleModifier()->resetToggleUnselectedColor(nativeNode);
301     GetArkUINodeModifiers()->getToggleModifier()->resetToggleSwitchPointColor(nativeNode);
302     GetArkUINodeModifiers()->getToggleModifier()->resetToggleTrackBorderRadius(nativeNode);
303     return panda::JSValueRef::Undefined(vm);
304 }
305 
SetHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)306 ArkUINativeModuleValue ToggleBridge::SetHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
307 {
308     EcmaVM* vm = runtimeCallInfo->GetVM();
309     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
310     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
311     Local<JSValueRef> heightArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_1);
312     SetHeightInner(vm, nodeArg, heightArg);
313     return panda::JSValueRef::Undefined(vm);
314 }
315 
ResetHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)316 ArkUINativeModuleValue ToggleBridge::ResetHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
317 {
318     EcmaVM* vm = runtimeCallInfo->GetVM();
319     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
320     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
321     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
322     GetArkUINodeModifiers()->getToggleModifier()->resetToggleHeight(nativeNode);
323     return panda::JSValueRef::Undefined(vm);
324 }
325 
SetResponseRegion(ArkUIRuntimeCallInfo * runtimeCallInfo)326 ArkUINativeModuleValue ToggleBridge::SetResponseRegion(ArkUIRuntimeCallInfo* runtimeCallInfo)
327 {
328     EcmaVM* vm = runtimeCallInfo->GetVM();
329     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
330     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
331     Local<JSValueRef> regionArrayArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_1);
332     Local<JSValueRef> lengthArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_2);
333     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
334     uint32_t length = lengthArg->Uint32Value(vm);
335     ArkUI_Float32 regionValueArray[length];
336     int32_t regionUnitsArray[length];
337     if (!ArkTSUtils::ParseResponseRegion(vm, regionArrayArg, regionValueArray, regionUnitsArray, length)) {
338         GetArkUINodeModifiers()->getToggleModifier()->resetToggleResponseRegion(nativeNode);
339         return panda::JSValueRef::Undefined(vm);
340     }
341     GetArkUINodeModifiers()->getToggleModifier()->setToggleResponseRegion(
342         nativeNode, regionValueArray, regionUnitsArray, length);
343     return panda::JSValueRef::Undefined(vm);
344 }
345 
ResetResponseRegion(ArkUIRuntimeCallInfo * runtimeCallInfo)346 ArkUINativeModuleValue ToggleBridge::ResetResponseRegion(ArkUIRuntimeCallInfo* runtimeCallInfo)
347 {
348     EcmaVM* vm = runtimeCallInfo->GetVM();
349     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
350     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
351     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
352     GetArkUINodeModifiers()->getToggleModifier()->resetToggleResponseRegion(nativeNode);
353     return panda::JSValueRef::Undefined(vm);
354 }
355 
SetPadding(ArkUIRuntimeCallInfo * runtimeCallInfo)356 ArkUINativeModuleValue ToggleBridge::SetPadding(ArkUIRuntimeCallInfo* runtimeCallInfo)
357 {
358     EcmaVM* vm = runtimeCallInfo->GetVM();
359     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
360     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
361     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
362     std::vector<ArkUI_Float32> lengthVector;
363     PutToggleDimensionParameters(runtimeCallInfo, vm, lengthVector);
364     GetArkUINodeModifiers()->getToggleModifier()->setTogglePadding(
365         nativeNode, lengthVector.data(), lengthVector.size());
366     return panda::JSValueRef::Undefined(vm);
367 }
368 
ResetPadding(ArkUIRuntimeCallInfo * runtimeCallInfo)369 ArkUINativeModuleValue ToggleBridge::ResetPadding(ArkUIRuntimeCallInfo* runtimeCallInfo)
370 {
371     EcmaVM* vm = runtimeCallInfo->GetVM();
372     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
373     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
374     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
375     GetArkUINodeModifiers()->getToggleModifier()->resetTogglePadding(nativeNode);
376     return panda::JSValueRef::Undefined(vm);
377 }
378 
SetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)379 ArkUINativeModuleValue ToggleBridge::SetBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
380 {
381     EcmaVM* vm = runtimeCallInfo->GetVM();
382     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
383     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
384     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_1);
385     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
386     Color color;
387     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
388         GetArkUINodeModifiers()->getToggleModifier()->resetToggleBackgroundColor(nativeNode);
389     } else {
390         GetArkUINodeModifiers()->getToggleModifier()->setToggleBackgroundColor(nativeNode, color.GetValue());
391     }
392     return panda::JSValueRef::Undefined(vm);
393 }
394 
ResetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)395 ArkUINativeModuleValue ToggleBridge::ResetBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
396 {
397     EcmaVM* vm = runtimeCallInfo->GetVM();
398     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
399     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
400     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
401     GetArkUINodeModifiers()->getToggleModifier()->resetToggleBackgroundColor(nativeNode);
402     return panda::JSValueRef::Undefined(vm);
403 }
404 
SetHoverEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)405 ArkUINativeModuleValue ToggleBridge::SetHoverEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
406 {
407     EcmaVM* vm = runtimeCallInfo->GetVM();
408     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
409     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
410     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
411     Local<JSValueRef> hoverEffectArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_1);
412 
413     if (hoverEffectArg->IsUndefined() || !hoverEffectArg->IsNumber()) {
414         GetArkUINodeModifiers()->getToggleModifier()->resetToggleHoverEffect(nativeNode);
415         return panda::JSValueRef::Undefined(vm);
416     }
417     int32_t hoverEffectValue = hoverEffectArg->Int32Value(vm);
418     GetArkUINodeModifiers()->getToggleModifier()->setToggleHoverEffect(nativeNode, hoverEffectValue);
419     return panda::JSValueRef::Undefined(vm);
420 }
421 
ResetHoverEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)422 ArkUINativeModuleValue ToggleBridge::ResetHoverEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
423 {
424     EcmaVM* vm = runtimeCallInfo->GetVM();
425     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
426     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
427     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
428     GetArkUINodeModifiers()->getToggleModifier()->resetToggleHoverEffect(nativeNode);
429     return panda::JSValueRef::Undefined(vm);
430 }
431 
SetToggleOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)432 ArkUINativeModuleValue ToggleBridge::SetToggleOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
433 {
434     EcmaVM* vm = runtimeCallInfo->GetVM();
435     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
436     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(INDEX_FRAME_NODE_0);
437     CHECK_EQUAL_RETURN(nodeArg.IsEmpty(), true, panda::JSValueRef::Undefined(vm));
438     auto pointer = nodeArg->ToNativePointer(vm);
439     CHECK_EQUAL_RETURN(pointer.IsEmpty(), true, panda::JSValueRef::Undefined(vm));
440     auto nativeNode = nodePtr(pointer->Value());
441     CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
442     Local<JSValueRef> isOnArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_1);
443     CHECK_EQUAL_RETURN(isOnArg.IsEmpty(), true, panda::JSValueRef::Undefined(vm));
444     bool isOn = false;
445     if (!isOnArg->IsUndefined() && isOnArg->IsBoolean()) {
446         isOn = isOnArg->ToBoolean(vm)->Value();
447     }
448     GetArkUINodeModifiers()->getToggleModifier()->setToggleState(nativeNode, isOn);
449     return panda::JSValueRef::Undefined(vm);
450 }
451 
ParseParams(ArkUIRuntimeCallInfo * runtimeCallInfo,ArkUI_Params & params)452 ArkUINativeModuleValue ToggleBridge::ParseParams(ArkUIRuntimeCallInfo* runtimeCallInfo, ArkUI_Params& params)
453 {
454     EcmaVM* vm = runtimeCallInfo->GetVM();
455     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
456     CHECK_EQUAL_RETURN(params.nodeType != ARKUI_TOGGLE, true, panda::JSValueRef::Undefined(vm));
457     ArkUI_Toggle_Params* toggleParams = (ArkUI_Toggle_Params*)(&params);
458     toggleParams->toggleType = ToggleType::SWITCH;
459     toggleParams->isOn = false;
460     CHECK_EQUAL_RETURN(runtimeCallInfo->GetArgsNumber() != INDEX_ARGUMENT_3, true, panda::JSValueRef::Undefined(vm));
461     Local<JSValueRef> paramsArg = runtimeCallInfo->GetCallArgRef(INDEX_ARGUMENT_2);
462     if (!paramsArg->IsNull() && paramsArg->IsObject(vm)) {
463         auto obj = Local<panda::ObjectRef>(paramsArg);
464         auto typeStr = panda::StringRef::NewFromUtf8(vm, "type");
465         auto isOnStr = panda::StringRef::NewFromUtf8(vm, "isOn");
466         auto typeArg = obj->Get(vm, typeStr);
467         auto isOnArg = obj->Get(vm, isOnStr);
468         CHECK_EQUAL_RETURN(typeArg.IsEmpty(), true, panda::JSValueRef::Undefined(vm));
469         CHECK_EQUAL_RETURN(isOnArg.IsEmpty(), true, panda::JSValueRef::Undefined(vm));
470         if (!typeArg->IsNull() && !typeArg->IsUndefined() && typeArg->IsNumber()) {
471             toggleParams->toggleType = static_cast<ToggleType>(typeArg->Int32Value(vm));
472         }
473         if (!isOnArg->IsNull() && !isOnArg->IsUndefined() && isOnArg->IsBoolean()) {
474             toggleParams->isOn = isOnArg->ToBoolean(vm)->Value();
475         }
476     }
477     return panda::JSValueRef::Undefined(vm);
478 }
479 } // namespace OHOS::Ace::NG
480