Skip to content

Commit 9b6dfa8

Browse files
Move MenuDrawer list computation to background thread
1 parent 72dc571 commit 9b6dfa8

File tree

3 files changed

+32
-34
lines changed

3 files changed

+32
-34
lines changed

app/src/main/java/com/infomaniak/mail/ui/main/menuDrawer/MenuDrawerAdapter.kt

+14-14
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import com.infomaniak.mail.ui.main.menuDrawer.items.InvalidMailboxViewHolder
5151
import com.infomaniak.mail.ui.main.menuDrawer.items.MailboxViewHolder
5252
import com.infomaniak.mail.ui.main.menuDrawer.items.MailboxesHeaderViewHolder
5353
import com.infomaniak.mail.ui.main.menuDrawer.items.MailboxesHeaderViewHolder.MailboxesHeader
54+
import com.infomaniak.mail.utils.AccountUtils
5455
import com.infomaniak.mail.utils.Utils.runCatchingRealm
5556
import javax.inject.Inject
5657

@@ -67,25 +68,26 @@ class MenuDrawerAdapter @Inject constructor() : ListAdapter<Any, MenuDrawerViewH
6768
return this
6869
}
6970

70-
fun setItems(mediatorContainer: MediatorContainer) = runCatchingRealm {
71+
fun formatList(mediatorContainer: MediatorContainer) = mutableListOf<Any>().apply {
72+
runCatchingRealm {
7173

72-
val (
73-
currentMailbox,
74-
areMailboxesExpanded,
75-
otherMailboxes,
76-
allFolders,
77-
areCustomFoldersExpanded,
78-
permissions,
79-
quotas,
80-
) = mediatorContainer
81-
82-
val items = mutableListOf<Any>().apply {
74+
val (
75+
mailboxes,
76+
areMailboxesExpanded,
77+
allFolders,
78+
areCustomFoldersExpanded,
79+
permissions,
80+
quotas,
81+
) = mediatorContainer
8382

8483
var count = 0
8584
var temporaryHasCollapsableDefaultFolder = false
8685
var temporaryHasCollapsableCustomFolder = false
8786

8887
// Mailboxes
88+
val currentMailboxIndex = mailboxes.indexOfFirst { it.mailboxId == AccountUtils.currentMailboxId }
89+
val otherMailboxes = mailboxes.toMutableList()
90+
val currentMailbox = otherMailboxes.removeAt(currentMailboxIndex)
8991
add(MailboxesHeader(currentMailbox, otherMailboxes.isNotEmpty(), areMailboxesExpanded))
9092
if (areMailboxesExpanded) addAll(otherMailboxes)
9193

@@ -120,8 +122,6 @@ class MenuDrawerAdapter @Inject constructor() : ListAdapter<Any, MenuDrawerViewH
120122
add(ItemType.DIVIDER)
121123
add(MenuDrawerFooter(permissions, quotas))
122124
}
123-
124-
submitList(items)
125125
}
126126

127127
fun notifySelectedFolder(currentFolder: Folder) {

app/src/main/java/com/infomaniak/mail/ui/main/menuDrawer/MenuDrawerFragment.kt

+18-11
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ import androidx.fragment.app.Fragment
2727
import androidx.fragment.app.activityViewModels
2828
import androidx.fragment.app.viewModels
2929
import androidx.lifecycle.Lifecycle.State
30+
import androidx.lifecycle.asFlow
31+
import androidx.lifecycle.asLiveData
3032
import androidx.lifecycle.lifecycleScope
3133
import androidx.lifecycle.repeatOnLifecycle
3234
import com.infomaniak.lib.bugtracker.BugTrackerActivity
@@ -59,6 +61,9 @@ import com.infomaniak.mail.utils.extensions.bindAlertToViewLifecycle
5961
import com.infomaniak.mail.utils.extensions.launchSyncAutoConfigActivityForResult
6062
import com.infomaniak.mail.utils.extensions.observeNotNull
6163
import dagger.hilt.android.AndroidEntryPoint
64+
import kotlinx.coroutines.Dispatchers
65+
import kotlinx.coroutines.flow.flowOn
66+
import kotlinx.coroutines.flow.map
6267
import kotlinx.coroutines.launch
6368
import javax.inject.Inject
6469

@@ -249,26 +254,29 @@ class MenuDrawerFragment : Fragment() {
249254
private fun observeMenuDrawerData() = with(mainViewModel) {
250255

251256
Utils.waitInitMediator(
252-
currentMailbox,
257+
mailboxesLive,
253258
menuDrawerViewModel.areMailboxesExpanded,
254-
menuDrawerViewModel.otherMailboxesLive,
255259
currentFoldersLive,
256260
menuDrawerViewModel.areCustomFoldersExpanded,
257261
currentPermissionsLive,
258262
currentQuotasLive,
259263
constructor = {
260264
@Suppress("UNCHECKED_CAST")
261265
MediatorContainer(
262-
it[0] as Mailbox?,
266+
it[0] as List<Mailbox>,
263267
it[1] as Boolean,
264-
it[2] as List<Mailbox>,
265-
it[3] as List<Folder>,
266-
it[4] as Boolean,
267-
it[5] as MailboxPermissions?,
268-
it[6] as Quotas?,
268+
it[2] as List<Folder>,
269+
it[3] as Boolean,
270+
it[4] as MailboxPermissions?,
271+
it[5] as Quotas?,
269272
)
270273
}
271-
).observe(viewLifecycleOwner, menuDrawerAdapter::setItems)
274+
)
275+
.asFlow()
276+
.map(menuDrawerAdapter::formatList)
277+
.flowOn(Dispatchers.IO)
278+
.asLiveData()
279+
.observe(viewLifecycleOwner, menuDrawerAdapter::submitList)
272280
}
273281

274282
private fun observeCurrentFolder() {
@@ -297,9 +305,8 @@ class MenuDrawerFragment : Fragment() {
297305
}
298306

299307
data class MediatorContainer(
300-
val currentMailbox: Mailbox?,
308+
val mailboxes: List<Mailbox>,
301309
val areMailboxesExpanded: Boolean,
302-
val otherMailboxes: List<Mailbox>,
303310
val allFolders: List<Folder>,
304311
val areCustomFoldersExpanded: Boolean,
305312
val permissions: MailboxPermissions?,

app/src/main/java/com/infomaniak/mail/ui/main/menuDrawer/MenuDrawerViewModel.kt

-9
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,10 @@ package com.infomaniak.mail.ui.main.menuDrawer
1919

2020
import androidx.lifecycle.MutableLiveData
2121
import androidx.lifecycle.ViewModel
22-
import androidx.lifecycle.asLiveData
2322
import androidx.lifecycle.viewModelScope
2423
import com.infomaniak.mail.data.cache.RealmDatabase
2524
import com.infomaniak.mail.data.cache.mailboxContent.FolderController
26-
import com.infomaniak.mail.data.cache.mailboxInfo.MailboxController
2725
import com.infomaniak.mail.di.IoDispatcher
28-
import com.infomaniak.mail.utils.AccountUtils
2926
import com.infomaniak.mail.utils.coroutineContext
3027
import dagger.hilt.android.lifecycle.HiltViewModel
3128
import kotlinx.coroutines.CoroutineDispatcher
@@ -35,17 +32,11 @@ import javax.inject.Inject
3532
@HiltViewModel
3633
class MenuDrawerViewModel @Inject constructor(
3734
private val mailboxContentRealm: RealmDatabase.MailboxContent,
38-
mailboxController: MailboxController,
3935
@IoDispatcher private val ioDispatcher: CoroutineDispatcher,
4036
) : ViewModel() {
4137

4238
private val ioCoroutineContext = viewModelScope.coroutineContext(ioDispatcher)
4339

44-
val otherMailboxesLive = mailboxController.getMailboxesAsync(
45-
userId = AccountUtils.currentUserId,
46-
exceptionMailboxIds = listOf(AccountUtils.currentMailboxId),
47-
).asLiveData(ioCoroutineContext)
48-
4940
val areMailboxesExpanded = MutableLiveData(false)
5041
val areCustomFoldersExpanded = MutableLiveData(true)
5142

0 commit comments

Comments
 (0)