refactor: Reuse ImageHelper.getImage()

This commit is contained in:
Isira Seneviratne 2023-08-29 06:15:00 +05:30
parent c6871a0452
commit 1e4e2fa9cd
4 changed files with 21 additions and 31 deletions

View File

@ -5,18 +5,19 @@ import android.graphics.Bitmap
import android.graphics.BitmapFactory import android.graphics.BitmapFactory
import android.net.Uri 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 coil.ImageLoader import coil.ImageLoader
import coil.disk.DiskCache import coil.disk.DiskCache
import coil.load import coil.load
import coil.request.CachePolicy import coil.request.CachePolicy
import coil.request.ImageRequest import coil.request.ImageRequest
import coil.request.ImageResult
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.extensions.toAndroidUriOrNull
import com.github.libretube.util.DataSaverMode import com.github.libretube.util.DataSaverMode
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import java.nio.file.Path import java.nio.file.Path
object ImageHelper { object ImageHelper {
@ -60,39 +61,27 @@ object ImageHelper {
target.load(urlToLoad, imageLoader) target.load(urlToLoad, imageLoader)
} }
fun downloadImage(context: Context, url: String, path: Path) { suspend fun downloadImage(context: Context, url: String, path: Path) {
getAsync(context, url) { bitmap -> val bitmap = getImage(context, url) ?: return
saveImage(context, bitmap, path.toAndroidUri()) withContext(Dispatchers.IO) {
context.contentResolver.openOutputStream(path.toAndroidUri())?.use {
bitmap.compress(Bitmap.CompressFormat.PNG, 25, it)
}
} }
} }
fun getAsync(context: Context, url: String?, onSuccess: (Bitmap) -> Unit) { suspend fun getImage(context: Context, url: String?): Bitmap? {
val request = ImageRequest.Builder(context)
.data(url)
.target { onSuccess(it.toBitmap()) }
.build()
imageLoader.enqueue(request)
}
suspend fun getImage(context: Context, url: String?): ImageResult {
val request = ImageRequest.Builder(context) val request = ImageRequest.Builder(context)
.data(url) .data(url)
.build() .build()
return imageLoader.execute(request) return imageLoader.execute(request).drawable?.toBitmapOrNull()
} }
fun getDownloadedImage(context: Context, path: Path): Bitmap? { fun getDownloadedImage(context: Context, path: Path): Bitmap? {
return path.toAndroidUriOrNull()?.let { getImage(context, it) } return path.toAndroidUriOrNull()?.let { getImage(context, it) }
} }
private fun saveImage(context: Context, bitmapImage: Bitmap, imagePath: Uri) {
context.contentResolver.openOutputStream(imagePath)?.use {
bitmapImage.compress(Bitmap.CompressFormat.PNG, 25, it)
}
}
private fun getImage(context: Context, imagePath: Uri): Bitmap? { private fun getImage(context: Context, imagePath: Uri): Bitmap? {
return context.contentResolver.openInputStream(imagePath)?.use { return context.contentResolver.openInputStream(imagePath)?.use {
BitmapFactory.decodeStream(it) BitmapFactory.decodeStream(it)

View File

@ -21,6 +21,7 @@ import androidx.core.view.isVisible
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.fragment.app.commit import androidx.fragment.app.commit
import androidx.lifecycle.lifecycleScope
import com.github.libretube.R import com.github.libretube.R
import com.github.libretube.api.obj.StreamItem import com.github.libretube.api.obj.StreamItem
import com.github.libretube.constants.IntentData import com.github.libretube.constants.IntentData
@ -49,6 +50,7 @@ import com.github.libretube.ui.sheets.PlayingQueueSheet
import com.github.libretube.ui.sheets.VideoOptionsBottomSheet import com.github.libretube.ui.sheets.VideoOptionsBottomSheet
import com.github.libretube.util.DataSaverMode import com.github.libretube.util.DataSaverMode
import com.github.libretube.util.PlayingQueue import com.github.libretube.util.PlayingQueue
import kotlinx.coroutines.launch
import kotlin.math.abs import kotlin.math.abs
class AudioPlayerFragment : Fragment(), AudioPlayerOptions { class AudioPlayerFragment : Fragment(), AudioPlayerOptions {
@ -297,10 +299,11 @@ class AudioPlayerFragment : Fragment(), AudioPlayerOptions {
// reset color filter if data saver mode got toggled or conditions for it changed // reset color filter if data saver mode got toggled or conditions for it changed
binding.thumbnail.setColorFilter(Color.TRANSPARENT) binding.thumbnail.setColorFilter(Color.TRANSPARENT)
ImageHelper.getAsync(requireContext(), thumbnailUrl) { lifecycleScope.launch {
val binding = _binding ?: return@getAsync val binding = _binding ?: return@launch
binding.thumbnail.setImageBitmap(it) val bitmap = ImageHelper.getImage(requireContext(), thumbnailUrl)
binding.miniPlayerThumbnail.setImageBitmap(it) binding.thumbnail.setImageBitmap(bitmap)
binding.miniPlayerThumbnail.setImageBitmap(bitmap)
binding.thumbnail.isVisible = true binding.thumbnail.isVisible = true
binding.progress.isGone = true binding.progress.isGone = true
} }

View File

@ -2,7 +2,6 @@ package com.github.libretube.util
import android.content.Context import android.content.Context
import android.graphics.Bitmap import android.graphics.Bitmap
import androidx.core.graphics.drawable.toBitmap
import com.github.libretube.api.obj.PreviewFrames import com.github.libretube.api.obj.PreviewFrames
import com.github.libretube.helpers.ImageHelper import com.github.libretube.helpers.ImageHelper
import com.github.libretube.obj.PreviewFrame import com.github.libretube.obj.PreviewFrame
@ -14,8 +13,8 @@ class OnlineTimeFrameReceiver(
) : TimeFrameReceiver() { ) : TimeFrameReceiver() {
override suspend fun getFrameAtTime(position: Long): Bitmap? { override suspend fun getFrameAtTime(position: Long): Bitmap? {
val previewFrame = getPreviewFrame(previewFrames, position) ?: return null val previewFrame = getPreviewFrame(previewFrames, position) ?: return null
val drawable = ImageHelper.getImage(context, previewFrame.previewUrl).drawable ?: return null val bitmap = ImageHelper.getImage(context, previewFrame.previewUrl) ?: return null
return cutBitmapFromPreviewFrame(drawable.toBitmap(), previewFrame) return cutBitmapFromPreviewFrame(bitmap, previewFrame)
} }
/** /**

View File

@ -10,7 +10,6 @@ import android.util.Log
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import androidx.core.app.PendingIntentCompat import androidx.core.app.PendingIntentCompat
import androidx.core.content.getSystemService import androidx.core.content.getSystemService
import androidx.core.graphics.drawable.toBitmap
import androidx.work.CoroutineWorker import androidx.work.CoroutineWorker
import androidx.work.WorkerParameters import androidx.work.WorkerParameters
import com.github.libretube.R import com.github.libretube.R
@ -199,7 +198,7 @@ class NotificationWorker(appContext: Context, parameters: WorkerParameters) :
private suspend fun downloadImage(url: String?): Bitmap? { private suspend fun downloadImage(url: String?): Bitmap? {
return if (PreferenceHelper.getBoolean(PreferenceKeys.SHOW_STREAM_THUMBNAILS, false)) { return if (PreferenceHelper.getBoolean(PreferenceKeys.SHOW_STREAM_THUMBNAILS, false)) {
ImageHelper.getImage(applicationContext, url).drawable?.toBitmap() ImageHelper.getImage(applicationContext, url)
} else { } else {
null null
} }