From d8f40bfd2742dbdd54a54f8f467cd6a5e673fed3 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Tue, 13 Oct 2020 11:09:48 -0600 Subject: [PATCH] Replace ClickListener with lambdas Replace ClickListener with direct lambdas, so that adapters with multiple datatypes dont have to duplicate ClickListener for each type. --- .../java/org/oxycblt/auxio/MainFragment.kt | 5 --- .../auxio/detail/AlbumDetailFragment.kt | 9 ++-- .../auxio/detail/ArtistDetailFragment.kt | 17 ++++---- .../oxycblt/auxio/detail/DetailViewModel.kt | 41 +++++++++---------- .../auxio/detail/GenreDetailFragment.kt | 17 ++++---- .../detail/adapters/DetailAlbumAdapter.kt | 5 +-- .../detail/adapters/DetailArtistAdapter.kt | 5 +-- .../detail/adapters/DetailSongAdapter.kt | 5 +-- .../oxycblt/auxio/library/LibraryFragment.kt | 1 + .../auxio/library/adapters/LibraryAdapter.kt | 15 ++----- .../auxio/library/adapters/SearchAdapter.kt | 17 ++------ .../java/org/oxycblt/auxio/music/Models.kt | 1 - .../oxycblt/auxio/music/coil/MosaicFetcher.kt | 2 + .../auxio/music/processing/MusicLoader.kt | 2 +- .../auxio/music/processing/MusicSorter.kt | 3 +- .../auxio/playback/PlaybackFragment.kt | 6 ++- .../oxycblt/auxio/recycler/RecyclerUtils.kt | 3 -- .../recycler/viewholders/BaseViewHolder.kt | 10 ++--- .../recycler/viewholders/ModelHolders.kt | 33 ++++++++------- .../org/oxycblt/auxio/songs/SongAdapter.kt | 5 +-- .../org/oxycblt/auxio/songs/SongsFragment.kt | 10 ++--- .../org/oxycblt/auxio/theme/ThemeUtils.kt | 38 ++++++++--------- .../res/layout/fragment_compact_playback.xml | 2 +- app/src/main/res/layout/fragment_playback.xml | 1 + 24 files changed, 106 insertions(+), 147 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt index 89aca4140..15f772121 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt @@ -15,7 +15,6 @@ import com.google.android.material.tabs.TabLayoutMediator import org.oxycblt.auxio.databinding.FragmentMainBinding import org.oxycblt.auxio.library.LibraryFragment import org.oxycblt.auxio.music.MusicViewModel -import org.oxycblt.auxio.playback.PlaybackViewModel import org.oxycblt.auxio.songs.SongsFragment import org.oxycblt.auxio.theme.accent import org.oxycblt.auxio.theme.getInactiveAlpha @@ -27,8 +26,6 @@ class MainFragment : Fragment() { MusicViewModel.Factory(requireActivity().application) } - private val playbackModel: PlaybackViewModel by activityViewModels() - private val shownFragments = listOf(0, 1) private val tabIcons = listOf( R.drawable.ic_library, @@ -91,8 +88,6 @@ class MainFragment : Fragment() { } ) - // --- VIEWMODEL SETUP --- - Log.d(this::class.simpleName, "Fragment Created.") return binding.root 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 a6be69b87..6be7cd419 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt @@ -14,7 +14,6 @@ import org.oxycblt.auxio.databinding.FragmentAlbumDetailBinding import org.oxycblt.auxio.detail.adapters.DetailSongAdapter import org.oxycblt.auxio.music.MusicViewModel import org.oxycblt.auxio.playback.PlaybackViewModel -import org.oxycblt.auxio.recycler.ClickListener import org.oxycblt.auxio.theme.applyDivider import org.oxycblt.auxio.theme.disable @@ -45,11 +44,9 @@ class AlbumDetailFragment : Fragment() { ) } - val songAdapter = DetailSongAdapter( - ClickListener { - playbackModel.updateSong(it) - } - ) + val songAdapter = DetailSongAdapter { + playbackModel.updateSong(it) + } // --- UI SETUP --- 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 c2a2af799..93025cc97 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt @@ -12,7 +12,6 @@ import androidx.navigation.fragment.navArgs import org.oxycblt.auxio.databinding.FragmentArtistDetailBinding import org.oxycblt.auxio.detail.adapters.DetailAlbumAdapter import org.oxycblt.auxio.music.MusicViewModel -import org.oxycblt.auxio.recycler.ClickListener import org.oxycblt.auxio.theme.applyDivider import org.oxycblt.auxio.theme.disable @@ -45,17 +44,15 @@ class ArtistDetailFragment : Fragment() { ) } - val albumAdapter = DetailAlbumAdapter( - ClickListener { - if (!detailModel.isNavigating) { - detailModel.updateNavigationStatus(true) + val albumAdapter = DetailAlbumAdapter { + if (!detailModel.isNavigating) { + detailModel.updateNavigationStatus(true) - findNavController().navigate( - ArtistDetailFragmentDirections.actionShowAlbum(it.id, false) - ) - } + findNavController().navigate( + ArtistDetailFragmentDirections.actionShowAlbum(it.id, false) + ) } - ) + } // --- UI SETUP --- diff --git a/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt b/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt index d00943984..b70e57f65 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt @@ -12,7 +12,6 @@ import org.oxycblt.auxio.recycler.SortMode // TODO: // - Implement a system where the Toolbar will update with the info [And Media Controls] when // the main info of the detail fragment is removed. -// - Implement shared element transitions [If that is even possible] class DetailViewModel : ViewModel() { private var mIsNavigating = false val isNavigating: Boolean get() = mIsNavigating @@ -39,24 +38,8 @@ class DetailViewModel : ViewModel() { private val mNavToParent = MutableLiveData() val navToParent: LiveData get() = mNavToParent - fun updateGenre(genre: Genre) { - mCurrentGenre.value = genre - } - - fun updateArtist(artist: Artist) { - mCurrentArtist.value = artist - } - - fun updateAlbum(album: Album) { - mCurrentAlbum.value = album - } - - fun doNavToParent() { - mNavToParent.value = true - } - - fun doneWithNavToParent() { - mNavToParent.value = false + fun updateNavigationStatus(value: Boolean) { + mIsNavigating = value } fun incrementGenreSortMode() { @@ -88,7 +71,23 @@ class DetailViewModel : ViewModel() { } } - fun updateNavigationStatus(value: Boolean) { - mIsNavigating = value + fun updateGenre(genre: Genre) { + mCurrentGenre.value = genre + } + + fun updateArtist(artist: Artist) { + mCurrentArtist.value = artist + } + + fun updateAlbum(album: Album) { + mCurrentAlbum.value = album + } + + fun doNavToParent() { + mNavToParent.value = true + } + + fun doneWithNavToParent() { + mNavToParent.value = false } } diff --git a/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt b/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt index 32d256f58..1904b9c28 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt @@ -12,7 +12,6 @@ import androidx.navigation.fragment.navArgs import org.oxycblt.auxio.databinding.FragmentGenreDetailBinding import org.oxycblt.auxio.detail.adapters.DetailArtistAdapter import org.oxycblt.auxio.music.MusicViewModel -import org.oxycblt.auxio.recycler.ClickListener import org.oxycblt.auxio.theme.applyDivider import org.oxycblt.auxio.theme.disable @@ -42,17 +41,15 @@ class GenreDetailFragment : Fragment() { ) } - val artistAdapter = DetailArtistAdapter( - ClickListener { - if (!detailModel.isNavigating) { - detailModel.updateNavigationStatus(true) + val artistAdapter = DetailArtistAdapter { + if (!detailModel.isNavigating) { + detailModel.updateNavigationStatus(true) - findNavController().navigate( - GenreDetailFragmentDirections.actionShowArtist(it.id) - ) - } + findNavController().navigate( + GenreDetailFragmentDirections.actionShowArtist(it.id) + ) } - ) + } // --- UI SETUP --- 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 76ebc179b..6e633919e 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 @@ -5,12 +5,11 @@ import android.view.ViewGroup import androidx.recyclerview.widget.ListAdapter import org.oxycblt.auxio.databinding.ItemArtistAlbumBinding import org.oxycblt.auxio.music.Album -import org.oxycblt.auxio.recycler.ClickListener import org.oxycblt.auxio.recycler.DiffCallback import org.oxycblt.auxio.recycler.viewholders.BaseViewHolder class DetailAlbumAdapter( - private val listener: ClickListener + private val doOnClick: (Album) -> Unit ) : ListAdapter(DiffCallback()) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { @@ -26,7 +25,7 @@ class DetailAlbumAdapter( // Generic ViewHolder for a detail album inner class ViewHolder( private val binding: ItemArtistAlbumBinding - ) : BaseViewHolder(binding, listener) { + ) : BaseViewHolder(binding, doOnClick) { override fun onBind(model: Album) { binding.album = model 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 decbb63bf..1bacf5961 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 @@ -5,12 +5,11 @@ import android.view.ViewGroup import androidx.recyclerview.widget.ListAdapter import org.oxycblt.auxio.databinding.ItemGenreArtistBinding import org.oxycblt.auxio.music.Artist -import org.oxycblt.auxio.recycler.ClickListener import org.oxycblt.auxio.recycler.DiffCallback import org.oxycblt.auxio.recycler.viewholders.BaseViewHolder class DetailArtistAdapter( - private val listener: ClickListener + private val doOnClick: (Artist) -> Unit ) : ListAdapter(DiffCallback()) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { @@ -26,7 +25,7 @@ class DetailArtistAdapter( // Generic ViewHolder for an album inner class ViewHolder( private val binding: ItemGenreArtistBinding - ) : BaseViewHolder(binding, listener) { + ) : BaseViewHolder(binding, doOnClick) { override fun onBind(model: Artist) { binding.artist = model 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 5757a401a..151728f6b 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 @@ -5,12 +5,11 @@ import android.view.ViewGroup import androidx.recyclerview.widget.ListAdapter import org.oxycblt.auxio.databinding.ItemAlbumSongBinding import org.oxycblt.auxio.music.Song -import org.oxycblt.auxio.recycler.ClickListener import org.oxycblt.auxio.recycler.DiffCallback import org.oxycblt.auxio.recycler.viewholders.BaseViewHolder class DetailSongAdapter( - private val listener: ClickListener + private val doOnClick: (Song) -> Unit ) : ListAdapter(DiffCallback()) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { @@ -26,7 +25,7 @@ class DetailSongAdapter( // Generic ViewHolder for a song inner class ViewHolder( private val binding: ItemAlbumSongBinding - ) : BaseViewHolder(binding, listener) { + ) : BaseViewHolder(binding, doOnClick) { override fun onBind(model: Song) { binding.song = model diff --git a/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt b/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt index 0939c6593..652091c5f 100644 --- a/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt @@ -86,6 +86,7 @@ class LibraryFragment : Fragment(), SearchView.OnQueryTextListener { val searchView = item.actionView as SearchView searchView.queryHint = getString(R.string.hint_search_library) + searchView.maxWidth = Int.MAX_VALUE searchView.setOnQueryTextListener(this@LibraryFragment) searchView.setOnQueryTextFocusChangeListener { _, hasFocus -> libraryModel.updateSearchFocusStatus(hasFocus) 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 9bc0421a2..c2ff60ef2 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 @@ -6,7 +6,6 @@ import org.oxycblt.auxio.music.Album import org.oxycblt.auxio.music.Artist import org.oxycblt.auxio.music.BaseModel import org.oxycblt.auxio.music.Genre -import org.oxycblt.auxio.recycler.ClickListener import org.oxycblt.auxio.recycler.ShowMode import org.oxycblt.auxio.recycler.viewholders.AlbumViewHolder import org.oxycblt.auxio.recycler.viewholders.ArtistViewHolder @@ -20,12 +19,6 @@ class LibraryAdapter( private val doOnClick: (BaseModel) -> Unit ) : RecyclerView.Adapter() { - // Create separate listeners for each type, as ClickListeners can be converted - // to a type-specific form. - private val genreListener = ClickListener { doOnClick(it) } - private val artistListener = ClickListener { doOnClick(it) } - private val albumListener = ClickListener { doOnClick(it) } - private var data: List init { @@ -44,10 +37,10 @@ class LibraryAdapter( override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { // Return a different View Holder depending on the show type return when (showMode) { - ShowMode.SHOW_GENRES -> GenreViewHolder.from(parent.context, genreListener) - ShowMode.SHOW_ARTISTS -> ArtistViewHolder.from(parent.context, artistListener) - ShowMode.SHOW_ALBUMS -> AlbumViewHolder.from(parent.context, albumListener) - else -> ArtistViewHolder.from(parent.context, artistListener) + ShowMode.SHOW_GENRES -> GenreViewHolder.from(parent.context, doOnClick) + ShowMode.SHOW_ARTISTS -> ArtistViewHolder.from(parent.context, doOnClick) + ShowMode.SHOW_ALBUMS -> AlbumViewHolder.from(parent.context, doOnClick) + else -> ArtistViewHolder.from(parent.context, doOnClick) } } 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 541a821bc..2b16021b9 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 @@ -9,7 +9,6 @@ import org.oxycblt.auxio.music.BaseModel import org.oxycblt.auxio.music.Genre import org.oxycblt.auxio.music.Header import org.oxycblt.auxio.music.Song -import org.oxycblt.auxio.recycler.ClickListener import org.oxycblt.auxio.recycler.DiffCallback import org.oxycblt.auxio.recycler.viewholders.AlbumViewHolder import org.oxycblt.auxio.recycler.viewholders.ArtistViewHolder @@ -21,14 +20,6 @@ class SearchAdapter( private val doOnClick: (BaseModel) -> Unit ) : ListAdapter(DiffCallback()) { - // Create separate listeners for each type, as a BaseModel ClickListener cant be - // casted to a ClickListener of a class that inherits BaseModel. - // FIXME: Maybe there's a way for this to be improved? - private val genreListener = ClickListener { doOnClick(it) } - private val artistListener = ClickListener { doOnClick(it) } - private val albumListener = ClickListener { doOnClick(it) } - private val songListener = ClickListener { doOnClick(it) } - override fun getItemViewType(position: Int): Int { return when (getItem(position)) { is Genre -> GenreViewHolder.ITEM_TYPE @@ -41,10 +32,10 @@ class SearchAdapter( override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { return when (viewType) { - GenreViewHolder.ITEM_TYPE -> GenreViewHolder.from(parent.context, genreListener) - ArtistViewHolder.ITEM_TYPE -> ArtistViewHolder.from(parent.context, artistListener) - AlbumViewHolder.ITEM_TYPE -> AlbumViewHolder.from(parent.context, albumListener) - SongViewHolder.ITEM_TYPE -> SongViewHolder.from(parent.context, songListener) + GenreViewHolder.ITEM_TYPE -> GenreViewHolder.from(parent.context, doOnClick) + ArtistViewHolder.ITEM_TYPE -> ArtistViewHolder.from(parent.context, doOnClick) + AlbumViewHolder.ITEM_TYPE -> AlbumViewHolder.from(parent.context, doOnClick) + SongViewHolder.ITEM_TYPE -> SongViewHolder.from(parent.context, doOnClick) HeaderViewHolder.ITEM_TYPE -> HeaderViewHolder.from(parent.context) else -> HeaderViewHolder.from(parent.context) diff --git a/app/src/main/java/org/oxycblt/auxio/music/Models.kt b/app/src/main/java/org/oxycblt/auxio/music/Models.kt index 86fb03977..d7cb419c0 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/Models.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/Models.kt @@ -14,7 +14,6 @@ sealed class BaseModel { } // Song -// TODO: Maybe move durations to a solely-millis system data class Song( override val id: Long = -1, override var name: String, diff --git a/app/src/main/java/org/oxycblt/auxio/music/coil/MosaicFetcher.kt b/app/src/main/java/org/oxycblt/auxio/music/coil/MosaicFetcher.kt index 16c214637..91310379e 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/coil/MosaicFetcher.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/coil/MosaicFetcher.kt @@ -46,6 +46,8 @@ class MosaicFetcher(private val context: Context) : Fetcher> { if (streams.size < 4) { streams.forEach { it.close() } + // FIXME: What if all the streams fail? + return SourceResult( source = streams[0].source().buffer(), mimeType = context.contentResolver.getType(data[0]), 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 00669d1c2..932d1ed37 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 @@ -66,7 +66,7 @@ class MusicLoader( private fun loadGenres() { Log.d(this::class.simpleName, "Starting genre search...") - // First, get a ui_cursor for every genre in the android system + // First, get a cursor for every genre in the android system genreCursor = resolver.query( Genres.EXTERNAL_CONTENT_URI, arrayOf( 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 a6729c2d8..ee660cf28 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 @@ -35,7 +35,7 @@ class MusicSorter( for (album in albums) { // Find all songs that match the current album ID to prevent any bugs w/comparing names. - // This cant be done with artists/genres sadly. + // This cant be done anywhere else sadly. Blame the genre system. val albumSongs = songs.filter { it.albumId == album.id } // Then add them to the album @@ -50,7 +50,6 @@ class MusicSorter( // Any remaining songs will be added to an unknown album if (unknownSongs.size > 0) { - // Reuse an existing unknown album if one is found val unknownAlbum = Album( name = albumPlaceholder, artistName = artistPlaceholder diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt index ae88a4ab0..532d24218 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt @@ -21,6 +21,7 @@ class PlaybackFragment : Fragment(), SeekBar.OnSeekBarChangeListener { private val playbackModel: PlaybackViewModel by activityViewModels() // TODO: Implement media controls + // TODO: Make exit icon bigger // TODO: Implement nav to artists/albums // TODO: Possibly implement a trackbar with a spectrum shown as well. override fun onCreateView( @@ -53,6 +54,7 @@ class PlaybackFragment : Fragment(), SeekBar.OnSeekBarChangeListener { // Make marquee scroll work binding.playbackSong.isSelected = true + binding.playbackSeekBar.setOnSeekBarChangeListener(this) // --- VIEWMODEL SETUP -- @@ -103,7 +105,9 @@ class PlaybackFragment : Fragment(), SeekBar.OnSeekBarChangeListener { // Seeking callbacks override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { - playbackModel.updateCurrentDurationWithProgress(progress) + if (fromUser) { + playbackModel.updateCurrentDurationWithProgress(progress) + } } override fun onStartTrackingTouch(seekBar: SeekBar) { diff --git a/app/src/main/java/org/oxycblt/auxio/recycler/RecyclerUtils.kt b/app/src/main/java/org/oxycblt/auxio/recycler/RecyclerUtils.kt index d52f25349..db2a586df 100644 --- a/app/src/main/java/org/oxycblt/auxio/recycler/RecyclerUtils.kt +++ b/app/src/main/java/org/oxycblt/auxio/recycler/RecyclerUtils.kt @@ -3,9 +3,6 @@ package org.oxycblt.auxio.recycler import androidx.recyclerview.widget.DiffUtil import org.oxycblt.auxio.music.BaseModel -// RecyclerView click listener -class ClickListener(val onClick: (T) -> Unit) - // Base Diff callback class DiffCallback : DiffUtil.ItemCallback() { override fun areContentsTheSame(oldItem: T, newItem: T): Boolean { 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 62eb6fe61..d405448ab 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 @@ -3,13 +3,11 @@ package org.oxycblt.auxio.recycler.viewholders import androidx.databinding.ViewDataBinding import androidx.recyclerview.widget.RecyclerView import org.oxycblt.auxio.music.BaseModel -import org.oxycblt.auxio.recycler.ClickListener // ViewHolder abstraction that automates some of the things that are common for all ViewHolders. -// TODO: Implement some kind of abstraction for BaseViewHolder.from() abstract class BaseViewHolder( private val baseBinding: ViewDataBinding, - protected val listener: ClickListener? + private val doOnClick: ((T) -> Unit)? ) : RecyclerView.ViewHolder(baseBinding.root) { init { baseBinding.root.layoutParams = RecyclerView.LayoutParams( @@ -18,10 +16,8 @@ abstract class BaseViewHolder( } fun bind(model: T) { - if (listener != null) { - baseBinding.root.setOnClickListener { - listener.onClick(model) - } + doOnClick?.let { + baseBinding.root.setOnClickListener { it(model) } } onBind(model) 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 427a7af6a..c59af94f3 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 @@ -12,15 +12,14 @@ import org.oxycblt.auxio.music.Artist import org.oxycblt.auxio.music.Genre import org.oxycblt.auxio.music.Header import org.oxycblt.auxio.music.Song -import org.oxycblt.auxio.recycler.ClickListener // Shared ViewHolders for each ViewModel, providing basic information // All new instances should be created with from() instead of direct instantiation. class GenreViewHolder private constructor( - listener: ClickListener, + doOnClick: (Genre) -> Unit, private val binding: ItemGenreBinding -) : BaseViewHolder(binding, listener) { +) : BaseViewHolder(binding, doOnClick) { override fun onBind(model: Genre) { binding.genre = model @@ -30,9 +29,9 @@ class GenreViewHolder private constructor( companion object { const val ITEM_TYPE = 10 - fun from(context: Context, listener: ClickListener): GenreViewHolder { + fun from(context: Context, doOnClick: (Genre) -> Unit): GenreViewHolder { return GenreViewHolder( - ClickListener { listener.onClick(it) }, + doOnClick, ItemGenreBinding.inflate(LayoutInflater.from(context)) ) } @@ -40,9 +39,9 @@ class GenreViewHolder private constructor( } class ArtistViewHolder private constructor( - listener: ClickListener, + doOnClick: (Artist) -> Unit, private val binding: ItemArtistBinding -) : BaseViewHolder(binding, listener) { +) : BaseViewHolder(binding, doOnClick) { override fun onBind(model: Artist) { binding.artist = model @@ -52,9 +51,9 @@ class ArtistViewHolder private constructor( companion object { const val ITEM_TYPE = 11 - fun from(context: Context, listener: ClickListener): ArtistViewHolder { + fun from(context: Context, doOnClick: (Artist) -> Unit): ArtistViewHolder { return ArtistViewHolder( - ClickListener { listener.onClick(it) }, + doOnClick, ItemArtistBinding.inflate(LayoutInflater.from(context)) ) } @@ -62,9 +61,9 @@ class ArtistViewHolder private constructor( } class AlbumViewHolder private constructor( - listener: ClickListener, + doOnClick: (Album) -> Unit, private val binding: ItemAlbumBinding -) : BaseViewHolder(binding, listener) { +) : BaseViewHolder(binding, doOnClick) { override fun onBind(model: Album) { binding.album = model @@ -74,9 +73,9 @@ class AlbumViewHolder private constructor( companion object { const val ITEM_TYPE = 12 - fun from(context: Context, listener: ClickListener): AlbumViewHolder { + fun from(context: Context, doOnClick: (Album) -> Unit): AlbumViewHolder { return AlbumViewHolder( - listener, + doOnClick, ItemAlbumBinding.inflate(LayoutInflater.from(context)) ) } @@ -86,9 +85,9 @@ class AlbumViewHolder private constructor( // TODO: Add indicators to song recycler items when they're being played. class SongViewHolder private constructor( - listener: ClickListener, + doOnClick: (Song) -> Unit, private val binding: ItemSongBinding -) : BaseViewHolder(binding, listener) { +) : BaseViewHolder(binding, doOnClick) { override fun onBind(model: Song) { binding.song = model @@ -100,9 +99,9 @@ class SongViewHolder private constructor( companion object { const val ITEM_TYPE = 13 - fun from(context: Context, listener: ClickListener): SongViewHolder { + fun from(context: Context, doOnClick: (Song) -> Unit): SongViewHolder { return SongViewHolder( - listener, + doOnClick, ItemSongBinding.inflate(LayoutInflater.from(context)) ) } 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 98b6f2376..94a08e38a 100644 --- a/app/src/main/java/org/oxycblt/auxio/songs/SongAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/songs/SongAdapter.kt @@ -3,18 +3,17 @@ package org.oxycblt.auxio.songs import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import org.oxycblt.auxio.music.Song -import org.oxycblt.auxio.recycler.ClickListener import org.oxycblt.auxio.recycler.viewholders.SongViewHolder class SongAdapter( private val data: List, - private val listener: ClickListener + private val doOnClick: (Song) -> Unit ) : RecyclerView.Adapter() { override fun getItemCount(): Int = data.size override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SongViewHolder { - return SongViewHolder.from(parent.context, listener) + return SongViewHolder.from(parent.context, doOnClick) } override fun onBindViewHolder(holder: SongViewHolder, position: Int) { diff --git a/app/src/main/java/org/oxycblt/auxio/songs/SongsFragment.kt b/app/src/main/java/org/oxycblt/auxio/songs/SongsFragment.kt index ff3e47cc1..ae3a3ba25 100644 --- a/app/src/main/java/org/oxycblt/auxio/songs/SongsFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/songs/SongsFragment.kt @@ -10,7 +10,6 @@ import androidx.fragment.app.activityViewModels import org.oxycblt.auxio.databinding.FragmentSongsBinding import org.oxycblt.auxio.music.MusicViewModel import org.oxycblt.auxio.playback.PlaybackViewModel -import org.oxycblt.auxio.recycler.ClickListener import org.oxycblt.auxio.theme.applyDivider class SongsFragment : Fragment() { @@ -33,12 +32,9 @@ class SongsFragment : Fragment() { // --- UI SETUP --- binding.songRecycler.apply { - adapter = SongAdapter( - musicModel.songs.value!!, - ClickListener { song -> - playbackModel.updateSong(song) - } - ) + adapter = SongAdapter(musicModel.songs.value!!) { + playbackModel.updateSong(it) + } applyDivider() setHasFixedSize(true) } diff --git a/app/src/main/java/org/oxycblt/auxio/theme/ThemeUtils.kt b/app/src/main/java/org/oxycblt/auxio/theme/ThemeUtils.kt index eed82467a..592d0586f 100644 --- a/app/src/main/java/org/oxycblt/auxio/theme/ThemeUtils.kt +++ b/app/src/main/java/org/oxycblt/auxio/theme/ThemeUtils.kt @@ -19,25 +19,25 @@ import org.oxycblt.auxio.R // Pairs of the base accent and its theme private val ACCENTS = listOf( - Pair(R.color.red, R.style.Theme_Red), - Pair(R.color.pink, R.style.Theme_Pink), - Pair(R.color.purple, R.style.Theme_Purple), - Pair(R.color.deep_purple, R.style.Theme_DeepPurple), - Pair(R.color.indigo, R.style.Theme_Indigo), - Pair(R.color.blue, R.style.Theme_Blue), - Pair(R.color.light_blue, R.style.Theme_Blue), - Pair(R.color.cyan, R.style.Theme_Cyan), - Pair(R.color.teal, R.style.Theme_Teal), - Pair(R.color.green, R.style.Theme_Green), - Pair(R.color.light_green, R.style.Theme_LightGreen), - Pair(R.color.lime, R.style.Theme_Lime), - Pair(R.color.yellow, R.style.Theme_Yellow), - Pair(R.color.amber, R.style.Theme_Amber), - Pair(R.color.orange, R.style.Theme_Orange), - Pair(R.color.deep_orange, R.style.Theme_DeepOrange), - Pair(R.color.brown, R.style.Theme_Brown), - Pair(R.color.grey, R.style.Theme_Gray), - Pair(R.color.blue_grey, R.style.Theme_BlueGrey) + Pair(R.color.red, R.style.Theme_Red), // 0 + Pair(R.color.pink, R.style.Theme_Pink), // 1 + Pair(R.color.purple, R.style.Theme_Purple), // 2 + Pair(R.color.deep_purple, R.style.Theme_DeepPurple), // 3 + Pair(R.color.indigo, R.style.Theme_Indigo), // 4 + Pair(R.color.blue, R.style.Theme_Blue), // 5 + Pair(R.color.light_blue, R.style.Theme_Blue), // 6 + Pair(R.color.cyan, R.style.Theme_Cyan), // 7 + Pair(R.color.teal, R.style.Theme_Teal), // 8 + Pair(R.color.green, R.style.Theme_Green), // 9 + Pair(R.color.light_green, R.style.Theme_LightGreen), // 10 + Pair(R.color.lime, R.style.Theme_Lime), // 11 + Pair(R.color.yellow, R.style.Theme_Yellow), // 12 + Pair(R.color.amber, R.style.Theme_Amber), // 13 + Pair(R.color.orange, R.style.Theme_Orange), // 14 + Pair(R.color.deep_orange, R.style.Theme_DeepOrange), // 15 + Pair(R.color.brown, R.style.Theme_Brown), // 16 + Pair(R.color.grey, R.style.Theme_Gray), // 17 + Pair(R.color.blue_grey, R.style.Theme_BlueGrey) // 18 ) val accent = ACCENTS[5] diff --git a/app/src/main/res/layout/fragment_compact_playback.xml b/app/src/main/res/layout/fragment_compact_playback.xml index 71711b2f9..976bcf154 100644 --- a/app/src/main/res/layout/fragment_compact_playback.xml +++ b/app/src/main/res/layout/fragment_compact_playback.xml @@ -96,7 +96,7 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" tools:src="@drawable/ic_play_to_pause" - tools:tint="@color/control_color" /> + android:tint="@color/control_color" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_playback.xml b/app/src/main/res/layout/fragment_playback.xml index 8f18348c2..8c98e4678 100644 --- a/app/src/main/res/layout/fragment_playback.xml +++ b/app/src/main/res/layout/fragment_playback.xml @@ -40,6 +40,7 @@ android:layout_width="0dp" android:layout_height="0dp" android:layout_margin="@dimen/margin_mid_large" + android:elevation="4dp" android:contentDescription="@{@string/description_album_cover(song.name)}" app:coverArt="@{song}" app:layout_constraintBottom_toTopOf="@+id/playback_song"