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

Commit 5e00abfa authored by cketti's avatar cketti
Browse files

Add support for SpecialFolderSelection to FolderListPreference

parent a519c91b
Loading
Loading
Loading
Loading
+33 −3
Original line number Diff line number Diff line
@@ -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> {
@@ -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,
+2 −2
Original line number Diff line number Diff line
@@ -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)
}
+2 −1
Original line number Diff line number Diff line
@@ -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() }
}
+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 }
    }
}
+42 −15
Original line number Diff line number Diff line
@@ -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(
@@ -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()
@@ -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()
@@ -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