Loading feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/FolderDrawer.kt +2 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ class FolderDrawer( override val parent: AppCompatActivity, private val openAccount: (account: Account) -> Unit, private val openFolder: (folderId: Long) -> Unit, private val openUnifiedFolder: () -> Unit, private val openManageFolders: () -> Unit, private val openSettings: () -> Unit, createDrawerListener: () -> DrawerLayout.DrawerListener, Loading @@ -40,6 +41,7 @@ class FolderDrawer( DrawerView( openAccount = openAccount, openFolder = openFolder, openUnifiedFolder = openUnifiedFolder, openManageFolders = openManageFolders, openSettings = openSettings, closeDrawer = { close() }, Loading feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/NavigationDrawerModule.kt +1 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ val navigationDrawerModule: Module = module { single<UseCase.GetDisplayFoldersForAccount> { GetDisplayFoldersForAccount( repository = get(), messageCountsProvider = get(), ) } Loading feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/domain/DomainContract.kt +2 −2 Original line number Diff line number Diff line package app.k9mail.feature.navigation.drawer.domain import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccount import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccountFolder import app.k9mail.feature.navigation.drawer.domain.entity.DisplayFolder import app.k9mail.feature.navigation.drawer.domain.entity.DrawerConfig import app.k9mail.legacy.account.Account import kotlinx.coroutines.flow.Flow Loading @@ -18,7 +18,7 @@ interface DomainContract { } fun interface GetDisplayFoldersForAccount { operator fun invoke(accountUuid: String): Flow<List<DisplayAccountFolder>> operator fun invoke(accountUuid: String, includeUnifiedFolders: Boolean): Flow<List<DisplayFolder>> } /** Loading feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/domain/usecase/GetDisplayFoldersForAccount.kt +44 −1 Original line number Diff line number Diff line Loading @@ -2,14 +2,22 @@ package app.k9mail.feature.navigation.drawer.domain.usecase import app.k9mail.feature.navigation.drawer.domain.DomainContract.UseCase import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccountFolder import app.k9mail.feature.navigation.drawer.domain.entity.DisplayFolder import app.k9mail.feature.navigation.drawer.domain.entity.DisplayUnifiedFolder import app.k9mail.feature.navigation.drawer.domain.entity.DisplayUnifiedFolderType import app.k9mail.legacy.message.controller.MessageCountsProvider import app.k9mail.legacy.search.LocalSearch import app.k9mail.legacy.search.api.SearchAttribute import app.k9mail.legacy.search.api.SearchField import app.k9mail.legacy.ui.folder.DisplayFolderRepository import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map class GetDisplayFoldersForAccount( private val repository: DisplayFolderRepository, private val messageCountsProvider: MessageCountsProvider, ) : UseCase.GetDisplayFoldersForAccount { override fun invoke(accountUuid: String): Flow<List<DisplayAccountFolder>> { override fun invoke(accountUuid: String, includeUnifiedFolders: Boolean): Flow<List<DisplayFolder>> { return repository.getDisplayFoldersFlow(accountUuid).map { displayFolders -> displayFolders.map { displayFolder -> DisplayAccountFolder( Loading @@ -20,6 +28,41 @@ class GetDisplayFoldersForAccount( starredMessageCount = displayFolder.starredMessageCount, ) } }.map { displayFolders -> if (includeUnifiedFolders) { createDisplayUnifiedFolders() + displayFolders } else { displayFolders } } } private fun createDisplayUnifiedFolders(): List<DisplayUnifiedFolder> { return listOf( createUnifiedInboxFolder(), ) } private fun createUnifiedInboxFolder(): DisplayUnifiedFolder { val search = getUnifiedInboxSearch() val messageCounts = messageCountsProvider.getMessageCounts(search) return DisplayUnifiedFolder( id = UNIFIED_INBOX_ID, unifiedType = DisplayUnifiedFolderType.INBOX, unreadMessageCount = messageCounts.unread, starredMessageCount = messageCounts.starred, ) } private fun getUnifiedInboxSearch(): LocalSearch { return LocalSearch().apply { id = UNIFIED_INBOX_ID and(SearchField.INTEGRATE, "1", SearchAttribute.EQUALS) } } companion object { private const val UNIFIED_INBOX_ID = "unified_inbox" } } feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerContract.kt +5 −4 Original line number Diff line number Diff line Loading @@ -3,7 +3,7 @@ package app.k9mail.feature.navigation.drawer.ui import androidx.compose.runtime.Stable import app.k9mail.core.ui.compose.common.mvi.UnidirectionalViewModel import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccount import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccountFolder import app.k9mail.feature.navigation.drawer.domain.entity.DisplayFolder import app.k9mail.feature.navigation.drawer.domain.entity.DrawerConfig import app.k9mail.legacy.account.Account import kotlinx.collections.immutable.ImmutableList Loading @@ -21,8 +21,8 @@ interface DrawerContract { ), val accounts: ImmutableList<DisplayAccount> = persistentListOf(), val selectedAccount: DisplayAccount? = null, val folders: ImmutableList<DisplayAccountFolder> = persistentListOf(), val selectedFolder: DisplayAccountFolder? = null, val folders: ImmutableList<DisplayFolder> = persistentListOf(), val selectedFolder: DisplayFolder? = null, val showAccountSelector: Boolean = false, val isLoading: Boolean = false, ) Loading @@ -30,7 +30,7 @@ interface DrawerContract { sealed interface Event { data class OnAccountClick(val account: DisplayAccount) : Event data class OnAccountViewClick(val account: DisplayAccount) : Event data class OnFolderClick(val folder: DisplayAccountFolder) : Event data class OnFolderClick(val folder: DisplayFolder) : Event data object OnAccountSelectorClick : Event data object OnManageFoldersClick : Event data object OnSettingsClick : Event Loading @@ -40,6 +40,7 @@ interface DrawerContract { sealed interface Effect { data class OpenAccount(val account: Account) : Effect data class OpenFolder(val folderId: Long) : Effect data object OpenUnifiedFolder : Effect data object OpenManageFolders : Effect data object OpenSettings : Effect data object CloseDrawer : Effect Loading Loading
feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/FolderDrawer.kt +2 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ class FolderDrawer( override val parent: AppCompatActivity, private val openAccount: (account: Account) -> Unit, private val openFolder: (folderId: Long) -> Unit, private val openUnifiedFolder: () -> Unit, private val openManageFolders: () -> Unit, private val openSettings: () -> Unit, createDrawerListener: () -> DrawerLayout.DrawerListener, Loading @@ -40,6 +41,7 @@ class FolderDrawer( DrawerView( openAccount = openAccount, openFolder = openFolder, openUnifiedFolder = openUnifiedFolder, openManageFolders = openManageFolders, openSettings = openSettings, closeDrawer = { close() }, Loading
feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/NavigationDrawerModule.kt +1 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ val navigationDrawerModule: Module = module { single<UseCase.GetDisplayFoldersForAccount> { GetDisplayFoldersForAccount( repository = get(), messageCountsProvider = get(), ) } Loading
feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/domain/DomainContract.kt +2 −2 Original line number Diff line number Diff line package app.k9mail.feature.navigation.drawer.domain import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccount import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccountFolder import app.k9mail.feature.navigation.drawer.domain.entity.DisplayFolder import app.k9mail.feature.navigation.drawer.domain.entity.DrawerConfig import app.k9mail.legacy.account.Account import kotlinx.coroutines.flow.Flow Loading @@ -18,7 +18,7 @@ interface DomainContract { } fun interface GetDisplayFoldersForAccount { operator fun invoke(accountUuid: String): Flow<List<DisplayAccountFolder>> operator fun invoke(accountUuid: String, includeUnifiedFolders: Boolean): Flow<List<DisplayFolder>> } /** Loading
feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/domain/usecase/GetDisplayFoldersForAccount.kt +44 −1 Original line number Diff line number Diff line Loading @@ -2,14 +2,22 @@ package app.k9mail.feature.navigation.drawer.domain.usecase import app.k9mail.feature.navigation.drawer.domain.DomainContract.UseCase import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccountFolder import app.k9mail.feature.navigation.drawer.domain.entity.DisplayFolder import app.k9mail.feature.navigation.drawer.domain.entity.DisplayUnifiedFolder import app.k9mail.feature.navigation.drawer.domain.entity.DisplayUnifiedFolderType import app.k9mail.legacy.message.controller.MessageCountsProvider import app.k9mail.legacy.search.LocalSearch import app.k9mail.legacy.search.api.SearchAttribute import app.k9mail.legacy.search.api.SearchField import app.k9mail.legacy.ui.folder.DisplayFolderRepository import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map class GetDisplayFoldersForAccount( private val repository: DisplayFolderRepository, private val messageCountsProvider: MessageCountsProvider, ) : UseCase.GetDisplayFoldersForAccount { override fun invoke(accountUuid: String): Flow<List<DisplayAccountFolder>> { override fun invoke(accountUuid: String, includeUnifiedFolders: Boolean): Flow<List<DisplayFolder>> { return repository.getDisplayFoldersFlow(accountUuid).map { displayFolders -> displayFolders.map { displayFolder -> DisplayAccountFolder( Loading @@ -20,6 +28,41 @@ class GetDisplayFoldersForAccount( starredMessageCount = displayFolder.starredMessageCount, ) } }.map { displayFolders -> if (includeUnifiedFolders) { createDisplayUnifiedFolders() + displayFolders } else { displayFolders } } } private fun createDisplayUnifiedFolders(): List<DisplayUnifiedFolder> { return listOf( createUnifiedInboxFolder(), ) } private fun createUnifiedInboxFolder(): DisplayUnifiedFolder { val search = getUnifiedInboxSearch() val messageCounts = messageCountsProvider.getMessageCounts(search) return DisplayUnifiedFolder( id = UNIFIED_INBOX_ID, unifiedType = DisplayUnifiedFolderType.INBOX, unreadMessageCount = messageCounts.unread, starredMessageCount = messageCounts.starred, ) } private fun getUnifiedInboxSearch(): LocalSearch { return LocalSearch().apply { id = UNIFIED_INBOX_ID and(SearchField.INTEGRATE, "1", SearchAttribute.EQUALS) } } companion object { private const val UNIFIED_INBOX_ID = "unified_inbox" } }
feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerContract.kt +5 −4 Original line number Diff line number Diff line Loading @@ -3,7 +3,7 @@ package app.k9mail.feature.navigation.drawer.ui import androidx.compose.runtime.Stable import app.k9mail.core.ui.compose.common.mvi.UnidirectionalViewModel import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccount import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccountFolder import app.k9mail.feature.navigation.drawer.domain.entity.DisplayFolder import app.k9mail.feature.navigation.drawer.domain.entity.DrawerConfig import app.k9mail.legacy.account.Account import kotlinx.collections.immutable.ImmutableList Loading @@ -21,8 +21,8 @@ interface DrawerContract { ), val accounts: ImmutableList<DisplayAccount> = persistentListOf(), val selectedAccount: DisplayAccount? = null, val folders: ImmutableList<DisplayAccountFolder> = persistentListOf(), val selectedFolder: DisplayAccountFolder? = null, val folders: ImmutableList<DisplayFolder> = persistentListOf(), val selectedFolder: DisplayFolder? = null, val showAccountSelector: Boolean = false, val isLoading: Boolean = false, ) Loading @@ -30,7 +30,7 @@ interface DrawerContract { sealed interface Event { data class OnAccountClick(val account: DisplayAccount) : Event data class OnAccountViewClick(val account: DisplayAccount) : Event data class OnFolderClick(val folder: DisplayAccountFolder) : Event data class OnFolderClick(val folder: DisplayFolder) : Event data object OnAccountSelectorClick : Event data object OnManageFoldersClick : Event data object OnSettingsClick : Event Loading @@ -40,6 +40,7 @@ interface DrawerContract { sealed interface Effect { data class OpenAccount(val account: Account) : Effect data class OpenFolder(val folderId: Long) : Effect data object OpenUnifiedFolder : Effect data object OpenManageFolders : Effect data object OpenSettings : Effect data object CloseDrawer : Effect Loading