ui: disable some options w/empty parents

Disable most playback and playlisting operations when an artist or
playlist is empty.
This commit is contained in:
Alexander Capehart 2023-05-25 11:55:49 -06:00
parent 2d0a74122f
commit 4210a8d247
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
5 changed files with 183 additions and 147 deletions

View file

@ -237,7 +237,16 @@ class ArtistDetailFragment :
findNavController().navigateUp() findNavController().navigateUp()
return return
} }
requireBinding().detailNormalToolbar.title = artist.name.resolve(requireContext()) requireBinding().detailNormalToolbar.apply {
title = artist.name.resolve(requireContext())
// Disable options that make no sense with an empty artist
val playable = artist.songs.isNotEmpty()
menu.findItem(R.id.action_play_next).isEnabled = playable
menu.findItem(R.id.action_queue_add).isEnabled = playable
menu.findItem(R.id.action_playlist_add).isEnabled = playable
menu.findItem(R.id.action_share).isEnabled = playable
}
artistHeaderAdapter.setParent(artist) artistHeaderAdapter.setParent(artist)
} }

View file

@ -255,8 +255,16 @@ class PlaylistDetailFragment :
return return
} }
val binding = requireBinding() val binding = requireBinding()
binding.detailNormalToolbar.title = playlist.name.resolve(requireContext()) binding.detailNormalToolbar.apply {
binding.detailEditToolbar.title = "Editing ${playlist.name.resolve(requireContext())}" title = playlist.name.resolve(requireContext())
// Disable options that make no sense with an empty playlist
val playable = playlist.songs.isNotEmpty()
menu.findItem(R.id.action_play_next).isEnabled = playable
menu.findItem(R.id.action_queue_add).isEnabled = playable
menu.findItem(R.id.action_share).isEnabled = playable
}
binding.detailEditToolbar.title =
getString(R.string.fmt_editing, playlist.name.resolve(requireContext()))
playlistHeaderAdapter.setParent(playlist) playlistHeaderAdapter.setParent(playlist)
} }

View file

