diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/SoundsAndNotificationsSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/SoundsAndNotificationsSettingsFragment.kt index f83639b1ac..334de4c4be 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/SoundsAndNotificationsSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/SoundsAndNotificationsSettingsFragment.kt @@ -32,9 +32,14 @@ class SoundsAndNotificationsSettingsFragment : DSLSettingsFragment( } ) + override fun onResume() { + super.onResume() + viewModel.channelConsistencyCheck() + } + override fun bindAdapter(adapter: DSLSettingsAdapter) { viewModel.state.observe(viewLifecycleOwner) { state -> - if (state.recipientId != Recipient.UNKNOWN.id) { + if (state.channelConsistencyCheckComplete && state.recipientId != Recipient.UNKNOWN.id) { adapter.submitList(getConfiguration(state).toMappingModelList()) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/SoundsAndNotificationsSettingsRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/SoundsAndNotificationsSettingsRepository.kt index 4cb4a80735..1e92c20113 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/SoundsAndNotificationsSettingsRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/SoundsAndNotificationsSettingsRepository.kt @@ -10,6 +10,15 @@ import org.thoughtcrime.securesms.recipients.RecipientId class SoundsAndNotificationsSettingsRepository(private val context: Context) { + fun ensureCustomChannelConsistency(complete: () -> Unit) { + SignalExecutors.BOUNDED.execute { + if (NotificationChannels.supported()) { + NotificationChannels.ensureCustomChannelConsistency(context) + } + complete() + } + } + fun setMuteUntil(recipientId: RecipientId, muteUntil: Long) { SignalExecutors.BOUNDED.execute { SignalDatabase.recipients.setMuted(recipientId, muteUntil) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/SoundsAndNotificationsSettingsState.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/SoundsAndNotificationsSettingsState.kt index 11ff874144..8e1a5836f1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/SoundsAndNotificationsSettingsState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/SoundsAndNotificationsSettingsState.kt @@ -9,5 +9,6 @@ data class SoundsAndNotificationsSettingsState( val muteUntil: Long = 0L, val mentionSetting: RecipientDatabase.MentionSetting = RecipientDatabase.MentionSetting.DO_NOT_NOTIFY, val hasCustomNotificationSettings: Boolean = false, - val hasMentionsSupport: Boolean = false + val hasMentionsSupport: Boolean = false, + val channelConsistencyCheckComplete: Boolean = false ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/SoundsAndNotificationsSettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/SoundsAndNotificationsSettingsViewModel.kt index 7f9f53de9b..35e02745d3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/SoundsAndNotificationsSettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/SoundsAndNotificationsSettingsViewModel.kt @@ -42,6 +42,13 @@ class SoundsAndNotificationsSettingsViewModel( repository.setMentionSetting(recipientId, mentionSetting) } + fun channelConsistencyCheck() { + store.update { s -> s.copy(channelConsistencyCheckComplete = false) } + repository.ensureCustomChannelConsistency { + store.update { s -> s.copy(channelConsistencyCheckComplete = true) } + } + } + class Factory( private val recipientId: RecipientId, private val repository: SoundsAndNotificationsSettingsRepository 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 40929b16ce..9b056c73ee 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 @@ -42,6 +42,11 @@ class CustomNotificationsSettingsFragment : DSLSettingsFragment(R.string.CustomN return CustomNotificationsSettingsViewModel.Factory(recipientId, repository) } + override fun onResume() { + super.onResume() + viewModel.channelConsistencyCheck() + } + override fun bindAdapter(adapter: DSLSettingsAdapter) { messageSoundResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> handleResult(result, viewModel::setMessageSound) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/custom/CustomNotificationsSettingsRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/custom/CustomNotificationsSettingsRepository.kt index a65a237e38..93d6f62014 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/custom/CustomNotificationsSettingsRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/custom/CustomNotificationsSettingsRepository.kt @@ -17,19 +17,20 @@ class CustomNotificationsSettingsRepository(context: Context) { private val context = context.applicationContext private val executor = SerialExecutor(SignalExecutors.BOUNDED) - fun initialize(recipientId: RecipientId, onInitializationComplete: () -> Unit) { + fun ensureCustomChannelConsistency(recipientId: RecipientId, onComplete: () -> Unit) { executor.execute { - val recipient = Recipient.resolved(recipientId) - val database = SignalDatabase.recipients - - if (NotificationChannels.supported() && recipient.notificationChannel != null) { - database.setMessageRingtone(recipient.id, NotificationChannels.getMessageRingtone(context, recipient)) - database.setMessageVibrate(recipient.id, RecipientDatabase.VibrateState.fromBoolean(NotificationChannels.getMessageVibrate(context, recipient))) - + if (NotificationChannels.supported()) { NotificationChannels.ensureCustomChannelConsistency(context) + + val recipient = Recipient.resolved(recipientId) + val database = SignalDatabase.recipients + if (recipient.notificationChannel != null) { + database.setMessageRingtone(recipient.id, NotificationChannels.getMessageRingtone(context, recipient)) + database.setMessageVibrate(recipient.id, RecipientDatabase.VibrateState.fromBoolean(NotificationChannels.getMessageVibrate(context, recipient))) + } } - onInitializationComplete() + onComplete() } } 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 0eb9f3c654..f78741ed58 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 @@ -22,15 +22,6 @@ class CustomNotificationsSettingsViewModel( val state: LiveData = store.stateLiveData init { - repository.initialize(recipientId) { - store.update { - it.copy( - isInitialLoadComplete = true, - controlsEnabled = (!NotificationChannels.supported() || it.hasCustomNotifications) - ) - } - } - store.update(Recipient.live(recipientId).liveData) { recipient, state -> val recipientHasCustomNotifications = NotificationChannels.supported() && recipient.notificationChannel != null state.copy( @@ -70,6 +61,18 @@ class CustomNotificationsSettingsViewModel( repository.setCallSound(recipientId, uri) } + fun channelConsistencyCheck() { + store.update { it.copy(isInitialLoadComplete = false) } + repository.ensureCustomChannelConsistency(recipientId) { + store.update { + it.copy( + isInitialLoadComplete = true, + controlsEnabled = (!NotificationChannels.supported() || it.hasCustomNotifications) + ) + } + } + } + class Factory( private val recipientId: RecipientId, private val repository: CustomNotificationsSettingsRepository