diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ThumbnailView.java b/app/src/main/java/org/thoughtcrime/securesms/components/ThumbnailView.java index 3b6cfd725..9ddcc0145 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/ThumbnailView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/ThumbnailView.java @@ -26,6 +26,7 @@ import com.bumptech.glide.load.resource.bitmap.BitmapTransformation; import com.bumptech.glide.load.resource.bitmap.CenterCrop; import com.bumptech.glide.load.resource.bitmap.FitCenter; import com.bumptech.glide.load.resource.bitmap.RoundedCorners; +import com.bumptech.glide.request.Request; import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.RequestOptions; @@ -422,7 +423,7 @@ public class ThumbnailView extends FrameLayout { return setImageResource(glideRequests, uri, width, height, true, null); } - public ListenableFuture setImageResource(@NonNull GlideRequests glideRequests, @NonNull Uri uri, int width, int height, boolean animate, @Nullable RequestListener listener) { + public ListenableFuture setImageResource(@NonNull GlideRequests glideRequests, @NonNull Uri uri, int width, int height, boolean animate, @Nullable ThumbnailRequestListener listener) { SettableFuture future = new SettableFuture<>(); if (transferControls.isPresent()) getTransferControls().setVisibility(View.GONE); @@ -445,7 +446,17 @@ public class ThumbnailView extends FrameLayout { request = request.transforms(new CenterCrop()); } - request.into(new GlideDrawableListeningTarget(image, future)); + GlideDrawableListeningTarget target = new GlideDrawableListeningTarget(image, future); + Request previousRequest = target.getRequest(); + boolean previousRequestRunning = previousRequest != null && previousRequest.isRunning(); + request.into(target); + if (listener != null) { + listener.onLoadScheduled(); + if (previousRequestRunning) { + listener.onLoadCanceled(); + } + } + blurhash.setImageDrawable(null); return future; @@ -572,6 +583,11 @@ public class ThumbnailView extends FrameLayout { return 0; } + public interface ThumbnailRequestListener extends RequestListener { + void onLoadCanceled(); + void onLoadScheduled(); + } + private class ThumbnailClickDispatcher implements View.OnClickListener { @Override public void onClick(View view) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/mediarail/MediaRailAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/mediarail/MediaRailAdapter.kt index 7dbffc518..62647b9d4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/mediarail/MediaRailAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/mediarail/MediaRailAdapter.kt @@ -6,7 +6,6 @@ import android.widget.ImageView import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.GlideException -import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.target.Target import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.ThumbnailView @@ -78,7 +77,6 @@ class MediaRailAdapter( } override fun bind(model: MediaRailItem) { - imageLoadingListener.onRequest() image.setImageResource(glideRequests, model.media.uri, 0, 0, false, imageLoadingListener) image.setOnClickListener { onRailItemSelected(model.media) } captionIndicator.visibility = if (model.media.caption.isPresent) View.VISIBLE else View.GONE @@ -88,12 +86,16 @@ class MediaRailAdapter( } } - abstract class ImageLoadingListener : RequestListener { + abstract class ImageLoadingListener : ThumbnailView.ThumbnailRequestListener { private val activeJobs = AtomicInteger() - fun onRequest() { + final override fun onLoadScheduled() { activeJobs.incrementAndGet() } + final override fun onLoadCanceled() { + activeJobs.decrementAndGet() + } + final override fun onLoadFailed(e: GlideException?, model: Any, target: Target, isFirstResource: Boolean): Boolean { val count = activeJobs.decrementAndGet() if (count == 0) {