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

Commit a17f037f authored by Lucas Silva's avatar Lucas Silva
Browse files

Request face auth when exiting dreams

When the user taps to dismiss their dream, request face unlock similar
to how we run face auth when transitioning from AOD. This ensures the
user can quickly unlock after dismissing their dream.

Bug: 404585041
Test: enabled flag and dismissed dream, verified face auth triggers
Flag: android.service.dreams.dreams_v2
Change-Id: I6319939d5183e8443c82379a21403a7baeaa12e6
parent 2730dd7a
Loading
Loading
Loading
Loading
+29 −0
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@ import android.content.pm.UserInfo
import android.hardware.biometrics.BiometricFaceConstants
import android.hardware.biometrics.BiometricSourceType
import android.os.PowerManager
import android.platform.test.annotations.EnableFlags
import android.service.dreams.Flags.FLAG_DREAMS_V2
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.compose.animation.scene.ObservableTransitionState
@@ -156,6 +158,33 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
                )
        }

    @Test
    @EnableFlags(FLAG_DREAMS_V2)
    fun faceAuthIsRequestedWhenTransitioningFromDreamToLockscreen() =
        testScope.runTest {
            underTest.start()
            runCurrent()

            powerInteractor.setAwakeForTest(reason = PowerManager.WAKE_REASON_LID)
            faceWakeUpTriggersConfig.setTriggerFaceAuthOnWakeUpFrom(
                setOf(WakeSleepReason.LID.powerManagerWakeReason)
            )

            keyguardTransitionRepository.sendTransitionStep(
                TransitionStep(
                    KeyguardState.DREAMING,
                    KeyguardState.LOCKSCREEN,
                    transitionState = TransitionState.STARTED,
                )
            )

            runCurrent()
            assertThat(faceAuthRepository.runningAuthRequest.value)
                .isEqualTo(
                    Pair(FaceAuthUiEvent.FACE_AUTH_UPDATED_KEYGUARD_VISIBILITY_CHANGED, true)
                )
        }

    @Test
    fun whenFaceIsLockedOutAnyAttemptsToTriggerFaceAuthMustProvideLockoutError() =
        testScope.runTest {
+14 −5
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.app.trust.TrustManager
import android.content.Context
import android.hardware.biometrics.BiometricFaceConstants
import android.hardware.biometrics.BiometricSourceType
import android.service.dreams.Flags.dreamsV2
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.biometrics.data.repository.FacePropertyRepository
import com.android.systemui.biometrics.shared.model.LockoutMode
@@ -40,6 +41,7 @@ import com.android.systemui.keyguard.shared.model.DevicePosture
import com.android.systemui.keyguard.shared.model.Edge
import com.android.systemui.keyguard.shared.model.KeyguardState.AOD
import com.android.systemui.keyguard.shared.model.KeyguardState.DOZING
import com.android.systemui.keyguard.shared.model.KeyguardState.DREAMING
import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN
import com.android.systemui.keyguard.shared.model.KeyguardState.OFF
import com.android.systemui.keyguard.shared.model.TransitionState
@@ -136,11 +138,18 @@ constructor(
            }
            .launchIn(applicationScope)

        merge(
                keyguardTransitionInteractor.transition(Edge.create(AOD, LOCKSCREEN)),
                keyguardTransitionInteractor.transition(Edge.create(OFF, LOCKSCREEN)),
                keyguardTransitionInteractor.transition(Edge.create(DOZING, LOCKSCREEN)),
            )
        val transitionFlows = buildList {
            add(keyguardTransitionInteractor.transition(Edge.create(AOD, LOCKSCREEN)))
            add(keyguardTransitionInteractor.transition(Edge.create(OFF, LOCKSCREEN)))
            add(keyguardTransitionInteractor.transition(Edge.create(DOZING, LOCKSCREEN)))

            if (dreamsV2()) {
                add(keyguardTransitionInteractor.transition(Edge.create(DREAMING, LOCKSCREEN)))
            }
        }

        transitionFlows
            .merge()
            .filter { it.transitionState == TransitionState.STARTED }
            .sample(powerInteractor.detailedWakefulness)
            .filter { wakefulnessModel ->