Minor face auth fixes
1. Reset auth state on device going to sleep 2. Stop face auth when user input is happening on primary bouncer 3. Fix some logging inconsistencies Fixes: 275802536, 278627459 Test: atest DeviceEntryFaceAuthRepositoryTest, KeyguardFaceAuthInteractorTest Change-Id: I6f10ec30d6ce08072b33fa66759568f026e35fdb
This commit is contained in:
@@ -178,6 +178,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
|
||||
|
||||
@Override
|
||||
public void onUserInput() {
|
||||
mKeyguardFaceAuthInteractor.onPrimaryBouncerUserInput();
|
||||
mUpdateMonitor.cancelFaceAuth();
|
||||
}
|
||||
|
||||
|
||||
@@ -225,10 +225,17 @@ constructor(
|
||||
}
|
||||
|
||||
private fun observeFaceAuthResettingConditions() {
|
||||
// Clear auth status when keyguard is going away or when the user is switching.
|
||||
merge(keyguardRepository.isKeyguardGoingAway, userRepository.userSwitchingInProgress)
|
||||
.onEach { goingAwayOrUserSwitchingInProgress ->
|
||||
if (goingAwayOrUserSwitchingInProgress) {
|
||||
// Clear auth status when keyguard is going away or when the user is switching or device
|
||||
// starts going to sleep.
|
||||
merge(
|
||||
keyguardRepository.wakefulness.map {
|
||||
WakefulnessModel.isSleepingOrStartingToSleep(it)
|
||||
},
|
||||
keyguardRepository.isKeyguardGoingAway,
|
||||
userRepository.userSwitchingInProgress
|
||||
)
|
||||
.onEach { anyOfThemIsTrue ->
|
||||
if (anyOfThemIsTrue) {
|
||||
_isAuthenticated.value = false
|
||||
retryCount = 0
|
||||
halErrorRetryJob?.cancel()
|
||||
@@ -248,8 +255,8 @@ constructor(
|
||||
"nonStrongBiometricIsNotAllowed",
|
||||
faceDetectLog
|
||||
),
|
||||
// We don't want to run face detect if it's not possible to authenticate with FP
|
||||
// from the bouncer. UDFPS is the only fp sensor type that won't support this.
|
||||
// We don't want to run face detect if fingerprint can be used to unlock the device
|
||||
// but it's not possible to authenticate with FP from the bouncer (UDFPS)
|
||||
logAndObserve(
|
||||
and(isUdfps(), deviceEntryFingerprintAuthRepository.isRunning).isFalse(),
|
||||
"udfpsAuthIsNotPossibleAnymore",
|
||||
@@ -306,7 +313,7 @@ constructor(
|
||||
logAndObserve(
|
||||
combine(
|
||||
keyguardInteractor.isSecureCameraActive,
|
||||
alternateBouncerInteractor.isVisible,
|
||||
alternateBouncerInteractor.isVisible
|
||||
) { a, b ->
|
||||
!a || b
|
||||
},
|
||||
@@ -334,12 +341,12 @@ constructor(
|
||||
logAndObserve(isLockedOut.isFalse(), "isNotInLockOutState", faceAuthLog),
|
||||
logAndObserve(
|
||||
deviceEntryFingerprintAuthRepository.isLockedOut.isFalse(),
|
||||
"fpLockedOut",
|
||||
"fpIsNotLockedOut",
|
||||
faceAuthLog
|
||||
),
|
||||
logAndObserve(
|
||||
trustRepository.isCurrentUserTrusted.isFalse(),
|
||||
"currentUserTrusted",
|
||||
"currentUserIsNotTrusted",
|
||||
faceAuthLog
|
||||
),
|
||||
logAndObserve(
|
||||
|
||||
@@ -59,6 +59,7 @@ interface KeyguardFaceAuthInteractor {
|
||||
fun onQsExpansionStared()
|
||||
fun onNotificationPanelClicked()
|
||||
fun onSwipeUpOnBouncer()
|
||||
fun onPrimaryBouncerUserInput()
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -59,4 +59,5 @@ class NoopKeyguardFaceAuthInteractor @Inject constructor() : KeyguardFaceAuthInt
|
||||
override fun onNotificationPanelClicked() {}
|
||||
|
||||
override fun onSwipeUpOnBouncer() {}
|
||||
override fun onPrimaryBouncerUserInput() {}
|
||||
}
|
||||
|
||||
@@ -151,6 +151,10 @@ constructor(
|
||||
return featureFlags.isEnabled(Flags.FACE_AUTH_REFACTOR)
|
||||
}
|
||||
|
||||
override fun onPrimaryBouncerUserInput() {
|
||||
repository.cancel()
|
||||
}
|
||||
|
||||
/** Provide the status of face authentication */
|
||||
override val authenticationStatus = repository.authenticationStatus
|
||||
|
||||
|
||||
@@ -652,6 +652,58 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
|
||||
assertThat(authenticated()).isFalse()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun isAuthenticatedIsResetToFalseWhenDeviceStartsGoingToSleep() =
|
||||
testScope.runTest {
|
||||
initCollectors()
|
||||
allPreconditionsToRunFaceAuthAreTrue()
|
||||
|
||||
triggerFaceAuth(false)
|
||||
|
||||
authenticationCallback.value.onAuthenticationSucceeded(
|
||||
mock(FaceManager.AuthenticationResult::class.java)
|
||||
)
|
||||
|
||||
assertThat(authenticated()).isTrue()
|
||||
|
||||
keyguardRepository.setWakefulnessModel(
|
||||
WakefulnessModel(
|
||||
WakefulnessState.STARTING_TO_SLEEP,
|
||||
isWakingUpOrAwake = false,
|
||||
lastWakeReason = WakeSleepReason.POWER_BUTTON,
|
||||
lastSleepReason = WakeSleepReason.POWER_BUTTON
|
||||
)
|
||||
)
|
||||
|
||||
assertThat(authenticated()).isFalse()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun isAuthenticatedIsResetToFalseWhenDeviceGoesToSleep() =
|
||||
testScope.runTest {
|
||||
initCollectors()
|
||||
allPreconditionsToRunFaceAuthAreTrue()
|
||||
|
||||
triggerFaceAuth(false)
|
||||
|
||||
authenticationCallback.value.onAuthenticationSucceeded(
|
||||
mock(FaceManager.AuthenticationResult::class.java)
|
||||
)
|
||||
|
||||
assertThat(authenticated()).isTrue()
|
||||
|
||||
keyguardRepository.setWakefulnessModel(
|
||||
WakefulnessModel(
|
||||
WakefulnessState.ASLEEP,
|
||||
isWakingUpOrAwake = false,
|
||||
lastWakeReason = WakeSleepReason.POWER_BUTTON,
|
||||
lastSleepReason = WakeSleepReason.POWER_BUTTON
|
||||
)
|
||||
)
|
||||
|
||||
assertThat(authenticated()).isFalse()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun isAuthenticatedIsResetToFalseWhenUserIsSwitching() =
|
||||
testScope.runTest {
|
||||
|
||||
@@ -278,6 +278,23 @@ class KeyguardFaceAuthInteractorTest : SysuiTestCase() {
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun faceAuthIsCancelledWhenUserInputOnPrimaryBouncer() =
|
||||
testScope.runTest {
|
||||
underTest.start()
|
||||
|
||||
underTest.onSwipeUpOnBouncer()
|
||||
|
||||
runCurrent()
|
||||
assertThat(faceAuthRepository.isAuthRunning.value).isTrue()
|
||||
|
||||
underTest.onPrimaryBouncerUserInput()
|
||||
|
||||
runCurrent()
|
||||
|
||||
assertThat(faceAuthRepository.isAuthRunning.value).isFalse()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun faceAuthIsRequestedWhenSwipeUpOnBouncer() =
|
||||
testScope.runTest {
|
||||
|
||||
Reference in New Issue
Block a user