From 3337747cb753fb58ec15f7c9d534323e5b13d763 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Sun, 18 Oct 2020 15:37:00 -0600 Subject: [PATCH] Fix empty genre bug Bandaid MusicSorter to remove any genres that dont have anything in them, because that happens now. Also prevent a crash just in case an empty music model does get played. --- .../oxycblt/auxio/library/LibraryViewModel.kt | 2 +- .../java/org/oxycblt/auxio/music/Models.kt | 9 ++++++++- .../auxio/music/processing/MusicLoader.kt | 10 ++++------ .../auxio/music/processing/MusicSorter.kt | 3 +++ .../auxio/playback/PlaybackViewModel.kt | 20 ++++++++++++++++++- 5 files changed, 35 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/library/LibraryViewModel.kt b/app/src/main/java/org/oxycblt/auxio/library/LibraryViewModel.kt index 81931d60f..2c1b8fb1f 100644 --- a/app/src/main/java/org/oxycblt/auxio/library/LibraryViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/library/LibraryViewModel.kt @@ -21,7 +21,7 @@ class LibraryViewModel : ViewModel() { val searchHasFocus: Boolean get() = mSearchHasFocus // TODO: Move these to prefs when they're added - private val mShowMode = MutableLiveData(ShowMode.SHOW_GENRES) + private val mShowMode = MutableLiveData(ShowMode.SHOW_ARTISTS) val showMode: LiveData get() = mShowMode private val mSortMode = MutableLiveData(SortMode.ALPHA_DOWN) diff --git a/app/src/main/java/org/oxycblt/auxio/music/Models.kt b/app/src/main/java/org/oxycblt/auxio/music/Models.kt index 6b405a518..082f15ecc 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/Models.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/Models.kt @@ -3,7 +3,7 @@ package org.oxycblt.auxio.music import android.net.Uri // --- MUSIC MODELS --- -// TODO: Remove parent/child references so that they can be parcelable [Would require genre rework] +// FIXME: Remove parent/child references so that they can be parcelable? // The base model for all music // This is used in a lot of general functions in order to have generic utilities @@ -94,6 +94,13 @@ data class Genre( } num } + val songs: MutableList by lazy { + val songs = mutableListOf() + artists.forEach { + songs.addAll(it.songs) + } + songs + } } // Header [Used for search, nothing else] diff --git a/app/src/main/java/org/oxycblt/auxio/music/processing/MusicLoader.kt b/app/src/main/java/org/oxycblt/auxio/music/processing/MusicLoader.kt index dfcbd9198..e96a5ae7a 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/processing/MusicLoader.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/processing/MusicLoader.kt @@ -129,8 +129,6 @@ class MusicLoader( name = artistPlaceholder } - Log.d(this::class.simpleName, id.toString()) - artists.add( Artist( id, name @@ -141,6 +139,10 @@ class MusicLoader( cursor.close() } + artists = artists.distinctBy { + it.name to it.genres + }.toMutableList() + // Then try to associate any genres with their respective artists. for (genre in genres) { val artistGenreCursor = resolver.query( @@ -166,10 +168,6 @@ class MusicLoader( } } - artists = artists.distinctBy { - it.name to it.genres - }.toMutableList() - Log.d( this::class.simpleName, "Artist search finished with ${artists.size} artists found." diff --git a/app/src/main/java/org/oxycblt/auxio/music/processing/MusicSorter.kt b/app/src/main/java/org/oxycblt/auxio/music/processing/MusicSorter.kt index 73dbe5ea2..498db3451 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/processing/MusicSorter.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/processing/MusicSorter.kt @@ -26,6 +26,9 @@ class MusicSorter( genres = genres.distinctBy { it.name }.toMutableList() + + // Also elimate any genres that dont have artists, which also happens sometimes. + genres.removeAll { it.artists.isEmpty() } } private fun sortSongsIntoAlbums() { diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt index 0a623f501..f51116104 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt @@ -18,7 +18,7 @@ import kotlin.random.Random.Default.nextLong // TODO: Queue // TODO: Add the playback service itself // TODO: Add loop control [From playback] -// TODO: Implement persistence through Bundles and sanity checks [I want to keep my shuffles, okay?] +// TODO: Implement persistence through Bundles [I want to keep my shuffles, okay?] // A ViewModel that acts as an intermediary between PlaybackService and the Playback Fragments. class PlaybackViewModel : ViewModel() { private val mCurrentSong = MutableLiveData() @@ -108,6 +108,12 @@ class PlaybackViewModel : ViewModel() { fun play(album: Album, isShuffled: Boolean) { Log.d(this::class.simpleName, "Playing album ${album.name}") + if (album.songs.isEmpty()) { + Log.e(this::class.simpleName, "Album is empty, not playing.") + + return + } + val songs = orderSongsInAlbum(album) updatePlayback(songs[0]) @@ -128,6 +134,12 @@ class PlaybackViewModel : ViewModel() { fun play(artist: Artist, isShuffled: Boolean) { Log.d(this::class.simpleName, "Playing artist ${artist.name}") + if (artist.songs.isEmpty()) { + Log.e(this::class.simpleName, "Artist is empty, not playing.") + + return + } + val songs = orderSongsInArtist(artist) updatePlayback(songs[0]) @@ -148,6 +160,12 @@ class PlaybackViewModel : ViewModel() { fun play(genre: Genre, isShuffled: Boolean) { Log.d(this::class.simpleName, "Playing genre ${genre.name}") + if (genre.songs.isEmpty()) { + Log.e(this::class.simpleName, "Genre is empty, not playing.") + + return + } + val songs = orderSongsInGenre(genre) updatePlayback(songs[0])