diff options
2 files changed, 54 insertions, 1 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselController.kt index 1fdbc99333cb..d5558b27ef1a 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselController.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselController.kt @@ -184,6 +184,7 @@ constructor( private val configListener = object : ConfigurationController.ConfigurationListener { + var lastOrientation = -1 override fun onDensityOrFontScaleChanged() { // System font changes should only happen when UMO is offscreen or a flicker may @@ -200,7 +201,13 @@ constructor( override fun onConfigChanged(newConfig: Configuration?) { if (newConfig == null) return isRtl = newConfig.layoutDirection == View.LAYOUT_DIRECTION_RTL - updatePlayers(recreateMedia = true) + val newOrientation = newConfig.orientation + if (lastOrientation != newOrientation) { + // The players actually depend on the orientation possibly, so we have to + // recreate them (at least on large screen devices) + lastOrientation = newOrientation + updatePlayers(recreateMedia = true) + } } override fun onUiModeChanged() { @@ -717,6 +724,9 @@ constructor( private fun updatePlayers(recreateMedia: Boolean) { pageIndicator.tintList = ColorStateList.valueOf(context.getColor(R.color.media_paging_indicator)) + val previousVisibleKey = + MediaPlayerData.visiblePlayerKeys() + .elementAtOrNull(mediaCarouselScrollHandler.visibleMediaIndex) MediaPlayerData.mediaData().forEach { (key, data, isSsMediaRec) -> if (isSsMediaRec) { @@ -741,6 +751,9 @@ constructor( isSsReactivated = isSsReactivated ) } + if (recreateMedia) { + reorderAllPlayers(previousVisibleKey) + } } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaCarouselControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaCarouselControllerTest.kt index 6ca34e0bb7ce..039dd4d92eb4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaCarouselControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaCarouselControllerTest.kt @@ -17,6 +17,7 @@ package com.android.systemui.media.controls.ui import android.app.PendingIntent +import android.content.res.Configuration import android.testing.AndroidTestingRunner import android.testing.TestableLooper import androidx.test.filters.SmallTest @@ -86,6 +87,9 @@ class MediaCarouselControllerTest : SysuiTestCase() { @Mock lateinit var mediaViewController: MediaViewController @Mock lateinit var smartspaceMediaData: SmartspaceMediaData @Captor lateinit var listener: ArgumentCaptor<MediaDataManager.Listener> + @Captor + lateinit var configListener: ArgumentCaptor<ConfigurationController.ConfigurationListener> + @Captor lateinit var newConfig: ArgumentCaptor<Configuration> @Captor lateinit var visualStabilityCallback: ArgumentCaptor<OnReorderingAllowedListener> private val clock = FakeSystemClock() @@ -111,6 +115,7 @@ class MediaCarouselControllerTest : SysuiTestCase() { logger, debugLogger ) + verify(configurationController).addCallback(capture(configListener)) verify(mediaDataManager).addListener(capture(listener)) verify(visualStabilityProvider) .addPersistentReorderingAllowedListener(capture(visualStabilityCallback)) @@ -662,4 +667,39 @@ class MediaCarouselControllerTest : SysuiTestCase() { mediaCarouselController.updatePageIndicatorAlpha() assertEquals(mediaCarouselController.pageIndicator.alpha, 1.0F, delta) } + + @Ignore("b/253229241") + @Test + fun testOnConfigChanged_playersAreAddedBack() { + listener.value.onMediaDataLoaded( + "playing local", + null, + DATA.copy( + active = true, + isPlaying = true, + playbackLocation = MediaData.PLAYBACK_LOCAL, + resumption = false + ) + ) + listener.value.onMediaDataLoaded( + "paused local", + null, + DATA.copy( + active = true, + isPlaying = false, + playbackLocation = MediaData.PLAYBACK_LOCAL, + resumption = false + ) + ) + + val playersSize = MediaPlayerData.players().size + + configListener.value.onConfigChanged(capture(newConfig)) + + assertEquals(playersSize, MediaPlayerData.players().size) + assertEquals( + MediaPlayerData.getMediaPlayerIndex("playing local"), + mediaCarouselController.mediaCarouselScrollHandler.visibleMediaIndex + ) + } } |