diff --git a/src/main/java/eu/siacs/conversations/entities/Message.java b/src/main/java/eu/siacs/conversations/entities/Message.java index e50ffc73c00e83360e8c742ea0d0c4fd161bde6d..a359cf34c2cff3970879992301bae33d9539294d 100644 --- a/src/main/java/eu/siacs/conversations/entities/Message.java +++ b/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 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()); diff --git a/src/main/java/eu/siacs/conversations/parser/MessageParser.java b/src/main/java/eu/siacs/conversations/parser/MessageParser.java index 97c0181b7dca5ceb91def16b20935bb921c8bb29..ec8601bf0622afc6c05d6efc5ea9682e4d65c62d 100644 --- a/src/main/java/eu/siacs/conversations/parser/MessageParser.java +++ b/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); } }