From 1d8aeb16c2665d0f9a8c1a1148cf99a616f5fe31 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Tue, 16 Feb 2021 09:27:41 -0700 Subject: [PATCH] Further streamline coil usage Simplify how coil is used even further. --- app/build.gradle | 1 + .../java/org/oxycblt/auxio/coil/CoilUtils.kt | 156 ++++++++---------- .../oxycblt/auxio/settings/SettingsManager.kt | 2 +- app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values/donottranslate.xml | 1 + app/src/main/res/values/strings.xml | 2 +- 6 files changed, 73 insertions(+), 91 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 4497863bb..b48425c81 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -77,6 +77,7 @@ dependencies { implementation "androidx.navigation:navigation-ui-ktx:$navigation_version" // Media + // TODO: Migrate to media2 once NewPipe implements it so I can figure out how it works implementation 'androidx.media:media:1.2.1' // Preferences 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 651c71bb2..90c9b22d7 100644 --- a/app/src/main/java/org/oxycblt/auxio/coil/CoilUtils.kt +++ b/app/src/main/java/org/oxycblt/auxio/coil/CoilUtils.kt @@ -3,9 +3,11 @@ package org.oxycblt.auxio.coil import android.content.Context import android.graphics.Bitmap import android.widget.ImageView +import androidx.annotation.DrawableRes import androidx.core.graphics.drawable.toBitmap import androidx.databinding.BindingAdapter import coil.Coil +import coil.fetch.Fetcher import coil.request.ImageRequest import org.oxycblt.auxio.R import org.oxycblt.auxio.music.Album @@ -14,17 +16,77 @@ import org.oxycblt.auxio.music.Genre import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.settings.SettingsManager -private val ignoreCovers: Boolean get() = !SettingsManager.getInstance().showCovers +// --- BINDING ADAPTERS --- /** - * Get a bitmap for a song. onDone will be called when the bitmap is loaded. + * Bind the album art for a [Song]. + */ +@BindingAdapter("albumArt") +fun ImageView.bindAlbumArt(song: Song) { + load(song.album, R.drawable.ic_song, AlbumArtFetcher(context)) +} + +/** + * Bind the album art for an [Album]. + */ +@BindingAdapter("albumArt") +fun ImageView.bindAlbumArt(album: Album) { + load(album, R.drawable.ic_album, AlbumArtFetcher(context)) +} + +/** + * Bind the image for an [Artist] + */ +@BindingAdapter("artistImage") +fun ImageView.bindArtistImage(artist: Artist) { + load(artist, R.drawable.ic_artist, MosaicFetcher(context)) +} + +/** + * Bind the image for a [Genre] + */ +@BindingAdapter("genreImage") +fun ImageView.bindGenreImage(genre: Genre) { + load(genre, R.drawable.ic_genre, MosaicFetcher(context)) +} + +/** + * Custom extension function similar to the stock coil load extensions, but allows for any type. + */ +inline fun ImageView.load( + data: T, + @DrawableRes error: Int, + fetcher: Fetcher, +) { + val settingsManager = SettingsManager.getInstance() + + if (!settingsManager.showCovers) { + setImageResource(error) + + return + } + + Coil.imageLoader(context).enqueue( + ImageRequest.Builder(context) + .target(this) + .data(data) + .fetcher(fetcher) + .error(error) + .build() + ) +} + +// --- OTHER FUNCTIONS --- + +/** + * Get a bitmap for a [song]. [onDone] will be called when the bitmap is loaded. * **This not meant for UIs, 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/shouldn't occur. */ fun loadBitmap(context: Context, song: Song, onDone: (Bitmap?) -> Unit) { - if (ignoreCovers) { + val settingsManager = SettingsManager.getInstance() + + if (!settingsManager.showCovers) { onDone(null) return } @@ -39,86 +101,4 @@ fun loadBitmap(context: Context, song: Song, onDone: (Bitmap?) -> Unit) { ) .build() ) -} - -// --- BINDING ADAPTERS --- - -/** - * Bind the album art for a [Song]. - */ -@BindingAdapter("albumArt") -fun ImageView.bindAlbumArt(song: Song) { - if (ignoreCovers) { - setImageResource(R.drawable.ic_song) - return - } - - Coil.imageLoader(context).enqueue( - ImageRequest.Builder(context) - .target(this) - .data(song.album) - .fetcher(AlbumArtFetcher(context)) - .error(R.drawable.ic_song) - .build() - ) -} - -/** - * Bind the album art for an [Album]. - */ -@BindingAdapter("albumArt") -fun ImageView.bindAlbumArt(album: Album) { - if (ignoreCovers) { - setImageResource(R.drawable.ic_album) - return - } - - Coil.imageLoader(context).enqueue( - ImageRequest.Builder(context) - .target(this) - .data(album) - .fetcher(AlbumArtFetcher(context)) - .error(R.drawable.ic_album) - .build() - ) -} - -/** - * Bind the image for an [Artist] - */ -@BindingAdapter("artistImage") -fun ImageView.bindArtistImage(artist: Artist) { - if (ignoreCovers) { - setImageResource(R.drawable.ic_artist) - return - } - - Coil.imageLoader(context).enqueue( - ImageRequest.Builder(context) - .target(this) - .data(artist) - .fetcher(MosaicFetcher(context)) - .error(R.drawable.ic_artist) - .build() - ) -} - -/** - * Bind the image for a [Genre] - */ -@BindingAdapter("genreImage") -fun ImageView.bindGenreImage(genre: Genre) { - if (ignoreCovers) { - setImageResource(R.drawable.ic_genre) - return - } - - Coil.imageLoader(context).enqueue( - ImageRequest.Builder(context) - .target(this) - .data(genre) - .fetcher(MosaicFetcher(context)) - .error(R.drawable.ic_genre) - .build() - ) -} +} \ No newline at end of file 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 dc280bb41..634aace35 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/SettingsManager.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/SettingsManager.kt @@ -73,7 +73,7 @@ class SettingsManager private constructor(context: Context) : /** * Whether to even loading embedded covers - * TODO: Make the UI result of this better + * TODO: Make the UI result of this better? */ val showCovers: Boolean get() = sharedPrefs.getBoolean(Keys.KEY_SHOW_COVERS, true) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index d8ad652d7..6ded78a51 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -73,7 +73,7 @@ Audio Audiofokus - Pausieren wenn anderes Audio abspielt [Bsp. Alarme] + Pausieren wenn anderes Audio abspielt [Bsp. Anrufe] Kopfhöreranschluss Abspielen/Pausieren wenn der Kopfhöreranschluss ändern diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index 7678fef12..0997283ab 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -10,6 +10,7 @@ <b>%1$s</b>: %2$s + Debug Save playback state Force save the current playback state diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f010e0091..1b27e744c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -73,7 +73,7 @@ Audio Audio Focus - Pause when other audio plays [ex. Alarms] + Pause when other audio plays [ex. Calls] Headset plug management Play/Pause when the headset connection changes