summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt24
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/media/MediaCarouselControllerTest.kt71
2 files changed, 92 insertions, 3 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt
index 4c6aa7b4cad9..cc77ed15b5f0 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt
@@ -458,6 +458,7 @@ class MediaCarouselController @Inject constructor(
val existingPlayer = MediaPlayerData.getMediaPlayer(key)
val curVisibleMediaKey = MediaPlayerData.playerKeys()
.elementAtOrNull(mediaCarouselScrollHandler.visibleMediaIndex)
+ val isCurVisibleMediaPlaying = MediaPlayerData.getMediaData(curVisibleMediaKey)?.isPlaying
if (existingPlayer == null) {
val newPlayer = mediaControlPanelFactory.get()
newPlayer.attachPlayer(MediaViewHolder.create(
@@ -472,13 +473,23 @@ class MediaCarouselController @Inject constructor(
key, data, newPlayer, systemClock, isSsReactivated, debugLogger
)
updatePlayerToState(newPlayer, noAnimation = true)
- reorderAllPlayers(curVisibleMediaKey)
+ if (data.active) {
+ reorderAllPlayers(curVisibleMediaKey)
+ } else {
+ needsReordering = true
+ }
} else {
existingPlayer.bindPlayer(data, key)
MediaPlayerData.addMediaPlayer(
key, data, existingPlayer, systemClock, isSsReactivated, debugLogger
)
- if (isReorderingAllowed || shouldScrollToActivePlayer) {
+ // Check the playing status of both current visible and new media players
+ // To make sure we scroll to the active playing media card.
+ if (isReorderingAllowed ||
+ shouldScrollToActivePlayer &&
+ data.isPlaying == true &&
+ isCurVisibleMediaPlaying == false
+ ) {
reorderAllPlayers(curVisibleMediaKey)
} else {
needsReordering = true
@@ -1035,6 +1046,15 @@ internal object MediaPlayerData {
}
}
+ fun getMediaData(mediaSortKey: MediaSortKey?): MediaData? {
+ mediaData.forEach { (key, value) ->
+ if (value == mediaSortKey) {
+ return mediaData[key]?.data
+ }
+ }
+ return null
+ }
+
fun getMediaPlayer(key: String): MediaControlPanel? {
return mediaData.get(key)?.let { mediaPlayers.get(it) }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaCarouselControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaCarouselControllerTest.kt
index 1bc197232da6..5a50a9f64487 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaCarouselControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaCarouselControllerTest.kt
@@ -30,6 +30,7 @@ import com.android.systemui.statusbar.notification.collection.provider.VisualSta
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.util.animation.TransitionLayout
import com.android.systemui.util.concurrency.DelayableExecutor
+import com.android.systemui.util.mockito.capture
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.time.FakeSystemClock
import javax.inject.Provider
@@ -38,6 +39,8 @@ import junit.framework.Assert.assertTrue
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
+import org.mockito.ArgumentCaptor
+import org.mockito.Captor
import org.mockito.Mock
import org.mockito.Mockito.verify
import org.mockito.Mockito.verifyNoMoreInteractions
@@ -71,6 +74,10 @@ class MediaCarouselControllerTest : SysuiTestCase() {
@Mock lateinit var player: TransitionLayout
@Mock lateinit var recommendationViewHolder: RecommendationViewHolder
@Mock lateinit var recommendations: TransitionLayout
+ @Mock lateinit var mediaPlayer: MediaControlPanel
+ @Mock lateinit var mediaViewController: MediaViewController
+ @Mock lateinit var smartspaceMediaData: SmartspaceMediaData
+ @Captor lateinit var listener: ArgumentCaptor<MediaDataManager.Listener>
private val clock = FakeSystemClock()
private lateinit var mediaCarouselController: MediaCarouselController
@@ -94,7 +101,10 @@ class MediaCarouselControllerTest : SysuiTestCase() {
logger,
debugLogger
)
-
+ verify(mediaDataManager).addListener(capture(listener))
+ whenever(mediaControlPanelFactory.get()).thenReturn(mediaPlayer)
+ whenever(mediaPlayer.mediaViewController).thenReturn(mediaViewController)
+ whenever(mediaDataManager.smartspaceMediaData).thenReturn(smartspaceMediaData)
MediaPlayerData.clear()
}
@@ -305,4 +315,63 @@ class MediaCarouselControllerTest : SysuiTestCase() {
verifyNoMoreInteractions(mediaViewHolder)
verify(recommendationViewHolder.recommendations).bottom = 75
}
+
+ fun testMediaLoaded_ScrollToActivePlayer() {
+ 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))
+ // adding a media recommendation card.
+ MediaPlayerData.addMediaRecommendation(SMARTSPACE_KEY, EMPTY_SMARTSPACE_MEDIA_DATA, panel,
+ false, clock)
+ mediaCarouselController.shouldScrollToActivePlayer = true
+ // switching between media players.
+ listener.value.onMediaDataLoaded("playing local",
+ "playing local",
+ DATA.copy(active = true, isPlaying = false,
+ playbackLocation = MediaData.PLAYBACK_LOCAL, resumption = true)
+ )
+ listener.value.onMediaDataLoaded("paused local",
+ "paused local",
+ DATA.copy(active = true, isPlaying = true,
+ playbackLocation = MediaData.PLAYBACK_LOCAL, resumption = false))
+
+ assertEquals(
+ MediaPlayerData.getMediaPlayerIndex("paused local"),
+ mediaCarouselController.mediaCarouselScrollHandler.visibleMediaIndex
+ )
+ }
+
+ @Test
+ fun testMediaLoadedFromRecommendationCard_ScrollToActivePlayer() {
+ MediaPlayerData.addMediaRecommendation(SMARTSPACE_KEY, EMPTY_SMARTSPACE_MEDIA_DATA, panel,
+ false, clock)
+ listener.value.onMediaDataLoaded("playing local",
+ null,
+ DATA.copy(active = true, isPlaying = true,
+ playbackLocation = MediaData.PLAYBACK_LOCAL, resumption = false)
+ )
+
+ var playerIndex = MediaPlayerData.getMediaPlayerIndex("playing local")
+ assertEquals(
+ playerIndex,
+ mediaCarouselController.mediaCarouselScrollHandler.visibleMediaIndex
+ )
+ assertEquals( playerIndex, 0)
+
+ // Replaying the same media player one more time.
+ // And check that the card stays in its position.
+ listener.value.onMediaDataLoaded("playing local",
+ null,
+ DATA.copy(active = true, isPlaying = true,
+ playbackLocation = MediaData.PLAYBACK_LOCAL, resumption = false)
+ )
+ playerIndex = MediaPlayerData.getMediaPlayerIndex("playing local")
+ assertEquals(playerIndex, 0)
+ }
}