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