Loading packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt +17 −14 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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, Loading Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -1321,7 +1337,6 @@ constructor( private fun updateUserVisibility() { val shadeVisible = isLockScreenVisibleToUser() || isLockScreenShadeVisibleToUser() || isHomeScreenShadeVisibleToUser() || isGlanceableHubVisibleToUser() val mediaVisible = qsExpanded || hasActiveMedia Loading @@ -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 { Loading packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManagerTest.kt +73 −10 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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() { Loading Loading @@ -157,6 +160,7 @@ class MediaHierarchyManagerTest : SysuiTestCase() { keyguardViewController, dreamOverlayStateController, kosmos.keyguardInteractor, kosmos.keyguardTransitionInteractor, kosmos.communalTransitionViewModel, configurationController, wakefulnessLifecycle, Loading Loading @@ -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) Loading @@ -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) Loading @@ -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() Loading Loading
packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt +17 −14 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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, Loading Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -1321,7 +1337,6 @@ constructor( private fun updateUserVisibility() { val shadeVisible = isLockScreenVisibleToUser() || isLockScreenShadeVisibleToUser() || isHomeScreenShadeVisibleToUser() || isGlanceableHubVisibleToUser() val mediaVisible = qsExpanded || hasActiveMedia Loading @@ -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 { Loading
packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManagerTest.kt +73 −10 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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() { Loading Loading @@ -157,6 +160,7 @@ class MediaHierarchyManagerTest : SysuiTestCase() { keyguardViewController, dreamOverlayStateController, kosmos.keyguardInteractor, kosmos.keyguardTransitionInteractor, kosmos.communalTransitionViewModel, configurationController, wakefulnessLifecycle, Loading Loading @@ -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) Loading @@ -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) Loading @@ -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() Loading