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

Unverified Commit 664e444d authored by cketti's avatar cketti Committed by GitHub
Browse files

Merge pull request #4728 from k9mail/use_folder_ids

Change "frontend" code to refer to folders by database ID
parents c26037c5 9ed54011
Loading
Loading
Loading
Loading
+142 −78
Original line number Diff line number Diff line
@@ -124,18 +124,26 @@ public class Account implements BaseAccount {
    private FolderMode folderNotifyNewMailMode;
    private boolean notifySelfNewMail;
    private boolean notifyContactsMailOnly;
    private String inboxFolder;
    private String draftsFolder;
    private String sentFolder;
    private String trashFolder;
    private String archiveFolder;
    private String spamFolder;
    private String legacyInboxFolder;
    private String importedDraftsFolder;
    private String importedSentFolder;
    private String importedTrashFolder;
    private String importedArchiveFolder;
    private String importedSpamFolder;
    private Long inboxFolderId;
    private Long outboxFolderId;
    private Long draftsFolderId;
    private Long sentFolderId;
    private Long trashFolderId;
    private Long archiveFolderId;
    private Long spamFolderId;
    private SpecialFolderSelection draftsFolderSelection;
    private SpecialFolderSelection sentFolderSelection;
    private SpecialFolderSelection trashFolderSelection;
    private SpecialFolderSelection archiveFolderSelection;
    private SpecialFolderSelection spamFolderSelection;
    private String autoExpandFolder;
    private String importedAutoExpandFolder;
    private Long autoExpandFolderId;
    private FolderMode folderDisplayMode;
    private FolderMode folderSyncMode;
    private FolderMode folderPushMode;
@@ -195,12 +203,11 @@ public class Account implements BaseAccount {
    private boolean isEnabled;

    /**
     * Name of the folder that was last selected for a copy or move operation.
     * Database ID of the folder that was last selected for a copy or move operation.
     *
     * Note: For now this value isn't persisted. So it will be reset when
     *       K-9 Mail is restarted.
     * Note: For now this value isn't persisted. So it will be reset when K-9 Mail is restarted.
     */
    private String lastSelectedFolder = null;
    private Long lastSelectedFolderId = null;

    private List<Identity> identities;

@@ -407,100 +414,134 @@ public class Account implements BaseAccount {
        this.deletePolicy = deletePolicy;
    }

    public boolean isSpecialFolder(String folderServerId) {
        return (folderServerId != null && (folderServerId.equals(getInboxFolder()) ||
                folderServerId.equals(getTrashFolder()) ||
                folderServerId.equals(getDraftsFolder()) ||
                folderServerId.equals(getArchiveFolder()) ||
                folderServerId.equals(getSpamFolder()) ||
                folderServerId.equals(getOutboxFolder()) ||
                folderServerId.equals(getSentFolder())));
    public synchronized String getImportedDraftsFolder() {
        return importedDraftsFolder;
    }

    public synchronized String getDraftsFolder() {
        return draftsFolder;
    public synchronized void setImportedDraftsFolder(String folderServerId) {
        importedDraftsFolder = folderServerId;
    }

    public synchronized void setDraftsFolder(String name, SpecialFolderSelection selection) {
        draftsFolder = name;
    @Nullable
    public synchronized Long getDraftsFolderId() {
        return draftsFolderId;
    }

    public synchronized void setDraftsFolderId(@Nullable Long folderId) {
        draftsFolderId = folderId;
    }

    public synchronized void setDraftsFolderId(@Nullable Long folderId, SpecialFolderSelection selection) {
        draftsFolderId = folderId;
        draftsFolderSelection = selection;
    }

    /**
     * Checks if this account has a drafts folder set.
     * @return true if account has a drafts folder set.
     */
    public synchronized boolean hasDraftsFolder() {
        return draftsFolder != null;
        return draftsFolderId != null;
    }

    public synchronized String getImportedSentFolder() {
        return importedSentFolder;
    }

    public synchronized void setImportedSentFolder(String folderServerId) {
        importedSentFolder = folderServerId;
    }

    @Nullable
    public synchronized Long getSentFolderId() {
        return sentFolderId;
    }

    public synchronized String getSentFolder() {
        return sentFolder;
    public synchronized void setSentFolderId(@Nullable Long folderId) {
        sentFolderId = folderId;
    }

    public synchronized void setSentFolder(String name, SpecialFolderSelection selection) {
        sentFolder = name;
    public synchronized void setSentFolderId(@Nullable Long folderId, SpecialFolderSelection selection) {
        sentFolderId = folderId;
        sentFolderSelection = selection;
    }

    /**
     * Checks if this account has a sent folder set.
     * @return true if account has a sent folder set.
     */
    public synchronized boolean hasSentFolder() {
        return sentFolder != null;
        return sentFolderId != null;
    }

    public synchronized String getImportedTrashFolder() {
        return importedTrashFolder;
    }

    public synchronized void setImportedTrashFolder(String folderServerId) {
        importedTrashFolder = folderServerId;
    }

    @Nullable
    public synchronized Long getTrashFolderId() {
        return trashFolderId;
    }

    public synchronized String getTrashFolder() {
        return trashFolder;
    public synchronized void setTrashFolderId(@Nullable Long folderId) {
        trashFolderId = folderId;
    }

    public synchronized void setTrashFolder(String name, SpecialFolderSelection selection) {
        trashFolder = name;
    public synchronized void setTrashFolderId(@Nullable Long folderId, SpecialFolderSelection selection) {
        trashFolderId = folderId;
        trashFolderSelection = selection;
    }

    /**
     * Checks if this account has a trash folder set.
     * @return true if account has a trash folder set.
     */
    public synchronized boolean hasTrashFolder() {
        return trashFolder != null;
        return trashFolderId != null;
    }

    public synchronized String getArchiveFolder() {
        return archiveFolder;
    public synchronized String getImportedArchiveFolder() {
        return importedArchiveFolder;
    }

    public synchronized void setArchiveFolder(String archiveFolder, SpecialFolderSelection selection) {
        this.archiveFolder = archiveFolder;
    public synchronized void setImportedArchiveFolder(String archiveFolder) {
        this.importedArchiveFolder = archiveFolder;
    }

    @Nullable
    public synchronized Long getArchiveFolderId() {
        return archiveFolderId;
    }

    public synchronized void setArchiveFolderId(@Nullable Long folderId) {
        archiveFolderId = folderId;
    }

    public synchronized void setArchiveFolderId(@Nullable Long folderId, SpecialFolderSelection selection) {
        this.archiveFolderId = folderId;
        archiveFolderSelection = selection;
    }

    /**
     * Checks if this account has an archive folder set.
     * @return true if account has an archive folder set.
     */
    public synchronized boolean hasArchiveFolder() {
        return archiveFolder != null;
        return archiveFolderId != null;
    }

    public synchronized String getImportedSpamFolder() {
        return importedSpamFolder;
    }

    public synchronized String getSpamFolder() {
        return spamFolder;
    public synchronized void setImportedSpamFolder(String folderServerId) {
        importedSpamFolder = folderServerId;
    }

    public synchronized void setSpamFolder(String name, SpecialFolderSelection selection) {
        spamFolder = name;
    @Nullable
    public synchronized Long getSpamFolderId() {
        return spamFolderId;
    }

    public synchronized void setSpamFolderId(@Nullable Long folderId) {
        spamFolderId = folderId;
    }

    public synchronized void setSpamFolderId(@Nullable Long folderId, SpecialFolderSelection selection) {
        spamFolderId = folderId;
        spamFolderSelection = selection;
    }

    /**
     * Checks if this account has a spam folder set.
     * @return true if account has a spam folder set.
     */
    public synchronized boolean hasSpamFolder() {
        return spamFolder != null;
        return spamFolderId != null;
    }

    @NotNull
@@ -528,16 +569,30 @@ public class Account implements BaseAccount {
        return spamFolderSelection;
    }

    public String getOutboxFolder() {
        return OUTBOX;
    @Nullable
    public synchronized Long getOutboxFolderId() {
        return outboxFolderId;
    }

    public synchronized void setOutboxFolderId(@Nullable Long folderId) {
        outboxFolderId = folderId;
    }

    public synchronized String getAutoExpandFolder() {
        return autoExpandFolder;
    public synchronized String getImportedAutoExpandFolder() {
        return importedAutoExpandFolder;
    }

    public synchronized void setAutoExpandFolder(String name) {
        autoExpandFolder = name;
    public synchronized void setImportedAutoExpandFolder(String name) {
        importedAutoExpandFolder = name;
    }

    @Nullable
    public synchronized Long getAutoExpandFolderId() {
        return autoExpandFolderId;
    }

    public synchronized void setAutoExpandFolderId(@Nullable Long folderId) {
        autoExpandFolderId = folderId;
    }

    public synchronized int getAccountNumber() {
@@ -983,12 +1038,21 @@ public class Account implements BaseAccount {
        this.uploadSentMessages = uploadSentMessages;
    }

    public String getInboxFolder() {
        return inboxFolder;
    public String getLegacyInboxFolder() {
        return legacyInboxFolder;
    }

    void setLegacyInboxFolder(String name) {
        this.legacyInboxFolder = name;
    }

    @Nullable
    public synchronized Long getInboxFolderId() {
        return inboxFolderId;
    }

    public void setInboxFolder(String name) {
        this.inboxFolder = name;
    public synchronized void setInboxFolderId(@Nullable Long folderId) {
        inboxFolderId = folderId;
    }

    public synchronized boolean isSyncRemoteDeletions() {
@@ -999,12 +1063,12 @@ public class Account implements BaseAccount {
        this.syncRemoteDeletions = syncRemoteDeletions;
    }

    public synchronized String getLastSelectedFolder() {
        return lastSelectedFolder;
    public synchronized Long getLastSelectedFolderId() {
        return lastSelectedFolderId;
    }

    public synchronized void setLastSelectedFolder(String folderServerId) {
        lastSelectedFolder = folderServerId;
    public synchronized void setLastSelectedFolderId(long folderId) {
        lastSelectedFolderId = folderId;
    }

    public synchronized NotificationSetting getNotificationSetting() {
+59 −32
Original line number Diff line number Diff line
@@ -51,32 +51,42 @@ class AccountPreferenceSerializer(
            isNotifyContactsMailOnly = storage.getBoolean("$accountUuid.notifyContactsMailOnly", false)
            isNotifySync = storage.getBoolean("$accountUuid.notifyMailCheck", false)
            deletePolicy = DeletePolicy.fromInt(storage.getInt("$accountUuid.deletePolicy", DeletePolicy.NEVER.setting))
            inboxFolder = storage.getString("$accountUuid.inboxFolderName", null)
            legacyInboxFolder = storage.getString("$accountUuid.inboxFolderName", null)
            importedDraftsFolder = storage.getString("$accountUuid.draftsFolderName", null)
            importedSentFolder = storage.getString("$accountUuid.sentFolderName", null)
            importedTrashFolder = storage.getString("$accountUuid.trashFolderName", null)
            importedArchiveFolder = storage.getString("$accountUuid.archiveFolderName", null)
            importedSpamFolder = storage.getString("$accountUuid.spamFolderName", null)

            val draftsFolder = storage.getString("$accountUuid.draftsFolderName", null)
            inboxFolderId = storage.getString("$accountUuid.inboxFolderId", null)?.toLongOrNull()
            outboxFolderId = storage.getString("$accountUuid.outboxFolderId", null)?.toLongOrNull()

            val draftsFolderId = storage.getString("$accountUuid.draftsFolderId", null)?.toLongOrNull()
            val draftsFolderSelection = getEnumStringPref<SpecialFolderSelection>(storage, "$accountUuid.draftsFolderSelection",
                SpecialFolderSelection.AUTOMATIC)
            setDraftsFolder(draftsFolder, draftsFolderSelection)
            setDraftsFolderId(draftsFolderId, draftsFolderSelection)

            val sentFolder = storage.getString("$accountUuid.sentFolderName", null)
            val sentFolderId = storage.getString("$accountUuid.sentFolderId", null)?.toLongOrNull()
            val sentFolderSelection = getEnumStringPref<SpecialFolderSelection>(storage, "$accountUuid.sentFolderSelection",
                SpecialFolderSelection.AUTOMATIC)
            setSentFolder(sentFolder, sentFolderSelection)
            setSentFolderId(sentFolderId, sentFolderSelection)

            val trashFolder = storage.getString("$accountUuid.trashFolderName", null)
            val trashFolderId = storage.getString("$accountUuid.trashFolderId", null)?.toLongOrNull()
            val trashFolderSelection = getEnumStringPref<SpecialFolderSelection>(storage, "$accountUuid.trashFolderSelection",
                SpecialFolderSelection.AUTOMATIC)
            setTrashFolder(trashFolder, trashFolderSelection)
            setTrashFolderId(trashFolderId, trashFolderSelection)

            val archiveFolder = storage.getString("$accountUuid.archiveFolderName", null)
            val archiveFolderId = storage.getString("$accountUuid.archiveFolderId", null)?.toLongOrNull()
            val archiveFolderSelection = getEnumStringPref<SpecialFolderSelection>(storage, "$accountUuid.archiveFolderSelection",
                SpecialFolderSelection.AUTOMATIC)
            setArchiveFolder(archiveFolder, archiveFolderSelection)
            setArchiveFolderId(archiveFolderId, archiveFolderSelection)

            val spamFolder = storage.getString("$accountUuid.spamFolderName", null)
            val spamFolderId = storage.getString("$accountUuid.spamFolderId", null)?.toLongOrNull()
            val spamFolderSelection = getEnumStringPref<SpecialFolderSelection>(storage, "$accountUuid.spamFolderSelection",
                SpecialFolderSelection.AUTOMATIC)
            setSpamFolder(spamFolder, spamFolderSelection)
            setSpamFolderId(spamFolderId, spamFolderSelection)

            autoExpandFolderId = storage.getString("$accountUuid.autoExpandFolderId", null)?.toLongOrNull()

            expungePolicy = getEnumStringPref<Expunge>(storage, "$accountUuid.expungePolicy", Expunge.EXPUNGE_IMMEDIATELY)
            isSyncRemoteDeletions = storage.getBoolean("$accountUuid.syncRemoteDeletions", true)
@@ -103,7 +113,7 @@ class AccountPreferenceSerializer(
                setCompression(type, useCompression)
            }

            autoExpandFolder = storage.getString("$accountUuid.autoExpandFolderName", null)
            importedAutoExpandFolder = storage.getString("$accountUuid.autoExpandFolderName", null)

            accountNumber = storage.getInt("$accountUuid.accountNumber", UNASSIGNED_ACCOUNT_NUMBER)

@@ -235,18 +245,26 @@ class AccountPreferenceSerializer(
            editor.putBoolean("$accountUuid.notifyContactsMailOnly", isNotifyContactsMailOnly)
            editor.putBoolean("$accountUuid.notifyMailCheck", isNotifySync)
            editor.putInt("$accountUuid.deletePolicy", deletePolicy.setting)
            editor.putString("$accountUuid.inboxFolderName", inboxFolder)
            editor.putString("$accountUuid.draftsFolderName", draftsFolder)
            editor.putString("$accountUuid.sentFolderName", sentFolder)
            editor.putString("$accountUuid.trashFolderName", trashFolder)
            editor.putString("$accountUuid.archiveFolderName", archiveFolder)
            editor.putString("$accountUuid.spamFolderName", spamFolder)
            editor.putString("$accountUuid.inboxFolderName", legacyInboxFolder)
            editor.putString("$accountUuid.draftsFolderName", importedDraftsFolder)
            editor.putString("$accountUuid.sentFolderName", importedSentFolder)
            editor.putString("$accountUuid.trashFolderName", importedTrashFolder)
            editor.putString("$accountUuid.archiveFolderName", importedArchiveFolder)
            editor.putString("$accountUuid.spamFolderName", importedSpamFolder)
            editor.putString("$accountUuid.inboxFolderId", inboxFolderId?.toString())
            editor.putString("$accountUuid.outboxFolderId", outboxFolderId?.toString())
            editor.putString("$accountUuid.draftsFolderId", draftsFolderId?.toString())
            editor.putString("$accountUuid.sentFolderId", sentFolderId?.toString())
            editor.putString("$accountUuid.trashFolderId", trashFolderId?.toString())
            editor.putString("$accountUuid.archiveFolderId", archiveFolderId?.toString())
            editor.putString("$accountUuid.spamFolderId", spamFolderId?.toString())
            editor.putString("$accountUuid.archiveFolderSelection", archiveFolderSelection.name)
            editor.putString("$accountUuid.draftsFolderSelection", draftsFolderSelection.name)
            editor.putString("$accountUuid.sentFolderSelection", sentFolderSelection.name)
            editor.putString("$accountUuid.spamFolderSelection", spamFolderSelection.name)
            editor.putString("$accountUuid.trashFolderSelection", trashFolderSelection.name)
            editor.putString("$accountUuid.autoExpandFolderName", autoExpandFolder)
            editor.putString("$accountUuid.autoExpandFolderName", importedAutoExpandFolder)
            editor.putString("$accountUuid.autoExpandFolderId", autoExpandFolderId?.toString())
            editor.putInt("$accountUuid.accountNumber", accountNumber)
            editor.putString("$accountUuid.sortTypeEnum", sortType.name)
            editor.putBoolean("$accountUuid.sortAscending", isSortAscending(sortType))
@@ -417,6 +435,15 @@ class AccountPreferenceSerializer(
        editor.remove("$accountUuid.messageFormat")
        editor.remove("$accountUuid.messageReadReceipt")
        editor.remove("$accountUuid.notifyMailCheck")
        editor.remove("$accountUuid.inboxFolderId")
        editor.remove("$accountUuid.outboxFolderId")
        editor.remove("$accountUuid.draftsFolderId")
        editor.remove("$accountUuid.sentFolderId")
        editor.remove("$accountUuid.trashFolderId")
        editor.remove("$accountUuid.archiveFolderId")
        editor.remove("$accountUuid.spamFolderId")
        editor.remove("$accountUuid.autoExpandFolderId")

        for (type in NetworkType.values()) {
            editor.remove("$accountUuid.useCompression." + type.name)
        }
@@ -529,8 +556,8 @@ class AccountPreferenceSerializer(
            showPictures = ShowPictures.NEVER
            isSignatureBeforeQuotedText = false
            expungePolicy = Expunge.EXPUNGE_IMMEDIATELY
            autoExpandFolder = null
            inboxFolder = null
            importedAutoExpandFolder = null
            legacyInboxFolder = null
            maxPushFolders = 10
            isGoToUnreadMessageSearch = false
            isSubscribedFoldersOnly = false
@@ -555,12 +582,12 @@ class AccountPreferenceSerializer(
            isMarkMessageAsReadOnDelete = true
            isAlwaysShowCcBcc = false

            setArchiveFolder(null, SpecialFolderSelection.AUTOMATIC)
            setDraftsFolder(null, SpecialFolderSelection.AUTOMATIC)
            setSentFolder(null, SpecialFolderSelection.AUTOMATIC)
            setSpamFolder(null, SpecialFolderSelection.AUTOMATIC)
            setTrashFolder(null, SpecialFolderSelection.AUTOMATIC)
            setArchiveFolder(null, SpecialFolderSelection.AUTOMATIC)
            setArchiveFolderId(null, SpecialFolderSelection.AUTOMATIC)
            setDraftsFolderId(null, SpecialFolderSelection.AUTOMATIC)
            setSentFolderId(null, SpecialFolderSelection.AUTOMATIC)
            setSpamFolderId(null, SpecialFolderSelection.AUTOMATIC)
            setTrashFolderId(null, SpecialFolderSelection.AUTOMATIC)
            setArchiveFolderId(null, SpecialFolderSelection.AUTOMATIC)

            searchableFolders = Searchable.ALL

+21 −21
Original line number Diff line number Diff line
@@ -39,10 +39,10 @@ class MemorizingMessagingListener extends SimpleMessagingListener {
                            syncStarted = memory;
                            break;
                        case FINISHED:
                            other.synchronizeMailboxFinished(memory.account, memory.folderServerId);
                            other.synchronizeMailboxFinished(memory.account, memory.folderId);
                            break;
                        case FAILED:
                            other.synchronizeMailboxFailed(memory.account, memory.folderServerId,
                            other.synchronizeMailboxFailed(memory.account, memory.folderId,
                                    memory.failureMessage);
                            break;
                    }
@@ -50,11 +50,11 @@ class MemorizingMessagingListener extends SimpleMessagingListener {
            }
            Memory somethingStarted = null;
            if (syncStarted != null) {
                other.synchronizeMailboxStarted(syncStarted.account, syncStarted.folderServerId);
                other.synchronizeMailboxStarted(syncStarted.account, syncStarted.folderId);
                somethingStarted = syncStarted;
            }
            if (somethingStarted != null && somethingStarted.folderTotal > 0) {
                other.synchronizeMailboxProgress(somethingStarted.account, somethingStarted.folderServerId,
                other.synchronizeMailboxProgress(somethingStarted.account, somethingStarted.folderId,
                        somethingStarted.folderCompleted, somethingStarted.folderTotal);
            }

@@ -62,63 +62,63 @@ class MemorizingMessagingListener extends SimpleMessagingListener {
    }

    @Override
    public synchronized void synchronizeMailboxStarted(Account account, String folderServerId) {
        Memory memory = getMemory(account, folderServerId);
    public synchronized void synchronizeMailboxStarted(Account account, long folderId) {
        Memory memory = getMemory(account, folderId);
        memory.syncingState = MemorizingState.STARTED;
        memory.folderCompleted = 0;
        memory.folderTotal = 0;
    }

    @Override
    public synchronized void synchronizeMailboxFinished(Account account, String folderServerId) {
        Memory memory = getMemory(account, folderServerId);
    public synchronized void synchronizeMailboxFinished(Account account, long folderId) {
        Memory memory = getMemory(account, folderId);
        memory.syncingState = MemorizingState.FINISHED;
    }

    @Override
    public synchronized void synchronizeMailboxFailed(Account account, String folderServerId,
    public synchronized void synchronizeMailboxFailed(Account account, long folderId,
            String message) {

        Memory memory = getMemory(account, folderServerId);
        Memory memory = getMemory(account, folderId);
        memory.syncingState = MemorizingState.FAILED;
        memory.failureMessage = message;
    }

    @Override
    public synchronized void synchronizeMailboxProgress(Account account, String folderServerId, int completed,
    public synchronized void synchronizeMailboxProgress(Account account, long folderId, int completed,
            int total) {
        Memory memory = getMemory(account, folderServerId);
        Memory memory = getMemory(account, folderId);
        memory.folderCompleted = completed;
        memory.folderTotal = total;
    }

    private Memory getMemory(Account account, String folderServerId) {
        Memory memory = memories.get(getMemoryKey(account, folderServerId));
    private Memory getMemory(Account account, long folderId) {
        Memory memory = memories.get(getMemoryKey(account, folderId));
        if (memory == null) {
            memory = new Memory(account, folderServerId);
            memories.put(getMemoryKey(memory.account, memory.folderServerId), memory);
            memory = new Memory(account, folderId);
            memories.put(getMemoryKey(memory.account, memory.folderId), memory);
        }
        return memory;
    }

    private static String getMemoryKey(Account account, String folderServerId) {
        return account.getDescription() + ":" + folderServerId;
    private static String getMemoryKey(Account account, long folderId) {
        return account.getDescription() + ":" + folderId;
    }

    private enum MemorizingState { STARTED, FINISHED, FAILED }

    private static class Memory {
        Account account;
        String folderServerId;
        long folderId;
        MemorizingState syncingState = null;
        String failureMessage = null;

        int folderCompleted = 0;
        int folderTotal = 0;

        Memory(Account account, String folderServerId) {
        Memory(Account account, long folderId) {
            this.account = account;
            this.folderServerId = folderServerId;
            this.folderId = folderId;
        }
    }
}
+22 −19

File changed.

Preview size limit exceeded, changes collapsed.

+251 −297

File changed.

Preview size limit exceeded, changes collapsed.

Loading