Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelImplTest.kt +138 −223 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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) } } Loading Loading @@ -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() } Loading @@ -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 { Loading Loading @@ -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( Loading @@ -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( Loading Loading @@ -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) Loading Loading @@ -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) Loading Loading @@ -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) Loading @@ -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) Loading Loading @@ -1863,6 +1756,10 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() { } private suspend fun Kosmos.transitionKeyguardToGone() { if (SceneContainerFlag.isEnabled) { setDeviceEntered() } fakeKeyguardTransitionRepository.sendTransitionSteps( from = KeyguardState.LOCKSCREEN, to = KeyguardState.GONE, Loading @@ -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 } } Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelImplTest.kt +138 −223 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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) } } Loading Loading @@ -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() } Loading @@ -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 { Loading Loading @@ -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( Loading @@ -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( Loading Loading @@ -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) Loading Loading @@ -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) Loading Loading @@ -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) Loading @@ -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) Loading Loading @@ -1863,6 +1756,10 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() { } private suspend fun Kosmos.transitionKeyguardToGone() { if (SceneContainerFlag.isEnabled) { setDeviceEntered() } fakeKeyguardTransitionRepository.sendTransitionSteps( from = KeyguardState.LOCKSCREEN, to = KeyguardState.GONE, Loading @@ -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 } }