From c1ae32325fff95bf37ad4d5fb2d7e4dc5a080081 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Sun, 27 Dec 2020 19:25:29 -0700 Subject: [PATCH] Refactor song viewholders Make it so that the primary song viewholder is the one without a duration, making the one with the duration the viewholder for genre songs. --- README.md | 4 ++- .../auxio/detail/adapters/GenreSongAdapter.kt | 29 +++++++++++++++---- .../org/oxycblt/auxio/songs/SongsAdapter.kt | 24 ++++----------- .../res/layout-land/fragment_genre_detail.xml | 2 +- .../main/res/layout/fragment_genre_detail.xml | 2 +- app/src/main/res/layout/fragment_songs.xml | 2 +- ...tem_basic_song.xml => item_genre_song.xml} | 17 +++++++++-- app/src/main/res/layout/item_song.xml | 17 ++--------- 8 files changed, 52 insertions(+), 45 deletions(-) rename app/src/main/res/layout/{item_basic_song.xml => item_genre_song.xml} (79%) diff --git a/README.md b/README.md index 8b6cd1033..3bc6f4907 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,9 @@ ## About -Auxio is a local music player for android partially inspired by both Spotify and other FOSS music players such as [Music Player GO](https://github.com/enricocid/Music-Player-GO) and [Phonograph](https://github.com/kabouzeid/Phonograph), albeit with a heavy emphasis on simplicity, consistency, and customizability. Unlike other music players, Auxio is based off of [ExoPlayer](https://exoplayer.dev/), creating a much better listening experience compared to the native [MediaPlayer](https://developer.android.com/guide/topics/media/mediaplayer) API. Auxios codebase is also extendable, allowing for the addition of features that are not included in the main app. +Auxio is a local music player for android partially inspired by both Spotify and other FOSS music players such as [Music Player GO](https://github.com/enricocid/Music-Player-GO) and [Phonograph](https://github.com/kabouzeid/Phonograph), albeit with a heavy emphasis on a simple and sensible, however customizable UI/UX. + +Unlike other music players, Auxio is based off of [ExoPlayer](https://exoplayer.dev/), allowing for much better listening experience compared to the native [MediaPlayer](https://developer.android.com/guide/topics/media/mediaplayer) API. Auxio's codebase is also designed to be extendable, allowing for the addition of features that are not included in the main app. **Note:** Auxio is still early in development, meaning that some things may change as time passes. diff --git a/app/src/main/java/org/oxycblt/auxio/detail/adapters/GenreSongAdapter.kt b/app/src/main/java/org/oxycblt/auxio/detail/adapters/GenreSongAdapter.kt index 8a7c64331..3557d21ee 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/adapters/GenreSongAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/adapters/GenreSongAdapter.kt @@ -1,11 +1,13 @@ package org.oxycblt.auxio.detail.adapters +import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.ListAdapter +import org.oxycblt.auxio.databinding.ItemGenreSongBinding import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.recycler.DiffCallback -import org.oxycblt.auxio.recycler.viewholders.SongViewHolder +import org.oxycblt.auxio.recycler.viewholders.BaseViewHolder /** * An adapter for displaying the [Song]s of a genre. @@ -13,13 +15,30 @@ import org.oxycblt.auxio.recycler.viewholders.SongViewHolder class GenreSongAdapter( private val doOnClick: (data: Song) -> Unit, private val doOnLongClick: (data: Song, view: View) -> Unit -) : ListAdapter(DiffCallback()) { +) : ListAdapter(DiffCallback()) { - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SongViewHolder { - return SongViewHolder.from(parent.context, doOnClick, doOnLongClick) + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GenreSongViewHolder { + return GenreSongViewHolder( + ItemGenreSongBinding.inflate(LayoutInflater.from(parent.context)), + doOnClick, doOnLongClick + ) } - override fun onBindViewHolder(holder: SongViewHolder, position: Int) { + override fun onBindViewHolder(holder: GenreSongViewHolder, position: Int) { holder.bind(getItem(position)) } + + inner class GenreSongViewHolder( + private val binding: ItemGenreSongBinding, + doOnClick: (data: Song) -> Unit, + doOnLongClick: (data: Song, view: View) -> Unit + ) : BaseViewHolder(binding, doOnClick, doOnLongClick) { + + override fun onBind(data: Song) { + binding.song = data + + binding.songName.requestLayout() + binding.songInfo.requestLayout() + } + } } diff --git a/app/src/main/java/org/oxycblt/auxio/songs/SongsAdapter.kt b/app/src/main/java/org/oxycblt/auxio/songs/SongsAdapter.kt index 45d32ce06..f2d2c4419 100644 --- a/app/src/main/java/org/oxycblt/auxio/songs/SongsAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/songs/SongsAdapter.kt @@ -1,12 +1,10 @@ package org.oxycblt.auxio.songs -import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView -import org.oxycblt.auxio.databinding.ItemBasicSongBinding import org.oxycblt.auxio.music.Song -import org.oxycblt.auxio.recycler.viewholders.BaseViewHolder +import org.oxycblt.auxio.recycler.viewholders.SongViewHolder /** * The adapter for [SongsFragment], shows basic songs without durations. @@ -18,27 +16,15 @@ class SongsAdapter( private val data: List, private val doOnClick: (data: Song) -> Unit, private val doOnLongClick: (data: Song, view: View) -> Unit -) : RecyclerView.Adapter() { +) : RecyclerView.Adapter() { override fun getItemCount(): Int = data.size - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - return ViewHolder(ItemBasicSongBinding.inflate(LayoutInflater.from(parent.context))) + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SongViewHolder { + return SongViewHolder.from(parent.context, doOnClick, doOnLongClick) } - override fun onBindViewHolder(holder: ViewHolder, position: Int) { + override fun onBindViewHolder(holder: SongViewHolder, position: Int) { holder.bind(data[position]) } - - inner class ViewHolder( - private val binding: ItemBasicSongBinding - ) : BaseViewHolder(binding, doOnClick, doOnLongClick) { - - override fun onBind(data: Song) { - binding.song = data - - binding.songName.requestLayout() - binding.songInfo.requestLayout() - } - } } diff --git a/app/src/main/res/layout-land/fragment_genre_detail.xml b/app/src/main/res/layout-land/fragment_genre_detail.xml index 65e99a6f3..c1546e34e 100644 --- a/app/src/main/res/layout-land/fragment_genre_detail.xml +++ b/app/src/main/res/layout-land/fragment_genre_detail.xml @@ -126,7 +126,7 @@ app:layout_constraintTop_toBottomOf="@+id/genre_song_header" app:spanCount="2" tools:itemCount="4" - tools:listitem="@layout/item_song" /> + tools:listitem="@layout/item_genre_song" /> diff --git a/app/src/main/res/layout/fragment_genre_detail.xml b/app/src/main/res/layout/fragment_genre_detail.xml index f4f1fef0f..e02007d52 100644 --- a/app/src/main/res/layout/fragment_genre_detail.xml +++ b/app/src/main/res/layout/fragment_genre_detail.xml @@ -124,7 +124,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/genre_song_header" tools:itemCount="4" - tools:listitem="@layout/item_song" /> + tools:listitem="@layout/item_genre_song" /> diff --git a/app/src/main/res/layout/fragment_songs.xml b/app/src/main/res/layout/fragment_songs.xml index 314de4e90..0a05b159a 100644 --- a/app/src/main/res/layout/fragment_songs.xml +++ b/app/src/main/res/layout/fragment_songs.xml @@ -29,7 +29,7 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/song_toolbar" - tools:listitem="@layout/item_basic_song" /> + tools:listitem="@layout/item_song" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_song.xml b/app/src/main/res/layout/item_song.xml index 8088a2575..c93be38a9 100644 --- a/app/src/main/res/layout/item_song.xml +++ b/app/src/main/res/layout/item_song.xml @@ -22,6 +22,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" + tools:ignore="ContentDescription" tools:src="@drawable/ic_song" /> - - \ No newline at end of file