Skip to content

Commit 045181a

Browse files
authored
Merge pull request #9045 from thunderbird/reworked-tree-folders-view
Reworked: Add basic support for subfolders in Thunderbird Android
2 parents 0bdc44b + 030483f commit 045181a

20 files changed

Lines changed: 948 additions & 142 deletions

File tree

app-k9mail/src/debug/kotlin/app/k9mail/featureflag/K9FeatureFlagFactory.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class K9FeatureFlagFactory : FeatureFlagFactory {
1111
FeatureFlag("new_account_settings".toFeatureFlagKey(), enabled = true),
1212
FeatureFlag("disable_font_size_config".toFeatureFlagKey(), enabled = true),
1313
FeatureFlag("email_notification_default".toFeatureFlagKey(), enabled = true),
14-
FeatureFlag("enable_dropdown_drawer".toFeatureFlagKey(), enabled = false),
14+
FeatureFlag("enable_dropdown_drawer".toFeatureFlagKey(), enabled = true),
1515
)
1616
}
1717
}

app-thunderbird/src/daily/kotlin/net/thunderbird/android/featureflag/TbFeatureFlagFactory.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class TbFeatureFlagFactory : FeatureFlagFactory {
1414
FeatureFlag("new_account_settings".toFeatureFlagKey(), enabled = false),
1515
FeatureFlag("disable_font_size_config".toFeatureFlagKey(), enabled = true),
1616
FeatureFlag("email_notification_default".toFeatureFlagKey(), enabled = true),
17-
FeatureFlag("enable_dropdown_drawer".toFeatureFlagKey(), enabled = false),
17+
FeatureFlag("enable_dropdown_drawer".toFeatureFlagKey(), enabled = true),
1818
)
1919
}
2020
}

app-thunderbird/src/debug/kotlin/net/thunderbird/android/featureflag/TbFeatureFlagFactory.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class TbFeatureFlagFactory : FeatureFlagFactory {
1414
FeatureFlag("new_account_settings".toFeatureFlagKey(), enabled = true),
1515
FeatureFlag("disable_font_size_config".toFeatureFlagKey(), enabled = true),
1616
FeatureFlag("email_notification_default".toFeatureFlagKey(), enabled = true),
17-
FeatureFlag("enable_dropdown_drawer".toFeatureFlagKey(), enabled = false),
17+
FeatureFlag("enable_dropdown_drawer".toFeatureFlagKey(), enabled = true),
1818
)
1919
}
2020
}

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

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import kotlinx.collections.immutable.toPersistentList
1212
import net.thunderbird.feature.navigation.drawer.dropdown.domain.entity.DisplayAccount
1313
import net.thunderbird.feature.navigation.drawer.dropdown.domain.entity.DisplayAccountFolder
1414
import net.thunderbird.feature.navigation.drawer.dropdown.domain.entity.DisplayFolder
15+
import net.thunderbird.feature.navigation.drawer.dropdown.domain.entity.DisplayTreeFolder
1516
import net.thunderbird.feature.navigation.drawer.dropdown.domain.entity.DisplayUnifiedFolder
1617
import net.thunderbird.feature.navigation.drawer.dropdown.domain.entity.DisplayUnifiedFolderType
1718

@@ -64,13 +65,84 @@ internal object FakeData {
6465
starredMessageCount = 5,
6566
)
6667

68+
val DISPLAY_TREE_FOLDER = DisplayTreeFolder(
69+
displayFolder = null,
70+
displayName = null,
71+
totalUnreadCount = 14,
72+
totalStarredCount = 5,
73+
children = persistentListOf(
74+
DisplayTreeFolder(
75+
displayFolder = DISPLAY_FOLDER,
76+
displayName = DISPLAY_FOLDER.folder.name,
77+
totalUnreadCount = 14,
78+
totalStarredCount = 5,
79+
children = persistentListOf(),
80+
),
81+
),
82+
)
83+
84+
val EMPTY_DISPLAY_TREE_FOLDER = DisplayTreeFolder(
85+
displayFolder = null,
86+
displayName = null,
87+
totalUnreadCount = 0,
88+
totalStarredCount = 0,
89+
children = persistentListOf(),
90+
)
91+
6792
val UNIFIED_FOLDER = DisplayUnifiedFolder(
6893
id = "unified_inbox",
6994
unifiedType = DisplayUnifiedFolderType.INBOX,
7095
unreadMessageCount = 123,
7196
starredMessageCount = 567,
7297
)
7398

