From ec0dd7190c74c5d2b2c990a73eca77d2ba0d4206 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E8=9C=9C?= Date: Thu, 3 Jul 2025 17:57:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=A7=E4=BB=B6=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李蜜 --- entry/src/main/ets/common/vm/Constants.ts | 16 +- entry/src/main/ets/pages/Index.ets | 60 ++++++- .../ets/pages/components/CustomPassword.ets | 2 + .../main/ets/pages/components/FaceAuth.ets | 159 ++++++++++++++--- .../ets/pages/components/FingerprintAuth.ets | 166 +++++++++++++++--- .../ets/pages/components/PasswordAuth.ets | 3 + 6 files changed, 349 insertions(+), 57 deletions(-) diff --git a/entry/src/main/ets/common/vm/Constants.ts b/entry/src/main/ets/common/vm/Constants.ts index a8e13e5..2cad77f 100644 --- a/entry/src/main/ets/common/vm/Constants.ts +++ b/entry/src/main/ets/common/vm/Constants.ts @@ -45,6 +45,9 @@ export default class Constants { // event cancel static noticeEventCancel = 'EVENT_AUTH_USER_CANCEL'; static noticeEventInvalidParam = 'EVENT_AUTH_WIDGET_PARA_INVALID'; + static noticeEventWidgetLoaded = 'EVENT_AUTH_WIDGET_LOADED'; + static noticeEventWidgetReleased = 'EVENT_AUTH_WIDGET_RELEASED'; + static noticeEventUserNavigation = 'EVENT_AUTH_USER_NAVIGATION'; static numKeyBoard : NumKeyBoardItem[] = [ { @@ -174,5 +177,16 @@ export interface WantParams { export interface WidgetCommand { cmd:Array, - pinSubType:string + pinSubType:string, + skipLockedBiometricAuth: boolean +} + +export enum UserAuthTipType { + SINGLE_AUTH_RESULT = 10001 +} + +export enum CmdNotifyEvents { + CMD_NOTIFY_AUTH_START = 'CMD_NOTIFY_AUTH_START', + CMD_NOTIFY_AUTH_RESULT = 'CMD_NOTIFY_AUTH_RESULT', + CMD_NOTIFY_AUTH_TIP = 'CMD_NOTIFY_AUTH_TIP' } \ No newline at end of file diff --git a/entry/src/main/ets/pages/Index.ets b/entry/src/main/ets/pages/Index.ets index f38c1bc..a18ebc6 100644 --- a/entry/src/main/ets/pages/Index.ets +++ b/entry/src/main/ets/pages/Index.ets @@ -15,6 +15,7 @@ import screen from '@ohos.screen'; import userAuth from '@ohos.userIAM.userAuth'; +import AuthUtils from '../common/utils/AuthUtils'; import UIExtensionContentSession from '@ohos.app.ability.UIExtensionContentSession'; import { DialogType } from '../common/module/DialogType'; import FuncUtils from '../common/utils/FuncUtils'; @@ -46,6 +47,9 @@ struct Index { @State isLandscape: boolean = false; @Provide underFingerPrint: boolean = false; @State loadFlag: boolean = false; + @State isFaceLocked: boolean = false; + @State isFingerprintLocked: boolean = false; + @State skipLockedBiometricAuth: boolean = false; onScreenChange(): void { try { @@ -95,8 +99,60 @@ struct Index { sendCommand(result) { LogUtils.info(TAG, 'sendCommand result: ' + result); const cmdDataObj: WidgetCommand = JSON.parse(result || '{}'); + that.skipLockedBiometricAuth = cmdDataObj?.skipLockedBiometricAuth ?? false; + cmdDataObj.cmd?.map((item) => { + if (item.payload?.lockoutDuration !== 0 && item.payload?.remainAttempts === 0) { + if (item.payload?.type === 'face') { + that.isFaceLocked = true; + } else if (item.payload?.type === 'fingerprint') { + that.isFingerprintLocked = true; + } + } + }) + if (that.skipLockedBiometricAuth) { + if (that.authType.length == 1 && that.authType.includes(userAuth.UserAuthType.FACE) && that.isFaceLocked) { + AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFace]); + if ((AppStorage.get('wantParams') as WantParams)?.navigationButtonText as string) { + AuthUtils.getInstance().sendNotice(Constants.noticeEventUserNavigation, [Constants.noticeTypeFace]); + } else { + AuthUtils.getInstance().sendNotice(Constants.noticeEventCancel, [Constants.noticeTypeFace]); + } + AppStorage.get('session')?.terminateSelf(); + return; + } + if (that.authType.length == 1 && that.authType.includes(userAuth.UserAuthType.FINGERPRINT) && + that.isFingerprintLocked) { + AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFinger]); + if ((AppStorage.get('wantParams') as WantParams)?.navigationButtonText as string) { + AuthUtils.getInstance().sendNotice(Constants.noticeEventUserNavigation, [Constants.noticeTypeFinger]); + } else { + AuthUtils.getInstance().sendNotice(Constants.noticeEventCancel, [Constants.noticeTypeFinger]); + } + AppStorage.get('session')?.terminateSelf(); + return; + } + if (that.authType.length == 2 && that.authType.includes(userAuth.UserAuthType.FACE) && that.isFaceLocked && + that.authType.includes(userAuth.UserAuthType.FINGERPRINT) && that.isFingerprintLocked) { + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, + [Constants.noticeTypeFinger, Constants.noticeTypeFace]); + if ((AppStorage.get('wantParams') as WantParams)?.navigationButtonText as string) { + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventUserNavigation, + [Constants.noticeTypeFinger, Constants.noticeTypeFace]); + } else { + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventCancel, [Constants.noticeTypeFinger, Constants.noticeTypeFace]); + } + AppStorage.get('session')?.terminateSelf(); + return; + } + } + that.cmdData = cmdDataObj?.cmd || []; - that.pinSubType = cmdDataObj?.pinSubType; + if (cmdDataObj?.pinSubType !== null && cmdDataObj?.pinSubType !== undefined) { + that.pinSubType = cmdDataObj?.pinSubType; + } that.handleIsUnder(cmdDataObj?.cmd || []); } }); @@ -201,6 +257,7 @@ struct Index { pinSubType: $pinSubType, dialogType: $dialogType, cmdData: $cmdData, + skipLockedBiometricAuth: $skipLockedBiometricAuth }) } else if (this.authType.includes(userAuth.UserAuthType.FINGERPRINT)) { FingerprintAuth({ @@ -208,6 +265,7 @@ struct Index { pinSubType: $pinSubType, dialogType: $dialogType, cmdData: $cmdData, + skipLockedBiometricAuth: $skipLockedBiometricAuth }) } else { PasswordAuth({ diff --git a/entry/src/main/ets/pages/components/CustomPassword.ets b/entry/src/main/ets/pages/components/CustomPassword.ets index 619f4be..236c253 100644 --- a/entry/src/main/ets/pages/components/CustomPassword.ets +++ b/entry/src/main/ets/pages/components/CustomPassword.ets @@ -59,6 +59,7 @@ export default struct CustomPassword { callback.onSetData(authSubType, uint8PW); } }); + AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetLoaded, [Constants.noticeTypePin]); } catch (error) { LogUtils.error(TAG, 'aboutToAppear PINAuth catch error: ' + error?.code); (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); @@ -67,6 +68,7 @@ export default struct CustomPassword { aboutToDisappear(): void { LogUtils.info(TAG, 'aboutToDisappear PINAuth unregisterInputer'); + AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypePin]); pinAuthManager?.unregisterInputer?.(); } diff --git a/entry/src/main/ets/pages/components/FaceAuth.ets b/entry/src/main/ets/pages/components/FaceAuth.ets index 743dcc1..ba7898f 100644 --- a/entry/src/main/ets/pages/components/FaceAuth.ets +++ b/entry/src/main/ets/pages/components/FaceAuth.ets @@ -22,7 +22,14 @@ import AuthUtils from '../../common/utils/AuthUtils'; import FuncUtils from '../../common/utils/FuncUtils'; import LogUtils from '../../common/utils/LogUtils'; import TimeUtils from '../../common/utils/TimeUtils'; -import Constants, { CmdData, CmdType, FingerPosition, WantParams } from '../../common/vm/Constants'; +import Constants, { + CmdData, + CmdNotifyEvents, + CmdType, + FingerPosition, + UserAuthTipType, + WantParams +} from '../../common/vm/Constants'; import common from '@ohos.app.ability.common'; const TAG = 'FaceAuth'; @@ -71,6 +78,7 @@ export default struct FaceAuth { @State fingerLock: boolean = false; @State isPinFaceFinger: boolean = false; @StorageLink('SYSTEM_NAVIGATION_BAR_HEIGHT') SYSTEM_NAVIGATION_BAR_HEIGHT: number = 0; + @Link skipLockedBiometricAuth: boolean; countTime(freezingTime: number): void { const TRY_AGAIN = (AppStorage.get('context') as common.ExtensionContext)?.resourceManager.getStringSync($r('app.string.unified_authwidget_postretry').id); @@ -108,9 +116,12 @@ export default struct FaceAuth { (AppStorage.get('context') as common.ExtensionContext)?.resourceManager?.getStringSync($r('app.string.unified_authwidget_hint_recognition') .id); AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFace]); + AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetLoaded, [Constants.noticeTypeFace]); } else if (this.dialogType === DialogType.ALL || this.dialogType === DialogType.FACE_FINGER_NAVIGATION) { AuthUtils.getInstance() .sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFinger, Constants.noticeTypeFace]); + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetLoaded, [Constants.noticeTypeFinger, Constants.noticeTypeFace]); } else { LogUtils.error(TAG, 'aboutToAppear not support type'); AuthUtils.getInstance().sendNotice(Constants.noticeEventInvalidParam, [Constants.noticeTypePin]); @@ -160,18 +171,41 @@ export default struct FaceAuth { if ([DialogType.PIN_FACE, DialogType.ALL].includes(this.dialogType)) { LogUtils.debug(TAG, 'toPin this.dialogType: ' + this.dialogType); if (this.dialogType === DialogType.ALL) { + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFace, Constants.noticeTypeFinger]); AuthUtils.getInstance() .sendNotice(Constants.noticeEventCancel, [Constants.noticeTypeFace, Constants.noticeTypeFinger]); } else if (this.dialogType === DialogType.PIN_FACE) { + AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFace]); AuthUtils.getInstance().sendNotice(Constants.noticeEventCancel, [Constants.noticeTypeFace]); } else { + AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFinger]); AuthUtils.getInstance().sendNotice(Constants.noticeEventCancel, [Constants.noticeTypeFinger]); } + AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetLoaded, [Constants.noticeTypePin]); if (this.pinSubType !== Constants.pinSix) { this.dialogTypeFlag = MULTI_PIN; } else { this.dialogTypeFlag = SIX_PIN; } + } else { + if (((AppStorage.get('wantParams') as WantParams)?.navigationButtonText as string)) { + if ([DialogType.FACE_FINGER_NAVIGATION].includes(this.dialogType)) { + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFace, Constants.noticeTypeFinger]); + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventUserNavigation, [Constants.noticeTypeFace, Constants.noticeTypeFinger]); + } else { + AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFace]); + AuthUtils.getInstance().sendNotice(Constants.noticeEventUserNavigation, [Constants.noticeTypeFace]); + } + } else { + if (this.skipLockedBiometricAuth) { + AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFace]); + AuthUtils.getInstance().sendNotice(Constants.noticeEventCancel, [Constants.noticeTypeFace]); + (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); + } + } } } @@ -209,16 +243,18 @@ export default struct FaceAuth { } onCmdDataChange(num?: string): void { + LogUtils.info(TAG, 'onCmdDataChange'); this.cmdData.length > 0 && this.cmdData.map(async (item) => { const payload: CmdData = item.payload; if (payload.type === Constants.noticeTypePin) { if (payload.result === 0) { + AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypePin]); (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); } else if (payload.result && payload.result === Constants.authResultPinExpired) { - this.inputValue = (AppStorage.get('context') as common.ExtensionContext)?.resourceManager - .getStringSync($r('app.string.unified_authwidget_hint_pwd_error').id); - this.textValue = ''; - return; + this.inputValue = (AppStorage.get('context') as common.ExtensionContext)?.resourceManager + .getStringSync($r('app.string.unified_authwidget_hint_pwd_error').id); + this.textValue = ''; + return; } else { if (payload.remainAttempts) { this.inputValue = (AppStorage.get('context') as common.ExtensionContext)?.resourceManager @@ -230,7 +266,7 @@ export default struct FaceAuth { if (payload.remainAttempts < HINT_TIMES_BY_FAIL_LESS) { this.inputValue = (AppStorage.get('context') as common.ExtensionContext)?.resourceManager .getStringSync($r('app.string.unified_authwidget_pwd_error_can_try').id) + - payload.remainAttempts + (AppStorage.get('context') as common.ExtensionContext)?.resourceManager + payload.remainAttempts + (AppStorage.get('context') as common.ExtensionContext)?.resourceManager .getStringSync($r('app.string.unified_authwidget_frequency').id); } } @@ -264,22 +300,57 @@ export default struct FaceAuth { this.prompt = (AppStorage.get('context') as common.ExtensionContext)?.resourceManager .getStringSync($r('app.string.unified_authwidget_title_number_failed_face_forbidden').id); this.faceLock = true; - if (this.dialogType === DialogType.ALL) { - if (this.fingerLock) { + if (this.dialogType === DialogType.ALL || this.dialogType === DialogType.FACE_FINGER_NAVIGATION) { + if (this.skipLockedBiometricAuth || this.fingerLock) { this.toPin(); } } else { - this.toPin(); + if (this.skipLockedBiometricAuth || this.dialogType === DialogType.PIN_FACE) { + this.toPin(); + } } } if (payload.result === 0) { this.prompt = (AppStorage.get('context') as common.ExtensionContext)?.resourceManager - .getStringSync($r('app.string.unified_authwidget_hint_recognize_success').id) - setTimeout(() => { - (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); - }, SECOND); + .getStringSync($r('app.string.unified_authwidget_hint_recognize_success').id); + if (this.dialogType === DialogType.ALL || this.dialogType === DialogType.FACE_FINGER_NAVIGATION) { + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFace, Constants.noticeTypeFinger]); + } else { + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFace]); + } + (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); } } else if (payload.type === Constants.noticeTypeFinger) { + const payload: CmdData = item.payload; + let lockoutDuration: number; + let remainAttempts: number; + let authResult: number; + if (item?.event === CmdNotifyEvents.CMD_NOTIFY_AUTH_TIP) { + const tipInfo: string = FuncUtils.getStringFromCharCode(payload.tipInfo); + if (tipInfo) { + try { + lockoutDuration = JSON.parse(tipInfo).lockoutDuration as number; + remainAttempts = JSON.parse(tipInfo).authRemainAttempts as number; + authResult = JSON.parse(tipInfo).authResult as number; + } catch (e) { + LogUtils.error(TAG, 'parse tipInfo error'); + } + } else { + return; + } + } else { + lockoutDuration = payload.lockoutDuration; + remainAttempts = payload.remainAttempts; + if (payload.result) { + authResult = payload.result; + } else { + authResult = -1; + } + } + LogUtils.info(TAG, + `lockoutDuration: ${lockoutDuration} remainAttempts: ${remainAttempts} authResult: ${authResult}`); if ([SIX_PIN, MULTI_PIN].includes(this.dialogTypeFlag)) { return; } @@ -311,7 +382,7 @@ export default struct FaceAuth { break; } } - if ((payload.remainAttempts && payload.result !== 0) || payload.result === Constants.authResultPinExpired) { + if ((remainAttempts && authResult !== 0) || authResult === Constants.authResultPinExpired) { this.prompt = (AppStorage.get('context') as common.ExtensionContext)?.resourceManager .getStringSync($r('app.string.unified_authwidget_hint_fp_retry_s2').id); this.fingerLock = false; @@ -320,24 +391,28 @@ export default struct FaceAuth { this.prompt = (AppStorage.get('context') as common.ExtensionContext)?.resourceManager .getStringSync($r('app.string.unified_authwidget_hint_normal_fp_only').id); } - if (payload.remainAttempts === 0) { + if (remainAttempts === 0) { this.prompt = (AppStorage.get('context') as common.ExtensionContext)?.resourceManager .getStringSync($r('app.string.unified_authwidget_title_number_failed_fp_forbidden').id); this.fingerLock = true; - if (this.dialogType === DialogType.ALL) { - if (this.faceLock) { + if (this.dialogType === DialogType.ALL || this.dialogType === DialogType.FACE_FINGER_NAVIGATION) { + if (this.skipLockedBiometricAuth || this.faceLock) { this.toPin(); } } else { this.toPin(); } } - if (payload.result === 0) { + if (authResult === 0) { this.prompt = (AppStorage.get('context') as common.ExtensionContext)?.resourceManager .getStringSync($r('app.string.unified_authwidget_hint_fp_verify_success').id) - setTimeout(() => { - (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); - }, SECOND); + if (payload.tipType === UserAuthTipType.SINGLE_AUTH_RESULT) { + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFace, Constants.noticeTypeFinger]); + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventCancel, [Constants.noticeTypeFace, Constants.noticeTypeFinger]); + } + (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); } } else { LogUtils.error(TAG, 'onCmdDataChange default'); @@ -393,6 +468,8 @@ export default struct FaceAuth { .backgroundColor(Color.Transparent) .onClick(() => { this.textValue = ''; + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypePin]); this.handleCancel(); }) }.width(Constants.halfContainerWidth) @@ -440,6 +517,8 @@ export default struct FaceAuth { Button($r('app.string.unified_authwidget_cancel'), { stateEffect: true }) .id('cancelBtnSixPinFaceAuth') .onClick(() => { + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypePin]); this.handleCancel(); this.textValue = ''; }) @@ -460,7 +539,7 @@ export default struct FaceAuth { bottom: this.IS_LANDSCAPE ? '0' : ($r('sys.float.ohos_id_dialog_margin_bottom')) }) } else if (this.dialogTypeFlag === PIN_FACE_FINGER && this.screenType === SCREEN_PORTRAIT && - this.fingerPosition.udSensorRadiusInPx !== undefined) { + this.fingerPosition.udSensorRadiusInPx !== undefined) { Column() { // The first form of facial fingerprint password Flex({ justifyContent: FlexAlign.SpaceBetween }) { @@ -576,7 +655,7 @@ export default struct FaceAuth { bottom: ($r('sys.float.ohos_id_dialog_margin_bottom')) }) } else if (this.dialogTypeFlag === PIN_FACE_FINGER && this.screenType === SCREEN_LAND && - this.fingerPosition.udSensorRadiusInPx !== undefined) { + this.fingerPosition.udSensorRadiusInPx !== undefined) { Column() { if (AppStorage.Get('titleLength') as number < (AppStorage.get('wantParams') as WantParams)?.title.length) { Scroll() { @@ -658,6 +737,9 @@ export default struct FaceAuth { .fontWeight(FontWeight.Medium) .backgroundColor(Color.Transparent) .onClick(() => { + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, + [Constants.noticeTypeFace, Constants.noticeTypeFinger]); this.handleCancel(); this.textValue = ''; }) @@ -679,7 +761,7 @@ export default struct FaceAuth { .fontWeight(FontWeight.Medium) .backgroundColor(Color.Transparent) .onClick(() => { - this.inputValue = ' '; + this.inputValue = ' '; this.toPin(); }) @@ -781,6 +863,9 @@ export default struct FaceAuth { .fontWeight(FontWeight.Medium) .backgroundColor(Color.Transparent) .onClick(() => { + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, + [Constants.noticeTypeFace, Constants.noticeTypeFinger]); this.handleCancel(); this.textValue = ''; }) @@ -803,7 +888,10 @@ export default struct FaceAuth { .backgroundColor(Color.Transparent) .onClick(() => { AuthUtils.getInstance() - .sendNotice('EVENT_AUTH_USER_NAVIGATION', + .sendNotice(Constants.noticeEventWidgetReleased, + [Constants.noticeTypeFace, Constants.noticeTypeFinger]); + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventUserNavigation, [Constants.noticeTypeFace, Constants.noticeTypeFinger]); (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); }) @@ -904,6 +992,14 @@ export default struct FaceAuth { .fontWeight(FontWeight.Medium) .backgroundColor(Color.Transparent) .onClick(() => { + if (this.dialogType === DialogType.ALL) { + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, + [Constants.noticeTypeFace, Constants.noticeTypeFinger]); + } else { + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFace]); + } this.handleCancel(); }) }.width(Constants.halfContainerWidth) @@ -955,6 +1051,8 @@ export default struct FaceAuth { .backgroundColor(Color.Transparent) .onClick(() => { this.textValue = ''; + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypePin]); this.handleCancel(); }) }.width(Constants.halfContainerWidth) @@ -995,6 +1093,8 @@ export default struct FaceAuth { Button($r('app.string.unified_authwidget_cancel'), { stateEffect: true }) .id('cancelBtnSixPinFaceAuth') .onClick(() => { + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypePin]); this.handleCancel(); this.textValue = ''; }) @@ -1089,6 +1189,8 @@ export default struct FaceAuth { Button($r('app.string.unified_authwidget_cancel'), { stateEffect: true }) .id('cancelBtnAllFace') .onClick(() => { + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFace]); this.handleCancel(); }) .backgroundColor(Color.Transparent) @@ -1114,6 +1216,8 @@ export default struct FaceAuth { .fontWeight(FontWeight.Medium) .backgroundColor(Color.Transparent) .onClick(() => { + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFace]); this.handleCancel(); }) }.width(Constants.halfContainerWidth) @@ -1126,7 +1230,10 @@ export default struct FaceAuth { Column() { Button((AppStorage.get('wantParams') as WantParams)?.navigationButtonText as string) .onClick(() => { - AuthUtils.getInstance().sendNotice('EVENT_AUTH_USER_NAVIGATION', [Constants.noticeTypeFace]); + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFace]); + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventUserNavigation, [Constants.noticeTypeFace]); (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); }) .margin({ right: $r('app.float.content_padding') }) diff --git a/entry/src/main/ets/pages/components/FingerprintAuth.ets b/entry/src/main/ets/pages/components/FingerprintAuth.ets index 489290d..8102f7f 100644 --- a/entry/src/main/ets/pages/components/FingerprintAuth.ets +++ b/entry/src/main/ets/pages/components/FingerprintAuth.ets @@ -23,7 +23,14 @@ import AuthUtils from '../../common/utils/AuthUtils'; import FuncUtils from '../../common/utils/FuncUtils'; import LogUtils from '../../common/utils/LogUtils'; import TimeUtils from '../../common/utils/TimeUtils'; -import Constants, { CmdData, CmdType, FingerPosition, WantParams } from '../../common/vm/Constants'; +import Constants, { + CmdData, + CmdNotifyEvents, + CmdType, + FingerPosition, + UserAuthTipType, + WantParams +} from '../../common/vm/Constants'; import common from '@ohos.app.ability.common'; const TAG = 'FingerprintAuth'; @@ -71,6 +78,7 @@ export default struct FingerprintAuth { @StorageLink('IS_LANDSCAPE') IS_LANDSCAPE: boolean = false; @State isOffFinger: boolean = false; @State screenType: number = 0; + @Link skipLockedBiometricAuth: boolean; aboutToAppear(): void { AuthUtils.getInstance().sendNotice('EVENT_AUTH_TYPE_READY', [Constants.noticeTypeFinger]); @@ -84,7 +92,7 @@ export default struct FingerprintAuth { FuncUtils.judgmentOverflow(tempPositionY); if (this.screenType === ON_SCREEN) { this.fingerPositionY = px2vp(this.screen[1]) - tempPositionY / THOUSANDTH + BOTTOM_BUTTON + - PADDING_8 + BOTTOM_TEXT + PADDING_24; + PADDING_8 + BOTTOM_TEXT + PADDING_24; } else if (this.screenType === UNDER_SCREEN) { this.fingerPositionY = px2vp(this.screen[1]) - tempPositionY / THOUSANDTH + PADDING_24; } @@ -99,6 +107,20 @@ export default struct FingerprintAuth { callback.onSetData(authSubType, uint8PW); } }); + + if (((AppStorage.get('wantParams') as WantParams)?.navigationButtonText as string)) { + if (!this.skipLockedBiometricAuth) { + AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetLoaded, [Constants.noticeTypeFinger]); + } + } else { + if (!this.fingerLock) { + AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetLoaded, [Constants.noticeTypeFinger]); + } else { + if (this.dialogType === DialogType.FINGER) { + AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetLoaded, [Constants.noticeTypeFinger]); + } + } + } } catch (error) { LogUtils.error(TAG, 'aboutToAppear PINAuth catch error: ' + error?.code); (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); @@ -117,31 +139,57 @@ export default struct FingerprintAuth { onCmdDataChange(num?: string): void { this.cmdData.length > 0 && this.cmdData.map((item) => { const payload: CmdData = item.payload; + let lockoutDuration: number; + let remainAttempts: number; + let authResult: number; + if (item?.event === CmdNotifyEvents.CMD_NOTIFY_AUTH_TIP) { + const tipInfo: string = FuncUtils.getStringFromCharCode(payload.tipInfo); + if (tipInfo) { + lockoutDuration = JSON.parse(tipInfo).lockoutDuration as number; + remainAttempts = JSON.parse(tipInfo).authRemainAttempts as number; + authResult = JSON.parse(tipInfo).authResult as number; + } else { + return; + } + } else { + lockoutDuration = payload.lockoutDuration; + remainAttempts = payload.remainAttempts; + if (payload.result) { + authResult = payload.result; + } else { + authResult = -1; + } + } + LogUtils.info(TAG, + `lockoutDuration: ${lockoutDuration} remainAttempts: ${remainAttempts} authResult: ${authResult}`); if (payload.type === Constants.noticeTypePin) { - if (payload.result === 0) { + if (authResult === 0) { + AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypePin]); (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); - } else if (payload.result && payload.result === Constants.authResultPinExpired) { - this.inputValue = (AppStorage.get('context') as common.ExtensionContext)?.resourceManager - .getStringSync($r('app.string.unified_authwidget_hint_pwd_error').id); - this.textValue = ''; - return; + } else if (authResult && authResult === Constants.authResultPinExpired) { + this.inputValue = (AppStorage.get('context') as common.ExtensionContext)?.resourceManager + .getStringSync($r('app.string.unified_authwidget_hint_pwd_error').id); + this.textValue = ''; + return; } else { - if (payload.remainAttempts) { + if (remainAttempts) { this.inputValue = (AppStorage.get('context') as common.ExtensionContext)?.resourceManager .getStringSync($r('app.string.unified_authwidget_hint_pwd_error').id); this.textValue = ''; if (num === 'first') { this.inputValue = ''; } - if (payload.remainAttempts < PIN_FAIL_TIP) { + if (remainAttempts < PIN_FAIL_TIP) { this.inputValue = (AppStorage.get('context') as common.ExtensionContext)?.resourceManager .getStringSync($r('app.string.unified_authwidget_pwd_error_can_try').id) + - payload.remainAttempts + (AppStorage.get('context') as common.ExtensionContext)?.resourceManager + remainAttempts + (AppStorage.get('context') as common.ExtensionContext)?.resourceManager .getStringSync($r('app.string.unified_authwidget_frequency').id); } } - if (payload.remainAttempts === AUTH_LOCK && payload.lockoutDuration) { - this.countTime(payload.lockoutDuration); + if (remainAttempts === AUTH_LOCK && lockoutDuration) { + AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFinger]); + AuthUtils.getInstance().sendNotice(Constants.noticeEventCancel, [Constants.noticeTypeFinger]); + this.countTime(lockoutDuration); this.textValue = ''; this.toPin(); this.isEdit = false; @@ -171,7 +219,7 @@ export default struct FingerprintAuth { break; } } - if ((payload.remainAttempts && payload.result !== 0) || payload.result === Constants.authResultPinExpired) { + if ((remainAttempts && authResult !== 0) || authResult === Constants.authResultPinExpired) { this.prompt = (AppStorage.get('context') as common.ExtensionContext)?.resourceManager .getStringSync($r('app.string.unified_authwidget_hint_fp_retry_s2').id); this.fingerLock = false; @@ -182,25 +230,53 @@ export default struct FingerprintAuth { $r('app.string.unified_authwidget_hint_normal_fp_only').id : $r('app.string.unified_authwidget_hint_inscreen_fp').id); } - if (payload.remainAttempts === AUTH_LOCK) { + if (remainAttempts === AUTH_LOCK) { this.prompt = (AppStorage.get('context') as common.ExtensionContext)?.resourceManager .getStringSync($r('app.string.unified_authwidget_title_number_failed_fp_forbidden').id); this.fingerLock = true; - if (this.dialogType === DialogType.PIN_FINGER) { - AuthUtils.getInstance().sendNotice(Constants.noticeEventCancel, [Constants.noticeTypeFinger]); - if (this.pinSubType !== Constants.pinSix) { - this.state = MULTI_PIN; - } else { - this.state = SIX_PIN; + if (payload.tipType === UserAuthTipType.SINGLE_AUTH_RESULT) { + if (this.dialogType === DialogType.PIN_FINGER) { + if (this.pinSubType !== Constants.pinSix) { + this.state = MULTI_PIN; + } else { + this.state = SIX_PIN; + } + AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFinger]); + AuthUtils.getInstance().sendNotice(Constants.noticeEventCancel, [Constants.noticeTypeFinger]); + this.toPin(); + } + if ((AppStorage.get('wantParams') as WantParams)?.navigationButtonText as string && + this.skipLockedBiometricAuth) { + AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFinger]); + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventUserNavigation, [Constants.noticeTypeFinger]); + (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); + return; + } + if (this.dialogType === DialogType.FINGER && this.skipLockedBiometricAuth) { + AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFinger]); + AuthUtils.getInstance().sendNotice(Constants.noticeEventCancel, [Constants.noticeTypeFinger]); + (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); + return; + } + } else { + if (this.dialogType === DialogType.PIN_FINGER) { + if (this.pinSubType !== Constants.pinSix) { + this.state = MULTI_PIN; + } else { + this.state = SIX_PIN; + } + this.toPin(); } } } - if (payload.result === 0) { + if (authResult === 0) { this.prompt = (AppStorage.get('context') as common.ExtensionContext)?.resourceManager .getStringSync($r('app.string.unified_authwidget_hint_fp_verify_success').id) - setTimeout(() => { - (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); - }, SECOND); + if (payload.tipType === UserAuthTipType.SINGLE_AUTH_RESULT) { + AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFinger]); + } + (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); } } else { LogUtils.error(TAG, 'onCmdDataChange default'); @@ -271,7 +347,7 @@ export default struct FingerprintAuth { toPin(): void { LogUtils.debug(TAG, 'toPin this.pinSubType: ' + this.pinSubType); - AuthUtils.getInstance().sendNotice(Constants.noticeEventCancel, [Constants.noticeTypeFinger]); + AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetLoaded, [Constants.noticeTypePin]); if (this.pinSubType !== Constants.pinSix) { this.state = MULTI_PIN; } else { @@ -354,6 +430,8 @@ export default struct FingerprintAuth { .fontWeight(FontWeight.Medium) .backgroundColor(Color.Transparent) .onClick(() => { + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFinger]); this.handleCancel(); this.textValue = ''; }) @@ -376,6 +454,8 @@ export default struct FingerprintAuth { .backgroundColor(Color.Transparent) .onClick(() => { this.inputValue = ' '; + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFinger]); this.toPin(); }) }.width(Constants.halfContainerWidth) @@ -389,6 +469,8 @@ export default struct FingerprintAuth { Button($r('app.string.unified_authwidget_cancel'), { stateEffect: true }) .id('cancelDefBtnState3FingerprintAuth') .onClick(() => { + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFinger]); this.handleCancel(); }) .backgroundColor(Color.Transparent) @@ -415,6 +497,8 @@ export default struct FingerprintAuth { .fontWeight(FontWeight.Medium) .backgroundColor(Color.Transparent) .onClick(() => { + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFinger]); this.handleCancel(); }) }.width(Constants.halfContainerWidth) @@ -428,7 +512,9 @@ export default struct FingerprintAuth { Button((AppStorage.get('wantParams') as WantParams)?.navigationButtonText as string) .onClick(() => { AuthUtils.getInstance() - .sendNotice('EVENT_AUTH_USER_NAVIGATION', [Constants.noticeTypeFinger]); + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFinger]); + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventUserNavigation, [Constants.noticeTypeFinger]); (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); }) .margin({ right: $r('app.float.content_padding') }) @@ -464,6 +550,8 @@ export default struct FingerprintAuth { .fontWeight(FontWeight.Medium) .backgroundColor(Color.Transparent) .onClick(() => { + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypePin]); this.handleCancel(); this.textValue = ''; }) @@ -502,6 +590,8 @@ export default struct FingerprintAuth { Button($r('app.string.unified_authwidget_cancel'), { stateEffect: true }) .id('cancelState6FingerprintAuth') .onClick(() => { + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypePin]); this.handleCancel(); this.textValue = ''; }) @@ -545,6 +635,8 @@ export default struct FingerprintAuth { .fontWeight(FontWeight.Medium) .backgroundColor(Color.Transparent) .onClick(() => { + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypePin]); this.handleCancel(); this.textValue = ''; }) @@ -593,6 +685,8 @@ export default struct FingerprintAuth { Button($r('app.string.unified_authwidget_cancel'), { stateEffect: true }) .id('sixPassCancel') .onClick(() => { + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypePin]); this.handleCancel(); this.textValue = ''; }) @@ -669,6 +763,8 @@ export default struct FingerprintAuth { .fontWeight(FontWeight.Medium) .backgroundColor(Color.Transparent) .onClick(() => { + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFinger]); this.handleCancel(); this.textValue = ''; }) @@ -691,6 +787,8 @@ export default struct FingerprintAuth { .backgroundColor(Color.Transparent) .onClick(() => { this.inputValue = ' '; + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFinger]); this.toPin(); }) }.width(Constants.halfContainerWidth) @@ -725,6 +823,8 @@ export default struct FingerprintAuth { .fontWeight(FontWeight.Medium) .onClick(() => { this.inputValue = ' '; + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFinger]); this.toPin(); }) } @@ -838,6 +938,8 @@ export default struct FingerprintAuth { Button($r('app.string.unified_authwidget_cancel'), { stateEffect: true }) .id('cancelDefBtnState1FingerprintAuth') .onClick(() => { + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFinger]); this.handleCancel(); }) .backgroundColor(Color.Transparent) @@ -864,6 +966,8 @@ export default struct FingerprintAuth { .fontWeight(FontWeight.Medium) .backgroundColor(Color.Transparent) .onClick(() => { + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFinger]); this.handleCancel(); }) }.width(Constants.halfContainerWidth) @@ -877,7 +981,9 @@ export default struct FingerprintAuth { Button(((AppStorage.get('wantParams') as WantParams)?.navigationButtonText as string)) .onClick(() => { AuthUtils.getInstance() - .sendNotice('EVENT_AUTH_USER_NAVIGATION', [Constants.noticeTypeFinger]); + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFinger]); + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventUserNavigation, [Constants.noticeTypeFinger]); (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); }) .id('navigationButtonTextFingerprintAuth') @@ -923,7 +1029,9 @@ export default struct FingerprintAuth { .fontWeight(FontWeight.Medium) .onClick(() => { AuthUtils.getInstance() - .sendNotice('EVENT_AUTH_USER_NAVIGATION', [Constants.noticeTypeFinger]); + .sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypeFinger]); + AuthUtils.getInstance() + .sendNotice(Constants.noticeEventUserNavigation, [Constants.noticeTypeFinger]); (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); }) } diff --git a/entry/src/main/ets/pages/components/PasswordAuth.ets b/entry/src/main/ets/pages/components/PasswordAuth.ets index 1b37272..8721c00 100644 --- a/entry/src/main/ets/pages/components/PasswordAuth.ets +++ b/entry/src/main/ets/pages/components/PasswordAuth.ets @@ -84,6 +84,7 @@ export default struct PasswordAuth { return; } if (payload.result === 0) { + AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypePin]); (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); } this.inputValue = ' '; @@ -107,6 +108,7 @@ export default struct PasswordAuth { callback.onSetData(authSubType, uint8PW); } }); + AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetLoaded, [Constants.noticeTypePin]); } catch (error) { LogUtils.error(TAG, 'aboutToAppear PINAuth catch error: ' + error?.code); (AppStorage.get('session') as UIExtensionContentSession)?.terminateSelf(); @@ -115,6 +117,7 @@ export default struct PasswordAuth { aboutToDisappear(): void { LogUtils.info(TAG, 'aboutToAppear pinAuthManager unregisterInputer'); + AuthUtils.getInstance().sendNotice(Constants.noticeEventWidgetReleased, [Constants.noticeTypePin]); pinAuthManager?.unregisterInputer?.(); } -- Gitee