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

Commit 6cfa509b authored by Michael Mikhail's avatar Michael Mikhail
Browse files

Fix UMO flicks on lockscreen when disabled.

Flag: EXEMPT BUGFIX
Bug: 358595946
Test: atest MediaCarouselControllerTest
Change-Id: I7618fff4f356936f09ad9a18518a292eb1883044
parent 22e4ca1d
Loading
Loading
Loading
Loading
+23 −2
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor
import com.android.systemui.dump.DumpManager
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
import com.android.systemui.keyguard.shared.model.Edge
import com.android.systemui.keyguard.shared.model.KeyguardState.DOZING
import com.android.systemui.keyguard.shared.model.KeyguardState.GONE
import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN
import com.android.systemui.keyguard.shared.model.TransitionState
@@ -332,6 +333,11 @@ constructor(
            .isFinishedIn(Scenes.Gone, GONE)
            .stateIn(applicationScope, SharingStarted.Eagerly, true)

    private val isGoingToDozing =
        keyguardTransitionInteractor
            .isInTransition(Edge.create(to = DOZING))
            .stateIn(applicationScope, SharingStarted.Eagerly, true)

    init {
        dumpManager.registerNormalDumpable(TAG, this)
        mediaFrame = inflateMediaCarousel()
@@ -394,6 +400,7 @@ constructor(
            repeatOnLifecycle(Lifecycle.State.STARTED) {
                listenForAnyStateToGoneKeyguardTransition(this)
                listenForAnyStateToLockscreenTransition(this)
                listenForAnyStateToDozingTransition(this)

                if (!SceneContainerFlag.isEnabled) return@repeatOnLifecycle
                listenForMediaItemsChanges(this)
@@ -563,6 +570,20 @@ constructor(
        }
    }

    @VisibleForTesting
    internal fun listenForAnyStateToDozingTransition(scope: CoroutineScope): Job {
        return scope.launch {
            keyguardTransitionInteractor
                .transition(Edge.create(to = DOZING))
                .filter { it.transitionState == TransitionState.FINISHED }
                .collect {
                    if (!allowMediaPlayerOnLockScreen) {
                        updateHostVisibility()
                    }
                }
        }
    }

    private fun listenForMediaItemsChanges(scope: CoroutineScope): Job {
        return scope.launch {
            mediaCarouselViewModel.mediaItems.collectLatest {
@@ -697,13 +718,13 @@ constructor(
        updatePlayers(recreateMedia = true)
    }

    /** Return true if the carousel should be hidden because lockscreen is currently visible */
    /** Return true if the carousel should be hidden because device is locked. */
    fun isLockedAndHidden(): Boolean {
        val isOnLockscreen =
            if (SceneContainerFlag.isEnabled) {
                !deviceEntryInteractor.isDeviceEntered.value
            } else {
                !isOnGone.value
                !isOnGone.value || isGoingToDozing.value
            }
        return !allowMediaPlayerOnLockScreen && isOnLockscreen
    }
+28 −0
Original line number Diff line number Diff line
@@ -792,6 +792,34 @@ class MediaCarouselControllerTest(flags: FlagsParameterization) : SysuiTestCase(
        }
    }

    @Test
    fun goingToDozing_notAllowedOnLockscreen_updateVisibility() {
        kosmos.testScope.runTest {
            var updatedVisibility = false
            mediaCarouselController.updateHostVisibility = { updatedVisibility = true }
            mediaCarouselController.mediaCarousel = mediaCarousel

            val settingsJob =
                mediaCarouselController.listenForLockscreenSettingChanges(
                    kosmos.applicationCoroutineScope
                )
            secureSettings.putBool(Settings.Secure.MEDIA_CONTROLS_LOCK_SCREEN, false)

            val keyguardJob = mediaCarouselController.listenForAnyStateToDozingTransition(this)
            transitionRepository.sendTransitionSteps(
                from = KeyguardState.GONE,
                to = KeyguardState.DOZING,
                this,
            )

            assertEquals(true, updatedVisibility)
            assertEquals(true, mediaCarouselController.isLockedAndHidden())

            settingsJob.cancel()
            keyguardJob.cancel()
        }
    }

    @EnableSceneContainer
    @Test
    fun deviceEntered_mediaAllowed_notLockedAndHidden() {