From 39ba1c38ecb9fde919ecc43587c0ace126e72442 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Thu, 31 Dec 2020 19:07:16 -0700 Subject: [PATCH] Add option to not load cover art Add an option to not load cover art whatsoever. --- .../java/org/oxycblt/auxio/coil/CoilUtils.kt | 42 ++++++++++++++++--- .../auxio/playback/PlaybackFragment.kt | 14 +++++++ .../oxycblt/auxio/playback/PlaybackService.kt | 16 +++++++ .../auxio/settings/SettingsListFragment.kt | 18 +++++++- .../oxycblt/auxio/settings/SettingsManager.kt | 24 +++++++++-- app/src/main/res/values/strings.xml | 3 ++ app/src/main/res/xml/prefs_main.xml | 9 ++++ 7 files changed, 117 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/coil/CoilUtils.kt b/app/src/main/java/org/oxycblt/auxio/coil/CoilUtils.kt index 34c893f47..fb22f9baa 100644 --- a/app/src/main/java/org/oxycblt/auxio/coil/CoilUtils.kt +++ b/app/src/main/java/org/oxycblt/auxio/coil/CoilUtils.kt @@ -17,16 +17,29 @@ import org.oxycblt.auxio.music.Genre import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.settings.SettingsManager +// TODO: Stop disk caching + +// SettingsManager is lazy-initted to prevent it from being used before its initialized. +val settingsManager: SettingsManager by lazy { + SettingsManager.getInstance() +} + /** * Get a bitmap for a song. onDone will be called when the bitmap is loaded. * **Do not use this on the UI elements, instead use the Binding Adapters.** * @param context [Context] required * @param song Song to load the cover for - * @param onDone What to do with the bitmap when the loading is finished. Bitmap will be null if loading failed. + * @param onDone What to do with the bitmap when the loading is finished. Bitmap will be null if loading failed/shouldnt occur. */ fun getBitmap(context: Context, song: Song, onDone: (Bitmap?) -> Unit) { + if (!settingsManager.showCovers) { + onDone(null) + + return + } + val request = ImageRequest.Builder(context) - .data(song.album.coverUri) + .doCoverSetup(context, song) .target(onError = { onDone(null) }, onSuccess = { onDone(it.toBitmap()) }) .build() @@ -40,9 +53,14 @@ fun getBitmap(context: Context, song: Song, onDone: (Bitmap?) -> Unit) { */ @BindingAdapter("coverArt") fun ImageView.bindCoverArt(song: Song) { + if (!settingsManager.showCovers) { + setImageResource(R.drawable.ic_song) + return + } + val request = getDefaultRequest() - .error(R.drawable.ic_song) .doCoverSetup(context, song) + .error(R.drawable.ic_song) .build() Coil.imageLoader(context).enqueue(request) @@ -53,9 +71,14 @@ fun ImageView.bindCoverArt(song: Song) { */ @BindingAdapter("coverArt") fun ImageView.bindCoverArt(album: Album) { + if (!settingsManager.showCovers) { + setImageResource(R.drawable.ic_album) + return + } + val request = getDefaultRequest() - .error(R.drawable.ic_album) .doCoverSetup(context, album) + .error(R.drawable.ic_album) .build() Coil.imageLoader(context).enqueue(request) @@ -66,6 +89,10 @@ fun ImageView.bindCoverArt(album: Album) { */ @BindingAdapter("artistImage") fun ImageView.bindArtistImage(artist: Artist) { + if (!settingsManager.showCovers) { + setImageResource(R.drawable.ic_artist) + return + } val request: ImageRequest // If there is more than one album, then create a mosaic of them. @@ -106,6 +133,11 @@ fun ImageView.bindArtistImage(artist: Artist) { */ @BindingAdapter("genreImage") fun ImageView.bindGenreImage(genre: Genre) { + if (!settingsManager.showCovers) { + setImageResource(R.drawable.ic_genre) + return + } + val request: ImageRequest val genreCovers = mutableListOf() @@ -144,7 +176,7 @@ fun ImageRequest.Builder.doCoverSetup(context: Context, data: BaseModel): ImageR return this } - if (SettingsManager.getInstance().qualityCovers) { + if (settingsManager.useQualityCovers) { fetcher(QualityCoverFetcher(context)) if (data is Song) { diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt index 94162df4f..d9c654903 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt @@ -3,6 +3,7 @@ package org.oxycblt.auxio.playback import android.content.res.ColorStateList import android.graphics.drawable.AnimatedVectorDrawable import android.os.Bundle +import android.util.TypedValue import android.view.LayoutInflater import android.view.MenuItem import android.view.View @@ -17,9 +18,11 @@ import org.oxycblt.auxio.databinding.FragmentPlaybackBinding import org.oxycblt.auxio.detail.DetailViewModel import org.oxycblt.auxio.logD import org.oxycblt.auxio.playback.state.LoopMode +import org.oxycblt.auxio.settings.SettingsManager import org.oxycblt.auxio.ui.accent import org.oxycblt.auxio.ui.memberBinding import org.oxycblt.auxio.ui.toColor +import kotlin.math.roundToInt /** * A [Fragment] that displays more information about the song, along with more media controls. @@ -38,6 +41,7 @@ class PlaybackFragment : Fragment(), SeekBar.OnSeekBarChangeListener { private val accentColor: ColorStateList by lazy { ColorStateList.valueOf(accent.first.toColor(requireContext())) } + private val controlColor: ColorStateList by lazy { ColorStateList.valueOf(R.color.control_color.toColor(requireContext())) } @@ -61,6 +65,12 @@ class PlaybackFragment : Fragment(), SeekBar.OnSeekBarChangeListener { ) val queueMenuItem: MenuItem + val showCoverArt = SettingsManager.getInstance().showCovers + + val paddingPixels = TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, 64F, + requireContext().resources.displayMetrics + ).roundToInt() // --- UI SETUP --- @@ -97,6 +107,10 @@ class PlaybackFragment : Fragment(), SeekBar.OnSeekBarChangeListener { binding.song = it binding.playbackSeekBar.max = it.seconds.toInt() + + if (!showCoverArt) { + binding.playbackCover.setImageResource(R.drawable.ic_album) + } } else { logD("No song is being played, leaving.") diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackService.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackService.kt index 7706c72ea..a5540d99e 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackService.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackService.kt @@ -319,6 +319,22 @@ class PlaybackService : Service(), Player.EventListener, PlaybackStateManager.Ca startForegroundOrNotify("Notif action update") } + override fun onShowCoverUpdate(showCovers: Boolean) { + playbackManager.song?.let { + notification.setMetadata(this, it, settingsManager.colorizeNotif) { + startForegroundOrNotify("Cover update") + } + } + } + + override fun onQualityCoverUpdate(doQualityCovers: Boolean) { + playbackManager.song?.let { song -> + notification.setMetadata(this, song, settingsManager.colorizeNotif) { + startForegroundOrNotify("Quality cover update") + } + } + } + // --- OTHER FUNCTIONS --- /** 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 7359de5be..0fc21767f 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt @@ -105,10 +105,26 @@ class SettingsListFragment : PreferenceFragmentCompat() { } } + SettingsManager.Keys.KEY_SHOW_COVERS -> { + onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, _ -> + Coil.imageLoader(requireContext()).apply { + bitmapPool.clear() + memoryCache.clear() + } + + requireActivity().recreate() + + true + } + } + SettingsManager.Keys.KEY_QUALITY_COVERS -> { onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, _ -> // Clear out any cached images, before recreating the activity - Coil.imageLoader(requireContext()).bitmapPool.clear() + Coil.imageLoader(requireContext()).apply { + bitmapPool.clear() + memoryCache.clear() + } requireActivity().recreate() diff --git a/app/src/main/java/org/oxycblt/auxio/settings/SettingsManager.kt b/app/src/main/java/org/oxycblt/auxio/settings/SettingsManager.kt index 069d71b97..ecb49b0ca 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/SettingsManager.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/SettingsManager.kt @@ -73,10 +73,17 @@ class SettingsManager private constructor(context: Context) : ) ) + /** + * Whether to even loading embedded covers + * TODO: Make the UI result of this better + */ + val showCovers: Boolean + get() = sharedPrefs.getBoolean(Keys.KEY_SHOW_COVERS, true) + /** * Whether to ignore MediaStore covers */ - val qualityCovers: Boolean + val useQualityCovers: Boolean get() = sharedPrefs.getBoolean(Keys.KEY_QUALITY_COVERS, false) /** @@ -171,6 +178,14 @@ class SettingsManager private constructor(context: Context) : Keys.KEY_LIBRARY_DISPLAY_MODE -> callbacks.forEach { it.onLibDisplayModeUpdate(libraryDisplayMode) } + + Keys.KEY_SHOW_COVERS -> callbacks.forEach { + it.onShowCoverUpdate(showCovers) + } + + Keys.KEY_QUALITY_COVERS -> callbacks.forEach { + it.onQualityCoverUpdate(useQualityCovers) + } } } @@ -210,10 +225,11 @@ class SettingsManager private constructor(context: Context) : const val KEY_THEME = "KEY_THEME" const val KEY_ACCENT = "KEY_ACCENT" const val KEY_EDGE_TO_EDGE = "KEY_EDGE" + const val KEY_LIBRARY_DISPLAY_MODE = "KEY_LIBRARY_DISPLAY_MODE" + const val KEY_SHOW_COVERS = "KEY_SHOW_COVERS" + const val KEY_QUALITY_COVERS = "KEY_QUALITY_COVERS" const val KEY_COLORIZE_NOTIFICATION = "KEY_COLOR_NOTIF" const val KEY_USE_ALT_NOTIFICATION_ACTION = "KEY_ALT_NOTIF_ACTION" - const val KEY_LIBRARY_DISPLAY_MODE = "KEY_LIBRARY_DISPLAY_MODE" - const val KEY_QUALITY_COVERS = "KEY_QUALITY_COVERS" const val KEY_AUDIO_FOCUS = "KEY_AUDIO_FOCUS" const val KEY_PLUG_MANAGEMENT = "KEY_PLUG_MGT" const val KEY_SONG_PLAYBACK_MODE = "KEY_SONG_PLAY_MODE" @@ -259,5 +275,7 @@ class SettingsManager private constructor(context: Context) : fun onColorizeNotifUpdate(doColorize: Boolean) {} fun onNotifActionUpdate(useAltAction: Boolean) {} fun onLibDisplayModeUpdate(displayMode: DisplayMode) {} + fun onShowCoverUpdate(showCovers: Boolean) {} + fun onQualityCoverUpdate(doQualityCovers: Boolean) {} } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f85e38a7b..f44636b4e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -64,6 +64,9 @@ Colorize notification] Show album art on notification + Show album covers + Turn off to save memory usage + Ignore MediaStore covers Results in higher quality album covers, but causes slower loading times diff --git a/app/src/main/res/xml/prefs_main.xml b/app/src/main/res/xml/prefs_main.xml index 59782aad8..19f0c40e5 100644 --- a/app/src/main/res/xml/prefs_main.xml +++ b/app/src/main/res/xml/prefs_main.xml @@ -34,11 +34,19 @@ app:key="KEY_LIBRARY_DISPLAY_MODE" app:useSimpleSummaryProvider="true" /> + +