From 58c914679c614d545fe2453a490712ab456cc0f5 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Tue, 25 Apr 2023 20:55:00 -0500 Subject: [PATCH] Use image cache to prevent spamming threads Also the thread updating the UI directly is unsafe with a list view, the item may have been recycled in the meantime --- .../ui/adapter/MessageAdapter.java | 41 +++++++++++-------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java index 0b25adf3c0e08500b8b9c1b40bd437a1a3976490..f9a4104714fe17cf5f77bf337df0250a4db6cd8a 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java @@ -22,6 +22,7 @@ import android.text.style.RelativeSizeSpan; import android.text.style.StyleSpan; import android.text.style.URLSpan; import android.util.DisplayMetrics; +import android.util.LruCache; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -676,7 +677,8 @@ public class MessageAdapter extends ArrayAdapter { } private void displayWebxdcMessage(ViewHolder viewHolder, final Message message, final boolean darkBackground, final int type) { - WebxdcPage webxdc = new WebxdcPage(message.getFileParams().getCids().get(0), message, activity.xmppConnectionService); + Cid webxdcCid = message.getFileParams().getCids().get(0); + WebxdcPage webxdc = new WebxdcPage(webxdcCid, message, activity.xmppConnectionService); displayTextMessage(viewHolder, message, darkBackground, type); viewHolder.image.setVisibility(View.GONE); viewHolder.audioPlayer.setVisibility(View.GONE); @@ -688,23 +690,30 @@ public class MessageAdapter extends ArrayAdapter { conversation.startWebxdc(webxdc); } }); - new Thread(() -> { - Drawable icon = webxdc.getIcon(); - WebxdcUpdate lastUpdate = activity.xmppConnectionService.findLastWebxdcUpdate(message); - activity.runOnUiThread(() -> { - if (lastUpdate != null && (lastUpdate.getSummary() != null || lastUpdate.getDocument() != null)) { - viewHolder.messageBody.setVisibility(View.VISIBLE); - viewHolder.messageBody.setText( - (lastUpdate.getDocument() == null ? "" : lastUpdate.getDocument() + "\n") + - (lastUpdate.getSummary() == null ? "" : lastUpdate.getSummary()) - ); - } + // TODO: db access on UI thread is bad + WebxdcUpdate lastUpdate = activity.xmppConnectionService.findLastWebxdcUpdate(message); + if (lastUpdate != null && (lastUpdate.getSummary() != null || lastUpdate.getDocument() != null)) { + viewHolder.messageBody.setVisibility(View.VISIBLE); + viewHolder.messageBody.setText( + (lastUpdate.getDocument() == null ? "" : lastUpdate.getDocument() + "\n") + + (lastUpdate.getSummary() == null ? "" : lastUpdate.getSummary()) + ); + } + + final LruCache cache = activity.xmppConnectionService.getDrawableCache(); + final Drawable d = cache.get("webxdc:icon:" + webxdcCid); + if (d == null) { + new Thread(() -> { + Drawable icon = webxdc.getIcon(); if (icon != null) { - viewHolder.image.setVisibility(View.VISIBLE); - viewHolder.image.setImageDrawable(icon); + cache.put("webxdc:icon:" + webxdcCid, icon); + activity.xmppConnectionService.updateConversationUi(); } - }); - }).start(); + }).start(); + } else { + viewHolder.image.setVisibility(View.VISIBLE); + viewHolder.image.setImageDrawable(d); + } } private void displayOpenableMessage(ViewHolder viewHolder, final Message message, final boolean darkBackground, final int type) {