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

Commit 0250736c authored by cketti's avatar cketti
Browse files

Move code to read a single folder from FolderRepository to MessageStore

parent d5e43594
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
package com.fsck.k9.mailstore

import com.fsck.k9.mail.FolderClass
import com.fsck.k9.mail.FolderType

fun interface FolderMapper<T> {
    fun map(folder: FolderDetailsAccessor): T
}

interface FolderDetailsAccessor {
    val id: Long
    val serverId: String
    val name: String
    val type: FolderType
    val isLocalOnly: Boolean
    val isInTopGroup: Boolean
    val isIntegrate: Boolean
    val syncClass: FolderClass
    val displayClass: FolderClass
    val notifyClass: FolderClass
    val pushClass: FolderClass
}
+30 −93
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@ import com.fsck.k9.mail.FolderType as RemoteFolderType

class FolderRepository(
    private val localStoreProvider: LocalStoreProvider,
    private val messageStoreManager: MessageStoreManager,
    private val account: Account
) {
    private val sortForDisplay =
@@ -38,78 +39,36 @@ class FolderRepository(
    }

    fun getFolder(folderId: Long): Folder? {
        val database = localStoreProvider.getInstance(account).database
        return database.execute(false) { db ->
            db.query(
                "folders",
                arrayOf(
                    "id",
                    "name",
                    "local_only"
                ),
                "id = ?",
                arrayOf(folderId.toString()),
                null,
                null,
                null
            ).use { cursor ->
                if (cursor.moveToFirst()) {
                    val id = cursor.getLong(0)
        val messageStore = messageStoreManager.getMessageStore(account)
        return messageStore.getFolder(folderId) { folder ->
            Folder(
                        id = id,
                        name = cursor.getString(1),
                        type = folderTypeOf(id),
                        isLocalOnly = cursor.getInt(2) == 1
                id = folder.id,
                name = folder.name,
                type = folderTypeOf(folder.id),
                isLocalOnly = folder.isLocalOnly
            )
                } else {
                    null
                }
            }
        }
    }

    fun getFolderDetails(folderId: Long): FolderDetails? {
        val database = localStoreProvider.getInstance(account).database
        return database.execute(false) { db ->
            db.query(
                "folders",
                arrayOf(
                    "id",
                    "name",
                    "top_group",
                    "integrate",
                    "poll_class",
                    "display_class",
                    "notify_class",
                    "push_class",
                    "local_only"
                ),
                "id = ?",
                arrayOf(folderId.toString()),
                null,
                null,
                null
            ).use { cursor ->
                cursor.map {
                    val id = cursor.getLong(0)
        val messageStore = messageStoreManager.getMessageStore(account)
        return messageStore.getFolder(folderId) { folder ->
            FolderDetails(
                folder = Folder(
                            id = id,
                            name = cursor.getString(1),
                            type = folderTypeOf(id),
                            isLocalOnly = cursor.getInt(8) == 1
                    id = folder.id,
                    name = folder.name,
                    type = folderTypeOf(folder.id),
                    isLocalOnly = folder.isLocalOnly
                ),
                        isInTopGroup = cursor.getInt(2) == 1,
                        isIntegrate = cursor.getInt(3) == 1,
                        syncClass = cursor.getStringOrNull(4).toFolderClass(),
                        displayClass = cursor.getStringOrNull(5).toFolderClass(),
                        notifyClass = cursor.getStringOrNull(6).toFolderClass(),
                        pushClass = cursor.getStringOrNull(7).toFolderClass()
                isInTopGroup = folder.isInTopGroup,
                isIntegrate = folder.isIntegrate,
                syncClass = folder.syncClass,
                displayClass = folder.displayClass,
                notifyClass = folder.notifyClass,
                pushClass = folder.pushClass
            )
        }
    }
        }.firstOrNull()
    }

    fun getRemoteFolderDetails(): List<RemoteFolderDetails> {
        val database = localStoreProvider.getInstance(account).database
@@ -156,19 +115,9 @@ class FolderRepository(
    }

    fun getFolderServerId(folderId: Long): String? {
        val database = localStoreProvider.getInstance(account).database
        return database.execute(false) { db ->
            db.query(
                "folders",
                arrayOf("server_id"),
                "id = ?",
                arrayOf(folderId.toString()),
                null,
                null,
                null
            ).use { cursor ->
                if (cursor.moveToFirst()) cursor.getString(0) else null
            }
        val messageStore = messageStoreManager.getMessageStore(account)
        return messageStore.getFolder(folderId) { folder ->
            folder.serverId
        }
    }

@@ -190,20 +139,8 @@ class FolderRepository(
    }

    fun isFolderPresent(folderId: Long): Boolean {
        val database = localStoreProvider.getInstance(account).database
        return database.execute(false) { db ->
            db.query(
                "folders",
                arrayOf("id"),
                "id = ?",
                arrayOf(folderId.toString()),
                null,
                null,
                null
            ).use { cursor ->
                cursor.count != 0
            }
        }
        val messageStore = messageStoreManager.getMessageStore(account)
        return messageStore.getFolder(folderId) { true } ?: false
    }

    fun updateFolderDetails(folderDetails: FolderDetails) {
+5 −2
Original line number Diff line number Diff line
@@ -2,6 +2,9 @@ package com.fsck.k9.mailstore

import com.fsck.k9.Account

class FolderRepositoryManager(private val localStoreProvider: LocalStoreProvider) {
    fun getFolderRepository(account: Account) = FolderRepository(localStoreProvider, account)
class FolderRepositoryManager(
    private val localStoreProvider: LocalStoreProvider,
    private val messageStoreManager: MessageStoreManager
) {
    fun getFolderRepository(account: Account) = FolderRepository(localStoreProvider, messageStoreManager, account)
}
+1 −1
Original line number Diff line number Diff line
@@ -3,7 +3,7 @@ package com.fsck.k9.mailstore
import org.koin.dsl.module

val mailStoreModule = module {
    single { FolderRepositoryManager(get()) }
    single { FolderRepositoryManager(localStoreProvider = get(), messageStoreManager = get()) }
    single { MessageViewInfoExtractorFactory(get(), get(), get()) }
    single { StorageManager.getInstance(get()) }
    single { SearchStatusManager() }
+8 −0
Original line number Diff line number Diff line
@@ -52,4 +52,12 @@ interface MessageStore {
     * Retrieve the header fields of a message.
     */
    fun getHeaders(folderId: Long, messageServerId: String): List<Header>

    /**
     * Retrieve information about a folder.
     *
     * @param mapper A function to map the values read from the store to a domain-specific object.
     * @return The value returned by [mapper] or `null` if the folder wasn't found.
     */
    fun <T> getFolder(folderId: Long, mapper: FolderMapper<T>): T?
}
Loading