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

Commit a86c6f13 authored by Matt Pietal's avatar Matt Pietal
Browse files

Update lockscreen logic for media

Previously, media was using a combination of legacy state flags to
determine when lockscreen was visible. Keyguard transitions
replaces all this, and vastly simplifies the calculation.

Fixes: 408885411
Test: atest MediaHierarchyManagerTest
Flag: EXEMPT bugfix
Change-Id: I32a3d623dfd58fef3a386d9bccd0e5235e0729d9
parent aa1575fb
Loading
Loading
Loading
Loading
+17 −14
Original line number Diff line number Diff line
@@ -46,6 +46,8 @@ import com.android.systemui.dreams.DreamOverlayStateController
import com.android.systemui.dump.DumpManager
import com.android.systemui.keyguard.WakefulnessLifecycle
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.media.controls.domain.pipeline.MediaDataManager
import com.android.systemui.media.controls.ui.view.MediaHost
import com.android.systemui.media.dream.MediaDreamComplication
@@ -113,6 +115,7 @@ constructor(
    private val keyguardViewController: KeyguardViewController,
    private val dreamOverlayStateController: DreamOverlayStateController,
    private val keyguardInteractor: KeyguardInteractor,
    private val keyguardTransitionInteractor: KeyguardTransitionInteractor,
    communalTransitionViewModel: CommunalTransitionViewModel,
    @ShadeDisplayAware configurationController: ConfigurationController,
    wakefulnessLifecycle: WakefulnessLifecycle,
@@ -450,6 +453,9 @@ constructor(
    /** Is either shade or QS fully expanded */
    private var isAnyShadeFullyExpanded: Boolean = false

    /** Is lockscreen visible */
    private var isOnLockscreen: Boolean = false

    /** Is the communal UI showing and not dreaming */
    private var onCommunalNotDreaming: Boolean = false

@@ -600,6 +606,16 @@ constructor(
            }
        }

        coroutineScope.launch {
            keyguardTransitionInteractor.currentKeyguardState.collect {
                val currentState = it == KeyguardState.LOCKSCREEN
                if (isOnLockscreen != currentState) {
                    isOnLockscreen = currentState
                    updateUserVisibility()
                }
            }
        }

        coroutineScope.launch {
            keyguardInteractor.primaryBouncerShowing.collect {
                isPrimaryBouncerShowing = it
@@ -1321,7 +1337,6 @@ constructor(
    private fun updateUserVisibility() {
        val shadeVisible =
            isLockScreenVisibleToUser() ||
                isLockScreenShadeVisibleToUser() ||
                isHomeScreenShadeVisibleToUser() ||
                isGlanceableHubVisibleToUser()
        val mediaVisible = qsExpanded || hasActiveMedia
@@ -1334,19 +1349,7 @@ constructor(
    }

    private fun isLockScreenVisibleToUser(): Boolean {
        return !statusBarStateController.isDozing &&
            !keyguardViewController.isBouncerShowing &&
            statusBarStateController.state == StatusBarState.KEYGUARD &&
            allowMediaPlayerOnLockScreen &&
            statusBarStateController.isExpanded &&
            !qsExpanded
    }

    private fun isLockScreenShadeVisibleToUser(): Boolean {
        return !statusBarStateController.isDozing &&
            !keyguardViewController.isBouncerShowing &&
            (statusBarStateController.state == StatusBarState.SHADE_LOCKED ||
                (statusBarStateController.state == StatusBarState.KEYGUARD && qsExpanded))
        return isOnLockscreen && allowMediaPlayerOnLockScreen
    }

    private fun isHomeScreenShadeVisibleToUser(): Boolean {
+73 −10
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ import com.android.systemui.keyguard.WakefulnessLifecycle
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.kosmos.testScope
import com.android.systemui.media.controls.domain.pipeline.MediaDataManager
@@ -47,6 +48,7 @@ import com.android.systemui.media.controls.ui.view.MediaHostState
import com.android.systemui.media.dream.MediaDreamComplication
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.res.R
import com.android.systemui.shade.data.repository.fakeShadeRepository
import com.android.systemui.shade.domain.interactor.ShadeInteractor
import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.SysuiStatusBarStateController
@@ -130,6 +132,7 @@ class MediaHierarchyManagerTest : SysuiTestCase() {
    private lateinit var fakeHandler: FakeHandler
    private val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
    private val keyguardRepository = kosmos.fakeKeyguardRepository
    private val shadeRepository = kosmos.fakeShadeRepository

    @Before
    fun setup() {
@@ -157,6 +160,7 @@ class MediaHierarchyManagerTest : SysuiTestCase() {
                keyguardViewController,
                dreamOverlayStateController,
                kosmos.keyguardInteractor,
                kosmos.keyguardTransitionInteractor,
                kosmos.communalTransitionViewModel,
                configurationController,
                wakefulnessLifecycle,
@@ -800,8 +804,15 @@ class MediaHierarchyManagerTest : SysuiTestCase() {
    }

    @Test
    fun testStatusBarOnStateChanged_carouselVisibleToUser() {
    fun testStatusBarOnStateChanged_carouselVisibleToUser() =
        testScope.runTest {
            keyguardTransitionRepository.sendTransitionSteps(
                from = KeyguardState.AOD,
                to = KeyguardState.LOCKSCREEN,
                testScope = testScope,
            )
            goToLockedShade()
            clearInvocations(mediaCarouselController)

            statusBarCallback.value.onStateChanged(StatusBarState.SHADE_LOCKED)

@@ -809,8 +820,15 @@ class MediaHierarchyManagerTest : SysuiTestCase() {
        }

    @Test
    fun testStatusBarOnDozingChanged_carouselVisibleToUser() {
        goToLockscreen()
    fun testStatusBarOnDozingChanged_carouselVisibleToUser() =
        testScope.runTest {
            keyguardTransitionRepository.sendTransitionSteps(
                from = KeyguardState.AOD,
                to = KeyguardState.LOCKSCREEN,
                testScope = testScope,
            )
            goToLockedShade()
            clearInvocations(mediaCarouselController)

            statusBarCallback.value.onDozingChanged(false)

@@ -832,6 +850,51 @@ class MediaHierarchyManagerTest : SysuiTestCase() {
        whenever(statusBarStateController.isExpanded).thenReturn(true)
    }

    @Test
    fun testLockscreenVisibleShowsCarousel() =
        testScope.runTest {
            val captor = ArgumentCaptor.forClass(Boolean::class.java)
            whenever(mediaDataManager.hasActiveMedia()).thenReturn(true)
            keyguardTransitionRepository.sendTransitionSteps(
                from = KeyguardState.AOD,
                to = KeyguardState.LOCKSCREEN,
                testScope = testScope,
            )

            verify(mediaCarouselScrollHandler, atLeastOnce()).visibleToUser = captor.capture()
            assertThat(captor.lastValue).isTrue()
        }

    @Test
    fun testAodVisibleDoesNotShowCarousel() =
        testScope.runTest {
            val captor = ArgumentCaptor.forClass(Boolean::class.java)
            whenever(mediaDataManager.hasActiveMedia()).thenReturn(true)
            keyguardTransitionRepository.sendTransitionSteps(
                from = KeyguardState.LOCKSCREEN,
                to = KeyguardState.AOD,
                testScope = testScope,
            )
            verify(mediaCarouselScrollHandler, atLeastOnce()).visibleToUser = captor.capture()
            assertThat(captor.lastValue).isFalse()
        }

    @Test
    fun testLockscreenVisibleWithShadeShowsCarousel() =
        testScope.runTest {
            val captor = ArgumentCaptor.forClass(Boolean::class.java)
            whenever(mediaDataManager.hasActiveMedia()).thenReturn(true)
            keyguardTransitionRepository.sendTransitionSteps(
                from = KeyguardState.AOD,
                to = KeyguardState.LOCKSCREEN,
                testScope = testScope,
            )
            shadeRepository.setQsExpansion(1f)
            runCurrent()
            verify(mediaCarouselScrollHandler, atLeastOnce()).visibleToUser = captor.capture()
            assertThat(captor.lastValue).isTrue()
        }

    private fun enableSplitShade() {
        context
            .getOrCreateTestableResources()