From 9253c1c21f5fe28992210b5c25ecf00c4afcbdd0 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Sat, 27 May 2023 22:41:16 -0500 Subject: [PATCH] Per-account quiet hours --- .../services/NotificationService.java | 36 +++++++++-------- .../conversations/ui/EditAccountActivity.java | 8 ++++ .../conversations/ui/SettingsActivity.java | 5 +++ .../conversations/ui/SettingsFragment.java | 27 +++++++++++++ src/main/res/layout/activity_edit_account.xml | 40 +++++++++++++++++++ 5 files changed, 99 insertions(+), 17 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/services/NotificationService.java b/src/main/java/eu/siacs/conversations/services/NotificationService.java index f53fc5ebd5e0800546cbdf127ad32fb0dca823f5..c6e6f6637c8c2fe73fd8e3854ad2e3d61ab84106 100644 --- a/src/main/java/eu/siacs/conversations/services/NotificationService.java +++ b/src/main/java/eu/siacs/conversations/services/NotificationService.java @@ -331,19 +331,21 @@ public class NotificationService { "notifications_from_strangers", R.bool.notifications_from_strangers); } - private boolean isQuietHours() { + private boolean isQuietHours(Account account) { + if (mXmppConnectionService.getAccounts().size() < 2) account = null; + final String suffix = account == null ? "" : ":" + account.getUuid(); if (!mXmppConnectionService.getBooleanPreference( - "enable_quiet_hours", R.bool.enable_quiet_hours)) { + "enable_quiet_hours" + suffix, R.bool.enable_quiet_hours)) { return false; } final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(mXmppConnectionService); final long startTime = TimePreference.minutesToTimestamp( - preferences.getLong("quiet_hours_start", TimePreference.DEFAULT_VALUE)); + preferences.getLong("quiet_hours_start" + suffix, TimePreference.DEFAULT_VALUE)); final long endTime = TimePreference.minutesToTimestamp( - preferences.getLong("quiet_hours_end", TimePreference.DEFAULT_VALUE)); + preferences.getLong("quiet_hours_end" + suffix, TimePreference.DEFAULT_VALUE)); final long nowTime = Calendar.getInstance().getTimeInMillis(); if (endTime < startTime) { @@ -562,7 +564,7 @@ public class NotificationService { } public synchronized void startRinging(final AbstractJingleConnection.Id id, final Set media) { - if (isQuietHours()) return; + if (isQuietHours(id.getContact().getAccount())) return; if (tryRingingWithDialerUI(id, media)) { return; @@ -912,8 +914,6 @@ public class NotificationService { final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(mXmppConnectionService); - final boolean quiteHours = isQuietHours(); - final boolean notifyOnlyOneChild = notify && conversations != null @@ -930,27 +930,29 @@ public class NotificationService { final Builder mBuilder; if (notifications.size() == 1 && Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { ArrayList messages = notifications.values().iterator().next(); - mBuilder = buildSingleConversations(messages, notify, quiteHours); - modifyForSoundVibrationAndLight(mBuilder, notify, quiteHours, preferences, messages.isEmpty() ? null : messages.get(0).getConversation().getAccount()); + final Account account = messages.isEmpty() ? null : messages.get(0).getConversation().getAccount(); + mBuilder = buildSingleConversations(messages, notify, isQuietHours(account)); + modifyForSoundVibrationAndLight(mBuilder, notify, preferences, account); notify(NOTIFICATION_ID, mBuilder.build()); } else { - mBuilder = buildMultipleConversation(notify, quiteHours); + mBuilder = buildMultipleConversation(notify, isQuietHours(null)); if (notifyOnlyOneChild) { mBuilder.setGroupAlertBehavior(NotificationCompat.GROUP_ALERT_CHILDREN); } - modifyForSoundVibrationAndLight(mBuilder, notify, quiteHours, preferences, null); + modifyForSoundVibrationAndLight(mBuilder, notify, preferences, null); if (!summaryOnly) { for (Map.Entry> entry : notifications.entrySet()) { String uuid = entry.getKey(); final boolean notifyThis = notifyOnlyOneChild ? conversations.contains(uuid) : notify; + final Account account = entry.getValue().isEmpty() ? null : entry.getValue().get(0).getConversation().getAccount(); Builder singleBuilder = - buildSingleConversations(entry.getValue(), notifyThis, quiteHours); + buildSingleConversations(entry.getValue(), notifyThis, isQuietHours(account)); if (!notifyOnlyOneChild) { singleBuilder.setGroupAlertBehavior( NotificationCompat.GROUP_ALERT_SUMMARY); } - modifyForSoundVibrationAndLight(singleBuilder, notifyThis, quiteHours, preferences, entry.getValue().isEmpty() ? null : entry.getValue().get(0).getConversation().getAccount()); + modifyForSoundVibrationAndLight(singleBuilder, notifyThis, preferences, account); singleBuilder.setGroup(MESSAGES_GROUP); notify(entry.getKey(), NOTIFICATION_ID, singleBuilder.build()); } @@ -986,7 +988,7 @@ public class NotificationService { } private void modifyForSoundVibrationAndLight( - Builder mBuilder, boolean notify, boolean quietHours, SharedPreferences preferences, Account account) { + Builder mBuilder, boolean notify, SharedPreferences preferences, Account account) { final Resources resources = mXmppConnectionService.getResources(); final String ringtone = preferences.getString( @@ -1000,7 +1002,7 @@ public class NotificationService { final boolean headsup = preferences.getBoolean( "notification_headsup", resources.getBoolean(R.bool.headsup_notifications)); - if (notify && !quietHours) { + if (notify && !isQuietHours(account)) { if (vibrate) { final int dat = 70; final long[] pattern = {0, 3 * dat, dat, dat}; @@ -1113,7 +1115,7 @@ public class NotificationService { private Builder buildMissedCall( final Conversational conversation, final MissedCallsInfo info, boolean publicVersion) { final Builder builder = - new NotificationCompat.Builder(mXmppConnectionService, isQuietHours() ? "quiet_hours" : "missed_calls"); + new NotificationCompat.Builder(mXmppConnectionService, isQuietHours(conversation.getAccount()) ? "quiet_hours" : "missed_calls"); final String title = (info.getNumberOfCalls() == 1) ? mXmppConnectionService.getString(R.string.missed_call) @@ -1167,7 +1169,7 @@ public class NotificationService { if (led) { builder.setLights(LED_COLOR, 2000, 3000); } - builder.setPriority(isQuietHours() ? NotificationCompat.PRIORITY_LOW : NotificationCompat.PRIORITY_HIGH); + builder.setPriority(isQuietHours(account) ? NotificationCompat.PRIORITY_LOW : NotificationCompat.PRIORITY_HIGH); builder.setSound(null); setNotificationColor(builder, account); } diff --git a/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java b/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java index 7b51cc9f39d23a37015e079b549f620928fa1691..405a8bb61f3b20613dcf916254d9769c316d9a07 100644 --- a/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java @@ -646,6 +646,12 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat binding.accountColorBox.setOnClickListener((v) -> { showColorDialog(); }); + binding.quietHoursBox.setOnClickListener((v) -> { + Intent intent = new Intent(Intent.ACTION_VIEW, null, EditAccountActivity.this, SettingsActivity.class); + intent.putExtra("page", "quiet_hours"); + intent.putExtra("suffix", ":" + mAccount.getUuid()); + startActivity(intent); + }); } private void onEditYourNameClicked(View view) { @@ -1072,8 +1078,10 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat if (xmppConnectionService != null && xmppConnectionService.getAccounts().size() > 1) { binding.accountColorBox.setVisibility(View.VISIBLE); binding.colorPreview.setBackgroundColor(mAccount.getColor(isDarkTheme())); + binding.quietHoursBox.setVisibility(View.VISIBLE); } else { binding.accountColorBox.setVisibility(View.GONE); + binding.quietHoursBox.setVisibility(View.GONE); } final boolean togglePassword = mAccount.isOptionSet(Account.OPTION_MAGIC_CREATE) || !mAccount.isOptionSet(Account.OPTION_LOGGED_IN_SUCCESSFULLY); diff --git a/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java b/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java index 5c133604e4bbf05924651f09320e9d99b552e050..ed10c271f1ab7af3aa609e704196f74c14ef714a 100644 --- a/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java @@ -126,6 +126,11 @@ public class SettingsActivity extends XmppActivity implements OnSharedPreference Preference pref = mSettingsFragment.findPreference("dialler_integration_incoming"); if (cat != null && pref != null) cat.removePreference(pref); } + if (xmppConnectionService.getAccounts().size() > 1) { + PreferenceCategory cat = (PreferenceCategory) mSettingsFragment.findPreference("notification_category"); + Preference pref = mSettingsFragment.findPreference("quiet_hours"); + if (cat != null && pref != null) cat.removePreference(pref); + } final Preference accountPreference = mSettingsFragment.findPreference(UnifiedPushDistributor.PREFERENCE_ACCOUNT); reconfigureUpAccountPreference(accountPreference); diff --git a/src/main/java/eu/siacs/conversations/ui/SettingsFragment.java b/src/main/java/eu/siacs/conversations/ui/SettingsFragment.java index 9378d82b7393b4735c998dea1ce7d5a314563697..72c3e4bc02c3080f353f8274c3cb9b1d63102f86 100644 --- a/src/main/java/eu/siacs/conversations/ui/SettingsFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/SettingsFragment.java @@ -9,6 +9,8 @@ import android.preference.PreferenceScreen; import android.text.TextUtils; import android.widget.ListView; +import java.lang.reflect.Method; + import eu.siacs.conversations.Config; import eu.siacs.conversations.R; import eu.siacs.conversations.utils.Compatibility; @@ -16,6 +18,7 @@ import eu.siacs.conversations.utils.Compatibility; public class SettingsFragment extends PreferenceFragment { private String page = null; + private String suffix = null; @Override public void onCreate(Bundle savedInstanceState) { @@ -57,6 +60,7 @@ public class SettingsFragment extends PreferenceFragment { if (Intent.ACTION_VIEW.equals(intent.getAction())) { if (intent.getExtras() != null) { this.page = intent.getExtras().getString("page"); + this.suffix = intent.getExtras().getString("suffix"); if (wasEmpty) { openPreferenceScreen(page); } @@ -71,7 +75,30 @@ public class SettingsFragment extends PreferenceFragment { final PreferenceScreen preferenceScreen = (PreferenceScreen) pref; getActivity().setTitle(preferenceScreen.getTitle()); preferenceScreen.setDependency(""); + if (this.suffix != null) { + for (int i = 0; i < preferenceScreen.getPreferenceCount(); i++) { + final Preference p = preferenceScreen.getPreference(i); + if (!p.hasKey()) continue; + p.setKey(p.getKey() + this.suffix); + if (p.getDependency() != null && !"".equals(p.getDependency())) { + p.setDependency(p.getDependency() + this.suffix); + } + reloadPref(p); + } + } setPreferenceScreen((PreferenceScreen) pref); } } + + static void reloadPref(final Preference pref) { + Class iterClass = pref.getClass(); + while(iterClass != Object.class) { + try { + Method m = iterClass.getDeclaredMethod("onSetInitialValue", boolean.class, Object.class); + m.setAccessible(true); + m.invoke(pref, true, null); + } catch (Exception e) { } + iterClass = iterClass.getSuperclass(); + } + } } diff --git a/src/main/res/layout/activity_edit_account.xml b/src/main/res/layout/activity_edit_account.xml index 190a956d08edc78f09d11c090eb9bd063becdba5..fb1866c619e3be6de1874b2c8d959d5be5d45558 100644 --- a/src/main/res/layout/activity_edit_account.xml +++ b/src/main/res/layout/activity_edit_account.xml @@ -581,6 +581,46 @@ + + + + + + + + + + + +