Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 7bfd1f3d authored by Wolf-Martell Montwé's avatar Wolf-Martell Montwé
Browse files

Change GetDisplayFoldersForAccount to also return unified folders and change...

Change GetDisplayFoldersForAccount to also return unified folders and change implementation accordingly
parent dd937c19
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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,
@@ -40,6 +41,7 @@ class FolderDrawer(
                DrawerView(
                    openAccount = openAccount,
                    openFolder = openFolder,
                    openUnifiedFolder = openUnifiedFolder,
                    openManageFolders = openManageFolders,
                    openSettings = openSettings,
                    closeDrawer = { close() },
+1 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ val navigationDrawerModule: Module = module {
    single<UseCase.GetDisplayFoldersForAccount> {
        GetDisplayFoldersForAccount(
            repository = get(),
            messageCountsProvider = get(),
        )
    }

+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
@@ -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>>
        }

        /**
+44 −1
Original line number Diff line number Diff line
@@ -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(
@@ -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"
    }
}
+5 −4
Original line number Diff line number Diff line
@@ -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
@@ -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,
    )
@@ -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
@@ -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