Loading packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/BiometricMessageInteractor.kt +9 −1 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ package com.android.systemui.keyguard.domain.interactor import android.content.res.Resources import android.hardware.biometrics.BiometricSourceType import android.hardware.biometrics.BiometricSourceType.FINGERPRINT import android.hardware.fingerprint.FingerprintManager import com.android.keyguard.KeyguardUpdateMonitor import com.android.keyguard.KeyguardUpdateMonitor.BIOMETRIC_HELP_FINGERPRINT_NOT_RECOGNIZED import com.android.systemui.biometrics.data.repository.FingerprintPropertyRepository Loading Loading @@ -129,7 +130,14 @@ data class BiometricMessage( val type: BiometricMessageType, val id: Int, val message: String?, ) ) { fun isFingerprintLockoutMessage(): Boolean { return source == FINGERPRINT && type == BiometricMessageType.ERROR && (id == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT || id == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT_PERMANENT) } } enum class BiometricMessageType { HELP, Loading packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/OccludingAppDeviceEntryInteractor.kt +5 −7 Original line number Diff line number Diff line Loading @@ -18,7 +18,6 @@ package com.android.systemui.keyguard.domain.interactor import android.content.Context import android.content.Intent import android.hardware.fingerprint.FingerprintManager import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor import com.android.systemui.dagger.SysUISingleton Loading @@ -35,6 +34,7 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filterNot import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map Loading Loading @@ -74,15 +74,13 @@ constructor( private val fingerprintLockoutEvents: Flow<Unit> = fingerprintAuthRepository.authenticationStatus .ifKeyguardOccludedByApp() .filter { it is ErrorFingerprintAuthenticationStatus && (it.msgId == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT || it.msgId == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT_PERMANENT) } .filter { it is ErrorFingerprintAuthenticationStatus && it.isLockoutMessage() } .map {} // maps FingerprintAuthenticationStatus => Unit val message: Flow<BiometricMessage?> = merge( biometricMessageInteractor.fingerprintErrorMessage, biometricMessageInteractor.fingerprintErrorMessage.filterNot { it.isFingerprintLockoutMessage() }, biometricMessageInteractor.fingerprintFailMessage, biometricMessageInteractor.fingerprintHelpMessage, ) Loading packages/SystemUI/src/com/android/systemui/keyguard/shared/model/FingerprintAuthenticationModels.kt +7 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.keyguard.shared.model import android.hardware.fingerprint.FingerprintManager import android.os.SystemClock.elapsedRealtime /** Loading Loading @@ -49,4 +50,9 @@ data class ErrorFingerprintAuthenticationStatus( val msg: String? = null, // present to break equality check if the same error occurs repeatedly. val createdAt: Long = elapsedRealtime(), ) : FingerprintAuthenticationStatus() ) : FingerprintAuthenticationStatus() { fun isLockoutMessage(): Boolean { return msgId == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT || msgId == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT_PERMANENT } } packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/OccludingAppDeviceEntryInteractorTest.kt +30 −2 Original line number Diff line number Diff line Loading @@ -233,12 +233,12 @@ class OccludingAppDeviceEntryInteractorTest : SysuiTestCase() { // ERROR message fingerprintAuthRepository.setAuthenticationStatus( ErrorFingerprintAuthenticationStatus( FingerprintManager.FINGERPRINT_ERROR_LOCKOUT, FingerprintManager.FINGERPRINT_ERROR_CANCELED, "testError", ) ) assertThat(message?.source).isEqualTo(BiometricSourceType.FINGERPRINT) assertThat(message?.id).isEqualTo(FingerprintManager.FINGERPRINT_ERROR_LOCKOUT) assertThat(message?.id).isEqualTo(FingerprintManager.FINGERPRINT_ERROR_CANCELED) assertThat(message?.message).isEqualTo("testError") assertThat(message?.type).isEqualTo(BiometricMessageType.ERROR) Loading @@ -262,6 +262,34 @@ class OccludingAppDeviceEntryInteractorTest : SysuiTestCase() { assertThat(message?.type).isEqualTo(BiometricMessageType.FAIL) } @Test fun message_fpError_lockoutFilteredOut() = testScope.runTest { val message by collectLastValue(underTest.message) givenOnOccludingApp(true) givenPrimaryAuthRequired(false) runCurrent() // permanent lockout error message fingerprintAuthRepository.setAuthenticationStatus( ErrorFingerprintAuthenticationStatus( FingerprintManager.FINGERPRINT_ERROR_LOCKOUT_PERMANENT, "testPermanentLockoutMessageFiltered", ) ) assertThat(message).isNull() // temporary lockout error message fingerprintAuthRepository.setAuthenticationStatus( ErrorFingerprintAuthenticationStatus( FingerprintManager.FINGERPRINT_ERROR_LOCKOUT, "testLockoutMessageFiltered", ) ) assertThat(message).isNull() } private fun givenOnOccludingApp(isOnOccludingApp: Boolean) { keyguardRepository.setKeyguardOccluded(isOnOccludingApp) keyguardRepository.setKeyguardShowing(isOnOccludingApp) Loading Loading
packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/BiometricMessageInteractor.kt +9 −1 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ package com.android.systemui.keyguard.domain.interactor import android.content.res.Resources import android.hardware.biometrics.BiometricSourceType import android.hardware.biometrics.BiometricSourceType.FINGERPRINT import android.hardware.fingerprint.FingerprintManager import com.android.keyguard.KeyguardUpdateMonitor import com.android.keyguard.KeyguardUpdateMonitor.BIOMETRIC_HELP_FINGERPRINT_NOT_RECOGNIZED import com.android.systemui.biometrics.data.repository.FingerprintPropertyRepository Loading Loading @@ -129,7 +130,14 @@ data class BiometricMessage( val type: BiometricMessageType, val id: Int, val message: String?, ) ) { fun isFingerprintLockoutMessage(): Boolean { return source == FINGERPRINT && type == BiometricMessageType.ERROR && (id == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT || id == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT_PERMANENT) } } enum class BiometricMessageType { HELP, Loading
packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/OccludingAppDeviceEntryInteractor.kt +5 −7 Original line number Diff line number Diff line Loading @@ -18,7 +18,6 @@ package com.android.systemui.keyguard.domain.interactor import android.content.Context import android.content.Intent import android.hardware.fingerprint.FingerprintManager import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor import com.android.systemui.dagger.SysUISingleton Loading @@ -35,6 +34,7 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filterNot import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map Loading Loading @@ -74,15 +74,13 @@ constructor( private val fingerprintLockoutEvents: Flow<Unit> = fingerprintAuthRepository.authenticationStatus .ifKeyguardOccludedByApp() .filter { it is ErrorFingerprintAuthenticationStatus && (it.msgId == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT || it.msgId == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT_PERMANENT) } .filter { it is ErrorFingerprintAuthenticationStatus && it.isLockoutMessage() } .map {} // maps FingerprintAuthenticationStatus => Unit val message: Flow<BiometricMessage?> = merge( biometricMessageInteractor.fingerprintErrorMessage, biometricMessageInteractor.fingerprintErrorMessage.filterNot { it.isFingerprintLockoutMessage() }, biometricMessageInteractor.fingerprintFailMessage, biometricMessageInteractor.fingerprintHelpMessage, ) Loading
packages/SystemUI/src/com/android/systemui/keyguard/shared/model/FingerprintAuthenticationModels.kt +7 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.keyguard.shared.model import android.hardware.fingerprint.FingerprintManager import android.os.SystemClock.elapsedRealtime /** Loading Loading @@ -49,4 +50,9 @@ data class ErrorFingerprintAuthenticationStatus( val msg: String? = null, // present to break equality check if the same error occurs repeatedly. val createdAt: Long = elapsedRealtime(), ) : FingerprintAuthenticationStatus() ) : FingerprintAuthenticationStatus() { fun isLockoutMessage(): Boolean { return msgId == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT || msgId == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT_PERMANENT } }
packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/OccludingAppDeviceEntryInteractorTest.kt +30 −2 Original line number Diff line number Diff line Loading @@ -233,12 +233,12 @@ class OccludingAppDeviceEntryInteractorTest : SysuiTestCase() { // ERROR message fingerprintAuthRepository.setAuthenticationStatus( ErrorFingerprintAuthenticationStatus( FingerprintManager.FINGERPRINT_ERROR_LOCKOUT, FingerprintManager.FINGERPRINT_ERROR_CANCELED, "testError", ) ) assertThat(message?.source).isEqualTo(BiometricSourceType.FINGERPRINT) assertThat(message?.id).isEqualTo(FingerprintManager.FINGERPRINT_ERROR_LOCKOUT) assertThat(message?.id).isEqualTo(FingerprintManager.FINGERPRINT_ERROR_CANCELED) assertThat(message?.message).isEqualTo("testError") assertThat(message?.type).isEqualTo(BiometricMessageType.ERROR) Loading @@ -262,6 +262,34 @@ class OccludingAppDeviceEntryInteractorTest : SysuiTestCase() { assertThat(message?.type).isEqualTo(BiometricMessageType.FAIL) } @Test fun message_fpError_lockoutFilteredOut() = testScope.runTest { val message by collectLastValue(underTest.message) givenOnOccludingApp(true) givenPrimaryAuthRequired(false) runCurrent() // permanent lockout error message fingerprintAuthRepository.setAuthenticationStatus( ErrorFingerprintAuthenticationStatus( FingerprintManager.FINGERPRINT_ERROR_LOCKOUT_PERMANENT, "testPermanentLockoutMessageFiltered", ) ) assertThat(message).isNull() // temporary lockout error message fingerprintAuthRepository.setAuthenticationStatus( ErrorFingerprintAuthenticationStatus( FingerprintManager.FINGERPRINT_ERROR_LOCKOUT, "testLockoutMessageFiltered", ) ) assertThat(message).isNull() } private fun givenOnOccludingApp(isOnOccludingApp: Boolean) { keyguardRepository.setKeyguardOccluded(isOnOccludingApp) keyguardRepository.setKeyguardShowing(isOnOccludingApp) Loading