playback: fix various android auto issues
- Broken queue - Unusable item details
This commit is contained in:
parent
a9e7ae398c
commit
4f71dba90e
4 changed files with 37 additions and 27 deletions
|
@ -19,6 +19,9 @@
|
||||||
package org.oxycblt.auxio.music.service
|
package org.oxycblt.auxio.music.service
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.os.Bundle
|
||||||
|
import androidx.annotation.StringRes
|
||||||
|
import androidx.media.utils.MediaConstants
|
||||||
import androidx.media3.common.MediaItem
|
import androidx.media3.common.MediaItem
|
||||||
import androidx.media3.session.MediaSession.ControllerInfo
|
import androidx.media3.session.MediaSession.ControllerInfo
|
||||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||||
|
@ -29,6 +32,7 @@ import kotlinx.coroutines.Deferred
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
import kotlinx.coroutines.async
|
import kotlinx.coroutines.async
|
||||||
|
import org.oxycblt.auxio.R
|
||||||
import org.oxycblt.auxio.list.ListSettings
|
import org.oxycblt.auxio.list.ListSettings
|
||||||
import org.oxycblt.auxio.list.sort.Sort
|
import org.oxycblt.auxio.list.sort.Sort
|
||||||
import org.oxycblt.auxio.music.Album
|
import org.oxycblt.auxio.music.Album
|
||||||
|
@ -213,27 +217,41 @@ constructor(
|
||||||
return when (val item = musicRepository.find(uid)) {
|
return when (val item = musicRepository.find(uid)) {
|
||||||
is Album -> {
|
is Album -> {
|
||||||
val songs = listSettings.albumSongSort.songs(item.songs)
|
val songs = listSettings.albumSongSort.songs(item.songs)
|
||||||
songs.map { it.toMediaItem(context, item) }
|
songs.map { it.toMediaItem(context, item).withHeader(R.string.lbl_songs) }
|
||||||
}
|
}
|
||||||
is Artist -> {
|
is Artist -> {
|
||||||
val albums = ARTIST_ALBUMS_SORT.albums(item.explicitAlbums + item.implicitAlbums)
|
val albums = ARTIST_ALBUMS_SORT.albums(item.explicitAlbums + item.implicitAlbums)
|
||||||
val songs = listSettings.artistSongSort.songs(item.songs)
|
val songs = listSettings.artistSongSort.songs(item.songs)
|
||||||
albums.map { it.toMediaItem(context) } + songs.map { it.toMediaItem(context, item) }
|
albums.map { it.toMediaItem(context).withHeader(R.string.lbl_albums) } +
|
||||||
|
songs.map { it.toMediaItem(context, item).withHeader(R.string.lbl_songs) }
|
||||||
}
|
}
|
||||||
is Genre -> {
|
is Genre -> {
|
||||||
val artists = GENRE_ARTISTS_SORT.artists(item.artists)
|
val artists = GENRE_ARTISTS_SORT.artists(item.artists)
|
||||||
val songs = listSettings.genreSongSort.songs(item.songs)
|
val songs = listSettings.genreSongSort.songs(item.songs)
|
||||||
artists.map { it.toMediaItem(context) } +
|
artists.map { it.toMediaItem(context).withHeader(R.string.lbl_artists) } +
|
||||||
songs.map { it.toMediaItem(context, null) }
|
songs.map { it.toMediaItem(context, null).withHeader(R.string.lbl_songs) }
|
||||||
}
|
}
|
||||||
is Playlist -> {
|
is Playlist -> {
|
||||||
item.songs.map { it.toMediaItem(context, item) }
|
item.songs.map { it.toMediaItem(context, item).withHeader(R.string.lbl_songs) }
|
||||||
}
|
}
|
||||||
is Song,
|
is Song,
|
||||||
null -> return null
|
null -> return null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun MediaItem.withHeader(@StringRes res: Int): MediaItem {
|
||||||
|
val oldExtras = mediaMetadata.extras ?: Bundle()
|
||||||
|
val newExtras =
|
||||||
|
Bundle(oldExtras).apply {
|
||||||
|
putString(
|
||||||
|
MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE,
|
||||||
|
context.getString(res))
|
||||||
|
}
|
||||||
|
return buildUpon()
|
||||||
|
.setMediaMetadata(mediaMetadata.buildUpon().setExtras(newExtras).build())
|
||||||
|
.build()
|
||||||
|
}
|
||||||
|
|
||||||
private fun getCategorySize(
|
private fun getCategorySize(
|
||||||
category: MediaSessionUID.Category,
|
category: MediaSessionUID.Category,
|
||||||
musicRepository: MusicRepository
|
musicRepository: MusicRepository
|
||||||
|
|
|
@ -103,7 +103,7 @@ fun Album.toMediaItem(context: Context): MediaItem {
|
||||||
.setReleaseMonth(dates?.min?.month)
|
.setReleaseMonth(dates?.min?.month)
|
||||||
.setReleaseDay(dates?.min?.day)
|
.setReleaseDay(dates?.min?.day)
|
||||||
.setMediaType(MediaMetadata.MEDIA_TYPE_ALBUM)
|
.setMediaType(MediaMetadata.MEDIA_TYPE_ALBUM)
|
||||||
.setIsPlayable(true)
|
.setIsPlayable(false)
|
||||||
.setIsBrowsable(true)
|
.setIsBrowsable(true)
|
||||||
.setArtworkUri(cover.single.mediaStoreCoverUri)
|
.setArtworkUri(cover.single.mediaStoreCoverUri)
|
||||||
.setExtras(Bundle().apply { putString("uid", mediaSessionUID.toString()) })
|
.setExtras(Bundle().apply { putString("uid", mediaSessionUID.toString()) })
|
||||||
|
@ -133,7 +133,7 @@ fun Artist.toMediaItem(context: Context): MediaItem {
|
||||||
context.getString(R.string.def_song_count)
|
context.getString(R.string.def_song_count)
|
||||||
}))
|
}))
|
||||||
.setMediaType(MediaMetadata.MEDIA_TYPE_ARTIST)
|
.setMediaType(MediaMetadata.MEDIA_TYPE_ARTIST)
|
||||||
.setIsPlayable(true)
|
.setIsPlayable(false)
|
||||||
.setIsBrowsable(true)
|
.setIsBrowsable(true)
|
||||||
.setGenre(genres.resolveNames(context))
|
.setGenre(genres.resolveNames(context))
|
||||||
.setArtworkUri(cover.single.mediaStoreCoverUri)
|
.setArtworkUri(cover.single.mediaStoreCoverUri)
|
||||||
|
@ -157,7 +157,7 @@ fun Genre.toMediaItem(context: Context): MediaItem {
|
||||||
context.getString(R.string.def_song_count)
|
context.getString(R.string.def_song_count)
|
||||||
})
|
})
|
||||||
.setMediaType(MediaMetadata.MEDIA_TYPE_GENRE)
|
.setMediaType(MediaMetadata.MEDIA_TYPE_GENRE)
|
||||||
.setIsPlayable(true)
|
.setIsPlayable(false)
|
||||||
.setIsBrowsable(true)
|
.setIsBrowsable(true)
|
||||||
.setArtworkUri(cover.single.mediaStoreCoverUri)
|
.setArtworkUri(cover.single.mediaStoreCoverUri)
|
||||||
.setExtras(Bundle().apply { putString("uid", mediaSessionUID.toString()) })
|
.setExtras(Bundle().apply { putString("uid", mediaSessionUID.toString()) })
|
||||||
|
@ -180,7 +180,7 @@ fun Playlist.toMediaItem(context: Context): MediaItem {
|
||||||
context.getString(R.string.def_song_count)
|
context.getString(R.string.def_song_count)
|
||||||
})
|
})
|
||||||
.setMediaType(MediaMetadata.MEDIA_TYPE_PLAYLIST)
|
.setMediaType(MediaMetadata.MEDIA_TYPE_PLAYLIST)
|
||||||
.setIsPlayable(true)
|
.setIsPlayable(false)
|
||||||
.setIsBrowsable(true)
|
.setIsBrowsable(true)
|
||||||
.setArtworkUri(cover?.single?.mediaStoreCoverUri)
|
.setArtworkUri(cover?.single?.mediaStoreCoverUri)
|
||||||
.setExtras(Bundle().apply { putString("uid", mediaSessionUID.toString()) })
|
.setExtras(Bundle().apply { putString("uid", mediaSessionUID.toString()) })
|
||||||
|
|
|
@ -173,12 +173,13 @@ class MediaSessionPlayer(
|
||||||
playbackManager.repeatMode(appRepeatMode)
|
playbackManager.repeatMode(appRepeatMode)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun seekToDefaultPosition() {
|
|
||||||
playbackManager.seekTo(0)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun seekToDefaultPosition(mediaItemIndex: Int) {
|
override fun seekToDefaultPosition(mediaItemIndex: Int) {
|
||||||
playbackManager.goto(mediaItemIndex)
|
val indices = unscrambleQueueIndices()
|
||||||
|
val fakeIndex = indices.indexOf(mediaItemIndex)
|
||||||
|
if (fakeIndex < 0) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
playbackManager.goto(fakeIndex)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun seekToNext() = playbackManager.next()
|
override fun seekToNext() = playbackManager.next()
|
||||||
|
@ -191,18 +192,9 @@ class MediaSessionPlayer(
|
||||||
|
|
||||||
override fun seekTo(positionMs: Long) = playbackManager.seekTo(positionMs)
|
override fun seekTo(positionMs: Long) = playbackManager.seekTo(positionMs)
|
||||||
|
|
||||||
override fun seekTo(mediaItemIndex: Int, positionMs: Long) {
|
override fun seekTo(mediaItemIndex: Int, positionMs: Long) = notAllowed()
|
||||||
val indices = unscrambleQueueIndices()
|
|
||||||
val fakeIndex = indices.indexOf(mediaItemIndex)
|
override fun seekToDefaultPosition() = notAllowed()
|
||||||
if (fakeIndex < 0) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
playbackManager.goto(fakeIndex)
|
|
||||||
if (positionMs == C.TIME_UNSET) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
playbackManager.seekTo(positionMs)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun addMediaItems(index: Int, mediaItems: MutableList<MediaItem>) {
|
override fun addMediaItems(index: Int, mediaItems: MutableList<MediaItem>) {
|
||||||
val deviceLibrary = musicRepository.deviceLibrary ?: return
|
val deviceLibrary = musicRepository.deviceLibrary ?: return
|
||||||
|
|
2
media
2
media
|
@ -1 +1 @@
|
||||||
Subproject commit 00124cbac493c06a24e19b01893946bdaf8faf58
|
Subproject commit 9fc2401b8fdc2b23905402462e775c6db4e1527f
|
Loading…
Reference in a new issue