diff --git a/src/main/java/eu/siacs/conversations/services/NotificationService.java b/src/main/java/eu/siacs/conversations/services/NotificationService.java index f0460c5e5..5e990a6a5 100644 --- a/src/main/java/eu/siacs/conversations/services/NotificationService.java +++ b/src/main/java/eu/siacs/conversations/services/NotificationService.java @@ -23,9 +23,12 @@ import android.util.Log; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.Calendar; +import java.util.HashMap; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -57,6 +60,8 @@ public class NotificationService { private boolean mIsInForeground; private long mLastNotification; + private final HashMap mBacklogMessageCounter = new HashMap<>(); + public NotificationService(final XmppConnectionService service) { this.mXmppConnectionService = service; } @@ -97,11 +102,21 @@ public class NotificationService { public void pushFromBacklog(final Message message) { if (notify(message)) { synchronized (notifications) { + getBacklogMessageCounter(message.getConversation()).incrementAndGet(); pushToStack(message); } } } + private AtomicInteger getBacklogMessageCounter(Conversation conversation) { + synchronized (mBacklogMessageCounter) { + if (!mBacklogMessageCounter.containsKey(conversation)) { + mBacklogMessageCounter.put(conversation,new AtomicInteger(0)); + } + return mBacklogMessageCounter.get(conversation); + } + } + public void pushFromDirectReply(final Message message) { synchronized (notifications) { pushToStack(message); @@ -115,18 +130,26 @@ public class NotificationService { if (account == null || !notify) { updateNotification(notify); } else { - boolean hasPendingMessages = false; - for(ArrayList messages : notifications.values()) { - if (messages.size() > 0 && messages.get(0).getConversation().getAccount() == account) { - hasPendingMessages = true; - break; - } - } - updateNotification(hasPendingMessages); + updateNotification(getBacklogMessageCount(account) > 0); } } } + private int getBacklogMessageCount(Account account) { + int count = 0; + synchronized (this.mBacklogMessageCounter) { + for(Iterator> it = mBacklogMessageCounter.entrySet().iterator(); it.hasNext(); ) { + Map.Entry entry = it.next(); + if (entry.getKey().getAccount() == account) { + count += entry.getValue().get(); + it.remove(); + } + } + } + Log.d(Config.LOGTAG,account.getJid().toBareJid()+": backlog message count="+count); + return count; + } + public void finishBacklog(boolean notify) { finishBacklog(notify,null); } @@ -174,6 +197,9 @@ public class NotificationService { } public void clear(final Conversation conversation) { + synchronized (this.mBacklogMessageCounter) { + this.mBacklogMessageCounter.remove(conversation); + } synchronized (notifications) { markAsReadIfHasDirectReply(conversation); notifications.remove(conversation.getUuid());