Merge branch 'fix/android-auto-nested-directories' into 'develop'

Properly handling nested directory structures in Android Auto

Closes #1256

See merge request ultrasonic/ultrasonic!1067
This commit is contained in:
birdbird 2023-07-06 15:11:02 +00:00
commit 96ac6fcac7

View File

@ -274,10 +274,12 @@ class AutoMediaBrowserCallback(val libraryService: MediaLibraryService) :
customCommandFuture = onSetRating(session, controller, HeartRating(true)) customCommandFuture = onSetRating(session, controller, HeartRating(true))
updateCustomHeartButton(session, true) updateCustomHeartButton(session, true)
} }
PlaybackService.CUSTOM_COMMAND_TOGGLE_HEART_OFF -> { PlaybackService.CUSTOM_COMMAND_TOGGLE_HEART_OFF -> {
customCommandFuture = onSetRating(session, controller, HeartRating(false)) customCommandFuture = onSetRating(session, controller, HeartRating(false))
updateCustomHeartButton(session, false) updateCustomHeartButton(session, false)
} }
else -> { else -> {
Timber.d( Timber.d(
"CustomCommand not recognized %s with extra %s", "CustomCommand not recognized %s with extra %s",
@ -290,6 +292,7 @@ class AutoMediaBrowserCallback(val libraryService: MediaLibraryService) :
return customCommandFuture return customCommandFuture
return super.onCustomCommand(session, controller, customCommand, args) return super.onCustomCommand(session, controller, customCommand, args)
} }
override fun onSetRating( override fun onSetRating(
session: MediaSession, session: MediaSession,
controller: MediaSession.ControllerInfo, controller: MediaSession.ControllerInfo,
@ -385,10 +388,12 @@ class AutoMediaBrowserCallback(val libraryService: MediaLibraryService) :
MEDIA_PLAYLIST_SONG_ITEM -> playPlaylistSong( MEDIA_PLAYLIST_SONG_ITEM -> playPlaylistSong(
mediaIdParts[1], mediaIdParts[2], mediaIdParts[3] mediaIdParts[1], mediaIdParts[2], mediaIdParts[3]
) )
MEDIA_ALBUM_ITEM -> playAlbum(mediaIdParts[1], mediaIdParts[2]) MEDIA_ALBUM_ITEM -> playAlbum(mediaIdParts[1], mediaIdParts[2])
MEDIA_ALBUM_SONG_ITEM -> playAlbumSong( MEDIA_ALBUM_SONG_ITEM -> playAlbumSong(
mediaIdParts[1], mediaIdParts[2], mediaIdParts[3] mediaIdParts[1], mediaIdParts[2], mediaIdParts[3]
) )
MEDIA_SONG_STARRED_ID -> playStarredSongs() MEDIA_SONG_STARRED_ID -> playStarredSongs()
MEDIA_SONG_STARRED_ITEM -> playStarredSong(mediaIdParts[1]) MEDIA_SONG_STARRED_ITEM -> playStarredSong(mediaIdParts[1])
MEDIA_SONG_RANDOM_ID -> playRandomSongs() MEDIA_SONG_RANDOM_ID -> playRandomSongs()
@ -400,6 +405,7 @@ class AutoMediaBrowserCallback(val libraryService: MediaLibraryService) :
MEDIA_PODCAST_EPISODE_ITEM -> playPodcastEpisode( MEDIA_PODCAST_EPISODE_ITEM -> playPodcastEpisode(
mediaIdParts[1], mediaIdParts[2] mediaIdParts[1], mediaIdParts[2]
) )
MEDIA_SEARCH_SONG_ITEM -> playSearch(mediaIdParts[1]) MEDIA_SEARCH_SONG_ITEM -> playSearch(mediaIdParts[1])
else -> null else -> null
} }
@ -432,6 +438,7 @@ class AutoMediaBrowserCallback(val libraryService: MediaLibraryService) :
MEDIA_ALBUM_PAGE_ID -> return getAlbums( MEDIA_ALBUM_PAGE_ID -> return getAlbums(
AlbumListType.fromName(parentIdParts[1]), parentIdParts[2].toInt() AlbumListType.fromName(parentIdParts[1]), parentIdParts[2].toInt()
) )
MEDIA_PLAYLIST_ID -> return getPlaylists() MEDIA_PLAYLIST_ID -> return getPlaylists()
MEDIA_ALBUM_FREQUENT_ID -> return getAlbums(AlbumListType.FREQUENT) MEDIA_ALBUM_FREQUENT_ID -> return getAlbums(AlbumListType.FREQUENT)
MEDIA_ALBUM_NEWEST_ID -> return getAlbums(AlbumListType.NEWEST) MEDIA_ALBUM_NEWEST_ID -> return getAlbums(AlbumListType.NEWEST)
@ -447,6 +454,7 @@ class AutoMediaBrowserCallback(val libraryService: MediaLibraryService) :
MEDIA_ARTIST_ITEM -> return getAlbumsForArtist( MEDIA_ARTIST_ITEM -> return getAlbumsForArtist(
parentIdParts[1], parentIdParts[2] parentIdParts[1], parentIdParts[2]
) )
MEDIA_ALBUM_ITEM -> return getSongsForAlbum(parentIdParts[1], parentIdParts[2]) MEDIA_ALBUM_ITEM -> return getSongsForAlbum(parentIdParts[1], parentIdParts[2])
MEDIA_SHARE_ITEM -> return getSongsForShare(parentIdParts[1]) MEDIA_SHARE_ITEM -> return getSongsForShare(parentIdParts[1])
MEDIA_PODCAST_ITEM -> return getPodcastEpisodes(parentIdParts[1]) MEDIA_PODCAST_ITEM -> return getPodcastEpisodes(parentIdParts[1])
@ -534,10 +542,12 @@ class AutoMediaBrowserCallback(val libraryService: MediaLibraryService) :
MEDIA_PLAYLIST_SONG_ITEM -> playPlaylistSong( MEDIA_PLAYLIST_SONG_ITEM -> playPlaylistSong(
mediaIdParts[1], mediaIdParts[2], mediaIdParts[3] mediaIdParts[1], mediaIdParts[2], mediaIdParts[3]
) )
MEDIA_ALBUM_ITEM -> playAlbum(mediaIdParts[1], mediaIdParts[2]) MEDIA_ALBUM_ITEM -> playAlbum(mediaIdParts[1], mediaIdParts[2])
MEDIA_ALBUM_SONG_ITEM -> playAlbumSong( MEDIA_ALBUM_SONG_ITEM -> playAlbumSong(
mediaIdParts[1], mediaIdParts[2], mediaIdParts[3] mediaIdParts[1], mediaIdParts[2], mediaIdParts[3]
) )
MEDIA_SONG_STARRED_ID -> playStarredSongs() MEDIA_SONG_STARRED_ID -> playStarredSongs()
MEDIA_SONG_STARRED_ITEM -> playStarredSong(mediaIdParts[1]) MEDIA_SONG_STARRED_ITEM -> playStarredSong(mediaIdParts[1])
MEDIA_SONG_RANDOM_ID -> playRandomSongs() MEDIA_SONG_RANDOM_ID -> playRandomSongs()
@ -549,6 +559,7 @@ class AutoMediaBrowserCallback(val libraryService: MediaLibraryService) :
MEDIA_PODCAST_EPISODE_ITEM -> playPodcastEpisode( MEDIA_PODCAST_EPISODE_ITEM -> playPodcastEpisode(
mediaIdParts[1], mediaIdParts[2] mediaIdParts[1], mediaIdParts[2]
) )
MEDIA_SEARCH_SONG_ITEM -> playSearch(mediaIdParts[1]) MEDIA_SEARCH_SONG_ITEM -> playSearch(mediaIdParts[1])
else -> { else -> {
listOf() listOf()
@ -768,7 +779,17 @@ class AutoMediaBrowserCallback(val libraryService: MediaLibraryService) :
mediaItems.addPlayAllItem(listOf(MEDIA_ALBUM_ITEM, id, name).joinToString("|")) mediaItems.addPlayAllItem(listOf(MEDIA_ALBUM_ITEM, id, name).joinToString("|"))
// TODO: Paging is not implemented for songs, is it necessary at all? // TODO: Paging is not implemented for songs, is it necessary at all?
val items = songs.getTracks().take(DISPLAY_LIMIT) val items = songs.getChildren().take(DISPLAY_LIMIT).toMutableList()
items.sortWith { o1, o2 ->
if (o1.isDirectory && o2.isDirectory)
(o1.title ?: "").compareTo(o2.title ?: "")
else if (o1.isDirectory)
-1
else
1
}
items.map { item -> items.map { item ->
if (item.isDirectory) if (item.isDirectory)
mediaItems.add( mediaItems.add(
@ -776,7 +797,7 @@ class AutoMediaBrowserCallback(val libraryService: MediaLibraryService) :
listOf(MEDIA_ALBUM_ITEM, item.id, item.name).joinToString("|"), listOf(MEDIA_ALBUM_ITEM, item.id, item.name).joinToString("|"),
FOLDER_TYPE_TITLES FOLDER_TYPE_TITLES
) )
else else if (item is Track)
mediaItems.add( mediaItems.add(
item.toMediaItem( item.toMediaItem(
listOf( listOf(
@ -789,6 +810,7 @@ class AutoMediaBrowserCallback(val libraryService: MediaLibraryService) :
) )
} }
} }
return@future LibraryResult.ofItemList(mediaItems, null) return@future LibraryResult.ofItemList(mediaItems, null)
} }
} }