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

Commit 4b439508 authored by Andreas Miko's avatar Andreas Miko
Browse files

Fix wildcard scene edges

When scene container is flipped wildcard edges with UNDEFINED are not
allowed because KTF will not track all edges in or out of e.g.
Scenes.Gone but rather only the edges between Lockscreen and Gone.

This CL fixes some occurrences but not yet all.

Test: None
Bug: b/330311871
Flag: com.android.systemui.scene_container
Change-Id: Ia09d95fdf15768b24d5e6c2103697574b9458d47
parent 7175951f
Loading
Loading
Loading
Loading
+14 −3
Original line number Diff line number Diff line
@@ -33,12 +33,16 @@ import com.android.systemui.keyguard.shared.model.Edge
import com.android.systemui.keyguard.shared.model.KeyguardState.GONE
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.power.domain.interactor.PowerInteractor
import com.android.systemui.scene.domain.interactor.SceneInteractor
import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.utils.GlobalWindowManager
import javax.inject.Inject
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch

@@ -60,6 +64,7 @@ constructor(
    @Application private val applicationScope: CoroutineScope,
    @Background private val bgDispatcher: CoroutineDispatcher,
    private val featureFlags: FeatureFlags,
    private val sceneInteractor: SceneInteractor,
) : CoreStartable, WakefulnessLifecycle.Observer {

    override fun start() {
@@ -85,13 +90,19 @@ constructor(

        applicationScope.launch(bgDispatcher) {
            // We drop 1 to avoid triggering on initial collect().
            keyguardTransitionInteractor.transition(Edge.create(to = GONE)).collect { transition ->
                if (transition.transitionState == TransitionState.FINISHED) {
            if (SceneContainerFlag.isEnabled) {
                sceneInteractor.transitionState
                    .filter { it.isIdle(Scenes.Gone) }
                    .collect { onKeyguardGone() }
            } else {
                keyguardTransitionInteractor.transition(Edge.create(to = GONE)).collect {
                    if (it.transitionState == TransitionState.FINISHED) {
                        onKeyguardGone()
                    }
                }
            }
        }
    }

    @WorkerThread
    private fun onKeyguardGone() {
+10 −1
Original line number Diff line number Diff line
@@ -25,6 +25,9 @@ import com.android.systemui.keyguard.shared.model.KeyguardDone
import com.android.systemui.keyguard.shared.model.KeyguardState.ALTERNATE_BOUNCER
import com.android.systemui.keyguard.shared.model.KeyguardState.GONE
import com.android.systemui.keyguard.shared.model.KeyguardState.PRIMARY_BOUNCER
import com.android.systemui.scene.domain.interactor.SceneInteractor
import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.util.kotlin.sample
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
@@ -48,6 +51,7 @@ constructor(
    transitionInteractor: KeyguardTransitionInteractor,
    val dismissInteractor: KeyguardDismissInteractor,
    @Application private val applicationScope: CoroutineScope,
    sceneInteractor: SceneInteractor,
) {
    val dismissAction: Flow<DismissAction> = repository.dismissAction

@@ -72,7 +76,12 @@ constructor(
            )

    private val finishedTransitionToGone: Flow<Unit> =
        transitionInteractor.finishedKeyguardState.filter { it == GONE }.map {} // map to Unit
        if (SceneContainerFlag.isEnabled) {
            sceneInteractor.transitionState.filter { it.isIdle(Scenes.Gone) }.map {}
        } else {
            transitionInteractor.finishedKeyguardState.filter { it == GONE }.map {}
        }

    val executeDismissAction: Flow<() -> KeyguardDone> =
        merge(
                finishedTransitionToGone,
+11 −3
Original line number Diff line number Diff line
@@ -74,6 +74,9 @@ import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.qs.PageIndicator
import com.android.systemui.res.R
import com.android.systemui.scene.domain.interactor.SceneInteractor
import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.shared.system.SysUiStatsLog
import com.android.systemui.shared.system.SysUiStatsLog.SMARTSPACE_CARD_REPORTED
import com.android.systemui.shared.system.SysUiStatsLog.SMART_SPACE_CARD_REPORTED__CARD_TYPE__UNKNOWN_CARD
@@ -143,6 +146,7 @@ constructor(
    private val secureSettings: SecureSettings,
    private val mediaCarouselViewModel: MediaCarouselViewModel,
    private val mediaViewControllerFactory: Provider<MediaViewController>,
    private val sceneInteractor: SceneInteractor,
) : Dumpable {
    /** The current width of the carousel */
    var currentCarouselWidth: Int = 0
@@ -641,9 +645,13 @@ constructor(
    @VisibleForTesting
    internal fun listenForAnyStateToGoneKeyguardTransition(scope: CoroutineScope): Job {
        return scope.launch {
            keyguardTransitionInteractor
                .transition(Edge.create(to = GONE))
                .filter { it.transitionState == TransitionState.FINISHED }
            if (SceneContainerFlag.isEnabled) {
                    sceneInteractor.transitionState.filter { it.isIdle(Scenes.Gone) }
                } else {
                    keyguardTransitionInteractor.transition(Edge.create(to = GONE)).filter {
                        it.transitionState == TransitionState.FINISHED
                    }
                }
                .collect {
                    showMediaCarousel()
                    updateHostVisibility()
+41 −6
Original line number Diff line number Diff line
@@ -8,6 +8,8 @@ import android.platform.test.flag.junit.SetFlagsRule
import android.testing.AndroidTestingRunner
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.flags.DisableSceneContainer
import com.android.systemui.flags.EnableSceneContainer
import com.android.systemui.flags.Flags
import com.android.systemui.flags.fakeFeatureFlagsClassic
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
@@ -19,7 +21,10 @@ import com.android.systemui.kosmos.testDispatcher
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.scene.data.repository.Idle
import com.android.systemui.scene.data.repository.setSceneTransition
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.testKosmos
import com.android.systemui.util.mockito.any
import com.android.systemui.utils.GlobalWindowManager
@@ -70,12 +75,13 @@ class ResourceTrimmerTest : SysuiTestCase() {
        resourceTrimmer =
            ResourceTrimmer(
                keyguardInteractor,
                powerInteractor,
                kosmos.keyguardTransitionInteractor,
                globalWindowManager,
                testScope.backgroundScope,
                kosmos.testDispatcher,
                featureFlags,
                powerInteractor = powerInteractor,
                keyguardTransitionInteractor = kosmos.keyguardTransitionInteractor,
                globalWindowManager = globalWindowManager,
                applicationScope = testScope.backgroundScope,
                bgDispatcher = kosmos.testDispatcher,
                featureFlags = featureFlags,
                sceneInteractor = kosmos.sceneInteractor,
            )
        resourceTrimmer.start()
    }
@@ -204,6 +210,7 @@ class ResourceTrimmerTest : SysuiTestCase() {

    @Test
    @EnableFlags(com.android.systemui.Flags.FLAG_TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK)
    @DisableSceneContainer
    fun keyguardTransitionsToGone_trimsFontCache() =
        testScope.runTest {
            keyguardTransitionRepository.sendTransitionSteps(
@@ -219,6 +226,20 @@ class ResourceTrimmerTest : SysuiTestCase() {

    @Test
    @EnableFlags(com.android.systemui.Flags.FLAG_TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK)
    @EnableSceneContainer
    fun keyguardTransitionsToGone_trimsFontCache_scene_container() =
        testScope.runTest {
            kosmos.setSceneTransition(Idle(Scenes.Gone))

            verify(globalWindowManager, times(1))
                .trimMemory(ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN)
            verify(globalWindowManager, times(1)).trimCaches(HardwareRenderer.CACHE_TRIM_FONT)
            verifyNoMoreInteractions(globalWindowManager)
        }

    @Test
    @EnableFlags(com.android.systemui.Flags.FLAG_TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK)
    @DisableSceneContainer
    fun keyguardTransitionsToGone_flagDisabled_doesNotTrimFontCache() =
        testScope.runTest {
            featureFlags.set(Flags.TRIM_FONT_CACHES_AT_UNLOCK, false)
@@ -232,4 +253,18 @@ class ResourceTrimmerTest : SysuiTestCase() {
                .trimMemory(ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN)
            verify(globalWindowManager, times(0)).trimCaches(any())
        }

    @Test
    @EnableFlags(com.android.systemui.Flags.FLAG_TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK)
    @EnableSceneContainer
    fun keyguardTransitionsToGone_flagDisabled_doesNotTrimFontCache_scene_container() =
        testScope.runTest {
            featureFlags.set(Flags.TRIM_FONT_CACHES_AT_UNLOCK, false)
            kosmos.setSceneTransition(Idle(Scenes.Gone))

            // Memory hidden should still be called.
            verify(globalWindowManager, times(1))
                .trimMemory(ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN)
            verify(globalWindowManager, times(0)).trimCaches(any())
        }
}
+35 −4
Original line number Diff line number Diff line
@@ -21,12 +21,18 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.flags.DisableSceneContainer
import com.android.systemui.flags.EnableSceneContainer
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.shared.model.DismissAction
import com.android.systemui.keyguard.shared.model.KeyguardDone
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.kosmos.testScope
import com.android.systemui.scene.data.repository.Idle
import com.android.systemui.scene.data.repository.setSceneTransition
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -65,10 +71,11 @@ class KeyguardDismissActionInteractorTest : SysuiTestCase() {

        underTest =
            KeyguardDismissActionInteractor(
                keyguardRepository,
                kosmos.keyguardTransitionInteractor,
                dismissInteractorWithDependencies.interactor,
                testScope.backgroundScope,
                repository = keyguardRepository,
                transitionInteractor = kosmos.keyguardTransitionInteractor,
                dismissInteractor = dismissInteractorWithDependencies.interactor,
                applicationScope = testScope.backgroundScope,
                sceneInteractor = kosmos.sceneInteractor,
            )
    }

@@ -153,6 +160,7 @@ class KeyguardDismissActionInteractorTest : SysuiTestCase() {
        }

    @Test
    @DisableSceneContainer
    fun executeDismissAction_dismissKeyguardRequestWithoutImmediateDismissAction() =
        testScope.runTest {
            val executeDismissAction by collectLastValue(underTest.executeDismissAction)
@@ -178,6 +186,29 @@ class KeyguardDismissActionInteractorTest : SysuiTestCase() {
            assertThat(executeDismissAction).isNotNull()
        }

    @Test
    @EnableSceneContainer
    fun executeDismissAction_dismissKeyguardRequestWithoutImmediateDismissAction_scene_container() =
        testScope.runTest {
            val executeDismissAction by collectLastValue(underTest.executeDismissAction)

            // WHEN a keyguard action will run after the keyguard is gone
            val onDismissAction = {}
            keyguardRepository.setDismissAction(
                DismissAction.RunAfterKeyguardGone(
                    dismissAction = onDismissAction,
                    onCancelAction = {},
                    message = "message",
                    willAnimateOnLockscreen = true,
                )
            )
            assertThat(executeDismissAction).isNull()

            kosmos.setSceneTransition(Idle(Scenes.Gone))

            assertThat(executeDismissAction).isNotNull()
        }

    @Test
    fun resetDismissAction() =
        testScope.runTest {
Loading