From 47aec7f18a4d4dbe2c30eb7f8e553cc2bb6a64bf Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Mon, 14 Sep 2020 16:22:24 -0600 Subject: [PATCH] Add album list to ArtistDetailFragment Add a list of the artists albums to ArtistDetailFragment. --- .../auxio/detail/ArtistDetailFragment.kt | 17 ++- .../detail/adapters/DetailAlbumAdapter.kt | 54 +++++++ .../auxio/library/adapters/AlbumAdapter.kt | 3 +- .../auxio/library/adapters/ArtistAdapter.kt | 9 +- .../org/oxycblt/auxio/music/MusicUtils.kt | 5 +- .../res/layout/fragment_artist_detail.xml | 140 ++++++++++-------- app/src/main/res/layout/item_album_big.xml | 63 ++++++++ app/src/main/res/values/dimens.xml | 1 + 8 files changed, 223 insertions(+), 69 deletions(-) create mode 100644 app/src/main/java/org/oxycblt/auxio/detail/adapters/DetailAlbumAdapter.kt create mode 100644 app/src/main/res/layout/item_album_big.xml 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 ec23a8a19..7b91428d7 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt @@ -7,8 +7,11 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels +import org.oxycblt.auxio.ClickListener import org.oxycblt.auxio.databinding.FragmentArtistDetailBinding +import org.oxycblt.auxio.detail.adapters.DetailAlbumAdapter import org.oxycblt.auxio.music.MusicViewModel +import org.oxycblt.auxio.theme.applyDivider class ArtistDetailFragment : Fragment() { @@ -24,7 +27,19 @@ class ArtistDetailFragment : Fragment() { val musicModel: MusicViewModel by activityViewModels() val artistId = ArtistDetailFragmentArgs.fromBundle(requireArguments()).artistId - binding.artist = musicModel.artists.value?.find { it.id == artistId } + val artist = musicModel.artists.value?.find { it.id == artistId }!! + + binding.lifecycleOwner = this + binding.artist = artist + + binding.albumRecycler.adapter = DetailAlbumAdapter( + artist.albums, + ClickListener { + Log.d(this::class.simpleName, it.name) + } + ) + binding.albumRecycler.applyDivider() + binding.albumRecycler.setHasFixedSize(true) Log.d(this::class.simpleName, "Fragment created.") diff --git a/app/src/main/java/org/oxycblt/auxio/detail/adapters/DetailAlbumAdapter.kt b/app/src/main/java/org/oxycblt/auxio/detail/adapters/DetailAlbumAdapter.kt new file mode 100644 index 000000000..8f03a1604 --- /dev/null +++ b/app/src/main/java/org/oxycblt/auxio/detail/adapters/DetailAlbumAdapter.kt @@ -0,0 +1,54 @@ +package org.oxycblt.auxio.detail.adapters + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import org.oxycblt.auxio.ClickListener +import org.oxycblt.auxio.databinding.ItemAlbumBigBinding +import org.oxycblt.auxio.music.models.Album + +class DetailAlbumAdapter( + private val data: List, + private val listener: ClickListener +) : RecyclerView.Adapter() { + + override fun getItemCount(): Int = data.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder( + ItemAlbumBigBinding.inflate(LayoutInflater.from(parent.context)) + ) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val album = data[position] + + holder.bind(album) + } + + // Generic ViewHolder for an album + inner class ViewHolder( + private val binding: ItemAlbumBigBinding + ) : RecyclerView.ViewHolder(binding.root) { + + init { + // Force the viewholder to *actually* be the screen width so ellipsizing can work. + binding.root.layoutParams = RecyclerView.LayoutParams( + RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT + ) + } + + // Bind the view w/new data + fun bind(album: Album) { + binding.album = album + + binding.root.setOnClickListener { + listener.onClick(album) + } + + // Force-update the layout so ellipsizing works. + binding.albumName.requestLayout() + binding.executePendingBindings() + } + } +} diff --git a/app/src/main/java/org/oxycblt/auxio/library/adapters/AlbumAdapter.kt b/app/src/main/java/org/oxycblt/auxio/library/adapters/AlbumAdapter.kt index 959bed9e2..3ea061d82 100644 --- a/app/src/main/java/org/oxycblt/auxio/library/adapters/AlbumAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/library/adapters/AlbumAdapter.kt @@ -9,7 +9,8 @@ import org.oxycblt.auxio.music.models.Album class AlbumAdapter( private val data: List, - private val listener: ClickListener + private val listener: ClickListener, + private val isLarge: Boolean ) : RecyclerView.Adapter() { override fun getItemCount(): Int = data.size diff --git a/app/src/main/java/org/oxycblt/auxio/library/adapters/ArtistAdapter.kt b/app/src/main/java/org/oxycblt/auxio/library/adapters/ArtistAdapter.kt index d0d3cdbd8..00a41091c 100644 --- a/app/src/main/java/org/oxycblt/auxio/library/adapters/ArtistAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/library/adapters/ArtistAdapter.kt @@ -15,14 +15,9 @@ class ArtistAdapter( override fun getItemCount(): Int = data.size override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val binding = ItemArtistBinding.inflate(LayoutInflater.from(parent.context)) - - // Force the item to *actually* be the screen width so ellipsizing can work. - binding.root.layoutParams = RecyclerView.LayoutParams( - RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT + return ViewHolder( + ItemArtistBinding.inflate(LayoutInflater.from(parent.context)) ) - - return ViewHolder(binding) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { 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 8f02e6116..744cadc5b 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicUtils.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicUtils.kt @@ -1,7 +1,6 @@ package org.oxycblt.auxio.music import android.content.ContentUris -import android.content.Context import android.net.Uri import android.provider.MediaStore import android.widget.TextView @@ -66,7 +65,9 @@ fun Long.toAlbumArtURI(): Uri { // Format the amount of songs in an album @BindingAdapter("songCount") fun TextView.getAlbumSongs(album: Album) { - text = context.resources.getQuantityString(R.plurals.format_song_count, album.numSongs) + text = context.resources.getQuantityString( + R.plurals.format_song_count, album.numSongs, album.numSongs + ) } @BindingAdapter("artistCounts") diff --git a/app/src/main/res/layout/fragment_artist_detail.xml b/app/src/main/res/layout/fragment_artist_detail.xml index 8d4ca8ae8..c43b16d32 100644 --- a/app/src/main/res/layout/fragment_artist_detail.xml +++ b/app/src/main/res/layout/fragment_artist_detail.xml @@ -10,10 +10,9 @@ type="org.oxycblt.auxio.music.models.Artist" /> - - + - + - + - + + + + + + + + + + - \ No newline at end of file diff --git a/app/src/main/res/layout/item_album_big.xml b/app/src/main/res/layout/item_album_big.xml new file mode 100644 index 000000000..55403c12d --- /dev/null +++ b/app/src/main/res/layout/item_album_big.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 8fbf3deb6..96c57bc90 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -13,6 +13,7 @@ 44dp 56dp + 80dp 230dp 26sp