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

Commit 6129796b authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Update lockscreen logic for media" into main

parents e77842b0 a86c6f13
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()