Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 657b7d7e authored by Chandru S's avatar Chandru S Committed by Android (Google) Code Review
Browse files

Merge "Schedule biometric watchdog whenever keyguard transitions to gone state." into udc-dev

parents 6f12ef23 86509bc0
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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) {
+9 −0
Original line number Diff line number Diff line
@@ -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() {
+52 −0
Original line number Diff line number Diff line
@@ -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()