Merge "Don't show lockout messages over occluding apps" into udc-qpr-dev

This commit is contained in:
Beverly Tai
2023-07-27 12:44:18 +00:00
committed by Android (Google) Code Review
4 changed files with 51 additions and 11 deletions

View File

@@ -20,6 +20,7 @@ package com.android.systemui.keyguard.domain.interactor
import android.content.res.Resources import android.content.res.Resources
import android.hardware.biometrics.BiometricSourceType import android.hardware.biometrics.BiometricSourceType
import android.hardware.biometrics.BiometricSourceType.FINGERPRINT import android.hardware.biometrics.BiometricSourceType.FINGERPRINT
import android.hardware.fingerprint.FingerprintManager
import com.android.keyguard.KeyguardUpdateMonitor import com.android.keyguard.KeyguardUpdateMonitor
import com.android.keyguard.KeyguardUpdateMonitor.BIOMETRIC_HELP_FINGERPRINT_NOT_RECOGNIZED import com.android.keyguard.KeyguardUpdateMonitor.BIOMETRIC_HELP_FINGERPRINT_NOT_RECOGNIZED
import com.android.systemui.biometrics.data.repository.FingerprintPropertyRepository import com.android.systemui.biometrics.data.repository.FingerprintPropertyRepository
@@ -129,7 +130,14 @@ data class BiometricMessage(
val type: BiometricMessageType, val type: BiometricMessageType,
val id: Int, val id: Int,
val message: String?, 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 { enum class BiometricMessageType {
HELP, HELP,

View File

@@ -18,7 +18,6 @@ package com.android.systemui.keyguard.domain.interactor
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.hardware.fingerprint.FingerprintManager
import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor
import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor
import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.SysUISingleton
@@ -35,6 +34,7 @@ import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.emptyFlow
import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.filterNot
import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
@@ -74,15 +74,13 @@ constructor(
private val fingerprintLockoutEvents: Flow<Unit> = private val fingerprintLockoutEvents: Flow<Unit> =
fingerprintAuthRepository.authenticationStatus fingerprintAuthRepository.authenticationStatus
.ifKeyguardOccludedByApp() .ifKeyguardOccludedByApp()
.filter { .filter { it is ErrorFingerprintAuthenticationStatus && it.isLockoutMessage() }
it is ErrorFingerprintAuthenticationStatus &&
(it.msgId == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT ||
it.msgId == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT_PERMANENT)
}
.map {} // maps FingerprintAuthenticationStatus => Unit .map {} // maps FingerprintAuthenticationStatus => Unit
val message: Flow<BiometricMessage?> = val message: Flow<BiometricMessage?> =
merge( merge(
biometricMessageInteractor.fingerprintErrorMessage, biometricMessageInteractor.fingerprintErrorMessage.filterNot {
it.isFingerprintLockoutMessage()
},
biometricMessageInteractor.fingerprintFailMessage, biometricMessageInteractor.fingerprintFailMessage,
biometricMessageInteractor.fingerprintHelpMessage, biometricMessageInteractor.fingerprintHelpMessage,
) )

View File

@@ -16,6 +16,7 @@
package com.android.systemui.keyguard.shared.model package com.android.systemui.keyguard.shared.model
import android.hardware.fingerprint.FingerprintManager
import android.os.SystemClock.elapsedRealtime import android.os.SystemClock.elapsedRealtime
/** /**
@@ -49,4 +50,9 @@ data class ErrorFingerprintAuthenticationStatus(
val msg: String? = null, val msg: String? = null,
// present to break equality check if the same error occurs repeatedly. // present to break equality check if the same error occurs repeatedly.
val createdAt: Long = elapsedRealtime(), val createdAt: Long = elapsedRealtime(),
) : FingerprintAuthenticationStatus() ) : FingerprintAuthenticationStatus() {
fun isLockoutMessage(): Boolean {
return msgId == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT ||
msgId == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT_PERMANENT
}
}

View File

@@ -233,12 +233,12 @@ class OccludingAppDeviceEntryInteractorTest : SysuiTestCase() {
// ERROR message // ERROR message
fingerprintAuthRepository.setAuthenticationStatus( fingerprintAuthRepository.setAuthenticationStatus(
ErrorFingerprintAuthenticationStatus( ErrorFingerprintAuthenticationStatus(
FingerprintManager.FINGERPRINT_ERROR_LOCKOUT, FingerprintManager.FINGERPRINT_ERROR_CANCELED,
"testError", "testError",
) )
) )
assertThat(message?.source).isEqualTo(BiometricSourceType.FINGERPRINT) 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?.message).isEqualTo("testError")
assertThat(message?.type).isEqualTo(BiometricMessageType.ERROR) assertThat(message?.type).isEqualTo(BiometricMessageType.ERROR)
@@ -262,6 +262,34 @@ class OccludingAppDeviceEntryInteractorTest : SysuiTestCase() {
assertThat(message?.type).isEqualTo(BiometricMessageType.FAIL) 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) { private fun givenOnOccludingApp(isOnOccludingApp: Boolean) {
keyguardRepository.setKeyguardOccluded(isOnOccludingApp) keyguardRepository.setKeyguardOccluded(isOnOccludingApp)
keyguardRepository.setKeyguardShowing(isOnOccludingApp) keyguardRepository.setKeyguardShowing(isOnOccludingApp)