From 4210a8d2477c19f5d6607c797b3796e284994702 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Thu, 25 May 2023 11:55:49 -0600 Subject: [PATCH] ui: disable some options w/empty parents Disable most playback and playlisting operations when an artist or playlist is empty. --- .../auxio/detail/ArtistDetailFragment.kt | 11 +- .../auxio/detail/PlaylistDetailFragment.kt | 12 +- .../org/oxycblt/auxio/list/ListFragment.kt | 304 +++++++++--------- .../org/oxycblt/auxio/util/FrameworkUtil.kt | 1 + app/src/main/res/values/strings.xml | 2 + 5 files changed, 183 insertions(+), 147 deletions(-) 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 4dca06a0e..310d9bc35 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt @@ -237,7 +237,16 @@ class ArtistDetailFragment : findNavController().navigateUp() 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) } diff --git a/app/src/main/java/org/oxycblt/auxio/detail/PlaylistDetailFragment.kt b/app/src/main/java/org/oxycblt/auxio/detail/PlaylistDetailFragment.kt index 5b63806ad..32044be87 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/PlaylistDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/PlaylistDetailFragment.kt @@ -255,8 +255,16 @@ class PlaylistDetailFragment : return } val binding = requireBinding() - binding.detailNormalToolbar.title = playlist.name.resolve(requireContext()) - binding.detailEditToolbar.title = "Editing ${playlist.name.resolve(requireContext())}" + binding.detailNormalToolbar.apply { + 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) } diff --git a/app/src/main/java/org/oxycblt/auxio/list/ListFragment.kt b/app/src/main/java/org/oxycblt/auxio/list/ListFragment.kt index 7127400f4..3f2610c3f 100644 --- a/app/src/main/java/org/oxycblt/auxio/list/ListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/list/ListFragment.kt @@ -18,7 +18,6 @@ package org.oxycblt.auxio.list -import android.view.MenuItem import android.view.View import androidx.annotation.MenuRes import androidx.appcompat.widget.PopupMenu @@ -89,36 +88,39 @@ abstract class ListFragment : protected fun openMusicMenu(anchor: View, @MenuRes menuRes: Int, song: Song) { logD("Launching new song menu: ${song.name}") - openMusicMenuImpl(anchor, menuRes) { - when (it.itemId) { - R.id.action_play_next -> { - playbackModel.playNext(song) - requireContext().showToast(R.string.lng_queue_added) - } - R.id.action_queue_add -> { - playbackModel.addToQueue(song) - requireContext().showToast(R.string.lng_queue_added) - } - R.id.action_go_artist -> { - navModel.exploreNavigateToParentArtist(song) - } - R.id.action_go_album -> { - navModel.exploreNavigateTo(song.album) - } - R.id.action_share -> { - requireContext().share(song) - } - R.id.action_playlist_add -> { - musicModel.addToPlaylist(song) - } - R.id.action_song_detail -> { - navModel.mainNavigateTo( - MainNavigationAction.Directions( - MainFragmentDirections.actionShowDetails(song.uid))) - } - else -> { - error("Unexpected menu item selected") + openMenu(anchor, menuRes) { + setOnMenuItemClickListener { + when (it.itemId) { + R.id.action_play_next -> { + playbackModel.playNext(song) + requireContext().showToast(R.string.lng_queue_added) + } + R.id.action_queue_add -> { + playbackModel.addToQueue(song) + requireContext().showToast(R.string.lng_queue_added) + } + R.id.action_go_artist -> { + navModel.exploreNavigateToParentArtist(song) + } + R.id.action_go_album -> { + navModel.exploreNavigateTo(song.album) + } + R.id.action_share -> { + requireContext().share(song) + } + R.id.action_playlist_add -> { + musicModel.addToPlaylist(song) + } + R.id.action_song_detail -> { + navModel.mainNavigateTo( + MainNavigationAction.Directions( + MainFragmentDirections.actionShowDetails(song.uid))) + } + else -> { + error("Unexpected menu item selected") + } } + true } } } @@ -134,34 +136,37 @@ abstract class ListFragment : protected fun openMusicMenu(anchor: View, @MenuRes menuRes: Int, album: Album) { logD("Launching new album menu: ${album.name}") - openMusicMenuImpl(anchor, menuRes) { - when (it.itemId) { - R.id.action_play -> { - playbackModel.play(album) - } - R.id.action_shuffle -> { - playbackModel.shuffle(album) - } - R.id.action_play_next -> { - playbackModel.playNext(album) - requireContext().showToast(R.string.lng_queue_added) - } - R.id.action_queue_add -> { - playbackModel.addToQueue(album) - requireContext().showToast(R.string.lng_queue_added) - } - R.id.action_go_artist -> { - navModel.exploreNavigateToParentArtist(album) - } - R.id.action_playlist_add -> { - musicModel.addToPlaylist(album) - } - R.id.action_share -> { - requireContext().share(album) - } - else -> { - error("Unexpected menu item selected") + openMenu(anchor, menuRes) { + setOnMenuItemClickListener { + when (it.itemId) { + R.id.action_play -> { + playbackModel.play(album) + } + R.id.action_shuffle -> { + playbackModel.shuffle(album) + } + R.id.action_play_next -> { + playbackModel.playNext(album) + requireContext().showToast(R.string.lng_queue_added) + } + R.id.action_queue_add -> { + playbackModel.addToQueue(album) + requireContext().showToast(R.string.lng_queue_added) + } + R.id.action_go_artist -> { + navModel.exploreNavigateToParentArtist(album) + } + R.id.action_playlist_add -> { + musicModel.addToPlaylist(album) + } + R.id.action_share -> { + requireContext().share(album) + } + else -> { + error("Unexpected menu item selected") + } } + true } } } @@ -177,31 +182,42 @@ abstract class ListFragment : protected fun openMusicMenu(anchor: View, @MenuRes menuRes: Int, artist: Artist) { logD("Launching new artist menu: ${artist.name}") - openMusicMenuImpl(anchor, menuRes) { - when (it.itemId) { - R.id.action_play -> { - playbackModel.play(artist) - } - R.id.action_shuffle -> { - playbackModel.shuffle(artist) - } - R.id.action_play_next -> { - playbackModel.playNext(artist) - requireContext().showToast(R.string.lng_queue_added) - } - R.id.action_queue_add -> { - playbackModel.addToQueue(artist) - 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") + openMenu(anchor, menuRes) { + val playable = artist.songs.isNotEmpty() + 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_playlist_add).isEnabled = playable + menu.findItem(R.id.action_share).isEnabled = playable + + setOnMenuItemClickListener { + when (it.itemId) { + R.id.action_play -> { + playbackModel.play(artist) + } + R.id.action_shuffle -> { + playbackModel.shuffle(artist) + } + R.id.action_play_next -> { + playbackModel.playNext(artist) + requireContext().showToast(R.string.lng_queue_added) + } + R.id.action_queue_add -> { + playbackModel.addToQueue(artist) + 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 : protected fun openMusicMenu(anchor: View, @MenuRes menuRes: Int, genre: Genre) { logD("Launching new genre menu: ${genre.name}") - openMusicMenuImpl(anchor, menuRes) { - when (it.itemId) { - R.id.action_play -> { - playbackModel.play(genre) - } - R.id.action_shuffle -> { - playbackModel.shuffle(genre) - } - R.id.action_play_next -> { - playbackModel.playNext(genre) - requireContext().showToast(R.string.lng_queue_added) - } - R.id.action_queue_add -> { - playbackModel.addToQueue(genre) - requireContext().showToast(R.string.lng_queue_added) - } - R.id.action_playlist_add -> { - musicModel.addToPlaylist(genre) - } - R.id.action_share -> { - requireContext().share(genre) - } - else -> { - error("Unexpected menu item selected") + openMenu(anchor, menuRes) { + setOnMenuItemClickListener { + when (it.itemId) { + R.id.action_play -> { + playbackModel.play(genre) + } + R.id.action_shuffle -> { + playbackModel.shuffle(genre) + } + R.id.action_play_next -> { + playbackModel.playNext(genre) + requireContext().showToast(R.string.lng_queue_added) + } + R.id.action_queue_add -> { + playbackModel.addToQueue(genre) + requireContext().showToast(R.string.lng_queue_added) + } + R.id.action_playlist_add -> { + musicModel.addToPlaylist(genre) + } + R.id.action_share -> { + requireContext().share(genre) + } + else -> { + error("Unexpected menu item selected") + } } + true } } } @@ -257,46 +276,43 @@ abstract class ListFragment : protected fun openMusicMenu(anchor: View, @MenuRes menuRes: Int, playlist: Playlist) { 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) { - setOnMenuItemClickListener { item -> - onMenuItemClick(item) + val playable = playlist.songs.isNotEmpty() + 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 } } diff --git a/app/src/main/java/org/oxycblt/auxio/util/FrameworkUtil.kt b/app/src/main/java/org/oxycblt/auxio/util/FrameworkUtil.kt index f3091603e..55939af17 100644 --- a/app/src/main/java/org/oxycblt/auxio/util/FrameworkUtil.kt +++ b/app/src/main/java/org/oxycblt/auxio/util/FrameworkUtil.kt @@ -284,6 +284,7 @@ fun Context.share(parent: MusicParent) = share(parent.songs) /** * Share an arbitrary list of [Song]s. + * * @param songs The [Song]s to share. */ fun Context.share(songs: List) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c09fbe4ea..e57eeb348 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -386,6 +386,8 @@ %d Selected + + Editing %s Disc %d