From 0e1a00e304df631ff852477cda929f0131a9e1cd Mon Sep 17 00:00:00 2001 From: TwistedUmbrellaX Date: Sun, 7 Apr 2024 21:38:24 -0400 Subject: [PATCH] feat: add cache to bitmap download dfgdfg --- .../main/java/ani/dantotsu/util/BitmapUtil.kt | 47 ++++++++++++++++--- .../widgets/statistics/ProfileStatsWidget.kt | 28 +---------- .../upcoming/UpcomingRemoteViewsFactory.kt | 28 +---------- .../widgets/upcoming/UpcomingWidget.kt | 4 +- 4 files changed, 44 insertions(+), 63 deletions(-) diff --git a/app/src/main/java/ani/dantotsu/util/BitmapUtil.kt b/app/src/main/java/ani/dantotsu/util/BitmapUtil.kt index a4c4e7b6..fe55cf6a 100644 --- a/app/src/main/java/ani/dantotsu/util/BitmapUtil.kt +++ b/app/src/main/java/ani/dantotsu/util/BitmapUtil.kt @@ -1,12 +1,18 @@ package ani.dantotsu.util import android.graphics.Bitmap +import android.graphics.BitmapFactory import android.graphics.BitmapShader import android.graphics.Canvas import android.graphics.Paint import android.graphics.RectF import android.graphics.Shader -import android.graphics.drawable.Drawable +import androidx.collection.LruCache +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.runBlocking +import java.io.InputStream +import java.net.HttpURLConnection +import java.net.URL class BitmapUtil { companion object { @@ -22,12 +28,39 @@ class BitmapUtil { return output } - fun convertDrawableToBitmap(drawable: Drawable, width: Int, height: Int): Bitmap { - val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888) - val canvas = Canvas(bitmap) - drawable.setBounds(0, 0, canvas.width, canvas.height) - drawable.draw(canvas) - return bitmap + private val cacheSize = (Runtime.getRuntime().maxMemory() / 1024 / 16).toInt() + private val bitmapCache = LruCache(cacheSize) + + fun downloadImageAsBitmap(imageUrl: String): Bitmap? { + var bitmap: Bitmap? = null + + runBlocking(Dispatchers.IO) { + + bitmapCache[imageUrl]?.let { + bitmap = it + } ?: { + var inputStream: InputStream? = null + var urlConnection: HttpURLConnection? = null + try { + val url = URL(imageUrl) + urlConnection = url.openConnection() as HttpURLConnection + urlConnection.requestMethod = "GET" + urlConnection.connect() + + if (urlConnection.responseCode == HttpURLConnection.HTTP_OK) { + inputStream = urlConnection.inputStream + bitmap = BitmapFactory.decodeStream(inputStream) + bitmap?.let { bitmapCache.put(imageUrl, it) } + } + } catch (e: Exception) { + e.printStackTrace() + } finally { + inputStream?.close() + urlConnection?.disconnect() + } + } + } + return bitmap?.let { roundCorners(it) } } } } \ No newline at end of file diff --git a/app/src/main/java/ani/dantotsu/widgets/statistics/ProfileStatsWidget.kt b/app/src/main/java/ani/dantotsu/widgets/statistics/ProfileStatsWidget.kt index c1849a0e..af363ae2 100644 --- a/app/src/main/java/ani/dantotsu/widgets/statistics/ProfileStatsWidget.kt +++ b/app/src/main/java/ani/dantotsu/widgets/statistics/ProfileStatsWidget.kt @@ -17,7 +17,7 @@ import ani.dantotsu.connections.anilist.Anilist import ani.dantotsu.profile.ProfileActivity import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName -import ani.dantotsu.util.BitmapUtil +import ani.dantotsu.util.BitmapUtil.Companion.downloadImageAsBitmap import ani.dantotsu.widgets.WidgetSizeProvider import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.Dispatchers @@ -52,32 +52,6 @@ class ProfileStatsWidget : AppWidgetProvider() { } companion object { - private fun downloadImageAsBitmap(imageUrl: String): Bitmap? { - var bitmap: Bitmap? = null - - runBlocking(Dispatchers.IO) { - var inputStream: InputStream? = null - var urlConnection: HttpURLConnection? = null - try { - val url = URL(imageUrl) - urlConnection = url.openConnection() as HttpURLConnection - urlConnection.requestMethod = "GET" - urlConnection.connect() - - if (urlConnection.responseCode == HttpURLConnection.HTTP_OK) { - inputStream = urlConnection.inputStream - bitmap = BitmapFactory.decodeStream(inputStream) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - inputStream?.close() - urlConnection?.disconnect() - } - } - return bitmap?.let { BitmapUtil.roundCorners(it) } - } - @OptIn(DelicateCoroutinesApi::class) fun updateAppWidget( context: Context, diff --git a/app/src/main/java/ani/dantotsu/widgets/upcoming/UpcomingRemoteViewsFactory.kt b/app/src/main/java/ani/dantotsu/widgets/upcoming/UpcomingRemoteViewsFactory.kt index 799b2518..7f499dfa 100644 --- a/app/src/main/java/ani/dantotsu/widgets/upcoming/UpcomingRemoteViewsFactory.kt +++ b/app/src/main/java/ani/dantotsu/widgets/upcoming/UpcomingRemoteViewsFactory.kt @@ -12,6 +12,7 @@ import ani.dantotsu.connections.anilist.Anilist import ani.dantotsu.media.Media import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.util.BitmapUtil.Companion.downloadImageAsBitmap import ani.dantotsu.util.BitmapUtil.Companion.roundCorners import ani.dantotsu.util.Logger import com.google.gson.GsonBuilder @@ -183,33 +184,6 @@ class UpcomingRemoteViewsFactory(private val context: Context) : return rv } - private fun downloadImageAsBitmap(imageUrl: String): Bitmap? { - var bitmap: Bitmap? = null - var inputStream: InputStream? = null - var urlConnection: HttpURLConnection? = null - - try { - val url = URL(imageUrl) - urlConnection = url.openConnection() as HttpURLConnection - urlConnection.requestMethod = "GET" - urlConnection.connect() - - if (urlConnection.responseCode == HttpURLConnection.HTTP_OK) { - inputStream = urlConnection.inputStream - bitmap = BitmapFactory.decodeStream(inputStream) - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - inputStream?.close() - urlConnection?.disconnect() - } - return bitmap?.let { roundCorners(it) } - } - - - - override fun getLoadingView(): RemoteViews { return RemoteViews(context.packageName, R.layout.item_upcoming_widget) } diff --git a/app/src/main/java/ani/dantotsu/widgets/upcoming/UpcomingWidget.kt b/app/src/main/java/ani/dantotsu/widgets/upcoming/UpcomingWidget.kt index 62f31d05..b18876b8 100644 --- a/app/src/main/java/ani/dantotsu/widgets/upcoming/UpcomingWidget.kt +++ b/app/src/main/java/ani/dantotsu/widgets/upcoming/UpcomingWidget.kt @@ -11,9 +11,9 @@ import android.net.Uri import android.os.Bundle import android.widget.RemoteViews import androidx.core.content.res.ResourcesCompat +import androidx.core.graphics.drawable.toBitmap import ani.dantotsu.MainActivity import ani.dantotsu.R -import ani.dantotsu.util.BitmapUtil.Companion.convertDrawableToBitmap import ani.dantotsu.widgets.WidgetSizeProvider /** @@ -97,7 +97,7 @@ class UpcomingWidget : AppWidgetProvider() { intentTemplate.putExtra("fromWidget", true) val views = RemoteViews(context.packageName, R.layout.upcoming_widget).apply { - setImageViewBitmap(R.id.backgroundView, convertDrawableToBitmap(gradientDrawable, width, height)) + setImageViewBitmap(R.id.backgroundView, gradientDrawable.toBitmap(width, height)) setTextColor(R.id.text_show_title, titleTextColor) setTextColor(R.id.text_show_countdown, countdownTextColor) setTextColor(R.id.widgetTitle, titleTextColor)