MessageParser: dismiss notification when receiving read marker from another client

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/parser/MessageParser.java | 19 ++-
1 file changed, 12 insertions(+), 7 deletions(-)

Detailed changes

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

@@ -712,15 +712,20 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
 				if (conversation != null && id != null) {
 					Message message = conversation.findMessageWithRemoteId(id);
 					if (message != null) {
-						final Jid fallback = conversation.getMucOptions().getTrueCounterpart(counterpart);
-						Jid trueJid = getTrueCounterpart(query != null ? mucUserElement : null, fallback);
-						ReadByMarker readByMarker = ReadByMarker.from(counterpart,trueJid);
-						if (!conversation.getMucOptions().isSelf(counterpart) && message.addReadByMarker(readByMarker)) {
-							Log.d(Config.LOGTAG,account.getJid().toBareJid()+": added read by ("+readByMarker.getRealJid()+") to message '"+message.getBody()+"'");
-							mXmppConnectionService.updateMessage(message);
+						if (conversation.getMucOptions().isSelf(counterpart)) {
+							if (!message.isRead() && (query == null || query.isCatchup())) { //checking if message is unread fixes race conditions with reflections
+								mXmppConnectionService.markRead(conversation);
+							}
+						} else {
+							final Jid fallback = conversation.getMucOptions().getTrueCounterpart(counterpart);
+							Jid trueJid = getTrueCounterpart(query != null ? mucUserElement : null, fallback);
+							ReadByMarker readByMarker = ReadByMarker.from(counterpart, trueJid);
+							if (message.addReadByMarker(readByMarker)) {
+								Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": added read by (" + readByMarker.getRealJid() + ") to message '" + message.getBody() + "'");
+								mXmppConnectionService.updateMessage(message);
+							}
 						}
 					}
-
 				}
 			} else {
 				final Message displayedMessage = mXmppConnectionService.markMessage(account, from.toBareJid(), id, Message.STATUS_SEND_DISPLAYED);