Loading packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractorTest.kt +61 −3 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -74,6 +98,7 @@ class FromAlternateBouncerTransitionInteractorTest : SysuiTestCase() { fun setup() { transitionRepository = kosmos.fakeKeyguardTransitionRepositorySpy underTest = kosmos.fromAlternateBouncerTransitionInteractor kosmos.setCommunalV2ConfigEnabled(true) underTest.start() } Loading Loading @@ -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() = Loading packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorTest.kt +63 −5 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 { Loading Loading @@ -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) } } packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt +4 −3 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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() } } Loading Loading @@ -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] Loading packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractor.kt +7 −2 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 { Loading @@ -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 Loading packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt +26 −6 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading @@ -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, Loading @@ -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 Loading @@ -112,7 +117,7 @@ constructor( keyguardInteractor.primaryBouncerShowing, powerInteractor.isAwake, keyguardInteractor.isAodAvailable, communalInteractor.isIdleOnCommunal, communalSceneInteractor.isIdleOnCommunal, communalInteractor.editModeOpen, keyguardInteractor.isKeyguardOccluded, ) Loading @@ -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) { Loading @@ -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 Loading @@ -173,7 +193,7 @@ constructor( } else { emptyFlow() } } }, ) .filterRelevantKeyguardState() .collect { startTransitionTo(KeyguardState.GONE) } Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractorTest.kt +61 −3 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -74,6 +98,7 @@ class FromAlternateBouncerTransitionInteractorTest : SysuiTestCase() { fun setup() { transitionRepository = kosmos.fakeKeyguardTransitionRepositorySpy underTest = kosmos.fromAlternateBouncerTransitionInteractor kosmos.setCommunalV2ConfigEnabled(true) underTest.start() } Loading Loading @@ -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() = Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorTest.kt +63 −5 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 { Loading Loading @@ -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) } }
packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt +4 −3 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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() } } Loading Loading @@ -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] Loading
packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractor.kt +7 −2 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 { Loading @@ -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 Loading
packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt +26 −6 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading @@ -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, Loading @@ -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 Loading @@ -112,7 +117,7 @@ constructor( keyguardInteractor.primaryBouncerShowing, powerInteractor.isAwake, keyguardInteractor.isAodAvailable, communalInteractor.isIdleOnCommunal, communalSceneInteractor.isIdleOnCommunal, communalInteractor.editModeOpen, keyguardInteractor.isKeyguardOccluded, ) Loading @@ -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) { Loading @@ -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 Loading @@ -173,7 +193,7 @@ constructor( } else { emptyFlow() } } }, ) .filterRelevantKeyguardState() .collect { startTransitionTo(KeyguardState.GONE) } Loading