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

Commit 958116b9 authored by burakov's avatar burakov
Browse files

[Dual Shade] Fix DeviceEntryFaceAuthInteractorTest for DualShade.

This ensures these unit tests do not fail when Dual Shade is the default
shade experience in scene container.

Bug: 376411622
Test: Updated unit tests.
Flag: com.android.systemui.scene_container
Change-Id: I9e1db48f6b3b4ba623f0f268ec882f75da86ff8f
parent 18a28c36
Loading
Loading
Loading
Loading
+122 −148
Original line number Original line Diff line number Diff line
@@ -37,7 +37,6 @@ import com.android.systemui.bouncer.data.repository.fakeKeyguardBouncerRepositor
import com.android.systemui.bouncer.domain.interactor.alternateBouncerInteractor
import com.android.systemui.bouncer.domain.interactor.alternateBouncerInteractor
import com.android.systemui.bouncer.domain.interactor.primaryBouncerInteractor
import com.android.systemui.bouncer.domain.interactor.primaryBouncerInteractor
import com.android.systemui.camera.domain.interactor.cameraSensorPrivacyInteractor
import com.android.systemui.camera.domain.interactor.cameraSensorPrivacyInteractor
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.deviceentry.data.repository.fakeFaceWakeUpTriggersConfig
import com.android.systemui.deviceentry.data.repository.fakeFaceWakeUpTriggersConfig
import com.android.systemui.deviceentry.shared.FaceAuthUiEvent
import com.android.systemui.deviceentry.shared.FaceAuthUiEvent
import com.android.systemui.deviceentry.shared.model.ErrorFaceAuthenticationStatus
import com.android.systemui.deviceentry.shared.model.ErrorFaceAuthenticationStatus
@@ -51,6 +50,9 @@ import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInterac
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionStep
import com.android.systemui.keyguard.shared.model.TransitionStep
import com.android.systemui.kosmos.collectLastValue
import com.android.systemui.kosmos.runCurrent
import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.testDispatcher
import com.android.systemui.kosmos.testDispatcher
import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.testScope
import com.android.systemui.log.FaceAuthenticationLogger
import com.android.systemui.log.FaceAuthenticationLogger
@@ -63,17 +65,13 @@ import com.android.systemui.scene.data.repository.setSceneTransition
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.scene.shared.model.Overlays
import com.android.systemui.scene.shared.model.Overlays
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.shade.domain.interactor.enableSingleShade
import com.android.systemui.testKosmos
import com.android.systemui.testKosmos
import com.android.systemui.user.data.model.SelectionStatus
import com.android.systemui.user.data.model.SelectionStatus
import com.android.systemui.user.data.repository.fakeUserRepository
import com.android.systemui.user.data.repository.fakeUserRepository
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.mockito.eq
import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Before
import org.junit.Test
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runner.RunWith
@@ -81,74 +79,57 @@ import org.mockito.ArgumentMatchers.anyInt
import org.mockito.Mockito.never
import org.mockito.Mockito.never
import org.mockito.Mockito.verify
import org.mockito.Mockito.verify


@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@SmallTest
@RunWith(AndroidJUnit4::class)
@RunWith(AndroidJUnit4::class)
class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {

    private val kosmos = testKosmos()
    private val kosmos = testKosmos()
    private val testScope: TestScope = kosmos.testScope


    private lateinit var underTest: SystemUIDeviceEntryFaceAuthInteractor
    private lateinit var underTest: SystemUIDeviceEntryFaceAuthInteractor


    private val bouncerRepository = kosmos.fakeKeyguardBouncerRepository
    private val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
    private val faceAuthRepository = kosmos.fakeDeviceEntryFaceAuthRepository
    private val faceAuthRepository = kosmos.fakeDeviceEntryFaceAuthRepository
    private val fakeUserRepository = kosmos.fakeUserRepository
    private val facePropertyRepository = kosmos.facePropertyRepository
    private val fakeBiometricSettingsRepository = kosmos.fakeBiometricSettingsRepository

    private val keyguardUpdateMonitor by lazy { kosmos.keyguardUpdateMonitor }
    private val faceWakeUpTriggersConfig = kosmos.fakeFaceWakeUpTriggersConfig
    private val trustManager = kosmos.trustManager

