Change summary
src/main/java/eu/siacs/conversations/services/NotificationService.java | 40
1 file changed, 33 insertions(+), 7 deletions(-)
Detailed changes
@@ -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());