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:
parent
33c151eb5b
commit
fd81c904e1
@ -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() {
|
||||
|
@ -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>
|
||||
|
Loading…
x
Reference in New Issue
Block a user