    private val keyguardTransitionInteractor by lazy { kosmos.keyguardTransitionInteractor }
    private val fakeDeviceEntryFingerprintAuthInteractor by lazy {
        kosmos.deviceEntryFingerprintAuthInteractor
    }
    private val powerInteractor by lazy { kosmos.powerInteractor }
    private val deviceEntryFaceAuthStatusInteractor by lazy {
        kosmos.deviceEntryFaceAuthStatusInteractor
    }


    @Before
    @Before
    fun setup() {
    fun setup() {
        fakeUserRepository.setUserInfos(listOf(primaryUser, secondaryUser))
        kosmos.fakeUserRepository.setUserInfos(listOf(primaryUser, secondaryUser))
        underTest =
        underTest =
            with(kosmos) {
                SystemUIDeviceEntryFaceAuthInteractor(
                SystemUIDeviceEntryFaceAuthInteractor(
                    mContext,
                    mContext,
                    testScope.backgroundScope,
                    testScope.backgroundScope,
                kosmos.testDispatcher,
                    testDispatcher,
                    faceAuthRepository,
                    faceAuthRepository,
                { kosmos.primaryBouncerInteractor },
                    { primaryBouncerInteractor },
                kosmos.alternateBouncerInteractor,
                    alternateBouncerInteractor,
                    keyguardTransitionInteractor,
                    keyguardTransitionInteractor,
                    FaceAuthenticationLogger(logcatLogBuffer("faceAuthBuffer")),
                    FaceAuthenticationLogger(logcatLogBuffer("faceAuthBuffer")),
                    keyguardUpdateMonitor,
                    keyguardUpdateMonitor,
                fakeDeviceEntryFingerprintAuthInteractor,
                    deviceEntryFingerprintAuthInteractor,
                    fakeUserRepository,
                    fakeUserRepository,
                    facePropertyRepository,
                    facePropertyRepository,
                faceWakeUpTriggersConfig,
                    fakeFaceWakeUpTriggersConfig,
                    powerInteractor,
                    powerInteractor,
                    fakeBiometricSettingsRepository,
                    fakeBiometricSettingsRepository,
                    trustManager,
                    trustManager,
                { kosmos.sceneInteractor },
                    { sceneInteractor },
                    deviceEntryFaceAuthStatusInteractor,
                    deviceEntryFaceAuthStatusInteractor,
                kosmos.cameraSensorPrivacyInteractor,
                    cameraSensorPrivacyInteractor,
                )
                )
            }
            }
    }


    @Test
    @Test
    fun faceAuthIsRequestedWhenLockscreenBecomesVisibleFromOffState() =
    fun faceAuthIsRequestedWhenLockscreenBecomesVisibleFromOffState() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()
            runCurrent()
            runCurrent()


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


