From 1388e1a996d88552c0db46c7e38cb218b0fb631d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asiel=20D=C3=ADaz=20Ben=C3=ADtez?= Date: Tue, 30 Jan 2024 23:28:28 -0500 Subject: [PATCH] add global unread messages badge counter (#2942) * add global unread messages badge counter * Update src/org/thoughtcrime/securesms/connect/DcEventCenter.java Co-authored-by: bjoern * Update src/org/thoughtcrime/securesms/connect/DcEventCenter.java Co-authored-by: bjoern * improve code * use more specific names, remove from multiAccountObservers also in removeObserver() --------- Co-authored-by: bjoern --- res/layout/conversation_list_activity.xml | 19 +++++- .../securesms/ConversationListActivity.java | 40 ++++++++++++- .../securesms/ConversationListFragment.java | 12 +++- .../securesms/connect/DcEventCenter.java | 60 ++++++++++++------- 4 files changed, 104 insertions(+), 27 deletions(-) diff --git a/res/layout/conversation_list_activity.xml b/res/layout/conversation_list_activity.xml index 70d57ce5a..4a8136aaf 100644 --- a/res/layout/conversation_list_activity.xml +++ b/res/layout/conversation_list_activity.xml @@ -24,19 +24,36 @@ android:layout_width="match_parent" android:layout_height="match_parent"> + + + > allObservers = new Hashtable<>(); + private @NonNull final Hashtable> currentAccountObservers = new Hashtable<>(); + private @NonNull final Hashtable> multiAccountObservers = new Hashtable<>(); private final Object LOCK = new Object(); private final @NonNull ApplicationContext context; @@ -33,10 +34,18 @@ public class DcEventCenter { } public void addObserver(int eventId, @NonNull DcEventDelegate observer) { + addObserver(currentAccountObservers, eventId, observer); + } + + public void addMultiAccountObserver(int eventId, @NonNull DcEventDelegate observer) { + addObserver(multiAccountObservers, eventId, observer); + } + + private void addObserver(Hashtable> observers, int eventId, @NonNull DcEventDelegate observer) { synchronized (LOCK) { - ArrayList idObservers = allObservers.get(eventId); + ArrayList idObservers = observers.get(eventId); if (idObservers == null) { - allObservers.put(eventId, (idObservers = new ArrayList<>())); + observers.put(eventId, (idObservers = new ArrayList<>())); } idObservers.add(observer); } @@ -44,7 +53,11 @@ public class DcEventCenter { public void removeObserver(int eventId, DcEventDelegate observer) { synchronized (LOCK) { - ArrayList idObservers = allObservers.get(eventId); + ArrayList idObservers = currentAccountObservers.get(eventId); + if (idObservers != null) { + idObservers.remove(observer); + } + idObservers = multiAccountObservers.get(eventId); if (idObservers != null) { idObservers.remove(observer); } @@ -53,8 +66,14 @@ public class DcEventCenter { public void removeObservers(DcEventDelegate observer) { synchronized (LOCK) { - for(Integer eventId : allObservers.keySet()) { - ArrayList idObservers = allObservers.get(eventId); + for(Integer eventId : currentAccountObservers.keySet()) { + ArrayList idObservers = currentAccountObservers.get(eventId); + if (idObservers != null) { + idObservers.remove(observer); + } + } + for(Integer eventId : multiAccountObservers.keySet()) { + ArrayList idObservers = multiAccountObservers.get(eventId); if (idObservers != null) { idObservers.remove(observer); } @@ -62,9 +81,17 @@ public class DcEventCenter { } } - public void sendToObservers(@NonNull DcEvent event) { + private void sendToMultiAccountObservers(@NonNull DcEvent event) { + sendToObservers(multiAccountObservers, event); + } + + private void sendToCurrentAccountObservers(@NonNull DcEvent event) { + sendToObservers(currentAccountObservers, event); + } + + private void sendToObservers(Hashtable> observers, @NonNull DcEvent event) { synchronized (LOCK) { - ArrayList idObservers = allObservers.get(event.getId()); + ArrayList idObservers = observers.get(event.getId()); if (idObservers != null) { for (DcEventDelegate observer : idObservers) { // using try/catch blocks as under some circumstances eg. getContext() may return NULL - @@ -139,6 +166,8 @@ public class DcEventCenter { int accountId = event.getAccountId(); int id = event.getId(); + sendToMultiAccountObservers(event); + switch (id) { case DcContext.DC_EVENT_INCOMING_MSG: DcHelper.getNotificationCenter(context).addNotification(accountId, event.getData1Int(), event.getData2Int()); @@ -149,7 +178,7 @@ public class DcEventCenter { break; case DcContext.DC_EVENT_IMEX_PROGRESS: - sendToObservers(event); + sendToCurrentAccountObservers(event); return 0; } @@ -174,18 +203,9 @@ public class DcEventCenter { handleError(id, event.getData2Str()); break; - case DcContext.DC_EVENT_INCOMING_MSG: - sendToObservers(event); + default: + sendToCurrentAccountObservers(event); break; - - case DcContext.DC_EVENT_MSGS_NOTICED: - sendToObservers(event); - break; - - default: { - sendToObservers(event); - } - break; } if (id == DcContext.DC_EVENT_CHAT_MODIFIED) {