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

Commit dd89dee4 authored by cketti's avatar cketti
Browse files

Convert methods in `AccountSearchConditions` to extension functions

parent ef583ba6
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -15,14 +15,12 @@ import com.fsck.k9.network.connectivityModule
import com.fsck.k9.notification.coreNotificationModule
import com.fsck.k9.power.powerModule
import com.fsck.k9.preferences.preferencesModule
import com.fsck.k9.search.searchModule

val coreModules = listOf(
    mainModule,
    openPgpModule,
    autocryptModule,
    mailStoreModule,
    searchModule,
    extractorModule,
    htmlModule,
    quoteModule,
+0 −1
Original line number Diff line number Diff line
@@ -30,7 +30,6 @@ val controllerModule = module {
    single<MessageCountsProvider> {
        DefaultMessageCountsProvider(
            preferences = get(),
            accountSearchConditions = get(),
            messageStoreManager = get()
        )
    }
+6 −5
Original line number Diff line number Diff line
@@ -3,11 +3,12 @@ package com.fsck.k9.controller
import com.fsck.k9.Account
import com.fsck.k9.Preferences
import com.fsck.k9.mailstore.MessageStoreManager
import com.fsck.k9.search.AccountSearchConditions
import com.fsck.k9.search.ConditionsTreeNode
import com.fsck.k9.search.LocalSearch
import com.fsck.k9.search.SearchAccount
import com.fsck.k9.search.excludeSpecialFolders
import com.fsck.k9.search.getAccounts
import com.fsck.k9.search.limitToDisplayableFolders
import timber.log.Timber

interface MessageCountsProvider {
@@ -20,13 +21,13 @@ data class MessageCounts(val unread: Int, val starred: Int)

internal class DefaultMessageCountsProvider(
    private val preferences: Preferences,
    private val accountSearchConditions: AccountSearchConditions,
    private val messageStoreManager: MessageStoreManager
) : MessageCountsProvider {
    override fun getMessageCounts(account: Account): MessageCounts {
        val search = LocalSearch()
        accountSearchConditions.excludeSpecialFolders(account, search)
        accountSearchConditions.limitToDisplayableFolders(account, search)
        val search = LocalSearch().apply {
            excludeSpecialFolders(account)
            limitToDisplayableFolders(account)
        }

        return getMessageCounts(account, search.conditions)
    }
+57 −69
Original line number Diff line number Diff line
@@ -7,43 +7,36 @@ import com.fsck.k9.search.SearchSpecification.Attribute
import com.fsck.k9.search.SearchSpecification.SearchCondition
import com.fsck.k9.search.SearchSpecification.SearchField

class AccountSearchConditions {
/**
 * Modify the supplied [LocalSearch] instance to limit the search to displayable folders.
 *
     * This method uses the current folder display mode to decide what folders to include/exclude.
     *
     * @param search
     * The `LocalSearch` instance to modify.
     *
     * @see .getFolderDisplayMode
 * This method uses the current [folder display mode][Account.folderDisplayMode] to decide what folders to
 * include/exclude.
 */
    fun limitToDisplayableFolders(account: Account, search: LocalSearch) {
        val displayMode = account.folderDisplayMode

        when (displayMode) {
fun LocalSearch.limitToDisplayableFolders(account: Account) {
    when (account.folderDisplayMode) {
        FolderMode.FIRST_CLASS -> {
            // Count messages in the INBOX and non-special first class folders
                search.and(SearchField.DISPLAY_CLASS, FolderClass.FIRST_CLASS.name, Attribute.EQUALS)
            and(SearchField.DISPLAY_CLASS, FolderClass.FIRST_CLASS.name, Attribute.EQUALS)
        }
        FolderMode.FIRST_AND_SECOND_CLASS -> {
            // Count messages in the INBOX and non-special first and second class folders
                search.and(SearchField.DISPLAY_CLASS, FolderClass.FIRST_CLASS.name, Attribute.EQUALS)
            and(SearchField.DISPLAY_CLASS, FolderClass.FIRST_CLASS.name, Attribute.EQUALS)

            // TODO: Create a proper interface for creating arbitrary condition trees
            val searchCondition = SearchCondition(
                SearchField.DISPLAY_CLASS, Attribute.EQUALS, FolderClass.SECOND_CLASS.name
            )
                val root = search.conditions
            val root = conditions
            if (root.mRight != null) {
                root.mRight.or(searchCondition)
            } else {
                    search.or(searchCondition)
                or(searchCondition)
            }
        }
        FolderMode.NOT_SECOND_CLASS -> {
            // Count messages in the INBOX and non-special non-second-class folders
                search.and(SearchField.DISPLAY_CLASS, FolderClass.SECOND_CLASS.name, Attribute.NOT_EQUALS)
            and(SearchField.DISPLAY_CLASS, FolderClass.SECOND_CLASS.name, Attribute.NOT_EQUALS)
        }
        FolderMode.ALL, FolderMode.NONE -> {
            // Count messages in the INBOX and non-special folders
@@ -55,33 +48,28 @@ class AccountSearchConditions {
 * Modify the supplied [LocalSearch] instance to exclude special folders.
 *
 * Currently the following folders are excluded:
 *  - Trash
 *  - Drafts
 *  - Spam
 *  - Outbox
 *  - Sent
 *
     *  * Trash
     *  * Drafts
     *  * Spam
     *  * Outbox
     *  * Sent
     *
     * The Inbox will always be included even if one of the special folders is configured to point
     * to the Inbox.
     *
     * @param search
     * The `LocalSearch` instance to modify.
 * The Inbox will always be included even if one of the special folders is configured to point to the Inbox.
 */
    fun excludeSpecialFolders(account: Account, search: LocalSearch) {
        excludeSpecialFolder(search, account.trashFolderId)
        excludeSpecialFolder(search, account.draftsFolderId)
        excludeSpecialFolder(search, account.spamFolderId)
        excludeSpecialFolder(search, account.outboxFolderId)
        excludeSpecialFolder(search, account.sentFolderId)
fun LocalSearch.excludeSpecialFolders(account: Account) {
    this.excludeSpecialFolder(account.trashFolderId)
    this.excludeSpecialFolder(account.draftsFolderId)
    this.excludeSpecialFolder(account.spamFolderId)
    this.excludeSpecialFolder(account.outboxFolderId)
    this.excludeSpecialFolder(account.sentFolderId)

    account.inboxFolderId?.let { inboxFolderId ->
            search.or(SearchCondition(SearchField.FOLDER, Attribute.EQUALS, inboxFolderId.toString()))
        or(SearchCondition(SearchField.FOLDER, Attribute.EQUALS, inboxFolderId.toString()))
    }
}

    private fun excludeSpecialFolder(search: LocalSearch, folderId: Long?) {
private fun LocalSearch.excludeSpecialFolder(folderId: Long?) {
    if (folderId != null) {
            search.and(SearchField.FOLDER, folderId.toString(), Attribute.NOT_EQUALS)
        }
        and(SearchField.FOLDER, folderId.toString(), Attribute.NOT_EQUALS)
    }
}
+0 −7
Original line number Diff line number Diff line
package com.fsck.k9.search

import org.koin.dsl.module

val searchModule = module {
    single { AccountSearchConditions() }
}