remember mds display state until after mam catchup

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/entities/Conversation.java          |  9 
src/main/java/eu/siacs/conversations/services/MessageArchiveService.java | 10 
src/main/java/eu/siacs/conversations/services/XmppConnectionService.java |  9 
3 files changed, 22 insertions(+), 6 deletions(-)

Detailed changes

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

@@ -85,6 +85,7 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
     private ChatState mOutgoingChatState = Config.DEFAULT_CHAT_STATE;
     private ChatState mIncomingChatState = Config.DEFAULT_CHAT_STATE;
     private String mFirstMamReference = null;
+    private String displayState = null;
 
     public Conversation(final String name, final Account account, final Jid contactJid,
                         final int mode) {
@@ -1121,6 +1122,14 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
         return getName().toString();
     }
 
+    public void setDisplayState(final String stanzaId) {
+        this.displayState = stanzaId;
+    }
+
+    public String getDisplayState() {
+        return this.displayState;
+    }
+
     public interface OnMessageFound {
         void onMessageFound(final Message message);
     }

src/main/java/eu/siacs/conversations/services/MessageArchiveService.java 🔗

@@ -282,10 +282,18 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
         if (conversation != null) {
             conversation.sort();
             conversation.setHasMessagesLeftOnServer(!done);
+            final var displayState = conversation.getDisplayState();
+            if (displayState != null) {
+                mXmppConnectionService.markReadUpToStanzaId(conversation, displayState);
+            }
         } else {
-            for (Conversation tmp : this.mXmppConnectionService.getConversations()) {
+            for (final Conversation tmp : this.mXmppConnectionService.getConversations()) {
                 if (tmp.getAccount() == query.getAccount()) {
                     tmp.sort();
+                    final var displayState = tmp.getDisplayState();
+                    if (displayState != null) {
+                        mXmppConnectionService.markReadUpToStanzaId(tmp, displayState);
+                    }
                 }
             }
         }

src/main/java/eu/siacs/conversations/services/XmppConnectionService.java 🔗

@@ -1952,13 +1952,13 @@ public class XmppConnectionService extends Service {
         if (jid == null) {
             return;
         }
-        Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": processing mds item for " + jid);
         final Element displayed = item.findChild("displayed", Namespace.MDS_DISPLAYED);
         final Element stanzaId =
                 displayed == null ? null : displayed.findChild("stanza-id", Namespace.STANZA_IDS);
         final String id = stanzaId == null ? null : stanzaId.getAttribute("id");
         final Conversation conversation = find(account, jid);
         if (id != null && conversation != null) {
+            conversation.setDisplayState(id);
             markReadUpToStanzaId(conversation, id);
         }
     }
@@ -3381,7 +3381,7 @@ public class XmppConnectionService extends Service {
         new Thread(() -> onMediaLoaded.onMediaLoaded(fileBackend.convertToAttachments(databaseBackend.getRelativeFilePaths(account, jid, limit)))).start();
     }
 
-    public void persistSelfNick(MucOptions.User self) {
+    public void persistSelfNick(final MucOptions.User self) {
         final Conversation conversation = self.getConversation();
         final boolean tookProposedNickFromBookmark = conversation.getMucOptions().isTookProposedNickFromBookmark();
         Jid full = self.getFullJid();
@@ -3393,11 +3393,10 @@ public class XmppConnectionService extends Service {
 
         final Bookmark bookmark = conversation.getBookmark();
         final String bookmarkedNick = bookmark == null ? null : bookmark.getNick();
-        if (bookmark != null && (tookProposedNickFromBookmark || TextUtils.isEmpty(bookmarkedNick)) && !full.getResource().equals(bookmarkedNick)) {
+        if (bookmark != null && (tookProposedNickFromBookmark || Strings.isNullOrEmpty(bookmarkedNick)) && !full.getResource().equals(bookmarkedNick)) {
             final Account account = conversation.getAccount();
             final String defaultNick = MucOptions.defaultNick(account);
-            if (TextUtils.isEmpty(bookmarkedNick) && full.getResource().equals(defaultNick)) {
-                Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": do not overwrite empty bookmark nick with default nick for " + conversation.getJid().asBareJid());
+            if (Strings.isNullOrEmpty(bookmarkedNick) && full.getResource().equals(defaultNick)) {
                 return;
             }
             Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": persist nick '" + full.getResource() + "' into bookmark for " + conversation.getJid().asBareJid());