99+
val DISPLAY_TREE_FOLDER_WITH_UNIFIED_FOLDER = DisplayTreeFolder(
100+
displayFolder = null,
101+
displayName = null,
102+
totalUnreadCount = 14,
103+
totalStarredCount = 5,
104+
children = persistentListOf(
105+
DisplayTreeFolder(
106+
displayFolder = UNIFIED_FOLDER,
107+
displayName = null,
108+
totalUnreadCount = 7,
109+
totalStarredCount = 2,
110+
children = persistentListOf(),
111+
),
112+
DisplayTreeFolder(
113+
displayFolder = DISPLAY_FOLDER,
114+
displayName = DISPLAY_FOLDER.folder.name,
115+
totalUnreadCount = 7,
116+
totalStarredCount = 3,
117+
children = persistentListOf(),
118+
),
119+
),
120+
)
121+
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+
74146
fun createAccountList(): PersistentList<DisplayAccount> {
75147
return persistentListOf(
76148
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: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,18 @@ package net.thunderbird.feature.navigation.drawer.dropdown.ui.folder
33
import androidx.compose.runtime.Composable
44
import androidx.compose.ui.tooling.preview.Preview
55
import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme
6-
import kotlinx.collections.immutable.persistentListOf
76
import net.thunderbird.feature.navigation.drawer.dropdown.ui.FakeData.DISPLAY_FOLDER
8-
import net.thunderbird.feature.navigation.drawer.dropdown.ui.FakeData.UNIFIED_FOLDER
7+
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
9+
import net.thunderbird.feature.navigation.drawer.dropdown.ui.FakeData.DISPLAY_TREE_FOLDER_WITH_UNIFIED_FOLDER
10+
import net.thunderbird.feature.navigation.drawer.dropdown.ui.FakeData.EMPTY_DISPLAY_TREE_FOLDER
911

1012
@Composable
1113
@Preview(showBackground = true)
1214
internal fun FolderListPreview() {
1315
PreviewWithTheme {
1416
FolderList(
15-
folders = persistentListOf(
16-
DISPLAY_FOLDER,
17-
),
17+
rootFolder = EMPTY_DISPLAY_TREE_FOLDER,
1818
selectedFolder = null,
1919
onFolderClick = {},
2020
showStarredCount = false,
@@ -27,9 +27,7 @@ internal fun FolderListPreview() {
2727
internal fun FolderListPreviewSelected() {
2828
PreviewWithTheme {
2929
FolderList(
30-
folders = persistentListOf(
31-
DISPLAY_FOLDER,
32-
),
30+
rootFolder = DISPLAY_TREE_FOLDER,
3331
selectedFolder = DISPLAY_FOLDER,
3432
onFolderClick = {},
3533
showStarredCount = false,
@@ -42,13 +40,23 @@ internal fun FolderListPreviewSelected() {
4240
internal fun FolderListWithUnifiedFolderPreview() {
4341
PreviewWithTheme {
4442
FolderList(
45-
folders = persistentListOf(
46-
UNIFIED_FOLDER,
47-
DISPLAY_FOLDER,
48-
),
43+
rootFolder = DISPLAY_TREE_FOLDER_WITH_UNIFIED_FOLDER,
4944
selectedFolder = DISPLAY_FOLDER,
5045
onFolderClick = {},
5146
showStarredCount = false,
5247
)
5348
}
5449
}
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/NavigationDrawerModule.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import net.thunderbird.feature.navigation.drawer.dropdown.domain.DomainContract
55
import net.thunderbird.feature.navigation.drawer.dropdown.domain.DomainContract.UseCase
66
import net.thunderbird.feature.navigation.drawer.dropdown.domain.usecase.GetDisplayAccounts
77
import net.thunderbird.feature.navigation.drawer.dropdown.domain.usecase.GetDisplayFoldersForAccount
8+
import net.thunderbird.feature.navigation.drawer.dropdown.domain.usecase.GetDisplayTreeFolder
89
import net.thunderbird.feature.navigation.drawer.dropdown.domain.usecase.GetDrawerConfig
910
import net.thunderbird.feature.navigation.drawer.dropdown.domain.usecase.SaveDrawerConfig
1011
import net.thunderbird.feature.navigation.drawer.dropdown.domain.usecase.SyncAccount
@@ -48,6 +49,10 @@ val navigationDropDownDrawerModule: Module = module {
4849
)
4950
}
5051

52+
single<UseCase.GetDisplayTreeFolder> {
53+
GetDisplayTreeFolder()
54+
}
55+
5156
single<UseCase.SyncAccount> {
5257
SyncAccount(
5358
accountManager = get(),
@@ -67,6 +72,7 @@ val navigationDropDownDrawerModule: Module = module {
6772
saveDrawerConfig = get(),
6873
getDisplayAccounts = get(),
6974
getDisplayFoldersForAccount = get(),
75+
getDisplayTreeFolder = get(),
7076
syncAccount = get(),
7177
syncAllAccounts = get(),
7278
)

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import kotlinx.coroutines.flow.Flow
44
import net.thunderbird.feature.navigation.drawer.api.NavigationDrawerExternalContract.DrawerConfig
55
import net.thunderbird.feature.navigation.drawer.dropdown.domain.entity.DisplayAccount
66
import net.thunderbird.feature.navigation.drawer.dropdown.domain.entity.DisplayFolder
7+
import net.thunderbird.feature.navigation.drawer.dropdown.domain.entity.DisplayTreeFolder
78
import net.thunderbird.feature.navigation.drawer.dropdown.domain.entity.DisplayUnifiedFolder
89
import net.thunderbird.feature.navigation.drawer.dropdown.domain.entity.DisplayUnifiedFolderType
910

@@ -26,6 +27,10 @@ internal interface DomainContract {
2627
operator fun invoke(accountId: String, includeUnifiedFolders: Boolean): Flow<List<DisplayFolder>>
2728
}
2829

30+
fun interface GetDisplayTreeFolder {
31+
operator fun invoke(folders: List<DisplayFolder>, maxDepth: Int): DisplayTreeFolder
32+
}
33+
2934
/**
3035
* Synchronize the given account uuid.
3136
*/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package net.thunderbird.feature.navigation.drawer.dropdown.domain.entity
2+
3+
import kotlinx.collections.immutable.ImmutableList
4+
5+
internal data class DisplayTreeFolder(
6+
val displayFolder: DisplayFolder?,
7+
val displayName: String?,
8+
val totalUnreadCount: Int,
9+
val totalStarredCount: Int,
10+
val children: ImmutableList<DisplayTreeFolder>,
11+
)

0 commit comments

Comments
 (0)