all: standardize nav consume usage

Standardize navigation command consumption to only occur when a
navigation route has *definitively* ended. If more commands could
come, observe them. Otherwise, consume immediately.
This commit is contained in:
Alexander Capehart 2023-07-04 13:20:13 -06:00
parent e8289dcda0
commit 14107c9444
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
24 changed files with 134 additions and 168 deletions

View file

@ -57,8 +57,7 @@ import org.oxycblt.auxio.util.systemBarInsetsCompat
import org.oxycblt.auxio.util.unlikelyToBeNull
/**
* A wrapper around the home fragment that shows the playback fragment and controls the more
* high-level navigation features.
* A wrapper around the home fragment that shows the playback fragment and high-level navigation.
*
* @author Alexander Capehart (OxygenCobalt)
*/

View file

@ -73,7 +73,7 @@ class AlbumDetailFragment :
ListFragment<Song, FragmentDetailBinding>(),
AlbumDetailHeaderAdapter.Listener,
DetailListAdapter.Listener<Song> {
override val detailModel: DetailViewModel by activityViewModels()
private val detailModel: DetailViewModel by activityViewModels()
private val menuModel: MenuViewModel by activityViewModels()
override val selectionModel: SelectionViewModel by activityViewModels()
override val musicModel: MusicViewModel by activityViewModels()
@ -317,7 +317,6 @@ class AlbumDetailFragment :
is PendingMenu.ForPlaylist -> error("Unexpected menu $pendingMenu")
}
findNavController().navigateSafe(directions)
menuModel.pendingMenu.consume()
}
private fun updateSelection(selected: List<Music>) {
@ -333,20 +332,19 @@ class AlbumDetailFragment :
}
private fun handleDecision(decision: PlaylistDecision?) {
when (decision) {
is PlaylistDecision.Add -> {
logD("Adding ${decision.songs.size} songs to a playlist")
findNavController()
.navigateSafe(
AlbumDetailFragmentDirections.addToPlaylist(
decision.songs.map { it.uid }.toTypedArray()))
musicModel.playlistDecision.consume()
if (decision == null) return
val directions =
when (decision) {
is PlaylistDecision.Add -> {
logD("Adding ${decision.songs.size} songs to a playlist")
AlbumDetailFragmentDirections.addToPlaylist(
decision.songs.map { it.uid }.toTypedArray())
}
is PlaylistDecision.New,
is PlaylistDecision.Rename,
is PlaylistDecision.Delete -> error("Unexpected decision $decision")
}
is PlaylistDecision.New,
is PlaylistDecision.Rename,
is PlaylistDecision.Delete -> error("Unexpected decision $decision")
null -> {}
}
findNavController().navigateSafe(directions)
}
private fun updatePlayback(song: Song?, parent: MusicParent?, isPlaying: Boolean) {

View file

@ -71,7 +71,7 @@ class ArtistDetailFragment :
ListFragment<Music, FragmentDetailBinding>(),
DetailHeaderAdapter.Listener,
DetailListAdapter.Listener<Music> {
override val detailModel: DetailViewModel by activityViewModels()
private val detailModel: DetailViewModel by activityViewModels()
private val menuModel: MenuViewModel by activityViewModels()
override val selectionModel: SelectionViewModel by activityViewModels()
override val musicModel: MusicViewModel by activityViewModels()
@ -329,7 +329,6 @@ class ArtistDetailFragment :
is PendingMenu.ForPlaylist -> error("Unexpected menu $pendingMenu")
}
findNavController().navigateSafe(directions)
menuModel.pendingMenu.consume()
}
private fun updateSelection(selected: List<Music>) {
@ -345,20 +344,19 @@ class ArtistDetailFragment :
}
private fun handleDecision(decision: PlaylistDecision?) {
when (decision) {
is PlaylistDecision.Add -> {
logD("Adding ${decision.songs.size} songs to a playlist")
findNavController()
.navigateSafe(
ArtistDetailFragmentDirections.addToPlaylist(
decision.songs.map { it.uid }.toTypedArray()))
musicModel.playlistDecision.consume()
if (decision == null) return
val directions =
when (decision) {
is PlaylistDecision.Add -> {
logD("Adding ${decision.songs.size} songs to a playlist")
ArtistDetailFragmentDirections.addToPlaylist(
decision.songs.map { it.uid }.toTypedArray())
}
is PlaylistDecision.New,
is PlaylistDecision.Rename,
is PlaylistDecision.Delete -> error("Unexpected decision $decision")
}
is PlaylistDecision.New,
is PlaylistDecision.Rename,
is PlaylistDecision.Delete -> error("Unexpected decision $decision")
null -> {}
}
findNavController().navigateSafe(directions)
}
private fun updatePlayback(song: Song?, parent: MusicParent?, isPlaying: Boolean) {

View file

@ -71,7 +71,7 @@ class GenreDetailFragment :
ListFragment<Music, FragmentDetailBinding>(),
DetailHeaderAdapter.Listener,
DetailListAdapter.Listener<Music> {
override val detailModel: DetailViewModel by activityViewModels()
private val detailModel: DetailViewModel by activityViewModels()
private val menuModel: MenuViewModel by activityViewModels()
override val selectionModel: SelectionViewModel by activityViewModels()
override val musicModel: MusicViewModel by activityViewModels()
@ -317,7 +317,6 @@ class GenreDetailFragment :
is PendingMenu.ForPlaylist -> error("Unexpected menu $pendingMenu")
}
findNavController().navigateSafe(directions)
menuModel.pendingMenu.consume()
}
private fun updateSelection(selected: List<Music>) {
@ -333,20 +332,19 @@ class GenreDetailFragment :
}
private fun handleDecision(decision: PlaylistDecision?) {
when (decision) {
is PlaylistDecision.Add -> {
logD("Adding ${decision.songs.size} songs to a playlist")
findNavController()
.navigateSafe(
GenreDetailFragmentDirections.addToPlaylist(
decision.songs.map { it.uid }.toTypedArray()))
musicModel.playlistDecision.consume()
if (decision == null) return
val directions =
when (decision) {
is PlaylistDecision.Add -> {
logD("Adding ${decision.songs.size} songs to a playlist")
ArtistDetailFragmentDirections.addToPlaylist(
decision.songs.map { it.uid }.toTypedArray())
}
is PlaylistDecision.New,
is PlaylistDecision.Rename,
is PlaylistDecision.Delete -> error("Unexpected decision $decision")
}
is PlaylistDecision.New,
is PlaylistDecision.Rename,
is PlaylistDecision.Delete -> error("Unexpected decision $decision")
null -> {}
}
findNavController().navigateSafe(directions)
}
private fun updatePlayback(song: Song?, parent: MusicParent?, isPlaying: Boolean) {

View file

@ -74,7 +74,7 @@ class PlaylistDetailFragment :
DetailHeaderAdapter.Listener,
PlaylistDetailListAdapter.Listener,
NavController.OnDestinationChangedListener {
override val detailModel: DetailViewModel by activityViewModels()
private val detailModel: DetailViewModel by activityViewModels()
private val menuModel: MenuViewModel by activityViewModels()
override val selectionModel: SelectionViewModel by activityViewModels()
override val musicModel: MusicViewModel by activityViewModels()
@ -362,7 +362,6 @@ class PlaylistDetailFragment :
is PendingMenu.ForPlaylist -> error("Unexpected menu $pendingMenu")
}
findNavController().navigateSafe(directions)
menuModel.pendingMenu.consume()
}
private fun updateSelection(selected: List<Music>) {
@ -377,23 +376,20 @@ class PlaylistDetailFragment :
private fun handleDecision(decision: PlaylistDecision?) {
if (decision == null) return
when (decision) {
is PlaylistDecision.Rename -> {
logD("Renaming ${decision.playlist}")
findNavController()
.navigateSafe(
PlaylistDetailFragmentDirections.renamePlaylist(decision.playlist.uid))
val directions =
when (decision) {
is PlaylistDecision.Rename -> {
logD("Renaming ${decision.playlist}")
PlaylistDetailFragmentDirections.renamePlaylist(decision.playlist.uid)
}
is PlaylistDecision.Delete -> {
logD("Deleting ${decision.playlist}")
PlaylistDetailFragmentDirections.deletePlaylist(decision.playlist.uid)
}
is PlaylistDecision.Add,
is PlaylistDecision.New -> error("Unexpected decision $decision")
}
is PlaylistDecision.Delete -> {
logD("Deleting ${decision.playlist}")
findNavController()
.navigateSafe(
PlaylistDetailFragmentDirections.deletePlaylist(decision.playlist.uid))
}
is PlaylistDecision.Add,
is PlaylistDecision.New -> error("Unexpected decision $decision")
}
musicModel.playlistDecision.consume()
findNavController().navigateSafe(directions)
}
private fun updatePlayback(song: Song?, parent: MusicParent?, isPlaying: Boolean) {

View file

@ -69,8 +69,8 @@ class SongDetailDialog : ViewBindingMaterialDialogFragment<DialogSongDetailBindi
binding.detailProperties.adapter = detailAdapter
// DetailViewModel handles most initialization from the navigation argument.
detailModel.setSong(args.songUid)
detailModel.toShow.consume()
collectImmediately(detailModel.currentSong, detailModel.songAudioProperties, ::updateSong)
collectImmediately(detailModel.toShow.flow, ::handleShow)
}
private fun updateSong(song: Song?, info: AudioProperties?) {
@ -126,16 +126,6 @@ class SongDetailDialog : ViewBindingMaterialDialogFragment<DialogSongDetailBindi
}
}
private fun handleShow(show: Show?) {
if (show == null) return
if (show is Show.SongDetails) {
logD("Navigated to this song")
detailModel.toShow.consume()
} else {
error("Unexpected show command $show")
}
}
private fun <T : Music> T.zipName(context: Context): String {
val name = name
return if (name is Name.Known && name.sort != null) {

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2023 Auxio Project
* NavigationPickerViewModel.kt is part of Auxio.
* DetailPickerViewModel.kt is part of Auxio.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -49,6 +49,11 @@ class NavigationPickerViewModel @Inject constructor(private val musicRepository:
musicRepository.addUpdateListener(this)
}
override fun onCleared() {
super.onCleared()
musicRepository.removeUpdateListener(this)
}
override fun onMusicChanges(changes: MusicRepository.Changes) {
if (!changes.deviceLibrary) return
val deviceLibrary = musicRepository.deviceLibrary ?: return
@ -57,11 +62,6 @@ class NavigationPickerViewModel @Inject constructor(private val musicRepository:
logD("Updated artist choices: ${_artistChoices.value}")
}
override fun onCleared() {
super.onCleared()
musicRepository.removeUpdateListener(this)
}
/**
* Set the [Music.UID] of the item to show artist choices for.
*

View file

@ -35,6 +35,7 @@ import org.oxycblt.auxio.list.adapter.UpdateInstructions
import org.oxycblt.auxio.music.Artist
import org.oxycblt.auxio.ui.ViewBindingMaterialDialogFragment
import org.oxycblt.auxio.util.collectImmediately
import org.oxycblt.auxio.util.logD
/**
* A picker [ViewBindingMaterialDialogFragment] intended for when the [Artist] to show is ambiguous.
@ -66,14 +67,9 @@ class ShowArtistDialog :
adapter = choiceAdapter
}
detailModel.toShow.consume()
pickerModel.setArtistChoiceUid(args.itemUid)
collectImmediately(pickerModel.artistChoices) {
if (it != null) {
choiceAdapter.update(it.choices, UpdateInstructions.Replace(0))
} else {
findNavController().navigateUp()
}
}
collectImmediately(pickerModel.artistChoices, ::handleChoices)
}
override fun onDestroyBinding(binding: DialogMusicChoicesBinding) {
@ -82,8 +78,17 @@ class ShowArtistDialog :
}
override fun onClick(item: Artist, viewHolder: RecyclerView.ViewHolder) {
findNavController().navigateUp()
// User made a choice, navigate to the artist.
detailModel.showArtist(item)
findNavController().navigateUp()
}
private fun handleChoices(choices: ArtistShowChoices?) {
if (choices == null) {
logD("No choices to show, navigating away")
findNavController().navigateUp()
return
}
choiceAdapter.update(choices.choices, UpdateInstructions.Diff)
}
}

View file

@ -492,33 +492,27 @@ class HomeFragment :
private fun handleDecision(decision: PlaylistDecision?) {
if (decision == null) return
when (decision) {
is PlaylistDecision.New -> {
logD("Creating new playlist")
findNavController()
.navigateSafe(
HomeFragmentDirections.newPlaylist(
decision.songs.map { it.uid }.toTypedArray()))
val directions =
when (decision) {
is PlaylistDecision.New -> {
logD("Creating new playlist")
HomeFragmentDirections.newPlaylist(decision.songs.map { it.uid }.toTypedArray())
}
is PlaylistDecision.Rename -> {
logD("Renaming ${decision.playlist}")
HomeFragmentDirections.renamePlaylist(decision.playlist.uid)
}
is PlaylistDecision.Delete -> {
logD("Deleting ${decision.playlist}")
HomeFragmentDirections.deletePlaylist(decision.playlist.uid)
}
is PlaylistDecision.Add -> {
logD("Adding ${decision.songs.size} to a playlist")
HomeFragmentDirections.addToPlaylist(
decision.songs.map { it.uid }.toTypedArray())
}
}
is PlaylistDecision.Rename -> {
logD("Renaming ${decision.playlist}")
findNavController()
.navigateSafe(HomeFragmentDirections.renamePlaylist(decision.playlist.uid))
}
is PlaylistDecision.Delete -> {
logD("Deleting ${decision.playlist}")
findNavController()
.navigateSafe(HomeFragmentDirections.deletePlaylist(decision.playlist.uid))
}
is PlaylistDecision.Add -> {
logD("Adding ${decision.songs.size} to a playlist")
findNavController()
.navigateSafe(
HomeFragmentDirections.addToPlaylist(
decision.songs.map { it.uid }.toTypedArray()))
}
}
musicModel.playlistDecision.consume()
findNavController().navigateSafe(directions)
}
private fun updateFab(songs: List<Song>, isFastScrolling: Boolean) {
@ -606,7 +600,6 @@ class HomeFragment :
pendingMenu.menuRes, pendingMenu.music.uid)
}
findNavController().navigateSafe(directions)
menuModel.pendingMenu.consume()
}
private fun updateSelection(selected: List<Music>) {

View file

@ -60,7 +60,7 @@ class AlbumListFragment :
FastScrollRecyclerView.Listener,
FastScrollRecyclerView.PopupProvider {
private val homeModel: HomeViewModel by activityViewModels()
override val detailModel: DetailViewModel by activityViewModels()
private val detailModel: DetailViewModel by activityViewModels()
private val menuModel: MenuViewModel by activityViewModels()
override val selectionModel: SelectionViewModel by activityViewModels()
override val musicModel: MusicViewModel by activityViewModels()

View file

@ -58,7 +58,7 @@ class ArtistListFragment :
FastScrollRecyclerView.PopupProvider,
FastScrollRecyclerView.Listener {
private val homeModel: HomeViewModel by activityViewModels()
override val detailModel: DetailViewModel by activityViewModels()
private val detailModel: DetailViewModel by activityViewModels()
private val menuModel: MenuViewModel by activityViewModels()
override val selectionModel: SelectionViewModel by activityViewModels()
override val musicModel: MusicViewModel by activityViewModels()

View file

@ -57,7 +57,7 @@ class GenreListFragment :
FastScrollRecyclerView.PopupProvider,
FastScrollRecyclerView.Listener {
private val homeModel: HomeViewModel by activityViewModels()
override val detailModel: DetailViewModel by activityViewModels()
private val detailModel: DetailViewModel by activityViewModels()
private val menuModel: MenuViewModel by activityViewModels()
override val selectionModel: SelectionViewModel by activityViewModels()
override val musicModel: MusicViewModel by activityViewModels()

View file

@ -55,7 +55,7 @@ class PlaylistListFragment :
FastScrollRecyclerView.PopupProvider,
FastScrollRecyclerView.Listener {
private val homeModel: HomeViewModel by activityViewModels()
override val detailModel: DetailViewModel by activityViewModels()
private val detailModel: DetailViewModel by activityViewModels()
private val menuModel: MenuViewModel by activityViewModels()
override val selectionModel: SelectionViewModel by activityViewModels()
override val musicModel: MusicViewModel by activityViewModels()

View file

@ -28,7 +28,6 @@ import dagger.hilt.android.AndroidEntryPoint
import java.util.Formatter
import org.oxycblt.auxio.R
import org.oxycblt.auxio.databinding.FragmentHomeListBinding
import org.oxycblt.auxio.detail.DetailViewModel
import org.oxycblt.auxio.home.HomeViewModel
import org.oxycblt.auxio.home.fastscroll.FastScrollRecyclerView
import org.oxycblt.auxio.list.ListFragment
@ -59,7 +58,6 @@ class SongListFragment :
FastScrollRecyclerView.PopupProvider,
FastScrollRecyclerView.Listener {
private val homeModel: HomeViewModel by activityViewModels()
override val detailModel: DetailViewModel by activityViewModels()
private val menuModel: MenuViewModel by activityViewModels()
override val selectionModel: SelectionViewModel by activityViewModels()
override val musicModel: MusicViewModel by activityViewModels()

View file

@ -24,7 +24,6 @@ import androidx.appcompat.widget.PopupMenu
import androidx.core.view.MenuCompat
import androidx.recyclerview.widget.RecyclerView
import androidx.viewbinding.ViewBinding
import org.oxycblt.auxio.detail.DetailViewModel
import org.oxycblt.auxio.list.selection.SelectionFragment
import org.oxycblt.auxio.music.Music
import org.oxycblt.auxio.util.logD
@ -36,7 +35,6 @@ import org.oxycblt.auxio.util.logD
*/
abstract class ListFragment<in T : Music, VB : ViewBinding> :
SelectionFragment<VB>(), SelectableListListener<T> {
protected abstract val detailModel: DetailViewModel
private var currentMenu: PopupMenu? = null
override fun onDestroyBinding(binding: VB) {

View file

@ -66,6 +66,7 @@ abstract class MenuDialogFragment<T : Music> :
}
// --- VIEWMODEL SETUP ---
menuModel.pendingMenu.consume()
menuModel.setCurrentMenu(uid)
collectImmediately(menuModel.currentMusic, this::updateMusic)
}

View file

@ -72,6 +72,7 @@ class AddToPlaylistDialog :
}
// --- VIEWMODEL SETUP ---
musicModel.playlistDecision.consume()
pickerModel.setSongsToAdd(args.songUids)
collectImmediately(pickerModel.currentSongsToAdd, ::updatePendingSongs)
collectImmediately(pickerModel.playlistAddChoices, ::updatePlaylistChoices)

View file

@ -71,6 +71,7 @@ class DeletePlaylistDialog : ViewBindingMaterialDialogFragment<DialogDeletePlayl
super.onBindingCreated(binding, savedInstanceState)
// --- VIEWMODEL SETUP ---
musicModel.playlistDecision.consume()
pickerModel.setPlaylistToDelete(args.playlistUid)
collectImmediately(pickerModel.currentPlaylistToDelete, ::updatePlaylistToDelete)
}

View file

@ -32,7 +32,6 @@ import org.oxycblt.auxio.databinding.DialogPlaylistNameBinding
import org.oxycblt.auxio.music.MusicViewModel
import org.oxycblt.auxio.ui.ViewBindingMaterialDialogFragment
import org.oxycblt.auxio.util.collectImmediately
import org.oxycblt.auxio.util.logD
import org.oxycblt.auxio.util.showToast
import org.oxycblt.auxio.util.unlikelyToBeNull
@ -83,21 +82,11 @@ class NewPlaylistDialog : ViewBindingMaterialDialogFragment<DialogPlaylistNameBi
binding.playlistName.addTextChangedListener { pickerModel.updateChosenName(it?.toString()) }
// --- VIEWMODEL SETUP ---
musicModel.playlistDecision.consume()
pickerModel.setPendingPlaylist(requireContext(), args.songUids)
collectImmediately(pickerModel.currentPendingPlaylist, ::updatePendingPlaylist)
collectImmediately(pickerModel.chosenName, ::updateChosenName)
}
private fun updatePendingPlaylist(pendingPlaylist: PendingPlaylist?) {
if (pendingPlaylist == null) {
logD("No playlist to create, leaving")
findNavController().navigateUp()
return
}
requireBinding().playlistName.hint = pendingPlaylist.preferredName
}
private fun updateChosenName(chosenName: ChosenName) {
(dialog as AlertDialog).getButton(AlertDialog.BUTTON_POSITIVE)?.isEnabled =
chosenName is ChosenName.Valid || chosenName is ChosenName.Empty

View file

@ -74,6 +74,7 @@ class RenamePlaylistDialog : ViewBindingMaterialDialogFragment<DialogPlaylistNam
binding.playlistName.addTextChangedListener { pickerModel.updateChosenName(it?.toString()) }
// --- VIEWMODEL SETUP ---
musicModel.playlistDecision.consume()
pickerModel.setPlaylistToRename(args.playlistUid)
collectImmediately(pickerModel.currentPlaylistToRename, ::updatePlaylistToRename)
collectImmediately(pickerModel.chosenName, ::updateChosenName)

View file

@ -71,12 +71,12 @@ import org.oxycblt.auxio.util.setFullWidthLookup
*/
@AndroidEntryPoint
class SearchFragment : ListFragment<Music, FragmentSearchBinding>() {
override val detailModel: DetailViewModel by activityViewModels()
private val searchModel: SearchViewModel by viewModels()
private val detailModel: DetailViewModel by activityViewModels()
private val menuModel: MenuViewModel by activityViewModels()
override val selectionModel: SelectionViewModel by activityViewModels()
override val playbackModel: PlaybackViewModel by activityViewModels()
override val musicModel: MusicViewModel by activityViewModels()
private val searchModel: SearchViewModel by viewModels()
private val searchAdapter = SearchAdapter(this)
private var imm: InputMethodManager? = null
private var launchedKeyboard = false
@ -236,12 +236,13 @@ class SearchFragment : ListFragment<Music, FragmentSearchBinding>() {
}
is Show.SongArtistDetails -> {
logD("Navigating to artist choices for ${show.song}")
findNavController().navigateSafe(SearchFragmentDirections.showArtist(show.song.uid))
findNavController()
.navigateSafe(SearchFragmentDirections.showArtists(show.song.uid))
}
is Show.AlbumArtistDetails -> {
logD("Navigating to artist choices for ${show.album}")
findNavController()
.navigateSafe(SearchFragmentDirections.showArtist(show.album.uid))
.navigateSafe(SearchFragmentDirections.showArtists(show.album.uid))
}
is Show.GenreDetails -> {
logD("Navigating to ${show.genre}")
@ -281,7 +282,6 @@ class SearchFragment : ListFragment<Music, FragmentSearchBinding>() {
}
}
findNavController().navigateSafe(directions)
musicModel.playlistDecision.consume()
}
private fun updatePlayback(song: Song?, parent: MusicParent?, isPlaying: Boolean) {
@ -309,7 +309,6 @@ class SearchFragment : ListFragment<Music, FragmentSearchBinding>() {
pendingMenu.menuRes, pendingMenu.music.uid)
}
findNavController().navigateSafe(directions)
menuModel.pendingMenu.consume()
}
private fun updateSelection(selected: List<Music>) {

View file

@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_play"
android:title="@string/lbl_play"
android:icon="@drawable/ic_play_24" />
<item
android:id="@+id/action_shuffle"
android:title="@string/lbl_shuffle"
android:icon="@drawable/ic_shuffle_off_24"/>
<!-- <item-->
<!-- android:id="@+id/action_play"-->
<!-- android:title="@string/lbl_play"-->
<!-- android:icon="@drawable/ic_play_24" />-->
<!-- <item-->
<!-- android:id="@+id/action_shuffle"-->
<!-- android:title="@string/lbl_shuffle"-->
<!-- android:icon="@drawable/ic_shuffle_off_24"/>-->
<item
android:id="@+id/action_play_next"
android:title="@string/lbl_play_next"
@ -30,5 +30,6 @@
android:icon="@drawable/ic_details_24" />
<item
android:id="@+id/action_share"
android:title="@string/lbl_share" />
android:title="@string/lbl_share"
android:icon="@drawable/ic_share_24"/>
</menu>

View file

@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_play"
android:title="@string/lbl_play"
android:icon="@drawable/ic_play_24" />
<item
android:id="@+id/action_shuffle"
android:title="@string/lbl_shuffle"
android:icon="@drawable/ic_shuffle_off_24"/>
<!-- <item-->
<!-- android:id="@+id/action_play"-->
<!-- android:title="@string/lbl_play"-->
<!-- android:icon="@drawable/ic_play_24" />-->
<!-- <item-->
<!-- android:id="@+id/action_shuffle"-->
<!-- android:title="@string/lbl_shuffle"-->
<!-- android:icon="@drawable/ic_shuffle_off_24"/>-->
<item
android:id="@+id/action_play_next"
android:title="@string/lbl_play_next"

View file

@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_play"
android:title="@string/lbl_play"
android:icon="@drawable/ic_play_24" />
<item
android:id="@+id/action_shuffle"
android:title="@string/lbl_shuffle"
android:icon="@drawable/ic_shuffle_off_24" />
<!-- <item-->
<!-- android:id="@+id/action_play"-->
<!-- android:title="@string/lbl_play"-->
<!-- android:icon="@drawable/ic_play_24" />-->
<!-- <item-->
<!-- android:id="@+id/action_shuffle"-->
<!-- android:title="@string/lbl_shuffle"-->
<!-- android:icon="@drawable/ic_shuffle_off_24" />-->
<item
android:id="@+id/action_play_next"
android:title="@string/lbl_play_next"