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;