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

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

Merge "Fix bouncer transitions when bouncer shown over hub" into main

parents 9ab9bde9 9d45dbec
Loading
Loading
Loading
Loading
+61 −3
Original line number Diff line number Diff line
@@ -34,23 +34,32 @@ package com.android.systemui.keyguard.domain.interactor

import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import androidx.test.ext.junit.runners.AndroidJUnit4
import android.platform.test.flag.junit.FlagsParameterization
import androidx.test.filters.SmallTest
import com.android.systemui.Flags
import com.android.systemui.Flags.FLAG_GLANCEABLE_HUB_V2
import com.android.systemui.SysuiTestCase
import com.android.systemui.bouncer.data.repository.fakeKeyguardBouncerRepository
import com.android.systemui.communal.data.repository.fakeCommunalSceneRepository
import com.android.systemui.communal.domain.interactor.communalInteractor
import com.android.systemui.communal.domain.interactor.communalSceneInteractor
import com.android.systemui.communal.domain.interactor.setCommunalV2ConfigEnabled
import com.android.systemui.communal.shared.model.CommunalScenes
import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepositorySpy
import com.android.systemui.keyguard.data.repository.keyguardTransitionRepository
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.util.KeyguardTransitionRepositorySpySubject.Companion.assertThat
import com.android.systemui.kosmos.collectLastValue
import com.android.systemui.kosmos.runCurrent
import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.testScope
import com.android.systemui.power.data.repository.fakePowerRepository
import com.android.systemui.power.shared.model.WakeSleepReason
import com.android.systemui.power.shared.model.WakefulnessState
import com.android.systemui.testKosmos
import com.google.common.truth.Truth
import kotlinx.coroutines.test.advanceTimeBy
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
@@ -58,10 +67,25 @@ import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mockito.reset
import platform.test.runner.parameterized.ParameterizedAndroidJunit4
import platform.test.runner.parameterized.Parameters

@SmallTest
@RunWith(AndroidJUnit4::class)
class FromAlternateBouncerTransitionInteractorTest : SysuiTestCase() {
@RunWith(ParameterizedAndroidJunit4::class)
class FromAlternateBouncerTransitionInteractorTest(flags: FlagsParameterization) : SysuiTestCase() {

    companion object {
        @JvmStatic
        @Parameters(name = "{0}")
        fun getParams(): List<FlagsParameterization> {
            return FlagsParameterization.allCombinationsOf(FLAG_GLANCEABLE_HUB_V2)
        }
    }

    init {
        mSetFlagsRule.setFlagsParameterization(flags)
    }

