diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt index 8c6a3cad8b9f1..cc9414cbdf50e 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt @@ -26,6 +26,7 @@ import com.android.systemui.util.Utils import com.android.systemui.util.animation.UniqueObjectHostView import com.android.systemui.util.animation.requiresRemeasuring import com.android.systemui.util.concurrency.DelayableExecutor +import com.android.systemui.util.time.SystemClock import java.util.TreeMap import javax.inject.Inject import javax.inject.Provider @@ -45,6 +46,7 @@ class MediaCarouselController @Inject constructor( private val visualStabilityManager: VisualStabilityManager, private val mediaHostStatesManager: MediaHostStatesManager, private val activityStarter: ActivityStarter, + private val systemClock: SystemClock, @Main executor: DelayableExecutor, private val mediaManager: MediaDataManager, configurationController: ConfigurationController, @@ -358,12 +360,12 @@ class MediaCarouselController @Inject constructor( newPlayer.playerViewHolder?.player?.setLayoutParams(lp) newPlayer.bindPlayer(dataCopy, key) newPlayer.setListening(currentlyExpanded) - MediaPlayerData.addMediaPlayer(key, dataCopy, newPlayer) + MediaPlayerData.addMediaPlayer(key, dataCopy, newPlayer, systemClock) updatePlayerToState(newPlayer, noAnimation = true) reorderAllPlayers(curVisibleMediaKey) } else { existingPlayer.bindPlayer(dataCopy, key) - MediaPlayerData.addMediaPlayer(key, dataCopy, existingPlayer) + MediaPlayerData.addMediaPlayer(key, dataCopy, existingPlayer, systemClock) if (visualStabilityManager.isReorderingAllowed || shouldScrollToActivePlayer) { reorderAllPlayers(curVisibleMediaKey) } else { @@ -407,7 +409,7 @@ class MediaCarouselController @Inject constructor( newRecs.bindRecommendation(data.copy(backgroundColor = bgColor)) val curVisibleMediaKey = MediaPlayerData.playerKeys() .elementAtOrNull(mediaCarouselScrollHandler.visibleMediaIndex) - MediaPlayerData.addMediaRecommendation(key, data, newRecs, shouldPrioritize) + MediaPlayerData.addMediaRecommendation(key, data, newRecs, shouldPrioritize, systemClock) updatePlayerToState(newRecs, noAnimation = true) reorderAllPlayers(curVisibleMediaKey) updatePageIndicator() @@ -775,9 +777,9 @@ internal object MediaPlayerData { private val mediaPlayers = TreeMap(comparator) private val mediaData: MutableMap = mutableMapOf() - fun addMediaPlayer(key: String, data: MediaData, player: MediaControlPanel) { + fun addMediaPlayer(key: String, data: MediaData, player: MediaControlPanel, clock: SystemClock) { removeMediaPlayer(key) - val sortKey = MediaSortKey(isSsMediaRec = false, data, System.currentTimeMillis()) + val sortKey = MediaSortKey(isSsMediaRec = false, data, clock.currentTimeMillis()) mediaData.put(key, sortKey) mediaPlayers.put(sortKey, player) } @@ -786,11 +788,12 @@ internal object MediaPlayerData { key: String, data: SmartspaceMediaData, player: MediaControlPanel, - shouldPrioritize: Boolean + shouldPrioritize: Boolean, + clock: SystemClock ) { shouldPrioritizeSs = shouldPrioritize removeMediaPlayer(key) - val sortKey = MediaSortKey(isSsMediaRec = true, EMPTY, System.currentTimeMillis()) + val sortKey = MediaSortKey(isSsMediaRec = true, EMPTY, clock.currentTimeMillis()) mediaData.put(key, sortKey) mediaPlayers.put(sortKey, player) smartspaceMediaData = data diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaPlayerDataTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaPlayerDataTest.kt index ba4fc0aba81d9..e9e965e923032 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaPlayerDataTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaPlayerDataTest.kt @@ -19,9 +19,9 @@ package com.android.systemui.media import android.testing.AndroidTestingRunner import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase +import com.android.systemui.util.time.FakeSystemClock import com.google.common.truth.Truth.assertThat import org.junit.Before -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -35,6 +35,7 @@ public class MediaPlayerDataTest : SysuiTestCase() { @Mock private lateinit var playerIsPlaying: MediaControlPanel + private var systemClock: FakeSystemClock = FakeSystemClock() @JvmField @Rule @@ -59,8 +60,8 @@ public class MediaPlayerDataTest : SysuiTestCase() { val playerIsRemote = mock(MediaControlPanel::class.java) val dataIsRemote = createMediaData("app2", PLAYING, !LOCAL, !RESUMPTION) - MediaPlayerData.addMediaPlayer("2", dataIsRemote, playerIsRemote) - MediaPlayerData.addMediaPlayer("1", dataIsPlaying, playerIsPlaying) + MediaPlayerData.addMediaPlayer("2", dataIsRemote, playerIsRemote, systemClock) + MediaPlayerData.addMediaPlayer("1", dataIsPlaying, playerIsPlaying, systemClock) val players = MediaPlayerData.players() assertThat(players).hasSize(2) @@ -68,7 +69,6 @@ public class MediaPlayerDataTest : SysuiTestCase() { } @Test - @Ignore("Flaky") fun switchPlayersPlaying() { val playerIsPlaying1 = mock(MediaControlPanel::class.java) var dataIsPlaying1 = createMediaData("app1", PLAYING, LOCAL, !RESUMPTION) @@ -76,14 +76,19 @@ public class MediaPlayerDataTest : SysuiTestCase() { val playerIsPlaying2 = mock(MediaControlPanel::class.java) var dataIsPlaying2 = createMediaData("app2", !PLAYING, LOCAL, !RESUMPTION) - MediaPlayerData.addMediaPlayer("1", dataIsPlaying1, playerIsPlaying1) - MediaPlayerData.addMediaPlayer("2", dataIsPlaying2, playerIsPlaying2) + MediaPlayerData.addMediaPlayer("1", dataIsPlaying1, playerIsPlaying1, systemClock) + systemClock.advanceTime(1) + MediaPlayerData.addMediaPlayer("2", dataIsPlaying2, playerIsPlaying2, systemClock) + systemClock.advanceTime(1) dataIsPlaying1 = createMediaData("app1", !PLAYING, LOCAL, !RESUMPTION) dataIsPlaying2 = createMediaData("app2", PLAYING, LOCAL, !RESUMPTION) - MediaPlayerData.addMediaPlayer("1", dataIsPlaying1, playerIsPlaying1) - MediaPlayerData.addMediaPlayer("2", dataIsPlaying2, playerIsPlaying2) + MediaPlayerData.addMediaPlayer("1", dataIsPlaying1, playerIsPlaying1, systemClock) + systemClock.advanceTime(1) + + MediaPlayerData.addMediaPlayer("2", dataIsPlaying2, playerIsPlaying2, systemClock) + systemClock.advanceTime(1) val players = MediaPlayerData.players() assertThat(players).hasSize(2) @@ -109,12 +114,15 @@ public class MediaPlayerDataTest : SysuiTestCase() { val playerUndetermined = mock(MediaControlPanel::class.java) val dataUndetermined = createMediaData("app6", UNDETERMINED, LOCAL, RESUMPTION) - MediaPlayerData.addMediaPlayer("3", dataIsStoppedAndLocal, playerIsStoppedAndLocal) - MediaPlayerData.addMediaPlayer("5", dataIsStoppedAndRemote, playerIsStoppedAndRemote) - MediaPlayerData.addMediaPlayer("4", dataCanResume, playerCanResume) - MediaPlayerData.addMediaPlayer("1", dataIsPlaying, playerIsPlaying) - MediaPlayerData.addMediaPlayer("2", dataIsPlayingAndRemote, playerIsPlayingAndRemote) - MediaPlayerData.addMediaPlayer("6", dataUndetermined, playerUndetermined) + MediaPlayerData.addMediaPlayer( + "3", dataIsStoppedAndLocal, playerIsStoppedAndLocal, systemClock) + MediaPlayerData.addMediaPlayer( + "5", dataIsStoppedAndRemote, playerIsStoppedAndRemote, systemClock) + MediaPlayerData.addMediaPlayer("4", dataCanResume, playerCanResume, systemClock) + MediaPlayerData.addMediaPlayer("1", dataIsPlaying, playerIsPlaying, systemClock) + MediaPlayerData.addMediaPlayer( + "2", dataIsPlayingAndRemote, playerIsPlayingAndRemote, systemClock) + MediaPlayerData.addMediaPlayer("6", dataUndetermined, playerUndetermined, systemClock) val players = MediaPlayerData.players() assertThat(players).hasSize(6) @@ -130,8 +138,14 @@ public class MediaPlayerDataTest : SysuiTestCase() { val data = createMediaData("app1", PLAYING, LOCAL, !RESUMPTION) - MediaPlayerData.addMediaPlayer(keyA, data, playerIsPlaying) - MediaPlayerData.addMediaPlayer(keyB, data, playerIsPlaying) + assertThat(MediaPlayerData.players()).hasSize(0) + + MediaPlayerData.addMediaPlayer(keyA, data, playerIsPlaying, systemClock) + systemClock.advanceTime(1) + + assertThat(MediaPlayerData.players()).hasSize(1) + MediaPlayerData.addMediaPlayer(keyB, data, playerIsPlaying, systemClock) + systemClock.advanceTime(1) assertThat(MediaPlayerData.players()).hasSize(2)