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

Commit 87da270e authored by Matt Pietal's avatar Matt Pietal
Browse files

Filter inSecure camera launches

KeyguardInteractor#isSecureCameraActive was previously emitting for
any double-tap on power, even if unlocked. Filter these out.

Bug: 400328384
Test: atest KeyguardInteractorTest
Flag: EXEMPT bugfix

Change-Id: I9904e1ccdc9d515d55400e6dc0e885df0bcba06b
parent 49e72cb0
Loading
Loading
Loading
Loading
+12 −11
Original line number Diff line number Diff line
@@ -64,10 +64,10 @@ class CameraGestureHelperTest : SysuiTestCase() {
    @Mock lateinit var activityTaskManager: IActivityTaskManager
    @Mock lateinit var cameraIntents: CameraIntentsWrapper
    @Mock lateinit var contentResolver: ContentResolver
    @Mock lateinit var mSelectedUserInteractor: SelectedUserInteractor
    @Mock lateinit var selectedUserInteractor: SelectedUserInteractor
    @Mock lateinit var devicePolicyManager: DevicePolicyManager
    @Mock lateinit var lockscreenUserManager: NotificationLockscreenUserManager

    private val TEST_USER_ID = 1
    private lateinit var underTest: CameraGestureHelper

    @Before
@@ -93,7 +93,7 @@ class CameraGestureHelperTest : SysuiTestCase() {
                cameraIntents = cameraIntents,
                contentResolver = contentResolver,
                uiExecutor = MoreExecutors.directExecutor(),
                selectedUserInteractor = mSelectedUserInteractor,
                selectedUserInteractor = selectedUserInteractor,
                devicePolicyManager = devicePolicyManager,
                lockscreenUserManager = lockscreenUserManager,
            )
@@ -123,7 +123,8 @@ class CameraGestureHelperTest : SysuiTestCase() {
        isCameraActivityRunningOnTop: Boolean = false,
        isTaskListEmpty: Boolean = false,
    ) {
        whenever(lockscreenUserManager.getCurrentUserId()).thenReturn(1)
        whenever(lockscreenUserManager.getCurrentUserId()).thenReturn(TEST_USER_ID)
        whenever(selectedUserInteractor.getSelectedUserId()).thenReturn(TEST_USER_ID)
        if (isCameraAllowedByAdmin) {
            whenever(devicePolicyManager.getCameraDisabled(isNull(), any())).thenReturn(false)
            whenever(keyguardStateController.isMethodSecure).thenReturn(false)
@@ -135,6 +136,9 @@ class CameraGestureHelperTest : SysuiTestCase() {
            .thenReturn(installedCameraAppCount > 1)

        whenever(keyguardStateController.isMethodSecure).thenReturn(isUsingSecureScreenLockOption)
        whenever(keyguardStateController.isShowing())
            .thenReturn(true)
            .thenReturn(!isUsingSecureScreenLockOption)
        whenever(keyguardStateController.canDismissLockScreen())
            .thenReturn(!isUsingSecureScreenLockOption)

@@ -255,16 +259,13 @@ class CameraGestureHelperTest : SysuiTestCase() {
        assertActivityStarting(
            isSecure = true,
            source = source,
            moreThanOneCameraAppInstalled = true
            moreThanOneCameraAppInstalled = true,
        )
    }

    @Test
    fun launchCamera_multipleCameraAppsInstalled_usingNonSecureScreenLockOption() {
        prepare(
            isUsingSecureScreenLockOption = false,
            installedCameraAppCount = 2,
        )
        prepare(isUsingSecureScreenLockOption = false, installedCameraAppCount = 2)
        val source = 1337

        underTest.launchCamera(source)
@@ -272,7 +273,7 @@ class CameraGestureHelperTest : SysuiTestCase() {
        assertActivityStarting(
            isSecure = false,
            moreThanOneCameraAppInstalled = true,
            source = source
            source = source,
        )
    }

@@ -296,7 +297,7 @@ class CameraGestureHelperTest : SysuiTestCase() {
                    anyInt(),
                    isNull(),
                    any(),
                    anyInt()
                    anyInt(),
                )
        } else {
            verify(activityStarter).startActivity(intentCaptor.capture(), eq(false))
+16 −4
Original line number Diff line number Diff line
@@ -592,7 +592,10 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
                bouncerRepository.setAlternateVisible(false)
                // Keyguard is occluded when secure camera is active.
                keyguardRepository.setKeyguardOccluded(true)
                keyguardInteractor.onCameraLaunchDetected(CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP)
                keyguardInteractor.onCameraLaunchDetected(
                    CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP,
                    isSecureCamera = true,
                )
            }
        }

@@ -607,7 +610,10 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
            assertThat(canFaceAuthRun()).isTrue()

            // launch secure camera
            keyguardInteractor.onCameraLaunchDetected(CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP)
            keyguardInteractor.onCameraLaunchDetected(
                CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP,
                isSecureCamera = true,
            )
            keyguardRepository.setKeyguardOccluded(true)
            runCurrent()
            assertThat(canFaceAuthRun()).isFalse()
@@ -626,7 +632,10 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
            bouncerRepository.setAlternateVisible(false)

            // launch secure camera
            keyguardInteractor.onCameraLaunchDetected(CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP)
            keyguardInteractor.onCameraLaunchDetected(
                CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP,
                isSecureCamera = true,
            )
            keyguardRepository.setKeyguardOccluded(true)
            kosmos.sceneInteractor.snapToScene(Scenes.Lockscreen, "for-test")
            runCurrent()
@@ -948,7 +957,10 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
                bouncerRepository.setAlternateVisible(false)
                // Keyguard is occluded when secure camera is active.
                keyguardRepository.setKeyguardOccluded(true)
                keyguardInteractor.onCameraLaunchDetected(CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP)
                keyguardInteractor.onCameraLaunchDetected(
                    CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP,
                    isSecureCamera = true,
                )
            }
        }

+51 −8
Original line number Diff line number Diff line
@@ -92,16 +92,28 @@ class KeyguardInteractorTest : SysuiTestCase() {
            val cameraLaunchSource = collectLastValue(flow)
            runCurrent()

            underTest.onCameraLaunchDetected(StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP)
            underTest.onCameraLaunchDetected(
                StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP,
                isSecureCamera = true,
            )
            assertThat(cameraLaunchSource()!!.type).isEqualTo(CameraLaunchType.POWER_DOUBLE_TAP)

            underTest.onCameraLaunchDetected(StatusBarManager.CAMERA_LAUNCH_SOURCE_WIGGLE)
            underTest.onCameraLaunchDetected(
                StatusBarManager.CAMERA_LAUNCH_SOURCE_WIGGLE,
                isSecureCamera = true,
            )
            assertThat(cameraLaunchSource()!!.type).isEqualTo(CameraLaunchType.WIGGLE)

            underTest.onCameraLaunchDetected(StatusBarManager.CAMERA_LAUNCH_SOURCE_LIFT_TRIGGER)
            underTest.onCameraLaunchDetected(
                StatusBarManager.CAMERA_LAUNCH_SOURCE_LIFT_TRIGGER,
                isSecureCamera = true,
            )
            assertThat(cameraLaunchSource()!!.type).isEqualTo(CameraLaunchType.LIFT_TRIGGER)

            underTest.onCameraLaunchDetected(StatusBarManager.CAMERA_LAUNCH_SOURCE_QUICK_AFFORDANCE)
            underTest.onCameraLaunchDetected(
                StatusBarManager.CAMERA_LAUNCH_SOURCE_QUICK_AFFORDANCE,
                isSecureCamera = true,
            )
            assertThat(cameraLaunchSource()!!.type).isEqualTo(CameraLaunchType.QUICK_AFFORDANCE)
        }

@@ -112,7 +124,10 @@ class KeyguardInteractorTest : SysuiTestCase() {
            val secureCameraActive = collectLastValue(underTest.isSecureCameraActive)
            runCurrent()

            underTest.onCameraLaunchDetected(StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP)
            underTest.onCameraLaunchDetected(
                StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP,
                isSecureCamera = true,
            )

            assertThat(secureCameraActive()).isTrue()

@@ -133,7 +148,10 @@ class KeyguardInteractorTest : SysuiTestCase() {
            val secureCameraActive = collectLastValue(underTest.isSecureCameraActive)
            runCurrent()

            underTest.onCameraLaunchDetected(StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP)
            underTest.onCameraLaunchDetected(
                StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP,
                isSecureCamera = true,
            )
            assertThat(secureCameraActive()).isTrue()

            // Keyguard is showing and not occluded
@@ -154,7 +172,10 @@ class KeyguardInteractorTest : SysuiTestCase() {
            runCurrent()

            // Launch camera
            underTest.onCameraLaunchDetected(StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP)
            underTest.onCameraLaunchDetected(
                StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP,
                isSecureCamera = true,
            )
            assertThat(secureCameraActive()).isTrue()

            // Go back to keyguard
@@ -178,7 +199,10 @@ class KeyguardInteractorTest : SysuiTestCase() {
            runCurrent()

            // Launch camera
            underTest.onCameraLaunchDetected(StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP)
            underTest.onCameraLaunchDetected(
                StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP,
                isSecureCamera = true,
            )
            assertThat(secureCameraActive()).isTrue()

            // Show bouncer
@@ -192,6 +216,25 @@ class KeyguardInteractorTest : SysuiTestCase() {
            assertThat(secureCameraActive()).isFalse()
        }

    @Test
    fun secureCameraRemainFalseOnInsecureCameraLaunch() =
        testScope.runTest {
            val secureCameraActive = collectLastValue(underTest.isSecureCameraActive)
            runCurrent()

            underTest.onCameraLaunchDetected(
                StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP,
                isSecureCamera = false,
            )
            assertThat(secureCameraActive()).isFalse()

            underTest.onCameraLaunchDetected(
                StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP,
                isSecureCamera = true,
            )
            assertThat(secureCameraActive()).isTrue()
        }

    @Test
    @DisableFlags(FLAG_KEYGUARD_WM_STATE_REFACTOR)
    fun keyguardVisibilityIsDefinedAsKeyguardShowingButNotOccluded() = runTest {
+4 −1
Original line number Diff line number Diff line
@@ -1344,7 +1344,10 @@ class KeyguardTransitionScenariosTest(flags: FlagsParameterization?) : SysuiTest
            reset(transitionRepository)

            // ...AND WHEN the camera gesture is detected quickly afterwards
            keyguardInteractor.onCameraLaunchDetected(CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP)
            keyguardInteractor.onCameraLaunchDetected(
                CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP,
                isSecureCamera = true,
            )
            runCurrent()

            // THEN a transition from DOZING => OCCLUDED should occur
+16 −4
Original line number Diff line number Diff line
@@ -812,7 +812,10 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() {
                to = KeyguardState.OCCLUDED,
                testScope = testScope,
            )
            kosmos.keyguardInteractor.onCameraLaunchDetected(CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP)
            kosmos.keyguardInteractor.onCameraLaunchDetected(
                CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP,
                isSecureCamera = true,
            )

            assertThat(latest).isFalse()
        }
@@ -918,7 +921,10 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() {
                to = KeyguardState.OCCLUDED,
                testScope = testScope,
            )
            kosmos.keyguardInteractor.onCameraLaunchDetected(CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP)
            kosmos.keyguardInteractor.onCameraLaunchDetected(
                CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP,
                isSecureCamera = true,
            )

            assertThat(underTest.ongoingActivityChips.areChipsAllowed).isFalse()
        }
@@ -1653,7 +1659,10 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() {
                to = KeyguardState.OCCLUDED,
                testScope = testScope,
            )
            kosmos.keyguardInteractor.onCameraLaunchDetected(CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP)
            kosmos.keyguardInteractor.onCameraLaunchDetected(
                CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP,
                isSecureCamera = true,
            )

            assertThat(clockVisible!!.visibility).isEqualTo(View.INVISIBLE)
            assertThat(notifIconsVisible!!.visibility).isEqualTo(View.GONE)
@@ -1671,7 +1680,10 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() {
            kosmos.sceneContainerRepository.snapToScene(Scenes.Lockscreen)
            // Secure camera is an occluding activity
            kosmos.keyguardOcclusionRepository.setShowWhenLockedActivityInfo(true, taskInfo = null)
            kosmos.keyguardInteractor.onCameraLaunchDetected(CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP)
            kosmos.keyguardInteractor.onCameraLaunchDetected(
                CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP,
                isSecureCamera = true,
            )

            assertThat(clockVisible!!.visibility).isEqualTo(View.INVISIBLE)
            assertThat(notifIconsVisible!!.visibility).isEqualTo(View.GONE)
Loading