Skip to content

Commit acd1034

Browse files
Some cleaning in DefaultFolders & CustomFolders querying in Realm
1 parent 2b003fb commit acd1034

File tree

5 files changed

+42
-48
lines changed

5 files changed

+42
-48
lines changed

app/src/main/java/com/infomaniak/mail/data/cache/mailboxContent/FolderController.kt

+21-20
Original file line numberDiff line numberDiff line change
@@ -45,20 +45,20 @@ class FolderController @Inject constructor(
4545
) {
4646

4747
//region Get data
48-
fun getRootFoldersAsync(): Flow<ResultsChange<Folder>> {
49-
return getFoldersQuery(mailboxContentRealm(), withoutChildren = true).asFlow()
48+
fun getMenuDrawerDefaultFoldersAsync(): Flow<ResultsChange<Folder>> {
49+
return getFoldersQuery(mailboxContentRealm(), withoutType = FoldersType.CUSTOM, withoutChildren = true).asFlow()
5050
}
5151

52-
fun getMenuDrawerDefaultFolders(): Flow<ResultsChange<Folder>> {
53-
return getDefaultFoldersQuery(mailboxContentRealm()).asFlow()
52+
fun getMenuDrawerCustomFoldersAsync(): Flow<ResultsChange<Folder>> {
53+
return getFoldersQuery(mailboxContentRealm(), withoutType = FoldersType.DEFAULT, withoutChildren = true).asFlow()
5454
}
5555

56-
fun getMenuDrawerCustomFolders(): Flow<ResultsChange<Folder>> {
57-
return getCustomFoldersQuery(mailboxContentRealm()).asFlow()
56+
fun getSearchFoldersAsync(): Flow<ResultsChange<Folder>> {
57+
return getFoldersQuery(mailboxContentRealm(), withoutChildren = true).asFlow()
5858
}
5959

6060
fun getMoveFolders(): RealmResults<Folder> {
61-
return getFoldersQuery(mailboxContentRealm(), withoutChildren = true, withoutDrafts = true).find()
61+
return getFoldersQuery(mailboxContentRealm(), withoutType = FoldersType.DRAFT, withoutChildren = true).find()
6262
}
6363

6464
fun getFolder(id: String): Folder? {
@@ -131,6 +131,12 @@ class FolderController @Inject constructor(
131131
}
132132
//endregion
133133

134+
enum class FoldersType {
135+
DEFAULT,
136+
CUSTOM,
137+
DRAFT,
138+
}
139+
134140
companion object {
135141
const val SEARCH_FOLDER_ID = "search_folder_id"
136142
private val isNotSearch = "${Folder::id.name} != '$SEARCH_FOLDER_ID'"
@@ -139,22 +145,17 @@ class FolderController @Inject constructor(
139145
//region Queries
140146
private fun getFoldersQuery(
141147
realm: TypedRealm,
148+
withoutType: FoldersType? = null,
142149
withoutChildren: Boolean = false,
143-
withoutDrafts: Boolean = false,
144150
): RealmQuery<Folder> {
145151
val rootsQuery = if (withoutChildren) " AND $isRootFolder" else ""
146-
val draftsQuery = if (withoutDrafts) " AND ${Folder.rolePropertyName} != '${FolderRole.DRAFT.name}'" else ""
147-
return realm.query<Folder>("$isNotSearch${rootsQuery}${draftsQuery}").sortFolders()
148-
}
149-
150-
private fun getDefaultFoldersQuery(realm: TypedRealm): RealmQuery<Folder> {
151-
val isDefaultRoot = "AND ${Folder.rolePropertyName} != null AND $isRootFolder"
152-
return realm.query<Folder>("$isNotSearch$isDefaultRoot").sortFolders()
153-
}
154-
155-
private fun getCustomFoldersQuery(realm: TypedRealm): RealmQuery<Folder> {
156-
val isCustomRoot = "AND ${Folder.rolePropertyName} == null AND $isRootFolder"
157-
return realm.query<Folder>("$isNotSearch$isCustomRoot").sortFolders()
152+
val typeQuery = when (withoutType) {
153+
FoldersType.DEFAULT -> " AND ${Folder.rolePropertyName} == nil"
154+
FoldersType.CUSTOM -> " AND ${Folder.rolePropertyName} != nil"
155+
FoldersType.DRAFT -> " AND ${Folder.rolePropertyName} != '${FolderRole.DRAFT.name}'"
156+
null -> ""
157+
}
158+
return realm.query<Folder>("$isNotSearch${rootsQuery}${typeQuery}").sortFolders()
158159
}
159160

160161
private fun getFoldersQuery(exceptionsFoldersIds: List<String>, realm: TypedRealm): RealmQuery<Folder> {

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

+5-10
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,6 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
8383
import kotlinx.coroutines.Job
8484
import kotlinx.coroutines.delay
8585
import kotlinx.coroutines.flow.MutableStateFlow
86-
import kotlinx.coroutines.flow.combine
8786
import kotlinx.coroutines.flow.emptyFlow
8887
import kotlinx.coroutines.flow.filterNotNull
8988
import kotlinx.coroutines.flow.flatMapLatest
@@ -158,16 +157,12 @@ class MainViewModel @Inject constructor(
158157
it?.let(mailboxController::getMailbox)
159158
}.asLiveData(ioCoroutineContext)
160159

161-
private val currentDefaultFoldersLive = _currentMailboxObjectId.filterNotNull().flatMapLatest {
162-
folderController.getMenuDrawerDefaultFolders().map { it.list.flattenFolderChildren(dismissHiddenChildren = true) }
163-
}
164-
165-
private val currentCustomFoldersLive = _currentMailboxObjectId.filterNotNull().flatMapLatest {
166-
folderController.getMenuDrawerCustomFolders().map { it.list.flattenFolderChildren(dismissHiddenChildren = true) }
167-
}
160+
val defaultFoldersLive = _currentMailboxObjectId.filterNotNull().flatMapLatest {
161+
folderController.getMenuDrawerDefaultFoldersAsync().map { it.list.flattenFolderChildren(dismissHiddenChildren = true) }
162+
}.asLiveData(ioCoroutineContext)
168163

169-
val currentFoldersLive = currentDefaultFoldersLive.combine(currentCustomFoldersLive) { defaultFolders, customFolders ->
170-
defaultFolders to customFolders
164+
val customFoldersLive = _currentMailboxObjectId.filterNotNull().flatMapLatest {
165+
folderController.getMenuDrawerCustomFoldersAsync().map { it.list.flattenFolderChildren(dismissHiddenChildren = true) }
171166
}.asLiveData(ioCoroutineContext)
172167

173168
val currentQuotasLive = _currentMailboxObjectId.flatMapLatest {

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

+8-10
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ class MenuDrawerAdapter @Inject constructor() : ListAdapter<Any, MenuDrawerViewH
6262

6363
fun formatList(mediatorContainer: MediatorContainer) = buildList {
6464
runCatchingRealm {
65+
6566
val (
6667
mailboxes,
6768
areMailboxesExpanded,
@@ -79,7 +80,7 @@ class MenuDrawerAdapter @Inject constructor() : ListAdapter<Any, MenuDrawerViewH
7980
hasCollapsableDefaultFolder = addDefaultFolders(defaultFolders)
8081

8182
add(ItemType.DIVIDER)
82-
hasCollapsableCustomFolder = addCustomFoldersFrom(customFolders, areCustomFoldersExpanded)
83+
hasCollapsableCustomFolder = addCustomFolders(customFolders, areCustomFoldersExpanded)
8384

8485
add(ItemType.DIVIDER)
8586
addAdvancedActions(areActionsExpanded, permissions)
@@ -88,13 +89,11 @@ class MenuDrawerAdapter @Inject constructor() : ListAdapter<Any, MenuDrawerViewH
8889
}
8990
}
9091

91-
private fun MutableList<Any>.addMailboxes(
92-
mailboxes: List<Mailbox>,
93-
areMailboxesExpanded: Boolean
94-
) {
92+
private fun MutableList<Any>.addMailboxes(mailboxes: List<Mailbox>, areMailboxesExpanded: Boolean) {
9593
val currentMailboxIndex = mailboxes.indexOfFirst { it.mailboxId == AccountUtils.currentMailboxId }
9694
val otherMailboxes = mailboxes.toMutableList()
9795
val currentMailbox = otherMailboxes.removeAt(currentMailboxIndex)
96+
9897
add(MailboxesHeader(currentMailbox, otherMailboxes.isNotEmpty(), areMailboxesExpanded))
9998
if (areMailboxesExpanded) addAll(otherMailboxes)
10099
}
@@ -110,7 +109,7 @@ class MenuDrawerAdapter @Inject constructor() : ListAdapter<Any, MenuDrawerViewH
110109
return atLeastOneFolderIsIndented
111110
}
112111

113-
private fun MutableList<Any>.addCustomFoldersFrom(customFolders: List<Folder>, areCustomFoldersExpanded: Boolean): Boolean {
112+
private fun MutableList<Any>.addCustomFolders(customFolders: List<Folder>, areCustomFoldersExpanded: Boolean): Boolean {
114113
var atLeastOneFolderIsIndented = false
115114

116115
add(ItemType.FOLDERS_HEADER)
@@ -128,11 +127,10 @@ class MenuDrawerAdapter @Inject constructor() : ListAdapter<Any, MenuDrawerViewH
128127
return atLeastOneFolderIsIndented
129128
}
130129

131-
private fun MutableList<Any>.addAdvancedActions(
132-
areActionsExpanded: Boolean,
133-
permissions: MailboxPermissions?
134-
) {
130+
private fun MutableList<Any>.addAdvancedActions(areActionsExpanded: Boolean, permissions: MailboxPermissions?) {
131+
135132
add(ItemType.ACTIONS_HEADER)
133+
136134
if (areActionsExpanded) {
137135
add(SYNC_AUTO_CONFIG_ACTION)
138136
add(IMPORT_MAILS_ACTION)

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

+7-7
Original file line numberDiff line numberDiff line change
@@ -270,23 +270,23 @@ class MenuDrawerFragment : Fragment() {
270270
Utils.waitInitMediator(
271271
mailboxesLive,
272272
menuDrawerViewModel.areMailboxesExpanded,
273-
currentFoldersLive,
273+
defaultFoldersLive,
274+
customFoldersLive,
274275
menuDrawerViewModel.areCustomFoldersExpanded,
275276
menuDrawerViewModel.areActionsExpanded,
276277
currentPermissionsLive,
277278
currentQuotasLive,
278279
constructor = {
279-
val (defaultFolders, customFolders) = it[2] as Pair<List<Folder>, List<Folder>>
280280
@Suppress("UNCHECKED_CAST")
281281
MediatorContainer(
282282
it[0] as List<Mailbox>,
283283
it[1] as Boolean,
284-
defaultFolders,
285-
customFolders,
286-
it[3] as Boolean,
284+
it[2] as List<Folder>,
285+
it[3] as List<Folder>,
287286
it[4] as Boolean,
288-
it[5] as MailboxPermissions?,
289-
it[6] as Quotas?,
287+
it[5] as Boolean,
288+
it[6] as MailboxPermissions?,
289+
it[7] as Quotas?,
290290
)
291291
}
292292
)

app/src/main/java/com/infomaniak/mail/ui/main/search/SearchViewModel.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ class SearchViewModel @Inject constructor(
7979
var currentSearchQuery: String = ""
8080
private set
8181

82-
val foldersLive = folderController.getRootFoldersAsync()
82+
val foldersLive = folderController.getSearchFoldersAsync()
8383
.map { it.list.flattenFolderChildren() }
8484
.asLiveData(ioCoroutineContext)
8585

0 commit comments

Comments
 (0)