From 151b69bedb1a24a7517795dc79548a65ec025841 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Thu, 3 Aug 2023 11:52:09 -0600 Subject: [PATCH] list: add selection menu Add a menu dialog for selections. This more or less completes the bottom sheet menu functionality. Resolves #454. --- .../java/org/oxycblt/auxio/MainFragment.kt | 6 ++- .../auxio/detail/AlbumDetailFragment.kt | 5 +- .../auxio/detail/ArtistDetailFragment.kt | 9 ++-- .../auxio/detail/GenreDetailFragment.kt | 7 +-- .../auxio/detail/PlaylistDetailFragment.kt | 7 +-- .../org/oxycblt/auxio/home/HomeFragment.kt | 1 + .../auxio/home/list/AlbumListFragment.kt | 2 +- .../auxio/home/list/ArtistListFragment.kt | 2 +- .../auxio/home/list/GenreListFragment.kt | 2 +- .../auxio/home/list/PlaylistListFragment.kt | 2 +- .../auxio/home/list/SongListFragment.kt | 2 +- .../org/oxycblt/auxio/list/ListViewModel.kt | 12 +++++ .../oxycblt/auxio/list/SelectionFragment.kt | 22 ++------- .../java/org/oxycblt/auxio/list/menu/Menu.kt | 7 +++ .../auxio/list/menu/MenuDialogFragmentImpl.kt | 48 +++++++++++++++++++ .../oxycblt/auxio/list/menu/MenuViewModel.kt | 7 +++ .../auxio/playback/PlaybackPanelFragment.kt | 2 +- .../oxycblt/auxio/search/SearchFragment.kt | 11 +++-- .../org/oxycblt/auxio/util/FrameworkUtil.kt | 3 +- .../res/menu/{item_album.xml => album.xml} | 0 .../{item_album_song.xml => album_song.xml} | 0 ...item_artist_album.xml => artist_album.xml} | 0 .../{item_artist_song.xml => artist_song.xml} | 0 ...item_detail_album.xml => detail_album.xml} | 0 ...em_detail_parent.xml => detail_parent.xml} | 0 ...etail_playlist.xml => detail_playlist.xml} | 0 .../res/menu/{item_parent.xml => parent.xml} | 0 ...em_playback_song.xml => playback_song.xml} | 0 .../menu/{item_playlist.xml => playlist.xml} | 0 ...em_playlist_song.xml => playlist_song.xml} | 0 app/src/main/res/menu/selection.xml | 30 ++++++++++++ .../main/res/menu/{item_song.xml => song.xml} | 0 app/src/main/res/menu/toolbar_selection.xml | 16 +------ app/src/main/res/navigation/inner.xml | 28 +++++++++++ app/src/main/res/values/strings.xml | 4 +- 35 files changed, 177 insertions(+), 58 deletions(-) rename app/src/main/res/menu/{item_album.xml => album.xml} (100%) rename app/src/main/res/menu/{item_album_song.xml => album_song.xml} (100%) rename app/src/main/res/menu/{item_artist_album.xml => artist_album.xml} (100%) rename app/src/main/res/menu/{item_artist_song.xml => artist_song.xml} (100%) rename app/src/main/res/menu/{item_detail_album.xml => detail_album.xml} (100%) rename app/src/main/res/menu/{item_detail_parent.xml => detail_parent.xml} (100%) rename app/src/main/res/menu/{item_detail_playlist.xml => detail_playlist.xml} (100%) rename app/src/main/res/menu/{item_parent.xml => parent.xml} (100%) rename app/src/main/res/menu/{item_playback_song.xml => playback_song.xml} (100%) rename app/src/main/res/menu/{item_playlist.xml => playlist.xml} (100%) rename app/src/main/res/menu/{item_playlist_song.xml => playlist_song.xml} (100%) create mode 100644 app/src/main/res/menu/selection.xml rename app/src/main/res/menu/{item_song.xml => song.xml} (100%) diff --git a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt index 2d510ea36..549ac2aa4 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt @@ -298,7 +298,11 @@ class MainFragment : initialNavDestinationChange = true return } - listModel.dropSelection() + if (destination.id != R.id.selection_menu_dialog) { + // Drop any pending playlist edits when navigating away. This could actually happen + // if the user is quick enough. + listModel.dropSelection() + } } private fun handleShowOuter(outer: Outer?) { 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 7227d9aa6..3fd4a6963 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt @@ -101,7 +101,7 @@ class AlbumDetailFragment : setNavigationOnClickListener { findNavController().navigateUp() } overrideOnOverflowMenuClick { listModel.openMenu( - R.menu.item_detail_album, unlikelyToBeNull(detailModel.currentAlbum.value)) + R.menu.detail_album, unlikelyToBeNull(detailModel.currentAlbum.value)) } } @@ -145,7 +145,7 @@ class AlbumDetailFragment : } override fun onOpenMenu(item: Song) { - listModel.openMenu(R.menu.item_album_song, item, detailModel.playInAlbumWith) + listModel.openMenu(R.menu.album_song, item, detailModel.playInAlbumWith) } override fun onPlay() { @@ -243,6 +243,7 @@ class AlbumDetailFragment : when (menu) { is Menu.ForSong -> AlbumDetailFragmentDirections.openSongMenu(menu.parcel) is Menu.ForAlbum -> AlbumDetailFragmentDirections.openAlbumMenu(menu.parcel) + is Menu.ForSelection -> AlbumDetailFragmentDirections.openSelectionMenu(menu.parcel) is Menu.ForArtist, is Menu.ForGenre, is Menu.ForPlaylist -> error("Unexpected menu $menu") 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 c209a1a05..a611af6f4 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt @@ -100,7 +100,7 @@ class ArtistDetailFragment : setOnMenuItemClickListener(this@ArtistDetailFragment) overrideOnOverflowMenuClick { listModel.openMenu( - R.menu.item_detail_parent, unlikelyToBeNull(detailModel.currentArtist.value)) + R.menu.detail_parent, unlikelyToBeNull(detailModel.currentArtist.value)) } } @@ -152,9 +152,8 @@ class ArtistDetailFragment : override fun onOpenMenu(item: Music) { when (item) { - is Song -> - listModel.openMenu(R.menu.item_artist_song, item, detailModel.playInArtistWith) - is Album -> listModel.openMenu(R.menu.item_artist_album, item) + is Song -> listModel.openMenu(R.menu.artist_song, item, detailModel.playInArtistWith) + is Album -> listModel.openMenu(R.menu.artist_album, item) else -> error("Unexpected datatype: ${item::class.simpleName}") } } @@ -239,6 +238,8 @@ class ArtistDetailFragment : is Menu.ForSong -> ArtistDetailFragmentDirections.openSongMenu(menu.parcel) is Menu.ForAlbum -> ArtistDetailFragmentDirections.openAlbumMenu(menu.parcel) is Menu.ForArtist -> ArtistDetailFragmentDirections.openArtistMenu(menu.parcel) + is Menu.ForSelection -> + ArtistDetailFragmentDirections.openSelectionMenu(menu.parcel) is Menu.ForGenre, is Menu.ForPlaylist -> error("Unexpected menu $menu") } 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 8b9cf5a68..522ebbfa6 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt @@ -98,7 +98,7 @@ class GenreDetailFragment : setOnMenuItemClickListener(this@GenreDetailFragment) overrideOnOverflowMenuClick { listModel.openMenu( - R.menu.item_detail_parent, unlikelyToBeNull(detailModel.currentGenre.value)) + R.menu.detail_parent, unlikelyToBeNull(detailModel.currentGenre.value)) } } @@ -150,8 +150,8 @@ class GenreDetailFragment : override fun onOpenMenu(item: Music) { when (item) { - is Artist -> listModel.openMenu(R.menu.item_parent, item) - is Song -> listModel.openMenu(R.menu.item_song, item, detailModel.playInGenreWith) + is Artist -> listModel.openMenu(R.menu.parent, item) + is Song -> listModel.openMenu(R.menu.song, item, detailModel.playInGenreWith) else -> error("Unexpected datatype: ${item::class.simpleName}") } } @@ -240,6 +240,7 @@ class GenreDetailFragment : is Menu.ForSong -> GenreDetailFragmentDirections.openSongMenu(menu.parcel) is Menu.ForArtist -> GenreDetailFragmentDirections.openArtistMenu(menu.parcel) is Menu.ForGenre -> GenreDetailFragmentDirections.openGenreMenu(menu.parcel) + is Menu.ForSelection -> GenreDetailFragmentDirections.openSelectionMenu(menu.parcel) is Menu.ForAlbum, is Menu.ForPlaylist -> error("Unexpected menu $menu") } 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 9a2c02777..103d1034f 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/PlaylistDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/PlaylistDetailFragment.kt @@ -104,8 +104,7 @@ class PlaylistDetailFragment : setOnMenuItemClickListener(this@PlaylistDetailFragment) overrideOnOverflowMenuClick { listModel.openMenu( - R.menu.item_detail_playlist, - unlikelyToBeNull(detailModel.currentPlaylist.value)) + R.menu.detail_playlist, unlikelyToBeNull(detailModel.currentPlaylist.value)) } } @@ -200,7 +199,7 @@ class PlaylistDetailFragment : } override fun onOpenMenu(item: Song) { - listModel.openMenu(R.menu.item_playlist_song, item, detailModel.playInPlaylistWith) + listModel.openMenu(R.menu.playlist_song, item, detailModel.playInPlaylistWith) } override fun onPlay() { @@ -302,6 +301,8 @@ class PlaylistDetailFragment : is Menu.ForSong -> PlaylistDetailFragmentDirections.openSongMenu(menu.parcel) is Menu.ForPlaylist -> PlaylistDetailFragmentDirections.openPlaylistMenu(menu.parcel) + is Menu.ForSelection -> + PlaylistDetailFragmentDirections.openSelectionMenu(menu.parcel) is Menu.ForArtist, is Menu.ForAlbum, is Menu.ForGenre -> error("Unexpected menu $menu") diff --git a/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt index 66de36045..7228e10ec 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt @@ -501,6 +501,7 @@ class HomeFragment : is Menu.ForArtist -> HomeFragmentDirections.openArtistMenu(menu.parcel) is Menu.ForGenre -> HomeFragmentDirections.openGenreMenu(menu.parcel) is Menu.ForPlaylist -> HomeFragmentDirections.openPlaylistMenu(menu.parcel) + is Menu.ForSelection -> HomeFragmentDirections.openSelectionMenu(menu.parcel) } findNavController().navigateSafe(directions) } diff --git a/app/src/main/java/org/oxycblt/auxio/home/list/AlbumListFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/list/AlbumListFragment.kt index a7c63a455..74c942dae 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/list/AlbumListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/list/AlbumListFragment.kt @@ -140,7 +140,7 @@ class AlbumListFragment : } override fun onOpenMenu(item: Album) { - listModel.openMenu(R.menu.item_album, item) + listModel.openMenu(R.menu.album, item) } private fun updateAlbums(albums: List) { diff --git a/app/src/main/java/org/oxycblt/auxio/home/list/ArtistListFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/list/ArtistListFragment.kt index 84834cb74..7dc885308 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/list/ArtistListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/list/ArtistListFragment.kt @@ -116,7 +116,7 @@ class ArtistListFragment : } override fun onOpenMenu(item: Artist) { - listModel.openMenu(R.menu.item_parent, item) + listModel.openMenu(R.menu.parent, item) } private fun updateArtists(artists: List) { diff --git a/app/src/main/java/org/oxycblt/auxio/home/list/GenreListFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/list/GenreListFragment.kt index a39c0ee2d..3307fa721 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/list/GenreListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/list/GenreListFragment.kt @@ -115,7 +115,7 @@ class GenreListFragment : } override fun onOpenMenu(item: Genre) { - listModel.openMenu(R.menu.item_parent, item) + listModel.openMenu(R.menu.parent, item) } private fun updateGenres(genres: List) { diff --git a/app/src/main/java/org/oxycblt/auxio/home/list/PlaylistListFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/list/PlaylistListFragment.kt index d8a7ac175..4228c872a 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/list/PlaylistListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/list/PlaylistListFragment.kt @@ -113,7 +113,7 @@ class PlaylistListFragment : } override fun onOpenMenu(item: Playlist) { - listModel.openMenu(R.menu.item_playlist, item) + listModel.openMenu(R.menu.playlist, item) } private fun updatePlaylists(playlists: List) { diff --git a/app/src/main/java/org/oxycblt/auxio/home/list/SongListFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/list/SongListFragment.kt index fb214b76b..04f9847f1 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/list/SongListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/list/SongListFragment.kt @@ -139,7 +139,7 @@ class SongListFragment : } override fun onOpenMenu(item: Song) { - listModel.openMenu(R.menu.item_song, item, homeModel.playWith) + listModel.openMenu(R.menu.song, item, homeModel.playWith) } private fun updateSongs(songs: List) { diff --git a/app/src/main/java/org/oxycblt/auxio/list/ListViewModel.kt b/app/src/main/java/org/oxycblt/auxio/list/ListViewModel.kt index ed6536fe2..e1f4380a5 100644 --- a/app/src/main/java/org/oxycblt/auxio/list/ListViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/list/ListViewModel.kt @@ -201,6 +201,18 @@ constructor(private val listSettings: ListSettings, private val musicRepository: openImpl(Menu.ForPlaylist(menuRes, playlist)) } + /** + * Open a menu for a [Song] selection. This is not a popup menu, instead actually a dialog of + * menu options with additional information. + * + * @param menuRes The resource of the menu to use. + * @param songs The [Song] selection to show. + */ + fun openMenu(@MenuRes menuRes: Int, songs: List) { + logD("Opening menu for ${songs.size} songs") + openImpl(Menu.ForSelection(menuRes, songs)) + } + private fun openImpl(menu: Menu) { val existing = _menu.flow.value if (existing != null) { diff --git a/app/src/main/java/org/oxycblt/auxio/list/SelectionFragment.kt b/app/src/main/java/org/oxycblt/auxio/list/SelectionFragment.kt index fd461d222..a0a73793f 100644 --- a/app/src/main/java/org/oxycblt/auxio/list/SelectionFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/list/SelectionFragment.kt @@ -26,7 +26,7 @@ import org.oxycblt.auxio.R import org.oxycblt.auxio.music.MusicViewModel import org.oxycblt.auxio.playback.PlaybackViewModel import org.oxycblt.auxio.ui.ViewBindingFragment -import org.oxycblt.auxio.util.share +import org.oxycblt.auxio.util.overrideOnOverflowMenuClick import org.oxycblt.auxio.util.showToast /** @@ -48,6 +48,9 @@ abstract class SelectionFragment : // Add cancel and menu item listeners to manage what occurs with the selection. setNavigationOnClickListener { listModel.dropSelection() } setOnMenuItemClickListener(this@SelectionFragment) + overrideOnOverflowMenuClick { + listModel.openMenu(R.menu.selection, listModel.takeSelection()) + } } } @@ -67,23 +70,6 @@ abstract class SelectionFragment : musicModel.addToPlaylist(listModel.takeSelection()) true } - R.id.action_selection_queue_add -> { - playbackModel.addToQueue(listModel.takeSelection()) - requireContext().showToast(R.string.lng_queue_added) - true - } - R.id.action_selection_play -> { - playbackModel.play(listModel.takeSelection()) - true - } - R.id.action_selection_shuffle -> { - playbackModel.shuffle(listModel.takeSelection()) - true - } - R.id.action_selection_share -> { - requireContext().share(listModel.takeSelection()) - true - } else -> false } diff --git a/app/src/main/java/org/oxycblt/auxio/list/menu/Menu.kt b/app/src/main/java/org/oxycblt/auxio/list/menu/Menu.kt index fc388cd36..24581b5d2 100644 --- a/app/src/main/java/org/oxycblt/auxio/list/menu/Menu.kt +++ b/app/src/main/java/org/oxycblt/auxio/list/menu/Menu.kt @@ -99,4 +99,11 @@ sealed interface Menu { @Parcelize data class Parcel(val res: Int, val playlistUid: Music.UID) : Menu.Parcel } + + class ForSelection(@MenuRes override val res: Int, val songs: List) : Menu { + override val parcel: Parcel + get() = Parcel(res, songs.map { it.uid }) + + @Parcelize data class Parcel(val res: Int, val songUids: List) : Menu.Parcel + } } diff --git a/app/src/main/java/org/oxycblt/auxio/list/menu/MenuDialogFragmentImpl.kt b/app/src/main/java/org/oxycblt/auxio/list/menu/MenuDialogFragmentImpl.kt index 9abf34133..bb971728a 100644 --- a/app/src/main/java/org/oxycblt/auxio/list/menu/MenuDialogFragmentImpl.kt +++ b/app/src/main/java/org/oxycblt/auxio/list/menu/MenuDialogFragmentImpl.kt @@ -34,6 +34,7 @@ import org.oxycblt.auxio.music.Playlist import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.music.resolveNames import org.oxycblt.auxio.playback.PlaybackViewModel +import org.oxycblt.auxio.playback.formatDurationMs import org.oxycblt.auxio.util.getPlural import org.oxycblt.auxio.util.share import org.oxycblt.auxio.util.showToast @@ -321,3 +322,50 @@ class PlaylistMenuDialogFragment : MenuDialogFragment() { } } } + +/** + * [MenuDialogFragment] implementation for a [Song] selection. + * + * @author Alexander Capehart (OxygenCobalt) + */ +@AndroidEntryPoint +class SelectionMenuDialogFragment : MenuDialogFragment() { + override val menuModel: MenuViewModel by activityViewModels() + override val listModel: ListViewModel by activityViewModels() + private val musicModel: MusicViewModel by activityViewModels() + private val playbackModel: PlaybackViewModel by activityViewModels() + private val args: SelectionMenuDialogFragmentArgs by navArgs() + + override val parcel + get() = args.parcel + + // Nothing to disable in song menus. + override fun getDisabledItemIds(menu: Menu.ForSelection) = setOf() + + override fun updateMenu(binding: DialogMenuBinding, menu: Menu.ForSelection) { + binding.menuCover.bind( + menu.songs, getString(R.string.desc_selection_image), R.drawable.ic_song_24) + binding.menuType.text = getString(R.string.lbl_selection) + binding.menuName.text = + requireContext().getPlural(R.plurals.fmt_song_count, menu.songs.size) + binding.menuInfo.text = menu.songs.sumOf { it.durationMs }.formatDurationMs(true) + } + + override fun onClick(item: MenuItem, menu: Menu.ForSelection) { + when (item.itemId) { + R.id.action_play -> playbackModel.play(menu.songs) + R.id.action_shuffle -> playbackModel.shuffle(menu.songs) + R.id.action_play_next -> { + playbackModel.playNext(menu.songs) + requireContext().showToast(R.string.lng_queue_added) + } + R.id.action_queue_add -> { + playbackModel.addToQueue(menu.songs) + requireContext().showToast(R.string.lng_queue_added) + } + R.id.action_share -> requireContext().share(menu.songs) + R.id.action_playlist_add -> musicModel.addToPlaylist(menu.songs) + else -> error("Unexpected menu item selected $item") + } + } +} diff --git a/app/src/main/java/org/oxycblt/auxio/list/menu/MenuViewModel.kt b/app/src/main/java/org/oxycblt/auxio/list/menu/MenuViewModel.kt index 0d5388854..18ff75ccc 100644 --- a/app/src/main/java/org/oxycblt/auxio/list/menu/MenuViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/list/menu/MenuViewModel.kt @@ -66,6 +66,7 @@ class MenuViewModel @Inject constructor(private val musicRepository: MusicReposi is Menu.ForArtist.Parcel -> unpackArtistParcel(parcel) is Menu.ForGenre.Parcel -> unpackGenreParcel(parcel) is Menu.ForPlaylist.Parcel -> unpackPlaylistParcel(parcel) + is Menu.ForSelection.Parcel -> unpackSelectionParcel(parcel) } private fun unpackSongParcel(parcel: Menu.ForSong.Parcel): Menu.ForSong? { @@ -94,4 +95,10 @@ class MenuViewModel @Inject constructor(private val musicRepository: MusicReposi val playlist = musicRepository.userLibrary?.findPlaylist(parcel.playlistUid) ?: return null return Menu.ForPlaylist(parcel.res, playlist) } + + private fun unpackSelectionParcel(parcel: Menu.ForSelection.Parcel): Menu.ForSelection? { + val deviceLibrary = musicRepository.deviceLibrary ?: return null + val songs = parcel.songUids.mapNotNull(deviceLibrary::findSong) + return Menu.ForSelection(parcel.res, songs) + } } diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackPanelFragment.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackPanelFragment.kt index bc842e28a..b43b3330e 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackPanelFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackPanelFragment.kt @@ -96,7 +96,7 @@ class PlaybackPanelFragment : playbackModel.song.value?.let { // No playback options are actually available in the menu, so use a junk // PlaySong option. - listModel.openMenu(R.menu.item_playback_song, it, PlaySong.ByItself) + listModel.openMenu(R.menu.playback_song, it, PlaySong.ByItself) } } } diff --git a/app/src/main/java/org/oxycblt/auxio/search/SearchFragment.kt b/app/src/main/java/org/oxycblt/auxio/search/SearchFragment.kt index 128a3c394..48a436730 100644 --- a/app/src/main/java/org/oxycblt/auxio/search/SearchFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/search/SearchFragment.kt @@ -184,11 +184,11 @@ class SearchFragment : ListFragment() { override fun onOpenMenu(item: Music) { when (item) { - is Song -> listModel.openMenu(R.menu.item_song, item, searchModel.playWith) - is Album -> listModel.openMenu(R.menu.item_album, item) - is Artist -> listModel.openMenu(R.menu.item_parent, item) - is Genre -> listModel.openMenu(R.menu.item_parent, item) - is Playlist -> listModel.openMenu(R.menu.item_playlist, item) + is Song -> listModel.openMenu(R.menu.song, item, searchModel.playWith) + is Album -> listModel.openMenu(R.menu.album, item) + is Artist -> listModel.openMenu(R.menu.parent, item) + is Genre -> listModel.openMenu(R.menu.parent, item) + is Playlist -> listModel.openMenu(R.menu.playlist, item) } } @@ -261,6 +261,7 @@ class SearchFragment : ListFragment() { is Menu.ForArtist -> SearchFragmentDirections.openArtistMenu(menu.parcel) is Menu.ForGenre -> SearchFragmentDirections.openGenreMenu(menu.parcel) is Menu.ForPlaylist -> SearchFragmentDirections.openPlaylistMenu(menu.parcel) + is Menu.ForSelection -> SearchFragmentDirections.openSelectionMenu(menu.parcel) } findNavController().navigateSafe(directions) // Keyboard is no longer needed. 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 e3f50ccec..e58a34c93 100644 --- a/app/src/main/java/org/oxycblt/auxio/util/FrameworkUtil.kt +++ b/app/src/main/java/org/oxycblt/auxio/util/FrameworkUtil.kt @@ -28,6 +28,7 @@ import androidx.annotation.RequiresApi import androidx.appcompat.view.menu.ActionMenuItemView import androidx.appcompat.widget.ActionMenuView import androidx.appcompat.widget.AppCompatButton +import androidx.appcompat.widget.Toolbar import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.app.ShareCompat import androidx.core.graphics.Insets @@ -111,7 +112,7 @@ val ViewBinding.context: Context * Override the behavior of a [MaterialToolbar]'s overflow menu to do something else. This is * extremely dumb, but required to hook overflow menus to bottom sheet menus. */ -fun MaterialToolbar.overrideOnOverflowMenuClick(block: (View) -> Unit) { +fun Toolbar.overrideOnOverflowMenuClick(block: (View) -> Unit) { for (toolbarChild in children) { if (toolbarChild is ActionMenuView) { for (menuChild in toolbarChild.children) { diff --git a/app/src/main/res/menu/item_album.xml b/app/src/main/res/menu/album.xml similarity index 100% rename from app/src/main/res/menu/item_album.xml rename to app/src/main/res/menu/album.xml diff --git a/app/src/main/res/menu/item_album_song.xml b/app/src/main/res/menu/album_song.xml similarity index 100% rename from app/src/main/res/menu/item_album_song.xml rename to app/src/main/res/menu/album_song.xml diff --git a/app/src/main/res/menu/item_artist_album.xml b/app/src/main/res/menu/artist_album.xml similarity index 100% rename from app/src/main/res/menu/item_artist_album.xml rename to app/src/main/res/menu/artist_album.xml diff --git a/app/src/main/res/menu/item_artist_song.xml b/app/src/main/res/menu/artist_song.xml similarity index 100% rename from app/src/main/res/menu/item_artist_song.xml rename to app/src/main/res/menu/artist_song.xml diff --git a/app/src/main/res/menu/item_detail_album.xml b/app/src/main/res/menu/detail_album.xml similarity index 100% rename from app/src/main/res/menu/item_detail_album.xml rename to app/src/main/res/menu/detail_album.xml diff --git a/app/src/main/res/menu/item_detail_parent.xml b/app/src/main/res/menu/detail_parent.xml similarity index 100% rename from app/src/main/res/menu/item_detail_parent.xml rename to app/src/main/res/menu/detail_parent.xml diff --git a/app/src/main/res/menu/item_detail_playlist.xml b/app/src/main/res/menu/detail_playlist.xml similarity index 100% rename from app/src/main/res/menu/item_detail_playlist.xml rename to app/src/main/res/menu/detail_playlist.xml diff --git a/app/src/main/res/menu/item_parent.xml b/app/src/main/res/menu/parent.xml similarity index 100% rename from app/src/main/res/menu/item_parent.xml rename to app/src/main/res/menu/parent.xml diff --git a/app/src/main/res/menu/item_playback_song.xml b/app/src/main/res/menu/playback_song.xml similarity index 100% rename from app/src/main/res/menu/item_playback_song.xml rename to app/src/main/res/menu/playback_song.xml diff --git a/app/src/main/res/menu/item_playlist.xml b/app/src/main/res/menu/playlist.xml similarity index 100% rename from app/src/main/res/menu/item_playlist.xml rename to app/src/main/res/menu/playlist.xml diff --git a/app/src/main/res/menu/item_playlist_song.xml b/app/src/main/res/menu/playlist_song.xml similarity index 100% rename from app/src/main/res/menu/item_playlist_song.xml rename to app/src/main/res/menu/playlist_song.xml diff --git a/app/src/main/res/menu/selection.xml b/app/src/main/res/menu/selection.xml new file mode 100644 index 000000000..1d4f3d94d --- /dev/null +++ b/app/src/main/res/menu/selection.xml @@ -0,0 +1,30 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/item_song.xml b/app/src/main/res/menu/song.xml similarity index 100% rename from app/src/main/res/menu/item_song.xml rename to app/src/main/res/menu/song.xml diff --git a/app/src/main/res/menu/toolbar_selection.xml b/app/src/main/res/menu/toolbar_selection.xml index 9dfda8a30..e1cf43ef0 100644 --- a/app/src/main/res/menu/toolbar_selection.xml +++ b/app/src/main/res/menu/toolbar_selection.xml @@ -12,19 +12,7 @@ android:icon="@drawable/ic_playlist_add_24" app:showAsAction="ifRoom"/> - - - \ No newline at end of file diff --git a/app/src/main/res/navigation/inner.xml b/app/src/main/res/navigation/inner.xml index 979b09b2d..ef19e5474 100644 --- a/app/src/main/res/navigation/inner.xml +++ b/app/src/main/res/navigation/inner.xml @@ -57,6 +57,9 @@ + @@ -152,6 +155,9 @@ + @@ -204,6 +210,9 @@ + @@ -250,6 +259,9 @@ + @@ -296,6 +308,9 @@ + @@ -339,6 +354,9 @@ + @@ -481,4 +499,14 @@ android:name="parcel" app:argType="org.oxycblt.auxio.list.menu.Menu$ForPlaylist$Parcel" /> + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f2bedcee8..fd9f2c2e7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -122,7 +122,6 @@ Add to playlist - Go to artist Go to album View properties @@ -167,6 +166,8 @@ Licenses Library statistics + Selection + @@ -335,6 +336,7 @@ Artist image for %s Genre image for %s Playlist image for %s + Selection image