• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-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/jsview/js_pattern_lock.h"
17 
18 #include "bridge/declarative_frontend/jsview/models/patternlock_model_impl.h"
19 #include "bridge/declarative_frontend/view_stack_processor.h"
20 #include "bridge/declarative_frontend/ark_theme/theme_apply/js_pattern_lock_theme.h"
21 #include "core/components_ng/base/view_stack_processor.h"
22 #include "core/components_ng/pattern/patternlock/patternlock_model_ng.h"
23 #include "core/components_v2/pattern_lock/pattern_lock_component.h"
24 
25 namespace OHOS::Ace {
26 
27 std::unique_ptr<PatternLockModel> PatternLockModel::instance_ = nullptr;
28 std::mutex PatternLockModel::mutex_;
29 const std::vector<V2::PatternLockChallengeResult> CHALLENGE_RESULT = { V2::PatternLockChallengeResult::CORRECT,
30     V2::PatternLockChallengeResult::WRONG };
31 
GetInstance()32 PatternLockModel* PatternLockModel::GetInstance()
33 {
34     if (!instance_) {
35         std::lock_guard<std::mutex> lock(mutex_);
36         if (!instance_) {
37 #ifdef NG_BUILD
38             instance_.reset(new NG::PatternLockModelNG());
39 #else
40             if (Container::IsCurrentUseNewPipeline()) {
41                 instance_.reset(new NG::PatternLockModelNG());
42             } else {
43                 instance_.reset(new Framework::PatternLockModelImpl());
44             }
45 #endif
46         }
47     }
48     return instance_.get();
49 }
50 
51 } // namespace OHOS::Ace
52 
53 namespace OHOS::Ace::Framework {
ChoosePointToJSValue(std::vector<int> input)54 JSRef<JSArray> JSPatternLock::ChoosePointToJSValue(std::vector<int> input)
55 {
56     JSRef<JSArray> arr = JSRef<JSArray>::New();
57     for (size_t i = 0; i < input.size(); i++) {
58         arr->SetValueAt(i, ConvertToJSValue(input[i]));
59     }
60     return arr;
61 }
Create(const JSCallbackInfo & info)62 void JSPatternLock::Create(const JSCallbackInfo& info)
63 {
64     auto controller = PatternLockModel::GetInstance()->Create();
65     JSPatternLockTheme::ApplyTheme();
66 
67     if (info.Length() > 0 && info[0]->IsObject()) {
68         auto* jsController = JSRef<JSObject>::Cast(info[0])->Unwrap<JSPatternLockController>();
69         if (jsController) {
70             jsController->SetController(controller);
71         }
72     }
73 }
JSBind(BindingTarget globalObj)74 void JSPatternLock::JSBind(BindingTarget globalObj)
75 {
76     JSClass<JSPatternLock>::Declare("PatternLock");
77     MethodOptions opt = MethodOptions::NONE;
78     JSClass<JSPatternLock>::StaticMethod("create", &JSPatternLock::Create, opt);
79     JSClass<JSPatternLock>::StaticMethod("onPatternComplete", &JSPatternLock::SetPatternComplete);
80     JSClass<JSPatternLock>::StaticMethod("regularColor", &JSPatternLock::SetRegularColor, MethodOptions::NONE);
81     JSClass<JSPatternLock>::StaticMethod("selectedColor", &JSPatternLock::SetSelectedColor, MethodOptions::NONE);
82     JSClass<JSPatternLock>::StaticMethod("activeColor", &JSPatternLock::SetActiveColor, MethodOptions::NONE);
83     JSClass<JSPatternLock>::StaticMethod("pathColor", &JSPatternLock::SetPathColor, MethodOptions::NONE);
84     JSClass<JSPatternLock>::StaticMethod("pathStrokeWidth", &JSPatternLock::SetPathStrokeWidth);
85     JSClass<JSPatternLock>::StaticMethod("circleRadius", &JSPatternLock::SetCircleRadius, MethodOptions::NONE);
86     JSClass<JSPatternLock>::StaticMethod("sideLength", &JSPatternLock::SetSideLength, MethodOptions::NONE);
87     JSClass<JSPatternLock>::StaticMethod("autoReset", &JSPatternLock::SetAutoReset, MethodOptions::NONE);
88     JSClass<JSPatternLock>::StaticMethod("activateCircleStyle", &JSPatternLock::SetActivateCircleStyle);
89     JSClass<JSPatternLock>::StaticMethod("skipUnselectedPoint", &JSPatternLock::SetSkipUnselectedPoint);
90     JSClass<JSPatternLock>::StaticMethod("onDotConnect", &JSPatternLock::SetDotConnect);
91     JSClass<JSPatternLock>::StaticMethod("onDetach", &JSInteractableView::JsOnDetach);
92     JSClass<JSPatternLock>::StaticMethod("onDisAppear", &JSInteractableView::JsOnDisAppear);
93     JSClass<JSPatternLock>::StaticMethod("onAttach", &JSInteractableView::JsOnAttach);
94     JSClass<JSPatternLock>::StaticMethod("onAppear", &JSInteractableView::JsOnAppear);
95     JSClass<JSPatternLock>::StaticMethod("onTouch", &JSInteractableView::JsOnTouch);
96     JSClass<JSPatternLock>::InheritAndBind<JSViewAbstract>(globalObj);
97 }
SetDefaultTheme(OHOS::Ace::RefPtr<OHOS::Ace::V2::PatternLockComponent> & patternLock)98 void JSPatternLock::SetDefaultTheme(OHOS::Ace::RefPtr<OHOS::Ace::V2::PatternLockComponent>& patternLock)
99 {
100     auto lockTheme = GetTheme<V2::PatternLockTheme>();
101     if (!lockTheme) {
102         return;
103     }
104     patternLock->SetRegularColor(lockTheme->GetRegularColor());
105     patternLock->SetSelectedColor(lockTheme->GetSelectedColor());
106     patternLock->SetActiveColor(lockTheme->GetActiveColor());
107     patternLock->SetPathColor(lockTheme->GetPathColor());
108 }
109 
SetPatternComplete(const JSCallbackInfo & args)110 void JSPatternLock::SetPatternComplete(const JSCallbackInfo& args)
111 {
112     if (!args[0]->IsFunction()) {
113         return;
114     }
115 
116     auto onComplete = [execCtx = args.GetExecutionContext(), func = JSRef<JSFunc>::Cast(args[0])](
117                           const BaseEventInfo* event) {
118         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
119         const auto* eventInfo = TypeInfoHelper::DynamicCast<V2::PatternCompleteEvent>(event);
120         CHECK_NULL_VOID(eventInfo);
121         JSRef<JSVal> params[] = { ChoosePointToJSValue(eventInfo->GetInput()) };
122         func->Call(JSRef<JSObject>(), ArraySize(params), params);
123     };
124 
125     PatternLockModel::GetInstance()->SetPatternComplete(std::move(onComplete));
126 }
SetSelectedColor(const JSCallbackInfo & info)127 void JSPatternLock::SetSelectedColor(const JSCallbackInfo& info)
128 {
129     if (info.Length() < 1) {
130         return;
131     }
132     Color selectedColor;
133     RefPtr<ResourceObject> resObj;
134     if (SystemProperties::ConfigChangePerform()) {
135         bool state = ParseJsColor(info[0], selectedColor, resObj);
136         PatternLockModel::GetInstance()->CreateWithResourceObj(PatternLockResourceType::SELECTEDCOLOR, resObj);
137         if (state) {
138             PatternLockModel::GetInstance()->SetSelectedColor(selectedColor);
139         } else {
140             RefPtr<V2::PatternLockTheme> patternLockTheme = GetTheme<V2::PatternLockTheme>();
141             CHECK_NULL_VOID(patternLockTheme);
142             selectedColor = patternLockTheme->GetSelectedColor();
143             PatternLockModel::GetInstance()->SetSelectedColor(selectedColor);
144             PatternLockModel::GetInstance()->SetSelectedColorByUser(false);
145         }
146     } else {
147         if (!ParseJsColor(info[0], selectedColor)) {
148             RefPtr<V2::PatternLockTheme> patternLockTheme = GetTheme<V2::PatternLockTheme>();
149             CHECK_NULL_VOID(patternLockTheme);
150             selectedColor = patternLockTheme->GetSelectedColor();
151         }
152         PatternLockModel::GetInstance()->SetSelectedColor(selectedColor);
153     }
154 }
SetAutoReset(const JSCallbackInfo & info)155 void JSPatternLock::SetAutoReset(const JSCallbackInfo& info)
156 {
157     if (info.Length() < 1) {
158         return;
159     }
160     if (!info[0]->IsBoolean()) {
161         PatternLockModel::GetInstance()->SetAutoReset(true);
162         return;
163     }
164     PatternLockModel::GetInstance()->SetAutoReset(info[0]->ToBoolean());
165 }
166 
SetPathColor(const JSCallbackInfo & info)167 void JSPatternLock::SetPathColor(const JSCallbackInfo& info)
168 {
169     if (info.Length() < 1) {
170         return;
171     }
172     Color pathColor;
173     RefPtr<ResourceObject> resObj;
174     if (SystemProperties::ConfigChangePerform()) {
175         bool state = ParseJsColor(info[0], pathColor, resObj);
176         PatternLockModel::GetInstance()->CreateWithResourceObj(PatternLockResourceType::PATHCOLOR, resObj);
177         if (state) {
178             PatternLockModel::GetInstance()->SetPathColor(pathColor);
179         } else {
180             RefPtr<V2::PatternLockTheme> patternLockTheme = GetTheme<V2::PatternLockTheme>();
181             CHECK_NULL_VOID(patternLockTheme);
182             pathColor = patternLockTheme->GetPathColor();
183             PatternLockModel::GetInstance()->SetPathColor(pathColor);
184             PatternLockModel::GetInstance()->SetPathColorByUser(false);
185         }
186     } else {
187         if (!ParseJsColor(info[0], pathColor)) {
188             RefPtr<V2::PatternLockTheme> patternLockTheme = GetTheme<V2::PatternLockTheme>();
189             CHECK_NULL_VOID(patternLockTheme);
190             pathColor = patternLockTheme->GetPathColor();
191         }
192 
193         PatternLockModel::GetInstance()->SetPathColor(pathColor);
194     }
195 }
SetActiveColor(const JSCallbackInfo & info)196 void JSPatternLock::SetActiveColor(const JSCallbackInfo& info)
197 {
198     if (info.Length() < 1) {
199         return;
200     }
201     Color activeColor;
202     RefPtr<ResourceObject> resObj;
203     if (SystemProperties::ConfigChangePerform()) {
204         bool state = ParseJsColor(info[0], activeColor, resObj);
205         PatternLockModel::GetInstance()->CreateWithResourceObj(PatternLockResourceType::ACTIVECOLOR, resObj);
206         if (state) {
207             PatternLockModel::GetInstance()->SetActiveColor(activeColor);
208         } else {
209             RefPtr<V2::PatternLockTheme> patternLockTheme = GetTheme<V2::PatternLockTheme>();
210             CHECK_NULL_VOID(patternLockTheme);
211             activeColor = patternLockTheme->GetActiveColor();
212             PatternLockModel::GetInstance()->SetActiveColor(activeColor);
213             PatternLockModel::GetInstance()->SetActiveColorByUser(false);
214         }
215     } else {
216         if (!ParseJsColor(info[0], activeColor)) {
217             RefPtr<V2::PatternLockTheme> patternLockTheme = GetTheme<V2::PatternLockTheme>();
218             CHECK_NULL_VOID(patternLockTheme);
219             activeColor = patternLockTheme->GetActiveColor();
220         }
221 
222         PatternLockModel::GetInstance()->SetActiveColor(activeColor);
223     }
224 }
SetRegularColor(const JSCallbackInfo & info)225 void JSPatternLock::SetRegularColor(const JSCallbackInfo& info)
226 {
227     if (info.Length() < 1) {
228         return;
229     }
230     Color regularColor;
231     RefPtr<ResourceObject> resObj;
232     if (SystemProperties::ConfigChangePerform()) {
233         bool state = ParseJsColor(info[0], regularColor, resObj);
234         PatternLockModel::GetInstance()->CreateWithResourceObj(PatternLockResourceType::REGULARCOLOR, resObj);
235         if (state) {
236             PatternLockModel::GetInstance()->SetRegularColor(regularColor);
237         } else {
238             RefPtr<V2::PatternLockTheme> patternLockTheme = GetTheme<V2::PatternLockTheme>();
239             CHECK_NULL_VOID(patternLockTheme);
240             regularColor = patternLockTheme->GetRegularColor();
241             PatternLockModel::GetInstance()->SetRegularColor(regularColor);
242             PatternLockModel::GetInstance()->SetRegularColorByUser(false);
243         }
244     } else {
245         if (!ParseJsColor(info[0], regularColor)) {
246             RefPtr<V2::PatternLockTheme> patternLockTheme = GetTheme<V2::PatternLockTheme>();
247             CHECK_NULL_VOID(patternLockTheme);
248             regularColor = patternLockTheme->GetRegularColor();
249         }
250 
251         PatternLockModel::GetInstance()->SetRegularColor(regularColor);
252     }
253 }
SetCircleRadius(const JSCallbackInfo & info)254 void JSPatternLock::SetCircleRadius(const JSCallbackInfo& info)
255 {
256     if (info.Length() < 1) {
257         return;
258     }
259     CalcDimension radius;
260     RefPtr<ResourceObject> resObj;
261     if (SystemProperties::ConfigChangePerform()) {
262         bool state = ParseJsDimensionVp(info[0], radius, resObj);
263         PatternLockModel::GetInstance()->CreateWithResourceObj(PatternLockResourceType::CIRCLERADIUS, resObj);
264         if (state && !radius.IsNonPositive()) {
265             PatternLockModel::GetInstance()->SetCircleRadius(radius);
266         } else {
267             RefPtr<V2::PatternLockTheme> patternLockTheme = GetTheme<V2::PatternLockTheme>();
268             CHECK_NULL_VOID(patternLockTheme);
269             radius = patternLockTheme->GetCircleRadius();
270             PatternLockModel::GetInstance()->SetCircleRadius(radius);
271         }
272     } else {
273         if (Container::LessThanAPIVersion(PlatformVersion::VERSION_TEN)) {
274             if (!ParseJsDimensionVp(info[0], radius)) {
275                 return;
276             }
277             if (radius.IsNonNegative()) {
278                 PatternLockModel::GetInstance()->SetCircleRadius(radius);
279             }
280         } else {
281             if (!ParseJsDimensionVp(info[0], radius) || radius.IsNonPositive()) {
282                 RefPtr<V2::PatternLockTheme> patternLockTheme = GetTheme<V2::PatternLockTheme>();
283                 CHECK_NULL_VOID(patternLockTheme);
284                 radius = patternLockTheme->GetCircleRadius();
285             }
286             PatternLockModel::GetInstance()->SetCircleRadius(radius);
287         }
288     }
289 }
SetSideLength(const JSCallbackInfo & info)290 void JSPatternLock::SetSideLength(const JSCallbackInfo& info)
291 {
292     if (info.Length() < 1) {
293         return;
294     }
295     CalcDimension sideLength;
296     RefPtr<ResourceObject> resObj;
297     if (SystemProperties::ConfigChangePerform()) {
298         bool state = ParseJsDimensionVp(info[0], sideLength, resObj);
299         PatternLockModel::GetInstance()->CreateWithResourceObj(PatternLockResourceType::SIDELENGTH, resObj);
300         if (state) {
301             PatternLockModel::GetInstance()->SetSideLength(sideLength);
302         } else {
303             RefPtr<V2::PatternLockTheme> patternLockTheme = GetTheme<V2::PatternLockTheme>();
304             CHECK_NULL_VOID(patternLockTheme);
305             sideLength = patternLockTheme->GetSideLength();
306             PatternLockModel::GetInstance()->SetSideLength(sideLength);
307         }
308     } else {
309         if (!ParseJsDimensionVp(info[0], sideLength)) {
310             RefPtr<V2::PatternLockTheme> patternLockTheme = GetTheme<V2::PatternLockTheme>();
311             CHECK_NULL_VOID(patternLockTheme);
312             sideLength = patternLockTheme->GetSideLength();
313         }
314 
315         PatternLockModel::GetInstance()->SetSideLength(sideLength);
316     }
317 }
SetPathStrokeWidth(const JSCallbackInfo & info)318 void JSPatternLock::SetPathStrokeWidth(const JSCallbackInfo& info)
319 {
320     if (info.Length() < 1) {
321         return;
322     }
323     CalcDimension lineWidth;
324     if (!ParseJsDimensionVp(info[0], lineWidth)) {
325         RefPtr<V2::PatternLockTheme> patternLockTheme = GetTheme<V2::PatternLockTheme>();
326         CHECK_NULL_VOID(patternLockTheme);
327         lineWidth = patternLockTheme->GetPathStrokeWidth();
328     }
329 
330     PatternLockModel::GetInstance()->SetStrokeWidth(lineWidth);
331 }
SetDotConnect(const JSCallbackInfo & args)332 void JSPatternLock::SetDotConnect(const JSCallbackInfo& args)
333 {
334     if (!args[0]->IsFunction()) {
335         return;
336     }
337 
338     auto jsFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(args[0]));
339     WeakPtr<NG::FrameNode> targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
340     auto onDotConnect = [execCtx = args.GetExecutionContext(), func = std::move(jsFunc), node = targetNode](
341                             int32_t code) {
342         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
343         PipelineContext::SetCallBackNode(node);
344         JSRef<JSVal> newJSVal = JSRef<JSVal>::Make(ToJSValue(code));
345         func->ExecuteJS(1, &newJSVal);
346     };
347 
348     PatternLockModel::GetInstance()->SetDotConnect(std::move(onDotConnect));
349 }
SetActiveCircleColor(const JSRef<JSVal> & info)350 void JSPatternLock::SetActiveCircleColor(const JSRef<JSVal>& info)
351 {
352     Color activeColor;
353     RefPtr<ResourceObject> resObj;
354     if (SystemProperties::ConfigChangePerform()) {
355         bool state = ParseJsColor(info, activeColor, resObj);
356         PatternLockModel::GetInstance()->CreateWithResourceObj(PatternLockResourceType::ACTIVECIRCLECOLOR, resObj);
357         if (state) {
358             PatternLockModel::GetInstance()->SetActiveCircleColor(activeColor);
359         } else {
360             activeColor = Color::TRANSPARENT;
361             PatternLockModel::GetInstance()->SetActiveCircleColor(activeColor);
362             PatternLockModel::GetInstance()->SetActiveCircleColorByUser(false);
363         }
364     } else {
365         if (!ParseJsColor(info, activeColor)) {
366             activeColor = Color::TRANSPARENT;
367         }
368         PatternLockModel::GetInstance()->SetActiveCircleColor(activeColor);
369     }
370 }
SetActiveCircleRadius(const JSRef<JSVal> & info)371 void JSPatternLock::SetActiveCircleRadius(const JSRef<JSVal>& info)
372 {
373     CalcDimension radius;
374     if (!ParseLengthMetricsToPositiveDimension(info, radius) || radius.IsNonPositive()) {
375         radius = Dimension(0.0f, DimensionUnit::VP);
376     }
377     PatternLockModel::GetInstance()->SetActiveCircleRadius(radius);
378 }
SetEnableWaveEffect(const JSRef<JSVal> & info)379 void JSPatternLock::SetEnableWaveEffect(const JSRef<JSVal>& info)
380 {
381     if (!info->IsBoolean()) {
382         PatternLockModel::GetInstance()->SetEnableWaveEffect(true);
383         return;
384     }
385     PatternLockModel::GetInstance()->SetEnableWaveEffect(info->ToBoolean());
386 }
SetEnableForeground(const JSRef<JSVal> & info)387 void JSPatternLock::SetEnableForeground(const JSRef<JSVal>& info)
388 {
389     if (!info->IsBoolean()) {
390         PatternLockModel::GetInstance()->SetEnableForeground(false);
391         return;
392     }
393     PatternLockModel::GetInstance()->SetEnableForeground(info->ToBoolean());
394 }
SetActivateCircleStyle(const JSCallbackInfo & info)395 void JSPatternLock::SetActivateCircleStyle(const JSCallbackInfo& info)
396 {
397     if (info.Length() < 1 || info[0]->IsNull() || !info[0]->IsObject()) {
398         PatternLockModel::GetInstance()->SetActiveCircleColor(Color::TRANSPARENT);
399         PatternLockModel::GetInstance()->SetActiveCircleRadius(Dimension(0.0f, DimensionUnit::VP));
400         PatternLockModel::GetInstance()->SetEnableWaveEffect(true);
401         PatternLockModel::GetInstance()->SetEnableForeground(false);
402         return;
403     }
404     auto paramObject = JSRef<JSObject>::Cast(info[0]);
405     JSRef<JSVal> jsColor = paramObject->GetProperty("color");
406     JSRef<JSVal> jsRadius = paramObject->GetProperty("radius");
407     JSRef<JSVal> jsEnableWaveEffect = paramObject->GetProperty("enableWaveEffect");
408     JSRef<JSVal> jsEnableForeground = paramObject->GetProperty("enableForeground");
409     SetActiveCircleColor(jsColor);
410     SetActiveCircleRadius(jsRadius);
411     SetEnableWaveEffect(jsEnableWaveEffect);
412     SetEnableForeground(jsEnableForeground);
413 }
414 
SetSkipUnselectedPoint(const JSCallbackInfo & info)415 void JSPatternLock::SetSkipUnselectedPoint(const JSCallbackInfo& info)
416 {
417     if (info.Length() < 1) {
418         return;
419     }
420     if (!info[0]->IsBoolean()) {
421         PatternLockModel::GetInstance()->SetSkipUnselectedPoint(false);
422         return;
423     }
424     PatternLockModel::GetInstance()->SetSkipUnselectedPoint(info[0]->ToBoolean());
425 }
426 
JSBind(BindingTarget globalObj)427 void JSPatternLockController::JSBind(BindingTarget globalObj)
428 {
429     JSClass<JSPatternLockController>::Declare("PatternLockController");
430     JSClass<JSPatternLockController>::CustomMethod("reset", &JSPatternLockController::Reset);
431     JSClass<JSPatternLockController>::CustomMethod("setChallengeResult", &JSPatternLockController::SetChallengeResult);
432     JSClass<JSPatternLockController>::Bind(
433         globalObj, JSPatternLockController::Constructor, JSPatternLockController::Destructor);
434 }
Reset(const JSCallbackInfo & args)435 void JSPatternLockController::Reset(const JSCallbackInfo& args)
436 {
437     if (controller_) {
438         controller_->Reset();
439     }
440 }
SetChallengeResult(const JSCallbackInfo & args)441 void JSPatternLockController::SetChallengeResult(const JSCallbackInfo& args)
442 {
443     if (controller_) {
444         if (!args[0]->IsNumber()) {
445             return;
446         }
447         int32_t value = args[0]->ToNumber<int32_t>();
448         if (value >= 1 && value <= static_cast<int32_t>(CHALLENGE_RESULT.size())) {
449             controller_->SetChallengeResult(CHALLENGE_RESULT[value - 1]);
450         }
451     }
452 }
Constructor(const JSCallbackInfo & args)453 void JSPatternLockController::Constructor(const JSCallbackInfo& args)
454 {
455     auto controller = Referenced::MakeRefPtr<JSPatternLockController>();
456     controller->IncRefCount();
457     args.SetReturnValue(Referenced::RawPtr(controller));
458 }
Destructor(JSPatternLockController * controller)459 void JSPatternLockController::Destructor(JSPatternLockController* controller)
460 {
461     if (controller != nullptr) {
462         controller->DecRefCount();
463     }
464 }
465 } // namespace OHOS::Ace::Framework
466