Use more targeted listening in session PlayerActivity

The current metadata updates are triggered by item transitions,
but depending on the speed of loading the playlist, the first
metadata may only be known later via metadata-change callbacks.

Slow playlist loading also means the UI stays empty and it's
beneficial to show a placeholder to avoid the impressions the
UI hangs.

Finally, clean-up by removing unused string constants and merging
all listeners into onEvents

#minor-release

PiperOrigin-RevId: 571951529
This commit is contained in:
tonihei 2023-10-09 08:58:37 -07:00 committed by Copybara-Service
parent 33c151eb5b
commit fd81c904e1
2 changed files with 24 additions and 20 deletions

View File

@ -30,11 +30,11 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.media3.common.C.TRACK_TYPE_TEXT
import androidx.media3.common.MediaItem
import androidx.media3.common.MediaMetadata
import androidx.media3.common.Player
import androidx.media3.common.Player.EVENT_MEDIA_ITEM_TRANSITION
import androidx.media3.common.Player.EVENT_MEDIA_METADATA_CHANGED
import androidx.media3.common.Player.EVENT_TIMELINE_CHANGED
import androidx.media3.common.Player.EVENT_TRACKS_CHANGED
import androidx.media3.common.Timeline
import androidx.media3.common.util.UnstableApi
import androidx.media3.session.MediaController
import androidx.media3.session.SessionToken
@ -96,6 +96,7 @@ class PlayerActivity : AppCompatActivity() {
SessionToken(this, ComponentName(this, PlaybackService::class.java))
)
.buildAsync()
updateMediaMetadataUI()
controllerFuture.addListener({ setController() }, MoreExecutors.directExecutor())
}
@ -110,37 +111,43 @@ class PlayerActivity : AppCompatActivity() {
playerView.player = controller
updateCurrentPlaylistUI()
updateMediaMetadataUI(controller.mediaMetadata)
updateMediaMetadataUI()
playerView.setShowSubtitleButton(controller.currentTracks.isTypeSupported(TRACK_TYPE_TEXT))
controller.addListener(
object : Player.Listener {
override fun onTimelineChanged(timeline: Timeline, reason: Int) {
if (reason == Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED) {
updateCurrentPlaylistUI()
}
}
override fun onEvents(player: Player, events: Player.Events) {
if (events.contains(EVENT_MEDIA_ITEM_TRANSITION)) {
updateMediaMetadataUI(player.currentMediaItem?.mediaMetadata ?: MediaMetadata.EMPTY)
}
if (events.contains(EVENT_TRACKS_CHANGED)) {
playerView.setShowSubtitleButton(player.currentTracks.isTypeSupported(TRACK_TYPE_TEXT))
}
if (events.contains(EVENT_TIMELINE_CHANGED)) {
updateCurrentPlaylistUI()
}
if (events.contains(EVENT_MEDIA_METADATA_CHANGED)) {
updateMediaMetadataUI()
}
if (events.contains(EVENT_MEDIA_ITEM_TRANSITION)) {
// Trigger adapter update to change highlight of current item.
mediaItemListAdapter.notifyDataSetChanged()
}
}
}
)
}
private fun updateMediaMetadataUI(mediaMetadata: MediaMetadata) {
private fun updateMediaMetadataUI() {
val controller = this.controller
if (controller == null || controller.mediaItemCount == 0) {
findViewById<TextView>(R.id.media_title).text = getString(R.string.waiting_for_metadata)
findViewById<TextView>(R.id.media_artist).text = ""
return
}
val mediaMetadata = controller.mediaMetadata
val title: CharSequence = mediaMetadata.title ?: ""
findViewById<TextView>(R.id.media_title).text = title
findViewById<TextView>(R.id.media_artist).text = mediaMetadata.artist
// Trick to update playlist UI
mediaItemListAdapter.notifyDataSetChanged()
}
private fun updateCurrentPlaylistUI() {

View File

@ -19,9 +19,6 @@
<string name="open_player_content_description">Click to view your play list</string>
<string name="added_media_item_format">Added %1$s to playlist</string>
<string name="shuffle">Shuffle</string>
<string name="repeat">Repeat</string>
<string name="play_button">Play</string>
<string name="no_item_prompt">
"! No media in the play list !\nPlease try to add more from browser"
</string>
<string name="waiting_for_metadata">Waiting for playlist to load…</string>
</resources>