@@ -36,7 +36,6 @@ import com.infomaniak.mail.data.models.thread.Thread
36
36
import com.infomaniak.mail.di.IoDispatcher
37
37
import com.infomaniak.mail.ui.main.thread.ThreadAdapter.SuperCollapsedBlock
38
38
import com.infomaniak.mail.utils.*
39
- import com.infomaniak.mail.utils.MessageBodyUtils.SplitBody
40
39
import com.infomaniak.mail.utils.extensions.MergedContactDictionary
41
40
import com.infomaniak.mail.utils.extensions.context
42
41
import com.infomaniak.mail.utils.extensions.getUids
@@ -74,31 +73,15 @@ class ThreadViewModel @Inject constructor(
74
73
private var fetchMessagesJob: Job ? = null
75
74
private var fetchCalendarEventJob: Job ? = null
76
75
77
- val quickActionBarClicks = SingleLiveEvent <QuickActionBarResult >()
78
-
79
- // region Calendar Events
80
- private val treatedMessagesForCalendarEvent = mutableSetOf<String >()
81
- val isCalendarEventExpandedMap = mutableMapOf<String , Boolean >()
82
- // endregion
83
-
84
- var deletedMessagesUids = mutableSetOf<String >()
85
- val failedMessagesUids = SingleLiveEvent <List <String >>()
86
-
87
76
val threadLive = MutableLiveData <Thread ?>()
88
77
val messagesLive = MutableLiveData <Pair <ThreadAdapterItems , MessagesWithoutHeavyData >>()
89
78
90
- private val cachedSplitBodies = mutableMapOf<String , SplitBody >()
91
-
92
- var shouldMarkThreadAsSeen: Boolean = false
79
+ val quickActionBarClicks = SingleLiveEvent <QuickActionBarResult >()
93
80
94
- private var superCollapsedBlock: SuperCollapsedBlock ? = null
81
+ val failedMessagesUids = SingleLiveEvent <List <String >>()
82
+ var deletedMessagesUids = mutableSetOf<String >()
95
83
96
- // region Restore Thread state after going to MoveFragment or somewhere else, and then coming back to ThreadFragment.
97
- var isExpandedMap: MutableMap <String , Boolean > = mutableMapOf ()
98
- var isThemeTheSameMap: MutableMap <String , Boolean > = mutableMapOf ()
99
- var hasSuperCollapsedBlockBeenClicked: Boolean = false
100
- var verticalScroll: Int? = null
101
- // endregion
84
+ val threadState = ThreadState ()
102
85
103
86
private val mailbox by lazy { mailboxController.getMailbox(AccountUtils .currentUserId, AccountUtils .currentMailboxId)!! }
104
87
@@ -107,14 +90,6 @@ class ThreadViewModel @Inject constructor(
107
90
AccountUtils .currentMailboxId,
108
91
).map { it.obj }.asLiveData(ioCoroutineContext)
109
92
110
- fun resetMessagesRelatedCache () {
111
- treatedMessagesForCalendarEvent.clear()
112
- isCalendarEventExpandedMap.clear()
113
- cachedSplitBodies.clear()
114
- shouldMarkThreadAsSeen = false
115
- superCollapsedBlock = null
116
- }
117
-
118
93
fun reassignThreadLive (threadUid : String ) {
119
94
threadLiveJob?.cancel()
120
95
threadLiveJob = viewModelScope.launch(ioCoroutineContext) {
@@ -144,7 +119,7 @@ class ThreadViewModel @Inject constructor(
144
119
private suspend fun mapRealmMessagesResult (
145
120
messages : RealmResults <Message >,
146
121
threadUid : String ,
147
- ): Pair <ThreadAdapterItems , MessagesWithoutHeavyData > {
122
+ ): Pair <ThreadAdapterItems , MessagesWithoutHeavyData > = with (threadState) {
148
123
149
124
superCollapsedBlock = superCollapsedBlock ? : SuperCollapsedBlock ()
150
125
@@ -212,7 +187,7 @@ class ThreadViewModel @Inject constructor(
212
187
* - If there's any unread Message in between, it will be displayed (hence, all following Messages will be displayed too).
213
188
* After all these Messages are displayed, if there's at least 2 remaining Messages, they're gonna be collapsed in the Block.
214
189
*/
215
- private fun shouldBlockBeDisplayed (messagesCount : Int , firstIndexAfterBlock : Int ): Boolean {
190
+ private fun shouldBlockBeDisplayed (messagesCount : Int , firstIndexAfterBlock : Int ): Boolean = with (threadState) {
216
191
return superCollapsedBlock?.shouldBeDisplayed == true && // If the Block was hidden for any reason, we mustn't ever display it again
217
192
! hasSuperCollapsedBlockBeenClicked && // Block hasn't been expanded by the user
218
193
messagesCount >= SUPER_COLLAPSED_BLOCK_MINIMUM_MESSAGES_LIMIT && // At least 5 Messages in the Thread
@@ -223,7 +198,7 @@ class ThreadViewModel @Inject constructor(
223
198
private suspend fun formatLists (
224
199
messages : List <Message >,
225
200
computeBehavior : (Int , String ) -> MessageBehavior ,
226
- ): Pair <MutableList <Any >, MutableList<Message>> {
201
+ ): Pair <MutableList <Any >, MutableList<Message>> = with (threadState) {
227
202
228
203
val items = mutableListOf<Any >()
229
204
val messagesToFetch = mutableListOf<Message >()
@@ -237,12 +212,8 @@ class ThreadViewModel @Inject constructor(
237
212
238
213
messages.forEachIndexed { index, message ->
239
214
when (computeBehavior(index, message.uid)) {
240
- MessageBehavior .DISPLAYED -> {
241
- addMessage(message)
242
- }
243
- MessageBehavior .COLLAPSED -> {
244
- superCollapsedBlock!! .messagesUids.add(message.uid)
245
- }
215
+ MessageBehavior .DISPLAYED -> addMessage(message)
216
+ MessageBehavior .COLLAPSED -> superCollapsedBlock!! .messagesUids.add(message.uid)
246
217
MessageBehavior .FIRST_AFTER_BLOCK -> {
247
218
items + = superCollapsedBlock!!
248
219
addMessage(message.apply { shouldHideDivider = true })
@@ -258,9 +229,9 @@ class ThreadViewModel @Inject constructor(
258
229
259
230
message.apply {
260
231
body?.let {
261
- val isNotAlreadySplit = ! cachedSplitBodies.contains(message.uid)
262
- if (isNotAlreadySplit) cachedSplitBodies[message.uid] = MessageBodyUtils .splitContentAndQuote(it)
263
- splitBody = cachedSplitBodies[message.uid]
232
+ val isNotAlreadySplit = ! threadState. cachedSplitBodies.contains(message.uid)
233
+ if (isNotAlreadySplit) threadState. cachedSplitBodies[message.uid] = MessageBodyUtils .splitContentAndQuote(it)
234
+ splitBody = threadState. cachedSplitBodies[message.uid]
264
235
}
265
236
}
266
237
@@ -277,14 +248,14 @@ class ThreadViewModel @Inject constructor(
277
248
sendMatomoAndSentryAboutThreadMessagesCount(thread)
278
249
279
250
// These 2 will always be empty or not all together at the same time.
280
- if (isExpandedMap.isEmpty() || isThemeTheSameMap.isEmpty()) {
251
+ if (threadState. isExpandedMap.isEmpty() || threadState. isThemeTheSameMap.isEmpty()) {
281
252
thread.messages.forEachIndexed { index, message ->
282
- isExpandedMap[message.uid] = message.shouldBeExpanded(index, thread.messages.lastIndex)
283
- isThemeTheSameMap[message.uid] = true
253
+ threadState. isExpandedMap[message.uid] = message.shouldBeExpanded(index, thread.messages.lastIndex)
254
+ threadState. isThemeTheSameMap[message.uid] = true
284
255
}
285
256
}
286
257
287
- shouldMarkThreadAsSeen = thread.unseenMessagesCount > 0
258
+ threadState. shouldMarkThreadAsSeen = thread.unseenMessagesCount > 0
288
259
289
260
emit(thread)
290
261
}
@@ -382,7 +353,7 @@ class ThreadViewModel @Inject constructor(
382
353
if (! message.isFullyDownloaded()) return // Only treat message that have their Attachments downloaded
383
354
384
355
if (! forceFetch) {
385
- val alreadyTreated = ! treatedMessagesForCalendarEvent.add(message.uid)
356
+ val alreadyTreated = ! threadState. treatedMessagesForCalendarEvent.add(message.uid)
386
357
if (alreadyTreated) return
387
358
}
388
359
0 commit comments