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_pattern_lock_bridge.h"
16 
17 #include "base/geometry/dimension.h"
18 #include "base/utils/utils.h"
19 #include "core/components/common/layout/constants.h"
20 #include "core/pipeline/pipeline_base.h"
21 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
22 
23 
24 namespace OHOS::Ace::NG {
25 constexpr int NUM_0 = 0;
26 constexpr int NUM_1 = 1;
27 
SetSideLength(ArkUIRuntimeCallInfo * runtimeCallInfo)28 ArkUINativeModuleValue PatternLockBridge::SetSideLength(ArkUIRuntimeCallInfo* runtimeCallInfo)
29 {
30     EcmaVM* vm = runtimeCallInfo->GetVM();
31     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
32     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
33     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
34     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
35     CalcDimension sideLength;
36     if (!(ArkTSUtils::ParseJsDimensionVp(vm, secondArg, sideLength))) {
37         GetArkUINodeModifiers()->getPatternLockModifier()->resetPatternLockSideLength(nativeNode);
38     }
39     GetArkUINodeModifiers()->getPatternLockModifier()->setPatternLockSideLength(
40         nativeNode, sideLength.Value(), static_cast<int8_t>(sideLength.Unit()));
41     return panda::JSValueRef::Undefined(vm);
42 }
43 
ResetSideLength(ArkUIRuntimeCallInfo * runtimeCallInfo)44 ArkUINativeModuleValue PatternLockBridge::ResetSideLength(ArkUIRuntimeCallInfo* runtimeCallInfo)
45 {
46     EcmaVM* vm = runtimeCallInfo->GetVM();
47     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
48     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
49     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
50     GetArkUINodeModifiers()->getPatternLockModifier()->resetPatternLockSideLength(nativeNode);
51     return panda::JSValueRef::Undefined(vm);
52 }
53 
SetAutoReset(ArkUIRuntimeCallInfo * runtimeCallInfo)54 ArkUINativeModuleValue PatternLockBridge::SetAutoReset(ArkUIRuntimeCallInfo* runtimeCallInfo)
55 {
56     EcmaVM* vm = runtimeCallInfo->GetVM();
57     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
58     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
59     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
60     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
61     uint32_t value = 1;
62     if (secondArg->IsBoolean()) {
63         value = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
64     }
65     GetArkUINodeModifiers()->getPatternLockModifier()->setPatternLockAutoReset(nativeNode, value);
66     return panda::JSValueRef::Undefined(vm);
67 }
68 
ResetAutoReset(ArkUIRuntimeCallInfo * runtimeCallInfo)69 ArkUINativeModuleValue PatternLockBridge::ResetAutoReset(ArkUIRuntimeCallInfo* runtimeCallInfo)
70 {
71     EcmaVM* vm = runtimeCallInfo->GetVM();
72     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
73     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
74     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
75     GetArkUINodeModifiers()->getPatternLockModifier()->resetPatternLockAutoReset(nativeNode);
76     return panda::JSValueRef::Undefined(vm);
77 }
78 
SetPathStrokeWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)79 ArkUINativeModuleValue PatternLockBridge::SetPathStrokeWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
80 {
81     EcmaVM* vm = runtimeCallInfo->GetVM();
82     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
83     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
84     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
85     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
86     CalcDimension strokeWidth;
87     if (!(ArkTSUtils::ParseJsDimensionVp(vm, secondArg, strokeWidth))) {
88         GetArkUINodeModifiers()->getPatternLockModifier()->resetPatternLockPathStrokeWidth(nativeNode);
89     }
90     GetArkUINodeModifiers()->getPatternLockModifier()->setPatternLockPathStrokeWidth(
91         nativeNode, strokeWidth.Value(), static_cast<int8_t>(strokeWidth.Unit()));
92     return panda::JSValueRef::Undefined(vm);
93 }
94 
ResetPathStrokeWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)95 ArkUINativeModuleValue PatternLockBridge::ResetPathStrokeWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
96 {
97     EcmaVM* vm = runtimeCallInfo->GetVM();
98     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
99     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
100     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
101     GetArkUINodeModifiers()->getPatternLockModifier()->resetPatternLockPathStrokeWidth(nativeNode);
102     return panda::JSValueRef::Undefined(vm);
103 }
104 
SetRegularColor(ArkUIRuntimeCallInfo * runtimeCallInfo)105 ArkUINativeModuleValue PatternLockBridge::SetRegularColor(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     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
112     Color color;
113     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
114         GetArkUINodeModifiers()->getPatternLockModifier()->resetPatternLockRegularColor(nativeNode);
115     } else {
116         GetArkUINodeModifiers()->getPatternLockModifier()->setPatternLockRegularColor(nativeNode, color.GetValue());
117     }
118     return panda::JSValueRef::Undefined(vm);
119 }
120 
ResetRegularColor(ArkUIRuntimeCallInfo * runtimeCallInfo)121 ArkUINativeModuleValue PatternLockBridge::ResetRegularColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
122 {
123     EcmaVM* vm = runtimeCallInfo->GetVM();
124     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
125     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
126     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
127     GetArkUINodeModifiers()->getPatternLockModifier()->resetPatternLockRegularColor(nativeNode);
128     return panda::JSValueRef::Undefined(vm);
129 }
130 
SetPathColor(ArkUIRuntimeCallInfo * runtimeCallInfo)131 ArkUINativeModuleValue PatternLockBridge::SetPathColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
132 {
133     EcmaVM* vm = runtimeCallInfo->GetVM();
134     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
135     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
136     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
137     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
138     Color color;
139     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
140         GetArkUINodeModifiers()->getPatternLockModifier()->resetPatternLockPathColor(nativeNode);
141     } else {
142         GetArkUINodeModifiers()->getPatternLockModifier()->setPatternLockPathColor(nativeNode, color.GetValue());
143     }
144     return panda::JSValueRef::Undefined(vm);
145 }
146 
ResetPathColor(ArkUIRuntimeCallInfo * runtimeCallInfo)147 ArkUINativeModuleValue PatternLockBridge::ResetPathColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
148 {
149     EcmaVM* vm = runtimeCallInfo->GetVM();
150     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
151     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
152     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
153     GetArkUINodeModifiers()->getPatternLockModifier()->resetPatternLockPathColor(nativeNode);
154     return panda::JSValueRef::Undefined(vm);
155 }
156 
SetPatternLockActiveColor(ArkUIRuntimeCallInfo * runtimeCallInfo)157 ArkUINativeModuleValue PatternLockBridge::SetPatternLockActiveColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
158 {
159     EcmaVM* vm = runtimeCallInfo->GetVM();
160     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
161     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
162     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
163     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
164     Color color;
165     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
166         GetArkUINodeModifiers()->getPatternLockModifier()->resetPatternLockActiveColor(nativeNode);
167     } else {
168         GetArkUINodeModifiers()->getPatternLockModifier()->setPatternLockActiveColor(nativeNode, color.GetValue());
169     }
170     return panda::JSValueRef::Undefined(vm);
171 }
172 
ResetPatternLockActiveColor(ArkUIRuntimeCallInfo * runtimeCallInfo)173 ArkUINativeModuleValue PatternLockBridge::ResetPatternLockActiveColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
174 {
175     EcmaVM* vm = runtimeCallInfo->GetVM();
176     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
177     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
178     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
179     GetArkUINodeModifiers()->getPatternLockModifier()->resetPatternLockActiveColor(nativeNode);
180     return panda::JSValueRef::Undefined(vm);
181 }
182 
SetPatternLockCircleRadius(ArkUIRuntimeCallInfo * runtimeCallInfo)183 ArkUINativeModuleValue PatternLockBridge::SetPatternLockCircleRadius(ArkUIRuntimeCallInfo* runtimeCallInfo)
184 {
185     EcmaVM* vm = runtimeCallInfo->GetVM();
186     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
187     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
188     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
189     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
190     CalcDimension circleRadius;
191     if (ArkTSUtils::ParseJsDimensionVp(vm, secondArg, circleRadius) && !(circleRadius.IsNonPositive())) {
192         GetArkUINodeModifiers()->getPatternLockModifier()->setPatternLockCircleRadius(
193             nativeNode, circleRadius.Value(), static_cast<int8_t>(circleRadius.Unit()));
194     } else {
195         GetArkUINodeModifiers()->getPatternLockModifier()->resetPatternLockCircleRadius(nativeNode);
196     }
197     return panda::JSValueRef::Undefined(vm);
198 }
199 
ResetPatternLockCircleRadius(ArkUIRuntimeCallInfo * runtimeCallInfo)200 ArkUINativeModuleValue PatternLockBridge::ResetPatternLockCircleRadius(ArkUIRuntimeCallInfo* runtimeCallInfo)
201 {
202     EcmaVM* vm = runtimeCallInfo->GetVM();
203     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
204     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
205     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
206     GetArkUINodeModifiers()->getPatternLockModifier()->resetPatternLockCircleRadius(nativeNode);
207     return panda::JSValueRef::Undefined(vm);
208 }
209 
SetPatternLockSelectedColor(ArkUIRuntimeCallInfo * runtimeCallInfo)210 ArkUINativeModuleValue PatternLockBridge::SetPatternLockSelectedColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
211 {
212     EcmaVM* vm = runtimeCallInfo->GetVM();
213     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
214     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
215     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
216     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
217     Color color;
218     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
219         GetArkUINodeModifiers()->getPatternLockModifier()->resetPatternLockSelectedColor(nativeNode);
220     } else {
221         GetArkUINodeModifiers()->getPatternLockModifier()->setPatternLockSelectedColor(nativeNode, color.GetValue());
222     }
223     return panda::JSValueRef::Undefined(vm);
224 }
225 
ResetPatternLockSelectedColor(ArkUIRuntimeCallInfo * runtimeCallInfo)226 ArkUINativeModuleValue PatternLockBridge::ResetPatternLockSelectedColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
227 {
228     EcmaVM* vm = runtimeCallInfo->GetVM();
229     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
230     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
231     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
232     GetArkUINodeModifiers()->getPatternLockModifier()->resetPatternLockSelectedColor(nativeNode);
233     return panda::JSValueRef::Undefined(vm);
234 }
235 
SetPatternLockActivateCircleStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)236 ArkUINativeModuleValue PatternLockBridge::SetPatternLockActivateCircleStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
237 {
238     EcmaVM* vm = runtimeCallInfo->GetVM();
239     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
240     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
241     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
242     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
243     if (!secondArg->IsObject(vm)) {
244         GetArkUINodeModifiers()->getPatternLockModifier()->resetPatternLockActiveCircleColor(nativeNode);
245         GetArkUINodeModifiers()->getPatternLockModifier()->resetPatternLockActiveCircleRadius(nativeNode);
246         GetArkUINodeModifiers()->getPatternLockModifier()->resetPatternLockEnableWaveEffect(nativeNode);
247     } else {
248         auto obj = secondArg->ToObject(vm);
249         auto jsColor = obj->Get(vm, panda::StringRef::NewFromUtf8(vm, "color"));
250         auto jsRadius = obj->Get(vm, panda::StringRef::NewFromUtf8(vm, "radius"));
251         auto jsEnable = obj->Get(vm, panda::StringRef::NewFromUtf8(vm, "enableWaveEffect"));
252         Color color;
253         if (!ArkTSUtils::ParseJsColorAlpha(vm, jsColor, color)) {
254             GetArkUINodeModifiers()->getPatternLockModifier()->resetPatternLockActiveCircleColor(nativeNode);
255         } else {
256             GetArkUINodeModifiers()->getPatternLockModifier()->setPatternLockActiveCircleColor(
257                 nativeNode, color.GetValue());
258         }
259         CalcDimension circleRadius;
260         if (jsRadius->IsObject(vm) && ArkTSUtils::ParseJsLengthMetrics(vm, jsRadius, circleRadius) &&
261             !(circleRadius.IsNonPositive())) {
262             GetArkUINodeModifiers()->getPatternLockModifier()->setPatternLockActiveCircleRadius(
263                 nativeNode, circleRadius.Value(), static_cast<int8_t>(circleRadius.Unit()));
264         } else {
265             GetArkUINodeModifiers()->getPatternLockModifier()->resetPatternLockActiveCircleRadius(nativeNode);
266         }
267         uint32_t value = 1;
268         if (jsEnable->IsBoolean()) {
269             value = static_cast<uint32_t>(jsEnable->ToBoolean(vm)->Value());
270         }
271         GetArkUINodeModifiers()->getPatternLockModifier()->setPatternLockEnableWaveEffect(nativeNode, value);
272     }
273     return panda::JSValueRef::Undefined(vm);
274 }
275 
ResetPatternLockActivateCircleStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)276 ArkUINativeModuleValue PatternLockBridge::ResetPatternLockActivateCircleStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
277 {
278     EcmaVM* vm = runtimeCallInfo->GetVM();
279     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
280     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
281     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
282     GetArkUINodeModifiers()->getPatternLockModifier()->resetPatternLockActiveCircleColor(nativeNode);
283     GetArkUINodeModifiers()->getPatternLockModifier()->resetPatternLockActiveCircleRadius(nativeNode);
284     GetArkUINodeModifiers()->getPatternLockModifier()->resetPatternLockEnableWaveEffect(nativeNode);
285     return panda::JSValueRef::Undefined(vm);
286 }
287 } // namespace OHOS::Ace::NG
288