mark entire message as read if all group members have read it

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/entities/Message.java     | 10 +++
src/main/java/eu/siacs/conversations/parser/MessageParser.java | 12 ++++
2 files changed, 21 insertions(+), 1 deletion(-)

Detailed changes

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

@@ -7,6 +7,7 @@ import android.text.SpannableStringBuilder;
 import android.util.Log;
 
 import com.google.common.base.Strings;
+import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.primitives.Longs;
 
@@ -509,7 +510,7 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable
         this.transferable = transferable;
     }
 
-    public boolean addReadByMarker(ReadByMarker readByMarker) {
+    public boolean addReadByMarker(final ReadByMarker readByMarker) {
         if (readByMarker.getRealJid() != null) {
             if (readByMarker.getRealJid().asBareJid().equals(trueCounterpart)) {
                 return false;
@@ -539,6 +540,13 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable
         return ImmutableSet.copyOf(this.readByMarkers);
     }
 
+    public Set<Jid> getReadyByTrue() {
+        return ImmutableSet.copyOf(
+                Collections2.transform(
+                        Collections2.filter(this.readByMarkers, m -> m.getRealJid() != null),
+                        ReadByMarker::getRealJid));
+    }
+
     boolean similar(Message message) {
         if (!isPrivateMessage() && this.serverMsgId != null && message.getServerMsgId() != null) {
             return this.serverMsgId.equals(message.getServerMsgId()) || Edit.wasPreviouslyEditedServerMsgId(edits, message.getServerMsgId());

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

@@ -3,6 +3,8 @@ package eu.siacs.conversations.parser;
 import android.util.Log;
 import android.util.Pair;
 
+import com.google.common.collect.ImmutableSet;
+
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -1033,6 +1035,16 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
                     } else if (!counterpart.isBareJid() && trueJid != null) {
                         final ReadByMarker readByMarker = ReadByMarker.from(counterpart, trueJid);
                         if (message.addReadByMarker(readByMarker)) {
+                            final var mucOptions = conversation.getMucOptions();
+                            final var everyone = ImmutableSet.copyOf(mucOptions.getMembers(false));
+                            final var readyBy = message.getReadyByTrue();
+                            final var mStatus = message.getStatus();
+                            if (mucOptions.isPrivateAndNonAnonymous()
+                                    && (mStatus == Message.STATUS_SEND_RECEIVED
+                                            || mStatus == Message.STATUS_SEND)
+                                    && readyBy.containsAll(everyone)) {
+                                message.setStatus(Message.STATUS_SEND_DISPLAYED);
+                            }
                             mXmppConnectionService.updateMessage(message, false);
                         }
                     }