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