From b80a3596b8e4909d4c07962c04e06b6e196760d1 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Wed, 23 Sep 2020 15:42:06 -0600 Subject: [PATCH] Store references to items in DetailViewModel Store references to the artist & album inside DetailViewModel to prevent an artist/album search on every re-creation. --- .../java/org/oxycblt/auxio/GenericUtils.kt | 4 ++ .../java/org/oxycblt/auxio/MainActivity.kt | 3 -- .../auxio/detail/AlbumDetailFragment.kt | 30 ++++++++----- .../auxio/detail/ArtistDetailFragment.kt | 36 ++++++++++----- .../oxycblt/auxio/detail/DetailViewModel.kt | 7 ++- .../org/oxycblt/auxio/music/models/Artist.kt | 3 +- app/src/main/res/drawable/header_dividers.xml | 10 ++++- .../main/res/layout/fragment_album_detail.xml | 45 +++++++++---------- .../res/layout/fragment_artist_detail.xml | 39 +++++++++++----- app/src/main/res/navigation/nav_main.xml | 3 -- app/src/main/res/values/dimens.xml | 2 + app/src/main/res/values/strings.xml | 1 + 12 files changed, 115 insertions(+), 68 deletions(-) create mode 100644 app/src/main/java/org/oxycblt/auxio/GenericUtils.kt diff --git a/app/src/main/java/org/oxycblt/auxio/GenericUtils.kt b/app/src/main/java/org/oxycblt/auxio/GenericUtils.kt new file mode 100644 index 000000000..69cda0ed5 --- /dev/null +++ b/app/src/main/java/org/oxycblt/auxio/GenericUtils.kt @@ -0,0 +1,4 @@ +package org.oxycblt.auxio + +// RecyclerView click listener +class ClickListener(val onClick: (T) -> Unit) \ No newline at end of file diff --git a/app/src/main/java/org/oxycblt/auxio/MainActivity.kt b/app/src/main/java/org/oxycblt/auxio/MainActivity.kt index 690b8ff8d..31d8f486a 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainActivity.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainActivity.kt @@ -23,6 +23,3 @@ class MainActivity : AppCompatActivity() { setContentView(R.layout.activity_main) } } - -// RecyclerView click listener -class ClickListener(val onClick: (T) -> Unit) 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 68428ca0b..702947891 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt @@ -28,17 +28,22 @@ class AlbumDetailFragment : Fragment() { ): View? { val binding = FragmentAlbumDetailBinding.inflate(inflater) - // I honestly don't want to turn of the any data classes into parcelables due to how - // many lists they store, so just pick up the artist id and find it from musicModel. - val musicModel: MusicViewModel by activityViewModels() - val album = musicModel.albums.value?.find { it.id == args.albumId }!! + // If DetailViewModel isn't already storing the album, get it from MusicViewModel + // using the ID given by the navigation arguments. + if (detailModel.currentAlbum == null) { + val musicModel: MusicViewModel by activityViewModels() + + detailModel.currentAlbum = musicModel.albums.value!!.find { + it.id == args.albumId + }!! + } binding.lifecycleOwner = this binding.detailModel = detailModel - binding.album = album + binding.album = detailModel.currentAlbum binding.songRecycler.adapter = DetailSongAdapter( - album.songs, + detailModel.currentAlbum!!.songs, ClickListener { Log.d(this::class.simpleName, it.name) } @@ -46,16 +51,17 @@ class AlbumDetailFragment : Fragment() { binding.songRecycler.applyDivider() binding.songRecycler.setHasFixedSize(true) - // If the album was shown directly from LibraryFragment, then enable the ability - // to navigate to the artist from the album. Don't do this if the album was shown - // from ArtistDetailFragment, as you can just navigate up to see the parent artist. - if (args.isFromLibrary) { + // If the album was shown directly from LibraryFragment [No parent artist stored], + // then enable the ability to navigate upwards to the album's parent artist. + if (detailModel.currentArtist == null) { detailModel.doneWithNavToParent() detailModel.navToParentArtist.observe(viewLifecycleOwner) { if (it) { findNavController().navigate( - AlbumDetailFragmentDirections.actionShowParentArtist(album.artist.id) + AlbumDetailFragmentDirections.actionShowParentArtist( + detailModel.currentAlbum!!.artist.id + ) ) detailModel.doneWithNavToParent() @@ -69,4 +75,4 @@ class AlbumDetailFragment : Fragment() { return binding.root } -} +} \ No newline at end of file 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 b224a2ffa..69eb8e2e3 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt @@ -28,20 +28,26 @@ class ArtistDetailFragment : Fragment() { ): View? { val binding = FragmentArtistDetailBinding.inflate(inflater) - // I honestly don't want to turn of the any data classes into parcelables due to how - // many lists they store, so just pick up the artist id and find it from musicModel. - val musicModel: MusicViewModel by activityViewModels() - val artist = musicModel.artists.value?.find { it.id == args.artistId }!! + // If DetailViewModel isn't already storing the artist, get it from MusicViewModel + // using the ID given by the navigation arguments + if (detailModel.currentArtist == null) { + val musicModel: MusicViewModel by activityViewModels() + detailModel.currentArtist = musicModel.artists.value!!.find { + it.id == args.artistId + }!! + } - binding.lifecycleOwner = this - binding.artist = artist - - binding.albumRecycler.adapter = DetailAlbumAdapter( - artist.albums, + val artistAdapter = DetailAlbumAdapter( + detailModel.currentArtist!!.albums, ClickListener { navToAlbum(it) } ) + + binding.lifecycleOwner = this + binding.artist = detailModel.currentArtist!! + + binding.albumRecycler.adapter = artistAdapter binding.albumRecycler.applyDivider() binding.albumRecycler.setHasFixedSize(true) @@ -56,14 +62,22 @@ class ArtistDetailFragment : Fragment() { detailModel.isAlreadyNavigating = false } + override fun onDestroy() { + super.onDestroy() + + // Reset the stored artist so that the next instance of ArtistDetailFragment + // will not read it. + detailModel.currentArtist = null + } + private fun navToAlbum(album: Album) { // Don't navigate if an item already has been selected. if (!detailModel.isAlreadyNavigating) { detailModel.isAlreadyNavigating = true findNavController().navigate( - ArtistDetailFragmentDirections.actionShowAlbum(album.id, false) + ArtistDetailFragmentDirections.actionShowAlbum(album.id) ) } } -} +} \ No newline at end of file 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 4091f593a..4667e1162 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt @@ -3,6 +3,8 @@ package org.oxycblt.auxio.detail import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import org.oxycblt.auxio.music.models.Album +import org.oxycblt.auxio.music.models.Artist class DetailViewModel : ViewModel() { var isAlreadyNavigating = false @@ -10,6 +12,9 @@ class DetailViewModel : ViewModel() { private val mNavToParentArtist = MutableLiveData() val navToParentArtist: LiveData get() = mNavToParentArtist + var currentArtist: Artist? = null + var currentAlbum: Album? = null + fun navToParent() { mNavToParentArtist.value = true } @@ -17,4 +22,4 @@ class DetailViewModel : ViewModel() { fun doneWithNavToParent() { mNavToParentArtist.value = false } -} +} \ No newline at end of file diff --git a/app/src/main/java/org/oxycblt/auxio/music/models/Artist.kt b/app/src/main/java/org/oxycblt/auxio/music/models/Artist.kt index 46068b0ca..4009af869 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/models/Artist.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/models/Artist.kt @@ -19,8 +19,7 @@ data class Artist( } fun finalizeGenre() { - // If the artist has more than one genre, pick the most "prominent" one. - // [Really just eliminate duplicates created from my hacky way of getting genres loaded but shhhh] + // If the artist has more than one genre, pick the most "Prominent" one. genre = if (genres.size > 1) { val groupGenres = genres.groupBy { it.name } diff --git a/app/src/main/res/drawable/header_dividers.xml b/app/src/main/res/drawable/header_dividers.xml index 566591e13..3945c0df4 100644 --- a/app/src/main/res/drawable/header_dividers.xml +++ b/app/src/main/res/drawable/header_dividers.xml @@ -1,4 +1,5 @@ - @@ -12,4 +13,11 @@ https://stackoverflow.com/a/61157571/14143986 android:color="@color/divider_color" /> + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_album_detail.xml b/app/src/main/res/layout/fragment_album_detail.xml index 814d3857c..1c8732d0d 100644 --- a/app/src/main/res/layout/fragment_album_detail.xml +++ b/app/src/main/res/layout/fragment_album_detail.xml @@ -26,8 +26,7 @@ android:background="?android:attr/windowBackground" android:elevation="@dimen/elevation_normal" app:titleTextAppearance="@style/TextAppearance.Toolbar.Bold" - app:title="@string/title_library_fragment" - tools:titleTextColor="@color/blue" /> + app:title="@string/title_library_fragment" /> + android:animateLayoutChanges="true"> @@ -90,30 +88,29 @@ android:id="@+id/album_year" android:layout_width="0dp" android:layout_height="wrap_content" - android:textAppearance="?android:attr/textAppearanceListItem" - android:textColor="?android:attr/textColorSecondary" android:layout_marginStart="@dimen/margin_medium" android:text="@{album.year != 0 ? String.valueOf(album.year) : @string/placeholder_no_date}" + android:textAppearance="?android:attr/textAppearanceListItem" + android:textColor="?android:attr/textColorSecondary" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/artist_name" tools:text="2020" /> + app:layout_constraintTop_toBottomOf="@+id/album_year" /> diff --git a/app/src/main/res/layout/fragment_artist_detail.xml b/app/src/main/res/layout/fragment_artist_detail.xml index 53641bbe6..bad8fbb16 100644 --- a/app/src/main/res/layout/fragment_artist_detail.xml +++ b/app/src/main/res/layout/fragment_artist_detail.xml @@ -22,8 +22,7 @@ android:background="?android:attr/windowBackground" android:elevation="@dimen/elevation_normal" app:titleTextAppearance="@style/TextAppearance.Toolbar.Bold" - app:title="@string/title_library_fragment" - tools:titleTextColor="@color/blue" /> + app:title="@string/title_library_fragment" /> + + diff --git a/app/src/main/res/navigation/nav_main.xml b/app/src/main/res/navigation/nav_main.xml index 63562f6b6..a7c4c8583 100644 --- a/app/src/main/res/navigation/nav_main.xml +++ b/app/src/main/res/navigation/nav_main.xml @@ -58,9 +58,6 @@ - 10sp' 2sp + 18dp + 4dp \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c88991f23..01db6bf4d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -18,6 +18,7 @@ Artist Cover for %s Track %s Error + Change Sorting Mode Unknown Genre Unknown Artist