Loading packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/FaceHelpMessageDeferralTest.kt +1 −0 Original line number Diff line number Diff line Loading @@ -220,6 +220,7 @@ class FaceHelpMessageDeferralTest : SysuiTestCase() { threshold, logger, dumpManager, "0", ) } } packages/SystemUI/src/com/android/keyguard/logging/BiometricMessageDeferralLogger.kt +0 −10 Original line number Diff line number Diff line Loading @@ -16,18 +16,8 @@ package com.android.keyguard.logging import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.LogBuffer import com.android.systemui.log.core.LogLevel.DEBUG import com.android.systemui.log.dagger.BiometricLog import javax.inject.Inject /** Helper class for logging for [com.android.systemui.biometrics.FaceHelpMessageDeferral] */ @SysUISingleton class FaceMessageDeferralLogger @Inject constructor(@BiometricLog private val logBuffer: LogBuffer) : BiometricMessageDeferralLogger(logBuffer, "FaceMessageDeferralLogger") open class BiometricMessageDeferralLogger( private val logBuffer: LogBuffer, Loading packages/SystemUI/src/com/android/systemui/biometrics/FaceHelpMessageDeferral.kt +18 −8 Original line number Diff line number Diff line Loading @@ -18,14 +18,16 @@ package com.android.systemui.biometrics import android.content.res.Resources import com.android.keyguard.logging.BiometricMessageDeferralLogger import com.android.keyguard.logging.FaceMessageDeferralLogger import com.android.systemui.Dumpable import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dump.DumpManager import com.android.systemui.log.LogBuffer import com.android.systemui.log.dagger.BiometricLog import com.android.systemui.res.R import java.io.PrintWriter import java.util.Objects import java.util.UUID import javax.inject.Inject @SysUISingleton Loading @@ -33,14 +35,16 @@ class FaceHelpMessageDeferralFactory @Inject constructor( @Main private val resources: Resources, private val logBuffer: FaceMessageDeferralLogger, @BiometricLog private val logBuffer: LogBuffer, private val dumpManager: DumpManager ) { fun create(): FaceHelpMessageDeferral { val id = UUID.randomUUID().toString() return FaceHelpMessageDeferral( resources = resources, logBuffer = logBuffer, logBuffer = BiometricMessageDeferralLogger(logBuffer, "FaceHelpMessageDeferral[$id]"), dumpManager = dumpManager, id = id, ) } } Loading @@ -51,15 +55,17 @@ constructor( */ class FaceHelpMessageDeferral( resources: Resources, logBuffer: FaceMessageDeferralLogger, dumpManager: DumpManager logBuffer: BiometricMessageDeferralLogger, dumpManager: DumpManager, val id: String, ) : BiometricMessageDeferral( resources.getIntArray(R.array.config_face_help_msgs_defer_until_timeout).toHashSet(), resources.getIntArray(R.array.config_face_help_msgs_ignore).toHashSet(), resources.getFloat(R.dimen.config_face_help_msgs_defer_until_timeout_threshold), logBuffer, dumpManager dumpManager, id, ) /** Loading @@ -72,7 +78,8 @@ open class BiometricMessageDeferral( private val acquiredInfoToIgnore: Set<Int>, private val threshold: Float, private val logBuffer: BiometricMessageDeferralLogger, dumpManager: DumpManager dumpManager: DumpManager, id: String, ) : Dumpable { private val acquiredInfoToFrequency: MutableMap<Int, Int> = HashMap() private val acquiredInfoToHelpString: MutableMap<Int, String> = HashMap() Loading @@ -80,7 +87,10 @@ open class BiometricMessageDeferral( private var totalFrames = 0 init { dumpManager.registerDumpable(this.javaClass.name, this) dumpManager.registerNormalDumpable( "${this.javaClass.name}[$id]", this, ) } override fun dump(pw: PrintWriter, args: Array<out String>) { Loading packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/BiometricMessageInteractor.kt +27 −15 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import com.android.systemui.deviceentry.shared.model.FingerprintMessage import com.android.systemui.deviceentry.shared.model.HelpFaceAuthenticationStatus import com.android.systemui.keyguard.shared.model.ErrorFingerprintAuthenticationStatus import com.android.systemui.res.R import com.android.systemui.util.kotlin.Utils.Companion.toTriple import com.android.systemui.util.kotlin.sample import javax.inject.Inject import kotlinx.coroutines.ExperimentalCoroutinesApi Loading @@ -41,9 +42,8 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge /** * BiometricMessage business logic. Filters biometric error/acquired/fail/success events for * authentication events that should never surface a message to the user at the current device * state. * BiometricMessage business logic. Filters biometric error/fail/success events for authentication * events that should never surface a message to the user at the current device state. */ @ExperimentalCoroutinesApi @SysUISingleton Loading @@ -54,7 +54,8 @@ constructor( fingerprintAuthInteractor: DeviceEntryFingerprintAuthInteractor, fingerprintPropertyInteractor: FingerprintPropertyInteractor, faceAuthInteractor: DeviceEntryFaceAuthInteractor, biometricSettingsInteractor: DeviceEntryBiometricSettingsInteractor, private val biometricSettingsInteractor: DeviceEntryBiometricSettingsInteractor, faceHelpMessageDeferralInteractor: FaceHelpMessageDeferralInteractor, ) { private val faceHelp: Flow<HelpFaceAuthenticationStatus> = faceAuthInteractor.authenticationStatus.filterIsInstance<HelpFaceAuthenticationStatus>() Loading Loading @@ -130,19 +131,24 @@ constructor( ) private val faceHelpMessage: Flow<FaceMessage> = biometricSettingsInteractor.fingerprintAndFaceEnrolledAndEnabled .flatMapLatest { fingerprintAndFaceEnrolledAndEnabled -> faceHelp .filterNot { // Message deferred to potentially show at face timeout error instead faceHelpMessageDeferralInteractor.shouldDefer(it.msgId) } .sample(biometricSettingsInteractor.fingerprintAndFaceEnrolledAndEnabled, ::Pair) .filter { (faceAuthHelpStatus, fingerprintAndFaceEnrolledAndEnabled) -> if (fingerprintAndFaceEnrolledAndEnabled) { faceHelp.filter { faceAuthHelpStatus -> // Show only some face help messages if fingerprint is also enrolled coExFaceAcquisitionMsgIdsToShow.contains(faceAuthHelpStatus.msgId) } } else { faceHelp // Show all face help messages if only face is enrolled true } } .sample(biometricSettingsInteractor.faceAuthCurrentlyAllowed, ::Pair) .filter { (_, faceAuthCurrentlyAllowed) -> faceAuthCurrentlyAllowed } .map { (status, _) -> FaceMessage(status.msg) } .sample(biometricSettingsInteractor.faceAuthCurrentlyAllowed, ::toTriple) .filter { (_, _, faceAuthCurrentlyAllowed) -> faceAuthCurrentlyAllowed } .map { (status, _, _) -> FaceMessage(status.msg) } private val faceFailureMessage: Flow<FaceMessage> = faceFailure Loading @@ -159,12 +165,18 @@ constructor( } .map { (status, _) -> when { status.isTimeoutError() -> FaceTimeoutMessage(status.msg) status.isTimeoutError() -> { val deferredMessage = faceHelpMessageDeferralInteractor.getDeferredMessage() if (deferredMessage != null) { FaceMessage(deferredMessage.toString()) } else { FaceTimeoutMessage(status.msg) } } else -> FaceMessage(status.msg) } } // TODO(b/317215391): support showing face acquired messages on timeout + face lockout errors val faceMessage: Flow<FaceMessage> = merge( faceHelpMessage, Loading packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryBiometricSettingsInteractor.kt +1 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ constructor( ) { val fingerprintAuthCurrentlyAllowed: Flow<Boolean> = repository.isFingerprintAuthCurrentlyAllowed val faceAuthEnrolledAndEnabled: Flow<Boolean> = repository.isFaceAuthEnrolledAndEnabled val faceAuthCurrentlyAllowed: Flow<Boolean> = repository.isFaceAuthCurrentlyAllowed /** Whether both fingerprint and face are enrolled and enabled for device entry. */ Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/FaceHelpMessageDeferralTest.kt +1 −0 Original line number Diff line number Diff line Loading @@ -220,6 +220,7 @@ class FaceHelpMessageDeferralTest : SysuiTestCase() { threshold, logger, dumpManager, "0", ) } }
packages/SystemUI/src/com/android/keyguard/logging/BiometricMessageDeferralLogger.kt +0 −10 Original line number Diff line number Diff line Loading @@ -16,18 +16,8 @@ package com.android.keyguard.logging import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.LogBuffer import com.android.systemui.log.core.LogLevel.DEBUG import com.android.systemui.log.dagger.BiometricLog import javax.inject.Inject /** Helper class for logging for [com.android.systemui.biometrics.FaceHelpMessageDeferral] */ @SysUISingleton class FaceMessageDeferralLogger @Inject constructor(@BiometricLog private val logBuffer: LogBuffer) : BiometricMessageDeferralLogger(logBuffer, "FaceMessageDeferralLogger") open class BiometricMessageDeferralLogger( private val logBuffer: LogBuffer, Loading
packages/SystemUI/src/com/android/systemui/biometrics/FaceHelpMessageDeferral.kt +18 −8 Original line number Diff line number Diff line Loading @@ -18,14 +18,16 @@ package com.android.systemui.biometrics import android.content.res.Resources import com.android.keyguard.logging.BiometricMessageDeferralLogger import com.android.keyguard.logging.FaceMessageDeferralLogger import com.android.systemui.Dumpable import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dump.DumpManager import com.android.systemui.log.LogBuffer import com.android.systemui.log.dagger.BiometricLog import com.android.systemui.res.R import java.io.PrintWriter import java.util.Objects import java.util.UUID import javax.inject.Inject @SysUISingleton Loading @@ -33,14 +35,16 @@ class FaceHelpMessageDeferralFactory @Inject constructor( @Main private val resources: Resources, private val logBuffer: FaceMessageDeferralLogger, @BiometricLog private val logBuffer: LogBuffer, private val dumpManager: DumpManager ) { fun create(): FaceHelpMessageDeferral { val id = UUID.randomUUID().toString() return FaceHelpMessageDeferral( resources = resources, logBuffer = logBuffer, logBuffer = BiometricMessageDeferralLogger(logBuffer, "FaceHelpMessageDeferral[$id]"), dumpManager = dumpManager, id = id, ) } } Loading @@ -51,15 +55,17 @@ constructor( */ class FaceHelpMessageDeferral( resources: Resources, logBuffer: FaceMessageDeferralLogger, dumpManager: DumpManager logBuffer: BiometricMessageDeferralLogger, dumpManager: DumpManager, val id: String, ) : BiometricMessageDeferral( resources.getIntArray(R.array.config_face_help_msgs_defer_until_timeout).toHashSet(), resources.getIntArray(R.array.config_face_help_msgs_ignore).toHashSet(), resources.getFloat(R.dimen.config_face_help_msgs_defer_until_timeout_threshold), logBuffer, dumpManager dumpManager, id, ) /** Loading @@ -72,7 +78,8 @@ open class BiometricMessageDeferral( private val acquiredInfoToIgnore: Set<Int>, private val threshold: Float, private val logBuffer: BiometricMessageDeferralLogger, dumpManager: DumpManager dumpManager: DumpManager, id: String, ) : Dumpable { private val acquiredInfoToFrequency: MutableMap<Int, Int> = HashMap() private val acquiredInfoToHelpString: MutableMap<Int, String> = HashMap() Loading @@ -80,7 +87,10 @@ open class BiometricMessageDeferral( private var totalFrames = 0 init { dumpManager.registerDumpable(this.javaClass.name, this) dumpManager.registerNormalDumpable( "${this.javaClass.name}[$id]", this, ) } override fun dump(pw: PrintWriter, args: Array<out String>) { Loading
packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/BiometricMessageInteractor.kt +27 −15 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import com.android.systemui.deviceentry.shared.model.FingerprintMessage import com.android.systemui.deviceentry.shared.model.HelpFaceAuthenticationStatus import com.android.systemui.keyguard.shared.model.ErrorFingerprintAuthenticationStatus import com.android.systemui.res.R import com.android.systemui.util.kotlin.Utils.Companion.toTriple import com.android.systemui.util.kotlin.sample import javax.inject.Inject import kotlinx.coroutines.ExperimentalCoroutinesApi Loading @@ -41,9 +42,8 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge /** * BiometricMessage business logic. Filters biometric error/acquired/fail/success events for * authentication events that should never surface a message to the user at the current device * state. * BiometricMessage business logic. Filters biometric error/fail/success events for authentication * events that should never surface a message to the user at the current device state. */ @ExperimentalCoroutinesApi @SysUISingleton Loading @@ -54,7 +54,8 @@ constructor( fingerprintAuthInteractor: DeviceEntryFingerprintAuthInteractor, fingerprintPropertyInteractor: FingerprintPropertyInteractor, faceAuthInteractor: DeviceEntryFaceAuthInteractor, biometricSettingsInteractor: DeviceEntryBiometricSettingsInteractor, private val biometricSettingsInteractor: DeviceEntryBiometricSettingsInteractor, faceHelpMessageDeferralInteractor: FaceHelpMessageDeferralInteractor, ) { private val faceHelp: Flow<HelpFaceAuthenticationStatus> = faceAuthInteractor.authenticationStatus.filterIsInstance<HelpFaceAuthenticationStatus>() Loading Loading @@ -130,19 +131,24 @@ constructor( ) private val faceHelpMessage: Flow<FaceMessage> = biometricSettingsInteractor.fingerprintAndFaceEnrolledAndEnabled .flatMapLatest { fingerprintAndFaceEnrolledAndEnabled -> faceHelp .filterNot { // Message deferred to potentially show at face timeout error instead faceHelpMessageDeferralInteractor.shouldDefer(it.msgId) } .sample(biometricSettingsInteractor.fingerprintAndFaceEnrolledAndEnabled, ::Pair) .filter { (faceAuthHelpStatus, fingerprintAndFaceEnrolledAndEnabled) -> if (fingerprintAndFaceEnrolledAndEnabled) { faceHelp.filter { faceAuthHelpStatus -> // Show only some face help messages if fingerprint is also enrolled coExFaceAcquisitionMsgIdsToShow.contains(faceAuthHelpStatus.msgId) } } else { faceHelp // Show all face help messages if only face is enrolled true } } .sample(biometricSettingsInteractor.faceAuthCurrentlyAllowed, ::Pair) .filter { (_, faceAuthCurrentlyAllowed) -> faceAuthCurrentlyAllowed } .map { (status, _) -> FaceMessage(status.msg) } .sample(biometricSettingsInteractor.faceAuthCurrentlyAllowed, ::toTriple) .filter { (_, _, faceAuthCurrentlyAllowed) -> faceAuthCurrentlyAllowed } .map { (status, _, _) -> FaceMessage(status.msg) } private val faceFailureMessage: Flow<FaceMessage> = faceFailure Loading @@ -159,12 +165,18 @@ constructor( } .map { (status, _) -> when { status.isTimeoutError() -> FaceTimeoutMessage(status.msg) status.isTimeoutError() -> { val deferredMessage = faceHelpMessageDeferralInteractor.getDeferredMessage() if (deferredMessage != null) { FaceMessage(deferredMessage.toString()) } else { FaceTimeoutMessage(status.msg) } } else -> FaceMessage(status.msg) } } // TODO(b/317215391): support showing face acquired messages on timeout + face lockout errors val faceMessage: Flow<FaceMessage> = merge( faceHelpMessage, Loading
packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryBiometricSettingsInteractor.kt +1 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ constructor( ) { val fingerprintAuthCurrentlyAllowed: Flow<Boolean> = repository.isFingerprintAuthCurrentlyAllowed val faceAuthEnrolledAndEnabled: Flow<Boolean> = repository.isFaceAuthEnrolledAndEnabled val faceAuthCurrentlyAllowed: Flow<Boolean> = repository.isFaceAuthCurrentlyAllowed /** Whether both fingerprint and face are enrolled and enabled for device entry. */ Loading