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

Commit f628fe69 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "[Flexi] Fix HomeStatusBarViewModelImplTests" into main

parents c19fd0e3 7d82745d
Loading
Loading
Loading
Loading
+138 −223
Original line number Diff line number Diff line
@@ -26,21 +26,26 @@ import android.content.testableContext
import android.graphics.Rect
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.platform.test.flag.junit.FlagsParameterization
import android.view.Display.DEFAULT_DISPLAY
import android.view.View
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.compose.animation.scene.ObservableTransitionState
import com.android.systemui.Flags
import com.android.systemui.SysuiTestCase
import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor
import com.android.systemui.display.data.repository.displayRepository
import com.android.systemui.display.data.repository.fake
import com.android.systemui.flags.DisableSceneContainer
import com.android.systemui.flags.EnableSceneContainer
import com.android.systemui.flags.andSceneContainer
import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFaceAuthRepository
import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFingerprintAuthRepository
import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.data.repository.keyguardOcclusionRepository
import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.SuccessFingerprintAuthenticationStatus
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionStep
import com.android.systemui.kosmos.Kosmos
@@ -56,6 +61,8 @@ import com.android.systemui.mediaprojection.data.model.MediaProjectionState
import com.android.systemui.mediaprojection.data.repository.fakeMediaProjectionRepository
import com.android.systemui.plugins.DarkIconDispatcher
import com.android.systemui.scene.data.repository.sceneContainerRepository
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.scene.shared.model.Overlays
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.screenrecord.data.model.ScreenRecordModel
@@ -104,10 +111,16 @@ import kotlinx.coroutines.runBlocking
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import platform.test.runner.parameterized.ParameterizedAndroidJunit4
import platform.test.runner.parameterized.Parameters

@RunWith(ParameterizedAndroidJunit4::class)
@SmallTest
@RunWith(AndroidJUnit4::class)
class HomeStatusBarViewModelImplTest : SysuiTestCase() {
class HomeStatusBarViewModelImplTest(flags: FlagsParameterization) : SysuiTestCase() {
    init {
        mSetFlagsRule.setFlagsParameterization(flags)
    }

    private val kosmos = testKosmos().useUnconfinedTestDispatcher()
    private val Kosmos.underTest by
        Kosmos.Fixture { kosmos.homeStatusBarViewModel.also { it.activateIn(kosmos.testScope) } }
@@ -648,14 +661,19 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() {
        }

    @Test
    @EnableSceneContainer
    fun isHomeStatusBarAllowed_onDefaultDisplayLockscreen_invisible() =
    fun isHomeStatusBarAllowed_onLockscreen_invisible() =
        kosmos.runTest {
            val latest by collectLastValue(underTest.isHomeStatusBarAllowed)

            if (SceneContainerFlag.isEnabled) {
                kosmos.sceneContainerRepository.instantlyTransitionTo(Scenes.Lockscreen)
            } else {
                kosmos.fakeKeyguardTransitionRepository.transitionTo(
                    KeyguardState.GONE,
                    KeyguardState.LOCKSCREEN,
                )
            }
            runCurrent()

            assertThat(latest).isFalse()
        }

@@ -673,22 +691,6 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() {
            assertThat(latest).isFalse()
        }

    @Test
    @DisableSceneContainer
    fun isHomeStatusBarAllowed_legacy_onDefaultDisplayLockscreen_invisible() =
        kosmos.runTest {
            val latest by collectLastValue(underTest.isHomeStatusBarAllowed)

            kosmos.fakeKeyguardTransitionRepository.transitionTo(
                KeyguardState.GONE,
                KeyguardState.LOCKSCREEN,
            )

            runCurrent()

            assertThat(latest).isFalse()
        }

