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 bdb8f68e8..147fbf8eb 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt @@ -44,7 +44,7 @@ class AlbumDetailFragment : DetailFragment() { } val detailAdapter = AlbumDetailAdapter( - detailModel, viewLifecycleOwner, + detailModel, playbackModel, viewLifecycleOwner, doOnClick = { playbackModel.playSong(it, PlaybackMode.IN_ALBUM) }, doOnLongClick = { data, view -> PopupMenu(requireContext(), view).setupAlbumSongActions( @@ -57,23 +57,8 @@ class AlbumDetailFragment : DetailFragment() { binding.lifecycleOwner = this - setupToolbar(R.menu.menu_album_actions) { + setupToolbar(R.menu.menu_album_detail) { when (it) { - R.id.action_shuffle -> { - playbackModel.playAlbum( - detailModel.currentAlbum.value!!, true - ) - - true - } - R.id.action_play -> { - playbackModel.playAlbum( - detailModel.currentAlbum.value!!, false - ) - - true - } - R.id.action_queue_add -> { playbackModel.addToUserQueue(detailModel.currentAlbum.value!!) getString(R.string.label_queue_added).createToast(requireContext()) 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 af5cd0c5a..79b33a29b 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt @@ -7,7 +7,6 @@ import android.view.ViewGroup import androidx.appcompat.widget.PopupMenu import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs -import org.oxycblt.auxio.R import org.oxycblt.auxio.detail.adapters.ArtistDetailAdapter import org.oxycblt.auxio.logD import org.oxycblt.auxio.music.Album @@ -43,7 +42,7 @@ class ArtistDetailFragment : DetailFragment() { } val detailAdapter = ArtistDetailAdapter( - detailModel, viewLifecycleOwner, + detailModel, playbackModel, viewLifecycleOwner, doOnClick = { if (!detailModel.isNavigating) { detailModel.updateNavigationStatus(true) @@ -64,29 +63,7 @@ class ArtistDetailFragment : DetailFragment() { binding.lifecycleOwner = this - setupToolbar(R.menu.menu_artist_actions) { - when (it) { - R.id.action_shuffle -> { - playbackModel.playArtist( - detailModel.currentArtist.value!!, - true - ) - - true - } - - R.id.action_play_albums -> { - playbackModel.playArtist( - detailModel.currentArtist.value!!, false - ) - - true - } - - else -> false - } - } - + setupToolbar() setupRecycler(detailAdapter) // --- VIEWMODEL SETUP --- diff --git a/app/src/main/java/org/oxycblt/auxio/detail/DetailFragment.kt b/app/src/main/java/org/oxycblt/auxio/detail/DetailFragment.kt index fc0e46f24..83f2c2268 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/DetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/DetailFragment.kt @@ -47,16 +47,23 @@ abstract class DetailFragment : Fragment() { /** * Shortcut method for doing setup of the detail toolbar. */ - protected fun setupToolbar(@MenuRes menu: Int, onMenuClick: (id: Int) -> Boolean) { + protected fun setupToolbar( + @MenuRes menu: Int = -1, + onMenuClick: ((id: Int) -> Boolean)? = null + ) { binding.detailToolbar.apply { - inflateMenu(menu) + if (menu != -1) { + inflateMenu(menu) + } setNavigationOnClickListener { findNavController().navigateUp() } - setOnMenuItemClickListener { - onMenuClick(it.itemId) + onMenuClick?.let { + setOnMenuItemClickListener { + it(it.itemId) + } } } } 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 749e2dea8..29244946a 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt @@ -7,7 +7,6 @@ import android.view.ViewGroup import androidx.appcompat.widget.PopupMenu import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs -import org.oxycblt.auxio.R import org.oxycblt.auxio.detail.adapters.GenreDetailAdapter import org.oxycblt.auxio.logD import org.oxycblt.auxio.music.Album @@ -42,7 +41,7 @@ class GenreDetailFragment : DetailFragment() { } val detailAdapter = GenreDetailAdapter( - detailModel, viewLifecycleOwner, + detailModel, playbackModel, viewLifecycleOwner, doOnClick = { playbackModel.playSong(it, PlaybackMode.IN_GENRE) }, @@ -57,21 +56,7 @@ class GenreDetailFragment : DetailFragment() { binding.lifecycleOwner = this - setupToolbar(R.menu.menu_genre_actions) { - when (it) { - R.id.action_shuffle -> { - playbackModel.playGenre( - detailModel.currentGenre.value!!, - true - ) - - true - } - - else -> false - } - } - + setupToolbar() setupRecycler(detailAdapter) // --- DETAILVIEWMODEL SETUP --- diff --git a/app/src/main/java/org/oxycblt/auxio/detail/adapters/AlbumDetailAdapter.kt b/app/src/main/java/org/oxycblt/auxio/detail/adapters/AlbumDetailAdapter.kt index feabe7ed1..cba0d8969 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/adapters/AlbumDetailAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/adapters/AlbumDetailAdapter.kt @@ -1,29 +1,34 @@ package org.oxycblt.auxio.detail.adapters +import android.content.res.ColorStateList import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView +import org.oxycblt.auxio.R import org.oxycblt.auxio.databinding.ItemAlbumHeaderBinding import org.oxycblt.auxio.databinding.ItemAlbumSongBinding import org.oxycblt.auxio.detail.DetailViewModel import org.oxycblt.auxio.music.Album import org.oxycblt.auxio.music.BaseModel import org.oxycblt.auxio.music.Song +import org.oxycblt.auxio.playback.PlaybackViewModel import org.oxycblt.auxio.recycler.DiffCallback import org.oxycblt.auxio.recycler.viewholders.BaseViewHolder import org.oxycblt.auxio.recycler.viewholders.Highlightable import org.oxycblt.auxio.ui.accent import org.oxycblt.auxio.ui.disable import org.oxycblt.auxio.ui.setTextColorResource +import org.oxycblt.auxio.ui.toColor /** * An adapter for displaying the details and [Song]s of an [Album] */ class AlbumDetailAdapter( private val detailModel: DetailViewModel, + private val playbackModel: PlaybackViewModel, private val lifecycleOwner: LifecycleOwner, private val doOnClick: (data: Song) -> Unit, private val doOnLongClick: (data: Song, view: View) -> Unit @@ -109,8 +114,25 @@ class AlbumDetailAdapter( override fun onBind(data: Album) { binding.album = data binding.detailModel = detailModel + binding.playbackModel = playbackModel binding.lifecycleOwner = lifecycleOwner + // Apply the accent programmatically since I don't want to deal the with the + // nightmarish mess of switching out my styling to Material + val accent = accent.first.toColor(binding.albumShuffleButton.context) + val selection = ColorStateList.valueOf( + R.color.selection_color.toColor(binding.albumShuffleButton.context) + ) + + binding.albumShuffleButton.apply { + backgroundTintList = ColorStateList.valueOf(accent) + rippleColor = selection + } + binding.albumPlayButton.apply { + setTextColor(accent) + rippleColor = selection + } + if (data.songs.size < 2) { binding.albumSortButton.disable() } diff --git a/app/src/main/java/org/oxycblt/auxio/detail/adapters/ArtistDetailAdapter.kt b/app/src/main/java/org/oxycblt/auxio/detail/adapters/ArtistDetailAdapter.kt index 6cb601374..e58b75a8f 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/adapters/ArtistDetailAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/adapters/ArtistDetailAdapter.kt @@ -1,29 +1,34 @@ package org.oxycblt.auxio.detail.adapters +import android.content.res.ColorStateList import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView +import org.oxycblt.auxio.R import org.oxycblt.auxio.databinding.ItemArtistAlbumBinding import org.oxycblt.auxio.databinding.ItemArtistHeaderBinding import org.oxycblt.auxio.detail.DetailViewModel import org.oxycblt.auxio.music.Album import org.oxycblt.auxio.music.Artist import org.oxycblt.auxio.music.BaseModel +import org.oxycblt.auxio.playback.PlaybackViewModel import org.oxycblt.auxio.recycler.DiffCallback import org.oxycblt.auxio.recycler.viewholders.BaseViewHolder import org.oxycblt.auxio.recycler.viewholders.Highlightable import org.oxycblt.auxio.ui.accent import org.oxycblt.auxio.ui.disable import org.oxycblt.auxio.ui.setTextColorResource +import org.oxycblt.auxio.ui.toColor /** * An adapter for displaying the [Album]s of an artist. */ class ArtistDetailAdapter( private val detailModel: DetailViewModel, + private val playbackModel: PlaybackViewModel, private val lifecycleOwner: LifecycleOwner, private val doOnClick: (data: Album) -> Unit, private val doOnLongClick: (data: Album, view: View) -> Unit, @@ -108,8 +113,26 @@ class ArtistDetailAdapter( override fun onBind(data: Artist) { binding.artist = data binding.detailModel = detailModel + binding.playbackModel = playbackModel binding.lifecycleOwner = lifecycleOwner + // Apply the accent programmatically since I don't want to deal the with the + // nightmarish mess of switching out my styling to Material + val accent = accent.first.toColor(binding.artistShuffleButton.context) + val selection = ColorStateList.valueOf( + R.color.selection_color.toColor(binding.artistShuffleButton.context) + ) + + binding.artistShuffleButton.apply { + backgroundTintList = ColorStateList.valueOf(accent) + rippleColor = selection + } + + binding.artistPlayButton.apply { + setTextColor(accent) + rippleColor = selection + } + if (data.albums.size < 2) { binding.artistSortButton.disable() } diff --git a/app/src/main/java/org/oxycblt/auxio/detail/adapters/GenreDetailAdapter.kt b/app/src/main/java/org/oxycblt/auxio/detail/adapters/GenreDetailAdapter.kt index af3868147..2a1f8094b 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/adapters/GenreDetailAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/adapters/GenreDetailAdapter.kt @@ -1,29 +1,34 @@ package org.oxycblt.auxio.detail.adapters +import android.content.res.ColorStateList import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView +import org.oxycblt.auxio.R import org.oxycblt.auxio.databinding.ItemGenreHeaderBinding import org.oxycblt.auxio.databinding.ItemGenreSongBinding import org.oxycblt.auxio.detail.DetailViewModel import org.oxycblt.auxio.music.BaseModel import org.oxycblt.auxio.music.Genre import org.oxycblt.auxio.music.Song +import org.oxycblt.auxio.playback.PlaybackViewModel import org.oxycblt.auxio.recycler.DiffCallback import org.oxycblt.auxio.recycler.viewholders.BaseViewHolder import org.oxycblt.auxio.recycler.viewholders.Highlightable import org.oxycblt.auxio.ui.accent import org.oxycblt.auxio.ui.disable import org.oxycblt.auxio.ui.setTextColorResource +import org.oxycblt.auxio.ui.toColor /** * An adapter for displaying the [Song]s of a genre. */ class GenreDetailAdapter( private val detailModel: DetailViewModel, + private val playbackModel: PlaybackViewModel, private val lifecycleOwner: LifecycleOwner, private val doOnClick: (data: Song) -> Unit, private val doOnLongClick: (data: Song, view: View) -> Unit @@ -109,8 +114,26 @@ class GenreDetailAdapter( override fun onBind(data: Genre) { binding.genre = data binding.detailModel = detailModel + binding.playbackModel = playbackModel binding.lifecycleOwner = lifecycleOwner + // Apply the accent programmatically since I don't want to deal the with the + // nightmarish mess of switching out my styling to Material + val accent = accent.first.toColor(binding.genreShuffleButton.context) + val selection = ColorStateList.valueOf( + R.color.selection_color.toColor(binding.genreShuffleButton.context) + ) + + binding.genreShuffleButton.apply { + backgroundTintList = ColorStateList.valueOf(accent) + rippleColor = selection + } + + binding.genrePlayButton.apply { + setTextColor(accent) + rippleColor = selection + } + if (data.songs.size < 2) { binding.genreSortButton.disable() } diff --git a/app/src/main/res/layout-land/item_album_header.xml b/app/src/main/res/layout-land/item_album_header.xml index 5844dfe25..ecd272f17 100644 --- a/app/src/main/res/layout-land/item_album_header.xml +++ b/app/src/main/res/layout-land/item_album_header.xml @@ -5,13 +5,17 @@ + + + name="playbackModel" + type="org.oxycblt.auxio.playback.PlaybackViewModel" /> @@ -72,18 +76,40 @@ android:textAppearance="?android:attr/textAppearanceListItem" android:textColor="?android:attr/textColorSecondary" app:albumDetails="@{album}" - app:layout_constraintBottom_toTopOf="@+id/album_song_header" + app:layout_constraintBottom_toBottomOf="@+id/album_cover" app:layout_constraintStart_toEndOf="@+id/album_cover" app:layout_constraintTop_toBottomOf="@+id/album_artist" tools:text="2020 / 10 Songs / 16:16" /> + + + + + app:layout_constraintTop_toBottomOf="@+id/album_play_button" /> + + @@ -67,18 +71,40 @@ android:textAppearance="?android:attr/textAppearanceListItem" android:textColor="?android:attr/textColorSecondary" app:artistCounts="@{artist}" - app:layout_constraintBottom_toTopOf="@+id/artist_album_header" + app:layout_constraintBottom_toBottomOf="@+id/artist_image" app:layout_constraintStart_toEndOf="@+id/artist_image" app:layout_constraintTop_toBottomOf="@+id/artist_genre" tools:text="2 Albums, 20 Songs" /> + + + + + app:layout_constraintTop_toBottomOf="@+id/artist_play_button" /> + @@ -60,6 +63,28 @@ app:layout_constraintTop_toBottomOf="@+id/genre_name" tools:text="2 Artists, 4 Albums" /> + + + + @@ -76,10 +101,10 @@ + app:layout_constraintTop_toBottomOf="@+id/genre_play_button" /> + + + name="playbackModel" + type="org.oxycblt.auxio.playback.PlaybackViewModel" /> + + + + + app:layout_constraintTop_toBottomOf="@+id/album_play_button" /> + + + + + + + app:layout_constraintTop_toBottomOf="@+id/artist_play_button" /> + + + + + + + app:layout_constraintTop_toBottomOf="@+id/genre_play_button" /> + + + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index f108afbe2..613448633 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -180,4 +180,38 @@ + + + + + + \ No newline at end of file