diff --git a/src/main/java/com/b44t/messenger/DcContext.java b/src/main/java/com/b44t/messenger/DcContext.java index d8ce37d77..6fd130f36 100644 --- a/src/main/java/com/b44t/messenger/DcContext.java +++ b/src/main/java/com/b44t/messenger/DcContext.java @@ -85,6 +85,8 @@ public class DcContext { public final static int DC_CONNECTIVITY_WORKING = 3000; public final static int DC_CONNECTIVITY_CONNECTED = 4000; + private static final String CONFIG_MUTE_MENTIONS_IF_MUTED = "ui.mute_mentions_if_muted"; + // when using DcAccounts, use DcAccounts.addAccount() instead public DcContext(String osName, String dbfile) { contextCPtr = createContextCPtr(osName, dbfile); @@ -211,6 +213,14 @@ public class DcContext { public native boolean isSendingLocationsToChat(int chat_id); public DcProvider getProviderFromEmailWithDns (String email) { long cptr = getProviderFromEmailWithDnsCPtr(email); return cptr!=0 ? new DcProvider(cptr) : null; } + public boolean isMentionsEnabled() { + return getConfigInt(CONFIG_MUTE_MENTIONS_IF_MUTED) != 1; + } + + public void setMentionsEnabled(boolean enabled) { + setConfigInt(CONFIG_MUTE_MENTIONS_IF_MUTED, enabled? 0 : 1); + } + public String getName() { String displayname = getConfig("displayname"); if (displayname.isEmpty()) { diff --git a/src/main/java/org/thoughtcrime/securesms/notifications/NotificationCenter.java b/src/main/java/org/thoughtcrime/securesms/notifications/NotificationCenter.java index 59207078a..7c39fee4f 100644 --- a/src/main/java/org/thoughtcrime/securesms/notifications/NotificationCenter.java +++ b/src/main/java/org/thoughtcrime/securesms/notifications/NotificationCenter.java @@ -360,7 +360,10 @@ public class NotificationCenter { } } - maybeAddNotification(accountId, dcChat, msgId, shortLine, tickerLine, true); + DcMsg quotedMsg = dcMsg.getQuotedMsg(); + boolean isMention = dcChat.isMultiUser() && quotedMsg != null && quotedMsg.isOutgoing(); + + maybeAddNotification(accountId, dcChat, msgId, shortLine, tickerLine, true, isMention); }); } @@ -376,7 +379,8 @@ 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, dcContext.getChat(dcMsg.getChatId()), msgId, shortLine, shortLine, false); + DcChat dcChat = dcContext.getChat(dcMsg.getChatId()); + maybeAddNotification(accountId, dcChat, msgId, shortLine, shortLine, false, dcChat.isMultiUser()); }); } @@ -403,18 +407,20 @@ public class NotificationCenter { JSONObject info = parentMsg.getWebxdcInfo(); final String name = JsonUtils.optString(info, "name"); String shortLine = name.isEmpty()? text : (name + ": " + text); - maybeAddNotification(accountId, dcContext.getChat(dcMsg.getChatId()), msgId, shortLine, shortLine, false); + DcChat dcChat = dcContext.getChat(dcMsg.getChatId()); + maybeAddNotification(accountId, dcChat, msgId, shortLine, shortLine, false, dcChat.isMultiUser()); }); } @WorkerThread - private void maybeAddNotification(int accountId, DcChat dcChat, int msgId, String shortLine, String tickerLine, boolean playInChatSound) { + private void maybeAddNotification(int accountId, DcChat dcChat, int msgId, String shortLine, String tickerLine, boolean playInChatSound, boolean isMention) { DcContext dcContext = context.dcAccounts.getAccount(accountId); int chatId = dcChat.getId(); ChatData chatData = new ChatData(accountId, chatId); + isMention = isMention && dcContext.isMentionsEnabled(); - if (dcContext.isMuted() || dcChat.isMuted()) { + if (dcContext.isMuted() || (!isMention && dcChat.isMuted())) { return; } diff --git a/src/main/java/org/thoughtcrime/securesms/preferences/NotificationsPreferenceFragment.java b/src/main/java/org/thoughtcrime/securesms/preferences/NotificationsPreferenceFragment.java index a4af08bea..a76049baf 100644 --- a/src/main/java/org/thoughtcrime/securesms/preferences/NotificationsPreferenceFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/preferences/NotificationsPreferenceFragment.java @@ -36,6 +36,7 @@ public class NotificationsPreferenceFragment extends ListSummaryPreferenceFragme private CheckBoxPreference ignoreBattery; private CheckBoxPreference notificationsEnabled; + private CheckBoxPreference mentionNotifEnabled; @Override public void onCreate(Bundle paramBundle) { @@ -99,6 +100,13 @@ public class NotificationsPreferenceFragment extends ListSummaryPreferenceFragme dcContext.setMuted(!enabled); return true; }); + + mentionNotifEnabled = this.findPreference("pref_enable_mention_notifications"); + mentionNotifEnabled.setOnPreferenceChangeListener((preference, newValue) -> { + boolean enabled = (Boolean) newValue; + dcContext.setMentionsEnabled(enabled); + return true; + }); } @Override @@ -114,6 +122,7 @@ public class NotificationsPreferenceFragment extends ListSummaryPreferenceFragme // update ignoreBattery in onResume() to reflects changes done in the system settings ignoreBattery.setChecked(isIgnoringBatteryOptimizations()); notificationsEnabled.setChecked(!dcContext.isMuted()); + mentionNotifEnabled.setChecked(dcContext.isMentionsEnabled()); } @Override diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index a7e06b4bc..3e751edd6 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -702,6 +702,8 @@ Request to block screenshots in the recents list and inside the app To apply the screen security setting please restart the app. Notifications + Mentions + In muted groups, notify messages directed to you, like replies or reactions Show Priority Enable system notifications for new messages diff --git a/src/main/res/xml/preferences_notifications.xml b/src/main/res/xml/preferences_notifications.xml index db7b293a8..612b34c6f 100644 --- a/src/main/res/xml/preferences_notifications.xml +++ b/src/main/res/xml/preferences_notifications.xml @@ -7,6 +7,13 @@ android:title="@string/pref_notifications" android:defaultValue="true" /> + +