Merge "Reorder media player cards" into tm-qpr-dev

This commit is contained in:
Michael Mikhail
2022-09-13 16:44:04 +00:00
committed by Android (Google) Code Review
2 changed files with 92 additions and 3 deletions

View File

@@ -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) }
}

View File

@@ -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)
}
}