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