Change sorting menu to dedicated action

Make the sorting menu on LibraryFragment an action instead of just some things in the overflow menu to improve consistency and accesibility.
This commit is contained in:
OxygenCobalt 2021-01-03 12:03:35 -07:00
parent 260e7f71cf
commit ee1d05d347
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
5 changed files with 70 additions and 52 deletions

View file

@ -7,7 +7,6 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.PopupMenu
import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView
import androidx.core.content.ContextCompat
import androidx.core.view.forEach import androidx.core.view.forEach
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
@ -29,6 +28,7 @@ import org.oxycblt.auxio.music.Header
import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.playback.PlaybackViewModel import org.oxycblt.auxio.playback.PlaybackViewModel
import org.oxycblt.auxio.settings.SettingsManager import org.oxycblt.auxio.settings.SettingsManager
import org.oxycblt.auxio.ui.accent
import org.oxycblt.auxio.ui.applyColor import org.oxycblt.auxio.ui.applyColor
import org.oxycblt.auxio.ui.getLandscapeSpans import org.oxycblt.auxio.ui.getLandscapeSpans
import org.oxycblt.auxio.ui.isLandscape import org.oxycblt.auxio.ui.isLandscape
@ -37,6 +37,7 @@ import org.oxycblt.auxio.ui.setupAlbumActions
import org.oxycblt.auxio.ui.setupArtistActions import org.oxycblt.auxio.ui.setupArtistActions
import org.oxycblt.auxio.ui.setupGenreActions import org.oxycblt.auxio.ui.setupGenreActions
import org.oxycblt.auxio.ui.setupSongActions import org.oxycblt.auxio.ui.setupSongActions
import org.oxycblt.auxio.ui.toColor
/** /**
* A [Fragment] that shows a custom list of [Genre], [Artist], or [Album] data. Also allows for * A [Fragment] that shows a custom list of [Genre], [Artist], or [Album] data. Also allows for
@ -57,51 +58,45 @@ class LibraryFragment : Fragment(), SearchView.OnQueryTextListener {
): View { ): View {
val binding = FragmentLibraryBinding.inflate(inflater) val binding = FragmentLibraryBinding.inflate(inflater)
val libraryAdapter = LibraryAdapter( val libraryAdapter = LibraryAdapter(::onItemSelection, ::showActionsForItem)
doOnClick = this::onItemSelection, val searchAdapter = SearchAdapter(::onItemSelection, ::showActionsForItem)
doOnLongClick = this::showActionsForItem
)
val searchAdapter = SearchAdapter( val sortAction = binding.libraryToolbar.menu.findItem(R.id.submenu_sorting)
doOnClick = this::onItemSelection,
doOnLongClick = this::showActionsForItem
)
// --- UI SETUP --- // --- UI SETUP ---
binding.libraryToolbar.apply { binding.libraryToolbar.apply {
overflowIcon = ContextCompat.getDrawable(
requireContext(), R.drawable.ic_sort_none
)
setOnMenuItemClickListener { setOnMenuItemClickListener {
if (it.itemId != R.id.action_search) { when (it.itemId) {
libraryModel.updateSortMode(it.itemId) R.id.action_search -> {
} else { TransitionManager.beginDelayedTransition(
// Then also do a basic animation on the enter transition. Not done on exit binding.libraryToolbar, Fade()
// because that causes issues with the SearchView. )
TransitionManager.beginDelayedTransition( it.expandActionView()
binding.libraryToolbar, Fade() }
)
it.expandActionView() R.id.submenu_sorting -> {
}
else -> libraryModel.updateSortMode(it.itemId)
} }
true true
} }
menu.apply { menu.apply {
val item = findItem(R.id.action_search) val searchAction = findItem(R.id.action_search)
val searchView = item.actionView as SearchView val searchView = searchAction.actionView as SearchView
searchView.queryHint = getString(R.string.hint_search_library) searchView.queryHint = getString(R.string.hint_search_library)
searchView.maxWidth = Int.MAX_VALUE searchView.maxWidth = Int.MAX_VALUE
searchView.setOnQueryTextListener(this@LibraryFragment) searchView.setOnQueryTextListener(this@LibraryFragment)
item.setOnActionExpandListener(object : MenuItem.OnActionExpandListener { searchAction.setOnActionExpandListener(object : MenuItem.OnActionExpandListener {
override fun onMenuItemActionExpand(item: MenuItem): Boolean { override fun onMenuItemActionExpand(item: MenuItem): Boolean {
binding.libraryRecycler.adapter = searchAdapter binding.libraryRecycler.adapter = searchAdapter
setGroupVisible(R.id.group_sorting, false)
item.isVisible = false item.isVisible = false
sortAction.isVisible = false
libraryModel.resetQuery() libraryModel.resetQuery()
@ -110,8 +105,8 @@ class LibraryFragment : Fragment(), SearchView.OnQueryTextListener {
override fun onMenuItemActionCollapse(item: MenuItem): Boolean { override fun onMenuItemActionCollapse(item: MenuItem): Boolean {
binding.libraryRecycler.adapter = libraryAdapter binding.libraryRecycler.adapter = libraryAdapter
setGroupVisible(R.id.group_sorting, true)
item.isVisible = true item.isVisible = true
sortAction.isVisible = true
libraryModel.resetQuery() libraryModel.resetQuery()
@ -157,10 +152,13 @@ class LibraryFragment : Fragment(), SearchView.OnQueryTextListener {
libraryModel.sortMode.observe(viewLifecycleOwner) { mode -> libraryModel.sortMode.observe(viewLifecycleOwner) { mode ->
logD("Updating sort mode to $mode") logD("Updating sort mode to $mode")
// Then update the menu item in the toolbar to reflect the new mode val modeId = mode.toMenuId()
binding.libraryToolbar.menu.forEach {
if (it.itemId == libraryModel.sortMode.value!!.toMenuId()) { // Highlight the item instead of using a checkable since the checkables just...wont
it.applyColor(resolveAttr(requireContext(), R.attr.colorPrimary)) // respond to any attempts to make them checked or not.
sortAction.subMenu.forEach {
if (it.itemId == modeId) {
it.applyColor(accent.first.toColor(requireContext()))
} else { } else {
it.applyColor(resolveAttr(requireContext(), android.R.attr.textColorPrimary)) it.applyColor(resolveAttr(requireContext(), android.R.attr.textColorPrimary))
} }

View file

@ -235,6 +235,11 @@ fun PopupMenu.setupArtistActions(artist: Artist, playbackModel: PlaybackViewMode
fun PopupMenu.setupGenreActions(genre: Genre, playbackModel: PlaybackViewModel) { fun PopupMenu.setupGenreActions(genre: Genre, playbackModel: PlaybackViewModel) {
setOnMenuItemClickListener { setOnMenuItemClickListener {
when (it.itemId) { when (it.itemId) {
R.id.action_play -> {
playbackModel.playGenre(genre, true)
true
}
R.id.action_shuffle -> { R.id.action_shuffle -> {
playbackModel.playGenre(genre, true) playbackModel.playGenre(genre, true)
true true

View file

@ -1,9 +1,12 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" <menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_play"
android:icon="@drawable/ic_play"
android:title="@string/label_play" />
<item <item
android:id="@+id/action_shuffle" android:id="@+id/action_shuffle"
android:icon="@drawable/ic_shuffle" android:icon="@drawable/ic_shuffle"
android:title="@string/label_shuffle" android:title="@string/label_shuffle" />
app:showAsAction="ifRoom" />
</menu> </menu>

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" <menu xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<item <item
@ -7,23 +8,33 @@
android:icon="@drawable/ic_search" android:icon="@drawable/ic_search"
android:title="@string/label_search" android:title="@string/label_search"
app:actionViewClass="androidx.appcompat.widget.SearchView" app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="collapseActionView|always" /> app:showAsAction="collapseActionView|always"
tools:ignore="AlwaysShowAction" />
<group android:id="@+id/group_sorting"> <!--
<item Has to be always since android mangles this action when I make it invisible and then visible again
android:id="@+id/option_sort_none" I hate this platform so much
android:contentDescription="@string/description_sort_none" -->
android:icon="@drawable/ic_sort_none" <item
android:title="@string/label_sort_none" /> android:id="@+id/submenu_sorting"
<item android:title="@string/label_sort"
android:id="@+id/option_sort_alpha_down" android:icon="@drawable/ic_sort_none"
android:contentDescription="@string/description_sort_alpha_down" app:showAsAction="always">
android:icon="@drawable/ic_sort_alpha_down" <menu>
android:title="@string/label_sort_alpha_down" /> <group android:id="@+id/group_sorting">
<item <item
android:id="@+id/option_sort_alpha_up" android:id="@+id/option_sort_none"
android:contentDescription="@string/description_sort_alpha_up" android:contentDescription="@string/description_sort_none"
android:icon="@drawable/ic_sort_alpha_up" android:title="@string/label_sort_none" />
android:title="@string/label_sort_alpha_up" /> <item
</group> android:id="@+id/option_sort_alpha_down"
android:contentDescription="@string/description_sort_alpha_down"
android:title="@string/label_sort_alpha_down" />
<item
android:id="@+id/option_sort_alpha_up"
android:contentDescription="@string/description_sort_alpha_up"
android:title="@string/label_sort_alpha_up" />
</group>
</menu>
</item>
</menu> </menu>

View file

@ -13,6 +13,7 @@
<string name="label_albums">Albums</string> <string name="label_albums">Albums</string>
<string name="label_search">Search</string> <string name="label_search">Search</string>
<string name="label_sort">Sort</string>
<string name="label_sort_none">Default</string> <string name="label_sort_none">Default</string>
<string name="label_sort_alpha_down">A-Z</string> <string name="label_sort_alpha_down">A-Z</string>
<string name="label_sort_alpha_up">Z-A</string> <string name="label_sort_alpha_up">Z-A</string>