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

Commit de49c9d6 authored by cketti's avatar cketti
Browse files

Move folder list sync logic into Backend implementations

parent dc785a8e
Loading
Loading
Loading
Loading
+1 −44
Original line number Diff line number Diff line
@@ -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;
@@ -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)) {
+0 −20
Original line number Diff line number Diff line
@@ -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) {
+36 −0
Original line number Diff line number Diff line
@@ -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,
@@ -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(
+5 −1
Original line number Diff line number Diff line
@@ -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())) {
+4 −0
Original line number Diff line number Diff line
@@ -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