Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelImplTest.kt +41 −0 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.pipeline.shared.ui.viewmodel package com.android.systemui.statusbar.pipeline.shared.ui.viewmodel import android.app.StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP import android.app.StatusBarManager.DISABLE2_NONE import android.app.StatusBarManager.DISABLE2_NONE import android.app.StatusBarManager.DISABLE_CLOCK import android.app.StatusBarManager.DISABLE_CLOCK import android.app.StatusBarManager.DISABLE_NONE import android.app.StatusBarManager.DISABLE_NONE Loading @@ -33,6 +34,7 @@ import com.android.systemui.flags.DisableSceneContainer import com.android.systemui.flags.EnableSceneContainer import com.android.systemui.flags.EnableSceneContainer import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository import com.android.systemui.keyguard.data.repository.keyguardOcclusionRepository 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.KeyguardState import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.shared.model.TransitionStep import com.android.systemui.keyguard.shared.model.TransitionStep Loading Loading @@ -746,6 +748,45 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() { assertThat(systemInfoVisible!!.visibility).isEqualTo(View.GONE) assertThat(systemInfoVisible!!.visibility).isEqualTo(View.GONE) } } @Test @DisableSceneContainer fun secureCameraActive_sceneFlagOff_noStatusBarViewsShown() = testScope.runTest { val clockVisible by collectLastValue(underTest.isClockVisible) val notifIconsVisible by collectLastValue(underTest.isNotificationIconContainerVisible) val systemInfoVisible by collectLastValue(underTest.isSystemInfoVisible) // Secure camera is an occluding activity keyguardTransitionRepository.sendTransitionSteps( from = KeyguardState.LOCKSCREEN, to = KeyguardState.OCCLUDED, testScope = this, ) kosmos.keyguardInteractor.onCameraLaunchDetected(CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP) assertThat(clockVisible!!.visibility).isEqualTo(View.GONE) assertThat(notifIconsVisible!!.visibility).isEqualTo(View.GONE) assertThat(systemInfoVisible!!.visibility).isEqualTo(View.GONE) } @Test @EnableSceneContainer fun secureCameraActive_sceneFlagOn_noStatusBarViewsShown() = testScope.runTest { val clockVisible by collectLastValue(underTest.isClockVisible) val notifIconsVisible by collectLastValue(underTest.isNotificationIconContainerVisible) val systemInfoVisible by collectLastValue(underTest.isSystemInfoVisible) 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) assertThat(clockVisible!!.visibility).isEqualTo(View.GONE) assertThat(notifIconsVisible!!.visibility).isEqualTo(View.GONE) assertThat(systemInfoVisible!!.visibility).isEqualTo(View.GONE) } private fun activeNotificationsStore(notifications: List<ActiveNotificationModel>) = private fun activeNotificationsStore(notifications: List<ActiveNotificationModel>) = ActiveNotificationsStore.Builder() ActiveNotificationsStore.Builder() .apply { notifications.forEach(::addIndividualNotif) } .apply { notifications.forEach(::addIndividualNotif) } Loading packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt +27 −10 Original line number Original line Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.systemui.statusbar.pipeline.shared.ui.viewmodel import android.view.View import android.view.View import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.shared.model.Edge import com.android.systemui.keyguard.shared.model.Edge import com.android.systemui.keyguard.shared.model.KeyguardState.DREAMING import com.android.systemui.keyguard.shared.model.KeyguardState.DREAMING Loading Loading @@ -123,6 +124,7 @@ constructor( private val lightsOutInteractor: LightsOutInteractor, private val lightsOutInteractor: LightsOutInteractor, private val notificationsInteractor: ActiveNotificationsInteractor, private val notificationsInteractor: ActiveNotificationsInteractor, keyguardTransitionInteractor: KeyguardTransitionInteractor, keyguardTransitionInteractor: KeyguardTransitionInteractor, keyguardInteractor: KeyguardInteractor, sceneInteractor: SceneInteractor, sceneInteractor: SceneInteractor, sceneContainerOcclusionInteractor: SceneContainerOcclusionInteractor, sceneContainerOcclusionInteractor: SceneContainerOcclusionInteractor, shadeInteractor: ShadeInteractor, shadeInteractor: ShadeInteractor, Loading Loading @@ -184,29 +186,43 @@ constructor( // TODO(b/364360986): Add edge cases, like secure camera launch. // TODO(b/364360986): Add edge cases, like secure camera launch. } } private val isHomeScreenStatusBarAllowed: Flow<Boolean> = private val isHomeStatusBarAllowed: Flow<Boolean> = if (SceneContainerFlag.isEnabled) { if (SceneContainerFlag.isEnabled) { isHomeStatusBarAllowedByScene isHomeStatusBarAllowedByScene } else { } else { isHomeScreenStatusBarAllowedLegacy isHomeScreenStatusBarAllowedLegacy } } private val shouldHomeStatusBarBeVisible = combine(isHomeStatusBarAllowed, keyguardInteractor.isSecureCameraActive) { isHomeStatusBarAllowed, isSecureCameraActive -> // When launching the camera over the lockscreen, the status icons would typically // become visible momentarily before animating out, since we're not yet aware that the // launching camera activity is fullscreen. Even once the activity finishes launching, // it takes a short time before WM decides that the top app wants to hide the icons and // tells us to hide them. // To ensure that this high-visibility animation is smooth, keep the icons hidden during // a camera launch. See b/257292822. isHomeStatusBarAllowed && !isSecureCameraActive } override val isClockVisible: Flow<VisibilityModel> = override val isClockVisible: Flow<VisibilityModel> = combine( combine( isHomeScreenStatusBarAllowed, shouldHomeStatusBarBeVisible, collapsedStatusBarInteractor.visibilityViaDisableFlags, collapsedStatusBarInteractor.visibilityViaDisableFlags, ) { isStatusBarAllowed, visibilityViaDisableFlags -> ) { shouldStatusBarBeVisible, visibilityViaDisableFlags -> val showClock = isStatusBarAllowed && visibilityViaDisableFlags.isClockAllowed val showClock = shouldStatusBarBeVisible && visibilityViaDisableFlags.isClockAllowed // TODO(b/364360986): Take CollapsedStatusBarFragment.clockHiddenMode into account. // TODO(b/364360986): Take CollapsedStatusBarFragment.clockHiddenMode into account. VisibilityModel(showClock.toVisibilityInt(), visibilityViaDisableFlags.animate) VisibilityModel(showClock.toVisibilityInt(), visibilityViaDisableFlags.animate) } } override val isNotificationIconContainerVisible: Flow<VisibilityModel> = override val isNotificationIconContainerVisible: Flow<VisibilityModel> = combine( combine( isHomeScreenStatusBarAllowed, shouldHomeStatusBarBeVisible, collapsedStatusBarInteractor.visibilityViaDisableFlags, collapsedStatusBarInteractor.visibilityViaDisableFlags, ) { isStatusBarAllowed, visibilityViaDisableFlags -> ) { shouldStatusBarBeVisible, visibilityViaDisableFlags -> val showNotificationIconContainer = val showNotificationIconContainer = isStatusBarAllowed && visibilityViaDisableFlags.areNotificationIconsAllowed shouldStatusBarBeVisible && visibilityViaDisableFlags.areNotificationIconsAllowed VisibilityModel( VisibilityModel( showNotificationIconContainer.toVisibilityInt(), showNotificationIconContainer.toVisibilityInt(), visibilityViaDisableFlags.animate, visibilityViaDisableFlags.animate, Loading @@ -214,10 +230,11 @@ constructor( } } override val isSystemInfoVisible: Flow<VisibilityModel> = override val isSystemInfoVisible: Flow<VisibilityModel> = combine( combine( isHomeScreenStatusBarAllowed, shouldHomeStatusBarBeVisible, collapsedStatusBarInteractor.visibilityViaDisableFlags, collapsedStatusBarInteractor.visibilityViaDisableFlags, ) { isStatusBarAllowed, visibilityViaDisableFlags -> ) { shouldStatusBarBeVisible, visibilityViaDisableFlags -> val showSystemInfo = isStatusBarAllowed && visibilityViaDisableFlags.isSystemInfoAllowed val showSystemInfo = shouldStatusBarBeVisible && visibilityViaDisableFlags.isSystemInfoAllowed VisibilityModel(showSystemInfo.toVisibilityInt(), visibilityViaDisableFlags.animate) VisibilityModel(showSystemInfo.toVisibilityInt(), visibilityViaDisableFlags.animate) } } Loading packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/CollapsedStatusBarViewModelKosmos.kt→packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelKosmos.kt +2 −0 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.pipeline.shared.ui.viewmodel package com.android.systemui.statusbar.pipeline.shared.ui.viewmodel import com.android.systemui.keyguard.domain.interactor.keyguardInteractor import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.kosmos.applicationCoroutineScope Loading @@ -34,6 +35,7 @@ val Kosmos.homeStatusBarViewModel: HomeStatusBarViewModel by lightsOutInteractor, lightsOutInteractor, activeNotificationsInteractor, activeNotificationsInteractor, keyguardTransitionInteractor, keyguardTransitionInteractor, keyguardInteractor, sceneInteractor, sceneInteractor, sceneContainerOcclusionInteractor, sceneContainerOcclusionInteractor, shadeInteractor, shadeInteractor, Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelImplTest.kt +41 −0 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.pipeline.shared.ui.viewmodel package com.android.systemui.statusbar.pipeline.shared.ui.viewmodel import android.app.StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP import android.app.StatusBarManager.DISABLE2_NONE import android.app.StatusBarManager.DISABLE2_NONE import android.app.StatusBarManager.DISABLE_CLOCK import android.app.StatusBarManager.DISABLE_CLOCK import android.app.StatusBarManager.DISABLE_NONE import android.app.StatusBarManager.DISABLE_NONE Loading @@ -33,6 +34,7 @@ import com.android.systemui.flags.DisableSceneContainer import com.android.systemui.flags.EnableSceneContainer import com.android.systemui.flags.EnableSceneContainer import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository import com.android.systemui.keyguard.data.repository.keyguardOcclusionRepository 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.KeyguardState import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.shared.model.TransitionStep import com.android.systemui.keyguard.shared.model.TransitionStep Loading Loading @@ -746,6 +748,45 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() { assertThat(systemInfoVisible!!.visibility).isEqualTo(View.GONE) assertThat(systemInfoVisible!!.visibility).isEqualTo(View.GONE) } } @Test @DisableSceneContainer fun secureCameraActive_sceneFlagOff_noStatusBarViewsShown() = testScope.runTest { val clockVisible by collectLastValue(underTest.isClockVisible) val notifIconsVisible by collectLastValue(underTest.isNotificationIconContainerVisible) val systemInfoVisible by collectLastValue(underTest.isSystemInfoVisible) // Secure camera is an occluding activity keyguardTransitionRepository.sendTransitionSteps( from = KeyguardState.LOCKSCREEN, to = KeyguardState.OCCLUDED, testScope = this, ) kosmos.keyguardInteractor.onCameraLaunchDetected(CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP) assertThat(clockVisible!!.visibility).isEqualTo(View.GONE) assertThat(notifIconsVisible!!.visibility).isEqualTo(View.GONE) assertThat(systemInfoVisible!!.visibility).isEqualTo(View.GONE) } @Test @EnableSceneContainer fun secureCameraActive_sceneFlagOn_noStatusBarViewsShown() = testScope.runTest { val clockVisible by collectLastValue(underTest.isClockVisible) val notifIconsVisible by collectLastValue(underTest.isNotificationIconContainerVisible) val systemInfoVisible by collectLastValue(underTest.isSystemInfoVisible) 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) assertThat(clockVisible!!.visibility).isEqualTo(View.GONE) assertThat(notifIconsVisible!!.visibility).isEqualTo(View.GONE) assertThat(systemInfoVisible!!.visibility).isEqualTo(View.GONE) } private fun activeNotificationsStore(notifications: List<ActiveNotificationModel>) = private fun activeNotificationsStore(notifications: List<ActiveNotificationModel>) = ActiveNotificationsStore.Builder() ActiveNotificationsStore.Builder() .apply { notifications.forEach(::addIndividualNotif) } .apply { notifications.forEach(::addIndividualNotif) } Loading
packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt +27 −10 Original line number Original line Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.systemui.statusbar.pipeline.shared.ui.viewmodel import android.view.View import android.view.View import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.shared.model.Edge import com.android.systemui.keyguard.shared.model.Edge import com.android.systemui.keyguard.shared.model.KeyguardState.DREAMING import com.android.systemui.keyguard.shared.model.KeyguardState.DREAMING Loading Loading @@ -123,6 +124,7 @@ constructor( private val lightsOutInteractor: LightsOutInteractor, private val lightsOutInteractor: LightsOutInteractor, private val notificationsInteractor: ActiveNotificationsInteractor, private val notificationsInteractor: ActiveNotificationsInteractor, keyguardTransitionInteractor: KeyguardTransitionInteractor, keyguardTransitionInteractor: KeyguardTransitionInteractor, keyguardInteractor: KeyguardInteractor, sceneInteractor: SceneInteractor, sceneInteractor: SceneInteractor, sceneContainerOcclusionInteractor: SceneContainerOcclusionInteractor, sceneContainerOcclusionInteractor: SceneContainerOcclusionInteractor, shadeInteractor: ShadeInteractor, shadeInteractor: ShadeInteractor, Loading Loading @@ -184,29 +186,43 @@ constructor( // TODO(b/364360986): Add edge cases, like secure camera launch. // TODO(b/364360986): Add edge cases, like secure camera launch. } } private val isHomeScreenStatusBarAllowed: Flow<Boolean> = private val isHomeStatusBarAllowed: Flow<Boolean> = if (SceneContainerFlag.isEnabled) { if (SceneContainerFlag.isEnabled) { isHomeStatusBarAllowedByScene isHomeStatusBarAllowedByScene } else { } else { isHomeScreenStatusBarAllowedLegacy isHomeScreenStatusBarAllowedLegacy } } private val shouldHomeStatusBarBeVisible = combine(isHomeStatusBarAllowed, keyguardInteractor.isSecureCameraActive) { isHomeStatusBarAllowed, isSecureCameraActive -> // When launching the camera over the lockscreen, the status icons would typically // become visible momentarily before animating out, since we're not yet aware that the // launching camera activity is fullscreen. Even once the activity finishes launching, // it takes a short time before WM decides that the top app wants to hide the icons and // tells us to hide them. // To ensure that this high-visibility animation is smooth, keep the icons hidden during // a camera launch. See b/257292822. isHomeStatusBarAllowed && !isSecureCameraActive } override val isClockVisible: Flow<VisibilityModel> = override val isClockVisible: Flow<VisibilityModel> = combine( combine( isHomeScreenStatusBarAllowed, shouldHomeStatusBarBeVisible, collapsedStatusBarInteractor.visibilityViaDisableFlags, collapsedStatusBarInteractor.visibilityViaDisableFlags, ) { isStatusBarAllowed, visibilityViaDisableFlags -> ) { shouldStatusBarBeVisible, visibilityViaDisableFlags -> val showClock = isStatusBarAllowed && visibilityViaDisableFlags.isClockAllowed val showClock = shouldStatusBarBeVisible && visibilityViaDisableFlags.isClockAllowed // TODO(b/364360986): Take CollapsedStatusBarFragment.clockHiddenMode into account. // TODO(b/364360986): Take CollapsedStatusBarFragment.clockHiddenMode into account. VisibilityModel(showClock.toVisibilityInt(), visibilityViaDisableFlags.animate) VisibilityModel(showClock.toVisibilityInt(), visibilityViaDisableFlags.animate) } } override val isNotificationIconContainerVisible: Flow<VisibilityModel> = override val isNotificationIconContainerVisible: Flow<VisibilityModel> = combine( combine( isHomeScreenStatusBarAllowed, shouldHomeStatusBarBeVisible, collapsedStatusBarInteractor.visibilityViaDisableFlags, collapsedStatusBarInteractor.visibilityViaDisableFlags, ) { isStatusBarAllowed, visibilityViaDisableFlags -> ) { shouldStatusBarBeVisible, visibilityViaDisableFlags -> val showNotificationIconContainer = val showNotificationIconContainer = isStatusBarAllowed && visibilityViaDisableFlags.areNotificationIconsAllowed shouldStatusBarBeVisible && visibilityViaDisableFlags.areNotificationIconsAllowed VisibilityModel( VisibilityModel( showNotificationIconContainer.toVisibilityInt(), showNotificationIconContainer.toVisibilityInt(), visibilityViaDisableFlags.animate, visibilityViaDisableFlags.animate, Loading @@ -214,10 +230,11 @@ constructor( } } override val isSystemInfoVisible: Flow<VisibilityModel> = override val isSystemInfoVisible: Flow<VisibilityModel> = combine( combine( isHomeScreenStatusBarAllowed, shouldHomeStatusBarBeVisible, collapsedStatusBarInteractor.visibilityViaDisableFlags, collapsedStatusBarInteractor.visibilityViaDisableFlags, ) { isStatusBarAllowed, visibilityViaDisableFlags -> ) { shouldStatusBarBeVisible, visibilityViaDisableFlags -> val showSystemInfo = isStatusBarAllowed && visibilityViaDisableFlags.isSystemInfoAllowed val showSystemInfo = shouldStatusBarBeVisible && visibilityViaDisableFlags.isSystemInfoAllowed VisibilityModel(showSystemInfo.toVisibilityInt(), visibilityViaDisableFlags.animate) VisibilityModel(showSystemInfo.toVisibilityInt(), visibilityViaDisableFlags.animate) } } Loading
packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/CollapsedStatusBarViewModelKosmos.kt→packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelKosmos.kt +2 −0 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.pipeline.shared.ui.viewmodel package com.android.systemui.statusbar.pipeline.shared.ui.viewmodel import com.android.systemui.keyguard.domain.interactor.keyguardInteractor import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.kosmos.applicationCoroutineScope Loading @@ -34,6 +35,7 @@ val Kosmos.homeStatusBarViewModel: HomeStatusBarViewModel by lightsOutInteractor, lightsOutInteractor, activeNotificationsInteractor, activeNotificationsInteractor, keyguardTransitionInteractor, keyguardTransitionInteractor, keyguardInteractor, sceneInteractor, sceneInteractor, sceneContainerOcclusionInteractor, sceneContainerOcclusionInteractor, shadeInteractor, shadeInteractor, Loading