From 91976e508ff8a17d579e838d6af07fa72ce69683 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Wed, 2 Oct 2024 21:48:25 -0500 Subject: [PATCH] Allow aggregating reactions from messages as well --- .../conversations/entities/Conversation.java | 31 +++++++++++++++++-- .../ui/adapter/MessageAdapter.java | 4 +-- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java index dc5ef217d186c3c29579ef16f9e1d88f18bc5456..349d036cd0fac5b8e03f98133039198d651fb6c2 100644 --- a/src/main/java/eu/siacs/conversations/entities/Conversation.java +++ b/src/main/java/eu/siacs/conversations/entities/Conversation.java @@ -75,6 +75,8 @@ import com.google.common.base.Optional; import com.google.common.collect.ComparisonChain; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; +import com.google.common.collect.Multimap; +import com.google.common.collect.HashMultimap; import io.ipfs.cid.Cid; @@ -126,6 +128,7 @@ import eu.siacs.conversations.databinding.CommandTextFieldBinding; import eu.siacs.conversations.databinding.CommandSliderFieldBinding; import eu.siacs.conversations.databinding.CommandWebviewBinding; import eu.siacs.conversations.databinding.DialogQuickeditBinding; +import eu.siacs.conversations.entities.Reaction; import eu.siacs.conversations.entities.ListItem.Tag; import eu.siacs.conversations.http.HttpConnectionManager; import eu.siacs.conversations.persistance.DatabaseBackend; @@ -136,6 +139,7 @@ import eu.siacs.conversations.ui.UriHandlerActivity; import eu.siacs.conversations.ui.text.FixedURLSpan; import eu.siacs.conversations.ui.util.ShareUtil; import eu.siacs.conversations.ui.util.SoftKeyboardUtils; +import eu.siacs.conversations.utils.Emoticons; import eu.siacs.conversations.utils.JidHelper; import eu.siacs.conversations.utils.MessageUtils; import eu.siacs.conversations.utils.PhoneNumberUtilWrapper; @@ -207,6 +211,7 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl protected boolean userSelectedThread = false; protected Message replyTo = null; protected HashMap threads = new HashMap<>(); + protected Multimap reactions = HashMultimap.create(); private String displayState = null; public Conversation(final String name, final Account account, final Jid contactJid, @@ -684,6 +689,7 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl messages.clear(); messages.addAll(this.messages); threads.clear(); + reactions.clear(); } Set extraIds = new HashSet<>(); for (ListIterator iterator = messages.listIterator(messages.size()); iterator.hasPrevious(); ) { @@ -702,17 +708,38 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl thread.first = m; } } + final var reply = m.getReply(); + if (reply != null && reply.getAttribute("id") != null) { + extraIds.add(reply.getAttribute("id")); + final var body = m.getBody(true).toString().replaceAll("\\s", ""); + if (Emoticons.isEmoji(body)) { + reactions.put(reply.getAttribute("id"), new Reaction(body, true, m.getCounterpart(), m.getTrueCounterpart(), m.getOccupantId())); + iterator.remove(); + } + } + if (m.wasMergedIntoPrevious(xmppConnectionService) || (m.getSubject() != null && !m.isOOb() && (m.getRawBody() == null || m.getRawBody().length() == 0)) || (getLockThread() && !extraIds.contains(m.replyId()) && (mthread == null || !mthread.getContent().equals(getThread() == null ? "" : getThread().getContent())))) { iterator.remove(); } else if (getLockThread() && mthread != null) { - Element reply = m.getReply(); - if (reply != null && reply.getAttribute("id") != null) extraIds.add(reply.getAttribute("id")); Element reactions = m.getReactionsEl(); if (reactions != null && reactions.getAttribute("id") != null) extraIds.add(reactions.getAttribute("id")); } } } + public Reaction.Aggregated aggregatedReactionsFor(Message m) { + Set result = new HashSet<>(); + if (getMode() == MODE_MULTI) { + result.addAll(reactions.get(m.getServerMsgId())); + } else if (m.getStatus() > Message.STATUS_RECEIVED) { + result.addAll(reactions.get(m.getUuid())); + } else { + result.addAll(reactions.get(m.getRemoteMsgId())); + } + result.addAll(m.getReactions()); + return Reaction.aggregated(result); + } + public Thread getThread(String id) { return threads.get(id); } 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 efd6e07c9b75ec5f1177ed62024c9d29bf17b3f6..9345c9051579da686bd6cfd87f7a4a38a0d06deb 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java @@ -1534,13 +1534,13 @@ public class MessageAdapter extends ArrayAdapter { } BindingAdapters.setReactionsOnReceived( viewHolder.reactions, - message.getAggregatedReactions(), + conversation instanceof Conversation ? ((Conversation) conversation).aggregatedReactionsFor(message) : message.getAggregatedReactions(), reactions -> sendReactions(message, reactions), () -> addReaction(message)); } else if (type == SENT) { BindingAdapters.setReactionsOnReceived( viewHolder.reactions, - message.getAggregatedReactions(), + conversation instanceof Conversation ? ((Conversation) conversation).aggregatedReactionsFor(message) : message.getAggregatedReactions(), reactions -> sendReactions(message, reactions), () -> addReaction(message)); }