diff --git a/app/src/main/java/org/thoughtcrime/securesms/glide/cache/StreamBitmapDecoder.kt b/app/src/main/java/org/thoughtcrime/securesms/glide/cache/StreamBitmapDecoder.kt index 10a4bef44f..d0fbf81c8c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/glide/cache/StreamBitmapDecoder.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/glide/cache/StreamBitmapDecoder.kt @@ -45,9 +45,11 @@ class StreamBitmapDecoder( } return when (imageType) { - ImageHeaderParser.ImageType.GIF, ImageHeaderParser.ImageType.PNG_A -> false - ImageHeaderParser.ImageType.WEBP_A -> true - ImageHeaderParser.ImageType.ANIMATED_WEBP -> true + ImageHeaderParser.ImageType.GIF, + ImageHeaderParser.ImageType.PNG_A, + ImageHeaderParser.ImageType.WEBP_A, + ImageHeaderParser.ImageType.ANIMATED_WEBP -> false + else -> true } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/glide/cache/StreamFactoryApngDecoder.kt b/app/src/main/java/org/thoughtcrime/securesms/glide/cache/StreamFactoryApngDecoder.kt index d1c3fd88c7..b91e4f4094 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/glide/cache/StreamFactoryApngDecoder.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/glide/cache/StreamFactoryApngDecoder.kt @@ -5,14 +5,15 @@ package org.thoughtcrime.securesms.glide.cache +import com.bumptech.glide.Glide +import com.bumptech.glide.Registry +import com.bumptech.glide.load.ImageHeaderParser import com.bumptech.glide.load.Options import com.bumptech.glide.load.ResourceDecoder import com.bumptech.glide.load.engine.Resource import org.signal.core.util.StreamUtil import org.signal.glide.apng.decode.APNGDecoder -import org.signal.glide.apng.decode.APNGParser -import org.signal.glide.common.io.StreamReader -import org.thoughtcrime.securesms.glide.GlideStreamConfig +import org.thoughtcrime.securesms.glide.ImageHeaderParserUtils import org.thoughtcrime.securesms.mms.InputStreamFactory import java.nio.ByteBuffer @@ -20,12 +21,15 @@ import java.nio.ByteBuffer * A variant of [StreamApngDecoder] that decodes animated PNGs from [InputStreamFactory] sources. */ class StreamFactoryApngDecoder( - private val byteBufferDecoder: ResourceDecoder + private val byteBufferDecoder: ResourceDecoder, + private val glide: Glide, + private val registry: Registry ) : ResourceDecoder { override fun handles(source: InputStreamFactory, options: Options): Boolean { return if (options.get(ApngOptions.ANIMATE) == true) { - APNGParser.isAPNG(LimitedReader(StreamReader(source.create()), GlideStreamConfig.markReadLimitBytes)) + val imageType = ImageHeaderParserUtils.getType(registry.imageHeaderParsers, source.create(), glide.arrayPool) + imageType == ImageHeaderParser.ImageType.PNG_A } else { false } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/SignalGlideComponents.java b/app/src/main/java/org/thoughtcrime/securesms/mms/SignalGlideComponents.java index 337a8d6ac5..bacd1d3219 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mms/SignalGlideComponents.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mms/SignalGlideComponents.java @@ -88,7 +88,7 @@ public class SignalGlideComponents implements RegisterGlideComponents { ByteBufferApngDecoder byteBufferApngDecoder = new ByteBufferApngDecoder(); StreamApngDecoder streamApngDecoder = new StreamApngDecoder(byteBufferApngDecoder); - StreamFactoryApngDecoder streamFactoryApngDecoder = new StreamFactoryApngDecoder(byteBufferApngDecoder); + StreamFactoryApngDecoder streamFactoryApngDecoder = new StreamFactoryApngDecoder(byteBufferApngDecoder, glide, registry); registry.prepend(InputStream.class, APNGDecoder.class, streamApngDecoder); registry.prepend(InputStreamFactory.class, APNGDecoder.class, streamFactoryApngDecoder);