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

Commit 266fc60f authored by Chandru S's avatar Chandru S
Browse files

Fix issue where face auth doesn't run when bouncer is launched from secure camera

Bug: 357649556
Test: atest DeviceEntryFaceAuthRepositoryTest
Flag: com.android.systemui.scene_container
Test: manually
  1. Lock device
  2. Double press power button and launch secure camera activity
  3. Tap on photo gallery to trigger alternate/primary bouncer
  4. navigate to primary bouncer by swiping up on alternate bouncer
  5. face auth should run (previously this wouldn't happen)
Change-Id: Ic81a900aa1bf957aeefdf144e24d58281ba1c9af
parent c14d87d9
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import android.hardware.face.FaceSensorPropertiesInternal
import android.os.CancellationSignal
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.compose.animation.scene.ObservableTransitionState
import com.android.internal.logging.InstanceId.fakeInstanceId
import com.android.internal.logging.UiEventLogger
import com.android.systemui.Flags as AConfigFlags
@@ -78,7 +79,9 @@ import com.android.systemui.log.table.TableLogBuffer
import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest
import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest
import com.android.systemui.power.domain.interactor.powerInteractor
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.statusbar.phone.KeyguardBypassController
import com.android.systemui.testKosmos
import com.android.systemui.user.data.model.SelectionStatus
@@ -92,6 +95,7 @@ import com.google.common.truth.Truth.assertThat
import java.io.PrintWriter
import java.io.StringWriter
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.advanceTimeBy
import kotlinx.coroutines.test.runCurrent
@@ -232,6 +236,7 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
            powerInteractor,
            keyguardInteractor,
            alternateBouncerInteractor,
            { kosmos.sceneInteractor },
            faceDetectBuffer,
            faceAuthBuffer,
            keyguardTransitionInteractor,
@@ -617,6 +622,31 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
            assertThat(canFaceAuthRun()).isTrue()
        }

    @Test
    @EnableSceneContainer
    fun withSceneContainer_authenticateRunsWhenSecureCameraIsActiveIfBouncerIsShowing() =
        testScope.runTest {
            initCollectors()
            allPreconditionsToRunFaceAuthAreTrue(sceneContainerEnabled = true)
            bouncerRepository.setAlternateVisible(false)

            // launch secure camera
            keyguardInteractor.onCameraLaunchDetected(CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP)
            keyguardRepository.setKeyguardOccluded(true)
            kosmos.sceneInteractor.snapToScene(Scenes.Lockscreen, "for-test")
            runCurrent()
            assertThat(canFaceAuthRun()).isFalse()

            // but bouncer is shown after that.
            kosmos.sceneInteractor.changeScene(Scenes.Bouncer, "for-test")
            kosmos.sceneInteractor.setTransitionState(
                MutableStateFlow(ObservableTransitionState.Idle(Scenes.Bouncer))
            )
            runCurrent()

            assertThat(canFaceAuthRun()).isTrue()
        }

    @Test
    fun authenticateDoesNotRunOnUnsupportedPosture() =
        testScope.runTest {
+8 −1
Original line number Diff line number Diff line
@@ -57,8 +57,10 @@ import com.android.systemui.log.FaceAuthenticationLogger
import com.android.systemui.log.SessionTracker
import com.android.systemui.log.table.TableLogBuffer
import com.android.systemui.power.domain.interactor.PowerInteractor
import com.android.systemui.scene.domain.interactor.SceneInteractor
import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.scene.shared.model.Scenes.Bouncer
import com.android.systemui.statusbar.phone.KeyguardBypassController
import com.android.systemui.user.data.model.SelectionStatus
import com.android.systemui.user.data.repository.UserRepository
@@ -160,6 +162,7 @@ constructor(
    private val powerInteractor: PowerInteractor,
    private val keyguardInteractor: KeyguardInteractor,
    private val alternateBouncerInteractor: AlternateBouncerInteractor,
    private val sceneInteractor: dagger.Lazy<SceneInteractor>,
    @FaceDetectTableLog private val faceDetectLog: TableLogBuffer,
    @FaceAuthTableLog private val faceAuthLog: TableLogBuffer,
    private val keyguardTransitionInteractor: KeyguardTransitionInteractor,
@@ -407,7 +410,11 @@ constructor(
                    .isFalse()
                    .or(
                        alternateBouncerInteractor.isVisible.or(
                            if (SceneContainerFlag.isEnabled) {
                                sceneInteractor.get().transitionState.map { it.isIdle(Bouncer) }
                            } else {
                                keyguardInteractor.primaryBouncerShowing
                            }
                        )
                    ),
                "secureCameraNotActiveOrAnyBouncerIsShowing"
+1 −1
Original line number Diff line number Diff line
@@ -24,7 +24,7 @@ import com.android.systemui.scene.data.repository.sceneContainerRepository
import com.android.systemui.scene.domain.resolver.sceneFamilyResolvers
import com.android.systemui.scene.shared.logger.sceneLogger

val Kosmos.sceneInteractor by
val Kosmos.sceneInteractor: SceneInteractor by
    Kosmos.Fixture {
        SceneInteractor(
            applicationScope = applicationCoroutineScope,