Loading app/core/src/main/java/com/fsck/k9/mailstore/K9BackendStorage.kt +4 −51 Original line number Diff line number Diff line package com.fsck.k9.mailstore import android.content.ContentValues import android.database.Cursor import android.database.sqlite.SQLiteDatabase import androidx.core.database.getStringOrNull import com.fsck.k9.backend.api.BackendFolder import com.fsck.k9.backend.api.BackendFolderUpdater import com.fsck.k9.backend.api.BackendStorage Loading Loading @@ -31,64 +28,20 @@ class K9BackendStorage( } override fun getExtraString(name: String): String? { return database.execute(false) { db -> val cursor = db.query( "account_extra_values", arrayOf("value_text"), "name = ?", arrayOf(name), null, null, null ) cursor.use { if (it.moveToFirst()) { it.getStringOrNull(0) } else { null } } } return messageStore.getExtraString(name) } override fun setExtraString(name: String, value: String) { database.execute(false) { db -> val contentValues = ContentValues().apply { put("name", name) put("value_text", value) } db.insertWithOnConflict("account_extra_values", null, contentValues, SQLiteDatabase.CONFLICT_REPLACE) } messageStore.setExtraString(name, value) } override fun getExtraNumber(name: String): Long? { return database.execute(false) { db -> val cursor = db.query( "account_extra_values", arrayOf("value_integer"), "name = ?", arrayOf(name), null, null, null ) cursor.use { if (it.moveToFirst()) { it.getLongOrNull(0) } else { null } } } return messageStore.getExtraNumber(name) } override fun setExtraNumber(name: String, value: Long) { database.execute(false) { db -> val contentValues = ContentValues().apply { put("name", name) put("value_integer", value) } db.insertWithOnConflict("account_extra_values", null, contentValues, SQLiteDatabase.CONFLICT_REPLACE) messageStore.setExtraNumber(name, value) } } private fun Cursor.getLongOrNull(columnIndex: Int): Long? = if (isNull(columnIndex)) null else getLong(columnIndex) private inner class K9BackendFolderUpdater : BackendFolderUpdater { init { Loading app/core/src/main/java/com/fsck/k9/mailstore/MessageStore.kt +22 −0 Original line number Diff line number Diff line Loading @@ -107,4 +107,26 @@ interface MessageStore { * Update the notification class of a folder. */ fun setNotificationClass(folderId: Long, folderClass: FolderClass) /** * Retrieve a string property by name. * * For everything that doesn't fit into existing structures this message store offers a generic key/value store. */ fun getExtraString(name: String): String? /** * Create or update a string property. */ fun setExtraString(name: String, value: String) /** * Retrieve a number property by name. */ fun getExtraNumber(name: String): Long? /** * Create or update a number property. */ fun setExtraNumber(name: String, value: Long) } app/storage/build.gradle +1 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ dependencies { api "org.koin:koin-core:${versions.koin}" implementation project(":app:core") implementation "androidx.core:core-ktx:${versions.androidxCore}" implementation "com.jakewharton.timber:timber:${versions.timber}" implementation "org.apache.james:apache-mime4j-core:${versions.mime4j}" implementation "com.squareup.moshi:moshi:${versions.moshi}" Loading app/storage/src/main/java/com/fsck/k9/storage/messages/K9MessageStore.kt +17 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ class K9MessageStore(private val localStore: LocalStore) : MessageStore { private val retrieveMessageOperations = RetrieveMessageOperations(database) private val retrieveFolderOperations = RetrieveFolderOperations(database) private val updateFolderOperations = UpdateFolderOperations(database) private val keyValueStoreOperations = KeyValueStoreOperations(database) override fun moveMessage(messageId: Long, destinationFolderId: Long): Long { return moveMessageOperations.moveMessage(messageId, destinationFolderId).also { Loading Loading @@ -82,4 +83,20 @@ class K9MessageStore(private val localStore: LocalStore) : MessageStore { override fun setNotificationClass(folderId: Long, folderClass: FolderClass) { updateFolderOperations.setNotificationClass(folderId, folderClass) } override fun getExtraString(name: String): String? { return keyValueStoreOperations.getExtraString(name) } override fun setExtraString(name: String, value: String) { keyValueStoreOperations.setExtraString(name, value) } override fun getExtraNumber(name: String): Long? { return keyValueStoreOperations.getExtraNumber(name) } override fun setExtraNumber(name: String, value: Long) { keyValueStoreOperations.setExtraNumber(name, value) } } app/storage/src/main/java/com/fsck/k9/storage/messages/KeyValueStoreOperations.kt 0 → 100644 +65 −0 Original line number Diff line number Diff line package com.fsck.k9.storage.messages import android.content.ContentValues import android.database.sqlite.SQLiteDatabase import androidx.core.database.getLongOrNull import androidx.core.database.getStringOrNull import com.fsck.k9.mailstore.LockableDatabase internal class KeyValueStoreOperations(private val lockableDatabase: LockableDatabase) { fun getExtraString(name: String): String? { return lockableDatabase.execute(false) { db -> db.query( "account_extra_values", arrayOf("value_text"), "name = ?", arrayOf(name), null, null, null ).use { cursor -> if (cursor.moveToFirst()) { cursor.getStringOrNull(0) } else { null } } } } fun setExtraString(name: String, value: String) { lockableDatabase.execute(false) { db -> val contentValues = ContentValues().apply { put("name", name) put("value_text", value) } db.insertWithOnConflict("account_extra_values", null, contentValues, SQLiteDatabase.CONFLICT_REPLACE) } } fun getExtraNumber(name: String): Long? { return lockableDatabase.execute(false) { db -> db.query( "account_extra_values", arrayOf("value_integer"), "name = ?", arrayOf(name), null, null, null ).use { cursor -> if (cursor.moveToFirst()) { cursor.getLongOrNull(0) } else { null } } } } fun setExtraNumber(name: String, value: Long) { lockableDatabase.execute(false) { db -> val contentValues = ContentValues().apply { put("name", name) put("value_integer", value) } db.insertWithOnConflict("account_extra_values", null, contentValues, SQLiteDatabase.CONFLICT_REPLACE) } } } Loading
app/core/src/main/java/com/fsck/k9/mailstore/K9BackendStorage.kt +4 −51 Original line number Diff line number Diff line package com.fsck.k9.mailstore import android.content.ContentValues import android.database.Cursor import android.database.sqlite.SQLiteDatabase import androidx.core.database.getStringOrNull import com.fsck.k9.backend.api.BackendFolder import com.fsck.k9.backend.api.BackendFolderUpdater import com.fsck.k9.backend.api.BackendStorage Loading Loading @@ -31,64 +28,20 @@ class K9BackendStorage( } override fun getExtraString(name: String): String? { return database.execute(false) { db -> val cursor = db.query( "account_extra_values", arrayOf("value_text"), "name = ?", arrayOf(name), null, null, null ) cursor.use { if (it.moveToFirst()) { it.getStringOrNull(0) } else { null } } } return messageStore.getExtraString(name) } override fun setExtraString(name: String, value: String) { database.execute(false) { db -> val contentValues = ContentValues().apply { put("name", name) put("value_text", value) } db.insertWithOnConflict("account_extra_values", null, contentValues, SQLiteDatabase.CONFLICT_REPLACE) } messageStore.setExtraString(name, value) } override fun getExtraNumber(name: String): Long? { return database.execute(false) { db -> val cursor = db.query( "account_extra_values", arrayOf("value_integer"), "name = ?", arrayOf(name), null, null, null ) cursor.use { if (it.moveToFirst()) { it.getLongOrNull(0) } else { null } } } return messageStore.getExtraNumber(name) } override fun setExtraNumber(name: String, value: Long) { database.execute(false) { db -> val contentValues = ContentValues().apply { put("name", name) put("value_integer", value) } db.insertWithOnConflict("account_extra_values", null, contentValues, SQLiteDatabase.CONFLICT_REPLACE) messageStore.setExtraNumber(name, value) } } private fun Cursor.getLongOrNull(columnIndex: Int): Long? = if (isNull(columnIndex)) null else getLong(columnIndex) private inner class K9BackendFolderUpdater : BackendFolderUpdater { init { Loading
app/core/src/main/java/com/fsck/k9/mailstore/MessageStore.kt +22 −0 Original line number Diff line number Diff line Loading @@ -107,4 +107,26 @@ interface MessageStore { * Update the notification class of a folder. */ fun setNotificationClass(folderId: Long, folderClass: FolderClass) /** * Retrieve a string property by name. * * For everything that doesn't fit into existing structures this message store offers a generic key/value store. */ fun getExtraString(name: String): String? /** * Create or update a string property. */ fun setExtraString(name: String, value: String) /** * Retrieve a number property by name. */ fun getExtraNumber(name: String): Long? /** * Create or update a number property. */ fun setExtraNumber(name: String, value: Long) }
app/storage/build.gradle +1 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ dependencies { api "org.koin:koin-core:${versions.koin}" implementation project(":app:core") implementation "androidx.core:core-ktx:${versions.androidxCore}" implementation "com.jakewharton.timber:timber:${versions.timber}" implementation "org.apache.james:apache-mime4j-core:${versions.mime4j}" implementation "com.squareup.moshi:moshi:${versions.moshi}" Loading
app/storage/src/main/java/com/fsck/k9/storage/messages/K9MessageStore.kt +17 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ class K9MessageStore(private val localStore: LocalStore) : MessageStore { private val retrieveMessageOperations = RetrieveMessageOperations(database) private val retrieveFolderOperations = RetrieveFolderOperations(database) private val updateFolderOperations = UpdateFolderOperations(database) private val keyValueStoreOperations = KeyValueStoreOperations(database) override fun moveMessage(messageId: Long, destinationFolderId: Long): Long { return moveMessageOperations.moveMessage(messageId, destinationFolderId).also { Loading Loading @@ -82,4 +83,20 @@ class K9MessageStore(private val localStore: LocalStore) : MessageStore { override fun setNotificationClass(folderId: Long, folderClass: FolderClass) { updateFolderOperations.setNotificationClass(folderId, folderClass) } override fun getExtraString(name: String): String? { return keyValueStoreOperations.getExtraString(name) } override fun setExtraString(name: String, value: String) { keyValueStoreOperations.setExtraString(name, value) } override fun getExtraNumber(name: String): Long? { return keyValueStoreOperations.getExtraNumber(name) } override fun setExtraNumber(name: String, value: Long) { keyValueStoreOperations.setExtraNumber(name, value) } }
app/storage/src/main/java/com/fsck/k9/storage/messages/KeyValueStoreOperations.kt 0 → 100644 +65 −0 Original line number Diff line number Diff line package com.fsck.k9.storage.messages import android.content.ContentValues import android.database.sqlite.SQLiteDatabase import androidx.core.database.getLongOrNull import androidx.core.database.getStringOrNull import com.fsck.k9.mailstore.LockableDatabase internal class KeyValueStoreOperations(private val lockableDatabase: LockableDatabase) { fun getExtraString(name: String): String? { return lockableDatabase.execute(false) { db -> db.query( "account_extra_values", arrayOf("value_text"), "name = ?", arrayOf(name), null, null, null ).use { cursor -> if (cursor.moveToFirst()) { cursor.getStringOrNull(0) } else { null } } } } fun setExtraString(name: String, value: String) { lockableDatabase.execute(false) { db -> val contentValues = ContentValues().apply { put("name", name) put("value_text", value) } db.insertWithOnConflict("account_extra_values", null, contentValues, SQLiteDatabase.CONFLICT_REPLACE) } } fun getExtraNumber(name: String): Long? { return lockableDatabase.execute(false) { db -> db.query( "account_extra_values", arrayOf("value_integer"), "name = ?", arrayOf(name), null, null, null ).use { cursor -> if (cursor.moveToFirst()) { cursor.getLongOrNull(0) } else { null } } } } fun setExtraNumber(name: String, value: Long) { lockableDatabase.execute(false) { db -> val contentValues = ContentValues().apply { put("name", name) put("value_integer", value) } db.insertWithOnConflict("account_extra_values", null, contentValues, SQLiteDatabase.CONFLICT_REPLACE) } } }