diff options
7 files changed, 92 insertions, 9 deletions
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java index 76e051ea25f3..693268d730a4 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java @@ -178,6 +178,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard @Override public void onUserInput() { + mKeyguardFaceAuthInteractor.onPrimaryBouncerUserInput(); mUpdateMonitor.cancelFaceAuth(); } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt index dc5ac88472e4..5f2178df4346 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt @@ -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( diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardFaceAuthInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardFaceAuthInteractor.kt index 06ae11fe810c..74ef7a50fd44 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardFaceAuthInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardFaceAuthInteractor.kt @@ -59,6 +59,7 @@ interface KeyguardFaceAuthInteractor { fun onQsExpansionStared() fun onNotificationPanelClicked() fun onSwipeUpOnBouncer() + fun onPrimaryBouncerUserInput() } /** diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/NoopKeyguardFaceAuthInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/NoopKeyguardFaceAuthInteractor.kt index cad40aac00d3..5005b6c7f0df 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/NoopKeyguardFaceAuthInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/NoopKeyguardFaceAuthInteractor.kt @@ -59,4 +59,5 @@ class NoopKeyguardFaceAuthInteractor @Inject constructor() : KeyguardFaceAuthInt override fun onNotificationPanelClicked() {} override fun onSwipeUpOnBouncer() {} + override fun onPrimaryBouncerUserInput() {} } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/SystemUIKeyguardFaceAuthInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/SystemUIKeyguardFaceAuthInteractor.kt index 20ebb711c42d..6b515dab79f6 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/SystemUIKeyguardFaceAuthInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/SystemUIKeyguardFaceAuthInteractor.kt @@ -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 diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt index ffc6ee2a5a31..fa40fc431b5f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt @@ -644,6 +644,58 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() { } @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 { initCollectors() diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardFaceAuthInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardFaceAuthInteractorTest.kt index 3d1d2f46a65e..5da1a846fbfd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardFaceAuthInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardFaceAuthInteractorTest.kt @@ -279,6 +279,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 { underTest.start() |