Convert methods in AccountSearchConditions to extension functions

This commit is contained in:
cketti 2023-01-27 18:03:05 +01:00
parent ef583ba620
commit dd89dee489
5 changed files with 65 additions and 86 deletions

View file

@ -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,

View file

@ -30,7 +30,6 @@ val controllerModule = module {
single<MessageCountsProvider> {
DefaultMessageCountsProvider(
preferences = get(),
accountSearchConditions = get(),
messageStoreManager = get()
)
}

View file

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

View file

@ -7,81 +7,69 @@ 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
*/
fun limitToDisplayableFolders(account: Account, search: LocalSearch) {
val displayMode = account.folderDisplayMode
/**
* Modify the supplied [LocalSearch] instance to limit the search to displayable folders.
*
* This method uses the current [folder display mode][Account.folderDisplayMode] to decide what folders to
* include/exclude.
*/
fun LocalSearch.limitToDisplayableFolders(account: Account) {
when (account.folderDisplayMode) {
FolderMode.FIRST_CLASS -> {
// Count messages in the INBOX and non-special first class folders
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
and(SearchField.DISPLAY_CLASS, FolderClass.FIRST_CLASS.name, Attribute.EQUALS)
when (displayMode) {
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)
}
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)
// 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
if (root.mRight != null) {
root.mRight.or(searchCondition)
} else {
search.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)
}
FolderMode.ALL, FolderMode.NONE -> {
// Count messages in the INBOX and non-special folders
// TODO: Create a proper interface for creating arbitrary condition trees
val searchCondition = SearchCondition(
SearchField.DISPLAY_CLASS, Attribute.EQUALS, FolderClass.SECOND_CLASS.name
)
val root = conditions
if (root.mRight != null) {
root.mRight.or(searchCondition)
} else {
or(searchCondition)
}
}
}
/**
* Modify the supplied [LocalSearch] instance to exclude special folders.
*
* Currently the following folders are excluded:
*
* * 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.
*/
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)
account.inboxFolderId?.let { inboxFolderId ->
search.or(SearchCondition(SearchField.FOLDER, Attribute.EQUALS, inboxFolderId.toString()))
FolderMode.NOT_SECOND_CLASS -> {
// Count messages in the INBOX and non-special non-second-class folders
and(SearchField.DISPLAY_CLASS, FolderClass.SECOND_CLASS.name, Attribute.NOT_EQUALS)
}
}
private fun excludeSpecialFolder(search: LocalSearch, folderId: Long?) {
if (folderId != null) {
search.and(SearchField.FOLDER, folderId.toString(), Attribute.NOT_EQUALS)
FolderMode.ALL, FolderMode.NONE -> {
// Count messages in the INBOX and non-special folders
}
}
}
/**
* Modify the supplied [LocalSearch] instance to exclude special folders.
*
* Currently the following folders are excluded:
* - 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.
*/
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 ->
or(SearchCondition(SearchField.FOLDER, Attribute.EQUALS, inboxFolderId.toString()))
}
}
private fun LocalSearch.excludeSpecialFolder(folderId: Long?) {
if (folderId != null) {
and(SearchField.FOLDER, folderId.toString(), Attribute.NOT_EQUALS)
}
}

View file

@ -1,7 +0,0 @@
package com.fsck.k9.search
import org.koin.dsl.module
val searchModule = module {
single { AccountSearchConditions() }
}