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

Commit 727bd6d0 authored by Caitlin Shkuratov's avatar Caitlin Shkuratov
Browse files

[SB] In StatusBarViewModel, keep icons hidden during camera launch.

This CL re-implements Change-Id
Ib54917b4e65529a2fd809eb67159d57d64e8097f in the new
CollapsedStatusBarViewModel so that the secure camera launch animation
still looks good even after we deprecate CollapsedStatusBarFragment.

Bug: 364360986
Bug: 257292822
Flag: com.android.systemui.status_bar_simple_fragment

Test: With flag on, launch camera from lockscreen by double-tapping
power button -> verify status bar icons never show up
Test: Launch camera from lockscreen by double-tapping power button, then
go back to home screen, then launch the Home shortcut -> verify status
bar icons *do* show up in the Home occluding activity
Test: atest CollapsedStatusBarViewModelImplTest

Change-Id: Ic8807e2fb600377cd12368bcd0da2418fe13d0cd
parent 2e9f8c27
Loading
Loading
Loading
Loading
+41 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

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.DISABLE_CLOCK
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.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.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionStep
@@ -746,6 +748,45 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() {
            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>) =
        ActiveNotificationsStore.Builder()
            .apply { notifications.forEach(::addIndividualNotif) }
+27 −10
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.systemui.statusbar.pipeline.shared.ui.viewmodel
import android.view.View
import com.android.systemui.dagger.SysUISingleton
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.shared.model.Edge
import com.android.systemui.keyguard.shared.model.KeyguardState.DREAMING
@@ -123,6 +124,7 @@ constructor(
    private val lightsOutInteractor: LightsOutInteractor,
    private val notificationsInteractor: ActiveNotificationsInteractor,
    keyguardTransitionInteractor: KeyguardTransitionInteractor,
    keyguardInteractor: KeyguardInteractor,
    sceneInteractor: SceneInteractor,
    sceneContainerOcclusionInteractor: SceneContainerOcclusionInteractor,
    shadeInteractor: ShadeInteractor,
@@ -184,29 +186,43 @@ constructor(
            // TODO(b/364360986): Add edge cases, like secure camera launch.
        }

    private val isHomeScreenStatusBarAllowed: Flow<Boolean> =
    private val isHomeStatusBarAllowed: Flow<Boolean> =
        if (SceneContainerFlag.isEnabled) {
            isHomeStatusBarAllowedByScene
        } else {
            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> =
        combine(
            isHomeScreenStatusBarAllowed,
            shouldHomeStatusBarBeVisible,
            collapsedStatusBarInteractor.visibilityViaDisableFlags,
        ) { isStatusBarAllowed, visibilityViaDisableFlags ->
            val showClock = isStatusBarAllowed && visibilityViaDisableFlags.isClockAllowed
        ) { shouldStatusBarBeVisible, visibilityViaDisableFlags ->
            val showClock = shouldStatusBarBeVisible && visibilityViaDisableFlags.isClockAllowed
            // TODO(b/364360986): Take CollapsedStatusBarFragment.clockHiddenMode into account.
            VisibilityModel(showClock.toVisibilityInt(), visibilityViaDisableFlags.animate)
        }
    override val isNotificationIconContainerVisible: Flow<VisibilityModel> =
        combine(
            isHomeScreenStatusBarAllowed,
            shouldHomeStatusBarBeVisible,
            collapsedStatusBarInteractor.visibilityViaDisableFlags,
        ) { isStatusBarAllowed, visibilityViaDisableFlags ->
        ) { shouldStatusBarBeVisible, visibilityViaDisableFlags ->
            val showNotificationIconContainer =
                isStatusBarAllowed && visibilityViaDisableFlags.areNotificationIconsAllowed
                shouldStatusBarBeVisible && visibilityViaDisableFlags.areNotificationIconsAllowed
            VisibilityModel(
                showNotificationIconContainer.toVisibilityInt(),
                visibilityViaDisableFlags.animate,
@@ -214,10 +230,11 @@ constructor(
        }
    override val isSystemInfoVisible: Flow<VisibilityModel> =
        combine(
            isHomeScreenStatusBarAllowed,
            shouldHomeStatusBarBeVisible,
            collapsedStatusBarInteractor.visibilityViaDisableFlags,
        ) { isStatusBarAllowed, visibilityViaDisableFlags ->
            val showSystemInfo = isStatusBarAllowed && visibilityViaDisableFlags.isSystemInfoAllowed
        ) { shouldStatusBarBeVisible, visibilityViaDisableFlags ->
            val showSystemInfo =
                shouldStatusBarBeVisible && visibilityViaDisableFlags.isSystemInfoAllowed
            VisibilityModel(showSystemInfo.toVisibilityInt(), visibilityViaDisableFlags.animate)
        }

+2 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

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.kosmos.Kosmos
import com.android.systemui.kosmos.applicationCoroutineScope
@@ -34,6 +35,7 @@ val Kosmos.homeStatusBarViewModel: HomeStatusBarViewModel by
            lightsOutInteractor,
            activeNotificationsInteractor,
            keyguardTransitionInteractor,
            keyguardInteractor,
            sceneInteractor,
            sceneContainerOcclusionInteractor,
            shadeInteractor,