From 39c48d3dcdf349e4e130f010ef868fe28dd8869b Mon Sep 17 00:00:00 2001 From: adbenitez Date: Fri, 22 Aug 2025 16:36:00 +0200 Subject: [PATCH 1/4] default to permanent notification if push is not possible --- .../NotificationsPreferenceFragment.java | 7 ++++- .../thoughtcrime/securesms/util/Prefs.java | 31 +++++++++++++++++-- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/preferences/NotificationsPreferenceFragment.java b/src/main/java/org/thoughtcrime/securesms/preferences/NotificationsPreferenceFragment.java index 2356e89d0a..fc2b7b4979 100644 --- a/src/main/java/org/thoughtcrime/securesms/preferences/NotificationsPreferenceFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/preferences/NotificationsPreferenceFragment.java @@ -38,6 +38,7 @@ public class NotificationsPreferenceFragment extends ListSummaryPreferenceFragme private CheckBoxPreference ignoreBattery; private CheckBoxPreference notificationsEnabled; private CheckBoxPreference mentionNotifEnabled; + private CheckBoxPreference reliableService; @Override public void onCreate(Bundle paramBundle) { @@ -85,7 +86,7 @@ public void onCreate(Bundle paramBundle) { } - CheckBoxPreference reliableService = this.findPreference("pref_reliable_service"); + reliableService = this.findPreference("pref_reliable_service"); if (reliableService != null) { reliableService.setOnPreferenceChangeListener((preference, newValue) -> { Context context = getContext(); @@ -132,6 +133,10 @@ public void onResume() { ignoreBattery.setChecked(isIgnoringBatteryOptimizations()); notificationsEnabled.setChecked(!dcContext.isMuted()); mentionNotifEnabled.setChecked(dcContext.isMentionsEnabled()); + if (Prefs.reliableService(getActivity())) { + // only alter the "unset" state of the preference if true + reliableService.setChecked(true); + } } @Override diff --git a/src/main/java/org/thoughtcrime/securesms/util/Prefs.java b/src/main/java/org/thoughtcrime/securesms/util/Prefs.java index 4df6b2deb4..8096857e54 100644 --- a/src/main/java/org/thoughtcrime/securesms/util/Prefs.java +++ b/src/main/java/org/thoughtcrime/securesms/util/Prefs.java @@ -12,10 +12,12 @@ import androidx.annotation.Nullable; import androidx.core.app.NotificationCompat; +import com.b44t.messenger.DcAccounts; import com.b44t.messenger.DcContext; import org.thoughtcrime.securesms.BuildConfig; import org.thoughtcrime.securesms.connect.DcHelper; +import org.thoughtcrime.securesms.notifications.FcmReceiveService; import org.thoughtcrime.securesms.preferences.widgets.NotificationPrivacyPreference; import java.util.ArrayList; @@ -212,13 +214,36 @@ public static void setChatRingtone(Context context, int accountId, int chatId, U return result==null? null : Uri.parse(result); } + private static boolean isAllChatmail(Context context) { + DcAccounts dcAccounts = DcHelper.getAccounts(context); + for (int accountId : dcAccounts.getAll()) { + DcContext dcContext = dcAccounts.getAccount(accountId); + if (!dcContext.isChatmail()) { + return false; + } + } + return true; + } + public static boolean reliableService(Context context) { + final String key = "pref_reliable_service"; + boolean value = false; + try { + value = getBooleanPreference(context, key, false); + } catch(Exception e) {} + boolean value2; try { - return getBooleanPreference(context, "pref_reliable_service", false); + value2 = getBooleanPreference(context, key, !value); + } catch(Exception e) { + value2 = !value; } - catch(Exception e) { - return false; + + // if the key was unset, then calculate default value + if (value != value2) { + value = FcmReceiveService.getToken() == null || !isAllChatmail(context); } + + return value; } // vibrate From 91e898ee96031cf8f46e550505d90eb8b287db52 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Fri, 22 Aug 2025 16:39:33 +0200 Subject: [PATCH 2/4] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e233f6d7e3..b824ed22c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ * improve readability of info messages in dark mode * fix Direct Share shortcuts * fix: don't show error message when cancelling profile creation +* enable permanent notification by default if push notifications are not available ## v2.11.0 2025-08 From c6bbb0a524866c4feb3ab165a4fe81a6cd903d1f Mon Sep 17 00:00:00 2001 From: adbenitez Date: Tue, 26 Aug 2025 13:23:54 +0200 Subject: [PATCH 3/4] improve code --- .../java/com/b44t/messenger/DcAccounts.java | 10 ++++++ .../components/reminder/DozeReminder.java | 13 ++------ .../thoughtcrime/securesms/util/Prefs.java | 32 ++++--------------- 3 files changed, 19 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/b44t/messenger/DcAccounts.java b/src/main/java/com/b44t/messenger/DcAccounts.java index 630932408a..782979921e 100644 --- a/src/main/java/com/b44t/messenger/DcAccounts.java +++ b/src/main/java/com/b44t/messenger/DcAccounts.java @@ -42,4 +42,14 @@ public void unref() { private native long getJsonrpcInstanceCPtr (); private native long getAccountCPtr (int accountId); private native long getSelectedAccountCPtr (); + + public boolean isAllChatmail() { + for (int accountId : getAll()) { + DcContext dcContext = getAccount(accountId); + if (!dcContext.isChatmail()) { + return false; + } + } + return true; + } } diff --git a/src/main/java/org/thoughtcrime/securesms/components/reminder/DozeReminder.java b/src/main/java/org/thoughtcrime/securesms/components/reminder/DozeReminder.java index a6bcab74c4..611dc8a6b5 100644 --- a/src/main/java/org/thoughtcrime/securesms/components/reminder/DozeReminder.java +++ b/src/main/java/org/thoughtcrime/securesms/components/reminder/DozeReminder.java @@ -109,18 +109,9 @@ public static void dozeReminderTapped(Context context) { } } - private static boolean isAllChatmail() { - for (int accountId : ApplicationContext.dcAccounts.getAll()) { - DcContext context = ApplicationContext.dcAccounts.getAccount(accountId); - if (!context.isChatmail()) { - return false; - } - } - return true; - } - private static boolean isPushAvailableAndSufficient() { - return isAllChatmail() && FcmReceiveService.getToken() != null; + return ApplicationContext.dcAccounts.isAllChatmail() + && FcmReceiveService.getToken() != null; } public static void maybeAskDirectly(Context context) { diff --git a/src/main/java/org/thoughtcrime/securesms/util/Prefs.java b/src/main/java/org/thoughtcrime/securesms/util/Prefs.java index 8096857e54..0b625d2745 100644 --- a/src/main/java/org/thoughtcrime/securesms/util/Prefs.java +++ b/src/main/java/org/thoughtcrime/securesms/util/Prefs.java @@ -214,36 +214,18 @@ public static void setChatRingtone(Context context, int accountId, int chatId, U return result==null? null : Uri.parse(result); } - private static boolean isAllChatmail(Context context) { - DcAccounts dcAccounts = DcHelper.getAccounts(context); - for (int accountId : dcAccounts.getAll()) { - DcContext dcContext = dcAccounts.getAccount(accountId); - if (!dcContext.isChatmail()) { - return false; - } - } - return true; - } - public static boolean reliableService(Context context) { final String key = "pref_reliable_service"; - boolean value = false; - try { - value = getBooleanPreference(context, key, false); - } catch(Exception e) {} - boolean value2; - try { - value2 = getBooleanPreference(context, key, !value); - } catch(Exception e) { - value2 = !value; + final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + if (prefs.contains(key)) { + try { + return prefs.getBoolean(key, true); + } catch(Exception e) {} } // if the key was unset, then calculate default value - if (value != value2) { - value = FcmReceiveService.getToken() == null || !isAllChatmail(context); - } - - return value; + return FcmReceiveService.getToken() == null + || !DcHelper.getAccounts(context).isAllChatmail(); } // vibrate From 2547a0435c6444804e6f86158dbbc05497485156 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Tue, 26 Aug 2025 15:54:09 +0200 Subject: [PATCH 4/4] improve preference handling --- .../NotificationsPreferenceFragment.java | 40 +++++++++++-------- .../thoughtcrime/securesms/util/Prefs.java | 13 +++--- .../res/xml/preferences_notifications.xml | 2 +- 3 files changed, 33 insertions(+), 22 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/preferences/NotificationsPreferenceFragment.java b/src/main/java/org/thoughtcrime/securesms/preferences/NotificationsPreferenceFragment.java index fc2b7b4979..47f663f481 100644 --- a/src/main/java/org/thoughtcrime/securesms/preferences/NotificationsPreferenceFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/preferences/NotificationsPreferenceFragment.java @@ -30,7 +30,7 @@ import org.thoughtcrime.securesms.connect.KeepAliveService; import org.thoughtcrime.securesms.util.Prefs; -public class NotificationsPreferenceFragment extends ListSummaryPreferenceFragment { +public class NotificationsPreferenceFragment extends ListSummaryPreferenceFragment implements Preference.OnPreferenceChangeListener { private static final String TAG = NotificationsPreferenceFragment.class.getSimpleName(); private static final int REQUEST_CODE_NOTIFICATION_SELECTED = 1; @@ -86,18 +86,12 @@ public void onCreate(Bundle paramBundle) { } - reliableService = this.findPreference("pref_reliable_service"); + // reliableService is just used for displaying the actual value + // of the reliable service preference that is managed via + // Prefs.setReliableService() and Prefs.reliableService() + reliableService = this.findPreference("pref_reliable_service2"); if (reliableService != null) { - reliableService.setOnPreferenceChangeListener((preference, newValue) -> { - Context context = getContext(); - boolean enabled = (Boolean) newValue; // Prefs.reliableService() still has the old value - if (enabled) { - KeepAliveService.startSelf(context); - } else { - context.stopService(new Intent(context, KeepAliveService.class)); - } - return true; - }); + reliableService.setOnPreferenceChangeListener(this); } notificationsEnabled = this.findPreference("pref_enable_notifications"); @@ -133,10 +127,11 @@ public void onResume() { ignoreBattery.setChecked(isIgnoringBatteryOptimizations()); notificationsEnabled.setChecked(!dcContext.isMuted()); mentionNotifEnabled.setChecked(dcContext.isMentionsEnabled()); - if (Prefs.reliableService(getActivity())) { - // only alter the "unset" state of the preference if true - reliableService.setChecked(true); - } + + // set without altering "unset" state of the preference + reliableService.setOnPreferenceChangeListener(null); + reliableService.setChecked(Prefs.reliableService(getActivity())); + reliableService.setOnPreferenceChangeListener(this); } @Override @@ -155,6 +150,19 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { } } + @Override + public boolean onPreferenceChange(@NonNull Preference preference, Object newValue) { + Context context = getContext(); + boolean enabled = (Boolean) newValue; + Prefs.setReliableService(context, enabled); + if (enabled) { + KeepAliveService.startSelf(context); + } else { + context.stopService(new Intent(context, KeepAliveService.class)); + } + return true; + } + private class RingtoneSummaryListener implements Preference.OnPreferenceChangeListener { @Override public boolean onPreferenceChange(@NonNull Preference preference, Object newValue) { diff --git a/src/main/java/org/thoughtcrime/securesms/util/Prefs.java b/src/main/java/org/thoughtcrime/securesms/util/Prefs.java index 0b625d2745..b7a3ee0c4b 100644 --- a/src/main/java/org/thoughtcrime/securesms/util/Prefs.java +++ b/src/main/java/org/thoughtcrime/securesms/util/Prefs.java @@ -30,6 +30,7 @@ public class Prefs { private static final String TAG = Prefs.class.getSimpleName(); + public static final String RELIABLE_SERVICE_PREF = "pref_reliable_service"; public static final String DISABLE_PASSPHRASE_PREF = "pref_disable_passphrase"; public static final String THEME_PREF = "pref_theme"; public static final String BACKGROUND_PREF = "pref_chat_background"; @@ -214,18 +215,20 @@ public static void setChatRingtone(Context context, int accountId, int chatId, U return result==null? null : Uri.parse(result); } + public static void setReliableService(Context context, boolean value) { + setBooleanPreference(context, RELIABLE_SERVICE_PREF, value); + } + public static boolean reliableService(Context context) { - final String key = "pref_reliable_service"; final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - if (prefs.contains(key)) { + if (prefs.contains(RELIABLE_SERVICE_PREF)) { try { - return prefs.getBoolean(key, true); + return prefs.getBoolean(RELIABLE_SERVICE_PREF, true); } catch(Exception e) {} } // if the key was unset, then calculate default value - return FcmReceiveService.getToken() == null - || !DcHelper.getAccounts(context).isAllChatmail(); + return isPushEnabled(context) || !DcHelper.getAccounts(context).isAllChatmail(); } // vibrate diff --git a/src/main/res/xml/preferences_notifications.xml b/src/main/res/xml/preferences_notifications.xml index 612b34c6f5..b96873fc63 100644 --- a/src/main/res/xml/preferences_notifications.xml +++ b/src/main/res/xml/preferences_notifications.xml @@ -64,7 +64,7 @@ android:summary="@string/pref_background_notifications_explain"/>