Skip to content

Commit 2b01d33

Browse files
committed
Change FolderListItemBadge logic
1 parent b3a2273 commit 2b01d33

6 files changed

Lines changed: 133 additions & 79 deletions

File tree

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,30 @@ internal object FakeData {
119119
),
120120
)
121121

122+
val DISPLAY_TREE_FOLDER_WITH_NESTED_FOLDERS = DisplayTreeFolder(
123+
displayFolder = null,
124+
displayName = null,
125+
totalUnreadCount = 14,
126+
totalStarredCount = 5,
127+
children = persistentListOf(
128+
DisplayTreeFolder(
129+
displayFolder = DISPLAY_FOLDER,
130+
displayName = DISPLAY_FOLDER.folder.name,
131+
totalUnreadCount = 7,
132+
totalStarredCount = 3,
133+
children = persistentListOf(
134+
DisplayTreeFolder(
135+
displayFolder = null,
136+
displayName = null,
137+
totalUnreadCount = 7,
138+
totalStarredCount = 3,
139+
children = persistentListOf(),
140+
),
141+
),
142+
),
143+
),
144+
)
145+
122146
fun createAccountList(): PersistentList<DisplayAccount> {
123147
return persistentListOf(
124148
DisplayAccount(

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package net.thunderbird.feature.navigation.drawer.dropdown.ui.folder
22

33
import androidx.compose.runtime.Composable
4+
import androidx.compose.runtime.mutableStateOf
5+
import androidx.compose.runtime.remember
46
import androidx.compose.ui.tooling.preview.Preview
57
import app.k9mail.core.ui.compose.designsystem.PreviewWithThemes
68

@@ -99,3 +101,16 @@ internal fun FolderListItemBadgeWith1000CountsPreview() {
99101
)
100102
}
101103
}
104+
105+
@Composable
106+
@Preview(showBackground = true)
107+
internal fun FolderListItemBadgeWithExpandableStatePreview() {
108+
PreviewWithThemes {
109+
FolderListItemBadge(
110+
unreadCount = 1000,
111+
starredCount = 1000,
112+
showStarredCount = true,
113+
expandableState = remember { mutableStateOf(false) },
114+
)
115+
}
116+
}

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import app.k9mail.core.mail.folder.api.FolderType
77
import app.k9mail.core.ui.compose.designsystem.PreviewWithThemes
88
import app.k9mail.legacy.ui.folder.FolderNameFormatter
99
import net.thunderbird.feature.navigation.drawer.dropdown.ui.FakeData.DISPLAY_FOLDER
10+
import net.thunderbird.feature.navigation.drawer.dropdown.ui.FakeData.DISPLAY_TREE_FOLDER_WITH_UNIFIED_FOLDER
1011
import net.thunderbird.feature.navigation.drawer.dropdown.ui.FakeData.UNIFIED_FOLDER
1112

1213
@Composable
@@ -96,3 +97,18 @@ internal fun FolderListItemWithUnifiedFolderPreview() {
9697
)
9798
}
9899
}
100+
101+
@Composable
102+
@Preview(showBackground = true)
103+
internal fun FolderListItemWithUnifiedFolderSelectedPreview() {
104+
PreviewWithThemes {
105+
FolderListItem(
106+
displayFolder = UNIFIED_FOLDER,
107+
treeFolder = DISPLAY_TREE_FOLDER_WITH_UNIFIED_FOLDER,
108+
selected = false,
109+
showStarredCount = false,
110+
onClick = {},
111+
folderNameFormatter = FolderNameFormatter(LocalContext.current.resources),
112+
)
113+
}
114+
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import androidx.compose.ui.tooling.preview.Preview
55
import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme
66
import net.thunderbird.feature.navigation.drawer.dropdown.ui.FakeData.DISPLAY_FOLDER
77
import net.thunderbird.feature.navigation.drawer.dropdown.ui.FakeData.DISPLAY_TREE_FOLDER
8+
import net.thunderbird.feature.navigation.drawer.dropdown.ui.FakeData.DISPLAY_TREE_FOLDER_WITH_NESTED_FOLDERS
89
import net.thunderbird.feature.navigation.drawer.dropdown.ui.FakeData.DISPLAY_TREE_FOLDER_WITH_UNIFIED_FOLDER
910
import net.thunderbird.feature.navigation.drawer.dropdown.ui.FakeData.EMPTY_DISPLAY_TREE_FOLDER
1011

@@ -46,3 +47,16 @@ internal fun FolderListWithUnifiedFolderPreview() {
4647
)
4748
}
4849
}
50+
51+
@Composable
52+
@Preview(showBackground = true)
53+
internal fun FolderListWithUnifiedFolderPreviewSelected() {
54+
PreviewWithTheme {
55+
FolderList(
56+
rootFolder = DISPLAY_TREE_FOLDER_WITH_NESTED_FOLDERS,
57+
selectedFolder = null,
58+
onFolderClick = {},
59+
showStarredCount = false,
60+
)
61+
}
62+
}

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

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import androidx.compose.foundation.layout.fillMaxWidth
66
import androidx.compose.foundation.layout.padding
77
import androidx.compose.runtime.Composable
88
import androidx.compose.runtime.mutableStateOf
9-
import androidx.compose.runtime.remember
9+
import androidx.compose.runtime.saveable.rememberSaveable
1010
import androidx.compose.ui.Modifier
1111
import androidx.compose.ui.graphics.vector.ImageVector
1212
import androidx.compose.ui.res.stringResource
@@ -35,7 +35,7 @@ internal fun FolderListItem(
3535
parentPrefix: String? = "",
3636
indentationLevel: Int = 1,
3737
) {
38-
var isExpanded = remember { mutableStateOf(false) }
38+
var isExpanded = rememberSaveable { mutableStateOf(false) }
3939

4040
var unreadCount = displayFolder.unreadMessageCount
4141
var starredCount = displayFolder.starredMessageCount
@@ -45,12 +45,16 @@ internal fun FolderListItem(
4545
starredCount = treeFolder.totalStarredCount
4646
}
4747

48-
Column(modifier = Modifier.fillMaxWidth().animateContentSize()) {
48+
Column(
49+
modifier = modifier
50+
.fillMaxWidth()
51+
.animateContentSize(),
52+
) {
4953
NavigationDrawerItem(
5054
label = mapFolderName(displayFolder, folderNameFormatter, parentPrefix),
5155
selected = selected,
5256
onClick = { onClick(displayFolder) },
53-
modifier = modifier,
57+
modifier = Modifier.fillMaxWidth(),
5458
icon = {
5559
Icon(
5660
imageVector = mapFolderIcon(displayFolder),
@@ -79,7 +83,9 @@ internal fun FolderListItem(
7983
showStarredCount = showStarredCount,
8084
onClick = { onClick(displayChild) },
8185
folderNameFormatter = folderNameFormatter,
82-
modifier = Modifier.padding(start = MainTheme.spacings.triple * indentationLevel),
86+
modifier = Modifier
87+
.fillMaxWidth()
88+
.padding(start = MainTheme.spacings.double * indentationLevel),
8389
treeFolder = child,
8490
parentPrefix = if (displayParent is DisplayAccountFolder) displayParent.folder.name else null,
8591
indentationLevel = indentationLevel + 1,

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

Lines changed: 53 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
package net.thunderbird.feature.navigation.drawer.dropdown.ui.folder
22

33
import androidx.compose.foundation.clickable
4-
import androidx.compose.foundation.layout.Arrangement
4+
import androidx.compose.foundation.layout.Box
55
import androidx.compose.foundation.layout.Row
6+
import androidx.compose.foundation.layout.Spacer
7+
import androidx.compose.foundation.layout.height
68
import androidx.compose.foundation.layout.padding
79
import androidx.compose.foundation.layout.size
10+
import androidx.compose.foundation.layout.width
11+
import androidx.compose.foundation.shape.CircleShape
812
import androidx.compose.runtime.Composable
913
import androidx.compose.runtime.MutableState
1014
import androidx.compose.ui.Alignment
1115
import androidx.compose.ui.Modifier
16+
import androidx.compose.ui.draw.clip
1217
import androidx.compose.ui.platform.LocalContext
1318
import app.k9mail.core.ui.compose.designsystem.atom.icon.Icon
1419
import app.k9mail.core.ui.compose.designsystem.atom.icon.Icons
@@ -24,90 +29,64 @@ internal fun FolderListItemBadge(
2429
modifier: Modifier = Modifier,
2530
expandableState: MutableState<Boolean>? = null,
2631
) {
27-
if (showStarredCount) {
28-
FolderCountAndStarredBadge(
29-
unreadCount = unreadCount,
30-
starredCount = starredCount,
31-
modifier = modifier,
32-
)
33-
} else {
34-
FolderCountBadge(
35-
unreadCount = unreadCount,
36-
modifier = modifier,
37-
)
38-
}
39-
40-
if (expandableState !== null) {
41-
FolderExpandableBadge(
42-
isExpanded = expandableState.value,
43-
onClick = { expandableState.value = !expandableState.value },
44-
)
45-
}
46-
}
47-
48-
@Composable
49-
private fun FolderExpandableBadge(
50-
isExpanded: Boolean = false,
51-
onClick: () -> Unit,
52-
) {
53-
Icon(
54-
imageVector = if (isExpanded) Icons.Outlined.ExpandLess else Icons.Outlined.ExpandMore,
55-
modifier = Modifier
56-
.size(MainTheme.sizes.iconLarge)
57-
.padding(end = MainTheme.spacings.quarter)
58-
.clickable(onClick = onClick),
32+
FolderCountAndStarredBadge(
33+
unreadCount = unreadCount,
34+
starredCount = starredCount,
35+
showStarredCount = showStarredCount,
36+
onClick = { expandableState?.value = !expandableState.value },
37+
isExpanded = expandableState?.value,
38+
modifier = modifier,
5939
)
6040
}
6141

62-
@Composable
63-
private fun FolderCountBadge(
64-
unreadCount: Int,
65-
modifier: Modifier = Modifier,
66-
) {
67-
if (unreadCount > 0) {
68-
val resources = LocalContext.current.resources
69-
70-
NavigationDrawerItemBadge(
71-
label = labelForCount(
72-
count = unreadCount,
73-
resources = resources,
74-
),
75-
modifier = modifier,
76-
)
77-
}
78-
}
79-
8042
@Composable
8143
private fun FolderCountAndStarredBadge(
8244
unreadCount: Int,
8345
starredCount: Int,
46+
showStarredCount: Boolean,
47+
onClick: () -> Unit,
8448
modifier: Modifier = Modifier,
49+
isExpanded: Boolean? = null,
8550
) {
86-
if (unreadCount > 0 || starredCount > 0) {
87-
Row(
88-
modifier = modifier,
89-
verticalAlignment = Alignment.CenterVertically,
90-
horizontalArrangement = Arrangement.spacedBy(MainTheme.spacings.default),
91-
) {
92-
val resources = LocalContext.current.resources
51+
Row(
52+
modifier = modifier,
53+
verticalAlignment = Alignment.CenterVertically,
54+
) {
55+
val resources = LocalContext.current.resources
9356

94-
if (unreadCount > 0) {
95-
NavigationDrawerItemBadge(
96-
label = labelForCount(
97-
count = unreadCount,
98-
resources = resources,
99-
),
100-
imageVector = Icons.Filled.Dot,
101-
)
102-
}
57+
if (unreadCount > 0) {
58+
NavigationDrawerItemBadge(
59+
label = labelForCount(
60+
count = unreadCount,
61+
resources = resources,
62+
),
63+
imageVector = if (showStarredCount) Icons.Filled.Dot else null,
64+
)
65+
}
66+
67+
if (showStarredCount && starredCount > 0) {
68+
Spacer(modifier = Modifier.width(MainTheme.spacings.half))
69+
NavigationDrawerItemBadge(
70+
label = labelForCount(
71+
count = starredCount,
72+
resources = resources,
73+
),
74+
imageVector = Icons.Filled.Star,
75+
)
76+
}
10377

104-
if (starredCount > 0) {
105-
NavigationDrawerItemBadge(
106-
label = labelForCount(
107-
count = starredCount,
108-
resources = resources,
109-
),
110-
imageVector = Icons.Filled.Star,
78+
if (isExpanded != null) {
79+
Box(
80+
modifier = Modifier
81+
.height(MainTheme.sizes.iconAvatar)
82+
.padding(start = MainTheme.spacings.quarter)
83+
.clip(CircleShape)
84+
.clickable(onClick = onClick),
85+
contentAlignment = Alignment.Center,
86+
) {
87+
Icon(
88+
imageVector = if (isExpanded) Icons.Outlined.ExpandLess else Icons.Outlined.ExpandMore,
89+
modifier = Modifier.size(MainTheme.sizes.iconLarge),
11190
)
11291
}
11392
}

0 commit comments

Comments
 (0)