From ec45a020a56238d25b1a896d46bc0595cd68a19f Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Thu, 17 Sep 2020 15:20:41 -0600 Subject: [PATCH] Add song list to AlbumDetailFragment Add a list of the albums songs to AlbumDetailFragment. --- .../auxio/detail/AlbumDetailFragment.kt | 12 +++ .../detail/adapters/DetailSongAdapter.kt | 52 +++++++++++++ .../org/oxycblt/auxio/music/models/Album.kt | 2 +- .../auxio/music/processing/MusicLoader.kt | 2 +- .../auxio/music/processing/MusicSorter.kt | 2 + .../main/res/layout/fragment_album_detail.xml | 55 +++++++++++--- .../res/layout/fragment_artist_detail.xml | 4 - app/src/main/res/layout/item_album_song.xml | 74 +++++++++++++++++++ app/src/main/res/values/dimens.xml | 2 + app/src/main/res/values/strings.xml | 1 + 10 files changed, 188 insertions(+), 18 deletions(-) create mode 100644 app/src/main/java/org/oxycblt/auxio/detail/adapters/DetailSongAdapter.kt create mode 100644 app/src/main/res/layout/item_album_song.xml 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 643aa3750..39010e7be 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt @@ -8,8 +8,11 @@ import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.navigation.fragment.navArgs +import org.oxycblt.auxio.ClickListener import org.oxycblt.auxio.databinding.FragmentAlbumDetailBinding +import org.oxycblt.auxio.detail.adapters.DetailSongAdapter import org.oxycblt.auxio.music.MusicViewModel +import org.oxycblt.auxio.theme.applyDivider class AlbumDetailFragment : Fragment() { @@ -30,6 +33,15 @@ class AlbumDetailFragment : Fragment() { binding.lifecycleOwner = this binding.album = album + binding.songRecycler.adapter = DetailSongAdapter( + album.songs, + ClickListener { + Log.d(this::class.simpleName, it.name) + } + ) + binding.songRecycler.applyDivider() + binding.songRecycler.setHasFixedSize(true) + Log.d(this::class.simpleName, "Fragment created.") return binding.root diff --git a/app/src/main/java/org/oxycblt/auxio/detail/adapters/DetailSongAdapter.kt b/app/src/main/java/org/oxycblt/auxio/detail/adapters/DetailSongAdapter.kt new file mode 100644 index 000000000..9d42206b0 --- /dev/null +++ b/app/src/main/java/org/oxycblt/auxio/detail/adapters/DetailSongAdapter.kt @@ -0,0 +1,52 @@ +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.ItemAlbumSongBinding +import org.oxycblt.auxio.music.models.Song + +class DetailSongAdapter( + 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( + ItemAlbumSongBinding.inflate(LayoutInflater.from(parent.context)) + ) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(data[position]) + } + + // Generic ViewHolder for an album + inner class ViewHolder( + private val binding: ItemAlbumSongBinding + ) : 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(song: Song) { + binding.song = song + + binding.root.setOnClickListener { + listener.onClick(song) + } + + // Force-update the layout so ellipsizing works. + binding.songName.requestLayout() + binding.executePendingBindings() + } + } +} 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 b04744459..1c215d536 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: String = "" + val year: Int = 0 ) { lateinit var artist: Artist 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 a7f466fe3..a001332d8 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.toString() + coverUri, year ) ) } 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 32a29a050..a338b5d05 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 @@ -40,6 +40,8 @@ class MusicSorter( album.songs.add(song) } + album.finalize() + unknownSongs.removeAll(albumSongs) } diff --git a/app/src/main/res/layout/fragment_album_detail.xml b/app/src/main/res/layout/fragment_album_detail.xml index 8c41b0eb5..c4535b4cd 100644 --- a/app/src/main/res/layout/fragment_album_detail.xml +++ b/app/src/main/res/layout/fragment_album_detail.xml @@ -47,7 +47,7 @@ tools:src="@drawable/ic_album" /> + + + tools:layout_editor_absoluteX="60dp" /> + + - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_artist_detail.xml b/app/src/main/res/layout/fragment_artist_detail.xml index 60c521dec..d14c81684 100644 --- a/app/src/main/res/layout/fragment_artist_detail.xml +++ b/app/src/main/res/layout/fragment_artist_detail.xml @@ -97,8 +97,6 @@ android:textAppearance="@style/TextAppearance.MaterialComponents.Overline" android:textSize="16sp" android:fontFamily="@font/inter_bold" - android:clickable="true" - android:focusable="true" android:layout_marginTop="@dimen/padding_medium" android:paddingStart="@dimen/padding_medium" android:paddingEnd="@dimen/padding_small" @@ -118,9 +116,7 @@ app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toBottomOf="@+id/header_albums" - app:layout_constraintVertical_bias="0.0" tools:itemCount="4" - tools:layout_editor_absoluteX="0dp" tools:listitem="@layout/item_album" /> diff --git a/app/src/main/res/layout/item_album_song.xml b/app/src/main/res/layout/item_album_song.xml new file mode 100644 index 000000000..9e238fe9b --- /dev/null +++ b/app/src/main/res/layout/item_album_song.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + \ 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 96c57bc90..d5dc5840a 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -16,6 +16,8 @@ 80dp 230dp + 32dp + 26sp 10sp' 2sp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 08158a80c..6e2a34c02 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -12,6 +12,7 @@ Retry Grant Albums + Songs Unknown Genre Unknown Artist