From 1980dafcff2820a9b365abde283b3f6ecbcb06a2 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Thu, 26 Nov 2020 14:31:13 -0700 Subject: [PATCH] Minor fixes Fix some bugs/problems here and there. --- app/build.gradle | 1 - .../auxio/detail/AlbumDetailFragment.kt | 18 +++-- .../auxio/detail/GenreDetailFragment.kt | 2 +- .../oxycblt/auxio/library/LibraryFragment.kt | 4 +- .../oxycblt/auxio/loading/LoadingFragment.kt | 3 +- .../oxycblt/auxio/loading/LoadingViewModel.kt | 4 +- .../org/oxycblt/auxio/music/MusicStore.kt | 81 ++++++++++--------- .../auxio/playback/queue/QueueAdapter.kt | 5 +- .../recycler/viewholders/ModelHolders.kt | 2 - .../org/oxycblt/auxio/ui/InterfaceUtils.kt | 16 ---- app/src/main/res/anim/anim_nav_slide_down.xml | 2 +- app/src/main/res/anim/anim_nav_slide_up.xml | 2 +- app/src/main/res/anim/anim_stationary.xml | 2 +- build.gradle | 1 + 14 files changed, 67 insertions(+), 76 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 23c89d394..9bac620b2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -90,7 +90,6 @@ dependencies { // Fast-Scroll [Too lazy to make it myself] implementation 'com.reddit:indicator-fast-scroll:1.3.0' - // --- DEV --- // Lint 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 aabb2bfa9..355172c81 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt @@ -16,6 +16,7 @@ import org.oxycblt.auxio.music.MusicStore import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.playback.PlaybackViewModel import org.oxycblt.auxio.playback.state.PlaybackMode +import org.oxycblt.auxio.ui.createToast import org.oxycblt.auxio.ui.disable import org.oxycblt.auxio.ui.setupAlbumSongActions @@ -80,9 +81,12 @@ class AlbumDetailFragment : DetailFragment() { detailModel.currentAlbum.value!!, false ) - R.id.action_queue_add -> playbackModel.addToUserQueue( - detailModel.currentAlbum.value!!.songs - ) + R.id.action_queue_add -> { + playbackModel.addToUserQueue( + detailModel.currentAlbum.value!!.songs + ) + context.getString(R.string.label_queue_added).createToast(requireContext()) + } } true @@ -139,11 +143,9 @@ class AlbumDetailFragment : DetailFragment() { binding.albumSongRecycler.post { lastHolder?.removePlaying() - lastHolder = ( - binding.albumSongRecycler.getChildViewHolder( - binding.albumSongRecycler.getChildAt(pos) - ) as AlbumSongAdapter.ViewHolder - ) + lastHolder = binding.albumSongRecycler.getChildViewHolder( + binding.albumSongRecycler.getChildAt(pos) + ) as AlbumSongAdapter.ViewHolder lastHolder?.setPlaying(requireContext()) } 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 a37cc6116..d99772c77 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt @@ -57,7 +57,7 @@ class GenreDetailFragment : DetailFragment() { }, doOnLongClick = { data, view -> PopupMenu(requireContext(), view).setupArtistActions( - data, requireContext(), playbackModel + data, playbackModel ) } ) diff --git a/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt b/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt index 286441162..b2a638728 100644 --- a/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt @@ -186,8 +186,8 @@ class LibraryFragment : Fragment(), SearchView.OnQueryTextListener { when (data) { is Song -> menu.setupSongActions(data, requireContext(), playbackModel) is Album -> menu.setupAlbumActions(data, requireContext(), playbackModel) - is Artist -> menu.setupArtistActions(data, requireContext(), playbackModel) - is Genre -> menu.setupGenreActions(data, requireContext(), playbackModel) + is Artist -> menu.setupArtistActions(data, playbackModel) + is Genre -> menu.setupGenreActions(data, playbackModel) else -> { } diff --git a/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt b/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt index 336198b8d..ee7a52d03 100644 --- a/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt @@ -18,7 +18,7 @@ import org.oxycblt.auxio.music.MusicStore import org.oxycblt.auxio.music.processing.MusicLoaderResponse /** - * The intermediary [Fragment] that asks for the READ_EXTERNAL_STORAGE permission and runs + * An intermediary [Fragment] that asks for the READ_EXTERNAL_STORAGE permission and runs * the music loading process in the background. * @author OxygenCobalt */ @@ -93,6 +93,7 @@ class LoadingFragment : Fragment(R.layout.fragment_loading) { loadingModel.doGrant.observe(viewLifecycleOwner) { if (it) { permLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE) + returnToLoading(binding) loadingModel.doneWithGrant() } } diff --git a/app/src/main/java/org/oxycblt/auxio/loading/LoadingViewModel.kt b/app/src/main/java/org/oxycblt/auxio/loading/LoadingViewModel.kt index 284428495..3fb276ebd 100644 --- a/app/src/main/java/org/oxycblt/auxio/loading/LoadingViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/loading/LoadingViewModel.kt @@ -43,9 +43,7 @@ class LoadingViewModel(private val app: Application) : ViewModel() { viewModelScope.launch { val musicStore = MusicStore.getInstance() - val response = withContext(Dispatchers.IO) { - return@withContext musicStore.load(app) - } + val response = musicStore.load(app) withContext(Dispatchers.Main) { mResponse.value = response diff --git a/app/src/main/java/org/oxycblt/auxio/music/MusicStore.kt b/app/src/main/java/org/oxycblt/auxio/music/MusicStore.kt index 09639e08a..33e878f95 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicStore.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicStore.kt @@ -2,6 +2,8 @@ package org.oxycblt.auxio.music import android.app.Application import android.util.Log +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext import org.oxycblt.auxio.R import org.oxycblt.auxio.music.processing.MusicLoader import org.oxycblt.auxio.music.processing.MusicLoaderResponse @@ -36,56 +38,61 @@ class MusicStore private constructor() { var loaded = false private set - // Load/Sort the entire library. - // ONLY CALL THIS FROM AN IO THREAD. - fun load(app: Application): MusicLoaderResponse { - Log.i(this::class.simpleName, "Starting initial music load...") + /** + * Load/Sort the entire music library. + * ***THIS SHOULD ONLY BE RAN FROM AN IO THREAD.*** + * @param app [Application] required to load the music. + */ + suspend fun load(app: Application): MusicLoaderResponse { + return withContext(Dispatchers.IO) { + Log.i(this::class.simpleName, "Starting initial music load...") - val start = System.currentTimeMillis() + val start = System.currentTimeMillis() - // Get the placeholder strings, which are used by MusicLoader & MusicSorter for - // any music that doesn't have metadata. - val genrePlaceholder = app.getString(R.string.placeholder_genre) - val artistPlaceholder = app.getString(R.string.placeholder_artist) - val albumPlaceholder = app.getString(R.string.placeholder_album) + // Get the placeholder strings, which are used by MusicLoader & MusicSorter for + // any music that doesn't have metadata. + val genrePlaceholder = app.getString(R.string.placeholder_genre) + val artistPlaceholder = app.getString(R.string.placeholder_artist) + val albumPlaceholder = app.getString(R.string.placeholder_album) - val loader = MusicLoader( - app.contentResolver, - - genrePlaceholder, - artistPlaceholder, - albumPlaceholder - ) - - if (loader.response == MusicLoaderResponse.DONE) { - // If the loading succeeds, then sort the songs and update the value - val sorter = MusicSorter( - loader.genres, - loader.artists, - loader.albums, - loader.songs, + val loader = MusicLoader( + app.contentResolver, genrePlaceholder, artistPlaceholder, albumPlaceholder ) - mSongs = sorter.songs.toList() - mAlbums = sorter.albums.toList() - mArtists = sorter.artists.toList() - mGenres = sorter.genres.toList() + if (loader.response == MusicLoaderResponse.DONE) { + // If the loading succeeds, then sort the songs and update the value + val sorter = MusicSorter( + loader.genres, + loader.artists, + loader.albums, + loader.songs, - val elapsed = System.currentTimeMillis() - start + genrePlaceholder, + artistPlaceholder, + albumPlaceholder + ) - Log.i( - this::class.simpleName, - "Music load completed successfully in ${elapsed}ms." - ) + mSongs = sorter.songs.toList() + mAlbums = sorter.albums.toList() + mArtists = sorter.artists.toList() + mGenres = sorter.genres.toList() - loaded = true + val elapsed = System.currentTimeMillis() - start + + Log.i( + this::class.simpleName, + "Music load completed successfully in ${elapsed}ms." + ) + + loaded = true + } + + loader.response } - - return loader.response } fun getListForShowMode(showMode: ShowMode): List { diff --git a/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueAdapter.kt b/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueAdapter.kt index 582d353c0..a20b7a936 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueAdapter.kt @@ -118,8 +118,9 @@ class QueueAdapter( } private fun clearUserQueue() { - val nextQueueHeaderIndex = data.indexOfLast { it is Header } - val slice = data.slice(0 until nextQueueHeaderIndex) + val nextQueueHeaderIndex = data.indexOfLast { it is Header && !it.isAction } + Log.d(this::class.simpleName, nextQueueHeaderIndex.toString()) + val slice = data.slice(0..nextQueueHeaderIndex.dec()) data.removeAll(slice) notifyItemRangeRemoved(0, slice.size) diff --git a/app/src/main/java/org/oxycblt/auxio/recycler/viewholders/ModelHolders.kt b/app/src/main/java/org/oxycblt/auxio/recycler/viewholders/ModelHolders.kt index 4bf7c8905..247313e20 100644 --- a/app/src/main/java/org/oxycblt/auxio/recycler/viewholders/ModelHolders.kt +++ b/app/src/main/java/org/oxycblt/auxio/recycler/viewholders/ModelHolders.kt @@ -98,8 +98,6 @@ class AlbumViewHolder private constructor( } } -// TODO: Add indicators to song recycler items when they're being played? - class SongViewHolder private constructor( private val binding: ItemSongBinding, doOnClick: (data: Song) -> Unit, diff --git a/app/src/main/java/org/oxycblt/auxio/ui/InterfaceUtils.kt b/app/src/main/java/org/oxycblt/auxio/ui/InterfaceUtils.kt index 337f18647..70461d02a 100644 --- a/app/src/main/java/org/oxycblt/auxio/ui/InterfaceUtils.kt +++ b/app/src/main/java/org/oxycblt/auxio/ui/InterfaceUtils.kt @@ -153,18 +153,10 @@ fun PopupMenu.setupAlbumActions( */ fun PopupMenu.setupArtistActions( artist: Artist, - context: Context, playbackModel: PlaybackViewModel ) { setOnMenuItemClickListener { when (it.itemId) { - R.id.action_queue_add -> { - playbackModel.addToUserQueue(artist.songs) - context.getString(R.string.label_queue_added).createToast(context) - - true - } - R.id.action_play -> { playbackModel.playArtist(artist, false) true @@ -186,18 +178,10 @@ fun PopupMenu.setupArtistActions( */ fun PopupMenu.setupGenreActions( genre: Genre, - context: Context, playbackModel: PlaybackViewModel ) { setOnMenuItemClickListener { when (it.itemId) { - R.id.action_queue_add -> { - playbackModel.addToUserQueue(genre.songs) - context.getString(R.string.label_queue_added).createToast(context) - - true - } - R.id.action_play -> { playbackModel.playGenre(genre, false) true diff --git a/app/src/main/res/anim/anim_nav_slide_down.xml b/app/src/main/res/anim/anim_nav_slide_down.xml index 47a84154d..3a33ca190 100644 --- a/app/src/main/res/anim/anim_nav_slide_down.xml +++ b/app/src/main/res/anim/anim_nav_slide_down.xml @@ -1,6 +1,6 @@ \ No newline at end of file diff --git a/app/src/main/res/anim/anim_nav_slide_up.xml b/app/src/main/res/anim/anim_nav_slide_up.xml index 5a6bfd2b8..fd61456c1 100644 --- a/app/src/main/res/anim/anim_nav_slide_up.xml +++ b/app/src/main/res/anim/anim_nav_slide_up.xml @@ -1,6 +1,6 @@ \ No newline at end of file diff --git a/app/src/main/res/anim/anim_stationary.xml b/app/src/main/res/anim/anim_stationary.xml index 121ba6caf..10b171054 100644 --- a/app/src/main/res/anim/anim_stationary.xml +++ b/app/src/main/res/anim/anim_stationary.xml @@ -4,7 +4,7 @@ https://stackoverflow.com/a/64314693/14143986 --> diff --git a/build.gradle b/build.gradle index 764ebecb2..46d273de3 100644 --- a/build.gradle +++ b/build.gradle @@ -20,6 +20,7 @@ allprojects { repositories { google() jcenter() + maven { url "https://jitpack.io" } } }