Loading app/core/src/main/java/com/fsck/k9/controller/MessagingController.java +1 −44 Original line number Diff line number Diff line Loading @@ -44,7 +44,6 @@ import com.fsck.k9.K9.Intents; import com.fsck.k9.Preferences; import com.fsck.k9.backend.BackendManager; import com.fsck.k9.backend.api.Backend; import com.fsck.k9.backend.api.FolderInfo; import com.fsck.k9.backend.api.SyncConfig; import com.fsck.k9.backend.api.SyncListener; import com.fsck.k9.cache.EmailProviderCache; Loading Loading @@ -423,51 +422,9 @@ public class MessagingController { List<LocalFolder> localFolders = null; try { Backend backend = getBackend(account); List<FolderInfo> folders = backend.getFolders(); backend.refreshFolderList(); LocalStore localStore = account.getLocalStore(); Map<String, String> remoteFolderNameMap = new HashMap<>(); List<LocalFolder> foldersToCreate = new LinkedList<>(); localFolders = localStore.getPersonalNamespaces(false); Set<String> localFolderServerIds = new HashSet<>(); for (Folder localFolder : localFolders) { localFolderServerIds.add(localFolder.getServerId()); } for (FolderInfo folder : folders) { String folderServerId = folder.getServerId(); if (!localFolderServerIds.contains(folderServerId)) { LocalFolder localFolder = localStore.getFolder(folderServerId); foldersToCreate.add(localFolder); } remoteFolderNameMap.put(folderServerId, folder.getName()); } localStore.createFolders(foldersToCreate, account.getDisplayCount()); localFolders = localStore.getPersonalNamespaces(false); /* * Clear out any folders that are no longer on the remote store. */ for (LocalFolder localFolder : localFolders) { String localFolderServerId = localFolder.getServerId(); // FIXME: This is a hack used to clean up when we accidentally created the // special placeholder folder "-NONE-". if (K9.FOLDER_NONE.equals(localFolderServerId)) { localFolder.delete(false); } boolean folderExistsOnServer = remoteFolderNameMap.containsKey(localFolderServerId); if (folderExistsOnServer) { String folderName = remoteFolderNameMap.get(localFolderServerId); localFolder.setName(folderName); } else if (!account.isSpecialFolder(localFolderServerId)) { localFolder.delete(false); } } localFolders = localStore.getPersonalNamespaces(false); for (MessagingListener l : getListeners(listener)) { Loading app/core/src/main/java/com/fsck/k9/mailstore/K9BackendFolder.kt +0 −20 Original line number Diff line number Diff line Loading @@ -362,26 +362,6 @@ class K9BackendFolder( } } private fun <T> LockableDatabase.query( table: String, columns: Array<String>, selection: String, vararg selectionArgs: String, block: (Cursor) -> T ): T { return execute(false) { db -> val cursor = db.query(table, columns, selection, selectionArgs, null, null, null) cursor.use(block) } } private fun <T> LockableDatabase.rawQuery(sql: String, vararg selectionArgs: String, block: (Cursor) -> T): T { return execute(false) { db -> val cursor = db.rawQuery(sql, selectionArgs) cursor.use(block) } } private fun Cursor.getLongOrNull(columnIndex: Int): Long? = if (isNull(columnIndex)) null else getLong(columnIndex) private fun String.toMoreMessages(): MoreMessages = when (this) { Loading app/core/src/main/java/com/fsck/k9/mailstore/K9BackendStorage.kt +36 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ import com.fsck.k9.Account import com.fsck.k9.Preferences import com.fsck.k9.backend.api.BackendFolder import com.fsck.k9.backend.api.BackendStorage import com.fsck.k9.backend.api.FolderInfo class K9BackendStorage( private val preferences: Preferences, Loading @@ -20,6 +21,41 @@ class K9BackendStorage( return K9BackendFolder(preferences, account, localStore, folderServerId) } override fun getFolderServerIds(): List<String> { return database.query("folders", arrayOf("server_id"), "server_id != ?", account.outboxFolder) { cursor -> val folderServerIds = mutableListOf<String>() while (cursor.moveToNext()) { folderServerIds.add(cursor.getString(0)) } folderServerIds } } override fun createFolders(folders: List<FolderInfo>) { if (folders.isEmpty()) return val localFolders = folders.map { localStore.getFolder(it.serverId, it.name) } localStore.createFolders(localFolders, account.displayCount) } override fun deleteFolders(folderServerIds: List<String>) { folderServerIds.asSequence() .filterNot { account.isSpecialFolder(it) } .map { localStore.getFolder(it) } .forEach { it.delete() } } override fun changeFolder(folderServerId: String, name: String) { database.execute(false) { db -> val values = ContentValues().apply { put("name", name) } db.update("folders", values, "server_id = ?", arrayOf(folderServerId)) } } override fun getExtraString(name: String): String? { return database.execute(false) { db -> val cursor = db.query( Loading app/core/src/main/java/com/fsck/k9/mailstore/LocalFolder.java +5 −1 Original line number Diff line number Diff line Loading @@ -101,9 +101,13 @@ public class LocalFolder extends Folder<LocalMessage> { public LocalFolder(LocalStore localStore, String serverId) { super(); this(localStore, serverId, null); } public LocalFolder(LocalStore localStore, String serverId, String name) { this.localStore = localStore; this.serverId = serverId; this.name = name; attachmentInfoExtractor = localStore.getAttachmentInfoExtractor(); if (getAccount().getInboxFolder().equals(getServerId())) { Loading app/core/src/main/java/com/fsck/k9/mailstore/LocalStore.java +4 −0 Original line number Diff line number Diff line Loading @@ -394,6 +394,10 @@ public class LocalStore { return new LocalFolder(this, serverId); } public LocalFolder getFolder(String serverId, String name) { return new LocalFolder(this, serverId, name); } // TODO this takes about 260-300ms, seems slow. public List<LocalFolder> getPersonalNamespaces(boolean forceListAll) throws MessagingException { final List<LocalFolder> folders = new LinkedList<>(); Loading Loading
app/core/src/main/java/com/fsck/k9/controller/MessagingController.java +1 −44 Original line number Diff line number Diff line Loading @@ -44,7 +44,6 @@ import com.fsck.k9.K9.Intents; import com.fsck.k9.Preferences; import com.fsck.k9.backend.BackendManager; import com.fsck.k9.backend.api.Backend; import com.fsck.k9.backend.api.FolderInfo; import com.fsck.k9.backend.api.SyncConfig; import com.fsck.k9.backend.api.SyncListener; import com.fsck.k9.cache.EmailProviderCache; Loading Loading @@ -423,51 +422,9 @@ public class MessagingController { List<LocalFolder> localFolders = null; try { Backend backend = getBackend(account); List<FolderInfo> folders = backend.getFolders(); backend.refreshFolderList(); LocalStore localStore = account.getLocalStore(); Map<String, String> remoteFolderNameMap = new HashMap<>(); List<LocalFolder> foldersToCreate = new LinkedList<>(); localFolders = localStore.getPersonalNamespaces(false); Set<String> localFolderServerIds = new HashSet<>(); for (Folder localFolder : localFolders) { localFolderServerIds.add(localFolder.getServerId()); } for (FolderInfo folder : folders) { String folderServerId = folder.getServerId(); if (!localFolderServerIds.contains(folderServerId)) { LocalFolder localFolder = localStore.getFolder(folderServerId); foldersToCreate.add(localFolder); } remoteFolderNameMap.put(folderServerId, folder.getName()); } localStore.createFolders(foldersToCreate, account.getDisplayCount()); localFolders = localStore.getPersonalNamespaces(false); /* * Clear out any folders that are no longer on the remote store. */ for (LocalFolder localFolder : localFolders) { String localFolderServerId = localFolder.getServerId(); // FIXME: This is a hack used to clean up when we accidentally created the // special placeholder folder "-NONE-". if (K9.FOLDER_NONE.equals(localFolderServerId)) { localFolder.delete(false); } boolean folderExistsOnServer = remoteFolderNameMap.containsKey(localFolderServerId); if (folderExistsOnServer) { String folderName = remoteFolderNameMap.get(localFolderServerId); localFolder.setName(folderName); } else if (!account.isSpecialFolder(localFolderServerId)) { localFolder.delete(false); } } localFolders = localStore.getPersonalNamespaces(false); for (MessagingListener l : getListeners(listener)) { Loading
app/core/src/main/java/com/fsck/k9/mailstore/K9BackendFolder.kt +0 −20 Original line number Diff line number Diff line Loading @@ -362,26 +362,6 @@ class K9BackendFolder( } } private fun <T> LockableDatabase.query( table: String, columns: Array<String>, selection: String, vararg selectionArgs: String, block: (Cursor) -> T ): T { return execute(false) { db -> val cursor = db.query(table, columns, selection, selectionArgs, null, null, null) cursor.use(block) } } private fun <T> LockableDatabase.rawQuery(sql: String, vararg selectionArgs: String, block: (Cursor) -> T): T { return execute(false) { db -> val cursor = db.rawQuery(sql, selectionArgs) cursor.use(block) } } private fun Cursor.getLongOrNull(columnIndex: Int): Long? = if (isNull(columnIndex)) null else getLong(columnIndex) private fun String.toMoreMessages(): MoreMessages = when (this) { Loading
app/core/src/main/java/com/fsck/k9/mailstore/K9BackendStorage.kt +36 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ import com.fsck.k9.Account import com.fsck.k9.Preferences import com.fsck.k9.backend.api.BackendFolder import com.fsck.k9.backend.api.BackendStorage import com.fsck.k9.backend.api.FolderInfo class K9BackendStorage( private val preferences: Preferences, Loading @@ -20,6 +21,41 @@ class K9BackendStorage( return K9BackendFolder(preferences, account, localStore, folderServerId) } override fun getFolderServerIds(): List<String> { return database.query("folders", arrayOf("server_id"), "server_id != ?", account.outboxFolder) { cursor -> val folderServerIds = mutableListOf<String>() while (cursor.moveToNext()) { folderServerIds.add(cursor.getString(0)) } folderServerIds } } override fun createFolders(folders: List<FolderInfo>) { if (folders.isEmpty()) return val localFolders = folders.map { localStore.getFolder(it.serverId, it.name) } localStore.createFolders(localFolders, account.displayCount) } override fun deleteFolders(folderServerIds: List<String>) { folderServerIds.asSequence() .filterNot { account.isSpecialFolder(it) } .map { localStore.getFolder(it) } .forEach { it.delete() } } override fun changeFolder(folderServerId: String, name: String) { database.execute(false) { db -> val values = ContentValues().apply { put("name", name) } db.update("folders", values, "server_id = ?", arrayOf(folderServerId)) } } override fun getExtraString(name: String): String? { return database.execute(false) { db -> val cursor = db.query( Loading
app/core/src/main/java/com/fsck/k9/mailstore/LocalFolder.java +5 −1 Original line number Diff line number Diff line Loading @@ -101,9 +101,13 @@ public class LocalFolder extends Folder<LocalMessage> { public LocalFolder(LocalStore localStore, String serverId) { super(); this(localStore, serverId, null); } public LocalFolder(LocalStore localStore, String serverId, String name) { this.localStore = localStore; this.serverId = serverId; this.name = name; attachmentInfoExtractor = localStore.getAttachmentInfoExtractor(); if (getAccount().getInboxFolder().equals(getServerId())) { Loading
app/core/src/main/java/com/fsck/k9/mailstore/LocalStore.java +4 −0 Original line number Diff line number Diff line Loading @@ -394,6 +394,10 @@ public class LocalStore { return new LocalFolder(this, serverId); } public LocalFolder getFolder(String serverId, String name) { return new LocalFolder(this, serverId, name); } // TODO this takes about 260-300ms, seems slow. public List<LocalFolder> getPersonalNamespaces(boolean forceListAll) throws MessagingException { final List<LocalFolder> folders = new LinkedList<>(); Loading