From aad42b5201f06216314a7063852f5775cccfcbc7 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Sun, 27 Sep 2020 17:03:05 -0600 Subject: [PATCH] Fix album bugs Fix bugs with the album items & detail fragments. --- .../auxio/detail/AlbumDetailFragment.kt | 14 ++++++---- .../auxio/detail/ArtistDetailFragment.kt | 4 ++- .../oxycblt/auxio/detail/DetailViewModel.kt | 26 +++++++++++++++---- .../auxio/detail/GenreDetailFragment.kt | 2 ++ .../oxycblt/auxio/library/LibraryFragment.kt | 2 +- .../java/org/oxycblt/auxio/music/Models.kt | 8 +++--- .../org/oxycblt/auxio/music/MusicUtils.kt | 20 +++++++++++--- .../main/res/layout/fragment_album_detail.xml | 11 ++++---- app/src/main/res/layout/item_album.xml | 1 + app/src/main/res/layout/item_artist_album.xml | 4 +-- app/src/main/res/navigation/nav_main.xml | 3 +++ 11 files changed, 68 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt b/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt index 96072fec1..5ac7968d8 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt @@ -63,16 +63,18 @@ class AlbumDetailFragment : Fragment() { findNavController().navigateUp() } - // If the album was shown directly from LibraryFragment [No parent artist stored] - // Then enable the ability to navigate upwards to the parent artist - if (detailModel.currentArtist.value!!.id != detailModel.currentAlbum.value!!.artist.id) { - detailModel.currentArtist.observe(viewLifecycleOwner) { - if (it.id == detailModel.currentAlbum.value!!.artist.id) { + // If the album was shown directly from LibraryFragment, Then enable the ability to + // navigate upwards to the parent artist + if (args.fromLibrary) { + detailModel.navToParent.observe(viewLifecycleOwner) { + if (it) { findNavController().navigate( AlbumDetailFragmentDirections.actionShowParentArtist( detailModel.currentAlbum.value!!.artist.id ) ) + + detailModel.doneWithNavToParent() } } @@ -80,6 +82,8 @@ class AlbumDetailFragment : Fragment() { } detailModel.albumSortMode.observe(viewLifecycleOwner) { mode -> + Log.d(this::class.simpleName, "Updating sort mode to $mode") + // Update the current sort icon binding.albumSortButton.setImageResource(mode.iconRes) diff --git a/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt b/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt index aae86b1f4..05357f4c2 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt @@ -65,6 +65,8 @@ class ArtistDetailFragment : Fragment() { } detailModel.artistSortMode.observe(viewLifecycleOwner) { mode -> + Log.d(this::class.simpleName, "Updating sort mode to $mode") + // Update the current sort icon binding.artistSortButton.setImageResource(mode.iconRes) @@ -107,7 +109,7 @@ class ArtistDetailFragment : Fragment() { detailModel.isAlreadyNavigating = true findNavController().navigate( - ArtistDetailFragmentDirections.actionShowAlbum(album.id) + ArtistDetailFragmentDirections.actionShowAlbum(album.id, false) ) } } diff --git a/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt b/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt index ecf586320..7f95dcd17 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt @@ -21,17 +21,25 @@ class DetailViewModel : ViewModel() { val albumSortMode: LiveData get() = mAlbumSortMode // Current music models being shown - // These have placeholder values in them so that they don't - // have to be checked if they're null. - private val mCurrentGenre = MutableLiveData(Genre(name = "")) + // These have placeholder values initially so that they don't have to be checked if they're null + private val mCurrentGenre = MutableLiveData( + Genre(id = Long.MIN_VALUE, name = "") + ) val currentGenre: LiveData get() = mCurrentGenre - private val mCurrentArtist = MutableLiveData(Artist(name = "")) + private val mCurrentArtist = MutableLiveData( + Artist(id = Long.MIN_VALUE, name = "") + ) val currentArtist: LiveData get() = mCurrentArtist - private val mCurrentAlbum = MutableLiveData(Album(name = "", artistName = "")) + private val mCurrentAlbum = MutableLiveData( + Album(id = Long.MIN_VALUE, name = "", artistName = "") + ) val currentAlbum: LiveData get() = mCurrentAlbum + private val mNavToParent = MutableLiveData() + val navToParent: LiveData get() = mNavToParent + fun updateGenre(genre: Genre) { mCurrentGenre.value = genre } @@ -44,6 +52,14 @@ class DetailViewModel : ViewModel() { mCurrentAlbum.value = album } + fun doNavToParent() { + mNavToParent.value = true + } + + fun doneWithNavToParent() { + mNavToParent.value = false + } + fun incrementGenreSortMode() { mGenreSortMode.value = when (mGenreSortMode.value) { SortMode.ALPHA_DOWN -> SortMode.ALPHA_UP diff --git a/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt b/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt index 9b5017e1d..7b8793ad0 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt @@ -63,6 +63,8 @@ class GenreDetailFragment : Fragment() { } detailModel.genreSortMode.observe(viewLifecycleOwner) { mode -> + Log.d(this::class.simpleName, "Updating sort mode to $mode") + // Update the current sort icon binding.genreSortButton.setImageResource(mode.iconRes) diff --git a/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt b/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt index 1af6d992a..0af43f242 100644 --- a/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt @@ -96,7 +96,7 @@ class LibraryFragment : Fragment() { findNavController().navigate( MainFragmentDirections.actionShowAlbum( - album.id + album.id, true ) ) } 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 8e1f32e31..631f3f7f7 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/Models.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/Models.kt @@ -11,7 +11,7 @@ sealed class BaseModel { // Song data class Song( - override val id: Long, + override val id: Long = -1, override var name: String, val albumId: Long, val track: Int, @@ -25,7 +25,7 @@ data class Song( // Album data class Album( - override val id: Long = Long.MIN_VALUE, + override val id: Long = -1, override val name: String, val artistName: String, val coverUri: Uri = Uri.EMPTY, @@ -47,7 +47,7 @@ data class Album( // Artist data class Artist( - override val id: Long = Long.MIN_VALUE, + override val id: Long = -1, override var name: String, val givenGenres: MutableList = mutableListOf() ) : BaseModel() { @@ -67,7 +67,7 @@ data class Artist( // Genre data class Genre( - override val id: Long = Long.MIN_VALUE, + override val id: Long = -1, override var name: String, ) : BaseModel() { val artists = mutableListOf() diff --git a/app/src/main/java/org/oxycblt/auxio/music/MusicUtils.kt b/app/src/main/java/org/oxycblt/auxio/music/MusicUtils.kt index 254e8a47b..e20063497 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicUtils.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicUtils.kt @@ -1,6 +1,7 @@ package org.oxycblt.auxio.music import android.content.ContentUris +import android.content.Context import android.net.Uri import android.provider.MediaStore import android.text.format.DateUtils @@ -79,6 +80,14 @@ fun Long.toDuration(): String { return durationString } +// Convert an integer to its formatted year +fun Int.toYear(context: Context): String { + return if (this > 0) { + this.toString() + } else { + context.getString(R.string.placeholder_no_date) + } +} // --- BINDING ADAPTERS --- @BindingAdapter("genreCounts") @@ -87,7 +96,7 @@ fun TextView.bindGenreCounts(genre: Genre) { R.plurals.format_artist_count, genre.numArtists, genre.numArtists ) val albums = context.resources.getQuantityString( - R.plurals.format_album_count, genre.numAlbums, genre.numAlbums + R.plurals.format_song_count, genre.numAlbums, genre.numAlbums ) text = context.getString(R.string.format_double_counts, artists, albums) @@ -122,7 +131,7 @@ fun TextView.bindArtistCounts(artist: Artist) { fun TextView.bindAlbumDetails(album: Album) { text = context.getString( R.string.format_double_info, - album.year.toString(), + album.year.toYear(context), context.resources.getQuantityString( R.plurals.format_song_count, album.numSongs, album.numSongs @@ -131,7 +140,12 @@ fun TextView.bindAlbumDetails(album: Album) { ) } -@BindingAdapter("albumSongs") +@BindingAdapter("albumYear") +fun TextView.bindAlbumDate(album: Album) { + text = album.year.toYear(context) +} + +@BindingAdapter("albumSongCount") // Format the amount of songs in an album fun TextView.bindAlbumSongs(album: Album) { text = context.resources.getQuantityString( diff --git a/app/src/main/res/layout/fragment_album_detail.xml b/app/src/main/res/layout/fragment_album_detail.xml index ffd63e07e..bf77add7b 100644 --- a/app/src/main/res/layout/fragment_album_detail.xml +++ b/app/src/main/res/layout/fragment_album_detail.xml @@ -77,7 +77,7 @@ android:layout_marginStart="@dimen/margin_medium" android:clickable="true" android:focusable="true" - android:onClick="@{() -> detailModel.updateArtist(album.artist)}" + android:onClick="@{() -> detailModel.doNavToParent()}" android:text="@{album.artist.name}" android:textAppearance="?android:attr/textAppearanceListItem" android:textColor="?android:attr/textColorSecondary" @@ -86,11 +86,10 @@ tools:text="Artist Name" /> + app:layout_constraintTop_toBottomOf="@+id/album_details" /> + app:layout_constraintTop_toBottomOf="@+id/album_details" /> + tools:text="2020" /> \ No newline at end of file diff --git a/app/src/main/res/navigation/nav_main.xml b/app/src/main/res/navigation/nav_main.xml index 109ee0751..0055fb079 100644 --- a/app/src/main/res/navigation/nav_main.xml +++ b/app/src/main/res/navigation/nav_main.xml @@ -72,6 +72,9 @@ +