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.
This commit is contained in:
OxygenCobalt 2020-12-27 19:25:29 -07:00
parent 7a54b0a79f
commit c1ae32325f
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
8 changed files with 52 additions and 45 deletions

View file

@ -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.

View file

@ -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<Song, SongViewHolder>(DiffCallback()) {
) : ListAdapter<Song, GenreSongAdapter.GenreSongViewHolder>(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<Song>(binding, doOnClick, doOnLongClick) {
override fun onBind(data: Song) {
binding.song = data
binding.songName.requestLayout()
binding.songInfo.requestLayout()
}
}
}

View file

@ -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<Song>,
private val doOnClick: (data: Song) -> Unit,
private val doOnLongClick: (data: Song, view: View) -> Unit
) : RecyclerView.Adapter<SongsAdapter.ViewHolder>() {
) : RecyclerView.Adapter<SongViewHolder>() {
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<Song>(binding, doOnClick, doOnLongClick) {
override fun onBind(data: Song) {
binding.song = data
binding.songName.requestLayout()
binding.songInfo.requestLayout()
}
}
}

View file

@ -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" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView>

View file

@ -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" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView>

View file

@ -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" />
<com.reddit.indicatorfastscroll.FastScrollerView
android:id="@+id/song_fast_scroll"

View file

@ -22,7 +22,6 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription"
tools:src="@drawable/ic_song" />
<TextView
@ -31,7 +30,7 @@
android:layout_marginEnd="@dimen/margin_medium"
android:text="@{song.name}"
app:layout_constraintBottom_toTopOf="@+id/song_info"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintEnd_toStartOf="@+id/duration"
app:layout_constraintStart_toEndOf="@+id/album_cover"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="packed"
@ -43,10 +42,22 @@
android:layout_marginEnd="@dimen/margin_medium"
android:text="@{@string/format_info(song.album.artist.name, song.album.name)}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintEnd_toStartOf="@+id/duration"
app:layout_constraintStart_toEndOf="@+id/album_cover"
app:layout_constraintTop_toBottomOf="@+id/song_name"
tools:text="Artist / Album" />
<TextView
android:id="@+id/duration"
style="@style/ItemText.Secondary"
android:ellipsize="none"
android:gravity="end"
android:text="@{song.formattedDuration}"
android:textAlignment="viewEnd"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="16:16" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

View file

@ -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" />
<TextView
@ -30,7 +31,7 @@
android:layout_marginEnd="@dimen/margin_medium"
android:text="@{song.name}"
app:layout_constraintBottom_toTopOf="@+id/song_info"
app:layout_constraintEnd_toStartOf="@+id/duration"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/album_cover"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="packed"
@ -42,22 +43,10 @@
android:layout_marginEnd="@dimen/margin_medium"
android:text="@{@string/format_info(song.album.artist.name, song.album.name)}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/duration"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/album_cover"
app:layout_constraintTop_toBottomOf="@+id/song_name"
tools:text="Artist / Album" />
<TextView
android:id="@+id/duration"
style="@style/ItemText.Secondary"
android:ellipsize="none"
android:gravity="end"
android:text="@{song.formattedDuration}"
android:textAlignment="viewEnd"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="16:16" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>