diff --git a/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt b/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt new file mode 100644 index 000000000..643aa3750 --- /dev/null +++ b/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt @@ -0,0 +1,37 @@ +package org.oxycblt.auxio.detail + +import android.os.Bundle +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.fragment.app.activityViewModels +import androidx.navigation.fragment.navArgs +import org.oxycblt.auxio.databinding.FragmentAlbumDetailBinding +import org.oxycblt.auxio.music.MusicViewModel + +class AlbumDetailFragment : Fragment() { + + private val args: AlbumDetailFragmentArgs by navArgs() + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): 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 }!! + + binding.lifecycleOwner = this + binding.album = album + + Log.d(this::class.simpleName, "Fragment created.") + + return binding.root + } +} 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 7b91428d7..57dbef8f4 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt @@ -7,14 +7,21 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels +import androidx.navigation.fragment.findNavController +import androidx.navigation.fragment.navArgs import org.oxycblt.auxio.ClickListener import org.oxycblt.auxio.databinding.FragmentArtistDetailBinding import org.oxycblt.auxio.detail.adapters.DetailAlbumAdapter +import org.oxycblt.auxio.library.DetailViewModel import org.oxycblt.auxio.music.MusicViewModel +import org.oxycblt.auxio.music.models.Album import org.oxycblt.auxio.theme.applyDivider class ArtistDetailFragment : Fragment() { + private val args: ArtistDetailFragmentArgs by navArgs() + private val detailModel: DetailViewModel by activityViewModels() + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -22,12 +29,10 @@ class ArtistDetailFragment : Fragment() { ): View? { val binding = FragmentArtistDetailBinding.inflate(inflater) - // I honestly don't want to turn of the any data classes into a parcelables due to how + // 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 artistId = ArtistDetailFragmentArgs.fromBundle(requireArguments()).artistId - - val artist = musicModel.artists.value?.find { it.id == artistId }!! + val artist = musicModel.artists.value?.find { it.id == args.artistId }!! binding.lifecycleOwner = this binding.artist = artist @@ -35,7 +40,7 @@ class ArtistDetailFragment : Fragment() { binding.albumRecycler.adapter = DetailAlbumAdapter( artist.albums, ClickListener { - Log.d(this::class.simpleName, it.name) + navToAlbum(it) } ) binding.albumRecycler.applyDivider() @@ -45,4 +50,21 @@ class ArtistDetailFragment : Fragment() { return binding.root } + + override fun onResume() { + super.onResume() + + detailModel.isAlreadyNavigating = false + } + + 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) + ) + } + } } diff --git a/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt b/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt new file mode 100644 index 000000000..52db36004 --- /dev/null +++ b/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt @@ -0,0 +1,7 @@ +package org.oxycblt.auxio.library + +import androidx.lifecycle.ViewModel + +class DetailViewModel : ViewModel() { + var isAlreadyNavigating = false +} 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 508becaf8..ec474b08c 100644 --- a/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt @@ -50,11 +50,10 @@ class LibraryFragment : Fragment() { } private fun navToArtist(artist: Artist) { + // Don't navigate if an item already has been selected. if (!libraryModel.isAlreadyNavigating) { libraryModel.isAlreadyNavigating = true - // When navigation, pass the artistImage of the item as a shared element to create - // the image popup. findNavController().navigate( MainFragmentDirections.actionShowArtist(artist.id) ) 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 744cadc5b..b958b11cf 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicUtils.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicUtils.kt @@ -82,17 +82,8 @@ fun TextView.bindArtistCounts(artist: Artist) { text = context.getString(R.string.format_double_counts, albums, songs) } +// TODO: Add option to just list all genres. @BindingAdapter("artistGenre") fun TextView.getArtistGenre(artist: Artist) { - // If the artist has more than one genre, pick the most used one. - // TODO: Add an option to display all genres. - val genre: String = if (artist.genres.size > 1) { - val genres = artist.genres.groupBy { it.name } - - genres.keys.sortedByDescending { genres[it]?.size }[0] - } else { - artist.genres[0].name - } - - text = genre + text = artist.genre } diff --git a/app/src/main/java/org/oxycblt/auxio/music/models/Album.kt b/app/src/main/java/org/oxycblt/auxio/music/models/Album.kt index 1c215d536..b04744459 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/models/Album.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/models/Album.kt @@ -8,7 +8,7 @@ data class Album( var name: String = "", val artistName: String = "", // only used for sorting. Use artist.name instead. val coverUri: Uri = Uri.EMPTY, - val year: Int = 0 + val year: String = "" ) { lateinit var artist: Artist 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 fb8c3a6a6..9324b1057 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 @@ -7,6 +7,7 @@ data class Artist( val genres: MutableList = mutableListOf(Genre()) ) { val albums = mutableListOf() + var genre = "" val numAlbums: Int get() = albums.size var numSongs = 0 @@ -17,5 +18,14 @@ data class Artist( albums.forEach { album -> numSongs += album.numSongs } + + // If the artist has more than one genre, pick the most used one. + genre = if (genres.size > 1) { + val groupGenres = genres.groupBy { it.name } + + groupGenres.keys.sortedByDescending { groupGenres[it]?.size }[0] + } else { + genres[0].name + } } } 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 a001332d8..a7f466fe3 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 @@ -191,7 +191,7 @@ class MusicLoader(private val resolver: ContentResolver) { albums.add( Album( id, name, artist, - coverUri, year + coverUri, year.toString() ) ) } diff --git a/app/src/main/res/layout/fragment_album_detail.xml b/app/src/main/res/layout/fragment_album_detail.xml new file mode 100644 index 000000000..8c41b0eb5 --- /dev/null +++ b/app/src/main/res/layout/fragment_album_detail.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 bd1560d72..787d59cc9 100644 --- a/app/src/main/res/navigation/nav_main.xml +++ b/app/src/main/res/navigation/nav_main.xml @@ -38,5 +38,21 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/transition/transition_to_main.xml b/app/src/main/res/transition/transition_to_main.xml deleted file mode 100644 index e700054cc..000000000 --- a/app/src/main/res/transition/transition_to_main.xml +++ /dev/null @@ -1,3 +0,0 @@ - - \ No newline at end of file