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

Commit eb5d7b82 authored by Matt Pietal's avatar Matt Pietal Committed by Android (Google) Code Review
Browse files

Merge changes Iad2302ad,I14a1ad75 into main

* changes:
  Keep notif bounds stable on LOCKSCREEN->AOD
  Do not move to OCCLUDED(camera) when not active
parents 00d0d55d f57b8ad0
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -87,6 +87,7 @@ import com.android.systemui.biometrics.ui.viewmodel.DefaultUdfpsTouchOverlayView
import com.android.systemui.biometrics.ui.viewmodel.DeviceEntryUdfpsTouchOverlayViewModel;
import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor;
import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor;
import com.android.systemui.camera.CameraGestureHelper;
import com.android.systemui.classifier.FalsingCollector;
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFaceAuthInteractor;
import com.android.systemui.dump.DumpManager;
@@ -118,6 +119,8 @@ import com.android.systemui.util.time.SystemClock;

import dagger.Lazy;

import javax.inject.Provider;

import kotlinx.coroutines.CoroutineScope;

import org.junit.Before;
@@ -261,6 +264,8 @@ public class UdfpsControllerTest extends SysuiTestCase {
    private Lazy<DeviceEntryUdfpsTouchOverlayViewModel> mDeviceEntryUdfpsTouchOverlayViewModel;
    @Mock
    private Lazy<DefaultUdfpsTouchOverlayViewModel> mDefaultUdfpsTouchOverlayViewModel;
    @Mock
    private Provider<CameraGestureHelper> mCameraGestureHelper;

    @Before
    public void setUp() {
@@ -269,7 +274,8 @@ public class UdfpsControllerTest extends SysuiTestCase {
                mPowerRepository,
                mock(FalsingCollector.class),
                mock(ScreenOffAnimationController.class),
                mStatusBarStateController
                mStatusBarStateController,
                mCameraGestureHelper
        );
        mPowerRepository.updateWakefulness(
                WakefulnessState.AWAKE,
+80 −86
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.systemui.camera

import android.app.ActivityManager
import android.app.IActivityTaskManager
import android.app.admin.DevicePolicyManager
import android.content.ComponentName
import android.content.ContentResolver
import android.content.Intent
@@ -29,70 +30,59 @@ import androidx.test.filters.SmallTest
import com.android.systemui.ActivityIntentHelper
import com.android.systemui.SysuiTestCase
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.statusbar.NotificationLockscreenUserManager
import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.phone.CentralSurfaces
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.user.domain.interactor.SelectedUserInteractor
import com.android.systemui.util.mockito.KotlinArgumentCaptor
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.whenever
import com.google.common.truth.Truth.assertThat
import com.google.common.util.concurrent.MoreExecutors
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentMatchers.isNull
import org.mockito.Mock
import org.mockito.Mockito.any
import org.mockito.Mockito.anyInt
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations
import org.mockito.Mockito.`when` as whenever

@SmallTest
@RunWith(AndroidJUnit4::class)
class CameraGestureHelperTest : SysuiTestCase() {

    @Mock
    lateinit var centralSurfaces: CentralSurfaces
    @Mock
    lateinit var statusBarKeyguardViewManager: StatusBarKeyguardViewManager
    @Mock
    lateinit var keyguardStateController: KeyguardStateController
    @Mock
    lateinit var packageManager: PackageManager
    @Mock
    lateinit var activityManager: ActivityManager
    @Mock
    lateinit var activityStarter: ActivityStarter
    @Mock
    lateinit var activityIntentHelper: ActivityIntentHelper
    @Mock
    lateinit var activityTaskManager: IActivityTaskManager
    @Mock
    lateinit var cameraIntents: CameraIntentsWrapper
    @Mock
    lateinit var contentResolver: ContentResolver
    @Mock
    lateinit var mSelectedUserInteractor: SelectedUserInteractor
    @Mock lateinit var statusBarKeyguardViewManager: StatusBarKeyguardViewManager
    @Mock lateinit var keyguardStateController: KeyguardStateController
    @Mock lateinit var packageManager: PackageManager
    @Mock lateinit var activityManager: ActivityManager
    @Mock lateinit var activityStarter: ActivityStarter
    @Mock lateinit var activityIntentHelper: ActivityIntentHelper
    @Mock lateinit var activityTaskManager: IActivityTaskManager
    @Mock lateinit var cameraIntents: CameraIntentsWrapper
    @Mock lateinit var contentResolver: ContentResolver
    @Mock lateinit var mSelectedUserInteractor: SelectedUserInteractor
    @Mock lateinit var devicePolicyManager: DevicePolicyManager
    @Mock lateinit var lockscreenUserManager: NotificationLockscreenUserManager

    private lateinit var underTest: CameraGestureHelper

    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)
        whenever(cameraIntents.getSecureCameraIntent(anyInt())).thenReturn(
            Intent(CameraIntents.DEFAULT_SECURE_CAMERA_INTENT_ACTION)
        )
        whenever(cameraIntents.getInsecureCameraIntent(anyInt())).thenReturn(
            Intent(CameraIntents.DEFAULT_INSECURE_CAMERA_INTENT_ACTION)
        )
        whenever(cameraIntents.getSecureCameraIntent(any()))
            .thenReturn(Intent(CameraIntents.DEFAULT_SECURE_CAMERA_INTENT_ACTION))
        whenever(cameraIntents.getInsecureCameraIntent(any()))
            .thenReturn(Intent(CameraIntents.DEFAULT_INSECURE_CAMERA_INTENT_ACTION))

        prepare()

        underTest = CameraGestureHelper(
        underTest =
            CameraGestureHelper(
                context = mock(),
            centralSurfaces = centralSurfaces,
                keyguardStateController = keyguardStateController,
                statusBarKeyguardViewManager = statusBarKeyguardViewManager,
                packageManager = packageManager,
@@ -104,6 +94,8 @@ class CameraGestureHelperTest : SysuiTestCase() {
                contentResolver = contentResolver,
                uiExecutor = MoreExecutors.directExecutor(),
                selectedUserInteractor = mSelectedUserInteractor,
                devicePolicyManager = devicePolicyManager,
                lockscreenUserManager = lockscreenUserManager,
            )
    }

@@ -131,7 +123,13 @@ class CameraGestureHelperTest : SysuiTestCase() {
        isCameraActivityRunningOnTop: Boolean = false,
        isTaskListEmpty: Boolean = false,
    ) {
        whenever(centralSurfaces.isCameraAllowedByAdmin).thenReturn(isCameraAllowedByAdmin)
        whenever(lockscreenUserManager.getCurrentUserId()).thenReturn(1)
        if (isCameraAllowedByAdmin) {
            whenever(devicePolicyManager.getCameraDisabled(isNull(), any())).thenReturn(false)
            whenever(keyguardStateController.isMethodSecure).thenReturn(false)
        } else {
            whenever(devicePolicyManager.getCameraDisabled(isNull(), any())).thenReturn(true)
        }

        whenever(activityIntentHelper.wouldLaunchResolverActivity(any(), anyInt()))
            .thenReturn(installedCameraAppCount > 1)
@@ -141,30 +139,26 @@ class CameraGestureHelperTest : SysuiTestCase() {
            .thenReturn(!isUsingSecureScreenLockOption)

        if (installedCameraAppCount >= 1) {
            val resolveInfo = ResolveInfo().apply {
                this.activityInfo = ActivityInfo().apply {
                    packageName = CAMERA_APP_PACKAGE_NAME
            val resolveInfo =
                ResolveInfo().apply {
                    this.activityInfo =
                        ActivityInfo().apply { packageName = CAMERA_APP_PACKAGE_NAME }
                }
            }
            whenever(packageManager.resolveActivityAsUser(any(), anyInt(), anyInt())).thenReturn(
                resolveInfo
            )
            whenever(packageManager.resolveActivityAsUser(any(), anyInt(), anyInt()))
                .thenReturn(resolveInfo)
        } else {
            whenever(packageManager.resolveActivityAsUser(any(), anyInt(), anyInt())).thenReturn(
                null
            )
            whenever(packageManager.resolveActivityAsUser(any(), anyInt(), anyInt()))
                .thenReturn(null)
        }

        when {
            isCameraActivityRunningOnTop -> {
                val runningTaskInfo = ActivityManager.RunningTaskInfo().apply {
                val runningTaskInfo =
                    ActivityManager.RunningTaskInfo().apply {
                        topActivity = ComponentName(CAMERA_APP_PACKAGE_NAME, "cameraActivity")
                    }
                whenever(activityManager.getRunningTasks(anyInt())).thenReturn(
                    listOf(
                        runningTaskInfo
                    )
                )
                whenever(activityManager.getRunningTasks(anyInt()))
                    .thenReturn(listOf(runningTaskInfo))
            }
            isTaskListEmpty -> {
                whenever(activityManager.getRunningTasks(anyInt())).thenReturn(emptyList())
@@ -289,17 +283,18 @@ class CameraGestureHelperTest : SysuiTestCase() {
    ) {
        val intentCaptor = KotlinArgumentCaptor(Intent::class.java)
        if (isSecure && !moreThanOneCameraAppInstalled) {
            verify(activityTaskManager).startActivityAsUser(
                any(),
                any(),
                any(),
            verify(activityTaskManager)
                .startActivityAsUser(
                    isNull(),
                    isNull(),
                    isNull(),
                    intentCaptor.capture(),
                any(),
                any(),
                any(),
                    isNull(),
                    isNull(),
                    isNull(),
                    anyInt(),
                    anyInt(),
                any(),
                    isNull(),
                    any(),
                    anyInt()
                )
@@ -309,8 +304,7 @@ class CameraGestureHelperTest : SysuiTestCase() {
        val intent = intentCaptor.value

        assertThat(CameraIntents.isSecureCameraIntent(intent)).isEqualTo(isSecure)
        assertThat(intent.getIntExtra(CameraIntents.EXTRA_LAUNCH_SOURCE, -1))
            .isEqualTo(source)
        assertThat(intent.getIntExtra(CameraIntents.EXTRA_LAUNCH_SOURCE, -1)).isEqualTo(source)
    }

    companion object {
+4 −13
Original line number Diff line number Diff line
@@ -58,7 +58,6 @@ import com.android.systemui.dump.DumpManager
import com.android.systemui.flags.FakeFeatureFlags
import com.android.systemui.keyguard.data.repository.BiometricType
import com.android.systemui.keyguard.data.repository.fakeBiometricSettingsRepository
import com.android.systemui.keyguard.data.repository.fakeCommandQueue
import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFingerprintAuthRepository
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
@@ -78,7 +77,6 @@ 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.statusbar.commandQueue
import com.android.systemui.statusbar.phone.KeyguardBypassController
import com.android.systemui.testKosmos
import com.android.systemui.user.data.model.SelectionStatus
@@ -116,7 +114,7 @@ import org.mockito.MockitoAnnotations
@SmallTest
@RunWith(AndroidJUnit4::class)
class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
    private val kosmos = testKosmos().apply { this.commandQueue = this.fakeCommandQueue }
    private val kosmos = testKosmos()
    private lateinit var underTest: DeviceEntryFaceAuthRepositoryImpl

    @Mock private lateinit var faceManager: FaceManager
@@ -162,7 +160,6 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
    private val displayStateInteractor = kosmos.displayStateInteractor
    private val bouncerRepository = kosmos.fakeKeyguardBouncerRepository
    private val displayRepository = kosmos.displayRepository
    private val fakeCommandQueue = kosmos.fakeCommandQueue
    private val keyguardTransitionInteractor = kosmos.keyguardTransitionInteractor
    private lateinit var featureFlags: FakeFeatureFlags

@@ -572,9 +569,7 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
                bouncerRepository.setAlternateVisible(false)
                // Keyguard is occluded when secure camera is active.
                keyguardRepository.setKeyguardOccluded(true)
                fakeCommandQueue.doForEachCallback {
                    it.onCameraLaunchGestureDetected(CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP)
                }
                keyguardInteractor.onCameraLaunchDetected(CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP)
            }
        }

@@ -589,9 +584,7 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
            assertThat(canFaceAuthRun()).isTrue()

            // launch secure camera
            fakeCommandQueue.doForEachCallback {
                it.onCameraLaunchGestureDetected(CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP)
            }
            keyguardInteractor.onCameraLaunchDetected(CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP)
            keyguardRepository.setKeyguardOccluded(true)
            runCurrent()
            assertThat(canFaceAuthRun()).isFalse()
@@ -870,9 +863,7 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
                bouncerRepository.setAlternateVisible(false)
                // Keyguard is occluded when secure camera is active.
                keyguardRepository.setKeyguardOccluded(true)
                fakeCommandQueue.doForEachCallback {
                    it.onCameraLaunchGestureDetected(CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP)
                }
                keyguardInteractor.onCameraLaunchDetected(CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP)
            }
        }

+11 −34
Original line number Diff line number Diff line
@@ -32,7 +32,7 @@ import com.android.systemui.flags.EnableSceneContainer
import com.android.systemui.keyguard.data.repository.fakeCommandQueue
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.shared.model.CameraLaunchSourceModel
import com.android.systemui.keyguard.shared.model.CameraLaunchType
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.StatusBarState
import com.android.systemui.keyguard.shared.model.TransitionState
@@ -47,7 +47,6 @@ 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.onCompletion
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Before
@@ -87,31 +86,17 @@ class KeyguardInteractorTest : SysuiTestCase() {
            val cameraLaunchSource = collectLastValue(flow)
            runCurrent()

            commandQueue.doForEachCallback {
                it.onCameraLaunchGestureDetected(StatusBarManager.CAMERA_LAUNCH_SOURCE_WIGGLE)
            }
            assertThat(cameraLaunchSource()).isEqualTo(CameraLaunchSourceModel.WIGGLE)
            underTest.onCameraLaunchDetected(StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP)
            assertThat(cameraLaunchSource()!!.type).isEqualTo(CameraLaunchType.POWER_DOUBLE_TAP)

            commandQueue.doForEachCallback {
                it.onCameraLaunchGestureDetected(
                    StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP
                )
            }
            assertThat(cameraLaunchSource()).isEqualTo(CameraLaunchSourceModel.POWER_DOUBLE_TAP)
            underTest.onCameraLaunchDetected(StatusBarManager.CAMERA_LAUNCH_SOURCE_WIGGLE)
            assertThat(cameraLaunchSource()!!.type).isEqualTo(CameraLaunchType.WIGGLE)

            commandQueue.doForEachCallback {
                it.onCameraLaunchGestureDetected(StatusBarManager.CAMERA_LAUNCH_SOURCE_LIFT_TRIGGER)
            }
            assertThat(cameraLaunchSource()).isEqualTo(CameraLaunchSourceModel.LIFT_TRIGGER)
            underTest.onCameraLaunchDetected(StatusBarManager.CAMERA_LAUNCH_SOURCE_LIFT_TRIGGER)
            assertThat(cameraLaunchSource()!!.type).isEqualTo(CameraLaunchType.LIFT_TRIGGER)

            commandQueue.doForEachCallback {
                it.onCameraLaunchGestureDetected(
                    StatusBarManager.CAMERA_LAUNCH_SOURCE_QUICK_AFFORDANCE
                )
            }
            assertThat(cameraLaunchSource()).isEqualTo(CameraLaunchSourceModel.QUICK_AFFORDANCE)

            flow.onCompletion { assertThat(commandQueue.callbackCount()).isEqualTo(0) }
            underTest.onCameraLaunchDetected(StatusBarManager.CAMERA_LAUNCH_SOURCE_QUICK_AFFORDANCE)
            assertThat(cameraLaunchSource()!!.type).isEqualTo(CameraLaunchType.QUICK_AFFORDANCE)
        }

    @Test
@@ -121,11 +106,7 @@ class KeyguardInteractorTest : SysuiTestCase() {
            val secureCameraActive = collectLastValue(underTest.isSecureCameraActive)
            runCurrent()

            commandQueue.doForEachCallback {
                it.onCameraLaunchGestureDetected(
                    StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP
                )
            }
            underTest.onCameraLaunchDetected(StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP)

            assertThat(secureCameraActive()).isTrue()

@@ -146,11 +127,7 @@ class KeyguardInteractorTest : SysuiTestCase() {
            val secureCameraActive = collectLastValue(underTest.isSecureCameraActive)
            runCurrent()

            commandQueue.doForEachCallback {
                it.onCameraLaunchGestureDetected(
                    StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP
                )
            }
            underTest.onCameraLaunchDetected(StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP)
            assertThat(secureCameraActive()).isTrue()

            // Keyguard is showing and not occluded
+3 −10
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@

package com.android.systemui.keyguard.domain.interactor

import android.app.StatusBarManager
import android.app.StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.platform.test.flag.junit.FlagsParameterization
@@ -42,7 +42,6 @@ import com.android.systemui.flags.Flags.COMMUNAL_SERVICE_ENABLED
import com.android.systemui.flags.andSceneContainer
import com.android.systemui.flags.fakeFeatureFlagsClassic
import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
import com.android.systemui.keyguard.data.repository.fakeCommandQueue
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.shared.model.BiometricUnlockMode
@@ -59,7 +58,6 @@ import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.se
import com.android.systemui.power.domain.interactor.powerInteractor
import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.shade.shadeTestUtil
import com.android.systemui.statusbar.commandQueue
import com.android.systemui.testKosmos
import com.android.systemui.util.mockito.whenever
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -93,13 +91,12 @@ class KeyguardTransitionScenariosTest(flags: FlagsParameterization?) : SysuiTest
    private val kosmos =
        testKosmos().apply {
            fakeKeyguardTransitionRepository = spy(FakeKeyguardTransitionRepository())
            this.commandQueue = fakeCommandQueue
        }
    private val testScope = kosmos.testScope

    private val keyguardRepository by lazy { kosmos.fakeKeyguardRepository }
    private val keyguardInteractor by lazy { kosmos.keyguardInteractor }
    private val bouncerRepository by lazy { kosmos.fakeKeyguardBouncerRepository }
    private var commandQueue = kosmos.fakeCommandQueue
    private val shadeTestUtil by lazy { kosmos.shadeTestUtil }
    private val transitionRepository by lazy { kosmos.fakeKeyguardTransitionRepository }
    private lateinit var featureFlags: FakeFeatureFlags
@@ -1724,11 +1721,7 @@ class KeyguardTransitionScenariosTest(flags: FlagsParameterization?) : SysuiTest
            reset(transitionRepository)

            // ...AND WHEN the camera gesture is detected quickly afterwards
            commandQueue.doForEachCallback {
                it.onCameraLaunchGestureDetected(
                    StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP
                )
            }
            keyguardInteractor.onCameraLaunchDetected(CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP)
            runCurrent()

            // THEN a transition from DOZING => OCCLUDED should occur
Loading