Skip to content

Commit b4633fd

Browse files
tevincentKevinBoulongne
authored andcommitted
Add Dialog to confirm we want to block a user
1 parent a389115 commit b4633fd

File tree

11 files changed

+197
-15
lines changed

11 files changed

+197
-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

+20-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
@@ -61,6 +62,7 @@ import com.infomaniak.mail.data.models.SwissTransferFile
6162
import com.infomaniak.mail.data.models.draft.Draft.DraftMode
6263
import com.infomaniak.mail.data.models.message.Message
6364
import com.infomaniak.mail.data.models.thread.Thread
65+
import com.infomaniak.mail.databinding.DialogConfirmationToBlockUserBinding
6466
import com.infomaniak.mail.databinding.FragmentThreadBinding
6567
import com.infomaniak.mail.ui.MainViewModel
6668
import com.infomaniak.mail.ui.alertDialogs.*
@@ -71,10 +73,7 @@ import com.infomaniak.mail.ui.main.folder.TwoPaneViewModel.NavData
7173
import com.infomaniak.mail.ui.main.thread.SubjectFormatter.SubjectData
7274
import com.infomaniak.mail.ui.main.thread.ThreadAdapter.ContextMenuType
7375
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
76+
import com.infomaniak.mail.ui.main.thread.actions.*
7877
import com.infomaniak.mail.ui.main.thread.calendar.AttendeesBottomSheetDialogArgs
7978
import com.infomaniak.mail.utils.PermissionUtils
8079
import com.infomaniak.mail.utils.UiUtils
@@ -111,6 +110,9 @@ class ThreadFragment : Fragment() {
111110
@Inject
112111
lateinit var phoneContextualMenuAlertDialog: PhoneContextualMenuAlertDialog
113112

113+
@Inject
114+
lateinit var confirmationToBlockUserDialog: ConfirmationToBlockUserDialog
115+
114116
@Inject
115117
lateinit var permissionUtils: PermissionUtils
116118

@@ -155,12 +157,26 @@ class ThreadFragment : Fragment() {
155157
observeAutoAdvance()
156158

157159
observeReportDisplayProblemResult()
160+
161+
observeMessageOfUserToBlock()
158162
}
159163

160164
private fun observeReportDisplayProblemResult() {
161165
mainViewModel.reportDisplayProblemTrigger.observe(viewLifecycleOwner) { descriptionDialog.resetLoadingAndDismiss() }
162166
}
163167

168+
private fun observeMessageOfUserToBlock() = with(confirmationToBlockUserDialog) {
169+
mainViewModel.messageOfUserToBlock.observe(viewLifecycleOwner) {
170+
setCallback { messageOfUserToBlock ->
171+
messageOfUserToBlock?.let {
172+
trackBottomSheetThreadActionsEvent("blockUser")
173+
mainViewModel.blockUser(messageOfUserToBlock)
174+
}
175+
}
176+
show(it)
177+
}
178+
}
179+
164180
override fun onConfigurationChanged(newConfig: Configuration) {
165181
threadAdapter.reRenderMails()
166182
super.onConfigurationChanged(newConfig)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
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 android.content.DialogInterface
22+
import android.content.DialogInterface.OnClickListener
23+
import android.os.Bundle
24+
import android.view.LayoutInflater
25+
import android.view.View
26+
import android.view.ViewGroup
27+
import androidx.appcompat.app.AlertDialog
28+
import androidx.core.widget.doOnTextChanged
29+
import androidx.fragment.app.activityViewModels
30+
import androidx.navigation.fragment.navArgs
31+
import com.google.android.material.dialog.MaterialAlertDialogBuilder
32+
import com.infomaniak.lib.core.utils.context
33+
import com.infomaniak.lib.core.utils.safeBinding
34+
import com.infomaniak.lib.core.utils.showKeyboard
35+
import com.infomaniak.mail.MatomoMail.trackBottomSheetThreadActionsEvent
36+
import com.infomaniak.mail.R
37+
import com.infomaniak.mail.data.models.message.Message
38+
import com.infomaniak.mail.databinding.BottomSheetUserToBlockBinding
39+
import com.infomaniak.mail.databinding.DialogConfirmationToBlockUserBinding
40+
import com.infomaniak.mail.databinding.DialogInsertLinkBinding
41+
import com.infomaniak.mail.ui.MainViewModel
42+
import com.infomaniak.mail.ui.alertDialogs.BaseAlertDialog
43+
import dagger.hilt.android.qualifiers.ActivityContext
44+
import dagger.hilt.android.scopes.ActivityScoped
45+
import javax.inject.Inject
46+
47+
@ActivityScoped
48+
class ConfirmationToBlockUserDialog @Inject constructor(
49+
@ActivityContext private val activityContext: Context,
50+
) : BaseAlertDialog(activityContext) {
51+
52+
private val binding: DialogConfirmationToBlockUserBinding by lazy {
53+
DialogConfirmationToBlockUserBinding.inflate(activity.layoutInflater)
54+
}
55+
56+
private var onPositiveButtonClick: ((Message?) -> Unit)? = null
57+
private var messageOfUserToBlock: Message? = null
58+
59+
override val alertDialog: AlertDialog = with(binding) {
60+
MaterialAlertDialogBuilder(context)
61+
.setView(root)
62+
.setPositiveButton(R.string.buttonConfirm) { dialog, which ->
63+
onPositiveButtonClick?.invoke(messageOfUserToBlock)
64+
}
65+
.setNegativeButton(com.infomaniak.lib.core.R.string.buttonCancel, null)
66+
.create()
67+
}
68+
69+
override fun resetCallbacks() {
70+
71+
}
72+
73+
fun show(message: Message) = with(binding) {
74+
messageOfUserToBlock = message
75+
val recipient = message.from[0]
76+
blockExpeditorTitle.text = activityContext.getString(R.string.blockExpeditorTitle, recipient.name)
77+
blockExpeditorDescription.text = activityContext.getString(R.string.confirmationToBlockAnExpeditorText, recipient.email)
78+
alertDialog.show()
79+
}
80+
81+
fun setCallback(onPositiveButtonClick: (Message?) -> Unit) {
82+
this.onPositiveButtonClick = onPositiveButtonClick
83+
}
84+
}

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

+22-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,36 @@ 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+
trackBottomSheetThreadActionsEvent("blockUser")
89+
mainViewModel.blockUser(it)
90+
}
8291
}
92+
}
93+
}
94+
}
95+
96+
private fun observeExpeditorsResult(threadUid: String) {
97+
mainViewModel.hasOtherExpeditors(threadUid).observe(viewLifecycleOwner) { hasOtherExpeditors ->
98+
if (hasOtherExpeditors) {
99+
observeHasMoreThanOneExpeditor(threadUid)
83100
} else {
84-
blockSender.isGone = true
101+
binding.blockSender.isGone = true
85102
}
86103
}
87104
}
88105

89106
private fun handleButtons(threadUid: String, message: Message) = with(binding) {
90-
91107
spam.setClosingOnClickListener {
92108
trackBottomSheetThreadActionsEvent(ACTION_SPAM_NAME, value = message.folder.role == FolderRole.SPAM)
93109
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>

0 commit comments

Comments
 (0)