Loading app/core/src/main/java/com/fsck/k9/mailstore/FolderMapper.kt 0 → 100644 +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 } app/core/src/main/java/com/fsck/k9/mailstore/FolderRepository.kt +30 −93 Original line number Diff line number Diff line Loading @@ -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 = Loading Loading @@ -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 Loading Loading @@ -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 } } Loading @@ -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) { Loading app/core/src/main/java/com/fsck/k9/mailstore/FolderRepositoryManager.kt +5 −2 Original line number Diff line number Diff line Loading @@ -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) } app/core/src/main/java/com/fsck/k9/mailstore/KoinModule.kt +1 −1 Original line number Diff line number Diff line Loading @@ -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() } Loading app/core/src/main/java/com/fsck/k9/mailstore/MessageStore.kt +8 −0 Original line number Diff line number Diff line Loading @@ -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
app/core/src/main/java/com/fsck/k9/mailstore/FolderMapper.kt 0 → 100644 +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 }
app/core/src/main/java/com/fsck/k9/mailstore/FolderRepository.kt +30 −93 Original line number Diff line number Diff line Loading @@ -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 = Loading Loading @@ -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 Loading Loading @@ -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 } } Loading @@ -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) { Loading
app/core/src/main/java/com/fsck/k9/mailstore/FolderRepositoryManager.kt +5 −2 Original line number Diff line number Diff line Loading @@ -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) }
app/core/src/main/java/com/fsck/k9/mailstore/KoinModule.kt +1 −1 Original line number Diff line number Diff line Loading @@ -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() } Loading
app/core/src/main/java/com/fsck/k9/mailstore/MessageStore.kt +8 −0 Original line number Diff line number Diff line Loading @@ -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? }