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
@@ -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());
@@ -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);
}
}