From c38c2e7520668a9ca9d1c86fac824a6448a5a61a Mon Sep 17 00:00:00 2001 From: liuhanxiong Date: Sat, 22 Jul 2023 11:57:40 +0000 Subject: [PATCH] add source build for AuthWidget Signed-off-by: liuhanxiong Change-Id: Iabe61c01e5a2c30cc1cd2ed99b498cba8e67cc0d --- AppScope/app.json | 14 + AppScope/app.json5 | 26 - AppScope/resources/base/element/string.json | 4 + BUILD.gn | 34 +- README.md | 2 +- README_ZH.md | 2 +- .../main/ets/common/components/CustomPSD.ets | 621 ------------------ .../main/ets/common/components/FullScreen.ets | 266 ++++---- .../main/ets/common/components/PassWord.ets | 2 +- entry/src/main/ets/common/components/Pwd.ets | 83 --- .../ets/common/components/SixPassword.ets | 46 +- .../src/main/ets/common/components/SixPwd.ets | 149 ----- entry/src/main/ets/common/vm/Constants.ts | 7 +- entry/src/main/ets/mainability/MainAbility.ts | 54 -- entry/src/main/ets/pages/Index.ets | 14 +- .../ets/pages/components/CustomPassword.ets | 15 +- .../main/ets/pages/components/FaceAuth.ets | 216 +++--- .../ets/pages/components/FingerprintAuth.ets | 270 ++++---- .../ets/pages/components/PasswordAuth.ets | 27 +- entry/src/main/{module.json5 => module.json} | 18 +- entry/src/ohosTest/ets/test/Ability.test.ets | 50 -- entry/src/ohosTest/ets/test/Index.test.ets | 47 -- .../jsunit/commonUtilsTest/FuncUtils.test.ets | 111 ---- .../jsunit/constantsTest/Constants.test.ets | 34 - .../jsunit/widgetTest/CustomPassword.test.ets | 96 --- .../widgetTest/CustomPasswordFace.test.ets | 56 -- .../widgetTest/CustomPasswordFinger.test.ets | 71 -- .../test/jsunit/widgetTest/FaceAuth.test.ets | 184 ------ .../widgetTest/FingerprintAuth.test.ets | 173 ----- .../test/jsunit/widgetTest/PageCom.test.ets | 46 -- .../jsunit/widgetTest/PasswordAuth.test.ets | 80 --- .../widgetTest/PasswordAuthSix.test.ets | 66 -- .../ets/test/uitest/CustomPassword.test.ets | 71 -- .../test/uitest/CustomPasswordAttr.test.ets | 47 -- .../ets/test/uitest/FaceAuth.test.ets | 56 -- .../ets/test/uitest/FingerprintAuth.test.ets | 58 -- .../ets/test/uitest/PasswordAuth.test.ets | 89 --- .../ets/test/uitest/PasswordAuthSix.test.ets | 72 -- .../ets/test/uitest/PinFingerPrint.test.ets | 55 -- .../ohosTest/{module.json5 => module.json} | 16 - hvigorfile.js | 17 - package.json | 1 - .../{authWidget .p7b => auth_widget.p7b} | Bin 3438 -> 3473 bytes 43 files changed, 499 insertions(+), 2867 deletions(-) create mode 100644 AppScope/app.json delete mode 100644 AppScope/app.json5 delete mode 100644 entry/src/main/ets/common/components/CustomPSD.ets delete mode 100644 entry/src/main/ets/common/components/Pwd.ets delete mode 100644 entry/src/main/ets/common/components/SixPwd.ets delete mode 100644 entry/src/main/ets/mainability/MainAbility.ts rename entry/src/main/{module.json5 => module.json} (62%) delete mode 100644 entry/src/ohosTest/ets/test/Ability.test.ets delete mode 100644 entry/src/ohosTest/ets/test/Index.test.ets delete mode 100644 entry/src/ohosTest/ets/test/jsunit/commonUtilsTest/FuncUtils.test.ets delete mode 100644 entry/src/ohosTest/ets/test/jsunit/constantsTest/Constants.test.ets delete mode 100644 entry/src/ohosTest/ets/test/jsunit/widgetTest/CustomPassword.test.ets delete mode 100644 entry/src/ohosTest/ets/test/jsunit/widgetTest/CustomPasswordFace.test.ets delete mode 100644 entry/src/ohosTest/ets/test/jsunit/widgetTest/CustomPasswordFinger.test.ets delete mode 100644 entry/src/ohosTest/ets/test/jsunit/widgetTest/FaceAuth.test.ets delete mode 100644 entry/src/ohosTest/ets/test/jsunit/widgetTest/FingerprintAuth.test.ets delete mode 100644 entry/src/ohosTest/ets/test/jsunit/widgetTest/PageCom.test.ets delete mode 100644 entry/src/ohosTest/ets/test/jsunit/widgetTest/PasswordAuth.test.ets delete mode 100644 entry/src/ohosTest/ets/test/jsunit/widgetTest/PasswordAuthSix.test.ets delete mode 100644 entry/src/ohosTest/ets/test/uitest/CustomPassword.test.ets delete mode 100644 entry/src/ohosTest/ets/test/uitest/CustomPasswordAttr.test.ets delete mode 100644 entry/src/ohosTest/ets/test/uitest/FaceAuth.test.ets delete mode 100644 entry/src/ohosTest/ets/test/uitest/FingerprintAuth.test.ets delete mode 100644 entry/src/ohosTest/ets/test/uitest/PasswordAuth.test.ets delete mode 100644 entry/src/ohosTest/ets/test/uitest/PasswordAuthSix.test.ets delete mode 100644 entry/src/ohosTest/ets/test/uitest/PinFingerPrint.test.ets rename entry/src/ohosTest/{module.json5 => module.json} (92%) delete mode 100644 hvigorfile.js rename signature/{authWidget .p7b => auth_widget.p7b} (52%) diff --git a/AppScope/app.json b/AppScope/app.json new file mode 100644 index 0000000..c849a2b --- /dev/null +++ b/AppScope/app.json @@ -0,0 +1,14 @@ +{ + "app": { + "bundleName": "com.ohos.useriam.authwidget", + "vendor": "example", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:app_icon", + "label": "$string:app_name", + "minAPIVersion": 10, + "targetAPIVersion": 10, + "distributedNotificationEnabled": true, + "apiReleaseType": "Beta5" + } +} diff --git a/AppScope/app.json5 b/AppScope/app.json5 deleted file mode 100644 index f72a712..0000000 --- a/AppScope/app.json5 +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -{ - "app": { - "bundleName": "com.ohos.useriam.authwidget", - "vendor": "example", - "versionCode": 1000000, - "versionName": "1.0.0", - "icon": "$media:app_icon", - "label": "$string:app_name", - "distributedNotificationEnabled": true - } -} diff --git a/AppScope/resources/base/element/string.json b/AppScope/resources/base/element/string.json index fd5f709..014d435 100644 --- a/AppScope/resources/base/element/string.json +++ b/AppScope/resources/base/element/string.json @@ -3,6 +3,10 @@ { "name": "app_name", "value": "AuthWidget" + }, + { + "name": "authwidget_desc", + "value": "authwidget" } ] } diff --git a/BUILD.gn b/BUILD.gn index 0a78fca..fe38eec 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -13,17 +13,9 @@ import("//build/ohos.gni") -ohos_hap("authwidget_hap") { - hap_profile = "entry/src/main/module5.json" - deps = [ - ":authwidget_js_assets", - ":authwidget_resources", - ] - //certificate_profile = "signature/authwidget.p7b" - hap_name = "Authwidget" - subsystem_name = "applications" - part_name = "prebuilt_hap" - module_install_dir = "app/com.ohos.useriam.authwidget" +ohos_app_scope("authwidget_app_profile") { + app_profile = "./AppScope/app.json" + sources = [ "./AppScope/resources" ] } ohos_js_assets("authwidget_js_assets") { @@ -31,13 +23,21 @@ ohos_js_assets("authwidget_js_assets") { source_dir = "entry/src/main/ets" } -ohos_app_scope("authwidget_app_profile") { - app_profile = "AppScope/app.json" - sources = [ "AppScope/resources" ] -} - ohos_resources("authwidget_resources") { sources = [ "entry/src/main/resources" ] deps = [ ":authwidget_app_profile" ] - hap_profile = "entry/src/main/module5.json" + hap_profile = "entry/src/main/module.json" +} + +ohos_hap("auth_widget") { + hap_profile = "entry/src/main/module.json" + deps = [ + ":authwidget_js_assets", + ":authwidget_resources", + ] + certificate_profile = "signature/auth_widget.p7b" + hap_name = "AuthWidget" + subsystem_name = "applications" + part_name = "prebuilt_hap" + module_install_dir = "app/com.ohos.useriam.authwidget" } diff --git a/README.md b/README.md index 7f2f2c4..8433126 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ The Authentication Widget works with the User Authentication Framework (user_aut In the root directory of the OpenHarmony source code, run the following command to build the Authentication Widget separately: ``` -./build.sh --product-name rk3568 --ccache --build-target useriam_auth_widget +./build.sh --product-name rk3568 --ccache --build-target auth_widget ``` > **NOTE** diff --git a/README_ZH.md b/README_ZH.md index 2ff67ac..0267c88 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -35,7 +35,7 @@ 在OpenHarmony源码根目录下,调用以下指令,单独编译统一身份认证控件部件。 ``` -./build.sh --product-name rk3568 --ccache --build-target useriam_auth_widget +./build.sh --product-name rk3568 --ccache --build-target auth_widget ``` > 说明: diff --git a/entry/src/main/ets/common/components/CustomPSD.ets b/entry/src/main/ets/common/components/CustomPSD.ets deleted file mode 100644 index ab12926..0000000 --- a/entry/src/main/ets/common/components/CustomPSD.ets +++ /dev/null @@ -1,621 +0,0 @@ -/* - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import display from '@ohos.display'; -import screen from '@ohos.screen'; -import userAuth from '@ohos.userIAM.userAuth'; -import Constants, { CmdType, FingerPosition } from '../../common/vm/Constants'; -import AuthUtils from '../utils/AuthUtils'; -import LogUtils from '../utils/LogUtils'; -import TimeUtils from '../utils/TimeUtils'; -import NumKeyBoard from './NumkeyBoard'; - -const TAG = 'CustomPSD'; -const INTERVAL = 1000; -const DIGITALPSD_IC_DIAMETER = 12; -const THOUSANDTH = 1000; -const TITLE_POSITION = 200; -const THEME_WHITE = 1; -const THEME_BLUR = 2; -const DEL_PWD = -2; -const CALL_PHONE = -1; -const GO_BACK = -3; -const DEFAULT_SIZE = 72; -const FINGER_TEXT_POSITION = 120; -const FINGER_X_POSITION = 86; -const FINGER_Y_POSITION = 40; - -interface ControlType { - isSixPassword?: boolean, - isLandscape: boolean, - jumpFinger: boolean, - isShowFace: boolean, - isShowFinger: boolean, -} - -interface KeyboardType { - index: number, - row1: string | Resource, - row2?: string, - value?: number, - bkg?: boolean, -} - -@Component -export default struct CustomPSD { - @Link pinSubType: string; - @Link textValue: string; - @Link themeType: number; - @Link authType: Array; - @Link @Watch('onCmdDataChange') cmdData: Array; - @State lock: number = 0; - @State screenClass: object = {}; - @StorageLink('cueWord') cueWord: string = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_use_pwd')); - @StorageLink('passwordArr') passwordArr: string[] = ['', '', '', '', '', '']; - @StorageLink('passwordArrNumber') passwordArrNumber: string[] = []; - @State passwordObj: string = ''; - numKeyboard: KeyboardType[] = Constants.numKeyBoard; - @State prompt: string = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_use_pwd')); - @State fingerText: string = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_hint_inscreen_fp')); - @StorageLink('screenLockDirection') screenLockDirection: number = 1; - @State controlType: ControlType = { - jumpFinger: false, - isLandscape: false, - isSixPassword: true, - isShowFace: this.authType.includes(2), - isShowFinger: this.authType.includes(4) - } - @State fingerPosition: FingerPosition = { - sensorType: '' - } - @State screen: number[] = []; - @State lockArr: boolean[] = [false, false]; - @Consume isLandscape: boolean; - @Consume underFingerPrint: boolean; - - queryScreenInfo(): void { - try { - screen.getAllScreens((err, data) => { - if (err.code) { - LogUtils.e(TAG, 'Failed to get all screens. Cause: ' + JSON.stringify(err)); - return; - } - this.screenClass = data[0]; - }); - } catch (exception) { - LogUtils.e(TAG, 'getAllScreens catch exception: ' + exception); - } - } - - onCmdDataChange(num?: string): void { - this.cmdData.length > 0 && this.cmdData.map((item) => { - const { type,remainAttempts, lockoutDuration,sensorInfo} = item.payload; - switch (type) { - case Constants.noticeTypePin: - this.clearPassword(); - if (remainAttempts) { - this.prompt = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_hint_pwd_error')); - if (num === 'first') { - this.prompt = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_use_pwd')); - } - if (remainAttempts < 3) { - this.prompt = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_pwd_error_can_try')) - + remainAttempts + globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_frequency')); - } - } - if (remainAttempts === 0 && lockoutDuration) { - this.lock = 1; - this.countdown(lockoutDuration); - } - - if (!remainAttempts && !lockoutDuration) { - this.lock = 1; - } - break; - case Constants.noticeTypeFace: - if (remainAttempts) { - this.prompt = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_hint_face_verify_fail_click_retry_s1')); - this.lockArr[0] = false; - } - if (num === 'first') { - this.prompt = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_hint_recognition')); - } - if (remainAttempts === 0) { - this.prompt = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_title_number_failed_face_forbidden')); - this.lockArr[0] = true; - } - break; - case Constants.noticeTypeFinger: - if (sensorInfo && JSON.stringify(sensorInfo) !== '{}') { - this.fingerPosition = JSON.parse(sensorInfo); - const displayClass = display.getDefaultDisplaySync(); - this.screen = [displayClass.width, displayClass.height]; - } - if (remainAttempts) { - this.prompt = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_hint_fp_retry_s2')); - this.fingerText = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_hint_fp_retry_s2')); - if (remainAttempts < 5) { - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFinger]); - } - } - if (num === 'first') { - this.prompt = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_use_pwd')); - } - if (remainAttempts === 0) { - this.prompt = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_title_number_failed_fp_forbidden')); - this.fingerText = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_title_number_failed_fp_forbidden')); - this.lockArr[1] = true; - } - default: - break; - } - }) - } - - aboutToAppear(): void { - AppStorage.SetOrCreate('passwordArr', ['', '', '', '', '', '']); - this.queryScreenInfo(); - if (this.cmdData && this.cmdData.length > 0) { - this.onCmdDataChange('first'); - } - if (this.controlType.isShowFace && this.controlType.isShowFinger) { - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFace, Constants.noticeTypeFace]); - return; - } - if (this.controlType.isShowFace) { - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFace]); - return; - } - if (this.controlType.isShowFinger) { - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFinger]); - return; - } - } - - clearPassword(): void { - this.passwordArr = []; - this.passwordArrNumber = []; - this.passwordArr = ['', '', '', '', '', '']; - this.numKeyboard[11].value = GO_BACK; - this.updateStorage(() => { - }) - } - - aboutToDisappear(): void { - this.clearPassword(); - } - - countdown(freezingTime): void { - const TRY_AGAIN = globalThis.context.resourceManager.getStringSync($r('app.string.unified_authwidget_postretry')); - let promptText: string = ''; - let freezingMillisecond = freezingTime; - if (freezingMillisecond > 0) { - promptText = TimeUtils.getFreezingTimeNm(freezingMillisecond, globalThis.context); - promptText += TRY_AGAIN; - setTimeout(this.countdown.bind(this), INTERVAL, freezingTime - INTERVAL); - } else { - promptText = globalThis.context.resourceManager.getStringSync($r('app.string.unified_authwidget_use_pwd')); - this.clearPassword(); - this.lock = 0; - } - this.prompt = promptText; - } - - updateStorage(callback): void { - AppStorage.SetOrCreate('passwordArr', this.passwordArr); - AppStorage.SetOrCreate('numKeyboard', this.numKeyboard); - callback(); - } - - build() { - if (!this.controlType.jumpFinger) { - Column() { - Column() { - if (this.lock === 1) { - Text($r('app.string.unified_authwidget_locked')) - .margin({ bottom: '16vp' }) - .fontColor(this.themeType === THEME_WHITE - ? $r('sys.color.ohos_id_color_text_primary') - : $r('sys.color.ohos_id_color_text_primary_contrary')) - .fontSize($r('sys.float.ohos_id_text_size_headline6')) - .fontWeight(FontWeight.Medium) - } - if (this.controlType.isShowFace) { - if (this.themeType === THEME_BLUR) { - Image($r('app.media.white_faceID')) - .id('faceImgCustomPwd') - .width('30vp') - .height('30vp') - .margin({ bottom: '16vp' }) - .onClick(() => { - if (!this.lockArr[0]) { - this.prompt = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_hint_recognition')); - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFace]); - } - }) - } - if (this.themeType === THEME_WHITE) { - Image($r('app.media.error_faceID')) - .width('30vp') - .height('30vp') - .margin({ bottom: '16vp' }) - .visibility(Visibility.Visible) - .colorBlend($r('sys.color.ohos_id_color_activated')) - .onClick(() => { - if (!this.lockArr[0]) { - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFace]); - } - }) - } - } - Text(this.prompt) - .id('cancelIconCustomPSD') - .fontSize(this.prompt === globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_use_pwd')) - ? $r('sys.float.ohos_id_text_size_body1') - : $r('sys.float.ohos_id_text_size_body2')) - .fontWeight(FontWeight.Medium) - .fontColor(this.themeType === THEME_WHITE - ? $r('sys.color.ohos_id_color_text_primary') - : $r('sys.color.ohos_id_color_text_primary_contrary')) - .margin({ bottom: '8vp' }) - .textAlign(TextAlign.Center) - .textOverflow({ overflow: TextOverflow.None }) - .height('20vp') - .onClick(() => { - if (this.prompt === globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_hint_face_verify_fail_click_retry_s1'))) { - this.prompt = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_hint_recognition')); - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFace]); - } - }) - - Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - if (this.lock === 0) { - if (this.pinSubType === Constants.pinSix) { - List({ space: DIGITALPSD_IC_DIAMETER }) { - ForEach(this.passwordArr, (item) => { - if ((!item || item === '') && item !== 0) { - ListItem() { - Button() - .border({ - color: this.themeType === THEME_WHITE ? Color.Black : Color.White, - style: BorderStyle.Solid, - width: 1 - }) - .borderRadius('12vp') - .width('12vp') - .height('12vp') - .type(ButtonType.Circle) - .backgroundColor(Color.Transparent) - - } - .margin({ left: '5vp', right: '5vp' }) - } else { - ListItem() { - Button() - .borderRadius('12vp') - .width('12vp') - .height('12vp') - .type(ButtonType.Circle) - .backgroundColor(this.themeType === THEME_WHITE ? Color.Black : Color.White) - } - .margin({ left: '5vp', right: '5vp' }) - } - }) - } - .listDirection(Axis.Horizontal) - .height('12vp') - - } else if (this.pinSubType === Constants.pinNumber) { - Stack() { - TextInput({ placeholder: '', text: this.passwordArrNumber.join('') }) - .width('100%') - .onChange(async (value: string) => { - this.passwordArrNumber = value.replace(/[^\d]/g, '').split(''); - }) - .id('pinInputNumber') - .onSubmit(async (enterKey: EnterKeyType) => { - let str = this.passwordArrNumber.toString(); - this.textValue = str.replace(/,/g, ''); - if (this.passwordArrNumber.length < 4) { - return; - } - - const strData = this.passwordArrNumber.toString(); - this.textValue = strData.replace(/,/g, ''); - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypePin]); - }) - .type(InputType.Password) - .backgroundImageSize(ImageSize.Auto) - .visibility(Visibility.Visible) - .copyOption(CopyOptions.None) - .maxLength(32) - - } - } else if (this.pinSubType === Constants.pinMixed) { - TextInput({ text: this.passwordObj }) - .height('40vp') - .type(InputType.Password) - .textAlign(TextAlign.Center) - .copyOption(CopyOptions.None) - .maxLength(32) - .onSubmit(async (enterKey: EnterKeyType) => { - // check callback - if (this.passwordObj.length < 4) { - return; - } - this.textValue = this.passwordObj; - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypePin]); - }) - .onChange((value: string) => { - this.passwordObj = value; - }) - .id('pinInput') - } - } - } - .height('40vp') - - Button(($r('app.string.unified_authwidget_forgotpwd')), { - stateEffect: false - }) - .id('forgotBtnCustomPwd') - .height('40vp') - .backgroundColor(Color.Transparent) - .fontColor(this.themeType === THEME_WHITE - ? $r('sys.color.ohos_id_color_text_primary_activated') - : $r('sys.color.ohos_id_color_text_primary_contrary')) - .fontSize($r('sys.float.ohos_id_text_size_button1')) - .fontWeight(FontWeight.Medium) - .onClick(() => { - let str = this.passwordArrNumber.toString() - this.textValue = str.replace(/,/g, ''); - }) - .visibility(Visibility.Hidden) - } - - Column() { - if (!this.isLandscape && this.lock === 0 && this.pinSubType === Constants.pinSix) { - NumKeyBoard({ - themeType: $themeType, - onKeyPress: (index, callback) => { - let keyValue = this.numKeyboard[index].value; - if (keyValue > 0 || keyValue === 0) { - const index = this.passwordArr.map(item => item).indexOf('') - if (index > -1) { - this.passwordArr[index] = keyValue + ''; - this.numKeyboard[11].row1 = $r('app.string.unified_authwidget_delete'); - this.numKeyboard[11].value = DEL_PWD; - if (index === 5) { - this.passwordArr[index] = keyValue + ''; - if (this.passwordArr.join('').length < 6) { - return; - } - let str = this.passwordArr.toString(); - this.textValue = str.replace(/,/g, ''); - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypePin]); - } - this.updateStorage(callback); - } - } else if (keyValue === DEL_PWD) { - const index = this.passwordArr.map(item => item).indexOf(''); - if (index === -1) { - this.passwordArr[5] = ''; - } else if (index === 1) { - this.passwordArr[index-1] = ''; - this.numKeyboard[11].value = GO_BACK; - this.numKeyboard[11].row1 = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_back')); - } else { - this.passwordArr[index-1] = ''; - } - this.updateStorage(callback); - } else if (keyValue === GO_BACK) { - this.lock = 0; - this.clearPassword(); - globalThis.session?.terminateSelf?.(); - } else if (keyValue === CALL_PHONE) { - if (this.passwordArr.join('').length < 6) { - return; - } - - let str = this.passwordArr.toString(); - this.textValue = str.replace(/,/g, ''); - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypePin]); - } - } - }) - } else { - Text().height(Constants.fullContainerHeight) - } - } - .width(Constants.fullContainerWidth) - .height('40%') - - Column() { - if (this.controlType.isShowFinger && this.lock !== 1) { - if (this.fingerPosition.sensorType !== 'OUT_OF_SCREEN_SENSOR' - && this.fingerPosition.sensorType !== 'NON_SENSOR') { - if (this.themeType === THEME_WHITE) { - if (this.fingerPosition.sensorType === 'UNDER_SCREEN_SENSOR' - || this.fingerPosition.sensorType === 'BOTH_SENSOR' - || this.fingerPosition.sensorType === 'SensorType1') { - if (this.fingerPosition.udSensorCenterYInThousandth / this.screen[1] > 0.75 && !this.isLandscape) { - Image($r('app.media.ic_blue_fingerprint')) - .id('fingerprintImgCustomPwd') - .width(px2vp(this.fingerPosition.udSensorRadiusInPx)) - .height(px2vp(this.fingerPosition.udSensorRadiusInPx)) - .position({ - x: px2vp(this.fingerPosition.udSensorCenterXInThousandth), - y: px2vp(this.fingerPosition.udSensorCenterYInThousandth) - }) - .onClick(() => { - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFinger]); - }) - } else { - Image($r('app.media.finger_guide')) - .id('fingerWhiteImgCustomPwd') - .width('24vp') - .height('24vp') - .margin({ top: '12vp' }) - .onClick(() => { - if (this.isLandscape) { - this.underFingerPrint = true; - } else { - this.controlType.jumpFinger = true; - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFinger]); - } - - }) - } - } - } - if (this.themeType === THEME_BLUR) { - if (this.fingerPosition.sensorType === 'UNDER_SCREEN_SENSOR' - || this.fingerPosition.sensorType === 'BOTH_SENSOR' - || this.fingerPosition.sensorType === 'SensorType1') { - if (this.fingerPosition.udSensorCenterYInThousandth / this.screen[1] > 0.75 && !this.isLandscape) { - Image($r('app.media.ic_unlock_fingerprint')) - .id('fingerprintImgCustomPSD') - .width(px2vp(this.fingerPosition.udSensorRadiusInPx)) - .height(px2vp(this.fingerPosition.udSensorRadiusInPx)) - .position({ - x: px2vp(this.fingerPosition.udSensorCenterXInThousandth), - y: px2vp(this.fingerPosition.udSensorCenterYInThousandth) - }) - .onClick(() => { - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFinger]); - }) - } else { - Image($r('app.media.finger_white')) - .id('fingerWhiteImgCustomPSD') - .width('24vp') - .height('24vp') - .margin({ top: '12vp' }) - .onClick(() => { - if (this.isLandscape) { - this.underFingerPrint = true; - } else { - this.controlType.jumpFinger = true; - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFinger]); - } - }) - } - - } - } - } - } - }.width('24vp') - .height(this.controlType.isShowFinger ? '72vp' : '9%') - .justifyContent(FlexAlign.Start) - } - .justifyContent(FlexAlign.End) - .width(Constants.fullContainerWidth) - } else if (!this.controlType.isLandscape) { - Column() { - Text(globalThis.wantParams?.title) - .height('40vp') - .fontColor(this.themeType === THEME_WHITE - ? $r('sys.color.ohos_id_color_text_primary') - : $r('sys.color.ohos_id_color_text_primary_contrary')) - .fontSize($r('sys.float.ohos_id_text_size_sub_title2')) - .fontWeight(FontWeight.Medium) - .position({ y: TITLE_POSITION }) - .width('100%') - .textAlign(TextAlign.Center) - Text(this.fingerText) - .height('40vp') - .fontColor(this.themeType === THEME_WHITE - ? $r('sys.color.ohos_id_color_text_secondary') - : $r('sys.color.ohos_id_color_text_primary_contrary')) - .fontSize($r('sys.float.ohos_id_text_size_body2')) - .position({ - y: (px2vp(this.fingerPosition.udSensorCenterYInThousandth / THOUSANDTH * this.screen[1]) - 120 - px2vp(72 + this.fingerPosition.udSensorRadiusInPx)) - }) - .position({ - y: (px2vp(this.fingerPosition.udSensorCenterYInThousandth / THOUSANDTH * this.screen[1]) - - FINGER_TEXT_POSITION - px2vp(DEFAULT_SIZE + this.fingerPosition.udSensorRadiusInPx)) - }) - .width('100%') - .textAlign(TextAlign.Center) - Image(this.themeType === THEME_WHITE - ? $r('app.media.ic_blue_fingerprint') - : $r('app.media.ic_unlock_fingerprint')) - .id('unlockFingerprintImgCustomPwd') - .width(px2vp(this.fingerPosition.udSensorRadiusInPx * 2)) - .height(px2vp(this.fingerPosition.udSensorRadiusInPx * 2)) - .position({ - x: (px2vp(this.fingerPosition.udSensorCenterXInThousandth / THOUSANDTH * this.screen[0]) - - px2vp(FINGER_X_POSITION + this.fingerPosition.udSensorRadiusInPx)), - y: (px2vp(this.fingerPosition.udSensorCenterYInThousandth / THOUSANDTH * this.screen[1]) - - FINGER_Y_POSITION - px2vp(DEFAULT_SIZE + this.fingerPosition.udSensorRadiusInPx)) - }) - .onClick(() => { - if (this.prompt !== globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_title_number_failed_fp_forbidden'))) { - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFinger]); - } - }) - Button($r('app.string.unified_authwidget_cancel'), { - type: ButtonType.Normal, - stateEffect: true - }) - .margin({ bottom: '300vp', left: 'auto', right: 'auto' }) - .backgroundColor(Color.Transparent) - .fontColor(this.themeType === THEME_WHITE - ? $r('sys.color.ohos_id_color_text_secondary') - : $r('sys.color.ohos_id_color_text_primary_contrary')) - .onClick(() => { - this.controlType.jumpFinger = false; - }) - } - .justifyContent(FlexAlign.End) - .height('100%') - .width('100%') - } else { - Column() { - Text(globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_tip_verify_in_portrait_mode'))) - .height('40vp') - .fontColor(this.themeType === THEME_WHITE - ? $r('sys.color.ohos_id_color_text_primary') - : $r('sys.color.ohos_id_color_text_primary_contrary')) - .fontSize($r('sys.float.ohos_id_text_size_sub_title2')) - .fontWeight(FontWeight.Medium) - }.justifyContent(FlexAlign.End) - .height('300vp') - .width('100%') - } - } -} \ No newline at end of file diff --git a/entry/src/main/ets/common/components/FullScreen.ets b/entry/src/main/ets/common/components/FullScreen.ets index 06fc153..94f84ef 100644 --- a/entry/src/main/ets/common/components/FullScreen.ets +++ b/entry/src/main/ets/common/components/FullScreen.ets @@ -14,7 +14,6 @@ */ import display from '@ohos.display'; -import screen from '@ohos.screen'; import userAuth from '@ohos.userIAM.userAuth'; import Constants, { CmdType, FingerPosition } from '../../common/vm/Constants'; import AuthUtils from '../utils/AuthUtils'; @@ -24,22 +23,21 @@ import NumKeyBoard from './NumkeyBoard'; const TAG = 'FullScreen'; const INTERVAL = 1000; -const DIGITAL_PASSWORD_IC_DIAMETER = 12; const THOUSANDTH = 1000; -const TITLE_POSITION = 200; const DEL_PWD = -2; const CALL_PHONE = -1; const GO_BACK = -3; -const DEFAULT_SIZE = 72; const FINGER_TEXT_POSITION = 120; -const FINGER_HIGH = 72; -const FINGER_X_POSITION = 86; -const FINGER_Y_POSITION = 40; +const FINGER_HIGH = 80; +const FINGER_Y_POSITION = 60; const MAX_LENGTH = 32; +const SIX_MAX_LENGTH = 6; const AUTH_TYPE_FACE = 2; const AUTH_TYPE_FINGER = 4; const PASSWORD_LENGTH = 4; const PASSWORD_ARRAY_LENGTH = 6; +const UNDER_FINGER = 170; +const NOTICE_DELAY = 500; interface ControlType { isSixPassword?: boolean, @@ -64,7 +62,7 @@ export default struct FullScreen { @Link authType: Array; @Link @Watch('onCmdDataChange') cmdData: Array; @State pinLock: number = 0; - @State screenClass: object = {}; + @State fingerPositionY: number = 0; @StorageLink('cueWord') cueWord: string = globalThis.context.resourceManager .getStringSync($r('app.string.unified_authwidget_use_pwd')); @StorageLink('passwordArray') passwordArray: string[] = []; @@ -76,6 +74,7 @@ export default struct FullScreen { @State fingerText: string = globalThis.context.resourceManager .getStringSync($r('app.string.unified_authwidget_hint_inscreen_fp')); @StorageLink('screenLockDirection') screenLockDirection: number = 1; + @StorageLink('SYSTEM_STATUS_BAR_HEIGHT') SYSTEM_STATUS_BAR_HEIGHT: number = 0; @State controlType: ControlType = { jumpFinger: false, isLandscape: false, @@ -88,23 +87,9 @@ export default struct FullScreen { } @State screen: number[] = []; @State faceFingerLockArr: boolean[] = [false, false]; - @Consume isLandscape: boolean; + @StorageLink('IS_LANDSCAPE') IS_LANDSCAPE: boolean = false; @Consume underFingerPrint: boolean; - queryScreenInfo(): void { - try { - screen.getAllScreens((err, data) => { - if (err.code) { - LogUtils.error(TAG, 'Failed to get all screens. err: ' + err.code); - return; - } - this.screenClass = data[0]; - }); - } catch (error) { - LogUtils.error(TAG, 'getAllScreens catch error: ' + error?.code); - } - } - onCmdDataChange(num?: string): void { this.cmdData.length > 0 && this.cmdData.map((item) => { const { type,remainAttempts, lockoutDuration,sensorInfo} = item.payload; @@ -144,6 +129,9 @@ export default struct FullScreen { this.faceFingerLockArr[0] = false; } if (num === 'first') { + if (remainAttempts === 0) { + this.controlType.isShowFace = false; + } this.prompt = globalThis.context.resourceManager .getStringSync($r('app.string.unified_authwidget_hint_recognition')); } @@ -166,27 +154,40 @@ export default struct FullScreen { .getStringSync($r('app.string.unified_authwidget_use_pwd')); } if (remainAttempts) { - this.prompt = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_hint_fp_retry_s2')); - this.fingerText = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_hint_fp_retry_s2')); + if (this.controlType.jumpFinger) { + this.fingerText = globalThis.context.resourceManager + .getStringSync($r('app.string.unified_authwidget_hint_fp_retry_s2')); + } else { + this.prompt = globalThis.context.resourceManager + .getStringSync($r('app.string.unified_authwidget_use_pwd')); + } if (sensor) { if (sensor.sensorType === 'UNDER_SCREEN_SENSOR' || - sensor.sensorType === 'BOTH_SENSOR' || - sensor.sensorType === 'SensorType1') { - // 5: Residual number + sensor.sensorType === 'BOTH_SENSOR' || + sensor.sensorType === 'SensorType1') { if (num !== 'first' && remainAttempts > 0) { + setTimeout(() => { + AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFinger]); + }, NOTICE_DELAY); + } + if (num === 'first' && sensor.udSensorCenterYInThousandth / + this.screen[1] > Constants.fingerSensorPositionLine) { AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFinger]); } } } } if (remainAttempts === 0) { - this.prompt = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_title_number_failed_fp_forbidden')); - this.fingerText = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_title_number_failed_fp_forbidden')); + if (num === 'first') { + this.controlType.isShowFinger = false; + } else { + this.prompt = globalThis.context.resourceManager + .getStringSync($r('app.string.unified_authwidget_title_number_failed_fp_forbidden')); + this.fingerText = globalThis.context.resourceManager + .getStringSync($r('app.string.unified_authwidget_title_number_failed_fp_forbidden')); + } this.faceFingerLockArr[1] = true; + this.controlType.jumpFinger = false; } break; default: @@ -200,15 +201,11 @@ export default struct FullScreen { LogUtils.debug(TAG, 'aboutToAppear'); try { AppStorage.SetOrCreate('passwordArray', []); - this.queryScreenInfo(); if (this.cmdData && this.cmdData.length > 0) { this.onCmdDataChange('first'); } - if (this.controlType.isShowFace && this.controlType.isShowFinger) { - AuthUtils.getInstance() - .sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFace, Constants.noticeTypeFinger]); - return; - } + this.fingerPositionY = px2vp(this.fingerPosition.udSensorCenterYInThousandth * this.screen[1]) / THOUSANDTH + - this.SYSTEM_STATUS_BAR_HEIGHT - this.SYSTEM_STATUS_BAR_HEIGHT - px2vp(this.fingerPosition.udSensorRadiusInPx) if (this.controlType.isShowFace) { AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFace]); return; @@ -268,7 +265,7 @@ export default struct FullScreen { .fontColor($r('sys.color.ohos_id_color_primary_contrary')) .fontSize($r('sys.float.ohos_id_text_size_headline6')) .fontWeight(FontWeight.Medium) - } else if (this.controlType.isShowFace) { + } else if (this.controlType.isShowFace && !this.faceFingerLockArr[0]) { Image($r('app.media.white_faceID')) .id('faceImgCustomPwd') .width($r('app.float.image_small')) @@ -316,46 +313,67 @@ export default struct FullScreen { // 0: pin unlock if (this.pinLock === 0) { if (this.pinSubType === Constants.pinSix) { - List({ space: DIGITAL_PASSWORD_IC_DIAMETER }) { - ForEach(this.passwordArray, (item) => { - if ((!item || item === '') && item !== 0) { - ListItem() { - Button() - .border({ - color: Color.White, - style: BorderStyle.Solid, - width: 1 - }) - .borderRadius($r('app.float.input_btn_size')) - .width($r('app.float.input_btn_size')) - .height($r('app.float.input_btn_size')) - .type(ButtonType.Circle) - .backgroundColor(Color.Transparent) + Stack() { + List() { + ForEach(this.passwordArray, item => { + if ((!item || item === '') && item !== 0) { + ListItem() { + Button() + .border({ + color: Color.White, + style: BorderStyle.Solid, + width: 1 + }) + .borderRadius($r('app.float.input_btn_size')) + .width($r('app.float.input_btn_size')) + .height($r('app.float.input_btn_size')) + .type(ButtonType.Circle) + .backgroundColor(Color.Transparent) + } + .margin({ + left: $r('app.float.margin_12'), + right: $r('app.float.margin_12'), + top: $r('app.float.margin_14') + }) + } else { + ListItem() { + Button() + .borderRadius($r('app.float.input_btn_size')) + .width($r('app.float.input_btn_size')) + .height($r('app.float.input_btn_size')) + .type(ButtonType.Circle) + .backgroundColor($r('sys.color.ohos_id_color_text_primary_contrary')) + } + .margin({ + left: $r('app.float.margin_12'), + right: $r('app.float.margin_12'), + top: $r('app.float.margin_14') + }) } - .margin({ - left: $r('app.float.margin_12'), - right: $r('app.float.margin_12'), - top: $r('app.float.margin_14') + }) + } + .listDirection(Axis.Horizontal) + .height($r('app.float.input_height')) + + if (this.IS_LANDSCAPE) { + TextInput({ placeholder: '', text: this.passwordArray?.join('') }) + .onChange(async (value: string) => { + const arr = value?.replace(/[^\d]/g, '')?.split(''); + arr?.map((item, index) => { + this.passwordArray[index] = item; + }); + if (arr?.length === SIX_MAX_LENGTH) { + this.textValue = arr?.join(''); + AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypePin]); + } }) - } else { - ListItem() { - Button() - .borderRadius($r('app.float.input_btn_size')) - .width($r('app.float.input_btn_size')) - .height($r('app.float.input_btn_size')) - .type(ButtonType.Circle) - .backgroundColor($r('sys.color.ohos_id_color_text_primary_contrary')) - } - .margin({ - left: $r('app.float.margin_12'), - right: $r('app.float.margin_12'), - top: $r('app.float.margin_14') - }) - } - }) + .backgroundImageSize(ImageSize.Auto) + .maxLength(SIX_MAX_LENGTH) + .visibility(Visibility.Visible) + .opacity(0) + .caretColor('transparent') + } } - .listDirection(Axis.Horizontal) - .height($r('app.float.input_height')) } else if (this.pinSubType === Constants.pinNumber) { Stack() { @@ -382,12 +400,13 @@ export default struct FullScreen { .visibility(Visibility.Visible) .copyOption(CopyOptions.None) .maxLength(MAX_LENGTH) + .textAlign(TextAlign.Start) } } else if (this.pinSubType === Constants.pinMixed) { TextInput({ text: this.passwordObj }) .height($r('app.float.btn_height')) .type(InputType.Password) - .textAlign(TextAlign.Center) + .textAlign(TextAlign.Start) .copyOption(CopyOptions.None) .maxLength(MAX_LENGTH) .onSubmit(async (enterKey: EnterKeyType) => { @@ -425,7 +444,7 @@ export default struct FullScreen { // 0: pin unlock Column() { - if (!this.isLandscape && this.pinLock === 0 && this.pinSubType === Constants.pinSix) { + if (!this.IS_LANDSCAPE && this.pinLock === 0 && this.pinSubType === Constants.pinSix) { NumKeyBoard({ onKeyPress: (index, callback) => { let keyValue = this.numKeyboard[index].value; @@ -464,6 +483,7 @@ export default struct FullScreen { this.pinLock = 0; this.clearPassword(); globalThis.session?.terminateSelf?.(); + AuthUtils.getInstance().sendNotice(Constants.noticeEventCancel, globalThis?.wantParams?.type || []); } else if (keyValue === CALL_PHONE) { if (this.passwordArray.join('').length < PASSWORD_ARRAY_LENGTH) { return; @@ -484,26 +504,22 @@ export default struct FullScreen { // 1: pin lock Column() { - if (this.controlType.isShowFinger && this.pinLock !== 1) { - if (this.fingerPosition.sensorType !== 'OUT_OF_SCREEN_SENSOR' - && this.fingerPosition.sensorType !== 'NON_SENSOR') { + if (this.controlType.isShowFinger && this.pinLock !== 1 && !this.faceFingerLockArr[1]) { + if (this.fingerPosition.sensorType !== 'OUT_OF_SCREEN_SENSOR' && + this.fingerPosition.sensorType !== 'NON_SENSOR') { if (this.fingerPosition.sensorType === 'UNDER_SCREEN_SENSOR' || - this.fingerPosition.sensorType === 'BOTH_SENSOR' || - this.fingerPosition.sensorType === 'SensorType1') { + this.fingerPosition.sensorType === 'BOTH_SENSOR' || + this.fingerPosition.sensorType === 'SensorType1') { if (this.fingerPosition.udSensorCenterYInThousandth / - this.screen[1] > Constants.fingerSensorPositionLine && - !this.isLandscape) { + this.screen[1] > Constants.fingerSensorPositionLine && + !this.IS_LANDSCAPE) { Image($r('app.media.ic_unlock_fingerprint')) .id('fingerprintImgCustomPassword') .width(px2vp(this.fingerPosition.udSensorRadiusInPx)) .height(px2vp(this.fingerPosition.udSensorRadiusInPx)) - .position({ - x: px2vp(this.fingerPosition.udSensorCenterXInThousandth), - y: px2vp(this.fingerPosition.udSensorCenterYInThousandth) - }) - .onClick(() => { - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFinger]); - }) + .position({ y: px2vp(UNDER_FINGER) + - px2vp(this.screen[1]) + + px2vp(this.fingerPosition.udSensorCenterYInThousandth * this.screen[1] / THOUSANDTH) }) } else { Image($r('app.media.finger_white')) .id('fingerWhiteImgCustomPassword') @@ -511,7 +527,7 @@ export default struct FullScreen { .height($r('app.float.image_back_size')) .margin({ top: $r('app.float.input_btn_size') }) .onClick(() => { - if (this.isLandscape) { + if (this.IS_LANDSCAPE) { this.underFingerPrint = true; } else { this.controlType.jumpFinger = true; @@ -530,48 +546,49 @@ export default struct FullScreen { .width(Constants.fullContainerWidth) } else if (!this.controlType.isLandscape) { Column() { - Text(globalThis.wantParams?.title) + Text(this.fingerText) .id('titleFullScreen') .height($r('app.float.text_high')) - .fontColor($r('sys.color.ohos_id_color_text_primary')) - .fontSize($r('sys.float.ohos_id_text_size_sub_title2')) + .fontColor($r('sys.color.ohos_id_color_text_primary_contrary')) + .fontSize($r('sys.float.ohos_id_text_size_body1')) .fontWeight(FontWeight.Medium) - .position({ y: TITLE_POSITION }) - .width('100%') - .textAlign(TextAlign.Center) - Text(this.fingerText) - .height($r('app.float.text_high')) - .fontColor($r('sys.color.ohos_id_color_text_secondary')) - .fontSize($r('sys.float.ohos_id_text_size_body2')) .position({ y: (px2vp(this.fingerPosition.udSensorCenterYInThousandth * this.screen[1] / THOUSANDTH) - - FINGER_TEXT_POSITION - px2vp(FINGER_HIGH + this.fingerPosition.udSensorRadiusInPx)) + px2vp(FINGER_Y_POSITION) - FINGER_TEXT_POSITION - this.SYSTEM_STATUS_BAR_HEIGHT - px2vp(this.fingerPosition.udSensorRadiusInPx)) + }) + .width('100%') + .textAlign(TextAlign.Center) + Text($r('app.string.unified_authwidget_hint_inscreen_fp')) + .height($r('app.float.text_high')) + .fontColor($r('sys.color.ohos_id_color_text_primary_contrary')) + .fontSize($r('sys.float.ohos_id_text_size_body2')) + .fontWeight(FontWeight.Regular) + .position({ + y: (px2vp(this.fingerPosition.udSensorCenterYInThousandth * this.screen[1] / THOUSANDTH) - + px2vp(FINGER_Y_POSITION) - FINGER_HIGH - this.SYSTEM_STATUS_BAR_HEIGHT - px2vp(this.fingerPosition.udSensorRadiusInPx)) }) .width('100%') .textAlign(TextAlign.Center) .margin({ top: $r('app.float.padding_8') }) - Image($r('app.media.ic_unlock_fingerprint')) - .id('unlockFingerprintImgCustomPwd') - // radius - .width(px2vp(this.fingerPosition.udSensorRadiusInPx * 2)) - .height(px2vp(this.fingerPosition.udSensorRadiusInPx * 2)) - .position({ - x: (px2vp(this.fingerPosition.udSensorCenterXInThousandth * this.screen[0] / THOUSANDTH) - - px2vp(FINGER_X_POSITION + this.fingerPosition.udSensorRadiusInPx)), - y: (px2vp(this.fingerPosition.udSensorCenterYInThousandth * this.screen[1] / THOUSANDTH) - - FINGER_Y_POSITION - px2vp(DEFAULT_SIZE + this.fingerPosition.udSensorRadiusInPx)) - }) - .onClick(() => { - if (this.prompt !== globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_title_number_failed_fp_forbidden'))) { - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFinger]); - } - }) + Column() { + Image($r('app.media.ic_unlock_fingerprint')) + .id('unlockFingerprintImgCustomPwd') + // radius + .width(px2vp(this.fingerPosition.udSensorRadiusInPx * 2)) + .height(px2vp(this.fingerPosition.udSensorRadiusInPx * 2)) + }.width('100%') + .position({ y: this.fingerPositionY }) + .justifyContent(FlexAlign.Center) + .alignItems(HorizontalAlign.Center) + Button($r('app.string.unified_authwidget_cancel'), { type: ButtonType.Normal, stateEffect: true }) - .margin({ bottom: $r('app.float.three_hundred_size'), left: 'auto', right: 'auto' }) + .width('100%') + .position({ + y: (px2vp(this.fingerPosition.udSensorCenterYInThousandth * this.screen[1] / THOUSANDTH)) + }) .backgroundColor(Color.Transparent) .fontColor($r('sys.color.ohos_id_color_text_primary_contrary')) .onClick(() => { @@ -579,6 +596,7 @@ export default struct FullScreen { }) } .justifyContent(FlexAlign.End) + .alignItems(HorizontalAlign.Center) .height('100%') .width('100%') } diff --git a/entry/src/main/ets/common/components/PassWord.ets b/entry/src/main/ets/common/components/PassWord.ets index 254557c..bd79df6 100644 --- a/entry/src/main/ets/common/components/PassWord.ets +++ b/entry/src/main/ets/common/components/PassWord.ets @@ -64,7 +64,7 @@ export default struct PassWord { left: $r('app.float.digital_password_mask_height'), right: $r('app.float.digital_password_mask_height') }) - .textAlign(TextAlign.Center) + .textAlign(TextAlign.Start) .fontColor($r('sys.color.ohos_id_color_text_primary')) .border({ width: this.inputValue === ' ' ? '' : $r('app.float.input_border'), diff --git a/entry/src/main/ets/common/components/Pwd.ets b/entry/src/main/ets/common/components/Pwd.ets deleted file mode 100644 index e808eef..0000000 --- a/entry/src/main/ets/common/components/Pwd.ets +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Constants from '../../common/vm/Constants'; - -@Component -export default struct Pwd { - @Link pinSubType: string; - @Link @Watch('onTextValueChange') textValue: string; - @Link inputValue: string; - @Link isEdit: boolean; - @StorageLink('passwordArrNumber') passwordArrNumber: string[] = []; - controller: CustomDialogController; - cancel: () => void; - confirm: () => void; - - onTextValueChange(): void { - this.passwordArrNumber = this.textValue.replace(/[^\d]/g, '').split(''); - } - - clearPassword(): void { - this.passwordArrNumber = []; - this.textValue = ''; - this.inputValue = ' '; - } - - aboutToDisappear(): void { - this.clearPassword(); - } - - build() { - Column() { - Text(globalThis.wantParams?.title) - .margin({ top: $r('app.float.content_padding_top') }) - .fontSize($r('sys.float.ohos_id_text_size_body1')) - .fontColor($r('sys.color.ohos_id_color_text_primary')) - .fontWeight(FontWeight.Medium) - .id('titlePwdAuth') - TextInput({ - placeholder: '', - text: this.pinSubType === Constants.pinNumber ? this.passwordArrNumber.join('') : this.textValue - }) - .maxLength(32) - .enabled(this.isEdit) - .height($r('app.float.input_height')) - .type(InputType.Password) - .margin({ - top: $r('app.float.content_padding'), - left: $r('app.float.digitalpsd_passwdmask_height'), - right: $r('app.float.digitalpsd_passwdmask_height') - }) - .textAlign(TextAlign.Center) - .fontColor($r('sys.color.ohos_id_color_text_primary')) - .border({ - width: this.inputValue === ' ' ? '' : $r('app.float.input_border'), - color: this.inputValue === ' ' ? '' : ($r('sys.color.ohos_id_color_warning')) - }) - .onChange((value: string) => { - if (this.pinSubType === Constants.pinNumber) { - this.passwordArrNumber = value.replace(/[^\d]/g, '').split(''); - } - this.textValue = value; - }) - .id('pinInputMix') - Text(this.inputValue) - .fontSize($r('sys.float.ohos_id_text_size_body2')) - .margin({ top: $r('app.float.element_margin') }) - .fontColor($r('sys.color.ohos_id_color_warning')) - } - } -} \ No newline at end of file diff --git a/entry/src/main/ets/common/components/SixPassword.ets b/entry/src/main/ets/common/components/SixPassword.ets index e7c17d3..9d2d29a 100644 --- a/entry/src/main/ets/common/components/SixPassword.ets +++ b/entry/src/main/ets/common/components/SixPassword.ets @@ -20,9 +20,24 @@ const MAX_LENGTH = 6; @Component export default struct SixPassword { - @Link textValue: string; @Link inputValue: string; @Link isEdit: boolean; + @Link @Watch('onTextValueChange') textValue: string; + @StorageLink('passwordArrayNumber') passwordArrayNumber: string[] = []; + + onTextValueChange(): void { + this.passwordArrayNumber = this.textValue.replace(/[^\d]/g, '').split(''); + } + + clearPassword(): void { + this.passwordArrayNumber = []; + this.textValue = ''; + this.inputValue = ' '; + } + + aboutToDisappear(): void { + this.clearPassword(); + } build() { Column() { @@ -34,20 +49,6 @@ export default struct SixPassword { .fontWeight(FontWeight.Medium) Column() { Stack() { - TextInput({ placeholder: '', text: this.textValue }) - .onChange(async (value: string) => { - this.textValue = value - if (value.length === MAX_LENGTH) { - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypePin]); - } - }) - .backgroundImageSize(ImageSize.Auto) - .enabled(this.isEdit) - .maxLength(MAX_LENGTH) - .visibility(Visibility.Visible) - .opacity(0) - .caretColor('transparent') - .id('pinSix') List({ space: 4 }) { ForEach(['', '', '', '', '', ''], (item, index) => { ListItem() { @@ -75,6 +76,21 @@ export default struct SixPassword { .listDirection(Axis.Horizontal) .height($r('app.float.input_height')) + TextInput({ placeholder: '', text: this.passwordArrayNumber?.join('') }) + .onChange(async (value: string) => { + this.passwordArrayNumber = value?.replace(/[^\d]/g, '')?.split(''); + this.textValue = this.passwordArrayNumber?.join(''); + if (this.textValue?.length === MAX_LENGTH) { + AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypePin]); + } + }) + .backgroundImageSize(ImageSize.Auto) + .enabled(this.isEdit) + .maxLength(MAX_LENGTH) + .visibility(Visibility.Visible) + .opacity(0) + .caretColor('transparent') + .id('pinSix') } } .margin({ top: $r('app.float.content_padding') }) diff --git a/entry/src/main/ets/common/components/SixPwd.ets b/entry/src/main/ets/common/components/SixPwd.ets deleted file mode 100644 index 8102f35..0000000 --- a/entry/src/main/ets/common/components/SixPwd.ets +++ /dev/null @@ -1,149 +0,0 @@ -/** - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import userAuth from '@ohos.userIAM.userAuth'; -import LogUtils from '../../common/utils/LogUtils'; -import Constants from '../../common/vm/Constants'; -import AuthUtils from '../utils/AuthUtils'; -import TimeUtils from '../utils/TimeUtils'; - -const TAG = 'SixPwd'; -const INTERVAL = 1000; - -@Component -export default struct SixPwd { - @Link textValue: string; - @Link inputValue: string; - @Link isEdit: boolean; - - countTime(freezingTime): void { - const TRY_AGAIN = globalThis.context.resourceManager.getStringSync($r('app.string.unified_authwidget_postretry')); - let promptText: string = ''; - let freezingMillisecond = freezingTime; - if (freezingMillisecond > 0) { - promptText = TimeUtils.getFreezingTimeNm(freezingMillisecond, globalThis.context); - promptText = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_many_failures')) + promptText + TRY_AGAIN; - setTimeout(this.countTime.bind(this), INTERVAL, freezingTime - INTERVAL); - } else { - promptText = ' '; - this.isEdit = true; - } - this.inputValue = promptText; - } - - build() { - Column() { - Text(globalThis.wantParams?.title) - .margin({ top: $r('app.float.content_padding_top') }) - .fontSize($r('sys.float.ohos_id_text_size_body1')) - .fontColor($r('sys.color.ohos_id_color_text_primary')) - .fontWeight(FontWeight.Medium) - Column() { - Stack() { - TextInput({ placeholder: '', text: this.textValue }) - .onChange(async (value: string) => { - this.textValue = value - if (value.length === 6) { - // check callback - let userAuthWidgetMgr; - try { - let that = this; - LogUtils.i(TAG, 'getUserAuthWidgetMgr start'); - userAuthWidgetMgr = await userAuth.getUserAuthWidgetMgr(Constants.userAuthWidgetMgrVersion); - userAuthWidgetMgr.on('command', { - callback: function (result) { - LogUtils.i(TAG, 'userAuthWidgetMgr onCommand result: ' + JSON.stringify(result)); - const cmdData = JSON.parse(result?.cmdData) - if (cmdData?.cmd?.[0]?.payload?.result === Constants.userAuthWidgetMgrSuccess) { - // success - globalThis.session?.terminateSelf?.(); - } else { - // fail frequency - const frequency = cmdData?.cmd?.[0]?.payload?.remainAttempts; - if (frequency) { - that.inputValue = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_hint_pwd_error')); - that.textValue = ''; - if (frequency < 3) { - that.inputValue = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_pwd_error_can_try')) - + frequency + globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_frequency')); - } - return; - } - // countdown - const time = cmdData?.cmd?.[0]?.payload?.lockoutDuration; - if (frequency === 0 && time) { - that.countTime(time); - that.isEdit = false; - that.textValue = ''; - return; - } - that.inputValue = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_hint_pwd_error')); - that.textValue = ''; - } - } - }); - LogUtils.i(TAG, 'getUserAuthWidgetMgr success'); - } catch (error) { - LogUtils.e(TAG, 'getUserAuthWidgetMgr catch error: ' + JSON.stringify(error)); - } - // check - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypePin]); - } - }) - .backgroundImageSize(ImageSize.Auto) - .enabled(this.isEdit) - .maxLength(6) - .visibility(Visibility.Visible) - .opacity(0) - .caretColor('transparent') - .id('pinSix') - List({ space: 4 }) { - ForEach(['', '', '', '', '', ''], (item, index) => { - ListItem() { - Button() - .border({ - color: Color.Black, - style: BorderStyle.Solid, - width: this.textValue.length !== 0 && index < this.textValue.length ? '6vp' : 1 - }) - .type(ButtonType.Circle) - .backgroundColor(Color.White) - .width($r('app.float.input_btn_size')) - .height($r('app.float.input_btn_size')) - .borderRadius($r('app.float.input_btn_size')) - .margin(index > 0 ? { left: $r('app.float.input_btn_padding_around') } : {}) - .focusable(true) - } - }, item => item) - } - .listDirection(Axis.Horizontal) - .height($r('app.float.input_btn_size')) - } - } - .margin({ top: $r('app.float.content_padding') }) - .padding({ top: $r('app.float.input_btn_padding_up_down'), bottom: $r('app.float.input_btn_padding_up_down') }) - - Text(this.inputValue) - .fontSize($r('sys.float.ohos_id_text_size_body2')) - .margin({ top: $r('app.float.element_margin') }) - .fontColor($r('sys.color.ohos_id_color_warning')) - } - } -} \ No newline at end of file diff --git a/entry/src/main/ets/common/vm/Constants.ts b/entry/src/main/ets/common/vm/Constants.ts index 8665d3b..576c2eb 100644 --- a/entry/src/main/ets/common/vm/Constants.ts +++ b/entry/src/main/ets/common/vm/Constants.ts @@ -14,7 +14,7 @@ */ export default class Constants { - static deviceDpi = ['360vp', '780vp']; + static deviceDpi = ['520vp', '840vp']; // Pin type static pinSix = 'PIN_SIX'; @@ -32,12 +32,15 @@ export default class Constants { // command result success static userAuthWidgetMgrSuccess = 0; - // sendNotice param: version + // sendNotice params + // version static noticeVersion = '1'; // type static noticeTypePin = 'pin'; static noticeTypeFace = 'face'; static noticeTypeFinger = 'fingerprint'; + // event cancel + static noticeEventCancel = 'EVENT_AUTH_USER_CANCEL'; static fingerSensorPositionLine = 0.75; diff --git a/entry/src/main/ets/mainability/MainAbility.ts b/entry/src/main/ets/mainability/MainAbility.ts deleted file mode 100644 index b78b955..0000000 --- a/entry/src/main/ets/mainability/MainAbility.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import LogUtils from '../common/utils/LogUtils'; -import UIAbility from '@ohos.app.ability.UIAbility'; -import window from '@ohos.window'; - -const TAG = 'MainAbility'; - -export default class MainAbility extends UIAbility { - onCreate(): void { - LogUtils.i(TAG, 'Ability onCreate'); - } - - onDestroy(): void | Promise { - LogUtils.i(TAG, 'Ability onDestroy'); - } - - onWindowStageCreate(windowStage: window.WindowStage): void { - LogUtils.i(TAG, 'Ability onWindowStageCreate'); - - windowStage.loadContent('pages/Index', (err, data) => { - if (err.code) { - LogUtils.e(TAG, 'Failed to load the content. Cause: %{public}s' + JSON.stringify(err) ?? ''); - return; - } - LogUtils.i(TAG, 'Succeeded in loading the content. Data: %{public}s' + JSON.stringify(data) ?? ''); - }); - } - - onWindowStageDestroy(): void { - LogUtils.i(TAG, 'Ability onWindowStageDestroy'); - } - - onForeground(): void { - LogUtils.i(TAG, 'Ability onForeground'); - } - - onBackground(): void { - LogUtils.i(TAG, 'Ability onBackground'); - } -} diff --git a/entry/src/main/ets/pages/Index.ets b/entry/src/main/ets/pages/Index.ets index a2f1256..7df425e 100644 --- a/entry/src/main/ets/pages/Index.ets +++ b/entry/src/main/ets/pages/Index.ets @@ -26,7 +26,7 @@ import PasswordAuth from './components/PasswordAuth'; const DEFAULT_SIZE = 72; const FIVE_SECOND = 5000; -const LAND_SCAPE = 2; +const LANDSCAPE = 2; const TAG = 'Index'; let userAuthWidgetMgr; @@ -41,7 +41,7 @@ struct Index { @State dialogType: DialogType = DialogType.ALL; @State windowModeType: string = 'DIALOG_BOX'; @State cmdData: Array = []; - @Provide isLandscape: boolean = false; + @State isLandscape: boolean = false; @Provide underFingerPrint: boolean = false; @State loadFlag: boolean = false; @@ -54,7 +54,9 @@ struct Index { return; } LogUtils.debug(TAG, ' get all screens. result:-- ' + JSON.stringify(data)); - this.isLandscape = data[0].orientation === LAND_SCAPE; + this.isLandscape = data[0]?.orientation === LANDSCAPE + || data[0]?.supportedModeInfo[0]?.width > data[0]?.supportedModeInfo[0]?.height; + AppStorage.SetOrCreate('IS_LANDSCAPE', this.isLandscape); LogUtils.debug(TAG, 'globalThis.wantParams: ' + JSON.stringify(globalThis.wantParams)); if (globalThis.wantParams) { this.getParams(globalThis.wantParams); @@ -126,6 +128,7 @@ struct Index { aboutToAppear(): void { LogUtils.debug(TAG, 'aboutToAppear'); + FuncUtils.getWindowHeight(); this.onScreenChange(); } @@ -142,7 +145,6 @@ struct Index { getParams(result): void { LogUtils.info(TAG, 'getParams'); - LogUtils.info(TAG, 'dengjiewen msg test'); const { pinSubType, windowModeType, cmd, type, widgetContextId } = result; this.pinSubType = pinSubType; const newType = type && type.map(item => { @@ -220,8 +222,6 @@ struct Index { } } } - }.onAreaChange(() => { - FuncUtils.getWindowHeight(); - }) + } } } \ No newline at end of file diff --git a/entry/src/main/ets/pages/components/CustomPassword.ets b/entry/src/main/ets/pages/components/CustomPassword.ets index de65bd9..d6b5d97 100644 --- a/entry/src/main/ets/pages/components/CustomPassword.ets +++ b/entry/src/main/ets/pages/components/CustomPassword.ets @@ -19,6 +19,7 @@ import FullScreen from '../../common/components/FullScreen'; import FuncUtils from '../../common/utils/FuncUtils'; import LogUtils from '../../common/utils/LogUtils'; import Constants from '../../common/vm/Constants'; +import AuthUtils from '../../common/utils/AuthUtils'; const TAG = 'CustomPassword'; const BLUR_OPACITY = 0.5; @@ -36,7 +37,7 @@ export default struct CustomPassword { @Link cmdData: []; @State isBackTouched: boolean = false @State @Watch('onTextValueChange') textValue: string = ''; - @Consume isLandscape: boolean; + @StorageLink('IS_LANDSCAPE') IS_LANDSCAPE: boolean = false; @StorageLink('SYSTEM_STATUS_BAR_HEIGHT') SYSTEM_STATUS_BAR_HEIGHT: number = 0; @StorageLink('SYSTEM_NAVIGATION_BAR_HEIGHT') SYSTEM_NAVIGATION_BAR_HEIGHT: number = 0; @@ -90,6 +91,7 @@ export default struct CustomPassword { ? $r('sys.color.ohos_id_color_hover') : Color.Transparent) .onClick(() => { globalThis.session?.terminateSelf?.(); + AuthUtils.getInstance().sendNotice(Constants.noticeEventCancel, globalThis?.wantParams?.type || []); }) .onTouch((event: TouchEvent) => { if (event.type === TouchType.Down) { @@ -102,16 +104,15 @@ export default struct CustomPassword { } GridRow({ - columns: 8, - gutter: { x: 5, y: 10 }, + columns: { xs: 4, sm: 4, md: 8, lg: 12 }, + gutter: { x: 24, y: 24 }, breakpoints: { value: Constants.deviceDpi, reference: BreakpointsReference.WindowSize }, direction: GridRowDirection.Row }) { - GridCol({ span: { xs: 0, sm: 1, md: 1, lg: 1 } }) - .visibility(Visibility.Hidden) GridCol({ - span: { xs: 8, sm: 6, md: 6, lg: 6 }, + span: { xs: 4, sm: 4, md: 4, lg: 6 }, + offset: { md: 2, lg: 3 }, }) { FullScreen({ textValue: $textValue, @@ -122,7 +123,7 @@ export default struct CustomPassword { } } } - .padding(this.isLandscape + .padding(this.IS_LANDSCAPE ? PADDING_ZERO : { top: this.SYSTEM_STATUS_BAR_HEIGHT, bottom: this.SYSTEM_NAVIGATION_BAR_HEIGHT }) .justifyContent(FlexAlign.SpaceBetween) diff --git a/entry/src/main/ets/pages/components/FaceAuth.ets b/entry/src/main/ets/pages/components/FaceAuth.ets index deaa9bf..95d2e26 100644 --- a/entry/src/main/ets/pages/components/FaceAuth.ets +++ b/entry/src/main/ets/pages/components/FaceAuth.ets @@ -12,7 +12,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import screen from '@ohos.screen'; import account_osAccount from '@ohos.account.osAccount'; import display from '@ohos.display'; import util from '@ohos.util'; @@ -38,6 +37,7 @@ const SIX_PIN = 5; const SINGLE_FACE = 6; const SCREEN_LAND = 1; const SCREEN_PORTRAIT = 2; +const NOTICE_DELAY = 500; let pinData = ''; @Component @@ -46,6 +46,7 @@ export default struct FaceAuth { .getStringSync($r('app.string.unified_authwidget_hint_recognition')); @State @Watch('onTextValueChange') textValue: string = ''; @Link @Watch('onCmdDataChange') cmdData: Array; + @StorageLink('IS_LANDSCAPE') IS_LANDSCAPE: boolean = false; @State isEdit: boolean = true; // 0:six number 1:arbitrary character 2:arbitrary number @Link type: string; @@ -62,7 +63,7 @@ export default struct FaceAuth { } @State screen: number[] = []; @State faceLock: boolean = false; - @Consume isLandscape: boolean; + @State fingerLock: boolean = false; @StorageLink('SYSTEM_NAVIGATION_BAR_HEIGHT') SYSTEM_NAVIGATION_BAR_HEIGHT: number = 0; countTime(freezingTime): void { @@ -125,15 +126,20 @@ export default struct FaceAuth { } } - send(): void { - if (this.prompt === globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_hint_face_verify_fail_click_retry_s1'))) { + sendFaceEvent(): void { + if (!this.faceLock) { this.prompt = globalThis.context.resourceManager .getStringSync($r('app.string.unified_authwidget_hint_recognition')); AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFace]); } } + sendFingerEvent(): void { + if (!this.fingerLock) { + AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFinger]); + } + } + onTextValueChange(): void { pinData = this.textValue; } @@ -219,20 +225,13 @@ export default struct FaceAuth { default: if ((JSON.parse(sensorInfo) .udSensorCenterYInThousandth / displayClass.height < Constants.fingerSensorPositionLine)) { - try { - await screen.getAllScreens((err, data) => { - if (err.code) { - LogUtils.error(TAG, 'Failed to get all screens. err: ' + err.code); - return; - } - if (data[0].orientation !== SCREEN_PORTRAIT && ![SIX_PIN, MULTI_PIN].includes(this.dialogTypeFlag)) { - this.screenType = SCREEN_LAND; - } else { - this.screenType = SCREEN_PORTRAIT; - } - }); - } catch (error) { - LogUtils.error(TAG, 'getAllScreens catch error: ' + error?.code); + if (!this.IS_LANDSCAPE && ![SIX_PIN, MULTI_PIN].includes(this.dialogTypeFlag)) { + this.screenType = SCREEN_LAND; + } + } else if ((JSON.parse(sensorInfo) + .udSensorCenterYInThousandth / displayClass.height > Constants.fingerSensorPositionLine)) { + if (!this.IS_LANDSCAPE && ![SIX_PIN, MULTI_PIN].includes(this.dialogTypeFlag)) { + this.screenType = SCREEN_PORTRAIT; } } break; @@ -241,8 +240,11 @@ export default struct FaceAuth { if (remainAttempts) { this.prompt = globalThis.context.resourceManager .getStringSync($r('app.string.unified_authwidget_hint_fp_retry_s2')); + this.fingerLock = false; if (num !== 'first' && remainAttempts > 0) { - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFinger]); + setTimeout(() => { + AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFinger]); + }, NOTICE_DELAY); } } if (num === 'first') { @@ -252,6 +254,7 @@ export default struct FaceAuth { if (remainAttempts === 0) { this.prompt = globalThis.context.resourceManager .getStringSync($r('app.string.unified_authwidget_title_number_failed_fp_forbidden')); + this.fingerLock = true; this.toPin(); } break; @@ -262,19 +265,23 @@ export default struct FaceAuth { }) } + handleCancel(): void { + AuthUtils.getInstance().sendNotice(Constants.noticeEventCancel, globalThis?.wantParams?.type || []); + globalThis.session?.terminateSelf?.(); + } + build() { Column() { GridRow({ - columns: 8, - gutter: { x: 5, y: 10 }, + columns: { xs: 4, sm: 4, md: 8, lg: 12 }, + gutter: { x: 24, y: 24 }, breakpoints: { value: Constants.deviceDpi, reference: BreakpointsReference.WindowSize }, direction: GridRowDirection.Row }) { - GridCol({ span: { xs: 0, sm: 0, md: 2, lg: 2 } }) - .visibility(Visibility.Hidden) GridCol({ - span: { xs: 8, sm: 8, md: 4, lg: 4 }, + span: { xs: 4, sm: 4, md: 4, lg: 6 }, + offset: { md: 2, lg: 3 }, }) { Column() { if (this.dialogTypeFlag === PIN_FACE) { @@ -296,13 +303,13 @@ export default struct FaceAuth { .height($r('app.float.image_size')) .colorBlend($r('sys.color.ohos_id_color_activated')) .onClick(() => { - this.send(); + this.sendFaceEvent(); }) Text(this.prompt).fontSize($r('sys.float.ohos_id_text_size_body2')) .fontColor(this.onFontColor(this.prompt, globalThis.context)) .height($r('app.float.size_24')) .onClick(() => { - this.send(); + this.sendFaceEvent(); }) Row() { Column() { @@ -316,7 +323,7 @@ export default struct FaceAuth { .fontWeight(FontWeight.Medium) .backgroundColor(Color.Transparent) .onClick(() => { - globalThis.session?.terminateSelf?.(); + this.handleCancel(); }) }.width(Constants.halfContainerWidth) @@ -346,81 +353,67 @@ export default struct FaceAuth { .margin({ top: $r('app.float.element_margin'), bottom: $r('app.float.content_padding') }) } if (this.dialogTypeFlag === PIN_FACE_FINGER && this.screenType === SCREEN_PORTRAIT) { - if (!this.isLandscape) { - // The first form of facial fingerprint password - Flex({ justifyContent: FlexAlign.SpaceBetween }) { - Image($r('app.media.ic_public_cancel')) - .id('cancelImgAllFaceAuth') - .width($r('app.float.digital_password_mask_height')) - .height($r('app.float.digital_password_mask_height')) - .margin({ - top: $r('app.float.digital_password_mask_height'), - left: $r('app.float.digital_password_mask_height') - }) - .onClick(() => { - this.textValue = ''; - globalThis.session?.terminateSelf?.(); - }) - Button($r('app.string.unified_authwidget_usepwd')) - .id('usePwdBtnAllFaceAuth') - .backgroundColor(Color.White) - .height($r('app.float.digital_password_mask_height')) - .padding(0) - .margin({ - top: $r('app.float.digital_password_mask_height'), - right: $r('app.float.digital_password_mask_height') - }) - .fontColor($r('sys.color.ohos_id_color_activated')) - .fontSize($r('sys.float.ohos_id_text_size_body1')) - .fontWeight(FontWeight.Medium) - .onClick(() => { - this.inputValue = ' '; - this.toPin(); - }) - } - - Image($r('app.media.error_faceID')) - .id('imgAllFaceAuth') - .width($r('app.float.image_small')) - .height($r('app.float.image_small')) - .margin({ top: $r('app.float.content_padding'), bottom: $r('app.float.content_padding') }) - .colorBlend($r('sys.color.ohos_id_color_activated')) - .onClick(() => { - if (!this.faceLock) { - this.prompt = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_hint_recognition')); - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFace]); - } - }) - Text(globalThis.wantParams.title).fontSize($r('sys.float.ohos_id_text_size_body1')) - .fontColor($r('sys.color.ohos_id_color_text_primary')) - Text(this.prompt) - .id('resetPromptTextAllFaceAuth') - .margin({ top: $r('app.float.element_margin') }) - .height($r('app.float.size_24')) - .fontSize($r('sys.float.ohos_id_text_size_body2')) - .fontColor(this.onFontColor(this.prompt, globalThis.context)) - .onClick(() => { - this.prompt = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_hint_recognition')); - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFace]); - }) - Image($r('app.media.ic_blue_fingerprint')) - .id('blueFingerprintImgAllFaceAuth') - // radius - .width(px2vp(this.fingerPosition.udSensorRadiusInPx * 2)) - .height(px2vp(this.fingerPosition.udSensorRadiusInPx * 2)) + // The first form of facial fingerprint password + Flex({ justifyContent: FlexAlign.SpaceBetween }) { + Image($r('app.media.ic_public_cancel')) + .id('cancelImgAllFaceAuth') + .width($r('app.float.digital_password_mask_height')) + .height($r('app.float.digital_password_mask_height')) .margin({ top: $r('app.float.digital_password_mask_height'), - bottom: $r('app.float.digital_password_mask_height') + left: $r('app.float.digital_password_mask_height') }) .onClick(() => { - if (this.prompt !== globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_title_number_failed_fp_forbidden'))) { - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFinger]); - } + this.textValue = ''; + this.handleCancel(); + }) + Button($r('app.string.unified_authwidget_usepwd')) + .id('usePwdBtnAllFaceAuth') + .backgroundColor(Color.White) + .height($r('app.float.digital_password_mask_height')) + .padding(0) + .margin({ + top: $r('app.float.digital_password_mask_height'), + right: $r('app.float.digital_password_mask_height') + }) + .fontColor($r('sys.color.ohos_id_color_activated')) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontWeight(FontWeight.Medium) + .onClick(() => { + this.inputValue = ' '; + this.toPin(); }) } + + Image($r('app.media.error_faceID')) + .id('imgAllFaceAuth') + .width($r('app.float.image_small')) + .height($r('app.float.image_small')) + .margin({ top: $r('app.float.content_padding'), bottom: $r('app.float.content_padding') }) + .colorBlend($r('sys.color.ohos_id_color_activated')) + .onClick(() => { + this.sendFaceEvent(); + }) + Text(globalThis.wantParams.title).fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + Text(this.prompt) + .id('resetPromptTextAllFaceAuth') + .margin({ top: $r('app.float.element_margin') }) + .height($r('app.float.size_24')) + .fontSize($r('sys.float.ohos_id_text_size_body2')) + .fontColor(this.onFontColor(this.prompt, globalThis.context)) + Image($r('app.media.ic_blue_fingerprint')) + .id('blueFingerprintImgAllFaceAuth') + // radius + .width(px2vp(this.fingerPosition.udSensorRadiusInPx * 2)) + .height(px2vp(this.fingerPosition.udSensorRadiusInPx * 2)) + .margin({ + top: $r('app.float.digital_password_mask_height'), + bottom: $r('app.float.digital_password_mask_height') + }) + .onClick(() => { + this.sendFingerEvent(); + }) } if (this.dialogTypeFlag === PIN_FACE_FINGER && this.screenType === SCREEN_LAND) { // Facial fingerprint password, second form @@ -430,6 +423,9 @@ export default struct FaceAuth { .height($r('app.float.image_small')) .margin({ top: $r('app.float.content_padding_top'), bottom: $r('app.float.content_padding') }) .colorBlend($r('sys.color.ohos_id_color_activated')) + .onClick(() => { + this.sendFaceEvent(); + }) Text(globalThis.wantParams.title).fontSize($r('sys.float.ohos_id_text_size_body1')) .fontColor($r('sys.color.ohos_id_color_text_primary')) @@ -439,14 +435,17 @@ export default struct FaceAuth { .width(px2vp(this.fingerPosition.udSensorRadiusInPx * 2)) .height(px2vp(this.fingerPosition.udSensorRadiusInPx * 2)) .margin({ top: $r('app.float.content_padding') }) - .onClick(() => { - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFinger]); - }) Text(this.prompt) .margin({ top: $r('app.float.content_padding') }) .fontSize($r('sys.float.ohos_id_text_size_body2')) .height($r('app.float.size_24')) .fontColor(this.onFontColor(this.prompt, globalThis.context)) + .onClick(() => { + if (globalThis?.context?.resourceManager + ?.getStringSync($r('app.string.unified_authwidget_hint_face_verify_fail_click_retry_s1'))) { + this.sendFaceEvent(); + } + }) Row() { Column() { Button($r('app.string.unified_authwidget_cancel'), { stateEffect: true }) @@ -459,7 +458,7 @@ export default struct FaceAuth { .fontWeight(FontWeight.Medium) .backgroundColor(Color.Transparent) .onClick(() => { - globalThis.session?.terminateSelf?.(); + this.handleCancel(); this.textValue = ''; }) }.width(Constants.halfContainerWidth) @@ -511,7 +510,7 @@ export default struct FaceAuth { .backgroundColor(Color.Transparent) .onClick(() => { this.textValue = ''; - globalThis.session?.terminateSelf?.(); + this.handleCancel(); }) }.width(Constants.halfContainerWidth) @@ -551,7 +550,7 @@ export default struct FaceAuth { Button($r('app.string.unified_authwidget_cancel'), { stateEffect: true }) .id('cancelBtnSixPinFaceAuth') .onClick(() => { - globalThis.session?.terminateSelf?.(); + this.handleCancel(); this.textValue = ''; }) .backgroundColor(Color.Transparent) @@ -583,7 +582,7 @@ export default struct FaceAuth { .height($r('app.float.image_size')) .colorBlend($r('sys.color.ohos_id_color_activated')) .onClick(() => { - this.send(); + this.sendFaceEvent(); }) Text(this.prompt) .fontSize($r('sys.float.ohos_id_text_size_body2')) @@ -591,7 +590,7 @@ export default struct FaceAuth { .height($r('app.float.size_24')) .fontColor(this.onFontColor(this.prompt, globalThis.context)) .onClick(() => { - this.send(); + this.sendFaceEvent(); }) if (!globalThis.wantParams?.navigationButtonText) { Row() { @@ -599,7 +598,7 @@ export default struct FaceAuth { Button($r('app.string.unified_authwidget_cancel'), { stateEffect: true }) .id('cancelBtnAllFace') .onClick(() => { - globalThis.session?.terminateSelf?.(); + this.handleCancel(); }) .backgroundColor(Color.Transparent) .height($r('app.float.btn_height')) @@ -624,7 +623,7 @@ export default struct FaceAuth { .fontWeight(FontWeight.Medium) .backgroundColor(Color.Transparent) .onClick(() => { - globalThis.session?.terminateSelf?.(); + this.handleCancel(); }) }.width(Constants.halfContainerWidth) @@ -636,6 +635,7 @@ export default struct FaceAuth { Column() { Button(globalThis.wantParams?.navigationButtonText) .onClick(() => { + AuthUtils.getInstance().sendNotice('EVENT_AUTH_USER_NAVIGATION', [Constants.noticeTypeFace]); globalThis.session?.terminateSelf?.(); }) .margin({ right: $r('app.float.content_padding') }) @@ -654,7 +654,7 @@ export default struct FaceAuth { } .position({ y: this.fingerPosition.udSensorCenterYInThousandth / this.screen[1] < Constants.fingerSensorPositionLine && - !this.isLandscape + !this.IS_LANDSCAPE ? (px2vp(this.screen[1]) * this.fingerPosition.udSensorCenterYInThousandth / THOUSANDTH) - px2vp(this.screen[1]) + this.SYSTEM_NAVIGATION_BAR_HEIGHT - MARGIN_TOP - px2vp(this.fingerPosition.udSensorRadiusInPx) diff --git a/entry/src/main/ets/pages/components/FingerprintAuth.ets b/entry/src/main/ets/pages/components/FingerprintAuth.ets index 959036a..c455e85 100644 --- a/entry/src/main/ets/pages/components/FingerprintAuth.ets +++ b/entry/src/main/ets/pages/components/FingerprintAuth.ets @@ -29,9 +29,10 @@ const INTERVAL = 1000; let pinAuthManager; let pinData = ''; const THOUSANDTH = 1000; -const NORMAL_POSITION = -260; -const OUT_SENSOR = -292 -const MARGIN_TOP = 66 +const BOTTOM_BUTTON = 56; +const BOTTOM_TEXT = 20; +const PADDING_8 = 8; +const PADDING_24 = 24; const OFF_SCREEN_FINGER = 3; const SINGLE_FINGER = 1; const PIN_FINGER = 2; @@ -40,6 +41,7 @@ const MULTI_PIN = 5; const RADIUS = 2; const PIN_FAIL_TIP = 3; const AUTH_LOCK = 0; +const NOTICE_DELAY = 500; @Component export default struct FingerprintAuth { @@ -53,14 +55,16 @@ export default struct FingerprintAuth { @State isEdit: boolean = true; @State inputValue: string = ''; @State state: number = 0; + @State fingerPositionY: number = 0; @State screenClass: object = {}; @State fingerPosition: FingerPosition = { sensorType: '', udSensorRadiusInPx: 60 } + @State fingerLock: boolean = false; @StorageLink('SYSTEM_NAVIGATION_BAR_HEIGHT') SYSTEM_NAVIGATION_BAR_HEIGHT: number = 0; @State screen: number[] = []; - @Consume isLandscape: boolean; + @StorageLink('IS_LANDSCAPE') IS_LANDSCAPE: boolean = false; aboutToAppear(): void { AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFinger]); @@ -68,7 +72,9 @@ export default struct FingerprintAuth { if (this.cmdData && this.cmdData.length > 0) { this.onCmdDataChange('first'); } - LogUtils.info(TAG, 'aboutToAppear PINAuth'); + this.fingerPositionY = px2vp(this.screen[1]) - px2vp(this.fingerPosition.udSensorCenterYInThousandth * + this.screen[1]) / THOUSANDTH + BOTTOM_BUTTON + PADDING_8 + BOTTOM_TEXT + PADDING_24; + LogUtils.info(TAG, 'aboutToAppear PINAuth this.fingerPositionY: ' + this.fingerPositionY); pinAuthManager = new account_osAccount.PINAuth(); pinAuthManager.registerInputer({ onGetData: (authSubType, callback) => { @@ -129,23 +135,29 @@ export default struct FingerprintAuth { break; } } + if (num === 'first') { + this.prompt = globalThis.context.resourceManager + .getStringSync(stateNew === OFF_SCREEN_FINGER ? + $r('app.string.unified_authwidget_hint_normal_fp_only') : + $r('app.string.unified_authwidget_hint_inscreen_fp')); + } const displayClass = display.getDefaultDisplaySync(); this.screen = [displayClass.width, displayClass.height]; } - if (remainAttempts) { + if (remainAttempts < Constants.maxFailTimes) { this.prompt = globalThis.context.resourceManager .getStringSync($r('app.string.unified_authwidget_hint_fp_retry_s2')); - if (num !== 'first' && remainAttempts > AUTH_LOCK) { - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFinger]); - } + this.fingerLock = false; } - if (num === 'first') { - this.prompt = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_hint_inscreen_fp')); + if (remainAttempts > AUTH_LOCK && num !== 'first') { + setTimeout(() => { + AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFinger]); + }, NOTICE_DELAY); } if (remainAttempts === AUTH_LOCK) { this.prompt = globalThis.context.resourceManager .getStringSync($r('app.string.unified_authwidget_title_number_failed_fp_forbidden')); + this.fingerLock = true; if (this.dialogType === DialogType.PIN_FINGER) { if (this.pinSubType !== Constants.pinSix) { stateNew = MULTI_PIN; @@ -163,6 +175,12 @@ export default struct FingerprintAuth { }) } + sendFingerEvent(): void { + if (!this.fingerLock) { + AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFinger]); + } + } + countTime(freezingTime): void { const TRY_AGAIN = globalThis.context.resourceManager .getStringSync($r('app.string.unified_authwidget_postretry')); @@ -192,7 +210,10 @@ export default struct FingerprintAuth { ?.getStringSync($r('app.string.unified_authwidget_hint_fp_verify_success')): case context?.resourceManager ?.getStringSync($r('app.string.unified_authwidget_hint_inscreen_fp')): + case context?.resourceManager + ?.getStringSync($r('app.string.unified_authwidget_hint_normal_fp_only')): { return $r('sys.color.ohos_id_color_text_secondary'); + } } } @@ -207,22 +228,26 @@ export default struct FingerprintAuth { } } + handleCancel(): void { + AuthUtils.getInstance().sendNotice(Constants.noticeEventCancel, globalThis?.wantParams?.type || []); + globalThis.session?.terminateSelf?.(); + } + build() { Column() { GridRow({ - columns: 8, - gutter: { x: 5, y: 10 }, + columns: { xs: 4, sm: 4, md: 8, lg: 12 }, + gutter: { x: 24, y: 24 }, breakpoints: { value: Constants.deviceDpi, reference: BreakpointsReference.WindowSize }, direction: GridRowDirection.Row }) { - GridCol({ span: { xs: 0, sm: 0, md: 2, lg: 2 } }) - .visibility(Visibility.Hidden) GridCol({ - span: { xs: 8, sm: 8, md: 4, lg: 4 }, + span: { xs: 4, sm: 4, md: 4, lg: 6 }, + offset: { md: 2, lg: 3 }, }) { - Column() { - if (this.state === OFF_SCREEN_FINGER) { + if (this.state === OFF_SCREEN_FINGER) { + Column() { Text(globalThis.wantParams?.title) .margin({ top: $r('app.float.title_padding_top') }) .fontSize($r('sys.float.ohos_id_text_size_body1')) @@ -233,8 +258,8 @@ export default struct FingerprintAuth { .height($r('app.float.image_big')) .margin({ top: $r('app.float.content_padding'), bottom: $r('app.float.content_padding') }) - Text($r('app.string.unified_authwidget_hint_normal_fp_only')) - .fontColor($r('sys.color.ohos_id_color_text_secondary')) + Text(this.prompt) + .fontColor(this.onFingerPrintFontColor(this.prompt, globalThis.context)) .fontSize($r('sys.float.ohos_id_text_size_body2')) if (this.dialogType === DialogType.PIN_FINGER) { Row() { @@ -249,7 +274,7 @@ export default struct FingerprintAuth { .fontWeight(FontWeight.Medium) .backgroundColor(Color.Transparent) .onClick(() => { - globalThis.session?.terminateSelf?.(); + this.handleCancel(); this.textValue = ''; }) }.width(Constants.halfContainerWidth) @@ -288,7 +313,7 @@ export default struct FingerprintAuth { Button($r('app.string.unified_authwidget_cancel'), { stateEffect: true }) .id('cancelDefBtnState3FingerprintAuth') .onClick(() => { - globalThis.session?.terminateSelf?.(); + this.handleCancel(); }) .backgroundColor(Color.Transparent) .height($r('app.float.btn_height')) @@ -314,7 +339,7 @@ export default struct FingerprintAuth { .fontWeight(FontWeight.Medium) .backgroundColor(Color.Transparent) .onClick(() => { - globalThis.session?.terminateSelf?.(); + this.handleCancel(); }) }.width(Constants.halfContainerWidth) @@ -326,6 +351,8 @@ export default struct FingerprintAuth { Column() { Button(globalThis.wantParams?.navigationButtonText) .onClick(() => { + AuthUtils.getInstance() + .sendNotice('EVENT_AUTH_USER_NAVIGATION', [Constants.noticeTypeFinger]); globalThis.session?.terminateSelf?.(); }) .margin({ right: $r('app.float.content_padding') }) @@ -341,8 +368,17 @@ export default struct FingerprintAuth { .margin({ top: $r('app.float.element_margin'), bottom: $r('app.float.content_padding') }) } } - } else if (this.state === PIN_FINGER) { - if (!this.isLandscape) { + } + .backgroundColor($r('sys.color.ohos_id_color_dialog_bg')) + .borderRadius($r('sys.float.ohos_id_corner_radius_dialog')) + .margin({ + left: ($r('sys.float.ohos_id_dialog_margin_start')), + right: ($r('sys.float.ohos_id_dialog_margin_end')), + bottom: ($r('sys.float.ohos_id_dialog_margin_bottom')) + }) + } else { + Column() { + if (this.state === PIN_FINGER) { Text(globalThis.wantParams?.title) .margin({ top: $r('app.float.title_padding_top') }) .fontSize($r('sys.float.ohos_id_text_size_body1')) @@ -358,12 +394,6 @@ export default struct FingerprintAuth { .id('blueFingerprintImgState2FingerprintAuth') .width(px2vp(this.fingerPosition.udSensorRadiusInPx * RADIUS)) .height(px2vp(this.fingerPosition.udSensorRadiusInPx * RADIUS)) - .onClick(() => { - if (this.prompt !== globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_title_number_failed_fp_forbidden'))) { - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFinger]); - } - }) Text(this.prompt) .fontColor(this.onFingerPrintFontColor(this.prompt, globalThis.context)) .fontSize($r('sys.float.ohos_id_text_size_body2')) @@ -379,7 +409,7 @@ export default struct FingerprintAuth { .fontWeight(FontWeight.Medium) .backgroundColor(Color.Transparent) .onClick(() => { - globalThis.session?.terminateSelf?.(); + this.handleCancel(); this.textValue = ''; }) }.width(Constants.halfContainerWidth) @@ -411,9 +441,7 @@ export default struct FingerprintAuth { } .height($r('app.float.btn_height')) .margin({ top: $r('app.float.element_margin'), bottom: $r('app.float.content_padding') }) - } - } else if (this.state === SINGLE_FINGER) { - if (!this.isLandscape) { + } else if (this.state === SINGLE_FINGER) { Text(globalThis.wantParams?.title) .margin({ top: $r('app.float.title_padding_top') }) .fontSize($r('sys.float.ohos_id_text_size_body1')) @@ -429,12 +457,6 @@ export default struct FingerprintAuth { .id('blueFingerprintState1FingerprintAuth') .width(px2vp(this.fingerPosition.udSensorRadiusInPx * RADIUS)) .height(px2vp(this.fingerPosition.udSensorRadiusInPx * RADIUS)) - .onClick(() => { - if (this.prompt !== globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_title_number_failed_fp_forbidden'))) { - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFinger]); - } - }) Text(this.prompt) .fontColor(this.onFingerPrintFontColor(this.prompt, globalThis.context)) .fontSize($r('sys.float.ohos_id_text_size_body2')) @@ -444,7 +466,7 @@ export default struct FingerprintAuth { Button($r('app.string.unified_authwidget_cancel'), { stateEffect: true }) .id('cancelDefBtnState1FingerprintAuth') .onClick(() => { - globalThis.session?.terminateSelf?.(); + this.handleCancel(); }) .backgroundColor(Color.Transparent) .height($r('app.float.btn_height')) @@ -470,7 +492,7 @@ export default struct FingerprintAuth { .fontWeight(FontWeight.Medium) .backgroundColor(Color.Transparent) .onClick(() => { - globalThis.session?.terminateSelf?.(); + this.handleCancel(); }) }.width(Constants.halfContainerWidth) @@ -482,6 +504,8 @@ export default struct FingerprintAuth { Column() { Button(globalThis.wantParams?.navigationButtonText) .onClick(() => { + AuthUtils.getInstance() + .sendNotice('EVENT_AUTH_USER_NAVIGATION', [Constants.noticeTypeFinger]); globalThis.session?.terminateSelf?.(); }) .margin({ right: $r('app.float.content_padding') }) @@ -496,94 +520,88 @@ export default struct FingerprintAuth { .height($r('app.float.btn_height')) .margin({ top: $r('app.float.element_margin'), bottom: $r('app.float.content_padding') }) } - } - } else if (this.state === MULTI_PIN) { - // Password 32-bit - Column() { - PassWord({ - textValue: $textValue, - inputValue: $inputValue, - isEdit: $isEdit, - pinSubType: $pinSubType - }) - Row() { - Column() { - Button($r('app.string.unified_authwidget_cancel'), { stateEffect: true }) - .id('cancelBtnState5FingerprintAuth') - .margin({ left: $r('app.float.content_padding') }) - .width(Constants.ninetyPercentWidth) - .height($r('app.float.btn_height')) - .fontSize($r('sys.float.ohos_id_text_size_button1')) - .fontColor($r('sys.color.ohos_id_color_text_primary_activated')) - .fontWeight(FontWeight.Medium) - .backgroundColor(Color.Transparent) - .onClick(() => { - globalThis.session?.terminateSelf?.(); - this.textValue = ''; - }) - }.width(Constants.halfContainerWidth) - - Divider() - .vertical(true) - .height($r('app.float.digital_password_mask_height')) - .color($r('sys.color.ohos_id_color_list_separator')) - .width($r('app.float.divider_width')) - Column() { - Button($r('app.string.unified_authwidget_confirm')) - .id('okBthState5FingerprintAuth') - .margin({ right: $r('app.float.content_padding') }) - .width(Constants.ninetyPercentWidth) - .height($r('app.float.btn_height')) - .fontSize($r('sys.float.ohos_id_text_size_button1')) - .fontColor($r('sys.color.ohos_id_color_text_primary_activated')) - .fontWeight(FontWeight.Medium) - .backgroundColor(Color.Transparent) - .onClick(async (e) => { - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypePin]); - }) - }.width(Constants.halfContainerWidth) - } - .height($r('app.float.btn_height')) - .margin({ top: $r('app.float.element_margin'), bottom: $r('app.float.content_padding') }) - } - } else if (this.state === SIX_PIN) { - // Password 6-bit - Column() { - SixPassword({ - textValue: $textValue, - inputValue: $inputValue, - isEdit: $isEdit - }) - Button($r('app.string.unified_authwidget_cancel'), { stateEffect: true }) - .id('cancelState6FingerprintAuth') - .onClick(() => { - globalThis.session?.terminateSelf?.(); - this.textValue = ''; + } else if (this.state === MULTI_PIN) { + // Password 32-bit + Column() { + PassWord({ + textValue: $textValue, + inputValue: $inputValue, + isEdit: $isEdit, + pinSubType: $pinSubType }) - .backgroundColor(Color.Transparent) + Row() { + Column() { + Button($r('app.string.unified_authwidget_cancel'), { stateEffect: true }) + .id('cancelBtnState5FingerprintAuth') + .margin({ left: $r('app.float.content_padding') }) + .width(Constants.ninetyPercentWidth) + .height($r('app.float.btn_height')) + .fontSize($r('sys.float.ohos_id_text_size_button1')) + .fontColor($r('sys.color.ohos_id_color_text_primary_activated')) + .fontWeight(FontWeight.Medium) + .backgroundColor(Color.Transparent) + .onClick(() => { + this.handleCancel(); + this.textValue = ''; + }) + }.width(Constants.halfContainerWidth) + + Divider() + .vertical(true) + .height($r('app.float.digital_password_mask_height')) + .color($r('sys.color.ohos_id_color_list_separator')) + .width($r('app.float.divider_width')) + Column() { + Button($r('app.string.unified_authwidget_confirm')) + .id('okBthState5FingerprintAuth') + .margin({ right: $r('app.float.content_padding') }) + .width(Constants.ninetyPercentWidth) + .height($r('app.float.btn_height')) + .fontSize($r('sys.float.ohos_id_text_size_button1')) + .fontColor($r('sys.color.ohos_id_color_text_primary_activated')) + .fontWeight(FontWeight.Medium) + .backgroundColor(Color.Transparent) + .onClick(async (e) => { + AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypePin]); + }) + }.width(Constants.halfContainerWidth) + } .height($r('app.float.btn_height')) - .width(Constants.halfContainerWidth) .margin({ top: $r('app.float.element_margin'), bottom: $r('app.float.content_padding') }) - .fontSize($r('sys.float.ohos_id_text_size_button1')) - .fontColor($r('sys.color.ohos_id_color_text_primary_activated')) - .fontWeight(FontWeight.Medium) + } + } else if (this.state === SIX_PIN) { + // Password 6-bit + Column() { + SixPassword({ + textValue: $textValue, + inputValue: $inputValue, + isEdit: $isEdit + }) + Button($r('app.string.unified_authwidget_cancel'), { stateEffect: true }) + .id('cancelState6FingerprintAuth') + .onClick(() => { + this.handleCancel(); + this.textValue = ''; + }) + .backgroundColor(Color.Transparent) + .height($r('app.float.btn_height')) + .width(Constants.halfContainerWidth) + .margin({ top: $r('app.float.element_margin'), bottom: $r('app.float.content_padding') }) + .fontSize($r('sys.float.ohos_id_text_size_button1')) + .fontColor($r('sys.color.ohos_id_color_text_primary_activated')) + .fontWeight(FontWeight.Medium) + } } } + .position({ y: -this.fingerPositionY }) + .backgroundColor($r('sys.color.ohos_id_color_dialog_bg')) + .borderRadius($r('sys.float.ohos_id_corner_radius_dialog')) + .margin({ + left: ($r('sys.float.ohos_id_dialog_margin_start')), + right: ($r('sys.float.ohos_id_dialog_margin_end')), + bottom: ($r('sys.float.ohos_id_dialog_margin_bottom')) + }) } - .backgroundColor($r('sys.color.ohos_id_color_dialog_bg')) - .borderRadius($r('sys.float.ohos_id_corner_radius_dialog')) - .position({ - y: (this.isLandscape || !this.fingerPosition.udSensorCenterYInThousandth) - ? (this.state === OFF_SCREEN_FINGER - ? OUT_SENSOR - this.SYSTEM_NAVIGATION_BAR_HEIGHT : NORMAL_POSITION) - : (px2vp(this.screen[1]) * this.fingerPosition.udSensorCenterYInThousandth / THOUSANDTH) - - px2vp(this.screen[1]) - MARGIN_TOP - px2vp(this.fingerPosition.udSensorRadiusInPx) - }) - .margin({ - left: ($r('sys.float.ohos_id_dialog_margin_start')), - right: ($r('sys.float.ohos_id_dialog_margin_end')), - bottom: ($r('sys.float.ohos_id_dialog_margin_bottom')) - }) } } } diff --git a/entry/src/main/ets/pages/components/PasswordAuth.ets b/entry/src/main/ets/pages/components/PasswordAuth.ets index 7d935b7..a7c7289 100644 --- a/entry/src/main/ets/pages/components/PasswordAuth.ets +++ b/entry/src/main/ets/pages/components/PasswordAuth.ets @@ -46,9 +46,9 @@ export default struct PasswordAuth { onCmdDataChange(num?: string): void { this.cmdData.length > 0 && this.cmdData.map((item) => { - const { type,remainAttempts, lockoutDuration} = item.payload; + const { type, remainAttempts, lockoutDuration } = item.payload; if (type === Constants.noticeTypePin) { - if (remainAttempts) { + if (remainAttempts && remainAttempts < Constants.maxFailTimes) { this.inputValue = globalThis.context.resourceManager .getStringSync($r('app.string.unified_authwidget_hint_pwd_error')); this.textValue = ''; @@ -56,7 +56,7 @@ export default struct PasswordAuth { this.inputValue = ''; } // pin auth Remaining number - if (remainAttempts < 3) { + if (remainAttempts < Constants.hintTimesByFailLess) { this.inputValue = globalThis.context.resourceManager .getStringSync($r('app.string.unified_authwidget_pwd_error_can_try')) + remainAttempts + globalThis.context.resourceManager @@ -71,8 +71,7 @@ export default struct PasswordAuth { this.textValue = ''; return; } - this.inputValue = globalThis.context.resourceManager - .getStringSync($r('app.string.unified_authwidget_hint_pwd_error')); + this.inputValue = ' '; this.textValue = ''; } }) @@ -120,19 +119,23 @@ export default struct PasswordAuth { this.inputValue = promptText; } + handleCancel(): void { + AuthUtils.getInstance().sendNotice(Constants.noticeEventCancel, globalThis?.wantParams?.type || []); + globalThis.session?.terminateSelf?.(); + } + build() { Column() { GridRow({ - columns: 8, - gutter: { x: 5, y: 10 }, + columns: { xs: 4, sm: 4, md: 8, lg: 12 }, + gutter: { x: 24, y: 24 }, breakpoints: { value: Constants.deviceDpi, reference: BreakpointsReference.WindowSize }, direction: GridRowDirection.Row }) { - GridCol({ span: { xs: 0, sm: 0, md: 2, lg: 2 } }) - .visibility(Visibility.Hidden) GridCol({ - span: { xs: 8, sm: 8, md: 4, lg: 4 }, + span: { xs: 4, sm: 4, md: 4, lg: 6 }, + offset: { md: 2, lg: 3 }, }) { Column() { if (this.pinSubType !== Constants.pinSix) { @@ -155,7 +158,7 @@ export default struct PasswordAuth { .fontWeight(FontWeight.Medium) .backgroundColor(Color.Transparent) .onClick(() => { - globalThis.session?.terminateSelf?.(); + this.handleCancel(); }) .id('cancelBtnDialogPwd') }.width('50%') @@ -197,7 +200,7 @@ export default struct PasswordAuth { }) Button($r('app.string.unified_authwidget_cancel'), { stateEffect: true }) .onClick(() => { - globalThis.session?.terminateSelf?.(); + this.handleCancel(); this.textValue = ''; this.inputValue = ' '; }) diff --git a/entry/src/main/module.json5 b/entry/src/main/module.json similarity index 62% rename from entry/src/main/module.json5 rename to entry/src/main/module.json index 39bdc98..5b7f128 100644 --- a/entry/src/main/module.json5 +++ b/entry/src/main/module.json @@ -1,18 +1,3 @@ -/** - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - { "module": { "name": "entry", @@ -40,7 +25,6 @@ ], "metadata": [ { - // 新增key值,定义垂域服务业务细分类型 "name": "ohos.extension.servicetype", "value": "commonDialog" } @@ -56,7 +40,7 @@ }, { "name": "ohos.permission.SUPPORT_USER_AUTH" - }, + } ] } } \ No newline at end of file diff --git a/entry/src/ohosTest/ets/test/Ability.test.ets b/entry/src/ohosTest/ets/test/Ability.test.ets deleted file mode 100644 index c9f635e..0000000 --- a/entry/src/ohosTest/ets/test/Ability.test.ets +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import hilog from '@ohos.hilog'; -import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it } from '@ohos/hypium'; - -export default function abilityTest() { - describe('ActsAbilityTest', function () { - // Defines a test suite. Two parameters are supported: test suite name and test suite function. - beforeAll(function () { - // Presets an action, which is performed only once before all test cases of the test suite start. - // This API supports only one parameter: preset action function. - }) - beforeEach(function () { - // Presets an action, which is performed before each unit test case starts. - // The number of execution times is the same as the number of test cases defined by **it**. - // This API supports only one parameter: preset action function. - }) - afterEach(function () { - // Presets a clear action, which is performed after each unit test case ends. - // The number of execution times is the same as the number of test cases defined by **it**. - // This API supports only one parameter: clear action function. - }) - afterAll(function () { - // Presets a clear action, which is performed after all test cases of the test suite end. - // This API supports only one parameter: clear action function. - }) - it('assertContain', 0, function () { - // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. - hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); - let a = 'abc'; - let b = 'b'; - // Defines a variety of assertion methods, which are used to declare expected boolean conditions. - expect(a).assertContain(b); - expect(a).assertEqual(a); - }) - }) -} \ No newline at end of file diff --git a/entry/src/ohosTest/ets/test/Index.test.ets b/entry/src/ohosTest/ets/test/Index.test.ets deleted file mode 100644 index a4d837a..0000000 --- a/entry/src/ohosTest/ets/test/Index.test.ets +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License") - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Driver, ON } from '@ohos.UiTest'; -import { beforeAll, describe, it } from '@ohos/hypium'; - -const delayms: number = 1000; - -export default function IndexTest() { - describe('IndexTest', function () { - beforeAll(async function () { - const data = { - "cmd": [{ - "event": "CMD_NOTIFY_AUTH_START", "payload": { - "lockoutDuration": 0, "remainAttempts": 5, "type": "pin", "sensorInfo": "" - }, "version": "1" - }], - "pinSubType": "PIN_SIX", - "title": "", - "type": ["pin"], - "widgetContextId": 7932856209793250000, - "windowModeType": "DIALOG_BOX", - }; - globalThis.wantParams = data; - }) - - it('clickEventCancal_Input', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayms); - await driver.findComponent(ON.id('pinSix')); - await driver.delayMs(delayms); - done(); - }) - }) -} \ No newline at end of file diff --git a/entry/src/ohosTest/ets/test/jsunit/commonUtilsTest/FuncUtils.test.ets b/entry/src/ohosTest/ets/test/jsunit/commonUtilsTest/FuncUtils.test.ets deleted file mode 100644 index f0425b0..0000000 --- a/entry/src/ohosTest/ets/test/jsunit/commonUtilsTest/FuncUtils.test.ets +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License") - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import userAuth from '@ohos.userIAM.userAuth'; -import { beforeAll, describe, expect, it } from '@ohos/hypium'; -import AuthUtils from '../../../../../main/ets/common/utils/AuthUtils'; -import FuncUtils from '../../../../../main/ets/common/utils/FuncUtils'; -import LogUtils from '../../../../../main/ets/common/utils/LogUtils'; -import TimeUtils from '../../../../../main/ets/common/utils/TimeUtils'; -import WindowPrivacyUtils from '../../../../../main/ets/common/utils/WindowPrivacyUtils'; - -const TAG = 'FuncUtilsTest'; - -export default function FuncUtilsTest() { - describe('funcUtilsTest', function () { - beforeAll(async function () { - let userAuthInstance = null; - const authParam = { - challenge: new Uint8Array([49, 49, 49, 49, 49, 49]), - authType: [1], - authTrustLevel: 10000, - }; - const widgetParam = { - title: '', - windowMode: 1, - navigationButtonText: '', - }; - userAuthInstance = await userAuth.getUserAuthInstance(authParam, widgetParam); - userAuthInstance.on('result', { - callback: function (result) { - LogUtils.i(TAG, 'userAuthInstance callback result = ' + JSON.stringify(result)); - } - }); - userAuthInstance.start(); - }) - - it('getUint8PWFunc_test', 0, function (done) { - const data1 = FuncUtils.getUint8PW('111111'); - const data2 = FuncUtils.getUint8PW('11111111'); - FuncUtils.getWindowHeight(); - expect(data1).assertInstanceOf('Uint8Array'); - expect(data2).assertInstanceOf('Uint8Array'); - done(); - }) - - it('getDialogTypeFunc_test', 0, function (done) { - const data1 = FuncUtils.getDialogType([1]); - const data2 = FuncUtils.getDialogType([1, 2, 4]); - const data3 = FuncUtils.getDialogType([]); - const data4 = FuncUtils.getDialogType(null); - const data5 = FuncUtils.getDialogType(undefined); - const data6 = FuncUtils.getDialogType([1, 2]); - const data7 = FuncUtils.getDialogType([1, 4]); - const data8 = FuncUtils.getDialogType([2]); - const data9 = FuncUtils.getDialogType([4]); - expect(data1).assertEqual(1); - expect(data2).assertEqual(10); - expect(data3).assertEqual(1); - expect(data4).assertEqual(1); - expect(data5).assertEqual(1); - expect(data6).assertEqual(6); - expect(data7).assertEqual(7); - expect(data8).assertEqual(2); - expect(data9).assertEqual(3); - done(); - }) - - it('getWindowHeightFunc_test', 0, function (done) { - FuncUtils.getWindowHeight(); - done(); - }) - - it('sendNoticeFunc_test', 0, async function (done) { - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', ['pin']); - AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_START', ['pin']); - done(); - }) - - it('logFunc_test', 0, async function (done) { - LogUtils.d(TAG, 'debug log test'); - LogUtils.i(TAG, 'info log test'); - LogUtils.w(TAG, 'warning log test'); - LogUtils.e(TAG, 'error log test'); - LogUtils.f(TAG, 'fatal log test'); - done(); - }) - - it('getFreezingTimeNmFunc_test', 0, async function (done) { - TimeUtils.getFreezingTimeNm(10000, globalThis.context); - TimeUtils.getFreezingTimeNm(100000, globalThis.context); - done(); - }) - - it('setWindowPrivacyModeFunc_test', 0, async function (done) { - WindowPrivacyUtils.setWindowPrivacyMode(null, false); - done(); - }) - }) -} \ No newline at end of file diff --git a/entry/src/ohosTest/ets/test/jsunit/constantsTest/Constants.test.ets b/entry/src/ohosTest/ets/test/jsunit/constantsTest/Constants.test.ets deleted file mode 100644 index 9df5b22..0000000 --- a/entry/src/ohosTest/ets/test/jsunit/constantsTest/Constants.test.ets +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License") - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { describe, expect, it } from '@ohos/hypium'; -import Constants from '../../../../../main/ets/common/vm/Constants'; - -export default function ConstantsTest() { - describe('funcUtilsTest', function () { - it('constants_test', 0, function (done) { - expect(Constants.pinSix).assertEqual('PIN_SIX'); - expect(Constants.pinNumber).assertEqual('PIN_NUMBER'); - expect(Constants.pinMixed).assertEqual('PIN_MIXED'); - expect(Constants.userAuthWidgetMgrVersion).assertEqual(1); - expect(Constants.userAuthWidgetMgrSuccess).assertEqual(0); - expect(Constants.noticeVersion).assertEqual('1'); - expect(Constants.noticeTypePin).assertEqual('pin'); - expect(Constants.noticeTypeFace).assertEqual('face'); - expect(Constants.noticeTypeFinger).assertEqual('fingerprint'); - done(); - }) - }) -} \ No newline at end of file diff --git a/entry/src/ohosTest/ets/test/jsunit/widgetTest/CustomPassword.test.ets b/entry/src/ohosTest/ets/test/jsunit/widgetTest/CustomPassword.test.ets deleted file mode 100644 index 482b890..0000000 --- a/entry/src/ohosTest/ets/test/jsunit/widgetTest/CustomPassword.test.ets +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License") - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Driver, ON } from '@ohos.UiTest'; -import { beforeAll, describe, expect, it } from '@ohos/hypium'; -import abilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry'; - -const delegator = abilityDelegatorRegistry.getAbilityDelegator(); -const bundleName = abilityDelegatorRegistry.getArguments().bundleName; - -const delayTime: number = 1000; - -export default function CustomPasswordTest() { - describe('customPasswordTest', function () { - - function sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); - } - - beforeAll(async function () { - const wantDefault = { - "cmd": [{ - "event": "CMD_NOTIFY_AUTH_START", "payload": { - "lockoutDuration": 0, "remainAttempts": 5, "type": "pin", "sensorInfo": "" - }, "version": "1" - }], - "pinSubType": "PIN_SIX", - "title": "", - "type": ["pin"], - "widgetContextId": 6711153399710207000, - "windowModeType": "FULLSCREEN" - }; - globalThis.wantParams = wantDefault; - sleep(1000); - - let want = { - bundleName: bundleName, - abilityName: "EntryAbility" - } - await delegator.startAbility(want); - sleep(1000); - }) - - it('cancelIcon_customPwd_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('mainIndex')); - expect(true).assertTrue(); - done(); - }) - - it('cancelImgCustomPwd_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('cancelImgCustomPwd')); - expect(true).assertTrue(); - done(); - }) - - it('textPrompt_customPwd_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('cancelIconCustomPwd')); - expect(true).assertTrue(); - done(); - }) - - it('forgotBtn_customPwd_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('forgotBtnCustomPwd')); - expect(true).assertTrue(); - done(); - }) - - it('numKeyBord_customPwd_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('numKeyBordCustomPwd')); - expect(true).assertTrue(); - done(); - }) - }) -} \ No newline at end of file diff --git a/entry/src/ohosTest/ets/test/jsunit/widgetTest/CustomPasswordFace.test.ets b/entry/src/ohosTest/ets/test/jsunit/widgetTest/CustomPasswordFace.test.ets deleted file mode 100644 index 206b59c..0000000 --- a/entry/src/ohosTest/ets/test/jsunit/widgetTest/CustomPasswordFace.test.ets +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License") - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Driver, ON } from '@ohos.UiTest'; -import { beforeAll, describe, expect, it } from '@ohos/hypium'; - -const delayTime: number = 1000; - -export default function CustomPasswordFaceTest() { - describe('CustomPasswordFaceTest', function () { - beforeAll(async function () { - const wantDefault = { - "cmd": [{ - "event": "CMD_NOTIFY_AUTH_START", "payload": { - "lockoutDuration": 0, "remainAttempts": 5, "type": "pin", "sensorInfo": "" - }, "version": "1" - }], - "pinSubType": "PIN_NUMBER", - "title": "", - "type": ["pin", "face"], - "widgetContextId": 6711153399710207000, - "windowModeType": "FULLSCREEN" - }; - globalThis.wantParams = wantDefault; - globalThis.themeType = 2; - }) - - it('input_full_customPwd_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('pinInputNumber')); - expect(true).assertTrue(); - done(); - }) - - it('faceImg_customPwd_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('faceImgCustomPwd')); - expect(true).assertTrue(); - done(); - }) - }) -} \ No newline at end of file diff --git a/entry/src/ohosTest/ets/test/jsunit/widgetTest/CustomPasswordFinger.test.ets b/entry/src/ohosTest/ets/test/jsunit/widgetTest/CustomPasswordFinger.test.ets deleted file mode 100644 index 5323dd6..0000000 --- a/entry/src/ohosTest/ets/test/jsunit/widgetTest/CustomPasswordFinger.test.ets +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License") - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Driver, ON } from '@ohos.UiTest'; -import { beforeAll, describe, expect, it } from '@ohos/hypium'; - -const delayTime: number = 1000; - -export default function CustomPasswordFingerTest() { - describe('CustomPasswordFingerTest', function () { - beforeAll(async function () { - const wantDefault = { - "cmd": [{ - "event": "CMD_NOTIFY_AUTH_START", "payload": { - "lockoutDuration": 0, "remainAttempts": 5, "type": "pin", "sensorInfo": "" - }, "version": "1" - }], - "pinSubType": "PIN_MIXED", - "title": "", - "type": ["pin", "fingerprint"], - "widgetContextId": 6711153399710207000, - "windowModeType": "FULLSCREEN" - }; - globalThis.wantParams = wantDefault; - }) - - it('pinInput_full_customPwd_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('pinInput')); - expect(true).assertTrue(); - done(); - }) - - it('fingerWhiteImg_customPwd_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('fingerWhiteImgCustomPwd')); - expect(true).assertTrue(); - done(); - }) - - it('unlockFingerprintImg_customPwd_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('unlockFingerprintImgCustomPwd')); - expect(true).assertTrue(); - done(); - }) - - it('fingerprintImg_customPwd_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('fingerprintImgCustomPwd')); - expect(true).assertTrue(); - done(); - }) - }) -} \ No newline at end of file diff --git a/entry/src/ohosTest/ets/test/jsunit/widgetTest/FaceAuth.test.ets b/entry/src/ohosTest/ets/test/jsunit/widgetTest/FaceAuth.test.ets deleted file mode 100644 index a7b68c9..0000000 --- a/entry/src/ohosTest/ets/test/jsunit/widgetTest/FaceAuth.test.ets +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License") - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Driver, ON } from '@ohos.UiTest'; -import { beforeAll, describe, expect, it } from '@ohos/hypium'; -import abilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry'; - -const delegator = abilityDelegatorRegistry.getAbilityDelegator(); -const bundleName = abilityDelegatorRegistry.getArguments().bundleName; - -const delayTime: number = 1000; - -export default function faceAuthJsTest() { - describe('faceAuthJsTest', function () { - - function sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); - } - - beforeAll(async function () { - const data = { - "cmd": [{ - "event": "CMD_NOTIFY_AUTH_START", "payload": { - "lockoutDuration": 0, "remainAttempts": 4, "type": "face" - }, "version": "1" - }], - "navigationButtonText": "确认", - "title": "", - "type": ["face"], - "widgetContextId": 1590859524489244200, - "windowModeType": "DIALOG_BOX" - } - globalThis.wantParams = data; - sleep(1000); - - let want = { - bundleName: bundleName, - abilityName: "EntryAbility" - } - await delegator.startAbility(want); - sleep(1000); - }) - - it('promptText_resetPin_faceAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('promptTextResetPinFaceAuth')); - expect(true).assertTrue(); - done(); - }) - - it('cancelBtn_pin_faceAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('cancelBtnPinFaceAuth')); - expect(true).assertTrue(); - done(); - }) - - it('usePwd_pin_faceAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('usePwdPinFaceAuth')); - expect(true).assertTrue(); - done(); - }) - - it('cancelImg_all_faceAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('cancelImgAllFaceAuth')); - expect(true).assertTrue(); - done(); - }) - - it('usePwdBtn_all_faceAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('usePwdBtnAllFaceAuth')); - expect(true).assertTrue(); - done(); - }) - - it('resetPromptText_all_faceAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('resetPromptTextAllFaceAuth')); - expect(true).assertTrue(); - done(); - }) - - it('blueFingerprintImg_all_faceAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('blueFingerprintImgAllFaceAuth')); - expect(true).assertTrue(); - done(); - }) - - it('unlockFingerprintImg_customPwd_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('unlockFingerprintImgCustomPwd')); - expect(true).assertTrue(); - done(); - }) - - it('errFaceImg_faceAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('errFaceImgFaceAuth')); - expect(true).assertTrue(); - done(); - }) - - it('blueFingerprintImg_faceAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('blueFingerprintImgFaceAuth')); - expect(true).assertTrue(); - done(); - }) - - it('cancelBtn_faceAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('cancelBtnFaceAuth')); - expect(true).assertTrue(); - done(); - }) - - it('usePwdBtn_faceAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('usePwdBtnFaceAuth')); - expect(true).assertTrue(); - done(); - }) - - it('cancelBtn_mixedPin_faceAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('cancelBtnMixedPinFaceAuth')); - expect(true).assertTrue(); - done(); - }) - - it('okBtn_faceAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('okBtnFaceAuth')); - expect(true).assertTrue(); - done(); - }) - - it('cancelBtn_sixPin_faceAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('cancelBtnSixPinFaceAuth')); - expect(true).assertTrue(); - done(); - }) - - it('promptText_reset_faceAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('promptTextResetFaceAuth')); - expect(true).assertTrue(); - done(); - }) - }) -} \ No newline at end of file diff --git a/entry/src/ohosTest/ets/test/jsunit/widgetTest/FingerprintAuth.test.ets b/entry/src/ohosTest/ets/test/jsunit/widgetTest/FingerprintAuth.test.ets deleted file mode 100644 index a196e4c..0000000 --- a/entry/src/ohosTest/ets/test/jsunit/widgetTest/FingerprintAuth.test.ets +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License") - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Driver, ON } from '@ohos.UiTest'; -import { beforeAll, describe, expect, it } from '@ohos/hypium'; -import abilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry'; - -const delegator = abilityDelegatorRegistry.getAbilityDelegator(); -const bundleName = abilityDelegatorRegistry.getArguments().bundleName; - -const delayTime: number = 1000; - -export default function fingerprintAuthTest() { - - function sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); - } - - describe('fingerprintAuthTest', function () { - beforeAll(async function () { - const data = { - "cmd": [{ - "event": "CMD_NOTIFY_AUTH_START", "payload": { - "lockoutDuration": 0, - "remainAttempts": 5, - "sensorInfo": "{\"sensorType\":\"SensorType1\",\"udSensorCenterXInThousandth\":500,\"udSensorCenterYInThousandth\":500,\"udSensorRadiusInPx\":30}", - "type": "fingerprint" - }, "version": "1" - }], - "navigationButtonText": "确定", - "title": "", - "type": ["fingerprint"], - "widgetContextId": 13682225748840628000, - "windowModeType": "DIALOG_BOX" - } - globalThis.wantParams = data; - - sleep(1000); - - let want = { - bundleName: bundleName, - abilityName: "EntryAbility" - } - await delegator.startAbility(want); - sleep(1000); - - }) - - it('cancelBth_state3_fingerprintAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('cancelBthState3FingerprintAuth')); - expect(true).assertTrue(); - done(); - }) - - it('usePwdBtn_state3_fingerprintAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('usePwdBtnState3FingerprintAuth')); - expect(true).assertTrue(); - done(); - }) - - it('blueFingerprintImg_state2_fingerprintAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('blueFingerprintImgState2FingerprintAuth')); - expect(true).assertTrue(); - done(); - }) - - it('cancelBtn_state2_fingerprintAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('cancelBtnState2FingerprintAuth')); - expect(true).assertTrue(); - done(); - }) - - it('usePwdBtn_state2_fingerprintAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('usePwdBtnState2FingerprintAuth')); - expect(true).assertTrue(); - done(); - }) - - it('blueFingerprint_state1_fingerprintAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('blueFingerprintState1FingerprintAuth')); - expect(true).assertTrue(); - done(); - }) - - it('blueFingerprintImg_all_faceAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('blueFingerprintImgAllFaceAuth')); - expect(true).assertTrue(); - done(); - }) - - it('usePwdBtn_state1_fingerprintAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('usePwdBtnState1FingerprintAuth')); - expect(true).assertTrue(); - done(); - }) - - it('cancel_state4_fingerprintAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('cancelState4FingerprintAuth')); - expect(true).assertTrue(); - done(); - }) - - it('usePwdBtn_state4_fingerprintAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('usePwdBtnState4FingerprintAuth')); - expect(true).assertTrue(); - done(); - }) - - it('cancelBtn_state5_fingerprintAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('cancelBtnState5FingerprintAuth')); - expect(true).assertTrue(); - done(); - }) - - it('okBth_state5_fingerprintAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('okBthState5FingerprintAuth')); - expect(true).assertTrue(); - done(); - }) - - it('cancelBtn_mixedPin_faceAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('cancelBtnMixedPinFaceAuth')); - expect(true).assertTrue(); - done(); - }) - - it('cancel_state6_fingerprintAuth_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('cancelState6FingerprintAuth')); - expect(true).assertTrue(); - done(); - }) - }) -} \ No newline at end of file diff --git a/entry/src/ohosTest/ets/test/jsunit/widgetTest/PageCom.test.ets b/entry/src/ohosTest/ets/test/jsunit/widgetTest/PageCom.test.ets deleted file mode 100644 index eb46531..0000000 --- a/entry/src/ohosTest/ets/test/jsunit/widgetTest/PageCom.test.ets +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License") - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { describe, expect, it } from '@ohos/hypium' -import userAuth from '@ohos.userIAM.userAuth'; -import LogUtils from '../../../../../main/ets/common/utils/LogUtils'; - -const TAG = 'PageComTest'; - -export default function PageComTest() { - describe('pageComTest', function () { - it('clickEventOk_Input', 0, async function (done) { - let userAuthInstance = null; - const authParam = { - challenge: new Uint8Array([49, 49, 49, 49, 49, 49]), - authType: [4], - authTrustLevel: 10000, - }; - const widgetParam = { - title: '使用密码验证', - windowMode: 1, - navigationButtonText: '确认', - }; - userAuthInstance = await userAuth.getUserAuthInstance(authParam, widgetParam); - userAuthInstance.on('result', { - callback: function (result) { - LogUtils.i(TAG, 'userAuthInstance onResult: ' + JSON.stringify(result)); - } - }); - expect(userAuthInstance).not().assertNull(); - done(); - }) - }) -} \ No newline at end of file diff --git a/entry/src/ohosTest/ets/test/jsunit/widgetTest/PasswordAuth.test.ets b/entry/src/ohosTest/ets/test/jsunit/widgetTest/PasswordAuth.test.ets deleted file mode 100644 index 7a0ea0e..0000000 --- a/entry/src/ohosTest/ets/test/jsunit/widgetTest/PasswordAuth.test.ets +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License") - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Driver, ON } from '@ohos.UiTest'; -import { beforeAll, describe, expect, it } from '@ohos/hypium'; -import abilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry'; - -const delayTime: number = 1000; - -const delegator = abilityDelegatorRegistry.getAbilityDelegator() -const bundleName = abilityDelegatorRegistry.getArguments().bundleName; - -export default function PasswordAuthTest() { - describe('passwordAuthTest', function () { - - function sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); - } - - beforeAll(async function () { - const data = { - "cmd": [{ - "event": "CMD_NOTIFY_AUTH_START", "payload": { - "lockoutDuration": 0, "remainAttempts": 5, "type": "pin", "sensorInfo": "" - }, "version": "1" - }], - "pinSubType": "PIN_MIXED", - "title": "", - "type": ["pin"], - "widgetContextId": 7932856209793250000, - "windowModeType": "DIALOG_BOX" - }; - globalThis.wantParams = data; - - sleep(1000); - let want = { - bundleName: bundleName, - abilityName: "EntryAbility" - } - await delegator.startAbility(want); - sleep(1000); - }) - - it('cancelBtn_dialog_pwd_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('cancelBtnDialogPwd')); - expect(true).assertTrue(); - done(); - }) - - it('okBtn_dialog_pwd_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('okBtn')); - expect(true).assertTrue(); - done(); - }) - - it('input_dialog_pwd_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('pinInputMix')); - expect(true).assertTrue(); - done(); - }) - }) -} \ No newline at end of file diff --git a/entry/src/ohosTest/ets/test/jsunit/widgetTest/PasswordAuthSix.test.ets b/entry/src/ohosTest/ets/test/jsunit/widgetTest/PasswordAuthSix.test.ets deleted file mode 100644 index d25abcd..0000000 --- a/entry/src/ohosTest/ets/test/jsunit/widgetTest/PasswordAuthSix.test.ets +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License") - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Driver, ON } from '@ohos.UiTest'; -import { beforeAll, describe, expect, it } from '@ohos/hypium'; -import abilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry'; - -const delegator = abilityDelegatorRegistry.getAbilityDelegator(); -const bundleName = abilityDelegatorRegistry.getArguments().bundleName; - -const delayTime: number = 1000; - -export default function passwordAuthSixTest() { - - function sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); - } - - describe('passwordAuthSixTest', function () { - beforeAll(async function () { - - }) - - it('cancelBtn_dialog_sixPwd_test', 0, async function (done) { - const data = { - "cmd": [{ - "event": "CMD_NOTIFY_AUTH_START", "payload": { - "lockoutDuration": 0, "remainAttempts": 5, "type": "pin", "sensorInfo": "" - }, "version": "1" - }], - "pinSubType": "PIN_SIX", - "title": "", - "type": ["pin"], - "widgetContextId": 7932856209793250000, - "windowModeType": "DIALOG_BOX", - }; - globalThis.wantParams = data; - sleep(1000); - - let want = { - bundleName: bundleName, - abilityName: "EntryAbility" - } - await delegator.startAbility(want); - sleep(1000); - - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('cancelBtnDialogSixPwd')); - expect(true).assertTrue(); - done(); - }) - }) -} \ No newline at end of file diff --git a/entry/src/ohosTest/ets/test/uitest/CustomPassword.test.ets b/entry/src/ohosTest/ets/test/uitest/CustomPassword.test.ets deleted file mode 100644 index 115bdda..0000000 --- a/entry/src/ohosTest/ets/test/uitest/CustomPassword.test.ets +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License") - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Driver, ON } from '@ohos.UiTest'; -import { beforeAll, describe, expect, it } from '@ohos/hypium'; - -const delayTime: number = 1000; - -export default function CustomPasswordTest() { - describe('CustomPasswordTest', function () { - beforeAll(async function () { - const data = { - "cmd": [{ - "event": "CMD_NOTIFY_AUTH_START", "payload": { - "lockoutDuration": 0, "remainAttempts": 5, "type": "pin", "sensorInfo": "" - }, "version": "1" - }], - "pinSubType": "PIN_SIX", - "title": "", - "type": ["pin"], - "widgetContextId": 7932856209793250000, - "windowModeType": "FULLSCREEN", - }; - globalThis.wantParams = data; - }) - - it('cancelIcon_customPwd_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('cancelIconCustomPwd')); - expect(driver).not().assertNull(); - done(); - }) - - it('textPrompt_customPwd_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('cancelIconCustomPwd')); - expect(driver).not().assertNull(); - done(); - }) - - it('forgotBtn_customPwd_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('forgotBtnCustomPwd')); - expect(driver).not().assertNull(); - done(); - }) - - it('numKeyBord_customPwd_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('numKeyBordCustomPwd')); - expect(driver).not().assertNull(); - done(); - }) - }) -} \ No newline at end of file diff --git a/entry/src/ohosTest/ets/test/uitest/CustomPasswordAttr.test.ets b/entry/src/ohosTest/ets/test/uitest/CustomPasswordAttr.test.ets deleted file mode 100644 index 8efa204..0000000 --- a/entry/src/ohosTest/ets/test/uitest/CustomPasswordAttr.test.ets +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License") - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Driver, ON } from '@ohos.UiTest'; -import { beforeAll, describe, expect, it } from '@ohos/hypium'; - -const delays: number = 1000; - -export default function CustomPasswordAttrTest() { - describe('CustomPasswordAttrTest', function () { - beforeAll(async function () { - const data = { - "cmd": [{ - "event": "CMD_NOTIFY_AUTH_START", "payload": { - "lockoutDuration": 0, "remainAttempts": 5, "type": "pin", "sensorInfo": "" - }, "version": "1" - }], - "pinSubType": "PIN_SIX", - "title": "", - "type": ["pin"], - "widgetContextId": 7932856209793250000, - "windowModeType": "FULLSCREEN", - }; - globalThis.wantParams = data; - }) - - it('clickEventCancal_Input', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delays); - await driver.findComponent(ON.type('Text')); - expect(true).assertTrue(); - done(); - }) - }) -} \ No newline at end of file diff --git a/entry/src/ohosTest/ets/test/uitest/FaceAuth.test.ets b/entry/src/ohosTest/ets/test/uitest/FaceAuth.test.ets deleted file mode 100644 index 0f66e54..0000000 --- a/entry/src/ohosTest/ets/test/uitest/FaceAuth.test.ets +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License") - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Driver, ON } from '@ohos.UiTest'; -import { beforeAll, describe, expect, it } from '@ohos/hypium'; - -const delays: number = 1000; - -export default function FaceAuthTest() { - describe('FaceAuthTest', function () { - beforeAll(async function () { - const data = { - "cmd": [{ - "event": "CMD_NOTIFY_AUTH_START", "payload": { - "lockoutDuration": 0, "remainAttempts": 4, "type": "face" - }, "version": "1" - }], - "navigationButtonText": "确认", - "title": "", - "type": ["face"], - "widgetContextId": 1590859524489244200, - "windowModeType": "DIALOG_BOX", - } - globalThis.wantParams = data; - }) - - it('clickEventCancal_face', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delays); - await driver.findComponent(ON.clickable(true)); - expect(true).assertTrue(); - done(); - }) - - - it('clickEventError_face', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delays); - await driver.findComponent(ON.id('okBtnFaceAuth')); - expect(true).assertTrue(); - done(); - }) - }) -} \ No newline at end of file diff --git a/entry/src/ohosTest/ets/test/uitest/FingerprintAuth.test.ets b/entry/src/ohosTest/ets/test/uitest/FingerprintAuth.test.ets deleted file mode 100644 index e77b5b9..0000000 --- a/entry/src/ohosTest/ets/test/uitest/FingerprintAuth.test.ets +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License") - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Driver, ON } from '@ohos.UiTest'; -import { beforeAll, describe, expect, it } from '@ohos/hypium'; - -const delays: number = 1000; - -export default function FingerprintAuthTest() { - describe('FingerprintAuthTest', function () { - beforeAll(async function () { - const data = { - "cmd": [{ - "event": "CMD_NOTIFY_AUTH_START", "payload": { - "lockoutDuration": 0, - "remainAttempts": 5, - "sensorInfo": "{\"sensorType\":\"SensorType1\",\"udSensorCenterXInThousandth\":500,\"udSensorCenterYInThousandth\":500,\"udSensorRadiusInPx\":30}", - "type": "fingerprint" - }, "version": "1" - }], - "navigationButtonText": "确定", - "title": "", - "type": ["fingerprint"], - "widgetContextId": 13682225748840628000, - "windowModeType": "DIALOG_BOX" - } - globalThis.wantParams = data; - }) - - it('clickEventCancal_finger', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delays); - await driver.findComponent(ON.id('cancelBthState3FingerprintAuth')); - expect(true).assertTrue(); - done(); - }) - - it('clickEventError_finger', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delays); - await driver.findComponent(ON.id('usePwdBtnState1FingerprintAuth')); - expect(true).assertTrue(); - done(); - }) - }) -} \ No newline at end of file diff --git a/entry/src/ohosTest/ets/test/uitest/PasswordAuth.test.ets b/entry/src/ohosTest/ets/test/uitest/PasswordAuth.test.ets deleted file mode 100644 index 611d349..0000000 --- a/entry/src/ohosTest/ets/test/uitest/PasswordAuth.test.ets +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License") - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Driver, ON } from '@ohos.UiTest'; -import { beforeAll, describe, expect, it } from '@ohos/hypium'; -import abilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry'; - -const delegator = abilityDelegatorRegistry.getAbilityDelegator(); -const bundleName = abilityDelegatorRegistry.getArguments().bundleName; - -const delayTime: number = 1000; - -export default function PasswordAuthTest() { - describe('PasswordAuthTest', function () { - - function sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); - } - - beforeAll(async function () { - const data = { - "cmd": [{ - "event": "CMD_NOTIFY_AUTH_START", "payload": { - "lockoutDuration": 0, "remainAttempts": 5, "type": "pin", "sensorInfo": "" - }, "version": "1" - }], - "pinSubType": "PIN_MIXED", - "title": "please input", - "type": ["pin"], - "widgetContextId": 7932856209793250000, - "windowModeType": "DIALOG_BOX" - }; - globalThis.wantParams = data; - sleep(1000); - - let want = { - bundleName: bundleName, - abilityName: "EntryAbility" - } - await delegator.startAbility(want); - sleep(1000); - }) - - it('pinInputMix_ui_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('pinInputMix')); - expect(true).assertTrue(); - done(); - }) - - it('cancelBtn_dialog_pwd_ui_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('cancelBtnDialogPwd')); - expect(true).assertTrue(); - done(); - }) - - it('okBtn_dialog_pwd_ui_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('okBtn')); - expect(true).assertTrue(); - done(); - }) - - it('titlePwdAuth_ui_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('titlePwdAuth')); - await driver.delayMs(delayTime); - expect(true).assertTrue(); - done(); - }) - }) -} \ No newline at end of file diff --git a/entry/src/ohosTest/ets/test/uitest/PasswordAuthSix.test.ets b/entry/src/ohosTest/ets/test/uitest/PasswordAuthSix.test.ets deleted file mode 100644 index 0c71548..0000000 --- a/entry/src/ohosTest/ets/test/uitest/PasswordAuthSix.test.ets +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License") - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Driver, ON } from '@ohos.UiTest'; -import { beforeAll, describe, expect, it } from '@ohos/hypium'; -import abilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry'; - -const delegator = abilityDelegatorRegistry.getAbilityDelegator(); -const bundleName = abilityDelegatorRegistry.getArguments().bundleName; - -const delayTime: number = 1000; - -export default function passwordAuthSixUiTest() { - - function sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); - } - - describe('passwordAuthSixUiTest', function () { - beforeAll(async function () { - const data = { - "cmd": [{ - "event": "CMD_NOTIFY_AUTH_START", "payload": { - "lockoutDuration": 0, "remainAttempts": 5, "type": "pin", "sensorInfo": "" - }, "version": "1" - }], - "pinSubType": "PIN_SIX", - "title": "", - "type": ["pin"], - "widgetContextId": 7932856209793250000, - "windowModeType": "DIALOG_BOX", - }; - globalThis.wantParams = data; - sleep(1000); - - let want = { - bundleName: bundleName, - abilityName: "EntryAbility" - } - await delegator.startAbility(want); - sleep(1000); - }) - - it('pinSix_ui_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('pinSix')); - expect(true).assertTrue(); - done(); - }) - - it('cancelBtn_dialog_sixPwd_test', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delayTime); - await driver.findComponent(ON.id('cancelBtnDialogSixPwd')); - expect(true).assertTrue(); - done(); - }) - }) -} \ No newline at end of file diff --git a/entry/src/ohosTest/ets/test/uitest/PinFingerPrint.test.ets b/entry/src/ohosTest/ets/test/uitest/PinFingerPrint.test.ets deleted file mode 100644 index b3e2085..0000000 --- a/entry/src/ohosTest/ets/test/uitest/PinFingerPrint.test.ets +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License") - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Driver, ON } from '@ohos.UiTest'; -import { beforeAll, describe, expect, it } from '@ohos/hypium'; - -const delays: number = 1000; - -export default function PinFingerPrintTest() { - describe('PinFingerPrintTest', function () { - beforeAll(async function () { - const data = { - "cmd": [{ - "event": "CMD_NOTIFY_AUTH_START", "payload": { - "lockoutDuration": 0, "remainAttempts": 5, "type": "pin", "sensorInfo": "" - }, "version": "1" - }], - "pinSubType": "PIN_SIX", - "title": "", - "type": ["fingerprint"], - "widgetContextId": 7932856209793250000, - "windowModeType": "DIALOG_BOX", - }; - globalThis.wantParams = data; - }) - - it('clickEventCancal_finger', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delays); - await driver.findComponent(ON.clickable(true).isAfter(ON.type('Image'))); - expect(true).assertTrue(); - done(); - }) - - it('clickEventError_finger', 0, async function (done) { - let driver = Driver.create(); - await driver.delayMs(delays); - await driver.findComponent(ON.clickable(true).text('未识别成功,点击此处重试')); - expect(true).assertTrue(); - done(); - }) - }) -} \ No newline at end of file diff --git a/entry/src/ohosTest/module.json5 b/entry/src/ohosTest/module.json similarity index 92% rename from entry/src/ohosTest/module.json5 rename to entry/src/ohosTest/module.json index fb14eba..feed879 100644 --- a/entry/src/ohosTest/module.json5 +++ b/entry/src/ohosTest/module.json @@ -1,18 +1,3 @@ -/** - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - { "module": { "name": "entry_test", @@ -222,7 +207,6 @@ ], "metadata": [ { - // 新增key值,定义垂域服务业务细分类型 "name": "ohos.extension.servicetype", "value": "commonDialog" } diff --git a/hvigorfile.js b/hvigorfile.js deleted file mode 100644 index 3d13add..0000000 --- a/hvigorfile.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. -module.exports = require('@ohos/hvigor-ohos-plugin').appTasks \ No newline at end of file diff --git a/package.json b/package.json index 254c7ac..dec43cc 100644 --- a/package.json +++ b/package.json @@ -18,4 +18,3 @@ "@ohos/hvigor": "1.3.1" } } - diff --git a/signature/authWidget .p7b b/signature/auth_widget.p7b similarity index 52% rename from signature/authWidget .p7b rename to signature/auth_widget.p7b index 8e2a42172299379e54bcdb9b64d796aecff5d1b8..74306cabb0e9411ff060595ac7ae520a554560e0 100644 GIT binary patch delta 1014 zcmZ9L&x;#n7{@o+?AFyTNbzJ9QxQZ9n|JbKO%8>=@64O|(Y%?w$xJd6Mlmy+%xp55 z{F>}Lor94aRz!+Ok&1XIXt5Vd)k9C>&4Y)fQt%JZyHW+klV*3J!d}08-uL-FA9#Ly z{-cXm!E*b?=GNtmfD`DEgP_ejMG&J2x24H~DL&NPfmtlcWerlEv(wos7E zb>D1(=$ZhBrwq}oKmundTxO0Kjm>NsbXGRxvf|sTjh(E{S{l@l>m2)CtOU#GShf|M z>Lv)WDi5J%n<`J~xK-%w4NR$;FB||P2c=HLW&1U>hlSCsT$kHi*BC~s88<{LP#EdW zBv02%02h53XolGiszaA>v(dra?$Qa=Mx4xa0rrloON|A=q5xYi(rj<)>{~%O)GH%> zp360wZ_InR-0R3;J%;KDPKyZkiWot{qda8NvD7+H5i)VP7Dm&#=UahOM|7s_F{eGL z%uA!H-gG+zGLh#eVuR#MtJeaeQ0PF&+6yX2PzgJrMziC*AkQ=7nH5yXUWFH2TF@oV z2Pj_?J>(O2Z$BINiou{X8+T$%@|}FA|LM)wKEMC{rB9AteDLSvqjdV$j~9QfzkAYe*B+@|HJeAFF$kl z>GNQ*?ys!Ax-akFUr(G)9xT=`#>h%064W|)d}a00zMN>EOeGUwacb>?7LQ^ussw7Su78|y!$Z+R@ zV~G=7#YE8_$ao>zdQ^s*G8)${wcC;gyNw>=H66A^0;YHdGj4$69_-_+%8T`w&SFYq z-+RcgFp5MS>c=KA=A}X3G1aREfP0q@`8%t_`zmegay;eZnb#9#0Vd=F2;JM z6xcCu4@FRq{bOxRxMS0j8wjMt>ppUp9ca2ORWZXtPmnn7znTa#1PVk_YiB!DIclxhbX6hNG+c3GDSe~$8(9Q=Ds?oi&(R}nrcsHnP zkT{+a!A+@_20|g%^oQ-<$ZVn6uG&dUAZl3onHtgsv7hsp9k~(phGI6}ST>Cc${TK= zY)QRdn{h(89MgnZvoo}qkgoOmGU7;-?qxEiGKv^)3aU~!DzG*fba90B&_{H4x}+r`lJ(e1e|?ilQ?tLpvb-Fe0ld>ZQ~R zlhs#>_MH!o#?QaJ`SHf(Cyx%UO^YnM*LeT$Z{N80-c_)+@>m?cAB(Az$&?JlZwa-ud3rsmk?f?J)