    private val kosmos =
        testKosmos().apply {
            this.keyguardTransitionRepository = fakeKeyguardTransitionRepositorySpy
@@ -74,6 +98,7 @@ class FromAlternateBouncerTransitionInteractorTest : SysuiTestCase() {
    fun setup() {
        transitionRepository = kosmos.fakeKeyguardTransitionRepositorySpy
        underTest = kosmos.fromAlternateBouncerTransitionInteractor
        kosmos.setCommunalV2ConfigEnabled(true)
        underTest.start()
    }

@@ -170,6 +195,39 @@ class FromAlternateBouncerTransitionInteractorTest : SysuiTestCase() {
                )
        }

    @Test
    @EnableFlags(FLAG_GLANCEABLE_HUB_V2)
    fun transitionToOccluded_glanceableHubShowing() =
        kosmos.runTest {
            val currentScene by collectLastValue(communalSceneInteractor.currentScene)

            fakePowerRepository.updateWakefulness(
                WakefulnessState.AWAKE,
                WakeSleepReason.POWER_BUTTON,
                WakeSleepReason.POWER_BUTTON,
                false,
            )
            fakeKeyguardRepository.setKeyguardOccluded(false)
            fakeKeyguardBouncerRepository.setAlternateVisible(true)
            fakeCommunalSceneRepository.changeScene(CommunalScenes.Communal)
            runCurrent()

            Truth.assertThat(currentScene).isEqualTo(CommunalScenes.Communal)

            transitionRepository.sendTransitionSteps(
                from = KeyguardState.GLANCEABLE_HUB,
                to = KeyguardState.ALTERNATE_BOUNCER,
                testScope,
            )
            reset(transitionRepository)

            fakeKeyguardRepository.setKeyguardOccluded(true)
            fakeKeyguardBouncerRepository.setAlternateVisible(false)
            testScope.advanceTimeBy(200) // advance past delay

            Truth.assertThat(currentScene).isEqualTo(CommunalScenes.Blank)
        }

    @Test
    @DisableFlags(Flags.FLAG_KEYGUARD_WM_STATE_REFACTOR)
    fun transitionToGone_whenOpeningGlanceableHubEditMode() =
+63 −5
Original line number Diff line number Diff line
@@ -17,13 +17,17 @@
package com.android.systemui.keyguard.domain.interactor

import android.platform.test.annotations.EnableFlags
import androidx.test.ext.junit.runners.AndroidJUnit4
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.Flags.FLAG_KEYGUARD_WM_STATE_REFACTOR
import com.android.systemui.SysuiTestCase
import com.android.systemui.bouncer.data.repository.fakeKeyguardBouncerRepository
import com.android.systemui.communal.data.repository.fakeCommunalSceneRepository
import com.android.systemui.communal.domain.interactor.communalSceneInteractor
import com.android.systemui.communal.domain.interactor.setCommunalV2Available
import com.android.systemui.communal.domain.interactor.setCommunalV2ConfigEnabled
import com.android.systemui.communal.shared.model.CommunalScenes
import com.android.systemui.coroutines.collectValues
import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepositorySpy
@@ -33,30 +37,55 @@ import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionStep
import com.android.systemui.keyguard.util.KeyguardTransitionRepositorySpySubject.Companion.assertThat
import com.android.systemui.kosmos.collectLastValue
import com.android.systemui.kosmos.runCurrent
import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.testScope
import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest
import com.android.systemui.power.domain.interactor.powerInteractor
import com.android.systemui.testKosmos
import com.android.systemui.user.domain.interactor.selectedUserInteractor
import com.google.common.truth.Truth
import junit.framework.Assert.assertEquals
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mockito.reset
import platform.test.runner.parameterized.ParameterizedAndroidJunit4
import platform.test.runner.parameterized.Parameters

@SmallTest
@RunWith(AndroidJUnit4::class)
class FromPrimaryBouncerTransitionInteractorTest : SysuiTestCase() {
@RunWith(ParameterizedAndroidJunit4::class)
class FromPrimaryBouncerTransitionInteractorTest(flags: FlagsParameterization) : SysuiTestCase() {

    companion object {
        @JvmStatic
        @Parameters(name = "{0}")
        fun getParams(): List<FlagsParameterization> {
            return FlagsParameterization.allCombinationsOf(FLAG_GLANCEABLE_HUB_V2)
        }
    }

    init {
        mSetFlagsRule.setFlagsParameterization(flags)
    }

    private val kosmos =
        testKosmos().apply {
            this.keyguardTransitionRepository = fakeKeyguardTransitionRepositorySpy
        }
    val underTest = kosmos.fromPrimaryBouncerTransitionInteractor
    val testScope = kosmos.testScope
    val selectedUserInteractor = kosmos.selectedUserInteractor
    val transitionRepository = kosmos.fakeKeyguardTransitionRepositorySpy
    val bouncerRepository = kosmos.fakeKeyguardBouncerRepository

    @Before
    fun setUp() {
        kosmos.setCommunalV2ConfigEnabled(true)
    }

    @Test
    fun testSurfaceBehindVisibility() =
        testScope.runTest {
@@ -213,4 +242,33 @@ class FromPrimaryBouncerTransitionInteractorTest : SysuiTestCase() {
                    to = KeyguardState.OCCLUDED,
                )
        }

    @Test
    @EnableFlags(FLAG_GLANCEABLE_HUB_V2)
    fun testTransitionToDozing_bouncerShowingOnTopOfGlanceableHub() =
        kosmos.runTest {
            underTest.start()
            setCommunalV2Available(true)

            val currentScene by collectLastValue(communalSceneInteractor.currentScene)
            // Communal is showing.
            fakeCommunalSceneRepository.changeScene(CommunalScenes.Communal)

            Truth.assertThat(currentScene).isEqualTo(CommunalScenes.Communal)

            // Bouncer is shown on top of the Glanceable Hub.
            bouncerRepository.setPrimaryShow(true)
            transitionRepository.sendTransitionSteps(
                from = KeyguardState.GLANCEABLE_HUB,
                to = KeyguardState.PRIMARY_BOUNCER,
                testScope,
            )

            reset(transitionRepository)

            powerInteractor.setAsleepForTest()
            runCurrent()

            Truth.assertThat(currentScene).isEqualTo(CommunalScenes.Blank)
        }
}
+4 −3
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.systemui.keyguard.domain.interactor

import android.app.StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.platform.test.flag.junit.FlagsParameterization
import androidx.test.filters.SmallTest
@@ -30,7 +31,6 @@ import com.android.systemui.Flags.glanceableHubV2
import com.android.systemui.SysuiTestCase
import com.android.systemui.bouncer.data.repository.fakeKeyguardBouncerRepository
import com.android.systemui.communal.domain.interactor.CommunalSceneTransitionInteractor
import com.android.systemui.communal.domain.interactor.communalInteractor
import com.android.systemui.communal.domain.interactor.communalSceneInteractor
import com.android.systemui.communal.domain.interactor.communalSceneTransitionInteractor
import com.android.systemui.communal.domain.interactor.setCommunalAvailable
@@ -126,14 +126,14 @@ class KeyguardTransitionScenariosTest(flags: FlagsParameterization?) : SysuiTest
    }

    private val powerInteractor by lazy { kosmos.powerInteractor }
    private val communalInteractor by lazy { kosmos.communalInteractor }
    private val communalSceneInteractor by lazy { kosmos.communalSceneInteractor }

    companion object {
        @JvmStatic
        @Parameters(name = "{0}")
        fun getParams(): List<FlagsParameterization> {
            return FlagsParameterization.allCombinationsOf().andSceneContainer()
            return FlagsParameterization.allCombinationsOf(FLAG_GLANCEABLE_HUB_V2)
                .andSceneContainer()
        }
    }

@@ -902,6 +902,7 @@ class KeyguardTransitionScenariosTest(flags: FlagsParameterization?) : SysuiTest

    @Test
    @DisableSceneContainer
    @DisableFlags(FLAG_GLANCEABLE_HUB_V2)
    fun primaryBouncerToGlanceableHubWhileDreaming() =
        testScope.runTest {
            // Setup - Move past initial delay with [KeyguardInteractor#isAbleToDream]
+7 −2
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.TransitionInfo
import com.android.systemui.keyguard.shared.model.TransitionModeOnCanceled
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.power.domain.interactor.PowerInteractor
import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.util.kotlin.pairwise
import java.util.UUID
@@ -65,6 +66,7 @@ constructor(
    @Application private val applicationScope: CoroutineScope,
    private val sceneInteractor: CommunalSceneInteractor,
    private val repository: CommunalSceneTransitionRepository,
    private val powerInteractor: PowerInteractor,
    keyguardInteractor: KeyguardInteractor,
) : CoreStartable, CommunalSceneInteractor.OnSceneAboutToChangeListener {

@@ -88,12 +90,15 @@ constructor(
        combine(
                // Don't use delayed dreaming signal as otherwise we might go to occluded or lock
                // screen when closing hub if dream just started under the hub.
                powerInteractor.isAsleep,
                keyguardInteractor.isDreamingWithOverlay,
                keyguardInteractor.isKeyguardOccluded,
                keyguardInteractor.isKeyguardGoingAway,
                keyguardInteractor.isKeyguardShowing,
            ) { dreaming, occluded, keyguardGoingAway, keyguardShowing ->
                if (keyguardGoingAway) {
            ) { asleep, dreaming, occluded, keyguardGoingAway, keyguardShowing ->
                if (asleep) {
                    KeyguardState.DOZING
                } else if (keyguardGoingAway) {
                    KeyguardState.GONE
                } else if (occluded && !dreaming) {
                    KeyguardState.OCCLUDED
+26 −6
Original line number Diff line number Diff line
@@ -17,8 +17,12 @@
package com.android.systemui.keyguard.domain.interactor

import android.animation.ValueAnimator
import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor
import com.android.systemui.communal.domain.interactor.CommunalInteractor
import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor
import com.android.systemui.communal.domain.interactor.CommunalSettingsInteractor
import com.android.systemui.communal.shared.model.CommunalScenes
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
@@ -46,7 +50,6 @@ import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.merge
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.onStart
import com.android.app.tracing.coroutines.launchTraced as launch

@SysUISingleton
class FromAlternateBouncerTransitionInteractor
@@ -60,6 +63,8 @@ constructor(
    @Main mainDispatcher: CoroutineDispatcher,
    keyguardInteractor: KeyguardInteractor,
    private val communalInteractor: CommunalInteractor,
    private val communalSettingsInteractor: CommunalSettingsInteractor,
    private val communalSceneInteractor: CommunalSceneInteractor,
    powerInteractor: PowerInteractor,
    keyguardOcclusionInteractor: KeyguardOcclusionInteractor,
    private val primaryBouncerInteractor: PrimaryBouncerInteractor,
@@ -86,7 +91,7 @@ constructor(
            .transition(
                edge = Edge.create(from = KeyguardState.ALTERNATE_BOUNCER, to = Scenes.Gone),
                edgeWithoutSceneContainer =
                    Edge.create(from = KeyguardState.ALTERNATE_BOUNCER, to = KeyguardState.GONE)
                    Edge.create(from = KeyguardState.ALTERNATE_BOUNCER, to = KeyguardState.GONE),
            )
            .map {
                // The alt bouncer is pretty fast to hide, so start the surface behind animation
@@ -112,7 +117,7 @@ constructor(
                    keyguardInteractor.primaryBouncerShowing,
                    powerInteractor.isAwake,
                    keyguardInteractor.isAodAvailable,
                    communalInteractor.isIdleOnCommunal,
                    communalSceneInteractor.isIdleOnCommunal,
                    communalInteractor.editModeOpen,
                    keyguardInteractor.isKeyguardOccluded,
                )
@@ -133,6 +138,7 @@ constructor(
                    // to GONE prevents the lockscreen flash. Let listenForAlternateBouncerToGone
                    // handle it.
                    if (isCommunalEditMode) return@collect
                    val hubV2 = communalSettingsInteractor.isV2FlagEnabled()
                    val to =
                        if (!isAwake) {
                            if (isAodAvailable) {
@@ -141,19 +147,33 @@ constructor(
                                KeyguardState.DOZING
                            }
                        } else {
                            if (isIdleOnCommunal) {
                            if (!hubV2 && isIdleOnCommunal) {
                                if (SceneContainerFlag.isEnabled) return@collect
                                KeyguardState.GLANCEABLE_HUB
                            } else if (isOccluded) {
                                KeyguardState.OCCLUDED
                            } else if (hubV2 && isIdleOnCommunal) {
                                if (SceneContainerFlag.isEnabled) return@collect
                                KeyguardState.GLANCEABLE_HUB
                            } else {
                                KeyguardState.LOCKSCREEN
                            }
                        }

                    if (hubV2 && to != KeyguardState.GLANCEABLE_HUB && isIdleOnCommunal) {
                        // If bouncer is showing over the hub, we need to make sure we
                        // properly dismiss the hub when transitioning away.
                        communalSceneInteractor.changeScene(
                            newScene = CommunalScenes.Blank,
                            loggingReason = "alternate bouncer no longer showing over GH",
                            keyguardState = to,
                        )
                    } else {
                        startTransitionTo(to)
                    }
                }
        }
    }

    private fun listenForAlternateBouncerToGone() {
        if (SceneContainerFlag.isEnabled) return
@@ -173,7 +193,7 @@ constructor(
                        } else {
                            emptyFlow()
                        }
                    }
                    },
                )
                .filterRelevantKeyguardState()
                .collect { startTransitionTo(KeyguardState.GONE) }
Loading