Skip to content

Commit 68dc18d

Browse files
ClemRivierewmontwe
authored andcommitted
chore: comments and code enhancements on DisplayFolders to TreeFolder conversion
1 parent 5a843cc commit 68dc18d

5 files changed

Lines changed: 91 additions & 82 deletions

File tree

feature/navigation/drawer/dropdown/src/debug/kotlin/net/thunderbird/feature/navigation/drawer/dropdown/ui/folder/FolderListPreview.kt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,10 @@ internal fun FolderListPreviewSelected() {
4343
internal fun FolderListWithUnifiedFolderPreview() {
4444
PreviewWithTheme {
4545
FolderList(
46-
rootFolder = TreeFolder.createFromFolders(
47-
persistentListOf(
48-
UNIFIED_FOLDER,
49-
DISPLAY_FOLDER,
50-
),
51-
),
46+
rootFolder = TreeFolder.createFromFolders(persistentListOf(
47+
UNIFIED_FOLDER,
48+
DISPLAY_FOLDER,
49+
)),
5250
selectedFolder = DISPLAY_FOLDER,
5351
onFolderClick = {},
5452
showStarredCount = false,

feature/navigation/drawer/dropdown/src/main/kotlin/net/thunderbird/feature/navigation/drawer/dropdown/domain/entity/TreeFolder.kt

Lines changed: 58 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -3,67 +3,76 @@ package net.thunderbird.feature.navigation.drawer.dropdown.domain.entity
33
import app.k9mail.core.mail.folder.api.Folder
44
import app.k9mail.core.mail.folder.api.FolderType
55

6-
internal data class TreeFolder(
7-
var value: DisplayFolder? = null,
6+
internal class TreeFolder(
7+
var displayFolder: DisplayFolder? = null,
88
) {
99
companion object {
1010
fun createFromFolders(folders: List<DisplayFolder>, maxDepth: Int = 3): TreeFolder {
11-
// Converting folders to TreeFolder
11+
// Preparing root
1212
val rootFolder = TreeFolder()
13-
var currentTree = rootFolder
1413

1514
for (displayFolder in folders) {
15+
// Managing exceptions
1616
if (displayFolder is DisplayUnifiedFolder) {
17-
currentTree.children.add(TreeFolder(displayFolder))
17+
rootFolder.children.add(TreeFolder(displayFolder))
1818
}
1919
if (displayFolder !is DisplayAccountFolder) continue
20-
val splittedFolderName = displayFolder.folder.name.split("/", limit = maxDepth + 1)
21-
var subFolderEntireName = ""
22-
for (subFolderName in splittedFolderName) {
23-
subFolderEntireName += subFolderName
24-
var foundInChildren = false
25-
for (children in currentTree.children) {
26-
var childDisplayFolder = children.value
27-
if (childDisplayFolder !is DisplayAccountFolder) continue
28-
if (childDisplayFolder.folder.name == subFolderEntireName) {
29-
currentTree = children
30-
foundInChildren = true
31-
break
32-
}
20+
21+
// Inserting folder in tree
22+
insertFolderInCurrentTree(rootFolder, displayFolder, maxDepth)
23+
}
24+
25+
return rootFolder
26+
}
27+
28+
private fun insertFolderInCurrentTree(
29+
rootTree: TreeFolder,
30+
displayFolder: DisplayAccountFolder,
31+
maxDepth: Int,
32+
) {
33+
val splittedFolderName = displayFolder.folder.name.split("/", limit = maxDepth + 1)
34+
var currentWorkingPath = ""
35+
var currentTree = rootTree
36+
37+
for (subFolderName in splittedFolderName) {
38+
currentWorkingPath += subFolderName
39+
40+
// finding subFolderEntireName (current working path) into currentTree children
41+
val foundChild = currentTree.children.find { child ->
42+
val childDisplayFolder = child.displayFolder
43+
childDisplayFolder is DisplayAccountFolder && childDisplayFolder.folder.name == currentWorkingPath
44+
}
45+
46+
if (foundChild != null) {
47+
// if found, association the value to manage fake created subFolders
48+
currentTree = foundChild
49+
if (currentWorkingPath == displayFolder.folder.name) {
50+
currentTree.displayFolder = displayFolder
3351
}
34-
if (!foundInChildren) {
35-
var newChildren = TreeFolder()
36-
if (subFolderEntireName == displayFolder.folder.name) {
37-
newChildren = TreeFolder(displayFolder)
38-
} else {
39-
newChildren = TreeFolder(
40-
DisplayAccountFolder(
41-
displayFolder.accountId,
42-
Folder(
43-
0,
44-
subFolderEntireName,
45-
FolderType.REGULAR,
46-
displayFolder.folder.isLocalOnly,
47-
),
48-
displayFolder.isInTopGroup,
49-
0,
50-
0,
51-
),
52-
)
53-
}
54-
currentTree.children.add(newChildren)
55-
currentTree = newChildren
52+
} else {
53+
// if not found in children, creating a new one
54+
var newChildren = TreeFolder()
55+
if (currentWorkingPath == displayFolder.folder.name) {
56+
// if it is the final subfolder, adding displayFolder in it
57+
newChildren = TreeFolder(displayFolder)
5658
} else {
57-
if (subFolderEntireName == displayFolder.folder.name) {
58-
currentTree.value = displayFolder
59-
}
59+
// if just an intermediate, adding a fake subFolder
60+
newChildren = TreeFolder(
61+
DisplayAccountFolder(
62+
displayFolder.accountId,
63+
Folder(0, currentWorkingPath, FolderType.REGULAR, displayFolder.folder.isLocalOnly),
64+
displayFolder.isInTopGroup,
65+
0,
66+
0,
67+
),
68+
)
6069
}
61-
subFolderEntireName += "/"
70+
currentTree.children.add(newChildren)
71+
currentTree = newChildren
6272
}
63-
currentTree = rootFolder
64-
}
6573

66-
return rootFolder
74+
currentWorkingPath += "/"
75+
}
6776
}
6877
}
6978

@@ -74,14 +83,14 @@ internal data class TreeFolder(
7483
for (child in children) {
7584
allUnreadMessageCount += child.getAllUnreadMessageCount()
7685
}
77-
return allUnreadMessageCount + (value?.unreadMessageCount ?: 0)
86+
return allUnreadMessageCount + (displayFolder?.unreadMessageCount ?: 0)
7887
}
7988

8089
fun getAllStarredMessageCount(): Int {
8190
var allStarredMessageCount = 0
8291
for (child in children) {
8392
allStarredMessageCount += child.getAllStarredMessageCount()
8493
}
85-
return allStarredMessageCount + (value?.starredMessageCount ?: 0)
94+
return allStarredMessageCount + (displayFolder?.starredMessageCount ?: 0)
8695
}
8796
}

feature/navigation/drawer/dropdown/src/main/kotlin/net/thunderbird/feature/navigation/drawer/dropdown/domain/usecase/GetTreeFolders.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import net.thunderbird.feature.navigation.drawer.dropdown.domain.DomainContract.
44
import net.thunderbird.feature.navigation.drawer.dropdown.domain.entity.DisplayFolder
55
import net.thunderbird.feature.navigation.drawer.dropdown.domain.entity.TreeFolder
66

7-
internal class GetTreeFolders() : UseCase.GetTreeFolders {
7+
internal class GetTreeFolders : UseCase.GetTreeFolders {
88
override fun invoke(folders: List<DisplayFolder>, maxDepth: Int): TreeFolder {
99
return TreeFolder.createFromFolders(folders, maxDepth)
1010
}

feature/navigation/drawer/dropdown/src/main/kotlin/net/thunderbird/feature/navigation/drawer/dropdown/ui/folder/FolderList.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ internal fun FolderList(
3838
) {
3939
items(
4040
items = rootFolder.children,
41-
key = { it.value?.id ?: '0' },
41+
key = { it.displayFolder?.id ?: '0' },
4242
) { folder ->
43-
val currentDisplayFolder = folder.value
43+
val currentDisplayFolder = folder.displayFolder
4444
if (currentDisplayFolder is DisplayAccountFolder) {
4545
FolderListItem(
4646
displayFolder = currentDisplayFolder,

feature/navigation/drawer/dropdown/src/main/kotlin/net/thunderbird/feature/navigation/drawer/dropdown/ui/folder/FolderListItem.kt

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ internal fun FolderListItem(
3333
modifier: Modifier = Modifier,
3434
treeFolder: TreeFolder? = null,
3535
parentPrefix: String? = "",
36+
indentationLevel: Int = 1,
3637
) {
3738
var isExpanded = remember { mutableStateOf(false) }
3839

@@ -44,43 +45,44 @@ internal fun FolderListItem(
4445
starredCount = treeFolder.getAllStarredMessageCount()
4546
}
4647

47-
NavigationDrawerItem(
48-
label = mapFolderName(displayFolder, folderNameFormatter, parentPrefix),
49-
selected = selected,
50-
onClick = { onClick(displayFolder) },
51-
modifier = modifier,
52-
icon = {
53-
Icon(
54-
imageVector = mapFolderIcon(displayFolder),
55-
)
56-
},
57-
badge = {
58-
FolderListItemBadge(
59-
unreadCount = unreadCount,
60-
starredCount = starredCount,
61-
showStarredCount = showStarredCount,
62-
expandableState = if (treeFolder !== null && treeFolder.children.isNotEmpty()) isExpanded else null,
63-
)
64-
},
65-
)
66-
67-
// Managing children
6848
Column(modifier = Modifier.fillMaxWidth().animateContentSize()) {
49+
NavigationDrawerItem(
50+
label = mapFolderName(displayFolder, folderNameFormatter, parentPrefix),
51+
selected = selected,
52+
onClick = { onClick(displayFolder) },
53+
modifier = modifier,
54+
icon = {
55+
Icon(
56+
imageVector = mapFolderIcon(displayFolder),
57+
)
58+
},
59+
badge = {
60+
FolderListItemBadge(
61+
unreadCount = unreadCount,
62+
starredCount = starredCount,
63+
showStarredCount = showStarredCount,
64+
expandableState = if (treeFolder !== null && treeFolder.children.isNotEmpty()) isExpanded else null,
65+
)
66+
},
67+
)
68+
69+
// Managing children
6970
if (!isExpanded.value) return
7071
if (treeFolder === null) return
7172
for (child in treeFolder.children) {
72-
var displayParent = treeFolder.value
73-
var displayChild = child.value
73+
var displayParent = treeFolder.displayFolder
74+
var displayChild = child.displayFolder
7475
if (displayChild === null) continue
7576
FolderListItem(
7677
displayFolder = displayChild,
7778
selected = false,
7879
showStarredCount = showStarredCount,
7980
onClick = { onClick(displayChild) },
8081
folderNameFormatter = folderNameFormatter,
81-
modifier = modifier.then(Modifier.padding(start = MainTheme.spacings.triple)),
82+
modifier = Modifier.padding(start = MainTheme.spacings.triple * indentationLevel),
8283
treeFolder = child,
8384
parentPrefix = if (displayParent is DisplayAccountFolder) displayParent.folder.name else null,
85+
indentationLevel = indentationLevel + 1,
8486
)
8587
}
8688
}

0 commit comments

Comments
 (0)