    @Test
    fun shouldShowOperatorNameView_allowedByInteractor_allowedByDisableFlags_visible() =
        kosmos.runTest {
@@ -1016,42 +1018,21 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() {
        }

    @Test
    @DisableSceneContainer
    @DisableFlags(StatusBarNoHunBehavior.FLAG_NAME)
    fun hunOnLockscreenWithBypass_sceneFlagOff_noHunFlagOff_everythingVisible() =
    fun hunOnLockscreenWithBypass_noHunFlagOff_everythingVisible() =
        kosmos.runTest {
            val latestNotifs by collectLastValue(underTest.isNotificationIconContainerVisible)
            val latestSystemInfo by collectLastValue(underTest.systemInfoCombinedVis)

            // WHEN on lockscreen with bypass enabled
            if (SceneContainerFlag.isEnabled) {
                sceneContainerRepository.instantlyTransitionTo(Scenes.Lockscreen)
            } else {
                fakeKeyguardTransitionRepository.transitionTo(
                    KeyguardState.GONE,
                    KeyguardState.LOCKSCREEN,
                )
            fakeDeviceEntryFaceAuthRepository.isBypassEnabled.value = true
            // WHEN there's a HUN
            headsUpNotificationRepository.setNotifications(
                UnconfinedFakeHeadsUpRowRepository(
                    key = "key",
                    pinnedStatus = MutableStateFlow(PinnedStatus.PinnedBySystem),
                )
            )

            // THEN status bar content shows if StatusBarNoHunBehavior is off
            assertThat(latestNotifs!!.visibility).isEqualTo(View.VISIBLE)
            assertThat(latestSystemInfo!!.baseVisibility.visibility).isEqualTo(View.VISIBLE)
            }

    @Test
    @EnableSceneContainer
    @DisableFlags(StatusBarNoHunBehavior.FLAG_NAME)
    fun hunOnLockscreenWithBypass_sceneFlagOn_noHunFlagOff_everythingVisible() =
        kosmos.runTest {
            val latestNotifs by collectLastValue(underTest.isNotificationIconContainerVisible)
            val latestSystemInfo by collectLastValue(underTest.systemInfoCombinedVis)

            // WHEN on lockscreen with bypass enabled
            sceneContainerRepository.instantlyTransitionTo(Scenes.Lockscreen)
            fakeDeviceEntryFaceAuthRepository.isBypassEnabled.value = true
            // WHEN there's a HUN
            headsUpNotificationRepository.setNotifications(
@@ -1067,42 +1048,21 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() {
        }

    @Test
    @DisableSceneContainer
    @EnableFlags(StatusBarNoHunBehavior.FLAG_NAME)
    fun hunOnLockscreenWithBypass_sceneFlagOff_noHunFlagOn_everythingHidden() =
    fun hunOnLockscreenWithBypass_noHunFlagOn_everythingHidden() =
        kosmos.runTest {
            val latestNotifs by collectLastValue(underTest.isNotificationIconContainerVisible)
            val latestSystemInfo by collectLastValue(underTest.systemInfoCombinedVis)

            // WHEN on lockscreen with bypass enabled
            if (SceneContainerFlag.isEnabled) {
                sceneContainerRepository.instantlyTransitionTo(Scenes.Lockscreen)
            } else {
                fakeKeyguardTransitionRepository.transitionTo(
                    KeyguardState.GONE,
                    KeyguardState.LOCKSCREEN,
                )
            fakeDeviceEntryFaceAuthRepository.isBypassEnabled.value = true
            // WHEN there's a HUN
            headsUpNotificationRepository.setNotifications(
                UnconfinedFakeHeadsUpRowRepository(
                    key = "key",
                    pinnedStatus = MutableStateFlow(PinnedStatus.PinnedBySystem),
                )
            )

            // THEN status bar content still hides if StatusBarNoHunBehavior is on
            assertThat(latestNotifs!!.visibility).isEqualTo(View.GONE)
            assertThat(latestSystemInfo!!.baseVisibility.visibility).isEqualTo(View.GONE)
            }

    @Test
    @EnableSceneContainer
    @EnableFlags(StatusBarNoHunBehavior.FLAG_NAME)
    fun hunOnLockscreenWithBypass_sceneFlagOn_noHunFlagOn_everythingHidden() =
        kosmos.runTest {
            val latestNotifs by collectLastValue(underTest.isNotificationIconContainerVisible)
            val latestSystemInfo by collectLastValue(underTest.systemInfoCombinedVis)

            // WHEN on lockscreen with bypass enabled
            sceneContainerRepository.instantlyTransitionTo(Scenes.Lockscreen)
            fakeDeviceEntryFaceAuthRepository.isBypassEnabled.value = true
            // WHEN there's a HUN
            headsUpNotificationRepository.setNotifications(
@@ -1458,150 +1418,89 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() {
        }

    @Test
    @DisableSceneContainer
    fun lockscreenVisible_sceneFlagOff_noStatusBarViewsShown() =
    fun lockscreenVisible_noStatusBarViewsShown() =
        kosmos.runTest {
            val clockVisible by collectLastValue(underTest.isClockVisible)
            val notifIconsVisible by collectLastValue(underTest.isNotificationIconContainerVisible)
            val systemInfoVisible by collectLastValue(underTest.systemInfoCombinedVis)

            if (SceneContainerFlag.isEnabled) {
                kosmos.sceneContainerRepository.instantlyTransitionTo(Scenes.Lockscreen)
            } else {
                fakeKeyguardTransitionRepository.sendTransitionSteps(
                    from = KeyguardState.GONE,
                    to = KeyguardState.LOCKSCREEN,
                    testScope = testScope,
                )

            assertThat(clockVisible!!.visibility).isEqualTo(View.INVISIBLE)
            assertThat(notifIconsVisible!!.visibility).isEqualTo(View.GONE)
            assertThat(systemInfoVisible!!.baseVisibility.visibility).isEqualTo(View.GONE)
            }

    @Test
    @EnableSceneContainer
    fun lockscreenVisible_sceneFlagOn_noStatusBarViewsShown() =
        kosmos.runTest {
            val clockVisible by collectLastValue(underTest.isClockVisible)
            val notifIconsVisible by collectLastValue(underTest.isNotificationIconContainerVisible)
            val systemInfoVisible by collectLastValue(underTest.systemInfoCombinedVis)

            kosmos.sceneContainerRepository.instantlyTransitionTo(Scenes.Lockscreen)

            assertThat(clockVisible!!.visibility).isEqualTo(View.INVISIBLE)
            assertThat(notifIconsVisible!!.visibility).isEqualTo(View.GONE)
            assertThat(systemInfoVisible!!.baseVisibility.visibility).isEqualTo(View.GONE)
        }

    @Test
    @DisableSceneContainer
    fun bouncerVisible_sceneFlagOff_noStatusBarViewsShown() =
    fun bouncerVisible_noStatusBarViewsShown() =
        kosmos.runTest {
            val clockVisible by collectLastValue(underTest.isClockVisible)
            val notifIconsVisible by collectLastValue(underTest.isNotificationIconContainerVisible)
            val systemInfoVisible by collectLastValue(underTest.systemInfoCombinedVis)

            if (SceneContainerFlag.isEnabled) {
                kosmos.sceneContainerRepository.instantlyTransitionTo(Scenes.Lockscreen)
                kosmos.sceneContainerRepository.showOverlay(Overlays.Bouncer)
            } else {
                fakeKeyguardTransitionRepository.sendTransitionSteps(
                    from = KeyguardState.LOCKSCREEN,
                    to = KeyguardState.PRIMARY_BOUNCER,
                    testScope = testScope,
                )

            assertThat(clockVisible!!.visibility).isEqualTo(View.INVISIBLE)
            assertThat(notifIconsVisible!!.visibility).isEqualTo(View.GONE)
            assertThat(systemInfoVisible!!.baseVisibility.visibility).isEqualTo(View.GONE)
            }

    @Test
    @EnableSceneContainer
    fun bouncerVisible_sceneFlagOn_noStatusBarViewsShown() =
        kosmos.runTest {
            val clockVisible by collectLastValue(underTest.isClockVisible)
            val notifIconsVisible by collectLastValue(underTest.isNotificationIconContainerVisible)
            val systemInfoVisible by collectLastValue(underTest.systemInfoCombinedVis)

            kosmos.sceneContainerRepository.instantlyTransitionTo(Scenes.Lockscreen)
            kosmos.sceneContainerRepository.showOverlay(Overlays.Bouncer)

            assertThat(clockVisible!!.visibility).isEqualTo(View.INVISIBLE)
            assertThat(notifIconsVisible!!.visibility).isEqualTo(View.GONE)
            assertThat(systemInfoVisible!!.baseVisibility.visibility).isEqualTo(View.GONE)
        }

    @Test
    @DisableSceneContainer
    fun keyguardIsOccluded_sceneFlagOff_statusBarViewsShown() =
    fun keyguardIsOccluded_statusBarViewsShown() =
        kosmos.runTest {
            val clockVisible by collectLastValue(underTest.isClockVisible)
            val notifIconsVisible by collectLastValue(underTest.isNotificationIconContainerVisible)
            val systemInfoVisible by collectLastValue(underTest.systemInfoCombinedVis)

            if (SceneContainerFlag.isEnabled) {
                kosmos.sceneContainerRepository.instantlyTransitionTo(Scenes.Lockscreen)
                kosmos.keyguardOcclusionRepository.setShowWhenLockedActivityInfo(
                    true,
                    taskInfo = null,
                )
            } else {
                fakeKeyguardTransitionRepository.sendTransitionSteps(
                    from = KeyguardState.LOCKSCREEN,
                    to = KeyguardState.OCCLUDED,
                    testScope = testScope,
                )

            assertThat(clockVisible!!.visibility).isEqualTo(View.VISIBLE)
            assertThat(notifIconsVisible!!.visibility).isEqualTo(View.VISIBLE)
            assertThat(systemInfoVisible!!.baseVisibility.visibility).isEqualTo(View.VISIBLE)
            }

    @Test
    @EnableSceneContainer
    fun keyguardIsOccluded_sceneFlagOn_statusBarViewsShown() =
        kosmos.runTest {
            val clockVisible by collectLastValue(underTest.isClockVisible)
            val notifIconsVisible by collectLastValue(underTest.isNotificationIconContainerVisible)
            val systemInfoVisible by collectLastValue(underTest.systemInfoCombinedVis)

            kosmos.sceneContainerRepository.instantlyTransitionTo(Scenes.Lockscreen)
            kosmos.keyguardOcclusionRepository.setShowWhenLockedActivityInfo(true, taskInfo = null)

            assertThat(clockVisible!!.visibility).isEqualTo(View.VISIBLE)
            assertThat(notifIconsVisible!!.visibility).isEqualTo(View.VISIBLE)
            assertThat(systemInfoVisible!!.baseVisibility.visibility).isEqualTo(View.VISIBLE)
        }

    @Test
    @DisableSceneContainer
    fun keyguardNotShown_sceneFlagOff_statusBarViewsShown() =
    fun statusBarViewsShown_whenKeyguardAndShadeAreNotActive() =
        kosmos.runTest {
            val clockVisible by collectLastValue(underTest.isClockVisible)
            val notifIconsVisible by collectLastValue(underTest.isNotificationIconContainerVisible)
            val systemInfoVisible by collectLastValue(underTest.systemInfoCombinedVis)

            if (SceneContainerFlag.isEnabled) {
                kosmos.sceneContainerRepository.instantlyTransitionTo(Scenes.Gone)
            } else {
                transitionKeyguardToGone()

            assertThat(clockVisible!!.visibility).isEqualTo(View.VISIBLE)
            assertThat(notifIconsVisible!!.visibility).isEqualTo(View.VISIBLE)
            assertThat(systemInfoVisible!!.baseVisibility.visibility).isEqualTo(View.VISIBLE)
        }

    @Test
    @DisableSceneContainer
    fun shadeNotShown_sceneFlagOff_statusBarViewsShown() =
        kosmos.runTest {
            val clockVisible by collectLastValue(underTest.isClockVisible)
            val notifIconsVisible by collectLastValue(underTest.isNotificationIconContainerVisible)
            val systemInfoVisible by collectLastValue(underTest.systemInfoCombinedVis)
            transitionKeyguardToGone()

                kosmos.shadeTestUtil.setShadeExpansion(0f)

            assertThat(clockVisible!!.visibility).isEqualTo(View.VISIBLE)
            assertThat(notifIconsVisible!!.visibility).isEqualTo(View.VISIBLE)
            assertThat(systemInfoVisible!!.baseVisibility.visibility).isEqualTo(View.VISIBLE)
            }

    @Test
    @EnableSceneContainer
    fun keyguardNotShownAndShadeNotShown_sceneFlagOn_statusBarViewsShown() =
        kosmos.runTest {
            val clockVisible by collectLastValue(underTest.isClockVisible)
            val notifIconsVisible by collectLastValue(underTest.isNotificationIconContainerVisible)
            val systemInfoVisible by collectLastValue(underTest.systemInfoCombinedVis)

            kosmos.sceneContainerRepository.instantlyTransitionTo(Scenes.Gone)

            assertThat(clockVisible!!.visibility).isEqualTo(View.VISIBLE)
            assertThat(notifIconsVisible!!.visibility).isEqualTo(View.VISIBLE)
            assertThat(systemInfoVisible!!.baseVisibility.visibility).isEqualTo(View.VISIBLE)
@@ -1640,15 +1539,18 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() {
        }

    @Test
    @DisableSceneContainer
    fun shadeFullyShown_sceneFlagOff_noStatusBarViewsShown() =
    fun shadeFullyShown_noStatusBarViewsShown() =
        kosmos.runTest {
            val clockVisible by collectLastValue(underTest.isClockVisible)
            val notifIconsVisible by collectLastValue(underTest.isNotificationIconContainerVisible)
            val systemInfoVisible by collectLastValue(underTest.systemInfoCombinedVis)
            transitionKeyguardToGone()

            if (SceneContainerFlag.isEnabled) {
                kosmos.sceneContainerRepository.instantlyTransitionTo(Scenes.Shade)
            } else {
                kosmos.shadeTestUtil.setShadeExpansion(1f)
            }

            assertThat(clockVisible!!.visibility).isEqualTo(View.INVISIBLE)
            assertThat(notifIconsVisible!!.visibility).isEqualTo(View.GONE)
@@ -1732,9 +1634,9 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() {
            assertThat(systemInfoVisible!!.baseVisibility.visibility).isEqualTo(View.GONE)
        }

    @Test
    @EnableSceneContainer
    fun shadeShown_sceneFlagOn_noStatusBarViewsShown() =
    @Test
    fun shadeShown_noStatusBarViewsShown() =
        kosmos.runTest {
            val clockVisible by collectLastValue(underTest.isClockVisible)
            val notifIconsVisible by collectLastValue(underTest.isNotificationIconContainerVisible)
@@ -1749,44 +1651,35 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() {
        }

    @Test
    @DisableSceneContainer
    fun secureCameraActive_sceneFlagOff_noStatusBarViewsShown() =
    fun secureCameraActive_noStatusBarViewsShown() =
        kosmos.runTest {
            val clockVisible by collectLastValue(underTest.isClockVisible)
            val notifIconsVisible by collectLastValue(underTest.isNotificationIconContainerVisible)
            val systemInfoVisible by collectLastValue(underTest.systemInfoCombinedVis)

            if (SceneContainerFlag.isEnabled) {
                kosmos.sceneContainerRepository.instantlyTransitionTo(Scenes.Lockscreen)
                // Secure camera is an occluding activity
            fakeKeyguardTransitionRepository.sendTransitionSteps(
                from = KeyguardState.LOCKSCREEN,
                to = KeyguardState.OCCLUDED,
                testScope = testScope,
                kosmos.keyguardOcclusionRepository.setShowWhenLockedActivityInfo(
                    true,
                    taskInfo = null,
                )
                kosmos.keyguardInteractor.onCameraLaunchDetected(
                    CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP,
                    isSecureCamera = true,
                )

            assertThat(clockVisible!!.visibility).isEqualTo(View.INVISIBLE)
            assertThat(notifIconsVisible!!.visibility).isEqualTo(View.GONE)
            assertThat(systemInfoVisible!!.baseVisibility.visibility).isEqualTo(View.GONE)
        }

    @Test
    @EnableSceneContainer
    fun secureCameraActive_sceneFlagOn_noStatusBarViewsShown() =
        kosmos.runTest {
            val clockVisible by collectLastValue(underTest.isClockVisible)
            val notifIconsVisible by collectLastValue(underTest.isNotificationIconContainerVisible)
            val systemInfoVisible by collectLastValue(underTest.systemInfoCombinedVis)

            kosmos.sceneContainerRepository.instantlyTransitionTo(Scenes.Lockscreen)
            } else {
                // Secure camera is an occluding activity
            kosmos.keyguardOcclusionRepository.setShowWhenLockedActivityInfo(true, taskInfo = null)
                fakeKeyguardTransitionRepository.sendTransitionSteps(
                    from = KeyguardState.LOCKSCREEN,
                    to = KeyguardState.OCCLUDED,
                    testScope = testScope,
                )
                kosmos.keyguardInteractor.onCameraLaunchDetected(
                    CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP,
                    isSecureCamera = true,
                )
            }

            assertThat(clockVisible!!.visibility).isEqualTo(View.INVISIBLE)
            assertThat(notifIconsVisible!!.visibility).isEqualTo(View.GONE)
@@ -1863,6 +1756,10 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() {
    }

    private suspend fun Kosmos.transitionKeyguardToGone() {
        if (SceneContainerFlag.isEnabled) {
            setDeviceEntered()
        }

        fakeKeyguardTransitionRepository.sendTransitionSteps(
            from = KeyguardState.LOCKSCREEN,
            to = KeyguardState.GONE,
@@ -1870,7 +1767,25 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() {
        )
    }

    private companion object {
    private fun Kosmos.setDeviceEntered() {
        kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus(
            SuccessFingerprintAuthenticationStatus(0, true)
        )

        sceneInteractor.changeScene(Scenes.Gone, "test")
        sceneInteractor.setTransitionState(
            MutableStateFlow<ObservableTransitionState>(ObservableTransitionState.Idle(Scenes.Gone))
        )
        assertThat(kosmos.deviceEntryInteractor.isDeviceEntered.value).isEqualTo(true)
    }

    companion object {
        @JvmStatic
        @Parameters(name = "{0}")
        fun getParams(): List<FlagsParameterization> {
            return FlagsParameterization.allCombinationsOf().andSceneContainer()
        }

        const val EXTERNAL_DISPLAY = 1
    }
}