From 1af914d5ef16b500d2e130c2aa4464313ec99580 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Fri, 14 Jun 2024 12:05:50 -0400 Subject: [PATCH] Use SubsamplingImageView for everything except GIFs. Fixes #10324 --- .../components/ZoomingImageView.java | 56 ++++++------------- 1 file changed, 18 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ZoomingImageView.java b/app/src/main/java/org/thoughtcrime/securesms/components/ZoomingImageView.java index eee2ad1d67..9f4305228b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/ZoomingImageView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/ZoomingImageView.java @@ -50,7 +50,7 @@ public class ZoomingImageView extends FrameLayout { private static final float SMALL_IMAGES_ZOOM_LEVEL_MID = 3.0f; private static final float SMALL_IMAGES_ZOOM_LEVEL_MAX = 8.0f; - private final PhotoView photoView; + private final PhotoView gifView; private final SubsamplingScaleImageView subsamplingImageView; public ZoomingImageView(Context context) { @@ -66,54 +66,34 @@ public class ZoomingImageView extends FrameLayout { inflate(context, R.layout.zooming_image_view, this); - this.photoView = findViewById(R.id.image_view); + this.gifView = findViewById(R.id.image_view); this.subsamplingImageView = findViewById(R.id.subsampling_image_view); - this.photoView.setZoomTransitionDuration(ZOOM_TRANSITION_DURATION); - this.photoView.setScaleLevels(ZOOM_LEVEL_MIN, SMALL_IMAGES_ZOOM_LEVEL_MID, SMALL_IMAGES_ZOOM_LEVEL_MAX); + this.gifView.setZoomTransitionDuration(ZOOM_TRANSITION_DURATION); + this.gifView.setScaleLevels(ZOOM_LEVEL_MIN, SMALL_IMAGES_ZOOM_LEVEL_MID, SMALL_IMAGES_ZOOM_LEVEL_MAX); this.subsamplingImageView.setDoubleTapZoomDuration(ZOOM_TRANSITION_DURATION); this.subsamplingImageView.setDoubleTapZoomScale(LARGE_IMAGES_ZOOM_LEVEL_MID); this.subsamplingImageView.setMaxScale(LARGE_IMAGES_ZOOM_LEVEL_MAX); - this.photoView.setOnClickListener(v -> ZoomingImageView.this.callOnClick()); + this.gifView.setOnClickListener(v -> ZoomingImageView.this.callOnClick()); this.subsamplingImageView.setOnClickListener(v -> ZoomingImageView.this.callOnClick()); } @SuppressLint("StaticFieldLeak") - public void setImageUri(@NonNull RequestManager requestManager, @NonNull Uri uri, @NonNull String contentType, @NonNull Runnable onMediaReady) - { - final Context context = getContext(); - final int maxTextureSize = BitmapUtil.getMaxTextureSize(); - - Log.i(TAG, "Max texture size: " + maxTextureSize); - - SimpleTask.run(ViewUtil.getActivityLifecycle(this), () -> { - if (MediaUtil.isGif(contentType)) return null; - - try { - InputStream inputStream = PartAuthority.getAttachmentStream(context, uri); - return BitmapUtil.getDimensions(inputStream); - } catch (IOException | BitmapDecodingException e) { - Log.w(TAG, e); - return null; - } - }, dimensions -> { - Log.i(TAG, "Dimensions: " + (dimensions == null ? "(null)" : dimensions.first + ", " + dimensions.second)); - - if (dimensions == null || (dimensions.first <= maxTextureSize && dimensions.second <= maxTextureSize)) { - Log.i(TAG, "Loading in standard image view..."); - setImageViewUri(requestManager, uri, onMediaReady); - } else { - Log.i(TAG, "Loading in subsampling image view..."); - setSubsamplingImageViewUri(uri); - onMediaReady.run(); - } - }); + public void setImageUri(@NonNull RequestManager requestManager, @NonNull Uri uri, @NonNull String contentType, @NonNull Runnable onMediaReady) { + if (MediaUtil.isGif(contentType)) { + Log.i(TAG, "Loading in gif image view..."); + setImageViewUri(requestManager, uri, onMediaReady); + } else { + Log.i(TAG, "Loading in subsampling image view..."); + setSubsamplingImageViewUri(uri); + onMediaReady.run(); + } } private void setImageViewUri(@NonNull RequestManager requestManager, @NonNull Uri uri, @NonNull Runnable onMediaReady) { - photoView.setVisibility(View.VISIBLE); + gifView.setVisibility(View.VISIBLE); subsamplingImageView.setVisibility(View.GONE); requestManager.load(new DecryptableUri(uri)) @@ -121,7 +101,7 @@ public class ZoomingImageView extends FrameLayout { .dontTransform() .override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) .addListener(ActionRequestListener.onEither(onMediaReady)) - .into(photoView); + .into(gifView); } private void setSubsamplingImageViewUri(@NonNull Uri uri) { @@ -129,7 +109,7 @@ public class ZoomingImageView extends FrameLayout { subsamplingImageView.setRegionDecoderFactory(new AttachmentRegionDecoderFactory()); subsamplingImageView.setVisibility(View.VISIBLE); - photoView.setVisibility(View.GONE); + gifView.setVisibility(View.GONE); // We manually set the orientation ourselves because using // SubsamplingScaleImageView.ORIENTATION_USE_EXIF is unreliable: @@ -155,7 +135,7 @@ public class ZoomingImageView extends FrameLayout { } public void cleanup() { - photoView.setImageDrawable(null); + gifView.setImageDrawable(null); subsamplingImageView.recycle(); }