From 391ca70822fb8fd02e8b3fe2d8129559ecdfc334 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Fri, 5 Mar 2021 14:57:44 -0700 Subject: [PATCH] Update playback system Tweak some things in PlaybackService and PlaybackStateManager to make them more elegant. --- .../java/org/oxycblt/auxio/MainActivity.kt | 7 ++-- .../org/oxycblt/auxio/music/MusicStore.kt | 4 +-- .../playback/state/PlaybackStateManager.kt | 34 +++++++------------ .../auxio/playback/system/PlaybackService.kt | 2 -- .../auxio/settings/SettingsListFragment.kt | 1 - .../oxycblt/auxio/songs/CobaltScrollThumb.kt | 15 ++++---- .../main/java/org/oxycblt/auxio/ui/Accent.kt | 8 ++--- 7 files changed, 27 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/MainActivity.kt b/app/src/main/java/org/oxycblt/auxio/MainActivity.kt index 1ab0c8729..93aa8fa73 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainActivity.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainActivity.kt @@ -30,13 +30,10 @@ class MainActivity : AppCompatActivity() { ) val settingsManager = SettingsManager.getInstance() + val newAccent = Accent.set(settingsManager.accent) AppCompatDelegate.setDefaultNightMode(settingsManager.theme) - - val accent = Accent.set(settingsManager.accent) - - // Apply the theme - setTheme(accent.theme) + setTheme(newAccent.theme) if (isEdgeOn()) { doEdgeToEdgeSetup(binding) 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 a4eb16acd..ecc3310e9 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicStore.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicStore.kt @@ -28,7 +28,7 @@ class MusicStore private constructor() { val songs: List get() = mSongs /** All parent models (ex Albums, Artists) loaded by Auxio */ - val parents: MutableList by lazy { + val parents: List by lazy { mutableListOf().apply { addAll(mGenres) addAll(mArtists) @@ -50,7 +50,7 @@ class MusicStore private constructor() { } /** - * Do the internal music loading process. + * Do the actual music loading process internally. */ private fun loadMusicInternal(context: Context): Response { logD("Starting initial music load...") diff --git a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt index e4babfac1..dcbd7626f 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt @@ -183,9 +183,7 @@ class PlaybackStateManager private constructor() { mMode = mode - clearLoopMode() updatePlayback(song) - // Keep shuffle on, if enabled setShuffling(settingsManager.keepShuffle && mIsShuffling, keepSong = true) } @@ -217,7 +215,6 @@ class PlaybackStateManager private constructor() { } } - clearLoopMode() setShuffling(shuffled, keepSong = false) updatePlayback(mQueue[0]) } @@ -232,8 +229,6 @@ class PlaybackStateManager private constructor() { setShuffling(true, keepSong = false) updatePlayback(mQueue[0]) - - // FIXME: Add clearLoopMode here? } /** @@ -248,6 +243,8 @@ class PlaybackStateManager private constructor() { if (!mIsPlaying) { setPlaying(true) } + + clearLoopMode() } // --- QUEUE FUNCTIONS --- @@ -256,8 +253,6 @@ class PlaybackStateManager private constructor() { * Go to the next song, along with doing all the checks that entails. */ fun next() { - clearLoopMode() - // If there's anything in the user queue, go to the first song in there instead // of incrementing the index. if (mUserQueue.isNotEmpty()) { @@ -298,7 +293,6 @@ class PlaybackStateManager private constructor() { mIndex = mIndex.dec() } - clearLoopMode() updatePlayback(mQueue[mIndex]) forceQueueUpdate() } @@ -315,6 +309,7 @@ class PlaybackStateManager private constructor() { mIsInUserQueue = false mSong = mQueue[0] + clearLoopMode() setPlaying(false) forceQueueUpdate() } @@ -623,33 +618,30 @@ class PlaybackStateManager private constructor() { suspend fun restoreFromDatabase(context: Context) { logD("Getting state from DB.") - val now: Long + val start: Long val playbackState: PlaybackState? + val queueItems: List - // The coroutine call is locked at queueItems so that this function does not - // go ahead until EVERYTHING is read. - // TODO: Improve this - val queueItems = withContext(Dispatchers.IO) { - now = System.currentTimeMillis() + withContext(Dispatchers.IO) { + start = System.currentTimeMillis() val database = PlaybackStateDatabase.getInstance(context) playbackState = database.readState() - database.readQueue() + queueItems = database.readQueue() } // Get off the IO coroutine since it will cause LiveData updates to throw an exception if (playbackState != null) { - logD("Found playback state $playbackState") - logD("Found queue size ${queueItems.size}") + logD("Found playback state $playbackState with queue size ${queueItems.size}") unpackFromPlaybackState(playbackState) unpackQueue(queueItems) doParentSanityCheck() } - logD("Restore finished in ${System.currentTimeMillis() - now}ms") + logD("Restore finished in ${System.currentTimeMillis() - start}ms") markRestored() } @@ -717,9 +709,9 @@ class PlaybackStateManager private constructor() { // When unpacking, first traverse albums and then traverse album songs to reduce // the amount of comparisons in large queues. queueItems.forEach { item -> - musicStore.albums.find { - it.name == item.albumName - }?.songs?.find { it.name == item.songName }?.let { song -> + val album = musicStore.albums.find { it.name == item.albumName } + + album?.songs?.find { it.name == item.songName }?.let { song -> if (item.isUserQueue) { mUserQueue.add(song) } else { diff --git a/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt index 12e190245..d2fa007d1 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt @@ -220,8 +220,6 @@ class PlaybackService : Service(), Player.EventListener, PlaybackStateManager.Ca this, song, settingsManager.colorizeNotif, ::startForegroundOrNotify ) - logD("Song Status: $song") - return } diff --git a/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt b/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt index 6e4746596..9ced9bd8c 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt @@ -155,7 +155,6 @@ class SettingsListFragment : PreferenceFragmentCompat() { val recycler = RecyclerView(requireContext()).apply { adapter = AccentAdapter { accent -> if (accent != Accent.get()) { - // TODO: Move this to Accent.set? settingsManager.accent = accent requireActivity().recreate() diff --git a/app/src/main/java/org/oxycblt/auxio/songs/CobaltScrollThumb.kt b/app/src/main/java/org/oxycblt/auxio/songs/CobaltScrollThumb.kt index d33b9a801..ffd2da454 100644 --- a/app/src/main/java/org/oxycblt/auxio/songs/CobaltScrollThumb.kt +++ b/app/src/main/java/org/oxycblt/auxio/songs/CobaltScrollThumb.kt @@ -24,8 +24,7 @@ import org.oxycblt.auxio.ui.inflater /** * A slimmed-down variant of [com.reddit.indicatorfastscroll.FastScrollerThumbView] designed - * specifically for Auxio. Also fixes a memory leak that occurs from a bug fix they - * added. + * specifically for Auxio. Also fixes a memory leak that occurs from a bug fix they added. * @author OxygenCobalt */ class CobaltScrollThumb @JvmOverloads constructor( @@ -88,16 +87,18 @@ class CobaltScrollThumb @JvmOverloads constructor( } @Suppress("ClickableViewAccessibility") - scrollView.setOnTouchListener { v, event -> + scrollView.setOnTouchListener { _, event -> scrollView.onTouchEvent(event) scrollView.performClick() val action = event.actionMasked + val actionValid = action != MotionEvent.ACTION_UP && action != MotionEvent.ACTION_CANCEL - // If we arent deselecting the scroll view, determine if we are selecting an item. - isActivated = if ( - action != MotionEvent.ACTION_UP && action != MotionEvent.ACTION_CANCEL - ) isPointerOnItem(scrollView, event.y.toInt()) else false + isActivated = if (actionValid) { + isPointerOnItem(scrollView, event.y.toInt()) + } else { + false + } true } diff --git a/app/src/main/java/org/oxycblt/auxio/ui/Accent.kt b/app/src/main/java/org/oxycblt/auxio/ui/Accent.kt index 5295a14c7..0dd144f99 100644 --- a/app/src/main/java/org/oxycblt/auxio/ui/Accent.kt +++ b/app/src/main/java/org/oxycblt/auxio/ui/Accent.kt @@ -9,7 +9,6 @@ import androidx.annotation.StringRes import androidx.annotation.StyleRes import androidx.core.text.HtmlCompat import org.oxycblt.auxio.R -import org.oxycblt.auxio.settings.SettingsManager import java.util.Locale /** @@ -71,6 +70,7 @@ data class Accent(@ColorRes val color: Int, @StyleRes val theme: Int, @StringRes /** * Get the current accent. * @return The current accent + * @throws IllegalStateException When the accent has not been set. */ fun get(): Accent { val cur = current @@ -79,11 +79,7 @@ data class Accent(@ColorRes val color: Int, @StyleRes val theme: Int, @StringRes return cur } - synchronized(this) { - val newCur = SettingsManager.getInstance().accent - current = newCur - return newCur - } + error("Accent must be set before retrieving it.") } /**