From 3e12d8d6f646212132aca7bc64bd68f57a6a60a8 Mon Sep 17 00:00:00 2001 From: mtgriego Date: Thu, 1 Aug 2024 11:54:53 -0700 Subject: [PATCH] [MBL-1650] Fix crashes with large WEBP images (#2085) * adjust webp loading settings to have a max size based on screen resolution, downsample otherwise * apply the same fix for GIFs --- .../java/com/kickstarter/ui/extensions/ImageViewExt.kt | 7 +++++++ .../java/com/kickstarter/ui/views/ImageWithCaptionView.kt | 2 ++ 2 files changed, 9 insertions(+) diff --git a/app/src/main/java/com/kickstarter/ui/extensions/ImageViewExt.kt b/app/src/main/java/com/kickstarter/ui/extensions/ImageViewExt.kt index d41fc9b9c0..803eb9b68f 100644 --- a/app/src/main/java/com/kickstarter/ui/extensions/ImageViewExt.kt +++ b/app/src/main/java/com/kickstarter/ui/extensions/ImageViewExt.kt @@ -1,6 +1,7 @@ package com.kickstarter.ui.extensions import android.content.Context +import android.content.res.Resources import android.graphics.Color import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable @@ -11,6 +12,7 @@ import com.bumptech.glide.integration.webp.decoder.WebpDrawable import com.bumptech.glide.integration.webp.decoder.WebpDrawableTransformation import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.engine.GlideException +import com.bumptech.glide.load.resource.bitmap.DownsampleStrategy import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.RequestOptions @@ -133,6 +135,8 @@ fun ImageView.loadWebp(url: String?, context: Context) { val roundedCorners = RoundedCorners(1) Glide.with(this) .load(it) + .downsample(DownsampleStrategy.AT_LEAST) + .override(Resources.getSystem().displayMetrics.widthPixels, Resources.getSystem().displayMetrics.heightPixels) .optionalTransform(roundedCorners) .optionalTransform(WebpDrawable::class.java, WebpDrawableTransformation(roundedCorners)) .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC) @@ -144,6 +148,7 @@ fun ImageView.loadWebp(url: String?, context: Context) { } } } + fun ImageView.loadGifImage(url: String?, context: Context) { url?.let { if (context.applicationContext.isKSApplication()) { @@ -151,6 +156,8 @@ fun ImageView.loadGifImage(url: String?, context: Context) { Glide.with(context) .asGif() .load(it) + .downsample(DownsampleStrategy.AT_LEAST) + .override(Resources.getSystem().displayMetrics.widthPixels, Resources.getSystem().displayMetrics.heightPixels) .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC) .into(this) } catch (e: Exception) { diff --git a/app/src/main/java/com/kickstarter/ui/views/ImageWithCaptionView.kt b/app/src/main/java/com/kickstarter/ui/views/ImageWithCaptionView.kt index 17881b3a5d..2d7430a482 100644 --- a/app/src/main/java/com/kickstarter/ui/views/ImageWithCaptionView.kt +++ b/app/src/main/java/com/kickstarter/ui/views/ImageWithCaptionView.kt @@ -50,11 +50,13 @@ class ImageWithCaptionView @JvmOverloads constructor( binding.imageView.visibility = VISIBLE binding.composeViewImage.visibility = GONE } + src.isGif() -> { binding.imageView.visibility = VISIBLE binding.imageView.loadGifImage(src, context) binding.composeViewImage.visibility = GONE } + else -> { binding.composeViewImage.visibility = VISIBLE binding.imageView.visibility = GONE