count messages in backlog to not renotify on prior notifications

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/services/NotificationService.java | 40 
1 file changed, 33 insertions(+), 7 deletions(-)

Detailed changes

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<Conversation,AtomicInteger> 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,16 +130,24 @@ public class NotificationService {
 			if (account == null || !notify) {
 				updateNotification(notify);
 			} else {
-				boolean hasPendingMessages = false;
-				for(ArrayList<Message> messages : notifications.values()) {
-					if (messages.size() > 0 && messages.get(0).getConversation().getAccount() == account) {
-						hasPendingMessages = true;
-						break;
-					}
+				updateNotification(getBacklogMessageCount(account) > 0);
+			}
+		}
+	}
+
+	private int getBacklogMessageCount(Account account) {
+		int count = 0;
+		synchronized (this.mBacklogMessageCounter) {
+			for(Iterator<Map.Entry<Conversation, AtomicInteger>> it = mBacklogMessageCounter.entrySet().iterator(); it.hasNext(); ) {
+				Map.Entry<Conversation, AtomicInteger> entry = it.next();
+				if (entry.getKey().getAccount() == account) {
+					count += entry.getValue().get();
+					it.remove();
 				}
-				updateNotification(hasPendingMessages);
 			}
 		}
+		Log.d(Config.LOGTAG,account.getJid().toBareJid()+": backlog message count="+count);
+		return count;
 	}
 
 	public void finishBacklog(boolean notify) {
@@ -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());