Loading app/core/src/main/java/com/fsck/k9/mailstore/FolderRepository.kt +33 −3 Original line number Diff line number Diff line Loading @@ -3,20 +3,37 @@ package com.fsck.k9.mailstore import com.fsck.k9.Account import com.fsck.k9.Account.FolderMode import com.fsck.k9.mail.Folder.FolderClass import com.fsck.k9.mail.Folder.FolderType as RemoteFolderType class FolderRepository(private val account: Account) { class FolderRepository( private val specialFolderSelectionStrategy: SpecialFolderSelectionStrategy, private val account: Account ) { private val sortForDisplay = compareByDescending<LocalFolder> { it.serverId == account.inboxFolder } .thenByDescending { it.serverId == account.outboxFolder } .thenByDescending { it.isInTopGroup } .thenBy(String.CASE_INSENSITIVE_ORDER) { it.name } fun getRemoteFolders(): List<Folder> { fun getRemoteFolderInfo(): RemoteFolderInfo { val folders = getRemoteFolders() val automaticSpecialFolders = mapOf( FolderType.ARCHIVE to specialFolderSelectionStrategy.selectSpecialFolder(folders, FolderType.ARCHIVE), FolderType.DRAFTS to specialFolderSelectionStrategy.selectSpecialFolder(folders, FolderType.DRAFTS), FolderType.SENT to specialFolderSelectionStrategy.selectSpecialFolder(folders, FolderType.SENT), FolderType.SPAM to specialFolderSelectionStrategy.selectSpecialFolder(folders, FolderType.SPAM), FolderType.TRASH to specialFolderSelectionStrategy.selectSpecialFolder(folders, FolderType.TRASH) ) return RemoteFolderInfo(folders, automaticSpecialFolders) } private fun getRemoteFolders(): List<Folder> { val folders = account.localStore.getPersonalNamespaces(false) return folders .filterNot { it.isLocalOnly } .map(::createFolderFromLocalFolder) .map { Folder(it.databaseId, it.serverId, it.name, it.type.toFolderType()) } } fun getDisplayFolders(): List<Folder> { Loading Loading @@ -55,10 +72,23 @@ class FolderRepository(private val account: Account) { account.spamFolder -> FolderType.SPAM else -> FolderType.REGULAR } private fun RemoteFolderType.toFolderType(): FolderType = when (this) { RemoteFolderType.REGULAR -> FolderType.REGULAR RemoteFolderType.INBOX -> FolderType.INBOX RemoteFolderType.OUTBOX -> FolderType.REGULAR // We currently don't support remote Outbox folders RemoteFolderType.DRAFTS -> FolderType.DRAFTS RemoteFolderType.SENT -> FolderType.SENT RemoteFolderType.TRASH -> FolderType.TRASH RemoteFolderType.SPAM -> FolderType.SPAM RemoteFolderType.ARCHIVE -> FolderType.ARCHIVE } } data class Folder(val id: Long, val serverId: String, val name: String, val type: FolderType) data class RemoteFolderInfo(val folders: List<Folder>, val automaticSpecialFolders: Map<FolderType, Folder?>) enum class FolderType { REGULAR, INBOX, Loading app/core/src/main/java/com/fsck/k9/mailstore/FolderRepositoryManager.kt +2 −2 Original line number Diff line number Diff line Loading @@ -2,6 +2,6 @@ package com.fsck.k9.mailstore import com.fsck.k9.Account class FolderRepositoryManager { fun getFolderRepository(account: Account) = FolderRepository(account) class FolderRepositoryManager(private val specialFolderSelectionStrategy: SpecialFolderSelectionStrategy) { fun getFolderRepository(account: Account) = FolderRepository(specialFolderSelectionStrategy, account) } app/core/src/main/java/com/fsck/k9/mailstore/KoinModule.kt +2 −1 Original line number Diff line number Diff line Loading @@ -3,8 +3,9 @@ package com.fsck.k9.mailstore import org.koin.dsl.module.applicationContext val mailStoreModule = applicationContext { bean { FolderRepositoryManager() } bean { FolderRepositoryManager(get()) } bean { MessageViewInfoExtractor(get(), get(), get()) } bean { StorageManager.getInstance(get()) } bean { SearchStatusManager() } bean { SpecialFolderSelectionStrategy() } } app/core/src/main/java/com/fsck/k9/mailstore/SpecialFolderSelectionStrategy.kt 0 → 100644 +10 −0 Original line number Diff line number Diff line package com.fsck.k9.mailstore /** * Implements the automatic special folder selection strategy. */ class SpecialFolderSelectionStrategy { fun selectSpecialFolder(folders: List<Folder>, type: FolderType): Folder? { return folders.firstOrNull { folder -> folder.type == type } } } app/ui/src/main/java/com/fsck/k9/ui/settings/account/AccountSettingsDataStore.kt +42 −15 Original line number Diff line number Diff line Loading @@ -3,9 +3,9 @@ package com.fsck.k9.ui.settings.account import android.content.Context import android.support.v7.preference.PreferenceDataStore import com.fsck.k9.Account import com.fsck.k9.Account.SpecialFolderSelection import com.fsck.k9.Preferences import com.fsck.k9.service.MailService import com.fsck.k9.ui.settings.account.FolderListPreference.Companion.NO_FOLDER_SELECTED_VALUE import java.util.concurrent.ExecutorService class AccountSettingsDataStore( Loading Loading @@ -127,15 +127,17 @@ class AccountSettingsDataStore( "message_format" -> account.messageFormat.name "quote_style" -> account.quoteStyle.name "account_quote_prefix" -> account.quotePrefix "account_setup_auto_expand_folder" -> account.autoExpandFolder.toFolderPreferenceValue() "account_setup_auto_expand_folder" -> { loadSpecialFolder(account.autoExpandFolder, SpecialFolderSelection.MANUAL) } "folder_display_mode" -> account.folderDisplayMode.name "folder_target_mode" -> account.folderTargetMode.name "searchable_folders" -> account.searchableFolders.name "archive_folder" -> account.archiveFolder.toFolderPreferenceValue() "drafts_folder" -> account.draftsFolder.toFolderPreferenceValue() "sent_folder" -> account.sentFolder.toFolderPreferenceValue() "spam_folder" -> account.spamFolder.toFolderPreferenceValue() "trash_folder" -> account.trashFolder.toFolderPreferenceValue() "archive_folder" -> loadSpecialFolder(account.archiveFolder, account.archiveFolderSelection) "drafts_folder" -> loadSpecialFolder(account.draftsFolder, account.draftsFolderSelection) "sent_folder" -> loadSpecialFolder(account.sentFolder, account.sentFolderSelection) "spam_folder" -> loadSpecialFolder(account.spamFolder, account.spamFolderSelection) "trash_folder" -> loadSpecialFolder(account.trashFolder, account.trashFolderSelection) "folder_notify_new_mail_mode" -> account.folderNotifyNewMailMode.name "account_vibrate_pattern" -> account.notificationSetting.vibratePattern.toString() "account_vibrate_times" -> account.notificationSetting.vibrateTimes.toString() Loading Loading @@ -177,15 +179,15 @@ class AccountSettingsDataStore( "message_format" -> account.messageFormat = Account.MessageFormat.valueOf(value) "quote_style" -> account.quoteStyle = Account.QuoteStyle.valueOf(value) "account_quote_prefix" -> account.quotePrefix = value "account_setup_auto_expand_folder" -> account.autoExpandFolder = value.toFolderStorageValue() "account_setup_auto_expand_folder" -> account.autoExpandFolder = extractFolderName(value) "folder_display_mode" -> account.folderDisplayMode = Account.FolderMode.valueOf(value) "folder_target_mode" -> account.folderTargetMode = Account.FolderMode.valueOf(value) "searchable_folders" -> account.searchableFolders = Account.Searchable.valueOf(value) "archive_folder" -> account.archiveFolder = value.toFolderStorageValue() "drafts_folder" -> account.draftsFolder = value.toFolderStorageValue() "sent_folder" -> account.sentFolder = value.toFolderStorageValue() "spam_folder" -> account.spamFolder = value.toFolderStorageValue() "trash_folder" -> account.trashFolder = value.toFolderStorageValue() "archive_folder" -> saveSpecialFolderSelection(value, account::setArchiveFolder) "drafts_folder" -> saveSpecialFolderSelection(value, account::setDraftsFolder) "sent_folder" -> saveSpecialFolderSelection(value, account::setSentFolder) "spam_folder" -> saveSpecialFolderSelection(value, account::setSpamFolder) "trash_folder" -> saveSpecialFolderSelection(value, account::setTrashFolder) "folder_notify_new_mail_mode" -> account.folderNotifyNewMailMode = Account.FolderMode.valueOf(value) "account_vibrate_pattern" -> account.notificationSetting.vibratePattern = value.toInt() "account_vibrate_times" -> account.notificationSetting.vibrateTimes = value.toInt() Loading Loading @@ -225,7 +227,32 @@ class AccountSettingsDataStore( MailService.actionRestartPushers(context, null) } private fun String.toFolderStorageValue() = if (this == NO_FOLDER_SELECTED_VALUE) null else this private fun extractFolderName(preferenceValue: String): String? { val folderValue = preferenceValue.substringAfter(FolderListPreference.FOLDER_VALUE_DELIMITER) return if (folderValue == FolderListPreference.NO_FOLDER_VALUE) null else folderValue } private fun saveSpecialFolderSelection( preferenceValue: String, specialFolderSetter: (String?, SpecialFolderSelection) -> Unit ) { val specialFolder = extractFolderName(preferenceValue) val specialFolderSelection = if (preferenceValue.startsWith(FolderListPreference.AUTOMATIC_PREFIX)) { SpecialFolderSelection.AUTOMATIC } else { SpecialFolderSelection.MANUAL } specialFolderSetter(specialFolder, specialFolderSelection) } private fun String?.toFolderPreferenceValue() = this ?: NO_FOLDER_SELECTED_VALUE private fun loadSpecialFolder(specialFolder: String?, specialFolderSelection: SpecialFolderSelection): String { val prefix = when (specialFolderSelection) { SpecialFolderSelection.AUTOMATIC -> FolderListPreference.AUTOMATIC_PREFIX SpecialFolderSelection.MANUAL -> FolderListPreference.MANUAL_PREFIX } return prefix + (specialFolder ?: FolderListPreference.NO_FOLDER_VALUE) } } Loading
app/core/src/main/java/com/fsck/k9/mailstore/FolderRepository.kt +33 −3 Original line number Diff line number Diff line Loading @@ -3,20 +3,37 @@ package com.fsck.k9.mailstore import com.fsck.k9.Account import com.fsck.k9.Account.FolderMode import com.fsck.k9.mail.Folder.FolderClass import com.fsck.k9.mail.Folder.FolderType as RemoteFolderType class FolderRepository(private val account: Account) { class FolderRepository( private val specialFolderSelectionStrategy: SpecialFolderSelectionStrategy, private val account: Account ) { private val sortForDisplay = compareByDescending<LocalFolder> { it.serverId == account.inboxFolder } .thenByDescending { it.serverId == account.outboxFolder } .thenByDescending { it.isInTopGroup } .thenBy(String.CASE_INSENSITIVE_ORDER) { it.name } fun getRemoteFolders(): List<Folder> { fun getRemoteFolderInfo(): RemoteFolderInfo { val folders = getRemoteFolders() val automaticSpecialFolders = mapOf( FolderType.ARCHIVE to specialFolderSelectionStrategy.selectSpecialFolder(folders, FolderType.ARCHIVE), FolderType.DRAFTS to specialFolderSelectionStrategy.selectSpecialFolder(folders, FolderType.DRAFTS), FolderType.SENT to specialFolderSelectionStrategy.selectSpecialFolder(folders, FolderType.SENT), FolderType.SPAM to specialFolderSelectionStrategy.selectSpecialFolder(folders, FolderType.SPAM), FolderType.TRASH to specialFolderSelectionStrategy.selectSpecialFolder(folders, FolderType.TRASH) ) return RemoteFolderInfo(folders, automaticSpecialFolders) } private fun getRemoteFolders(): List<Folder> { val folders = account.localStore.getPersonalNamespaces(false) return folders .filterNot { it.isLocalOnly } .map(::createFolderFromLocalFolder) .map { Folder(it.databaseId, it.serverId, it.name, it.type.toFolderType()) } } fun getDisplayFolders(): List<Folder> { Loading Loading @@ -55,10 +72,23 @@ class FolderRepository(private val account: Account) { account.spamFolder -> FolderType.SPAM else -> FolderType.REGULAR } private fun RemoteFolderType.toFolderType(): FolderType = when (this) { RemoteFolderType.REGULAR -> FolderType.REGULAR RemoteFolderType.INBOX -> FolderType.INBOX RemoteFolderType.OUTBOX -> FolderType.REGULAR // We currently don't support remote Outbox folders RemoteFolderType.DRAFTS -> FolderType.DRAFTS RemoteFolderType.SENT -> FolderType.SENT RemoteFolderType.TRASH -> FolderType.TRASH RemoteFolderType.SPAM -> FolderType.SPAM RemoteFolderType.ARCHIVE -> FolderType.ARCHIVE } } data class Folder(val id: Long, val serverId: String, val name: String, val type: FolderType) data class RemoteFolderInfo(val folders: List<Folder>, val automaticSpecialFolders: Map<FolderType, Folder?>) enum class FolderType { REGULAR, INBOX, Loading
app/core/src/main/java/com/fsck/k9/mailstore/FolderRepositoryManager.kt +2 −2 Original line number Diff line number Diff line Loading @@ -2,6 +2,6 @@ package com.fsck.k9.mailstore import com.fsck.k9.Account class FolderRepositoryManager { fun getFolderRepository(account: Account) = FolderRepository(account) class FolderRepositoryManager(private val specialFolderSelectionStrategy: SpecialFolderSelectionStrategy) { fun getFolderRepository(account: Account) = FolderRepository(specialFolderSelectionStrategy, account) }
app/core/src/main/java/com/fsck/k9/mailstore/KoinModule.kt +2 −1 Original line number Diff line number Diff line Loading @@ -3,8 +3,9 @@ package com.fsck.k9.mailstore import org.koin.dsl.module.applicationContext val mailStoreModule = applicationContext { bean { FolderRepositoryManager() } bean { FolderRepositoryManager(get()) } bean { MessageViewInfoExtractor(get(), get(), get()) } bean { StorageManager.getInstance(get()) } bean { SearchStatusManager() } bean { SpecialFolderSelectionStrategy() } }
app/core/src/main/java/com/fsck/k9/mailstore/SpecialFolderSelectionStrategy.kt 0 → 100644 +10 −0 Original line number Diff line number Diff line package com.fsck.k9.mailstore /** * Implements the automatic special folder selection strategy. */ class SpecialFolderSelectionStrategy { fun selectSpecialFolder(folders: List<Folder>, type: FolderType): Folder? { return folders.firstOrNull { folder -> folder.type == type } } }
app/ui/src/main/java/com/fsck/k9/ui/settings/account/AccountSettingsDataStore.kt +42 −15 Original line number Diff line number Diff line Loading @@ -3,9 +3,9 @@ package com.fsck.k9.ui.settings.account import android.content.Context import android.support.v7.preference.PreferenceDataStore import com.fsck.k9.Account import com.fsck.k9.Account.SpecialFolderSelection import com.fsck.k9.Preferences import com.fsck.k9.service.MailService import com.fsck.k9.ui.settings.account.FolderListPreference.Companion.NO_FOLDER_SELECTED_VALUE import java.util.concurrent.ExecutorService class AccountSettingsDataStore( Loading Loading @@ -127,15 +127,17 @@ class AccountSettingsDataStore( "message_format" -> account.messageFormat.name "quote_style" -> account.quoteStyle.name "account_quote_prefix" -> account.quotePrefix "account_setup_auto_expand_folder" -> account.autoExpandFolder.toFolderPreferenceValue() "account_setup_auto_expand_folder" -> { loadSpecialFolder(account.autoExpandFolder, SpecialFolderSelection.MANUAL) } "folder_display_mode" -> account.folderDisplayMode.name "folder_target_mode" -> account.folderTargetMode.name "searchable_folders" -> account.searchableFolders.name "archive_folder" -> account.archiveFolder.toFolderPreferenceValue() "drafts_folder" -> account.draftsFolder.toFolderPreferenceValue() "sent_folder" -> account.sentFolder.toFolderPreferenceValue() "spam_folder" -> account.spamFolder.toFolderPreferenceValue() "trash_folder" -> account.trashFolder.toFolderPreferenceValue() "archive_folder" -> loadSpecialFolder(account.archiveFolder, account.archiveFolderSelection) "drafts_folder" -> loadSpecialFolder(account.draftsFolder, account.draftsFolderSelection) "sent_folder" -> loadSpecialFolder(account.sentFolder, account.sentFolderSelection) "spam_folder" -> loadSpecialFolder(account.spamFolder, account.spamFolderSelection) "trash_folder" -> loadSpecialFolder(account.trashFolder, account.trashFolderSelection) "folder_notify_new_mail_mode" -> account.folderNotifyNewMailMode.name "account_vibrate_pattern" -> account.notificationSetting.vibratePattern.toString() "account_vibrate_times" -> account.notificationSetting.vibrateTimes.toString() Loading Loading @@ -177,15 +179,15 @@ class AccountSettingsDataStore( "message_format" -> account.messageFormat = Account.MessageFormat.valueOf(value) "quote_style" -> account.quoteStyle = Account.QuoteStyle.valueOf(value) "account_quote_prefix" -> account.quotePrefix = value "account_setup_auto_expand_folder" -> account.autoExpandFolder = value.toFolderStorageValue() "account_setup_auto_expand_folder" -> account.autoExpandFolder = extractFolderName(value) "folder_display_mode" -> account.folderDisplayMode = Account.FolderMode.valueOf(value) "folder_target_mode" -> account.folderTargetMode = Account.FolderMode.valueOf(value) "searchable_folders" -> account.searchableFolders = Account.Searchable.valueOf(value) "archive_folder" -> account.archiveFolder = value.toFolderStorageValue() "drafts_folder" -> account.draftsFolder = value.toFolderStorageValue() "sent_folder" -> account.sentFolder = value.toFolderStorageValue() "spam_folder" -> account.spamFolder = value.toFolderStorageValue() "trash_folder" -> account.trashFolder = value.toFolderStorageValue() "archive_folder" -> saveSpecialFolderSelection(value, account::setArchiveFolder) "drafts_folder" -> saveSpecialFolderSelection(value, account::setDraftsFolder) "sent_folder" -> saveSpecialFolderSelection(value, account::setSentFolder) "spam_folder" -> saveSpecialFolderSelection(value, account::setSpamFolder) "trash_folder" -> saveSpecialFolderSelection(value, account::setTrashFolder) "folder_notify_new_mail_mode" -> account.folderNotifyNewMailMode = Account.FolderMode.valueOf(value) "account_vibrate_pattern" -> account.notificationSetting.vibratePattern = value.toInt() "account_vibrate_times" -> account.notificationSetting.vibrateTimes = value.toInt() Loading Loading @@ -225,7 +227,32 @@ class AccountSettingsDataStore( MailService.actionRestartPushers(context, null) } private fun String.toFolderStorageValue() = if (this == NO_FOLDER_SELECTED_VALUE) null else this private fun extractFolderName(preferenceValue: String): String? { val folderValue = preferenceValue.substringAfter(FolderListPreference.FOLDER_VALUE_DELIMITER) return if (folderValue == FolderListPreference.NO_FOLDER_VALUE) null else folderValue } private fun saveSpecialFolderSelection( preferenceValue: String, specialFolderSetter: (String?, SpecialFolderSelection) -> Unit ) { val specialFolder = extractFolderName(preferenceValue) val specialFolderSelection = if (preferenceValue.startsWith(FolderListPreference.AUTOMATIC_PREFIX)) { SpecialFolderSelection.AUTOMATIC } else { SpecialFolderSelection.MANUAL } specialFolderSetter(specialFolder, specialFolderSelection) } private fun String?.toFolderPreferenceValue() = this ?: NO_FOLDER_SELECTED_VALUE private fun loadSpecialFolder(specialFolder: String?, specialFolderSelection: SpecialFolderSelection): String { val prefix = when (specialFolderSelection) { SpecialFolderSelection.AUTOMATIC -> FolderListPreference.AUTOMATIC_PREFIX SpecialFolderSelection.MANUAL -> FolderListPreference.MANUAL_PREFIX } return prefix + (specialFolder ?: FolderListPreference.NO_FOLDER_VALUE) } }