aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Schneppe <christian@pix-art.de>2017-03-23 23:43:23 +0100
committerChristian Schneppe <christian@pix-art.de>2017-03-23 23:43:23 +0100
commit903c834f972d18586b8cd7506e1249afa5ad0d98 (patch)
tree3ad83ae00b022a2dd523512f02220324182d4fbc
parentcf87ce792e84c2a4910c67afe92b052e515b428a (diff)
count messages in backlog to not renotify on prior notifications
-rw-r--r--src/main/java/de/pixart/messenger/services/NotificationService.java40
1 files changed, 33 insertions, 7 deletions
diff --git a/src/main/java/de/pixart/messenger/services/NotificationService.java b/src/main/java/de/pixart/messenger/services/NotificationService.java
index a571c1816..accd2e933 100644
--- a/src/main/java/de/pixart/messenger/services/NotificationService.java
+++ b/src/main/java/de/pixart/messenger/services/NotificationService.java
@@ -22,9 +22,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;
@@ -52,6 +55,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;
}
@@ -102,11 +107,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);
@@ -120,16 +135,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) {
@@ -184,6 +207,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());