            keyguardTransitionRepository.sendTransitionStep(
            fakeKeyguardTransitionRepository.sendTransitionStep(
                TransitionStep(
                TransitionStep(
                    KeyguardState.OFF,
                    KeyguardState.OFF,
                    KeyguardState.LOCKSCREEN,
                    KeyguardState.LOCKSCREEN,
@@ -166,16 +147,16 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
    @Test
    @Test
    @EnableFlags(FLAG_DREAMS_V2)
    @EnableFlags(FLAG_DREAMS_V2)
    fun faceAuthIsRequestedWhenTransitioningFromDreamToLockscreen() =
    fun faceAuthIsRequestedWhenTransitioningFromDreamToLockscreen() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()
            runCurrent()
            runCurrent()


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


            keyguardTransitionRepository.sendTransitionStep(
            fakeKeyguardTransitionRepository.sendTransitionStep(
                TransitionStep(
                TransitionStep(
                    KeyguardState.DREAMING,
                    KeyguardState.DREAMING,
                    KeyguardState.LOCKSCREEN,
                    KeyguardState.LOCKSCREEN,
@@ -192,7 +173,7 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {


    @Test
    @Test
    fun whenFaceIsLockedOutAndNonBypassAnyAttemptsToTriggerFaceAuthMustProvideLockoutError() =
    fun whenFaceIsLockedOutAndNonBypassAnyAttemptsToTriggerFaceAuthMustProvideLockoutError() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()
            val authenticationStatus = collectLastValue(underTest.authenticationStatus)
            val authenticationStatus = collectLastValue(underTest.authenticationStatus)
            faceAuthRepository.setLockedOut(true)
            faceAuthRepository.setLockedOut(true)
@@ -209,11 +190,11 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {


    @Test
    @Test
    fun whenFaceIsLockedOutAndBypass_DetectRuns() =
    fun whenFaceIsLockedOutAndBypass_DetectRuns() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()
            val authenticationStatus = collectLastValue(underTest.authenticationStatus)
            val authenticationStatus = collectLastValue(underTest.authenticationStatus)
            faceAuthRepository.setLockedOut(true)
            faceAuthRepository.setLockedOut(true)
            kosmos.fakeDeviceEntryFaceAuthRepository.isBypassEnabled.value = true
            fakeDeviceEntryFaceAuthRepository.isBypassEnabled.value = true


            underTest.onDeviceLifted()
            underTest.onDeviceLifted()


@@ -222,16 +203,16 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {


    @Test
    @Test
    fun faceAuthIsRequestedWhenLockscreenBecomesVisibleFromAodState() =
    fun faceAuthIsRequestedWhenLockscreenBecomesVisibleFromAodState() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()
            runCurrent()
            runCurrent()


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


            keyguardTransitionRepository.sendTransitionStep(
            fakeKeyguardTransitionRepository.sendTransitionStep(
                TransitionStep(
                TransitionStep(
                    KeyguardState.AOD,
                    KeyguardState.AOD,
                    KeyguardState.LOCKSCREEN,
                    KeyguardState.LOCKSCREEN,
@@ -248,15 +229,15 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {


    @Test
    @Test
    fun faceAuthIsNotRequestedWhenLockscreenBecomesVisibleDueToIgnoredWakeReasons() =
    fun faceAuthIsNotRequestedWhenLockscreenBecomesVisibleDueToIgnoredWakeReasons() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()


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


            keyguardTransitionRepository.sendTransitionStep(
            fakeKeyguardTransitionRepository.sendTransitionStep(
                TransitionStep(
                TransitionStep(
                    KeyguardState.DOZING,
                    KeyguardState.DOZING,
                    KeyguardState.LOCKSCREEN,
                    KeyguardState.LOCKSCREEN,
@@ -270,16 +251,16 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {


    @Test
    @Test
    fun faceAuthIsRequestedWhenLockscreenBecomesVisibleFromDozingState() =
    fun faceAuthIsRequestedWhenLockscreenBecomesVisibleFromDozingState() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()
            runCurrent()
            runCurrent()


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


            keyguardTransitionRepository.sendTransitionStep(
            fakeKeyguardTransitionRepository.sendTransitionStep(
                TransitionStep(
                TransitionStep(
                    KeyguardState.DOZING,
                    KeyguardState.DOZING,
                    KeyguardState.LOCKSCREEN,
                    KeyguardState.LOCKSCREEN,
@@ -297,7 +278,7 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
    @Test
    @Test
    @DisableSceneContainer
    @DisableSceneContainer
    fun faceAuthLockedOutStateIsUpdatedAfterUserSwitch() =
    fun faceAuthLockedOutStateIsUpdatedAfterUserSwitch() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()
            runCurrent()
            runCurrent()
            fakeBiometricSettingsRepository.setIsFaceAuthEnrolledAndEnabled(true)
            fakeBiometricSettingsRepository.setIsFaceAuthEnrolledAndEnabled(true)
@@ -310,7 +291,7 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
            )
            )
            runCurrent()
            runCurrent()


            bouncerRepository.setPrimaryShow(true)
            fakeKeyguardBouncerRepository.setPrimaryShow(true)
            // New user is not locked out.
            // New user is not locked out.
            facePropertyRepository.setLockoutMode(secondaryUser.id, LockoutMode.NONE)
            facePropertyRepository.setLockoutMode(secondaryUser.id, LockoutMode.NONE)
            fakeUserRepository.setSelectedUserInfo(
            fakeUserRepository.setSelectedUserInfo(
@@ -330,7 +311,7 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
    @Test
    @Test
    @EnableSceneContainer
    @EnableSceneContainer
    fun faceAuthLockedOutStateIsUpdatedAfterUserSwitch_withSceneContainerEnabled() =
    fun faceAuthLockedOutStateIsUpdatedAfterUserSwitch_withSceneContainerEnabled() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()
            runCurrent()
            runCurrent()
            fakeBiometricSettingsRepository.setIsFaceAuthEnrolledAndEnabled(true)
            fakeBiometricSettingsRepository.setIsFaceAuthEnrolledAndEnabled(true)
@@ -344,12 +325,10 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
            )
            )
            runCurrent()
            runCurrent()


            kosmos.sceneInteractor.snapToScene(Scenes.Lockscreen, "for-test")
            sceneInteractor.snapToScene(Scenes.Lockscreen, "for-test")
            kosmos.sceneInteractor.showOverlay(Overlays.Bouncer, "for-test")
            sceneInteractor.showOverlay(Overlays.Bouncer, "for-test")
            kosmos.sceneInteractor.setTransitionState(
            sceneInteractor.setTransitionState(
                MutableStateFlow(
                flowOf(ObservableTransitionState.Idle(Scenes.Lockscreen, setOf(Overlays.Bouncer)))
                    ObservableTransitionState.Idle(Scenes.Lockscreen, setOf(Overlays.Bouncer))
                )
            )
            )
            runCurrent()
            runCurrent()


@@ -372,15 +351,13 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
    @Test
    @Test
    @EnableSceneContainer
    @EnableSceneContainer
    fun faceAuthIsRequestedWhenPrimaryBouncerIsVisible_withSceneContainerEnabled() =
    fun faceAuthIsRequestedWhenPrimaryBouncerIsVisible_withSceneContainerEnabled() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()


            kosmos.sceneInteractor.snapToScene(Scenes.Lockscreen, "for-test")
            sceneInteractor.snapToScene(Scenes.Lockscreen, "for-test")
            kosmos.sceneInteractor.showOverlay(Overlays.Bouncer, "for-test")
            sceneInteractor.showOverlay(Overlays.Bouncer, "for-test")
            kosmos.sceneInteractor.setTransitionState(
            sceneInteractor.setTransitionState(
                MutableStateFlow(
                flowOf(ObservableTransitionState.Idle(Scenes.Lockscreen, setOf(Overlays.Bouncer)))
                    ObservableTransitionState.Idle(Scenes.Lockscreen, setOf(Overlays.Bouncer))
                )
            )
            )
            runCurrent()
            runCurrent()


@@ -391,15 +368,15 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
    @Test
    @Test
    @DisableSceneContainer
    @DisableSceneContainer
    fun faceAuthIsRequestedWhenPrimaryBouncerIsAboutToShow() =
    fun faceAuthIsRequestedWhenPrimaryBouncerIsAboutToShow() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()


            bouncerRepository.setPrimaryShowingSoon(false)
            fakeKeyguardBouncerRepository.setPrimaryShowingSoon(false)
            runCurrent()
            runCurrent()


            bouncerRepository.setPrimaryShowingSoon(true)
            fakeKeyguardBouncerRepository.setPrimaryShowingSoon(true)

            runCurrent()
            runCurrent()

            assertThat(faceAuthRepository.runningAuthRequest.value)
            assertThat(faceAuthRepository.runningAuthRequest.value)
                .isEqualTo(
                .isEqualTo(
                    Pair(
                    Pair(
@@ -412,16 +389,17 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
    @Test
    @Test
    @DisableSceneContainer
    @DisableSceneContainer
    fun faceAuthIsOnlyRequestedWhenPrimaryBouncerIsAboutToShow() =
    fun faceAuthIsOnlyRequestedWhenPrimaryBouncerIsAboutToShow() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()


            bouncerRepository.setPrimaryShowingSoon(false)
            fakeKeyguardBouncerRepository.setPrimaryShowingSoon(false)
            bouncerRepository.setPrimaryShow(false)
            fakeKeyguardBouncerRepository.setPrimaryShow(false)
            runCurrent()
            runCurrent()


            bouncerRepository.setPrimaryShowingSoon(true)
            fakeKeyguardBouncerRepository.setPrimaryShowingSoon(true)
            runCurrent()
            runCurrent()
            bouncerRepository.setPrimaryShow(true)

            fakeKeyguardBouncerRepository.setPrimaryShow(true)
            runCurrent()
            runCurrent()


            assertThat(faceAuthRepository.runningAuthRequest.value)
            assertThat(faceAuthRepository.runningAuthRequest.value)
@@ -436,15 +414,13 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
    @Test
    @Test
    @EnableSceneContainer
    @EnableSceneContainer
    fun withSceneContainerEnabled_faceAuthIsRequestedWhenPrimaryBouncerIsVisible() =
    fun withSceneContainerEnabled_faceAuthIsRequestedWhenPrimaryBouncerIsVisible() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()


            kosmos.sceneInteractor.snapToScene(Scenes.Lockscreen, "for-test")
            sceneInteractor.snapToScene(Scenes.Lockscreen, "for-test")
            kosmos.sceneInteractor.showOverlay(Overlays.Bouncer, "for-test")
            sceneInteractor.showOverlay(Overlays.Bouncer, "for-test")
            kosmos.sceneInteractor.setTransitionState(
            sceneInteractor.setTransitionState(
                MutableStateFlow(
                flowOf(ObservableTransitionState.Idle(Scenes.Lockscreen, setOf(Overlays.Bouncer)))
                    ObservableTransitionState.Idle(Scenes.Lockscreen, setOf(Overlays.Bouncer))
                )
            )
            )


            runCurrent()
            runCurrent()
@@ -455,10 +431,10 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
    @Test
    @Test
    @EnableSceneContainer
    @EnableSceneContainer
    fun withSceneContainerEnabled_faceAuthIsRequestedWhenTransitioningToPrimaryBouncer() =
    fun withSceneContainerEnabled_faceAuthIsRequestedWhenTransitioningToPrimaryBouncer() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()


            kosmos.setSceneTransition(
            setSceneTransition(
                ShowOverlay(
                ShowOverlay(
                    overlay = Overlays.Bouncer,
                    overlay = Overlays.Bouncer,
                    fromScene = Scenes.Lockscreen,
                    fromScene = Scenes.Lockscreen,
@@ -471,15 +447,15 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {


    @Test
    @Test
    fun faceAuthIsRequestedWhenAlternateBouncerIsVisible() =
    fun faceAuthIsRequestedWhenAlternateBouncerIsVisible() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()


            bouncerRepository.setAlternateVisible(false)
            fakeKeyguardBouncerRepository.setAlternateVisible(false)
            runCurrent()
            runCurrent()


            bouncerRepository.setAlternateVisible(true)
            fakeKeyguardBouncerRepository.setAlternateVisible(true)

            runCurrent()
            runCurrent()

            assertThat(faceAuthRepository.runningAuthRequest.value)
            assertThat(faceAuthRepository.runningAuthRequest.value)
                .isEqualTo(
                .isEqualTo(
                    Pair(
                    Pair(
@@ -491,7 +467,7 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {


    @Test
    @Test
    fun faceAuthIsRequestedWhenUdfpsSensorTouched() =
    fun faceAuthIsRequestedWhenUdfpsSensorTouched() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()


            underTest.onUdfpsSensorTouched()
            underTest.onUdfpsSensorTouched()
@@ -503,7 +479,7 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {


    @Test
    @Test
    fun faceAuthIsRequestedWhenOnAssistantTriggeredOnLockScreen() =
    fun faceAuthIsRequestedWhenOnAssistantTriggeredOnLockScreen() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()


            underTest.onAssistantTriggeredOnLockScreen()
            underTest.onAssistantTriggeredOnLockScreen()
@@ -517,7 +493,7 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {


    @Test
    @Test
    fun faceAuthIsRequestedWhenDeviceLifted() =
    fun faceAuthIsRequestedWhenDeviceLifted() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()


            underTest.onDeviceLifted()
            underTest.onDeviceLifted()
@@ -531,7 +507,7 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {


    @Test
    @Test
    fun faceAuthIsRequestedWhenShadeExpansionStarted() =
    fun faceAuthIsRequestedWhenShadeExpansionStarted() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()


            underTest.onShadeExpansionStarted()
            underTest.onShadeExpansionStarted()
@@ -544,20 +520,22 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
    @Test
    @Test
    @EnableSceneContainer
    @EnableSceneContainer
    fun faceAuthIsRequestedWhenShadeExpansionIsStarted() =
    fun faceAuthIsRequestedWhenShadeExpansionIsStarted() =
        testScope.runTest {
        kosmos.runTest {
            enableSingleShade()
            runCurrent()
            underTest.start()
            underTest.start()
            faceAuthRepository.canRunFaceAuth.value = true
            faceAuthRepository.canRunFaceAuth.value = true
            kosmos.sceneInteractor.snapToScene(toScene = Scenes.Lockscreen, "for-test")
            sceneInteractor.snapToScene(toScene = Scenes.Lockscreen, "for-test")
            runCurrent()
            runCurrent()


            kosmos.sceneInteractor.changeScene(toScene = Scenes.Shade, loggingReason = "for-test")
            sceneInteractor.changeScene(toScene = Scenes.Shade, loggingReason = "for-test")
            kosmos.sceneInteractor.setTransitionState(
            sceneInteractor.setTransitionState(
                MutableStateFlow(
                flowOf(
                    ObservableTransitionState.Transition(
                    ObservableTransitionState.Transition(
                        fromScene = Scenes.Lockscreen,
                        fromScene = Scenes.Lockscreen,
                        toScene = Scenes.Shade,
                        toScene = Scenes.Shade,
                        currentScene = flowOf(Scenes.Lockscreen),
                        currentScene = flowOf(Scenes.Lockscreen),
                        progress = MutableStateFlow(0.2f),
                        progress = flowOf(0.2f),
                        isInitiatedByUserInput = true,
                        isInitiatedByUserInput = true,
                        isUserInputOngoing = flowOf(false),
                        isUserInputOngoing = flowOf(false),
                    )
                    )
@@ -572,20 +550,21 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
    @Test
    @Test
    @EnableSceneContainer
    @EnableSceneContainer
    fun faceAuthIsRequestedOnlyOnceWhenShadeExpansionStarts() =
    fun faceAuthIsRequestedOnlyOnceWhenShadeExpansionStarts() =
        testScope.runTest {
        kosmos.runTest {
            enableSingleShade()
            underTest.start()
            underTest.start()
            faceAuthRepository.canRunFaceAuth.value = true
            faceAuthRepository.canRunFaceAuth.value = true
            kosmos.sceneInteractor.snapToScene(toScene = Scenes.Lockscreen, "for-test")
            sceneInteractor.snapToScene(toScene = Scenes.Lockscreen, "for-test")
            runCurrent()
            runCurrent()


            kosmos.sceneInteractor.changeScene(toScene = Scenes.Shade, loggingReason = "for-test")
            sceneInteractor.changeScene(toScene = Scenes.Shade, loggingReason = "for-test")
            kosmos.sceneInteractor.setTransitionState(
            sceneInteractor.setTransitionState(
                MutableStateFlow(
                flowOf(
                    ObservableTransitionState.Transition(
                    ObservableTransitionState.Transition(
                        fromScene = Scenes.Lockscreen,
                        fromScene = Scenes.Lockscreen,
                        toScene = Scenes.Shade,
                        toScene = Scenes.Shade,
                        currentScene = flowOf(Scenes.Lockscreen),
                        currentScene = flowOf(Scenes.Lockscreen),
                        progress = MutableStateFlow(0.2f),
                        progress = flowOf(0.2f),
                        isInitiatedByUserInput = true,
                        isInitiatedByUserInput = true,
                        isUserInputOngoing = flowOf(false),
                        isUserInputOngoing = flowOf(false),
                    )
                    )
@@ -598,13 +577,13 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
            faceAuthRepository.runningAuthRequest.value = null
            faceAuthRepository.runningAuthRequest.value = null


            // expansion progress shouldn't trigger face auth again
            // expansion progress shouldn't trigger face auth again
            kosmos.sceneInteractor.setTransitionState(
            sceneInteractor.setTransitionState(
                MutableStateFlow(
                flowOf(
                    ObservableTransitionState.Transition(
                    ObservableTransitionState.Transition(
                        fromScene = Scenes.Lockscreen,
                        fromScene = Scenes.Lockscreen,
                        toScene = Scenes.Shade,
                        toScene = Scenes.Shade,
                        currentScene = flowOf(Scenes.Lockscreen),
                        currentScene = flowOf(Scenes.Lockscreen),
                        progress = MutableStateFlow(0.5f),
                        progress = flowOf(0.5f),
                        isInitiatedByUserInput = true,
                        isInitiatedByUserInput = true,
                        isUserInputOngoing = flowOf(false),
                        isUserInputOngoing = flowOf(false),
                    )
                    )
@@ -616,9 +595,8 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {


    @Test
    @Test
    fun faceAuthIsRequestedWhenNotificationPanelClicked() =
    fun faceAuthIsRequestedWhenNotificationPanelClicked() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()

            underTest.onNotificationPanelClicked()
            underTest.onNotificationPanelClicked()


            runCurrent()
            runCurrent()
@@ -630,26 +608,22 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {


    @Test
    @Test
    fun faceAuthIsCancelledWhenUserInputOnPrimaryBouncer() =
    fun faceAuthIsCancelledWhenUserInputOnPrimaryBouncer() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()

            underTest.onSwipeUpOnBouncer()
            underTest.onSwipeUpOnBouncer()


            runCurrent()
            runCurrent()
            assertThat(faceAuthRepository.isAuthRunning.value).isTrue()
            assertThat(faceAuthRepository.isAuthRunning.value).isTrue()


            underTest.onPrimaryBouncerUserInput()
            underTest.onPrimaryBouncerUserInput()

            runCurrent()
            runCurrent()

            assertThat(faceAuthRepository.isAuthRunning.value).isFalse()
            assertThat(faceAuthRepository.isAuthRunning.value).isFalse()
        }
        }


    @Test
    @Test
    fun faceAuthIsRequestedWhenSwipeUpOnBouncer() =
    fun faceAuthIsRequestedWhenSwipeUpOnBouncer() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()

            underTest.onSwipeUpOnBouncer()
            underTest.onSwipeUpOnBouncer()


            runCurrent()
            runCurrent()
@@ -659,7 +633,7 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {


    @Test
    @Test
    fun faceAuthIsRequestedWhenWalletIsLaunchedAndIfFaceAuthIsStrong() =
    fun faceAuthIsRequestedWhenWalletIsLaunchedAndIfFaceAuthIsStrong() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()
            facePropertyRepository.setSensorInfo(FaceSensorInfo(1, SensorStrength.STRONG))
            facePropertyRepository.setSensorInfo(FaceSensorInfo(1, SensorStrength.STRONG))


@@ -672,7 +646,7 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {


    @Test
    @Test
    fun faceAuthIsNotTriggeredIfFaceAuthIsWeak() =
    fun faceAuthIsNotTriggeredIfFaceAuthIsWeak() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()
            facePropertyRepository.setSensorInfo(FaceSensorInfo(1, SensorStrength.WEAK))
            facePropertyRepository.setSensorInfo(FaceSensorInfo(1, SensorStrength.WEAK))


@@ -684,7 +658,7 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {


    @Test
    @Test
    fun faceAuthIsNotTriggeredIfFaceAuthIsConvenience() =
    fun faceAuthIsNotTriggeredIfFaceAuthIsConvenience() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()
            facePropertyRepository.setSensorInfo(FaceSensorInfo(1, SensorStrength.CONVENIENCE))
            facePropertyRepository.setSensorInfo(FaceSensorInfo(1, SensorStrength.CONVENIENCE))


@@ -696,11 +670,11 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {


    @Test
    @Test
    fun faceUnlockIsDisabledWhenFpIsLockedOut() =
    fun faceUnlockIsDisabledWhenFpIsLockedOut() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()
            fakeBiometricSettingsRepository.setIsFaceAuthEnrolledAndEnabled(true)
            fakeBiometricSettingsRepository.setIsFaceAuthEnrolledAndEnabled(true)


            kosmos.fakeDeviceEntryFingerprintAuthRepository.setLockedOut(true)
            fakeDeviceEntryFingerprintAuthRepository.setLockedOut(true)
            runCurrent()
            runCurrent()


            assertThat(faceAuthRepository.isLockedOut.value).isTrue()
            assertThat(faceAuthRepository.isLockedOut.value).isTrue()
@@ -708,18 +682,18 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {


    @Test
    @Test
    fun faceLockoutStateIsResetWheneverFingerprintIsNotLockedOut() =
    fun faceLockoutStateIsResetWheneverFingerprintIsNotLockedOut() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()
            fakeUserRepository.setSelectedUserInfo(primaryUser, SelectionStatus.SELECTION_COMPLETE)
            fakeUserRepository.setSelectedUserInfo(primaryUser, SelectionStatus.SELECTION_COMPLETE)
            fakeBiometricSettingsRepository.setIsFaceAuthEnrolledAndEnabled(true)
            fakeBiometricSettingsRepository.setIsFaceAuthEnrolledAndEnabled(true)


            kosmos.fakeDeviceEntryFingerprintAuthRepository.setLockedOut(true)
            fakeDeviceEntryFingerprintAuthRepository.setLockedOut(true)
            runCurrent()
            runCurrent()


            assertThat(faceAuthRepository.isLockedOut.value).isTrue()
            assertThat(faceAuthRepository.isLockedOut.value).isTrue()
            facePropertyRepository.setLockoutMode(primaryUserId, LockoutMode.NONE)
            facePropertyRepository.setLockoutMode(primaryUserId, LockoutMode.NONE)


            kosmos.fakeDeviceEntryFingerprintAuthRepository.setLockedOut(false)
            fakeDeviceEntryFingerprintAuthRepository.setLockedOut(false)
            runCurrent()
            runCurrent()


            assertThat(faceAuthRepository.isLockedOut.value).isFalse()
            assertThat(faceAuthRepository.isLockedOut.value).isFalse()
@@ -727,18 +701,18 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {


    @Test
    @Test
    fun faceLockoutStateIsSetToUsersLockoutStateWheneverFingerprintIsNotLockedOut() =
    fun faceLockoutStateIsSetToUsersLockoutStateWheneverFingerprintIsNotLockedOut() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()
            fakeUserRepository.setSelectedUserInfo(primaryUser, SelectionStatus.SELECTION_COMPLETE)
            fakeUserRepository.setSelectedUserInfo(primaryUser, SelectionStatus.SELECTION_COMPLETE)
            fakeBiometricSettingsRepository.setIsFaceAuthEnrolledAndEnabled(true)
            fakeBiometricSettingsRepository.setIsFaceAuthEnrolledAndEnabled(true)


            kosmos.fakeDeviceEntryFingerprintAuthRepository.setLockedOut(true)
            fakeDeviceEntryFingerprintAuthRepository.setLockedOut(true)
            runCurrent()
            runCurrent()


            assertThat(faceAuthRepository.isLockedOut.value).isTrue()
            assertThat(faceAuthRepository.isLockedOut.value).isTrue()
            facePropertyRepository.setLockoutMode(primaryUserId, LockoutMode.TIMED)
            facePropertyRepository.setLockoutMode(primaryUserId, LockoutMode.TIMED)


            kosmos.fakeDeviceEntryFingerprintAuthRepository.setLockedOut(false)
            fakeDeviceEntryFingerprintAuthRepository.setLockedOut(false)
            runCurrent()
            runCurrent()


            assertThat(faceAuthRepository.isLockedOut.value).isTrue()
            assertThat(faceAuthRepository.isLockedOut.value).isTrue()
@@ -746,7 +720,7 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {


    @Test
    @Test
    fun whenIsAuthenticatedFalse_clearFaceBiometrics() =
    fun whenIsAuthenticatedFalse_clearFaceBiometrics() =
        testScope.runTest {
        kosmos.runTest {
            underTest.start()
            underTest.start()


            faceAuthRepository.isAuthenticated.value = true
            faceAuthRepository.isAuthenticated.value = true
@@ -762,7 +736,7 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {


    @Test
    @Test
    fun faceAuthIsRequestedWhenAuthIsRunningWhileCameraInfoChanged() =
    fun faceAuthIsRequestedWhenAuthIsRunningWhileCameraInfoChanged() =
        testScope.runTest {
        kosmos.runTest {
            facePropertyRepository.setCameraIno(null)
            facePropertyRepository.setCameraIno(null)
            underTest.start()
            underTest.start()


@@ -779,7 +753,7 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {


    @Test
    @Test
    fun faceAuthIsNotRequestedWhenNoAuthRunningWhileCameraInfoChanged() =
    fun faceAuthIsNotRequestedWhenNoAuthRunningWhileCameraInfoChanged() =
        testScope.runTest {
        kosmos.runTest {
            facePropertyRepository.setCameraIno(null)
            facePropertyRepository.setCameraIno(null)
            underTest.start()
            underTest.start()


@@ -791,7 +765,7 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {


    @Test
    @Test
    fun faceAuthIsNotRequestedWhenAuthIsRunningWhileCameraInfoIsNull() =
    fun faceAuthIsNotRequestedWhenAuthIsRunningWhileCameraInfoIsNull() =
        testScope.runTest {
        kosmos.runTest {
            facePropertyRepository.setCameraIno(null)
            facePropertyRepository.setCameraIno(null)
            underTest.start()
            underTest.start()


@@ -803,13 +777,13 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {


    @Test
    @Test
    fun lockedOut_providesSameValueFromRepository() =
    fun lockedOut_providesSameValueFromRepository() =
        testScope.runTest {
        kosmos.runTest {
            assertThat(underTest.isLockedOut).isSameInstanceAs(faceAuthRepository.isLockedOut)
            assertThat(underTest.isLockedOut).isSameInstanceAs(faceAuthRepository.isLockedOut)
        }
        }


    @Test
    @Test
    fun authenticated_providesSameValueFromRepository() =
    fun authenticated_providesSameValueFromRepository() =
        testScope.runTest {
        kosmos.runTest {
            assertThat(underTest.isAuthenticated)
            assertThat(underTest.isAuthenticated)
                .isSameInstanceAs(faceAuthRepository.isAuthenticated)
                .isSameInstanceAs(faceAuthRepository.isAuthenticated)
        }
        }