@ -18,7 +18,6 @@
package org.oxycblt.auxio.list package org.oxycblt.auxio.list
import android.view.MenuItem
import android.view.View import android.view.View
import androidx.annotation.MenuRes import androidx.annotation.MenuRes
import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.PopupMenu
@ -89,36 +88,39 @@ abstract class ListFragment<in T : Music, VB : ViewBinding> :
protected fun openMusicMenu(anchor: View, @MenuRes menuRes: Int, song: Song) { protected fun openMusicMenu(anchor: View, @MenuRes menuRes: Int, song: Song) {
logD("Launching new song menu: ${song.name}") logD("Launching new song menu: ${song.name}")
openMusicMenuImpl(anchor, menuRes) { openMenu(anchor, menuRes) {
when (it.itemId) { setOnMenuItemClickListener {
R.id.action_play_next -> { when (it.itemId) {
playbackModel.playNext(song) R.id.action_play_next -> {
requireContext().showToast(R.string.lng_queue_added) playbackModel.playNext(song)
} requireContext().showToast(R.string.lng_queue_added)
R.id.action_queue_add -> { }
playbackModel.addToQueue(song) R.id.action_queue_add -> {
requireContext().showToast(R.string.lng_queue_added) playbackModel.addToQueue(song)
} requireContext().showToast(R.string.lng_queue_added)
R.id.action_go_artist -> { }
navModel.exploreNavigateToParentArtist(song) R.id.action_go_artist -> {
} navModel.exploreNavigateToParentArtist(song)
R.id.action_go_album -> { }
navModel.exploreNavigateTo(song.album) R.id.action_go_album -> {
} navModel.exploreNavigateTo(song.album)
R.id.action_share -> { }
requireContext().share(song) R.id.action_share -> {
} requireContext().share(song)
R.id.action_playlist_add -> { }
musicModel.addToPlaylist(song) R.id.action_playlist_add -> {
} musicModel.addToPlaylist(song)
R.id.action_song_detail -> { }
navModel.mainNavigateTo( R.id.action_song_detail -> {
MainNavigationAction.Directions( navModel.mainNavigateTo(
MainFragmentDirections.actionShowDetails(song.uid))) MainNavigationAction.Directions(
} MainFragmentDirections.actionShowDetails(song.uid)))
else -> { }
error("Unexpected menu item selected") else -> {
error("Unexpected menu item selected")
}
} }
true
} }
} }
} }
@ -134,34 +136,37 @@ abstract class ListFragment<in T : Music, VB : ViewBinding> :
protected fun openMusicMenu(anchor: View, @MenuRes menuRes: Int, album: Album) { protected fun openMusicMenu(anchor: View, @MenuRes menuRes: Int, album: Album) {
logD("Launching new album menu: ${album.name}") logD("Launching new album menu: ${album.name}")
openMusicMenuImpl(anchor, menuRes) { openMenu(anchor, menuRes) {
when (it.itemId) { setOnMenuItemClickListener {
R.id.action_play -> { when (it.itemId) {
playbackModel.play(album) R.id.action_play -> {
} playbackModel.play(album)
R.id.action_shuffle -> { }
playbackModel.shuffle(album) R.id.action_shuffle -> {
} playbackModel.shuffle(album)
R.id.action_play_next -> { }
playbackModel.playNext(album) R.id.action_play_next -> {
requireContext().showToast(R.string.lng_queue_added) playbackModel.playNext(album)
} requireContext().showToast(R.string.lng_queue_added)
R.id.action_queue_add -> { }
playbackModel.addToQueue(album) R.id.action_queue_add -> {
requireContext().showToast(R.string.lng_queue_added) playbackModel.addToQueue(album)
} requireContext().showToast(R.string.lng_queue_added)
R.id.action_go_artist -> { }
navModel.exploreNavigateToParentArtist(album) R.id.action_go_artist -> {
} navModel.exploreNavigateToParentArtist(album)
R.id.action_playlist_add -> { }
musicModel.addToPlaylist(album) R.id.action_playlist_add -> {
} musicModel.addToPlaylist(album)
R.id.action_share -> { }
requireContext().share(album) R.id.action_share -> {
} requireContext().share(album)
else -> { }
error("Unexpected menu item selected") else -> {
error("Unexpected menu item selected")
}
} }
true
} }
} }
} }
@ -177,31 +182,42 @@ abstract class ListFragment<in T : Music, VB : ViewBinding> :
protected fun openMusicMenu(anchor: View, @MenuRes menuRes: Int, artist: Artist) { protected fun openMusicMenu(anchor: View, @MenuRes menuRes: Int, artist: Artist) {
logD("Launching new artist menu: ${artist.name}") logD("Launching new artist menu: ${artist.name}")
openMusicMenuImpl(anchor, menuRes) { openMenu(anchor, menuRes) {
when (it.itemId) { val playable = artist.songs.isNotEmpty()
R.id.action_play -> { menu.findItem(R.id.action_play).isEnabled = playable
playbackModel.play(artist) menu.findItem(R.id.action_shuffle).isEnabled = playable
} menu.findItem(R.id.action_play_next).isEnabled = playable
R.id.action_shuffle -> { menu.findItem(R.id.action_queue_add).isEnabled = playable
playbackModel.shuffle(artist) menu.findItem(R.id.action_playlist_add).isEnabled = playable
} menu.findItem(R.id.action_share).isEnabled = playable
R.id.action_play_next -> {
playbackModel.playNext(artist) setOnMenuItemClickListener {
requireContext().showToast(R.string.lng_queue_added) when (it.itemId) {
} R.id.action_play -> {
R.id.action_queue_add -> { playbackModel.play(artist)
playbackModel.addToQueue(artist) }
requireContext().showToast(R.string.lng_queue_added) R.id.action_shuffle -> {
} playbackModel.shuffle(artist)
R.id.action_playlist_add -> { }
musicModel.addToPlaylist(artist) R.id.action_play_next -> {
} playbackModel.playNext(artist)
R.id.action_share -> { requireContext().showToast(R.string.lng_queue_added)
requireContext().share(artist) }
} R.id.action_queue_add -> {
else -> { playbackModel.addToQueue(artist)
error("Unexpected menu item selected") requireContext().showToast(R.string.lng_queue_added)
}
R.id.action_playlist_add -> {
musicModel.addToPlaylist(artist)
}
R.id.action_share -> {
requireContext().share(artist)
}
else -> {
error("Unexpected menu item selected")
}
} }
true
} }
} }
} }
@ -217,31 +233,34 @@ abstract class ListFragment<in T : Music, VB : ViewBinding> :
protected fun openMusicMenu(anchor: View, @MenuRes menuRes: Int, genre: Genre) { protected fun openMusicMenu(anchor: View, @MenuRes menuRes: Int, genre: Genre) {
logD("Launching new genre menu: ${genre.name}") logD("Launching new genre menu: ${genre.name}")
openMusicMenuImpl(anchor, menuRes) { openMenu(anchor, menuRes) {
when (it.itemId) { setOnMenuItemClickListener {
R.id.action_play -> { when (it.itemId) {
playbackModel.play(genre) R.id.action_play -> {
} playbackModel.play(genre)
R.id.action_shuffle -> { }
playbackModel.shuffle(genre) R.id.action_shuffle -> {
} playbackModel.shuffle(genre)
R.id.action_play_next -> { }
playbackModel.playNext(genre) R.id.action_play_next -> {
requireContext().showToast(R.string.lng_queue_added) playbackModel.playNext(genre)
} requireContext().showToast(R.string.lng_queue_added)
R.id.action_queue_add -> { }
playbackModel.addToQueue(genre) R.id.action_queue_add -> {
requireContext().showToast(R.string.lng_queue_added) playbackModel.addToQueue(genre)
} requireContext().showToast(R.string.lng_queue_added)
R.id.action_playlist_add -> { }
musicModel.addToPlaylist(genre) R.id.action_playlist_add -> {
} musicModel.addToPlaylist(genre)
R.id.action_share -> { }
requireContext().share(genre) R.id.action_share -> {
} requireContext().share(genre)
else -> { }
error("Unexpected menu item selected") else -> {
error("Unexpected menu item selected")
}
} }
true
} }
} }
} }
@ -257,46 +276,43 @@ abstract class ListFragment<in T : Music, VB : ViewBinding> :
protected fun openMusicMenu(anchor: View, @MenuRes menuRes: Int, playlist: Playlist) { protected fun openMusicMenu(anchor: View, @MenuRes menuRes: Int, playlist: Playlist) {
logD("Launching new playlist menu: ${playlist.name}") logD("Launching new playlist menu: ${playlist.name}")
openMusicMenuImpl(anchor, menuRes) {
when (it.itemId) {
R.id.action_play -> {
playbackModel.play(playlist)
}
R.id.action_shuffle -> {
playbackModel.shuffle(playlist)
}
R.id.action_play_next -> {
playbackModel.playNext(playlist)
requireContext().showToast(R.string.lng_queue_added)
}
R.id.action_queue_add -> {
playbackModel.addToQueue(playlist)
requireContext().showToast(R.string.lng_queue_added)
}
R.id.action_rename -> {
musicModel.renamePlaylist(playlist)
}
R.id.action_delete -> {
musicModel.deletePlaylist(playlist)
}
R.id.action_share -> {
requireContext().share(playlist)
}
else -> {
error("Unexpected menu item selected")
}
}
}
}
private fun openMusicMenuImpl(
anchor: View,
@MenuRes menuRes: Int,
onMenuItemClick: (MenuItem) -> Unit
) {
openMenu(anchor, menuRes) { openMenu(anchor, menuRes) {
setOnMenuItemClickListener { item -> val playable = playlist.songs.isNotEmpty()
onMenuItemClick(item) menu.findItem(R.id.action_play).isEnabled = playable
menu.findItem(R.id.action_shuffle).isEnabled = playable
menu.findItem(R.id.action_play_next).isEnabled = playable
menu.findItem(R.id.action_queue_add).isEnabled = playable
menu.findItem(R.id.action_share).isEnabled = playable
setOnMenuItemClickListener {
when (it.itemId) {
R.id.action_play -> {
playbackModel.play(playlist)
}
R.id.action_shuffle -> {
playbackModel.shuffle(playlist)
}
R.id.action_play_next -> {
playbackModel.playNext(playlist)
requireContext().showToast(R.string.lng_queue_added)
}
R.id.action_queue_add -> {
playbackModel.addToQueue(playlist)
requireContext().showToast(R.string.lng_queue_added)
}
R.id.action_rename -> {
musicModel.renamePlaylist(playlist)
}
R.id.action_delete -> {
musicModel.deletePlaylist(playlist)
}
R.id.action_share -> {
requireContext().share(playlist)
}
else -> {
error("Unexpected menu item selected")
}
}
true true
} }
} }

View file

@ -284,6 +284,7 @@ fun Context.share(parent: MusicParent) = share(parent.songs)
/** /**
* Share an arbitrary list of [Song]s. * Share an arbitrary list of [Song]s.
*
* @param songs The [Song]s to share. * @param songs The [Song]s to share.
*/ */
fun Context.share(songs: List<Song>) { fun Context.share(songs: List<Song>) {

View file

@ -386,6 +386,8 @@
<!-- As in an amount of items that are selected --> <!-- As in an amount of items that are selected -->
<string name="fmt_selected">%d Selected</string> <string name="fmt_selected">%d Selected</string>
<!-- Currently editing a playlist -->
<string name="fmt_editing">Editing %s</string>
<!-- As in "Disc 1", "Disc 2", etc. in a set --> <!-- As in "Disc 1", "Disc 2", etc. in a set -->
<string name="fmt_disc_no">Disc %d</string> <string name="fmt_disc_no">Disc %d</string>