Skip to content

Commit 9307c9e

Browse files
tevincentKevinBoulongne
authored andcommitted
Add Dialog to confirm we want to block a user
1 parent 52c755b commit 9307c9e

File tree

11 files changed

+181
-15
lines changed

11 files changed

+181
-15
lines changed

app/src/main/java/com/infomaniak/mail/ui/MainViewModel.kt

+8-1
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ class MainViewModel @Inject constructor(
119119
val reportPhishingTrigger = SingleLiveEvent<Unit>()
120120
val reportDisplayProblemTrigger = SingleLiveEvent<Unit>()
121121
val canInstallUpdate = MutableLiveData(false)
122+
val messageOfUserToBlock = SingleLiveEvent<Message>()
122123

123124
val autoAdvanceThreadsUids = MutableLiveData<List<String>>()
124125

@@ -1062,8 +1063,14 @@ class MainViewModel @Inject constructor(
10621063
emit(hasOtherExpeditors)
10631064
}
10641065

1066+
fun hasMoreThanOneExpeditors(threadUid: String) = liveData(ioCoroutineContext) {
1067+
val hasMoreThanOneExpeditors =
1068+
(threadController.getThread(threadUid)?.messages?.flatMap { it.from }?.filter { it.isMe() }?.size ?: 0) > 1
1069+
emit(hasMoreThanOneExpeditors)
1070+
}
1071+
10651072
fun getMessagesFromUniqueExpeditors(threadUid: String) = liveData(ioCoroutineContext) {
1066-
val messageToRecipient = threadController.getThread(threadUid)?.messages?.flatMap { message ->
1073+
val messageToRecipient = threadController.getThread(threadUid)?.messages?.distinctBy { it.from }?.flatMap { message ->
10671074
message.from.filterNot { it.isMe() }
10681075
.distinct()
10691076
.map { from -> message to from }

app/src/main/java/com/infomaniak/mail/ui/main/thread/ThreadFragment.kt

+19-4
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import com.infomaniak.mail.MatomoMail.ACTION_REPLY_NAME
4646
import com.infomaniak.mail.MatomoMail.OPEN_ACTION_BOTTOM_SHEET
4747
import com.infomaniak.mail.MatomoMail.OPEN_FROM_DRAFT_NAME
4848
import com.infomaniak.mail.MatomoMail.trackAttachmentActionsEvent
49+
import com.infomaniak.mail.MatomoMail.trackBottomSheetThreadActionsEvent
4950
import com.infomaniak.mail.MatomoMail.trackMessageActionsEvent
5051
import com.infomaniak.mail.MatomoMail.trackNewMessageEvent
5152
import com.infomaniak.mail.MatomoMail.trackThreadActionsEvent
@@ -71,10 +72,7 @@ import com.infomaniak.mail.ui.main.folder.TwoPaneViewModel.NavData
7172
import com.infomaniak.mail.ui.main.thread.SubjectFormatter.SubjectData
7273
import com.infomaniak.mail.ui.main.thread.ThreadAdapter.ContextMenuType
7374
import com.infomaniak.mail.ui.main.thread.ThreadAdapter.ThreadAdapterCallbacks
74-
import com.infomaniak.mail.ui.main.thread.actions.AttachmentActionsBottomSheetDialogArgs
75-
import com.infomaniak.mail.ui.main.thread.actions.MessageActionsBottomSheetDialogArgs
76-
import com.infomaniak.mail.ui.main.thread.actions.ReplyBottomSheetDialogArgs
77-
import com.infomaniak.mail.ui.main.thread.actions.ThreadActionsBottomSheetDialogArgs
75+
import com.infomaniak.mail.ui.main.thread.actions.*
7876
import com.infomaniak.mail.ui.main.thread.calendar.AttendeesBottomSheetDialogArgs
7977
import com.infomaniak.mail.utils.PermissionUtils
8078
import com.infomaniak.mail.utils.UiUtils
@@ -111,6 +109,9 @@ class ThreadFragment : Fragment() {
111109
@Inject
112110
lateinit var phoneContextualMenuAlertDialog: PhoneContextualMenuAlertDialog
113111

112+
@Inject
113+
lateinit var confirmationToBlockUserDialog: ConfirmationToBlockUserDialog
114+
114115
@Inject
115116
lateinit var permissionUtils: PermissionUtils
116117

@@ -155,12 +156,26 @@ class ThreadFragment : Fragment() {
155156
observeAutoAdvance()
156157

157158
observeReportDisplayProblemResult()
159+
160+
observeMessageOfUserToBlock()
158161
}
159162

160163
private fun observeReportDisplayProblemResult() {
161164
mainViewModel.reportDisplayProblemTrigger.observe(viewLifecycleOwner) { descriptionDialog.resetLoadingAndDismiss() }
162165
}
163166

167+
private fun observeMessageOfUserToBlock() = with(confirmationToBlockUserDialog) {
168+
mainViewModel.messageOfUserToBlock.observe(viewLifecycleOwner) {
169+
setPositiveButtonCallback { messageOfUserToBlock ->
170+
messageOfUserToBlock?.let {
171+
trackBottomSheetThreadActionsEvent("blockUser")
172+
mainViewModel.blockUser(messageOfUserToBlock)
173+
}
174+
}
175+
show(it)
176+
}
177+
}
178+
164179
override fun onConfigurationChanged(newConfig: Configuration) {
165180
threadAdapter.reRenderMails()
166181
super.onConfigurationChanged(newConfig)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*
2+
* Infomaniak Mail - Android
3+
* Copyright (C) 2024 Infomaniak Network SA
4+
*
5+
* This program is free software: you can redistribute it and/or modify
6+
* it under the terms of the GNU General Public License as published by
7+
* the Free Software Foundation, either version 3 of the License, or
8+
* (at your option) any later version.
9+
*
10+
* This program is distributed in the hope that it will be useful,
11+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
* GNU General Public License for more details.
14+
*
15+
* You should have received a copy of the GNU General Public License
16+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
17+
*/
18+
package com.infomaniak.mail.ui.main.thread.actions
19+
20+
import android.content.Context
21+
import androidx.appcompat.app.AlertDialog
22+
import com.google.android.material.dialog.MaterialAlertDialogBuilder
23+
import com.infomaniak.lib.core.utils.context
24+
import com.infomaniak.mail.R
25+
import com.infomaniak.mail.data.models.message.Message
26+
import com.infomaniak.mail.databinding.DialogConfirmationToBlockUserBinding
27+
import com.infomaniak.mail.ui.alertDialogs.BaseAlertDialog
28+
import dagger.hilt.android.qualifiers.ActivityContext
29+
import dagger.hilt.android.scopes.ActivityScoped
30+
import javax.inject.Inject
31+
32+
@ActivityScoped
33+
class ConfirmationToBlockUserDialog @Inject constructor(
34+
@ActivityContext private val activityContext: Context,
35+
) : BaseAlertDialog(activityContext) {
36+
37+
private val binding: DialogConfirmationToBlockUserBinding by lazy {
38+
DialogConfirmationToBlockUserBinding.inflate(activity.layoutInflater)
39+
}
40+
41+
private var onPositiveButtonClick: ((Message?) -> Unit)? = null
42+
private var messageOfUserToBlock: Message? = null
43+
44+
override val alertDialog: AlertDialog = with(binding) {
45+
MaterialAlertDialogBuilder(context)
46+
.setView(root)
47+
.setPositiveButton(R.string.buttonConfirm) { _, _ ->
48+
onPositiveButtonClick?.invoke(messageOfUserToBlock)
49+
}
50+
.setNegativeButton(com.infomaniak.lib.core.R.string.buttonCancel, null)
51+
.create()
52+
}
53+
54+
override fun resetCallbacks() {
55+
onPositiveButtonClick = null
56+
}
57+
58+
fun show(message: Message) = with(binding) {
59+
messageOfUserToBlock = message
60+
val recipient = message.from[0]
61+
val title = recipient.name.ifBlank { recipient.email }
62+
blockExpeditorTitle.text = activityContext.getString(R.string.blockExpeditorTitle, title)
63+
blockExpeditorDescription.text = activityContext.getString(R.string.confirmationToBlockAnExpeditorText, recipient.email)
64+
alertDialog.show()
65+
}
66+
67+
fun setPositiveButtonCallback(onPositiveButtonClick: (Message?) -> Unit) {
68+
this.onPositiveButtonClick = onPositiveButtonClick
69+
}
70+
}

app/src/main/java/com/infomaniak/mail/ui/main/thread/actions/JunkBottomSheetDialog.kt

+21-6
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ class JunkBottomSheetDialog : ActionsBottomSheetDialog() {
4343

4444
private var binding: BottomSheetJunkBinding by safeBinding()
4545
private val navigationArgs: JunkBottomSheetDialogArgs by navArgs()
46+
47+
private var messageOfUserToBlock: Message? = null
48+
4649
override val mainViewModel: MainViewModel by activityViewModels()
4750

4851
@Inject
@@ -56,6 +59,7 @@ class JunkBottomSheetDialog : ActionsBottomSheetDialog() {
5659
super.onViewCreated(view, savedInstanceState)
5760

5861
mainViewModel.getMessage(messageUid).observe(viewLifecycleOwner) { message ->
62+
this@JunkBottomSheetDialog.messageOfUserToBlock = message
5963
handleButtons(threadUid, message)
6064
}
6165

@@ -70,24 +74,35 @@ class JunkBottomSheetDialog : ActionsBottomSheetDialog() {
7074
}
7175
}
7276

73-
private fun observeExpeditorsResult(threadUid: String) = with(binding) {
74-
mainViewModel.hasOtherExpeditors(threadUid).observe(viewLifecycleOwner) { hasOtherExpeditors ->
75-
if (hasOtherExpeditors) {
76-
blockSender.setClosingOnClickListener {
77+
private fun observeHasMoreThanOneExpeditor(threadUid: String) {
78+
mainViewModel.hasMoreThanOneExpeditors(threadUid).observe(viewLifecycleOwner) { hasMoreThanOneExpeditor ->
79+
binding.blockSender.setClosingOnClickListener {
80+
if (hasMoreThanOneExpeditor) {
7781
safeNavigate(
7882
resId = R.id.userToBlockBottomSheetDialog,
7983
args = UserToBlockBottomSheetDialogArgs(threadUid).toBundle(),
8084
currentClassName = JunkBottomSheetDialog::class.java.name,
8185
)
86+
} else {
87+
messageOfUserToBlock?.let {
88+
mainViewModel.messageOfUserToBlock.value = messageOfUserToBlock
89+
}
8290
}
91+
}
92+
}
93+
}
94+
95+
private fun observeExpeditorsResult(threadUid: String) {
96+
mainViewModel.hasOtherExpeditors(threadUid).observe(viewLifecycleOwner) { hasOtherExpeditors ->
97+
if (hasOtherExpeditors) {
98+
observeHasMoreThanOneExpeditor(threadUid)
8399
} else {
84-
blockSender.isGone = true
100+
binding.blockSender.isGone = true
85101
}
86102
}
87103
}
88104

89105
private fun handleButtons(threadUid: String, message: Message) = with(binding) {
90-
91106
spam.setClosingOnClickListener {
92107
trackBottomSheetThreadActionsEvent(ACTION_SPAM_NAME, value = message.folder.role == FolderRole.SPAM)
93108
mainViewModel.toggleThreadSpamStatus(threadUid)

app/src/main/java/com/infomaniak/mail/ui/main/thread/actions/UserToBlockBottomSheetDialog.kt

+11-3
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,25 @@
1717
*/
1818
package com.infomaniak.mail.ui.main.thread.actions
1919

20+
import android.content.DialogInterface
2021
import android.os.Bundle
2122
import android.view.LayoutInflater
2223
import android.view.View
2324
import android.view.ViewGroup
2425
import androidx.fragment.app.activityViewModels
2526
import androidx.navigation.fragment.navArgs
2627
import com.infomaniak.lib.core.utils.safeBinding
27-
import com.infomaniak.mail.MatomoMail.trackBottomSheetThreadActionsEvent
28+
import com.infomaniak.mail.data.models.message.Message
2829
import com.infomaniak.mail.databinding.BottomSheetUserToBlockBinding
2930
import com.infomaniak.mail.ui.MainViewModel
3031

3132
class UserToBlockBottomSheetDialog : ActionsBottomSheetDialog() {
3233

3334
private var binding: BottomSheetUserToBlockBinding by safeBinding()
3435
private val navigationArgs: UserToBlockBottomSheetDialogArgs by navArgs()
36+
37+
private var messageOfUserToBlock: Message? = null
38+
3539
override val mainViewModel: MainViewModel by activityViewModels()
3640

3741
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
@@ -43,11 +47,15 @@ class UserToBlockBottomSheetDialog : ActionsBottomSheetDialog() {
4347
mainViewModel.getMessagesFromUniqueExpeditors(threadUid).observe(viewLifecycleOwner) { messages ->
4448
messages?.let {
4549
binding.recipients.adapter = UserToBlockAdapter(messages) { message ->
46-
trackBottomSheetThreadActionsEvent("blockUser")
47-
mainViewModel.blockUser(message)
50+
messageOfUserToBlock = message
4851
dismiss()
4952
}
5053
}
5154
}
5255
}
56+
57+
override fun onDismiss(dialog: DialogInterface) {
58+
super.onDismiss(dialog)
59+
messageOfUserToBlock?.let { mainViewModel.messageOfUserToBlock.value = it }
60+
}
5361
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?xml version="1.0" encoding="utf-8"?><!--
2+
~ Infomaniak Mail - Android
3+
~ Copyright (C) 2024 Infomaniak Network SA
4+
~
5+
~ This program is free software: you can redistribute it and/or modify
6+
~ it under the terms of the GNU General Public License as published by
7+
~ the Free Software Foundation, either version 3 of the License, or
8+
~ (at your option) any later version.
9+
~
10+
~ This program is distributed in the hope that it will be useful,
11+
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
~ GNU General Public License for more details.
14+
~
15+
~ You should have received a copy of the GNU General Public License
16+
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
17+
-->
18+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
19+
xmlns:tools="http://schemas.android.com/tools"
20+
android:layout_width="match_parent"
21+
android:layout_height="match_parent"
22+
android:orientation="vertical"
23+
android:paddingHorizontal="@dimen/marginStandard"
24+
android:paddingVertical="@dimen/marginStandardSmall">
25+
26+
<TextView
27+
android:id="@+id/blockExpeditorTitle"
28+
style="@style/BottomSheetTitle"
29+
android:layout_width="match_parent"
30+
android:layout_height="wrap_content"
31+
android:layout_marginTop="@dimen/marginStandard"
32+
tools:text="Block Jean-Michel" />
33+
34+
<TextView
35+
android:id="@+id/blockExpeditorDescription"
36+
android:layout_width="match_parent"
37+
android:layout_height="wrap_content"
38+
android:layout_marginTop="@dimen/marginStandardMedium"
39+
tools:text="@string/confirmationToBlockAnExpeditorText" />
40+
41+
</LinearLayout>

app/src/main/res/values-de/strings.xml

+2
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@
106106
<string name="attendeesListTitle">Liste der Teilnehmer (%d)</string>
107107
<string name="bccTitle">Bcc:</string>
108108
<string name="blockAnExpeditorTitle">Einen Absender blockieren</string>
109+
<string name="blockExpeditorTitle">Block %s</string>
109110
<plurals name="blockedPasswordTitle">
110111
<item quantity="one">Passwort blockiert</item>
111112
<item quantity="other">Blockierte Passwörter</item>
@@ -176,6 +177,7 @@
176177
<string name="commercialFolder">Werbeaktionen</string>
177178
<string name="confirmLogoutDescription">Sind Sie sicher, dass Sie sich von %s abmelden möchten?</string>
178179
<string name="confirmLogoutTitle">Abmelden</string>
180+
<string name="confirmationToBlockAnExpeditorText">Diese E-Mail und alle zukünftigen Nachrichten von %s werden in den Junk-Mail-Ordner verschoben.</string>
179181
<string name="contactActionAddToContacts">Zu Kontakten hinzufügen</string>
180182
<string name="contactActionCopyEmailAddress">E-Mail Adresse kopieren</string>
181183
<string name="contactActionWriteEmail">Schreiben Sie eine E-Mail</string>

app/src/main/res/values-es/strings.xml

+2
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@
106106
<string name="attendeesListTitle">Lista de asistentes (%d)</string>
107107
<string name="bccTitle">CCO:</string>
108108
<string name="blockAnExpeditorTitle">Bloquear un remitente</string>
109+
<string name="blockExpeditorTitle">Bloquear %s</string>
109110
<plurals name="blockedPasswordTitle">
110111
<item quantity="one">Contraseña bloqueada</item>
111112
<item quantity="other">Contraseñas bloqueadas</item>
@@ -176,6 +177,7 @@
176177
<string name="commercialFolder">Promociones</string>
177178
<string name="confirmLogoutDescription">¿Seguro que quieres desconectarte de %s?</string>
178179
<string name="confirmLogoutTitle">Cerrar sesión</string>
180+
<string name="confirmationToBlockAnExpeditorText">Este correo electrónico y todos los futuros mensajes de %s se moverán a la carpeta de correo no deseado.</string>
179181
<string name="contactActionAddToContacts">Añadir a contactos</string>
180182
<string name="contactActionCopyEmailAddress">Copiar dirección de correo electrónico</string>
181183
<string name="contactActionWriteEmail">Escriba un correo electrónico</string>

app/src/main/res/values-fr/strings.xml

+2
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@
107107
<string name="attendeesListTitle">Liste des participants (%d)</string>
108108
<string name="bccTitle">Cci :</string>
109109
<string name="blockAnExpeditorTitle">Bloquer un expéditeur</string>
110+
<string name="blockExpeditorTitle">Bloquer %s</string>
110111
<plurals name="blockedPasswordTitle">
111112
<item quantity="one">Mot de passe bloqué</item>
112113
<item quantity="other">Mots de passe bloqués</item>
@@ -178,6 +179,7 @@
178179
<string name="commercialFolder">Promotions</string>
179180
<string name="confirmLogoutDescription">Êtes-vous sûr de vouloir vous déconnecter du compte %s ?</string>
180181
<string name="confirmLogoutTitle">Me déconnecter</string>
182+
<string name="confirmationToBlockAnExpeditorText">Cet e-mail et tous les futurs messages de %s seront déplacés dans le dossier Courrier indésirable.</string>
181183
<string name="contactActionAddToContacts">Ajouter aux contacts</string>
182184
<string name="contactActionCopyEmailAddress">Copier l’adresse mail</string>
183185
<string name="contactActionWriteEmail">Écrire un e-mail</string>

app/src/main/res/values-it/strings.xml

+3-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,8 @@
105105
</plurals>
106106
<string name="attendeesListTitle">Elenco dei partecipanti (%d)</string>
107107
<string name="bccTitle">Bcc:</string>
108-
<string name="blockAnExpeditorTitle">Bloccare un mittente</string>
108+
<string name="blockAnExpeditorTitle">Blocca un mittente</string>
109+
<string name="blockExpeditorTitle">Blocca %s</string>
109110
<plurals name="blockedPasswordTitle">
110111
<item quantity="one">Password bloccata</item>
111112
<item quantity="other">Password bloccate</item>
@@ -176,6 +177,7 @@
176177
<string name="commercialFolder">Promozioni</string>
177178
<string name="confirmLogoutDescription">Sei sicuro di volerti disconnettere da %s?</string>
178179
<string name="confirmLogoutTitle">Disconnettersi</string>
180+
<string name="confirmationToBlockAnExpeditorText">Questa e-mail e tutti i futuri messaggi di %s saranno spostati nella cartella della posta indesiderata.</string>
179181
<string name="contactActionAddToContacts">Aggiungi ai contatti</string>
180182
<string name="contactActionCopyEmailAddress">Copia l’indirizzo e-mail</string>
181183
<string name="contactActionWriteEmail">Scrivi un’e-mail</string>

app/src/main/res/values/strings.xml

+2
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@
112112
<string name="attendeesListTitle">List of attendees (%d)</string>
113113
<string name="bccTitle">Bcc:</string>
114114
<string name="blockAnExpeditorTitle">Block a sender</string>
115+
<string name="blockExpeditorTitle">Block %s</string>
115116
<plurals name="blockedPasswordTitle">
116117
<item quantity="one">Blocked password</item>
117118
<item quantity="other">Blocked passwords</item>
@@ -182,6 +183,7 @@
182183
<string name="commercialFolder">Promotions</string>
183184
<string name="confirmLogoutDescription">Are you sure you want to log out from %s?</string>
184185
<string name="confirmLogoutTitle">Log out</string>
186+
<string name="confirmationToBlockAnExpeditorText">This email and all future messages from %s will be moved to the Junk Mail folder.</string>
185187
<string name="contactActionAddToContacts">Add to contacts</string>
186188
<string name="contactActionCopyEmailAddress">Copy email address</string>
187189
<string name="contactActionWriteEmail">Write an email</string>

0 commit comments

Comments
 (0)