playback: improve published playback metadata
This commit is contained in:
parent
ba5bccaa37
commit
cce33e1414
2 changed files with 17 additions and 7 deletions
|
@ -114,6 +114,9 @@ dependencies {
|
||||||
// Media
|
// Media
|
||||||
implementation "androidx.media:media:1.7.0"
|
implementation "androidx.media:media:1.7.0"
|
||||||
|
|
||||||
|
// Android Auto
|
||||||
|
implementation "androidx.car.app:app:1.4.0"
|
||||||
|
|
||||||
// Preferences
|
// Preferences
|
||||||
implementation "androidx.preference:preference-ktx:1.2.1"
|
implementation "androidx.preference:preference-ktx:1.2.1"
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,7 @@ import android.support.v4.media.MediaMetadataCompat
|
||||||
import android.support.v4.media.session.MediaSessionCompat
|
import android.support.v4.media.session.MediaSessionCompat
|
||||||
import android.support.v4.media.session.PlaybackStateCompat
|
import android.support.v4.media.session.PlaybackStateCompat
|
||||||
import androidx.annotation.DrawableRes
|
import androidx.annotation.DrawableRes
|
||||||
|
import androidx.car.app.mediaextensions.MetadataExtras
|
||||||
import androidx.core.app.NotificationCompat
|
import androidx.core.app.NotificationCompat
|
||||||
import androidx.media.app.NotificationCompat.MediaStyle
|
import androidx.media.app.NotificationCompat.MediaStyle
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
@ -40,6 +41,7 @@ import org.oxycblt.auxio.image.ImageSettings
|
||||||
import org.oxycblt.auxio.music.MusicParent
|
import org.oxycblt.auxio.music.MusicParent
|
||||||
import org.oxycblt.auxio.music.Song
|
import org.oxycblt.auxio.music.Song
|
||||||
import org.oxycblt.auxio.music.resolveNames
|
import org.oxycblt.auxio.music.resolveNames
|
||||||
|
import org.oxycblt.auxio.music.service.MediaSessionUID
|
||||||
import org.oxycblt.auxio.playback.ActionMode
|
import org.oxycblt.auxio.playback.ActionMode
|
||||||
import org.oxycblt.auxio.playback.PlaybackSettings
|
import org.oxycblt.auxio.playback.PlaybackSettings
|
||||||
import org.oxycblt.auxio.playback.service.MediaSessionInterface
|
import org.oxycblt.auxio.playback.service.MediaSessionInterface
|
||||||
|
@ -230,10 +232,11 @@ private constructor(
|
||||||
// several times.
|
// several times.
|
||||||
val title = song.name.resolve(context)
|
val title = song.name.resolve(context)
|
||||||
val artist = song.artists.resolveNames(context)
|
val artist = song.artists.resolveNames(context)
|
||||||
|
val album = song.album.name.resolve(context)
|
||||||
val builder =
|
val builder =
|
||||||
MediaMetadataCompat.Builder()
|
MediaMetadataCompat.Builder()
|
||||||
.putText(MediaMetadataCompat.METADATA_KEY_TITLE, title)
|
.putText(MediaMetadataCompat.METADATA_KEY_TITLE, title)
|
||||||
.putText(MediaMetadataCompat.METADATA_KEY_ALBUM, song.album.name.resolve(context))
|
.putText(MediaMetadataCompat.METADATA_KEY_ALBUM, album)
|
||||||
// Note: We would leave the artist field null if it didn't exist and let downstream
|
// Note: We would leave the artist field null if it didn't exist and let downstream
|
||||||
// consumers handle it, but that would break the notification display.
|
// consumers handle it, but that would break the notification display.
|
||||||
.putText(MediaMetadataCompat.METADATA_KEY_ARTIST, artist)
|
.putText(MediaMetadataCompat.METADATA_KEY_ARTIST, artist)
|
||||||
|
@ -246,11 +249,12 @@ private constructor(
|
||||||
.putText(MediaMetadataCompat.METADATA_KEY_GENRE, song.genres.resolveNames(context))
|
.putText(MediaMetadataCompat.METADATA_KEY_GENRE, song.genres.resolveNames(context))
|
||||||
.putText(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, title)
|
.putText(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, title)
|
||||||
.putText(MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE, artist)
|
.putText(MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE, artist)
|
||||||
.putText(
|
.putText(MediaMetadataCompat.METADATA_KEY_DISPLAY_DESCRIPTION, album)
|
||||||
MediaMetadataCompat.METADATA_KEY_DISPLAY_DESCRIPTION,
|
|
||||||
parent?.run { name.resolve(context) }
|
|
||||||
?: context.getString(R.string.lbl_all_songs))
|
|
||||||
.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, song.durationMs)
|
.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, song.durationMs)
|
||||||
|
.putText(PlaybackNotification.KEY_PARENT,
|
||||||
|
parent?.name?.resolve(context) ?: context.getString(R.string.lbl_all_songs))
|
||||||
|
.putText(MetadataExtras.KEY_SUBTITLE_LINK_MEDIA_ID, MediaSessionUID.SingleItem(song.artists[0].uid).toString())
|
||||||
|
.putText(MetadataExtras.KEY_DESCRIPTION_LINK_MEDIA_ID, MediaSessionUID.SingleItem(song.album.uid).toString())
|
||||||
// These fields are nullable and so we must check first before adding them to the fields.
|
// These fields are nullable and so we must check first before adding them to the fields.
|
||||||
song.track?.let {
|
song.track?.let {
|
||||||
logD("Adding track information")
|
logD("Adding track information")
|
||||||
|
@ -263,6 +267,7 @@ private constructor(
|
||||||
song.date?.let {
|
song.date?.let {
|
||||||
logD("Adding date information")
|
logD("Adding date information")
|
||||||
builder.putString(MediaMetadataCompat.METADATA_KEY_DATE, it.toString())
|
builder.putString(MediaMetadataCompat.METADATA_KEY_DATE, it.toString())
|
||||||
|
builder.putString(MediaMetadataCompat.METADATA_KEY_YEAR, it.year.toString())
|
||||||
}
|
}
|
||||||
|
|
||||||
// We are normally supposed to use URIs for album art, but that removes some of the
|
// We are normally supposed to use URIs for album art, but that removes some of the
|
||||||
|
@ -510,9 +515,11 @@ private class PlaybackNotification(
|
||||||
iconRes, actionName, context.newBroadcastPendingIntent(actionName))
|
iconRes, actionName, context.newBroadcastPendingIntent(actionName))
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
private companion object {
|
companion object {
|
||||||
|
const val KEY_PARENT = BuildConfig.APPLICATION_ID + ".metadata.PARENT"
|
||||||
|
|
||||||
/** Notification channel used by solely the playback notification. */
|
/** Notification channel used by solely the playback notification. */
|
||||||
val CHANNEL_INFO =
|
private val CHANNEL_INFO =
|
||||||
ChannelInfo(
|
ChannelInfo(
|
||||||
id = BuildConfig.APPLICATION_ID + ".channel.PLAYBACK",
|
id = BuildConfig.APPLICATION_ID + ".channel.PLAYBACK",
|
||||||
nameRes = R.string.lbl_playback)
|
nameRes = R.string.lbl_playback)
|
||||||
|
|
Loading…
Reference in a new issue