Loading packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt +23 −2 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -330,6 +331,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() Loading Loading @@ -392,6 +398,7 @@ constructor( repeatOnLifecycle(Lifecycle.State.STARTED) { listenForAnyStateToGoneKeyguardTransition(this) listenForAnyStateToLockscreenTransition(this) listenForAnyStateToDozingTransition(this) if (!SceneContainerFlag.isEnabled) return@repeatOnLifecycle listenForMediaItemsChanges(this) Loading Loading @@ -561,6 +568,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 { Loading Loading @@ -695,13 +716,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 } Loading packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/controller/MediaCarouselControllerTest.kt +28 −0 Original line number Diff line number Diff line Loading @@ -711,6 +711,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() { Loading Loading
packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt +23 −2 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -330,6 +331,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() Loading Loading @@ -392,6 +398,7 @@ constructor( repeatOnLifecycle(Lifecycle.State.STARTED) { listenForAnyStateToGoneKeyguardTransition(this) listenForAnyStateToLockscreenTransition(this) listenForAnyStateToDozingTransition(this) if (!SceneContainerFlag.isEnabled) return@repeatOnLifecycle listenForMediaItemsChanges(this) Loading Loading @@ -561,6 +568,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 { Loading Loading @@ -695,13 +716,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 } Loading
packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/controller/MediaCarouselControllerTest.kt +28 −0 Original line number Diff line number Diff line Loading @@ -711,6 +711,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() { Loading