From fb1f5df234de01041f6d02e1a5327871dc6d7263 Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Wed, 23 Oct 2024 14:58:32 +0200 Subject: [PATCH 1/4] fix ticker line --- .../securesms/notifications/NotificationCenter.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/notifications/NotificationCenter.java b/src/main/java/org/thoughtcrime/securesms/notifications/NotificationCenter.java index 112e0a549..8f6d92545 100644 --- a/src/main/java/org/thoughtcrime/securesms/notifications/NotificationCenter.java +++ b/src/main/java/org/thoughtcrime/securesms/notifications/NotificationCenter.java @@ -403,11 +403,10 @@ public class NotificationCenter { // if privacy allows, for better accessibility, // prepend the sender in the ticker also for one-to-one chats (for group-chats, this is already done) - String tickerLine = line; if (!dcChat.isMultiUser() && privacy.isDisplayContact()) { line = dcMsg.getSenderName(dcContext.getContact(dcMsg.getFromId()), false) + ": " + line; } - builder.setTicker(tickerLine); + builder.setTicker(line); // set sound, vibrate, led for systems that do not have notification channels if (!notificationChannelsSupported()) { From 333e4c9eca69e9f3cf0432eada0cc660fd999073 Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Wed, 23 Oct 2024 14:25:16 +0200 Subject: [PATCH 2/4] notify reactions --- .../java/com/b44t/messenger/DcContext.java | 1 + .../securesms/connect/DcEventCenter.java | 6 +- .../notifications/NotificationCenter.java | 66 +++++++++++++------ 3 files changed, 51 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/b44t/messenger/DcContext.java b/src/main/java/com/b44t/messenger/DcContext.java index 0f3601c5d..c69e4c58c 100644 --- a/src/main/java/com/b44t/messenger/DcContext.java +++ b/src/main/java/com/b44t/messenger/DcContext.java @@ -12,6 +12,7 @@ public class DcContext { public final static int DC_EVENT_ERROR_SELF_NOT_IN_GROUP = 410; public final static int DC_EVENT_MSGS_CHANGED = 2000; public final static int DC_EVENT_REACTIONS_CHANGED = 2001; + public final static int DC_EVENT_INCOMING_REACTION = 2002; public final static int DC_EVENT_INCOMING_MSG = 2005; public final static int DC_EVENT_MSGS_NOTICED = 2008; public final static int DC_EVENT_MSG_DELIVERED = 2010; diff --git a/src/main/java/org/thoughtcrime/securesms/connect/DcEventCenter.java b/src/main/java/org/thoughtcrime/securesms/connect/DcEventCenter.java index 82ab6dfbc..d10b854a4 100644 --- a/src/main/java/org/thoughtcrime/securesms/connect/DcEventCenter.java +++ b/src/main/java/org/thoughtcrime/securesms/connect/DcEventCenter.java @@ -171,7 +171,11 @@ public class DcEventCenter { switch (id) { case DcContext.DC_EVENT_INCOMING_MSG: - DcHelper.getNotificationCenter(context).addNotification(accountId, event.getData1Int(), event.getData2Int()); + DcHelper.getNotificationCenter(context).notifyMessage(accountId, event.getData1Int(), event.getData2Int()); + break; + + case DcContext.DC_EVENT_INCOMING_REACTION: + DcHelper.getNotificationCenter(context).notifyReaction(accountId, event.getData1Int(), event.getData2Int(), event.getData2Str()); break; case DcContext.DC_EVENT_MSGS_NOTICED: diff --git a/src/main/java/org/thoughtcrime/securesms/notifications/NotificationCenter.java b/src/main/java/org/thoughtcrime/securesms/notifications/NotificationCenter.java index 8f6d92545..153c5c2e4 100644 --- a/src/main/java/org/thoughtcrime/securesms/notifications/NotificationCenter.java +++ b/src/main/java/org/thoughtcrime/securesms/notifications/NotificationCenter.java @@ -20,12 +20,14 @@ import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.WorkerThread; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; import androidx.core.app.RemoteInput; import androidx.core.app.TaskStackBuilder; import com.b44t.messenger.DcChat; +import com.b44t.messenger.DcContact; import com.b44t.messenger.DcContext; import com.b44t.messenger.DcMsg; import com.bumptech.glide.load.engine.DiskCacheStrategy; @@ -331,8 +333,45 @@ public class NotificationCenter { // add notifications & co. // -------------------------------------------------------------------------------------------- - public void addNotification(int accountId, int chatId, int msgId) { - Util.runOnAnyBackgroundThread(() -> { + public void notifyMessage(int accountId, int chatId, int msgId) { + Util.runOnAnyBackgroundThread(() -> { + DcContext dcContext = context.dcAccounts.getAccount(accountId); + DcChat dcChat = dcContext.getChat(chatId); + + DcMsg dcMsg = dcContext.getMsg(msgId); + NotificationPrivacyPreference privacy = Prefs.getNotificationPrivacy(context); + + String shortLine = privacy.isDisplayMessage()? dcMsg.getSummarytext(2000) : context.getString(R.string.notify_new_message); + if (dcChat.isMultiUser() && privacy.isDisplayContact()) { + shortLine = dcMsg.getSenderName(dcContext.getContact(dcMsg.getFromId()), false) + ": " + shortLine; + } + String tickerLine = shortLine; + if (!dcChat.isMultiUser() && privacy.isDisplayContact()) { + tickerLine = dcMsg.getSenderName(dcContext.getContact(dcMsg.getFromId()), false) + ": " + tickerLine; + } + + maybeAddNotification(accountId, chatId, msgId, shortLine, tickerLine, true); + }); + } + + public void notifyReaction(int accountId, int contactId, int msgId, String reaction) { + Util.runOnAnyBackgroundThread(() -> { + DcContext dcContext = context.dcAccounts.getAccount(accountId); + DcMsg dcMsg = dcContext.getMsg(msgId); + + NotificationPrivacyPreference privacy = Prefs.getNotificationPrivacy(context); + if (!privacy.isDisplayContact() || !privacy.isDisplayMessage()) { + return; // showing "New Message" is wrong and showing "New Reaction" is already content. just do nothing. + } + + DcContact sender = dcContext.getContact(contactId); + String shortLine = context.getString(R.string.reaction_by_other, sender.getDisplayName(), reaction, dcMsg.getSummarytext(2000)); + maybeAddNotification(accountId, dcMsg.getChatId(), msgId, shortLine, shortLine, false); + }); + } + + @WorkerThread + private void maybeAddNotification(int accountId, int chatId, int msgId, String shortLine, String tickerLine, boolean playInChatSound) { DcContext dcContext = context.dcAccounts.getAccount(accountId); DcChat dcChat = dcContext.getChat(chatId); @@ -347,23 +386,14 @@ public class NotificationCenter { return; } - if (Util.equals(visibleChat, chatData)) { + if (playInChatSound && Util.equals(visibleChat, chatData)) { if (Prefs.isInChatNotifications(context)) { InChatSounds.getInstance(context).playIncomingSound(); } return; } - // get notification text as a single line NotificationPrivacyPreference privacy = Prefs.getNotificationPrivacy(context); - - DcMsg dcMsg = dcContext.getMsg(msgId); - String line = privacy.isDisplayMessage()? dcMsg.getSummarytext(2000) : context.getString(R.string.notify_new_message); - if (dcChat.isMultiUser() && privacy.isDisplayContact()) { - line = dcMsg.getSenderName(dcContext.getContact(dcMsg.getFromId()), false) + ": " + line; - } - - // play signal? long now = System.currentTimeMillis(); boolean signal = (now - lastAudibleNotification) > MIN_AUDIBLE_PERIOD_MILLIS; if (signal) { @@ -381,7 +411,7 @@ public class NotificationCenter { .setPriority(Prefs.getNotificationPriority(context)) .setCategory(NotificationCompat.CATEGORY_MESSAGE) .setOnlyAlertOnce(!signal) - .setContentText(line) + .setContentText(shortLine) .setDeleteIntent(getMarkAsReadIntent(chatData, msgId, false)) .setContentIntent(getOpenChatIntent(chatData)); @@ -401,12 +431,7 @@ public class NotificationCenter { } } - // if privacy allows, for better accessibility, - // prepend the sender in the ticker also for one-to-one chats (for group-chats, this is already done) - if (!dcChat.isMultiUser() && privacy.isDisplayContact()) { - line = dcMsg.getSenderName(dcContext.getContact(dcMsg.getFromId()), false) + ": " + line; - } - builder.setTicker(line); + builder.setTicker(tickerLine); // set sound, vibrate, led for systems that do not have notification channels if (!notificationChannelsSupported()) { @@ -501,7 +526,7 @@ public class NotificationCenter { lines = new ArrayList<>(); accountInbox.put(chatId, lines); } - lines.add(line); + lines.add(tickerLine); for (int l = lines.size() - 1; l >= 0; l--) { inboxStyle.addLine(lines.get(l)); @@ -549,7 +574,6 @@ public class NotificationCenter { Log.e(TAG, "cannot add notification summary", e); } } - }); } public void removeNotifications(int accountId, int chatId) { From c446440537c6174c7d1961255759ee4fa8536a2b Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Wed, 23 Oct 2024 20:05:31 +0200 Subject: [PATCH 3/4] save one database call --- .../securesms/notifications/NotificationCenter.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/notifications/NotificationCenter.java b/src/main/java/org/thoughtcrime/securesms/notifications/NotificationCenter.java index 153c5c2e4..f6e810bc7 100644 --- a/src/main/java/org/thoughtcrime/securesms/notifications/NotificationCenter.java +++ b/src/main/java/org/thoughtcrime/securesms/notifications/NotificationCenter.java @@ -350,7 +350,7 @@ public class NotificationCenter { tickerLine = dcMsg.getSenderName(dcContext.getContact(dcMsg.getFromId()), false) + ": " + tickerLine; } - maybeAddNotification(accountId, chatId, msgId, shortLine, tickerLine, true); + maybeAddNotification(accountId, dcChat, msgId, shortLine, tickerLine, true); }); } @@ -366,15 +366,15 @@ public class NotificationCenter { DcContact sender = dcContext.getContact(contactId); String shortLine = context.getString(R.string.reaction_by_other, sender.getDisplayName(), reaction, dcMsg.getSummarytext(2000)); - maybeAddNotification(accountId, dcMsg.getChatId(), msgId, shortLine, shortLine, false); + maybeAddNotification(accountId, dcContext.getChat(dcMsg.getChatId()), msgId, shortLine, shortLine, false); }); } @WorkerThread - private void maybeAddNotification(int accountId, int chatId, int msgId, String shortLine, String tickerLine, boolean playInChatSound) { + private void maybeAddNotification(int accountId, DcChat dcChat, int msgId, String shortLine, String tickerLine, boolean playInChatSound) { DcContext dcContext = context.dcAccounts.getAccount(accountId); - DcChat dcChat = dcContext.getChat(chatId); + int chatId = dcChat.getId(); ChatData chatData = new ChatData(accountId, chatId); if (dcContext.isMuted() || dcChat.isMuted()) { From 8d7078f96f754d336588d1241a6327a72ce58e41 Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Wed, 23 Oct 2024 20:21:56 +0200 Subject: [PATCH 4/4] fix playing inChatSounds --- .../securesms/notifications/NotificationCenter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/notifications/NotificationCenter.java b/src/main/java/org/thoughtcrime/securesms/notifications/NotificationCenter.java index f6e810bc7..c07889f6a 100644 --- a/src/main/java/org/thoughtcrime/securesms/notifications/NotificationCenter.java +++ b/src/main/java/org/thoughtcrime/securesms/notifications/NotificationCenter.java @@ -386,8 +386,8 @@ public class NotificationCenter { return; } - if (playInChatSound && Util.equals(visibleChat, chatData)) { - if (Prefs.isInChatNotifications(context)) { + if (Util.equals(visibleChat, chatData)) { + if (playInChatSound && Prefs.isInChatNotifications(context)) { InChatSounds.getInstance(context).playIncomingSound(); } return;