diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java index 349d036cd0fac5b8e03f98133039198d651fb6c2..d410c30fe46e719a2da313a0492a654a29f580e4 100644 --- a/src/main/java/eu/siacs/conversations/entities/Conversation.java +++ b/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 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; } diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 04b33b5aa848647a07c13f849f429cc24fd11c30..2b17667756bab0d53f55639b9ecbaf30ac876a3b 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -5008,7 +5008,7 @@ public class XmppConnectionService extends Service { public int unreadCount() { int count = 0; for (Conversation conversation : getConversations()) { - count += conversation.unreadCount(); + count += conversation.unreadCount(this); } return count; } diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index ae149756d57460d492e399583efc597da987a831..4cfa2ff6241d2e8fa7da53f8a6f72f8d28ad58b5 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/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(); } diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java index 9a5249459b0d4276d8716eb2091f511b69c5013b..012290441033701b0f0bb21ea4b9eb0b4109c559 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java +++ b/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); } } diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationsOverviewFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationsOverviewFragment.java index 425673c7bfab6e327c07b059730be2315a207a2b..70467c59bd5ce7e7576658a5dc28adada4229a41 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationsOverviewFragment.java +++ b/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(); diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java index df2129fa2cb9e997d04ceeae27dce33cd6791512..b9c4f553f33a6e0fa532385085b2c4d8e73ed108 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java +++ b/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) {