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

Commit 40e1d38f authored by Lucas Silva's avatar Lucas Silva Committed by Android (Google) Code Review
Browse files

Merge "Fix swipe-to-bouncer on GH with face auth" into main

parents c97e5434 fecfb975
Loading
Loading
Loading
Loading
+39 −13
Original line number Diff line number Diff line
@@ -17,14 +17,15 @@

package com.android.systemui.statusbar.notification.stack.ui.viewmodel

import android.platform.test.annotations.EnableFlags
import android.platform.test.flag.junit.FlagsParameterization
import androidx.test.filters.SmallTest
import com.android.compose.animation.scene.ObservableTransitionState
import com.android.systemui.Flags.FLAG_GLANCEABLE_HUB_V2
import com.android.systemui.SysuiTestCase
import com.android.systemui.bouncer.data.repository.keyguardBouncerRepository
import com.android.systemui.common.shared.model.NotificationContainerBounds
import com.android.systemui.common.ui.data.repository.fakeConfigurationRepository
import com.android.systemui.communal.data.repository.communalSceneRepository
import com.android.systemui.communal.domain.interactor.communalSceneInteractor
import com.android.systemui.communal.shared.model.CommunalScenes
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.coroutines.collectValues
@@ -54,11 +55,14 @@ import com.android.systemui.keyguard.ui.viewmodel.AodBurnInViewModel
import com.android.systemui.keyguard.ui.viewmodel.ViewStateAccessor
import com.android.systemui.keyguard.ui.viewmodel.aodBurnInViewModel
import com.android.systemui.keyguard.ui.viewmodel.keyguardRootViewModel
import com.android.systemui.kosmos.collectLastValue
import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.testScope
import com.android.systemui.res.R
import com.android.systemui.scene.data.repository.Idle
import com.android.systemui.scene.data.repository.Transition
import com.android.systemui.scene.data.repository.setTransition
import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.shade.domain.interactor.enableDualShade
import com.android.systemui.shade.domain.interactor.enableSingleShade
@@ -125,7 +129,6 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S
        kosmos.sharedNotificationContainerInteractor
    }
    private val largeScreenHeaderHelper by lazy { kosmos.mockLargeScreenHeaderHelper }
    private val communalSceneRepository by lazy { kosmos.communalSceneRepository }

    lateinit var underTest: SharedNotificationContainerViewModel

@@ -590,6 +593,25 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S
            assertThat(isOnLockscreen).isTrue()
        }

    @Test
    @DisableSceneContainer
    @EnableFlags(FLAG_GLANCEABLE_HUB_V2)
    fun isOnLockscreenFalseWhenCommunalShowing() =
        kosmos.runTest {
            val isOnLockscreen by collectLastValue(underTest.isOnLockscreen)

            setTransition(
                sceneTransition = Idle(Scenes.Bouncer),
                stateTransition = TransitionStep(from = LOCKSCREEN, to = PRIMARY_BOUNCER),
            )
            assertThat(isOnLockscreen).isTrue()

            testScope.showCommunalScene()

            // If bouncer is showing over the hub, it should not be considered on lockscreen
            assertThat(isOnLockscreen).isFalse()
        }

    @Test
    fun isOnLockscreenWithoutShade() =
        testScope.runTest {
@@ -1472,20 +1494,24 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S
    }

    private fun TestScope.showCommunalScene() {
        val transitionState =
            MutableStateFlow<ObservableTransitionState>(
                ObservableTransitionState.Idle(CommunalScenes.Communal)
            )
        communalSceneRepository.setTransitionState(transitionState)
        val targetScene =
            if (SceneContainerFlag.isEnabled) {
                Scenes.Communal
            } else {
                CommunalScenes.Communal
            }
        kosmos.communalSceneInteractor.changeScene(targetScene, "test")
        runCurrent()
    }

    private fun TestScope.hideCommunalScene() {
        val transitionState =
            MutableStateFlow<ObservableTransitionState>(
                ObservableTransitionState.Idle(CommunalScenes.Blank)
            )
        communalSceneRepository.setTransitionState(transitionState)
        val targetScene =
            if (SceneContainerFlag.isEnabled) {
                Scenes.Lockscreen
            } else {
                CommunalScenes.Blank
            }
        kosmos.communalSceneInteractor.changeScene(targetScene, "test")
        runCurrent()
    }

+35 −12
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ package com.android.systemui.statusbar.notification.stack.ui.viewmodel
import android.content.Context
import androidx.annotation.VisibleForTesting
import com.android.app.tracing.coroutines.flow.flowName
import com.android.systemui.Flags.glanceableHubV2
import com.android.systemui.common.shared.model.NotificationContainerBounds
import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor
@@ -87,7 +88,9 @@ import com.android.systemui.statusbar.notification.domain.interactor.HeadsUpNoti
import com.android.systemui.statusbar.notification.stack.domain.interactor.NotificationStackAppearanceInteractor
import com.android.systemui.statusbar.notification.stack.domain.interactor.SharedNotificationContainerInteractor
import com.android.systemui.unfold.domain.interactor.UnfoldTransitionInteractor
import com.android.systemui.util.kotlin.BooleanFlowOperators.allOf
import com.android.systemui.util.kotlin.BooleanFlowOperators.anyOf
import com.android.systemui.util.kotlin.BooleanFlowOperators.not
import com.android.systemui.util.kotlin.FlowDumperImpl
import com.android.systemui.util.kotlin.Utils.Companion.sample as sampleCombine
import com.android.systemui.util.kotlin.sample
@@ -299,11 +302,8 @@ constructor(
            .distinctUntilChanged()
            .dumpWhileCollecting("configurationBasedDimensions")

    /** If the user is visually on one of the unoccluded lockscreen states. */
    val isOnLockscreen: Flow<Boolean> =
    private val isOnAnyBouncer: Flow<Boolean> =
        anyOf(
                keyguardTransitionInteractor.transitionValue(AOD).map { it > 0f },
                keyguardTransitionInteractor.transitionValue(DOZING).map { it > 0f },
            keyguardTransitionInteractor.transitionValue(ALTERNATE_BOUNCER).map { it > 0f },
            keyguardTransitionInteractor
                .transitionValue(
@@ -311,8 +311,31 @@ constructor(
                    stateWithoutSceneContainer = PRIMARY_BOUNCER,
                )
                .map { it > 0f },
        )

    /** If the user is visually on one of the unoccluded lockscreen states. */
    val isOnLockscreen: Flow<Boolean> =
        if (glanceableHubV2()) {
                anyOf(
                    keyguardTransitionInteractor.transitionValue(AOD).map { it > 0f },
                    keyguardTransitionInteractor.transitionValue(DOZING).map { it > 0f },
                    keyguardTransitionInteractor.transitionValue(LOCKSCREEN).map { it > 0f },
                    allOf(
                        // Exclude bouncer showing over communal hub, as this should not be
                        // considered
                        // "lockscreen"
                        not(communalSceneInteractor.isCommunalVisible),
                        isOnAnyBouncer,
                    ),
                )
            } else {
                anyOf(
                    keyguardTransitionInteractor.transitionValue(AOD).map { it > 0f },
                    keyguardTransitionInteractor.transitionValue(DOZING).map { it > 0f },
                    keyguardTransitionInteractor.transitionValue(LOCKSCREEN).map { it > 0f },
                    isOnAnyBouncer,
                )
            }
            .flowName("isOnLockscreen")
            .stateIn(
                scope = applicationScope,