1/*
2 * Copyright (c) 2022-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
16import Log from '../utils/log';
17import router from '@system.router';
18import CommonController from '../controller/commonController';
19import UserIdmModel from '../model/userIdmModel';
20import FaceAuthModel from '../model/faceAuthModel';
21
22class EnrollingController {
23  private readonly TAG: string = 'EnrollingController';
24  private readonly ANIMATION_TIME: number = 2000;
25  private enrolling: boolean = false;
26
27  constructor() {
28    Log.info(this.TAG, 'constructor+');
29    Log.info(this.TAG, 'constructor-');
30  }
31
32  init(): void {
33    Log.info(this.TAG, 'init+');
34    AppStorage.Set('stackVideoVisibility', Visibility.Visible);
35    AppStorage.Set('stackShelterVisibility', Visibility.Hidden);
36    AppStorage.Set('stackProgressVisibility', Visibility.Hidden);
37    AppStorage.Set('stackSuccessVisibility', Visibility.Hidden);
38    AppStorage.Set('enrollTipVisibility', Visibility.Visible);
39    AppStorage.Set('enrollButtonVisibility', Visibility.Hidden);
40
41    AppStorage.Set('stackProgressValue', 0);
42    AppStorage.Set('stackShelterHeight', AppStorage.Get('stackShelterHeightBegin'));
43    AppStorage.Set('enrollTip', $r('app.string.face_intro'));
44    AppStorage.Set('enrollTipSize', $r('sys.float.ohos_id_text_size_sub_title1'));
45    AppStorage.Set('stackVideoBlurRadius', 0);
46
47    AppStorage.Set('enrollStatus', $r('app.string.enrolling'));
48    this.startEnroll();
49    Log.info(this.TAG, 'init-');
50  }
51
52  async startEnroll(): Promise<void> {
53    Log.info(this.TAG, 'startEnroll+');
54    if (AppStorage.Get('xComponentSurfaceId') === '') {
55      Log.info(this.TAG, 'surface id is not set, skip start enroll');
56      return;
57    }
58    if (this.enrolling) {
59      Log.info(this.TAG, 'face is enrolling, skip start enroll');
60      return;
61    }
62    await FaceAuthModel.setSurfaceId(AppStorage.Get('xComponentSurfaceId'));
63    UserIdmModel.setOnAcquireCallback(this.onAcquire.bind(this));
64    UserIdmModel.enrollFace().then(this.processResult.bind(this));
65    this.enrolling = true;
66    Log.info(this.TAG, 'startEnroll-');
67  }
68
69  async processResult(result : number): Promise<void> {
70    await this.faceDetected();
71    await this.enrollProcessing();
72    if (result === 0) {
73      await this.enrollSuccess();
74    } else {
75      await this.enrollFail();
76    }
77    this.enrolling = false;
78  }
79
80  async onAcquire(result: number): Promise<void> {
81    Log.info(this.TAG, 'onAcquire+ result: ' + result);
82    const NEED_FACE_DETECTED = 25;
83    if (result === NEED_FACE_DETECTED) {
84      Log.info(this.TAG, 'onAcquire face detected+');
85      this.faceDetected();
86      Log.info(this.TAG, 'onAcquire face detected-');
87    }
88    Log.info(this.TAG, 'onAcquire-');
89  }
90
91  async faceDetected(): Promise<void> {
92    Log.info(this.TAG, 'faceDetected+');
93    AppStorage.Set('animationTime', this.ANIMATION_TIME);
94    AppStorage.Set('stackVideoVisibility', Visibility.Visible);
95    AppStorage.Set('stackShelterVisibility', Visibility.Visible);
96    AppStorage.Set('stackProgressVisibility', Visibility.Hidden);
97    AppStorage.Set('stackSuccessVisibility', Visibility.Hidden);
98    AppStorage.Set('enrollTipVisibility', Visibility.Visible);
99    AppStorage.Set('enrollButtonVisibility', Visibility.Hidden);
100
101    AppStorage.Set('stackShelterHeight', AppStorage.Get('stackShelterHeightEnd'));
102    await CommonController.sleepMS(this.ANIMATION_TIME);
103    AppStorage.Set('animationTime', 0);
104    Log.info(this.TAG, 'faceDetected-');
105  }
106
107  async enrollProcessing(): Promise<void> {
108    Log.info(this.TAG, 'enrollProcessing+');
109    AppStorage.Set('stackVideoVisibility', Visibility.Visible);
110    AppStorage.Set('stackShelterVisibility', Visibility.Visible);
111    AppStorage.Set('stackProgressVisibility', Visibility.Visible);
112    AppStorage.Set('stackSuccessVisibility', Visibility.Hidden);
113    AppStorage.Set('enrollTipVisibility', Visibility.Hidden);
114    AppStorage.Set('enrollButtonVisibility', Visibility.Hidden);
115
116    const PERCENTAGE_100 = 100;
117    for (let i = 0; i <= PERCENTAGE_100; i += 1) {
118      const SLEEP_TIME = 30;
119      await CommonController.sleepMS(SLEEP_TIME);
120      AppStorage.Set('stackProgressVisibility', Visibility.Hidden);
121      AppStorage.Set('stackProgressValue', i);
122      AppStorage.Set('stackProgressVisibility', Visibility.Visible);
123    }
124
125    Log.info(this.TAG, 'enrollProcessing-');
126  }
127
128  async enrollSuccess(): Promise<void> {
129    Log.info(this.TAG, 'enrollSuccess+');
130    AppStorage.Set('stackVideoVisibility', Visibility.Hidden);
131    AppStorage.Set('stackShelterVisibility', Visibility.Hidden);
132    AppStorage.Set('stackProgressVisibility', Visibility.Hidden);
133    AppStorage.Set('stackSuccessVisibility', Visibility.Visible);
134    AppStorage.Set('enrollTipVisibility', Visibility.Hidden);
135    AppStorage.Set('enrollButtonVisibility', Visibility.Hidden);
136
137    AppStorage.Set('enrollStatus', $r('app.string.enroll_success'));
138    const SLEEP_TIME = 3000;
139    await CommonController.sleepMS(SLEEP_TIME);
140    router.replace({uri: 'pages/faceConfig'});
141    Log.info(this.TAG, 'enrollSuccess-');
142  }
143
144  async enrollFail(): Promise<void> {
145    Log.info(this.TAG, 'enrollFail+');
146    AppStorage.Set('stackVideoVisibility', Visibility.Visible);
147    AppStorage.Set('stackShelterVisibility', Visibility.Visible);
148    AppStorage.Set('stackProgressVisibility', Visibility.Visible);
149    AppStorage.Set('stackSuccessVisibility', Visibility.Hidden);
150    AppStorage.Set('enrollTipVisibility', Visibility.Visible);
151    AppStorage.Set('enrollButtonVisibility', Visibility.Visible);
152
153    AppStorage.Set('enrollStatus', $r('app.string.enrolling_fail'));
154    AppStorage.Set('enrollTip', $r('app.string.enroll_info_fail'));
155    AppStorage.Set('enrollTipSize', $r('sys.float.ohos_id_text_size_body1'));
156    const STACK_VIDEO_BLUR_RADIUS = 30;
157    AppStorage.Set('stackVideoBlurRadius', STACK_VIDEO_BLUR_RADIUS);
158    AppStorage.Set('stackProgressValue', 0);
159
160    Log.info(this.TAG, 'enrollFail-');
161  }
162
163  async clear(): Promise<void> {
164    Log.info(this.TAG, 'clear+');
165    await FaceAuthModel.clearSurfaceId();
166    Log.info(this.TAG, 'clear-');
167  }
168}
169
170let enrollingController = new EnrollingController();
171export default enrollingController as EnrollingController;