refactor: use Coil exclusively for image loading

This commit is contained in:
Bnyro 2024-10-06 13:52:05 +02:00
parent 9030a6e871
commit db0dc4c4fc
3 changed files with 36 additions and 40 deletions

View File

@ -2,10 +2,9 @@ package com.github.libretube.helpers
import android.content.Context import android.content.Context
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Color import android.graphics.Color
import android.net.Uri
import android.widget.ImageView import android.widget.ImageView
import androidx.core.graphics.drawable.toBitmap
import androidx.core.graphics.drawable.toBitmapOrNull import androidx.core.graphics.drawable.toBitmapOrNull
import coil.ImageLoader import coil.ImageLoader
import coil.disk.DiskCache import coil.disk.DiskCache
@ -15,7 +14,6 @@ import com.github.libretube.BuildConfig
import com.github.libretube.api.CronetHelper import com.github.libretube.api.CronetHelper
import com.github.libretube.constants.PreferenceKeys import com.github.libretube.constants.PreferenceKeys
import com.github.libretube.extensions.toAndroidUri import com.github.libretube.extensions.toAndroidUri
import com.github.libretube.extensions.toAndroidUriOrNull
import com.github.libretube.util.DataSaverMode import com.github.libretube.util.DataSaverMode
import com.google.net.cronet.okhttptransport.CronetInterceptor import com.google.net.cronet.okhttptransport.CronetInterceptor
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -26,7 +24,7 @@ import java.io.File
import java.nio.file.Path import java.nio.file.Path
object ImageHelper { object ImageHelper {
lateinit var imageLoader: ImageLoader private lateinit var imageLoader: ImageLoader
private val Context.coilFile get() = cacheDir.resolve("coil") private val Context.coilFile get() = cacheDir.resolve("coil")
@ -119,14 +117,15 @@ object ImageHelper {
return imageLoader.execute(request).drawable?.toBitmapOrNull() return imageLoader.execute(request).drawable?.toBitmapOrNull()
} }
fun getDownloadedImage(context: Context, path: Path): Bitmap? { fun getImageWithCallback(context: Context, url: String?, onBitmap: (Bitmap) -> Unit) {
return path.toAndroidUriOrNull()?.let { getImage(context, it) } val request = ImageRequest.Builder(context)
} .data(url)
.target { drawable ->
onBitmap(drawable.toBitmap())
}
.build()
private fun getImage(context: Context, imagePath: Uri): Bitmap? { imageLoader.enqueue(request)
return context.contentResolver.openInputStream(imagePath)?.use {
BitmapFactory.decodeStream(it)
}
} }
/** /**

View File

@ -82,7 +82,7 @@ class DownloadsAdapter(
} }
download.thumbnailPath?.let { path -> download.thumbnailPath?.let { path ->
thumbnailImage.setImageBitmap(ImageHelper.getDownloadedImage(context, path)) ImageHelper.loadImage(path.toString(), thumbnailImage)
} }
progressBar.setOnClickListener { progressBar.setOnClickListener {

View File

@ -96,26 +96,13 @@ class NowPlayingNotification(
} }
private fun enqueueThumbnailRequest(callback: (Bitmap) -> Unit) { private fun enqueueThumbnailRequest(callback: (Bitmap) -> Unit) {
// If playing a downloaded file, show the downloaded thumbnail instead of loading an ImageHelper.getImageWithCallback(
// online image context,
notificationData?.thumbnailPath?.let { path -> notificationData?.thumbnailPath?.toString() ?: notificationData?.thumbnailUrl
ImageHelper.getDownloadedImage(context, path)?.let { ) {
notificationBitmap = processBitmap(it) notificationBitmap = processBitmap(it)
callback.invoke(notificationBitmap!!) callback.invoke(notificationBitmap!!)
}
return
} }
val request = ImageRequest.Builder(context)
.data(notificationData?.thumbnailUrl)
.target {
notificationBitmap = processBitmap(it.toBitmap())
callback.invoke(notificationBitmap!!)
}
.build()
// enqueue the thumbnail loading request
ImageHelper.imageLoader.enqueue(request)
} }
private fun processBitmap(bitmap: Bitmap): Bitmap { private fun processBitmap(bitmap: Bitmap): Bitmap {
@ -257,18 +244,28 @@ class NowPlayingNotification(
private fun createPlaybackState(@PlaybackStateCompat.State state: Int): PlaybackStateCompat { private fun createPlaybackState(@PlaybackStateCompat.State state: Int): PlaybackStateCompat {
val stateActions = PlaybackStateCompat.ACTION_SKIP_TO_NEXT or val stateActions = PlaybackStateCompat.ACTION_SKIP_TO_NEXT or
PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS or PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS or
PlaybackStateCompat.ACTION_REWIND or PlaybackStateCompat.ACTION_REWIND or
PlaybackStateCompat.ACTION_FAST_FORWARD or PlaybackStateCompat.ACTION_FAST_FORWARD or
PlaybackStateCompat.ACTION_PLAY_PAUSE or PlaybackStateCompat.ACTION_PLAY_PAUSE or
PlaybackStateCompat.ACTION_PAUSE or PlaybackStateCompat.ACTION_PAUSE or
PlaybackStateCompat.ACTION_PLAY or PlaybackStateCompat.ACTION_PLAY or
PlaybackStateCompat.ACTION_SEEK_TO PlaybackStateCompat.ACTION_SEEK_TO
return PlaybackStateCompat.Builder() return PlaybackStateCompat.Builder()
.setActions(stateActions) .setActions(stateActions)
.addCustomAction(createMediaSessionAction(R.drawable.ic_rewind_md, PlayerEvent.Rewind.name)) .addCustomAction(
.addCustomAction(createMediaSessionAction(R.drawable.ic_forward_md, PlayerEvent.Forward.name)) createMediaSessionAction(
R.drawable.ic_rewind_md,
PlayerEvent.Rewind.name
)
)
.addCustomAction(
createMediaSessionAction(
R.drawable.ic_forward_md,
PlayerEvent.Forward.name
)
)
.setState(state, player.currentPosition, player.playbackParameters.speed) .setState(state, player.currentPosition, player.playbackParameters.speed)
.build() .build()
} }