diff --git a/app/src/main/java/org/oxycblt/auxio/music/service/MediaItemBrowser.kt b/app/src/main/java/org/oxycblt/auxio/music/service/MediaItemBrowser.kt index 1b0252e10..5c8c35ede 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/service/MediaItemBrowser.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/service/MediaItemBrowser.kt @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ - + package org.oxycblt.auxio.music.service import android.content.Context @@ -57,7 +57,9 @@ constructor( private var invalidator: Invalidator? = null interface Invalidator { - fun invalidate(ids: List) + data class ParentId(val id: String, val itemCount: Int) + + fun invalidate(ids: Map) fun invalidate(controller: ControllerInfo, query: String, itemCount: Int) } @@ -76,23 +78,43 @@ constructor( override fun onMusicChanges(changes: MusicRepository.Changes) { val deviceLibrary = musicRepository.deviceLibrary var invalidateSearch = false - val invalidate = mutableListOf() + val invalidate = mutableMapOf() if (changes.deviceLibrary && deviceLibrary != null) { - invalidate.addAll(MediaSessionUID.Category.DEVICE_MUSIC) - deviceLibrary.albums.mapTo(invalidate) { MediaSessionUID.Single(it.uid) } - deviceLibrary.artists.mapTo(invalidate) { MediaSessionUID.Single(it.uid) } - deviceLibrary.genres.mapTo(invalidate) { MediaSessionUID.Single(it.uid) } + MediaSessionUID.Category.DEVICE_MUSIC.forEach { + invalidate[it.toString()] = getCategorySize(it, musicRepository) + } + + deviceLibrary.albums.forEach { + val id = MediaSessionUID.Single(it.uid).toString() + invalidate[id] = it.songs.size + } + + deviceLibrary.artists.forEach { + val id = MediaSessionUID.Single(it.uid).toString() + invalidate[id] = it.songs.size + it.explicitAlbums.size + it.implicitAlbums.size + } + + deviceLibrary.genres.forEach { + val id = MediaSessionUID.Single(it.uid).toString() + invalidate[id] = it.songs.size + it.artists.size + } + invalidateSearch = true } val userLibrary = musicRepository.userLibrary if (changes.userLibrary && userLibrary != null) { - invalidate.addAll(MediaSessionUID.Category.USER_MUSIC) - userLibrary.playlists.mapTo(invalidate) { MediaSessionUID.Single(it.uid) } + MediaSessionUID.Category.USER_MUSIC.forEach { + invalidate[it.toString()] = getCategorySize(it, musicRepository) + } + userLibrary.playlists.forEach { + val id = MediaSessionUID.Single(it.uid).toString() + invalidate[id] = it.songs.size + } invalidateSearch = true } if (invalidate.isNotEmpty()) { - invalidator?.invalidate(invalidate.map { it.toString() }) + invalidator?.invalidate(invalidate) } if (invalidateSearch) { @@ -119,8 +141,10 @@ constructor( is MediaSessionUID.Category -> return uid.toMediaItem(context) is MediaSessionUID.Single -> musicRepository.find(uid.uid)?.let { musicRepository.find(it.uid) } + is MediaSessionUID.Joined -> musicRepository.find(uid.childUid)?.let { musicRepository.find(it.uid) } + null -> null } ?: return null @@ -155,32 +179,40 @@ constructor( when (mediaSessionUID) { MediaSessionUID.Category.ROOT -> MediaSessionUID.Category.IMPORTANT.map { it.toMediaItem(context) } + MediaSessionUID.Category.SONGS -> listSettings.songSort.songs(deviceLibrary.songs).map { it.toMediaItem(context, null) } + MediaSessionUID.Category.ALBUMS -> listSettings.albumSort.albums(deviceLibrary.albums).map { it.toMediaItem(context) } + MediaSessionUID.Category.ARTISTS -> listSettings.artistSort.artists(deviceLibrary.artists).map { it.toMediaItem(context) } + MediaSessionUID.Category.GENRES -> listSettings.genreSort.genres(deviceLibrary.genres).map { it.toMediaItem(context) } + MediaSessionUID.Category.PLAYLISTS -> userLibrary.playlists.map { it.toMediaItem(context) } } } + is MediaSessionUID.Single -> { getChildMediaItems(mediaSessionUID.uid) } + is MediaSessionUID.Joined -> { getChildMediaItems(mediaSessionUID.childUid) } + null -> { return null } @@ -193,25 +225,45 @@ constructor( val songs = listSettings.albumSongSort.songs(item.songs) songs.map { it.toMediaItem(context, item) } } + is Artist -> { val albums = ARTIST_ALBUMS_SORT.albums(item.explicitAlbums + item.implicitAlbums) val songs = listSettings.artistSongSort.songs(item.songs) albums.map { it.toMediaItem(context) } + songs.map { it.toMediaItem(context, item) } } + is Genre -> { val artists = GENRE_ARTISTS_SORT.artists(item.artists) val songs = listSettings.genreSongSort.songs(item.songs) artists.map { it.toMediaItem(context) } + - songs.map { it.toMediaItem(context, null) } + songs.map { it.toMediaItem(context, null) } } + is Playlist -> { item.songs.map { it.toMediaItem(context, item) } } + is Song, null -> return null } } + private fun getCategorySize( + category: MediaSessionUID.Category, + musicRepository: MusicRepository + ): Int { + val deviceLibrary = musicRepository.deviceLibrary ?: return 0 + val userLibrary = musicRepository.userLibrary ?: return 0 + return when (category) { + MediaSessionUID.Category.ROOT -> MediaSessionUID.Category.IMPORTANT.size + MediaSessionUID.Category.SONGS -> deviceLibrary.songs.size + MediaSessionUID.Category.ALBUMS -> deviceLibrary.albums.size + MediaSessionUID.Category.ARTISTS -> deviceLibrary.artists.size + MediaSessionUID.Category.GENRES -> deviceLibrary.genres.size + MediaSessionUID.Category.PLAYLISTS -> userLibrary.playlists.size + } + } + suspend fun prepareSearch(query: String, controller: ControllerInfo) { searchSubscribers[controller] = query val existing = searchResults[query] @@ -287,7 +339,8 @@ constructor( deviceLibrary.albums, deviceLibrary.artists, deviceLibrary.genres, - userLibrary.playlists) + userLibrary.playlists + ) val results = searchEngine.search(items, query) for (entry in searchSubscribers.entries) { if (entry.value == query) { diff --git a/app/src/main/java/org/oxycblt/auxio/playback/service/MediaSessionServiceFragment.kt b/app/src/main/java/org/oxycblt/auxio/playback/service/MediaSessionServiceFragment.kt index 91635d7dc..65caa80af 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/service/MediaSessionServiceFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/service/MediaSessionServiceFragment.kt @@ -255,9 +255,9 @@ constructor( mediaSession.setCustomLayout(layout) } - override fun invalidate(ids: List) { + override fun invalidate(ids: Map){ for (id in ids) { - mediaSession.notifyChildrenChanged(id, Int.MAX_VALUE, null) + mediaSession.notifyChildrenChanged(id.key, id.value, null) } }