diff options
3 files changed, 62 insertions, 1 deletions
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 2dd2d3948ba1..cc6438913667 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -4373,7 +4373,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab * Cancels all operations in the scheduler if it is hung for 10 seconds. */ public void startBiometricWatchdog() { - if (mFaceManager != null) { + if (mFaceManager != null && !isFaceAuthInteractorEnabled()) { mFaceManager.scheduleWatchdog(); } if (mFpm != null) { 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 c4fc8834df83..5f6098b8758f 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 @@ -34,6 +34,7 @@ import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dump.DumpManager import com.android.systemui.keyguard.domain.interactor.AlternateBouncerInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor +import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.shared.model.AcquiredAuthenticationStatus import com.android.systemui.keyguard.shared.model.AuthenticationStatus import com.android.systemui.keyguard.shared.model.DetectionStatus @@ -133,6 +134,7 @@ constructor( private val alternateBouncerInteractor: AlternateBouncerInteractor, @FaceDetectTableLog private val faceDetectLog: TableLogBuffer, @FaceAuthTableLog private val faceAuthLog: TableLogBuffer, + private val keyguardTransitionInteractor: KeyguardTransitionInteractor, dumpManager: DumpManager, ) : DeviceEntryFaceAuthRepository, Dumpable { private var authCancellationSignal: CancellationSignal? = null @@ -211,6 +213,13 @@ constructor( observeFaceAuthGatingChecks() observeFaceDetectGatingChecks() observeFaceAuthResettingConditions() + listenForSchedulingWatchdog() + } + + private fun listenForSchedulingWatchdog() { + keyguardTransitionInteractor.anyStateToGoneTransition + .onEach { faceManager?.scheduleWatchdog() } + .launchIn(applicationScope) } private fun observeFaceAuthResettingConditions() { 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 f21ea3dbed6d..fc75d47c01b7 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 @@ -44,11 +44,14 @@ import com.android.systemui.flags.FakeFeatureFlags import com.android.systemui.flags.Flags.FACE_AUTH_REFACTOR import com.android.systemui.keyguard.domain.interactor.AlternateBouncerInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor +import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.shared.model.AuthenticationStatus import com.android.systemui.keyguard.shared.model.DetectionStatus import com.android.systemui.keyguard.shared.model.ErrorAuthenticationStatus import com.android.systemui.keyguard.shared.model.HelpAuthenticationStatus +import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.SuccessAuthenticationStatus +import com.android.systemui.keyguard.shared.model.TransitionStep import com.android.systemui.keyguard.shared.model.WakeSleepReason import com.android.systemui.keyguard.shared.model.WakefulnessModel import com.android.systemui.keyguard.shared.model.WakefulnessState @@ -119,6 +122,7 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() { private lateinit var faceLockoutResetCallback: ArgumentCaptor<FaceManager.LockoutResetCallback> private lateinit var testDispatcher: TestDispatcher + private lateinit var keyguardTransitionRepository: FakeKeyguardTransitionRepository private lateinit var testScope: TestScope private lateinit var fakeUserRepository: FakeUserRepository private lateinit var authStatus: FlowValue<AuthenticationStatus?> @@ -189,6 +193,9 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() { val systemClock = FakeSystemClock() val faceAuthBuffer = TableLogBuffer(10, "face auth", systemClock) val faceDetectBuffer = TableLogBuffer(10, "face detect", systemClock) + keyguardTransitionRepository = FakeKeyguardTransitionRepository() + val keyguardTransitionInteractor = + KeyguardTransitionInteractor(keyguardTransitionRepository) return DeviceEntryFaceAuthRepositoryImpl( mContext, fmOverride, @@ -207,6 +214,7 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() { alternateBouncerInteractor, faceDetectBuffer, faceAuthBuffer, + keyguardTransitionInteractor, dumpManager, ) } @@ -772,6 +780,50 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() { } } + @Test + fun schedulesFaceManagerWatchdogWhenKeyguardIsGoneFromDozing() = + testScope.runTest { + keyguardTransitionRepository.sendTransitionStep( + TransitionStep(from = KeyguardState.DOZING, to = KeyguardState.GONE) + ) + + runCurrent() + verify(faceManager).scheduleWatchdog() + } + + @Test + fun schedulesFaceManagerWatchdogWhenKeyguardIsGoneFromAod() = + testScope.runTest { + keyguardTransitionRepository.sendTransitionStep( + TransitionStep(from = KeyguardState.AOD, to = KeyguardState.GONE) + ) + + runCurrent() + verify(faceManager).scheduleWatchdog() + } + + @Test + fun schedulesFaceManagerWatchdogWhenKeyguardIsGoneFromLockscreen() = + testScope.runTest { + keyguardTransitionRepository.sendTransitionStep( + TransitionStep(from = KeyguardState.LOCKSCREEN, to = KeyguardState.GONE) + ) + + runCurrent() + verify(faceManager).scheduleWatchdog() + } + + @Test + fun schedulesFaceManagerWatchdogWhenKeyguardIsGoneFromBouncer() = + testScope.runTest { + keyguardTransitionRepository.sendTransitionStep( + TransitionStep(from = KeyguardState.PRIMARY_BOUNCER, to = KeyguardState.GONE) + ) + + runCurrent() + verify(faceManager).scheduleWatchdog() + } + private suspend fun TestScope.testGatingCheckForFaceAuth(gatingCheckModifier: () -> Unit) { initCollectors() allPreconditionsToRunFaceAuthAreTrue() |