Do not show muted messages as unread

Stephen Paul Weber created

Change summary

src/main/java/eu/siacs/conversations/entities/Conversation.java            | 18 
src/main/java/eu/siacs/conversations/services/XmppConnectionService.java   |  2 
src/main/java/eu/siacs/conversations/ui/ConversationFragment.java          |  2 
src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java         |  6 
src/main/java/eu/siacs/conversations/ui/ConversationsOverviewFragment.java |  4 
src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java   |  4 
6 files changed, 15 insertions(+), 21 deletions(-)

Detailed changes

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

@@ -877,16 +877,8 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
         return this.replyTo;
     }
 
-    public boolean isRead() {
-        synchronized (this.messages) {
-            for(final Message message : Lists.reverse(this.messages)) {
-                if (message.isRead() && message.getType() == Message.TYPE_RTP_SESSION) {
-                    continue;
-                }
-                return message.isRead();
-            }
-            return true;
-        }
+    public boolean isRead(XmppConnectionService xmppConnectionService) {
+        return unreadCount(xmppConnectionService) < 1;
     }
 
     public List<Message> markRead(final String upToUuid) {
@@ -1372,11 +1364,13 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
         }
     }
 
-    public int unreadCount() {
+    public int unreadCount(XmppConnectionService xmppConnectionService) {
         synchronized (this.messages) {
             int count = 0;
             for(final Message message : Lists.reverse(this.messages)) {
                 if (message.getSubject() != null && !message.isOOb() && (message.getRawBody() == null || message.getRawBody().length() == 0)) continue;
+                final boolean muted = xmppConnectionService != null && message.getStatus() == Message.STATUS_RECEIVED && getMode() == Conversation.MODE_MULTI && xmppConnectionService.isMucUserMuted(new MucOptions.User(null, getJid(), message.getOccupantId(), null, null));
+                if (muted) continue;
                 if (message.isRead()) {
                     if (message.getType() == Message.TYPE_RTP_SESSION) {
                         continue;
@@ -1473,7 +1467,7 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
     public int getCurrentTab() {
         if (mCurrentTab >= 0) return mCurrentTab;
 
-        if (!isRead() || getContact().resourceWhichSupport(Namespace.COMMANDS) == null) {
+        if (!isRead(null) || getContact().resourceWhichSupport(Namespace.COMMANDS) == null) {
             return 0;
         }
 

src/main/java/eu/siacs/conversations/ui/ConversationFragment.java 🔗

@@ -3335,7 +3335,7 @@ public class ConversationFragment extends XmppFragment
         stopScrolling();
         Log.d(Config.LOGTAG, "reInit(hasExtras=" + hasExtras + ")");
 
-        if (this.conversation.isRead() && hasExtras) {
+        if (this.conversation.isRead(activity == null ? null : activity.xmppConnectionService) && hasExtras) {
             Log.d(Config.LOGTAG, "trimming conversation");
             this.conversation.trim();
         }

src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java 🔗

@@ -211,7 +211,7 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio
             final var selectedAccount = selectedAccount();
             populateWithOrderedConversations(conversations, false, false);
             for (final var c : conversations) {
-                final var unread = c.unreadCount();
+                final var unread = c.unreadCount(xmppConnectionService);
                 if (selectedAccount == null || selectedAccount.getUuid().equals(c.getAccount().getUuid())) {
                     totalUnread += unread;
                     if (c.getMode() == Conversation.MODE_MULTI) {
@@ -227,7 +227,7 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio
             filterByMainFilter(conversations);
             for (final var c : conversations) {
                 if (selectedAccount == null || selectedAccount.getUuid().equals(c.getAccount().getUuid())) {
-                    final var unread = c.unreadCount();
+                    final var unread = c.unreadCount(xmppConnectionService);
                     for (final var tag : c.getTags(this)) {
                         if ("Channel".equals(tag.getName())) continue;
                         var count = tags.get(tag);
@@ -644,7 +644,7 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio
                 list.remove(c);
             } else if (mainFilter == DRAWER_DIRECT_MESSAGES && c.getMode() == Conversation.MODE_MULTI) {
                 list.remove(c);
-            } else if (mainFilter == DRAWER_UNREAD_CHATS && c.unreadCount() < 1) {
+            } else if (mainFilter == DRAWER_UNREAD_CHATS && c.unreadCount(xmppConnectionService) < 1) {
                 list.remove(c);
             }
         }

src/main/java/eu/siacs/conversations/ui/ConversationsOverviewFragment.java 🔗

@@ -191,7 +191,7 @@ public class ConversationsOverviewFragment extends XmppFragment {
 				}
 				final Conversation conversation = swipedConversation.pop();
 				if(conversation != null){
-					if (!conversation.isRead() && conversation.getMode() == Conversation.MODE_SINGLE) {
+					if (!conversation.isRead(activity.xmppConnectionService) && conversation.getMode() == Conversation.MODE_SINGLE) {
 						return;
 					}
 					activity.xmppConnectionService.archiveConversation(c);
@@ -482,7 +482,7 @@ public class ConversationsOverviewFragment extends XmppFragment {
 		this.activity.populateWithOrderedConversations(this.conversations);
 		Conversation removed = this.swipedConversation.peek();
 		if (removed != null) {
-			if (removed.isRead()) {
+			if (removed.isRead(activity == null ? null : activity.xmppConnectionService)) {
 				this.conversations.remove(removed);
 			} else {
 				pendingActionHelper.execute();

src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java 🔗

@@ -88,8 +88,8 @@ public class ConversationAdapter
 
         final Message message = conversation.getLatestMessage();
         final int status = message.getStatus();
-        final int unreadCount = conversation.unreadCount();
-        final boolean isRead = conversation.isRead();
+        final int unreadCount = conversation.unreadCount(activity.xmppConnectionService);
+        final boolean isRead = unreadCount < 1;
         final @DrawableRes Integer messageStatusDrawable =
                 MessageAdapter.getMessageStatusAsDrawable(message, status);
         if (message.getType() == Message.TYPE_RTP_SESSION) {