diff --git a/app/build.gradle b/app/build.gradle index aca61c22c..174c85e06 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -61,7 +61,7 @@ dependencies { implementation 'androidx.viewpager2:viewpager2:1.0.0' // Navigation - def navigation_version = "2.3.0" + def navigation_version = "2.3.1" implementation "androidx.navigation:navigation-fragment-ktx:$navigation_version" implementation "androidx.navigation:navigation-ui-ktx:$navigation_version" 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 index 0e754311d..6ffb8f4ae 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/adapters/DetailAlbumAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/adapters/DetailAlbumAdapter.kt @@ -9,7 +9,7 @@ import org.oxycblt.auxio.recycler.DiffCallback import org.oxycblt.auxio.recycler.viewholders.BaseViewHolder class DetailAlbumAdapter( - private val doOnClick: (Album) -> Unit + private val doOnClick: (data: Album) -> Unit ) : ListAdapter(DiffCallback()) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { @@ -27,8 +27,8 @@ class DetailAlbumAdapter( private val binding: ItemArtistAlbumBinding, ) : BaseViewHolder(binding, doOnClick) { - override fun onBind(model: Album) { - binding.album = model + override fun onBind(data: Album) { + binding.album = data binding.albumName.requestLayout() } diff --git a/app/src/main/java/org/oxycblt/auxio/detail/adapters/DetailArtistAdapter.kt b/app/src/main/java/org/oxycblt/auxio/detail/adapters/DetailArtistAdapter.kt index 1bacf5961..06c792c4a 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/adapters/DetailArtistAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/adapters/DetailArtistAdapter.kt @@ -9,7 +9,7 @@ import org.oxycblt.auxio.recycler.DiffCallback import org.oxycblt.auxio.recycler.viewholders.BaseViewHolder class DetailArtistAdapter( - private val doOnClick: (Artist) -> Unit + private val doOnClick: (data: Artist) -> Unit ) : ListAdapter(DiffCallback()) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { @@ -27,8 +27,8 @@ class DetailArtistAdapter( private val binding: ItemGenreArtistBinding ) : BaseViewHolder(binding, doOnClick) { - override fun onBind(model: Artist) { - binding.artist = model + override fun onBind(data: Artist) { + binding.artist = data binding.artistName.requestLayout() } 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 index f0745df12..48a5bb08f 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/adapters/DetailSongAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/adapters/DetailSongAdapter.kt @@ -2,24 +2,18 @@ package org.oxycblt.auxio.detail.adapters import android.view.LayoutInflater import android.view.ViewGroup -import androidx.annotation.ColorInt import androidx.recyclerview.widget.ListAdapter import org.oxycblt.auxio.databinding.ItemAlbumSongBinding import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.recycler.DiffCallback import org.oxycblt.auxio.recycler.viewholders.BaseViewHolder -import org.oxycblt.auxio.theme.accent -import org.oxycblt.auxio.theme.toColor class DetailSongAdapter( - private val doOnClick: (Song) -> Unit + private val doOnClick: (data: Song) -> Unit ) : ListAdapter(DiffCallback()) { - private var currentSong: Song? = null - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { return ViewHolder( - ItemAlbumSongBinding.inflate(LayoutInflater.from(parent.context)), - accent.first.toColor(parent.context) + ItemAlbumSongBinding.inflate(LayoutInflater.from(parent.context)) ) } @@ -30,15 +24,10 @@ class DetailSongAdapter( // Generic ViewHolder for a song inner class ViewHolder( private val binding: ItemAlbumSongBinding, - @ColorInt private val resolvedAccent: Int ) : BaseViewHolder(binding, doOnClick) { - override fun onBind(model: Song) { - binding.song = model - - if (model == currentSong) { - binding.songName.setTextColor(resolvedAccent) - } + override fun onBind(data: Song) { + binding.song = data binding.songName.requestLayout() } diff --git a/app/src/main/java/org/oxycblt/auxio/library/adapters/LibraryAdapter.kt b/app/src/main/java/org/oxycblt/auxio/library/adapters/LibraryAdapter.kt index c2ff60ef2..f250fcbc0 100644 --- a/app/src/main/java/org/oxycblt/auxio/library/adapters/LibraryAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/library/adapters/LibraryAdapter.kt @@ -16,7 +16,7 @@ import org.oxycblt.auxio.recycler.viewholders.GenreViewHolder // It cannot display multiple ViewHolders *at once* however. That's what SearchAdapter is for. class LibraryAdapter( private val showMode: ShowMode, - private val doOnClick: (BaseModel) -> Unit + private val doOnClick: (data: BaseModel) -> Unit ) : RecyclerView.Adapter() { private var data: List diff --git a/app/src/main/java/org/oxycblt/auxio/library/adapters/SearchAdapter.kt b/app/src/main/java/org/oxycblt/auxio/library/adapters/SearchAdapter.kt index 2b16021b9..985e01a85 100644 --- a/app/src/main/java/org/oxycblt/auxio/library/adapters/SearchAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/library/adapters/SearchAdapter.kt @@ -17,7 +17,7 @@ import org.oxycblt.auxio.recycler.viewholders.HeaderViewHolder import org.oxycblt.auxio.recycler.viewholders.SongViewHolder class SearchAdapter( - private val doOnClick: (BaseModel) -> Unit + private val doOnClick: (data: BaseModel) -> Unit ) : ListAdapter(DiffCallback()) { override fun getItemViewType(position: Int): Int { diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt index 9fba5968d..d398e1537 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt @@ -15,7 +15,7 @@ import org.oxycblt.auxio.music.toDuration import kotlin.random.Random import kotlin.random.Random.Default.nextLong -// TODO: Editing/Adding to Queue +// TODO: Adding to Queue // TODO: Add the playback service itself // TODO: Add loop control [From playback] // TODO: Implement persistence through Bundles [I want to keep my shuffles, okay?] diff --git a/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueAdapter.kt b/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueAdapter.kt index e0eb9121c..99f2f5902 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueAdapter.kt @@ -28,8 +28,12 @@ class QueueAdapter( ) : BaseViewHolder(binding, null) { @SuppressLint("ClickableViewAccessibility") - override fun onBind(model: Song) { - binding.song = model + override fun onBind(data: Song) { + binding.song = data + + binding.songName.requestLayout() + binding.songInfo.requestLayout() + binding.songDragHandle.setOnTouchListener { _, motionEvent -> binding.songDragHandle.performClick() @@ -40,9 +44,6 @@ class QueueAdapter( false } - - binding.songName.requestLayout() - binding.songInfo.requestLayout() } } } diff --git a/app/src/main/java/org/oxycblt/auxio/recycler/viewholders/BaseViewHolder.kt b/app/src/main/java/org/oxycblt/auxio/recycler/viewholders/BaseViewHolder.kt index 0c7017ce2..72a248fd7 100644 --- a/app/src/main/java/org/oxycblt/auxio/recycler/viewholders/BaseViewHolder.kt +++ b/app/src/main/java/org/oxycblt/auxio/recycler/viewholders/BaseViewHolder.kt @@ -7,7 +7,7 @@ import org.oxycblt.auxio.music.BaseModel // ViewHolder abstraction that automates some of the things that are common for all ViewHolders. abstract class BaseViewHolder( private val baseBinding: ViewDataBinding, - private val doOnClick: ((T) -> Unit)? + private val doOnClick: ((data: T) -> Unit)? ) : RecyclerView.ViewHolder(baseBinding.root) { init { // Force the layout to *actually* be the screen width @@ -16,15 +16,17 @@ abstract class BaseViewHolder( ) } - fun bind(model: T) { - doOnClick?.let { - baseBinding.root.setOnClickListener { it(model) } + fun bind(data: T) { + doOnClick?.let { onClick -> + baseBinding.root.setOnClickListener { + onClick(data) + } } - onBind(model) + onBind(data) baseBinding.executePendingBindings() } - abstract fun onBind(model: T) + protected abstract fun onBind(data: T) } diff --git a/app/src/main/java/org/oxycblt/auxio/recycler/viewholders/ModelHolders.kt b/app/src/main/java/org/oxycblt/auxio/recycler/viewholders/ModelHolders.kt index b10ab2a43..10901c70b 100644 --- a/app/src/main/java/org/oxycblt/auxio/recycler/viewholders/ModelHolders.kt +++ b/app/src/main/java/org/oxycblt/auxio/recycler/viewholders/ModelHolders.kt @@ -17,12 +17,12 @@ import org.oxycblt.auxio.music.Song // All new instances should be created with from() instead of direct instantiation. class GenreViewHolder private constructor( - doOnClick: (Genre) -> Unit, - private val binding: ItemGenreBinding + private val binding: ItemGenreBinding, + doOnClick: (Genre) -> Unit ) : BaseViewHolder(binding, doOnClick) { - override fun onBind(model: Genre) { - binding.genre = model + override fun onBind(data: Genre) { + binding.genre = data binding.genreName.requestLayout() } @@ -31,20 +31,20 @@ class GenreViewHolder private constructor( fun from(context: Context, doOnClick: (Genre) -> Unit): GenreViewHolder { return GenreViewHolder( - doOnClick, - ItemGenreBinding.inflate(LayoutInflater.from(context)) + ItemGenreBinding.inflate(LayoutInflater.from(context)), + doOnClick ) } } } class ArtistViewHolder private constructor( + private val binding: ItemArtistBinding, doOnClick: (Artist) -> Unit, - private val binding: ItemArtistBinding ) : BaseViewHolder(binding, doOnClick) { - override fun onBind(model: Artist) { - binding.artist = model + override fun onBind(data: Artist) { + binding.artist = data binding.artistName.requestLayout() } @@ -53,30 +53,30 @@ class ArtistViewHolder private constructor( fun from(context: Context, doOnClick: (Artist) -> Unit): ArtistViewHolder { return ArtistViewHolder( - doOnClick, - ItemArtistBinding.inflate(LayoutInflater.from(context)) + ItemArtistBinding.inflate(LayoutInflater.from(context)), + doOnClick ) } } } class AlbumViewHolder private constructor( - doOnClick: (Album) -> Unit, - private val binding: ItemAlbumBinding + private val binding: ItemAlbumBinding, + doOnClick: (data: Album) -> Unit ) : BaseViewHolder(binding, doOnClick) { - override fun onBind(model: Album) { - binding.album = model + override fun onBind(data: Album) { + binding.album = data binding.albumName.requestLayout() } companion object { const val ITEM_TYPE = 12 - fun from(context: Context, doOnClick: (Album) -> Unit): AlbumViewHolder { + fun from(context: Context, doOnClick: (data: Album) -> Unit): AlbumViewHolder { return AlbumViewHolder( + ItemAlbumBinding.inflate(LayoutInflater.from(context)), doOnClick, - ItemAlbumBinding.inflate(LayoutInflater.from(context)) ) } } @@ -85,12 +85,12 @@ class AlbumViewHolder private constructor( // TODO: Add indicators to song recycler items when they're being played? class SongViewHolder private constructor( - doOnClick: (Song) -> Unit, - private val binding: ItemSongBinding + private val binding: ItemSongBinding, + doOnClick: (data: Song) -> Unit, ) : BaseViewHolder(binding, doOnClick) { - override fun onBind(model: Song) { - binding.song = model + override fun onBind(data: Song) { + binding.song = data binding.songName.requestLayout() binding.songInfo.requestLayout() @@ -99,10 +99,13 @@ class SongViewHolder private constructor( companion object { const val ITEM_TYPE = 13 - fun from(context: Context, doOnClick: (Song) -> Unit): SongViewHolder { + fun from( + context: Context, + doOnClick: (data: Song) -> Unit, + ): SongViewHolder { return SongViewHolder( - doOnClick, - ItemSongBinding.inflate(LayoutInflater.from(context)) + ItemSongBinding.inflate(LayoutInflater.from(context)), + doOnClick ) } } @@ -111,8 +114,9 @@ class SongViewHolder private constructor( class HeaderViewHolder( private val binding: ItemHeaderBinding ) : BaseViewHolder
(binding, null) { - override fun onBind(model: Header) { - binding.header = model + + override fun onBind(data: Header) { + binding.header = data } companion object { diff --git a/app/src/main/java/org/oxycblt/auxio/songs/SongAdapter.kt b/app/src/main/java/org/oxycblt/auxio/songs/SongAdapter.kt index 94a08e38a..e46738820 100644 --- a/app/src/main/java/org/oxycblt/auxio/songs/SongAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/songs/SongAdapter.kt @@ -7,7 +7,7 @@ import org.oxycblt.auxio.recycler.viewholders.SongViewHolder class SongAdapter( private val data: List, - private val doOnClick: (Song) -> Unit + private val doOnClick: (data: Song) -> Unit ) : RecyclerView.Adapter() { override fun getItemCount(): Int = data.size diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0747b22b6..66e334a28 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -26,6 +26,7 @@ Shuffle Play Queue + Add to queue Search Library…