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 112e0a549..c07889f6a 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,11 +333,48 @@ 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, dcChat, 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, dcContext.getChat(dcMsg.getChatId()), msgId, shortLine, shortLine, false); + }); + } + + @WorkerThread + 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()) { @@ -348,22 +387,13 @@ public class NotificationCenter { } if (Util.equals(visibleChat, chatData)) { - if (Prefs.isInChatNotifications(context)) { + if (playInChatSound && 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,6 @@ 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); // set sound, vibrate, led for systems that do not have notification channels @@ -502,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)); @@ -550,7 +574,6 @@ public class NotificationCenter { Log.e(TAG, "cannot add notification summary", e); } } - }); } public void removeNotifications(int accountId, int chatId) {