diff --git a/app/src/main/java/com/infomaniak/mail/ui/alertDialogs/SelectVisibilityReminderDialog.kt b/app/src/main/java/com/infomaniak/mail/ui/alertDialogs/SelectVisibilityReminderDialog.kt new file mode 100644 index 0000000000..5b2d90b491 --- /dev/null +++ b/app/src/main/java/com/infomaniak/mail/ui/alertDialogs/SelectVisibilityReminderDialog.kt @@ -0,0 +1,88 @@ +/* + * Infomaniak Mail - Android + * Copyright (C) 2026 Infomaniak Network SA + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.infomaniak.mail.ui.alertDialogs + +import android.content.Context +import androidx.appcompat.app.AlertDialog +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.infomaniak.mail.R +import com.infomaniak.mail.databinding.DialogSelectVisibilityReminderBinding +import dagger.hilt.android.qualifiers.ActivityContext +import dagger.hilt.android.scopes.ActivityScoped +import javax.inject.Inject + +@ActivityScoped +class SelectVisibilityReminderDialog @Inject constructor( + @ActivityContext private val activityContext: Context, +) : BaseAlertDialog(activityContext) { + private val binding: DialogSelectVisibilityReminderBinding by lazy { + DialogSelectVisibilityReminderBinding.inflate(activity.layoutInflater) + } + + override val alertDialog = initDialog() + + private var isRecipientsAndMeSelected: Boolean = true + + private var onVisibilitySelected: ((Boolean) -> Unit)? = null + + private fun initDialog(): AlertDialog { + return MaterialAlertDialogBuilder(activityContext) + .setTitle(R.string.reminderVisibilityTitle) + .setView(binding.root) + .setPositiveButton(R.string.buttonConfirm, null) + .setNegativeButton(com.infomaniak.core.legacy.R.string.buttonCancel, null) + .create() + } + + fun show( + selectRecipientsAndMe: Boolean = true, + onVisibilitySelected: (Boolean) -> Unit, + ) { + this.onVisibilitySelected = onVisibilitySelected + alertDialog.show() + isRecipientsAndMeSelected = selectRecipientsAndMe + setupRadioGroup(selectRecipientsAndMe) + setupListeners() + } + + override fun resetCallbacks() { + onVisibilitySelected = null + } + + private fun setupRadioGroup(selectRecipientsAndMe: Boolean) = with(binding) { + val defaultSelection = if (selectRecipientsAndMe) { + R.id.selectionReminderRecipientsAndMe + } else { + R.id.selectionReminderMeOnly + } + reminderVisibilityGroup.check(defaultSelection) + } + + private fun setupListeners() { + binding.reminderVisibilityGroup.onItemCheckedListener { id, _, _ -> + isRecipientsAndMeSelected = (id == R.id.selectionReminderRecipientsAndMe) + } + + positiveButton.setOnClickListener { + onVisibilitySelected?.invoke(isRecipientsAndMeSelected) + alertDialog.dismiss() + } + + negativeButton.setOnClickListener { alertDialog.cancel() } + } +} diff --git a/app/src/main/java/com/infomaniak/mail/ui/newMessage/NewMessageFragment.kt b/app/src/main/java/com/infomaniak/mail/ui/newMessage/NewMessageFragment.kt index 3280d56240..e15ff4e949 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/newMessage/NewMessageFragment.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/newMessage/NewMessageFragment.kt @@ -466,7 +466,10 @@ class NewMessageFragment : Fragment() { reminderAlert.apply { onAction1 { navigateToScheduleSendBottomSheet() } - onAction2 { newMessageViewModel.setReminderConfig(ReminderConfig.None) } + onAction2 { + newMessageViewModel.setReminderConfig(ReminderConfig.None) + newMessageViewModel.setShouldRemindRecipient(true) + } } recipientFieldsManager.setupAutoCompletionFields() diff --git a/app/src/main/java/com/infomaniak/mail/ui/newMessage/NewMessageViewModel.kt b/app/src/main/java/com/infomaniak/mail/ui/newMessage/NewMessageViewModel.kt index b8468d74d0..c1edcdb303 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/newMessage/NewMessageViewModel.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/newMessage/NewMessageViewModel.kt @@ -262,6 +262,9 @@ class NewMessageViewModel @Inject constructor( private val _reminderConfig = MutableStateFlow(ReminderConfig.None) val reminderConfig: StateFlow = _reminderConfig.asStateFlow() + private val _shouldRemindRecipient = MutableStateFlow(true) + val shouldRemindRecipient: StateFlow = _shouldRemindRecipient.asStateFlow() + //region Check mailbox existence private val exitSignal: CompletableJob = Job() @@ -1236,7 +1239,10 @@ class NewMessageViewModel @Inject constructor( updatedMentions } + } + fun setShouldRemindRecipient(value: Boolean) { + _shouldRemindRecipient.value = value } fun setScheduleConfig(config: ScheduleConfig) { diff --git a/app/src/main/java/com/infomaniak/mail/ui/newMessage/sendOptions/DraftSendOptionsFragment.kt b/app/src/main/java/com/infomaniak/mail/ui/newMessage/sendOptions/DraftSendOptionsFragment.kt index f983c01907..caeae2a2c1 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/newMessage/sendOptions/DraftSendOptionsFragment.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/newMessage/sendOptions/DraftSendOptionsFragment.kt @@ -39,6 +39,7 @@ import com.infomaniak.mail.data.models.FeatureFlag import com.infomaniak.mail.databinding.FragmentSendOptionsBinding import com.infomaniak.mail.ui.alertDialogs.CustomReminderPickerDialog import com.infomaniak.mail.ui.alertDialogs.SelectDateAndTimeForScheduledDraftDialog +import com.infomaniak.mail.ui.alertDialogs.SelectVisibilityReminderDialog import com.infomaniak.mail.ui.bottomSheetDialogs.ScheduleOption import com.infomaniak.mail.ui.bottomSheetDialogs.ScheduleOptionUtils import com.infomaniak.mail.ui.main.settings.SettingRadioButtonView @@ -70,6 +71,9 @@ class DraftSendOptionsFragment : Fragment() { @Inject lateinit var customReminderPickerDialog: CustomReminderPickerDialog + @Inject + lateinit var selectVisibilityDialog: SelectVisibilityReminderDialog + @Inject lateinit var localSettings: LocalSettings @@ -79,6 +83,12 @@ class DraftSendOptionsFragment : Fragment() { navigationArgs.currentlyScheduledEpochMillis.takeIf { it != 0L } } + private var shouldRemindRecipient: Boolean + get() = newMessageViewModel.shouldRemindRecipient.value + set(value) { + newMessageViewModel.setShouldRemindRecipient(value) + } + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { return FragmentSendOptionsBinding.inflate(inflater, container, false).also { binding = it }.root } @@ -86,6 +96,7 @@ class DraftSendOptionsFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) = with(binding) { dateAndTimeScheduleDialog.bindAlertToLifecycle(viewLifecycleOwner) customReminderPickerDialog.bindAlertToLifecycle(viewLifecycleOwner) + selectVisibilityDialog.bindAlertToLifecycle(viewLifecycleOwner) setupScheduleOptions() lastScheduleOption.associatedValue = lastSelectedEpoch?.toString() @@ -100,6 +111,11 @@ class DraftSendOptionsFragment : Fragment() { observeFeatureFlagUpdates() observeScheduleConfig() observeReminderConfig() + observeShouldRemindRecipient() + } + + private fun observeShouldRemindRecipient() { + newMessageViewModel.shouldRemindRecipient.observe(viewLifecycleOwner) { updateReminderVisibilitySubtitle() } } private fun observeFeatureFlagUpdates() = with(binding) { @@ -205,6 +221,7 @@ class DraftSendOptionsFragment : Fragment() { } customDelayReminder.setOnClickListener { onCustomDelayReminderClicked() } + reminderVisibility.setOnClickListener { showVisibilityReminderPicker() } } private fun setReminderOptionsVisible(isVisible: Boolean) { @@ -215,11 +232,13 @@ class DraftSendOptionsFragment : Fragment() { private fun removeReminderOptionsSelection() { binding.optionsDelays.clearCheck() newMessageViewModel.setReminderConfig(ReminderConfig.None) + shouldRemindRecipient = true } private fun defaultReminderSelection() = with(binding) { optionsDelays.check(R.id.hours24) newMessageViewModel.setReminderConfig(ReminderConfig.Delayed(ReminderPreset.HOURS_24.delayMinutes, isCustom = false)) + shouldRemindRecipient = true } private fun defaultScheduleSelection() = with(binding) { @@ -390,4 +409,21 @@ class DraftSendOptionsFragment : Fragment() { ) } + private fun showVisibilityReminderPicker() { + selectVisibilityDialog.show( + selectRecipientsAndMe = shouldRemindRecipient, + onVisibilitySelected = { isRecipientsAndMe -> + shouldRemindRecipient = isRecipientsAndMe + }, + ) + } + + private fun updateReminderVisibilitySubtitle() = with(binding) { + val subtitleRes = if (shouldRemindRecipient) { + R.string.selectionReminderRecipientsAndMe + } else { + R.string.selectionReminderMeOnly + } + reminderVisibility.setSubtitle(subtitleRes) + } } diff --git a/app/src/main/res/layout/dialog_select_visibility_reminder.xml b/app/src/main/res/layout/dialog_select_visibility_reminder.xml new file mode 100644 index 0000000000..1aa145775f --- /dev/null +++ b/app/src/main/res/layout/dialog_select_visibility_reminder.xml @@ -0,0 +1,38 @@ + + + + + + + + diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 240b63f5ca..677d2f3945 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -521,6 +521,7 @@ Vælg dato Ingen signatur Vælg tidspunkt + Kun mig Modtagere og mig Send Send bekræftelsen diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 17821ca98b..121596d6a0 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -521,6 +521,7 @@ Datum auswählen Keine Unterschrift Zeit auswählen + Nur ich Empfänger und mich Senden Sie Senden Sie die Bestätigung diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index d44ddb7b09..e501d6783e 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -521,6 +521,7 @@ Επιλέξτε ημερομηνία Χωρίς υπογραφή Επιλέξτε ώρα + Μόνο εγώ Οι παραλήπτες και εγώ Αποστολή Αποστολή επιβεβαίωσης diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index f4df52476c..932096d7f9 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -521,6 +521,7 @@ Seleccione la fecha Sin firma Seleccionar la hora + Solo yo Los destinatarios y yo Enviar Enviar la confirmación diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index a0766af0e8..a95298aedc 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -521,6 +521,7 @@ Valitse päivämäärä Ei allekirjoitusta Valitse aika + Vain minä Vastaanottajat ja minä Lähetä Lähetä vahvistus diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index cd70350c25..352abbf838 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -521,6 +521,7 @@ Sélectionner la date Aucune signature Sélectionner l’heure + Moi uniquement Les destinataires et moi Envoyer Envoyer la confirmation diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 081ba67bbb..125b33adb9 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -521,6 +521,7 @@ Selezionare la data Nessuna firma Selezionare l’ora + Solo io I destinatari e io Invia Inviare la conferma diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index f53442d319..6c8effbc5f 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -521,6 +521,7 @@ Velg dato Ingen signatur Velg tid + Bare jeg Mottakere og meg Send Send bekreftelsen diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index c8a0f6829d..34a22e4932 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -521,6 +521,7 @@ Datum selecteren Geen handtekening Tijd selecteren + Alleen ik Ontvangers en mij Verzenden De bevestiging verzenden diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 4ff5c71287..c42cb8af08 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -551,6 +551,7 @@ Wybierz datę Brak podpisu Wybierz godzinę + Tylko ja Odbiorcy i ja Wyślij Wyślij potwierdzenie diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 7cccbf5e41..4fbbde63f0 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -521,6 +521,7 @@ Selecionar data Sem assinatura Selecionar hora + Só eu Os destinatários e eu Enviar Enviar a confirmação diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 9f3b84b8c6..dc4b747fb4 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -521,6 +521,7 @@ Välj datum Ingen signatur Välj tid + Bara jag Mottagare och mig Skicka Skicka bekräftelsen diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6d8272d6d5..f5f460a691 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -525,6 +525,7 @@ Select date No signature Select time + Me only Recipients and I Send Send the confirmation