diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/NotificationsSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/NotificationsSettingsFragment.kt index 9cbfd55c5..a6fbcd004 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/NotificationsSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/NotificationsSettingsFragment.kt @@ -9,6 +9,7 @@ import android.graphics.PorterDuffColorFilter import android.media.Ringtone import android.media.RingtoneManager import android.net.Uri +import android.os.Build import android.provider.Settings import android.text.TextUtils import android.view.View @@ -97,49 +98,61 @@ class NotificationsSettingsFragment : DSLSettingsFragment(R.string.preferences__ } ) - clickPref( - title = DSLSettingsText.from(R.string.preferences__sound), - summary = DSLSettingsText.from(getRingtoneSummary(state.messageNotificationsState.sound)), - isEnabled = state.messageNotificationsState.notificationsEnabled, - onClick = { - launchMessageSoundSelectionIntent() - } - ) - - switchPref( - title = DSLSettingsText.from(R.string.preferences__vibrate), - isChecked = state.messageNotificationsState.vibrateEnabled, - isEnabled = state.messageNotificationsState.notificationsEnabled, - onClick = { - viewModel.setMessageNotificationVibration(!state.messageNotificationsState.vibrateEnabled) - } - ) - - customPref( - LedColorPreference( - colorValues = ledColorValues, - radioListPreference = RadioListPreference( - title = DSLSettingsText.from(R.string.preferences__led_color), - listItems = ledColorLabels, - selected = ledColorValues.indexOf(state.messageNotificationsState.ledColor), - isEnabled = state.messageNotificationsState.notificationsEnabled, - onSelected = { - viewModel.setMessageNotificationLedColor(ledColorValues[it]) - } - ) - ) - ) - - if (!NotificationChannels.supported()) { - radioListPref( - title = DSLSettingsText.from(R.string.preferences__pref_led_blink_title), - listItems = ledBlinkLabels, - selected = ledBlinkValues.indexOf(state.messageNotificationsState.ledBlink), + if (Build.VERSION.SDK_INT >= 30) { + clickPref( + title = DSLSettingsText.from(R.string.preferences__customize), + summary = DSLSettingsText.from(R.string.preferences__change_sound_and_vibration), isEnabled = state.messageNotificationsState.notificationsEnabled, - onSelected = { - viewModel.setMessageNotificationLedBlink(ledBlinkValues[it]) + onClick = { + NotificationChannels.openChannelSettings(requireContext(), NotificationChannels.getMessagesChannel(requireContext()), null) } ) + } else { + + clickPref( + title = DSLSettingsText.from(R.string.preferences__sound), + summary = DSLSettingsText.from(getRingtoneSummary(state.messageNotificationsState.sound)), + isEnabled = state.messageNotificationsState.notificationsEnabled, + onClick = { + launchMessageSoundSelectionIntent() + } + ) + + switchPref( + title = DSLSettingsText.from(R.string.preferences__vibrate), + isChecked = state.messageNotificationsState.vibrateEnabled, + isEnabled = state.messageNotificationsState.notificationsEnabled, + onClick = { + viewModel.setMessageNotificationVibration(!state.messageNotificationsState.vibrateEnabled) + } + ) + + customPref( + LedColorPreference( + colorValues = ledColorValues, + radioListPreference = RadioListPreference( + title = DSLSettingsText.from(R.string.preferences__led_color), + listItems = ledColorLabels, + selected = ledColorValues.indexOf(state.messageNotificationsState.ledColor), + isEnabled = state.messageNotificationsState.notificationsEnabled, + onSelected = { + viewModel.setMessageNotificationLedColor(ledColorValues[it]) + } + ) + ) + ) + + if (!NotificationChannels.supported()) { + radioListPref( + title = DSLSettingsText.from(R.string.preferences__pref_led_blink_title), + listItems = ledBlinkLabels, + selected = ledBlinkValues.indexOf(state.messageNotificationsState.ledBlink), + isEnabled = state.messageNotificationsState.notificationsEnabled, + onSelected = { + viewModel.setMessageNotificationLedBlink(ledBlinkValues[it]) + } + ) + } } switchPref( @@ -171,24 +184,26 @@ class NotificationsSettingsFragment : DSLSettingsFragment(R.string.preferences__ } ) - if (NotificationChannels.supported()) { - clickPref( - title = DSLSettingsText.from(R.string.preferences_notifications__priority), - isEnabled = state.messageNotificationsState.notificationsEnabled, - onClick = { - launchNotificationPriorityIntent() - } - ) - } else { - radioListPref( - title = DSLSettingsText.from(R.string.preferences_notifications__priority), - listItems = notificationPriorityLabels, - selected = notificationPriorityValues.indexOf(state.messageNotificationsState.priority.toString()), - isEnabled = state.messageNotificationsState.notificationsEnabled, - onSelected = { - viewModel.setMessageNotificationPriority(notificationPriorityValues[it].toInt()) - } - ) + if (Build.VERSION.SDK_INT < 30) { + if (NotificationChannels.supported()) { + clickPref( + title = DSLSettingsText.from(R.string.preferences_notifications__priority), + isEnabled = state.messageNotificationsState.notificationsEnabled, + onClick = { + launchNotificationPriorityIntent() + } + ) + } else { + radioListPref( + title = DSLSettingsText.from(R.string.preferences_notifications__priority), + listItems = notificationPriorityLabels, + selected = notificationPriorityValues.indexOf(state.messageNotificationsState.priority.toString()), + isEnabled = state.messageNotificationsState.notificationsEnabled, + onSelected = { + viewModel.setMessageNotificationPriority(notificationPriorityValues[it].toInt()) + } + ) + } } dividerPref() diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/custom/CustomNotificationsSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/custom/CustomNotificationsSettingsFragment.kt index ab564c17b..4c6f95991 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/custom/CustomNotificationsSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/custom/CustomNotificationsSettingsFragment.kt @@ -5,6 +5,7 @@ import android.content.Context import android.content.Intent import android.media.RingtoneManager import android.net.Uri +import android.os.Build import android.provider.Settings import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResultLauncher @@ -19,6 +20,7 @@ import org.thoughtcrime.securesms.components.settings.DSLSettingsText import org.thoughtcrime.securesms.components.settings.configure import org.thoughtcrime.securesms.database.RecipientDatabase import org.thoughtcrime.securesms.notifications.NotificationChannels +import org.thoughtcrime.securesms.util.ConversationUtil import org.thoughtcrime.securesms.util.RingtoneUtil private val TAG = Log.tag(CustomNotificationsSettingsFragment::class.java) @@ -84,30 +86,39 @@ class CustomNotificationsSettingsFragment : DSLSettingsFragment(R.string.CustomN ) } - clickPref( - title = DSLSettingsText.from(R.string.CustomNotificationsDialogFragment__notification_sound), - summary = DSLSettingsText.from(getRingtoneSummary(requireContext(), state.messageSound, Settings.System.DEFAULT_NOTIFICATION_URI)), - isEnabled = state.controlsEnabled, - onClick = { requestSound(state.messageSound, false) } - ) - - if (NotificationChannels.supported()) { - switchPref( - title = DSLSettingsText.from(R.string.CustomNotificationsDialogFragment__vibrate), + if (Build.VERSION.SDK_INT >= 30) { + clickPref( + title = DSLSettingsText.from(R.string.CustomNotificationsDialogFragment__customize), + summary = DSLSettingsText.from(R.string.CustomNotificationsDialogFragment__change_sound_and_vibration), isEnabled = state.controlsEnabled, - isChecked = state.messageVibrateEnabled, - onClick = { viewModel.setMessageVibrate(RecipientDatabase.VibrateState.fromBoolean(!state.messageVibrateEnabled)) } + onClick = { NotificationChannels.openChannelSettings(requireContext(), state.recipient!!.notificationChannel!!, ConversationUtil.getShortcutId(state.recipient)) } ) } else { - radioListPref( - title = DSLSettingsText.from(R.string.CustomNotificationsDialogFragment__vibrate), + clickPref( + title = DSLSettingsText.from(R.string.CustomNotificationsDialogFragment__notification_sound), + summary = DSLSettingsText.from(getRingtoneSummary(requireContext(), state.messageSound, Settings.System.DEFAULT_NOTIFICATION_URI)), isEnabled = state.controlsEnabled, - listItems = vibrateLabels, - selected = state.messageVibrateState.id, - onSelected = { - viewModel.setMessageVibrate(RecipientDatabase.VibrateState.fromId(it)) - } + onClick = { requestSound(state.messageSound, false) } ) + + if (NotificationChannels.supported()) { + switchPref( + title = DSLSettingsText.from(R.string.CustomNotificationsDialogFragment__vibrate), + isEnabled = state.controlsEnabled, + isChecked = state.messageVibrateEnabled, + onClick = { viewModel.setMessageVibrate(RecipientDatabase.VibrateState.fromBoolean(!state.messageVibrateEnabled)) } + ) + } else { + radioListPref( + title = DSLSettingsText.from(R.string.CustomNotificationsDialogFragment__vibrate), + isEnabled = state.controlsEnabled, + listItems = vibrateLabels, + selected = state.messageVibrateState.id, + onSelected = { + viewModel.setMessageVibrate(RecipientDatabase.VibrateState.fromId(it)) + } + ) + } } if (state.showCallingOptions) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/custom/CustomNotificationsSettingsState.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/custom/CustomNotificationsSettingsState.kt index 38bfd0136..4194d1a78 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/custom/CustomNotificationsSettingsState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/custom/CustomNotificationsSettingsState.kt @@ -2,9 +2,11 @@ package org.thoughtcrime.securesms.components.settings.conversation.sounds.custo import android.net.Uri import org.thoughtcrime.securesms.database.RecipientDatabase +import org.thoughtcrime.securesms.recipients.Recipient data class CustomNotificationsSettingsState( val isInitialLoadComplete: Boolean = false, + val recipient: Recipient? = null, val hasCustomNotifications: Boolean = false, val controlsEnabled: Boolean = false, val messageVibrateState: RecipientDatabase.VibrateState = RecipientDatabase.VibrateState.DEFAULT, diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/custom/CustomNotificationsSettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/custom/CustomNotificationsSettingsViewModel.kt index f78741ed5..ea87f3d40 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/custom/CustomNotificationsSettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/custom/CustomNotificationsSettingsViewModel.kt @@ -25,6 +25,7 @@ class CustomNotificationsSettingsViewModel( store.update(Recipient.live(recipientId).liveData) { recipient, state -> val recipientHasCustomNotifications = NotificationChannels.supported() && recipient.notificationChannel != null state.copy( + recipient = recipient, hasCustomNotifications = recipientHasCustomNotifications, controlsEnabled = (!NotificationChannels.supported() || recipientHasCustomNotifications) && state.isInitialLoadComplete, messageSound = recipient.messageRingtone, diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/error/EnableCallNotificationSettingsDialog.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/error/EnableCallNotificationSettingsDialog.java index 3235baa99..ee562bf06 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/error/EnableCallNotificationSettingsDialog.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/error/EnableCallNotificationSettingsDialog.java @@ -184,7 +184,7 @@ public final class EnableCallNotificationSettingsDialog extends DialogFragment { } private void showNotificationChannelSettings() { - NotificationChannels.openChannelSettings(requireContext(), NotificationChannels.CALLS); + NotificationChannels.openChannelSettings(requireContext(), NotificationChannels.CALLS, null); } private void showAppSettings() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/NotificationChannels.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/NotificationChannels.java index 55601f06f..053f904a2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/NotificationChannels.java +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/NotificationChannels.java @@ -233,7 +233,7 @@ public class NotificationChannels { /** * Navigates the user to the system settings for the desired notification channel. */ - public static void openChannelSettings(@NonNull Context context, @NonNull String channelId) { + public static void openChannelSettings(@NonNull Context context, @NonNull String channelId, @Nullable String conversationId) { if (!supported()) { return; } @@ -242,6 +242,9 @@ public class NotificationChannels { Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS); intent.putExtra(Settings.EXTRA_CHANNEL_ID, channelId); intent.putExtra(Settings.EXTRA_APP_PACKAGE, context.getPackageName()); + if (conversationId != null && Build.VERSION.SDK_INT >= CONVERSATION_SUPPORT_VERSION) { + intent.putExtra(Settings.EXTRA_CONVERSATION_ID, conversationId); + } context.startActivity(intent); } catch (ActivityNotFoundException e) { Log.w(TAG, "Channel settings activity not found", e); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2e7d54e5f..7c37dca3a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -845,6 +845,9 @@ Use custom notifications Notification sound Vibrate + + Customize + Change sound and vibration Call settings Ringtone Enabled @@ -2478,6 +2481,8 @@ LED color Unknown LED blink pattern + Customize + Change sound and vibration Sound Silent Default