From 881a8688970f42d58d395f99b90b78e4b63571b6 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Mon, 8 May 2023 13:26:31 -0500 Subject: [PATCH] Do not load from DB in UI thread --- .../ui/adapter/MessageAdapter.java | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 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 3a24790ec809f5b1f9c51cfb60daf93f98fe9271..97531f8057f68f001b85bbc4821c36b2001ed30b 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java @@ -54,7 +54,9 @@ import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.security.NoSuchAlgorithmException; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -121,6 +123,7 @@ public class MessageAdapter extends ArrayAdapter { private OnInlineImageLongClicked mOnInlineImageLongClickedListener; private boolean mUseGreenBackground = false; private final boolean mForceNames; + private final Map lastWebxdcUpdate = new HashMap<>(); public MessageAdapter(final XmppActivity activity, final List messages, final boolean forceNames) { super(activity, 0, messages); @@ -691,14 +694,25 @@ public class MessageAdapter extends ArrayAdapter { conversation.startWebxdc(webxdc); } }); - // 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 WebxdcUpdate lastUpdate; + synchronized(lastWebxdcUpdate) { lastUpdate = lastWebxdcUpdate.get(message.getUuid()); } + if (lastUpdate == null) { + new Thread(() -> { + final WebxdcUpdate update = activity.xmppConnectionService.findLastWebxdcUpdate(message); + if (update != null) { + synchronized(lastWebxdcUpdate) { lastWebxdcUpdate.put(message.getUuid(), update); } + activity.xmppConnectionService.updateConversationUi(); + } + }).start(); + } else { + 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();