include true jid in muc reactions

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/entities/MucOptions.java  |  6 
src/main/java/eu/siacs/conversations/parser/MessageParser.java | 42 ++-
2 files changed, 36 insertions(+), 12 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/entities/MucOptions.java 🔗

@@ -95,10 +95,14 @@ public class MucOptions {
         return mAutoPushConfiguration;
     }
 
-    public boolean isSelf(Jid counterpart) {
+    public boolean isSelf(final Jid counterpart) {
         return counterpart.equals(self.getFullJid());
     }
 
+    public boolean isSelf(final String occupantId) {
+        return occupantId.equals(self.getOccupantId());
+    }
+
     public void resetChatState() {
         synchronized (users) {
             for (User user : users) {

src/main/java/eu/siacs/conversations/parser/MessageParser.java 🔗

@@ -453,6 +453,7 @@ public class MessageParser extends AbstractParser implements Consumer<im.convers
         final Reactions reactions = packet.getExtension(Reactions.class);
         final LocalizedContent body = packet.getBody();
         final Element mucUserElement = packet.findChild("x", Namespace.MUC_USER);
+        final boolean isTypeGroupChat = packet.getType() == im.conversations.android.xmpp.model.stanza.Message.Type.GROUPCHAT;
         final String pgpEncrypted = packet.findChildContent("x", "jabber:x:encrypted");
         final Element replaceElement = packet.findChild("replace", "urn:xmpp:message-correct:0");
         final Element oob = packet.findChild("x", Namespace.OOB);
@@ -476,12 +477,36 @@ public class MessageParser extends AbstractParser implements Consumer<im.convers
             Log.e(Config.LOGTAG, "encountered invalid message from='" + from + "' to='" + to + "'");
             return;
         }
-
-        boolean isTypeGroupChat = packet.getType() == im.conversations.android.xmpp.model.stanza.Message.Type.GROUPCHAT;
         if (query != null && !query.muc() && isTypeGroupChat) {
             Log.e(Config.LOGTAG, account.getJid().asBareJid() + ": received groupchat (" + from + ") message on regular MAM request. skipping");
             return;
         }
+        final Jid mucTrueCounterPart;
+        final OccupantId occupant;
+        if (isTypeGroupChat) {
+            final Conversation conversation =
+                    mXmppConnectionService.find(account, from.asBareJid());
+            final Jid mucTrueCounterPartByPresence;
+            if (conversation != null) {
+                final var mucOptions = conversation.getMucOptions();
+                occupant = mucOptions.occupantId() ? packet.getExtension(OccupantId.class) : null;
+                final var user =
+                        occupant == null ? null : mucOptions.findUserByOccupantId(occupant.getId());
+                mucTrueCounterPartByPresence = user == null ? null : user.getRealJid();
+            } else {
+                occupant = null;
+                mucTrueCounterPartByPresence = null;
+            }
+            mucTrueCounterPart =
+                    getTrueCounterpart(
+                            (query != null && query.safeToExtractTrueCounterpart())
+                                    ? mucUserElement
+                                    : null,
+                            mucTrueCounterPartByPresence);
+        } else {
+            mucTrueCounterPart = null;
+            occupant = null;
+        }
         boolean isMucStatusMessage = InvalidJid.hasValidFrom(packet) && from.isBareJid() && mucUserElement != null && mucUserElement.hasChild("status");
         boolean selfAddressed;
         if (packet.fromAccount(account)) {
@@ -637,10 +662,8 @@ public class MessageParser extends AbstractParser implements Consumer<im.convers
             message.markable = packet.hasChild("markable", "urn:xmpp:chat-markers:0");
             if (conversationMultiMode) {
                 final var mucOptions = conversation.getMucOptions();
-                final var occupantId =
-                        mucOptions.occupantId() ? packet.getExtension(OccupantId.class) : null;
-                if (occupantId != null) {
-                    message.setOccupantId(occupantId.getId());
+                if (occupant != null) {
+                    message.setOccupantId(occupant.getId());
                 }
                 message.setMucUser(mucOptions.findUserByFullJid(counterpart));
                 final Jid fallback = mucOptions.getTrueCounterpart(counterpart);
@@ -1117,12 +1140,9 @@ public class MessageParser extends AbstractParser implements Consumer<im.convers
             if (conversation != null) {
                 if (isTypeGroupChat && conversation.getMode() == Conversational.MODE_MULTI) {
                     final var mucOptions = conversation.getMucOptions();
-                    final var occupant =
-                            mucOptions.occupantId() ? packet.getExtension(OccupantId.class) : null;
                     final var occupantId = occupant == null ? null : occupant.getId();
                     if (occupantId != null) {
-                        // TODO use occupant id for isSelf assessment
-                        final boolean isReceived = !mucOptions.isSelf(counterpart);
+                        final boolean isReceived = !mucOptions.isSelf(occupantId);
                         final Message message;
                         final var inMemoryMessage =
                                 conversation.findMessageWithServerMsgId(reactingTo);
@@ -1140,7 +1160,7 @@ public class MessageParser extends AbstractParser implements Consumer<im.convers
                                             reactions.getReactions(),
                                             isReceived,
                                             counterpart,
-                                            null,
+                                            mucTrueCounterPart,
                                             occupantId);
                             message.setReactions(combinedReactions);
                             mXmppConnectionService.updateMessage(message, false);