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

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

Merge "[SB] In StatusBarViewModel, keep icons hidden during camera launch." into main

parents 205cd9fd 727bd6d0
Loading
Loading
Loading
Loading
+41 −0
Original line number Original line Diff line number Diff line
@@ -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
@@ -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
@@ -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) }
+27 −10
Original line number Original line Diff line number Diff line
@@ -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
@@ -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,
@@ -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,
@@ -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)
        }
        }


+2 −0
Original line number Original line Diff line number Diff line
@@ -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
@@ -34,6 +35,7 @@ val Kosmos.homeStatusBarViewModel: HomeStatusBarViewModel by
            lightsOutInteractor,
            lightsOutInteractor,
            activeNotificationsInteractor,
            activeNotificationsInteractor,
            keyguardTransitionInteractor,
            keyguardTransitionInteractor,
            keyguardInteractor,
            sceneInteractor,
            sceneInteractor,
            sceneContainerOcclusionInteractor,
            sceneContainerOcclusionInteractor,
            shadeInteractor,
            shadeInteractor,