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

Unverified Commit 1645c38e authored by cketti's avatar cketti Committed by GitHub
Browse files

Merge pull request #3174 from k9mail/GH-2164_do_not_delete_local_messages_during_sync

Improve support for local messages (fixes draft sync issue)
parents 9018b5d9 f4147483
Loading
Loading
Loading
Loading
+56 −22
Original line number Diff line number Diff line
@@ -898,7 +898,7 @@ public class MessagingController {
            if (account.syncRemoteDeletions()) {
                List<String> destroyMessageUids = new ArrayList<>();
                for (String localMessageUid : localUidMap.keySet()) {
                    if (remoteUidMap.get(localMessageUid) == null) {
                    if (!localMessageUid.startsWith(K9.LOCAL_UID_PREFIX) && remoteUidMap.get(localMessageUid) == null) {
                        destroyMessageUids.add(localMessageUid);
                    }
                }
@@ -1761,10 +1761,16 @@ public class MessagingController {
                localMessage.setFlag(Flag.X_REMOTE_COPY_STARTED, true);
                remoteFolder.appendMessages(Collections.singletonList(localMessage));

                if (localMessage.getUid().startsWith(K9.LOCAL_UID_PREFIX)) {
                    // We didn't get the server UID of the uploaded message. Remove the local message now. The uploaded
                    // version will be downloaded during the next sync.
                    localFolder.destroyMessages(Collections.singletonList(localMessage));
                } else {
                    localFolder.changeUid(localMessage);
                    for (MessagingListener l : getListeners()) {
                        l.messageUidChanged(account, folder, oldUid, localMessage.getUid());
                    }
                }
            } else {
                /*
                 * If the remote message exists we need to determine which copy to keep.
@@ -1796,10 +1802,17 @@ public class MessagingController {
                    localMessage.setFlag(Flag.X_REMOTE_COPY_STARTED, true);

                    remoteFolder.appendMessages(Collections.singletonList(localMessage));
                    if (localMessage.getUid().startsWith(K9.LOCAL_UID_PREFIX)) {
                        // We didn't get the server UID of the uploaded message. Remove the local message now. The
                        // uploaded version will be downloaded during the next sync.
                        localFolder.destroyMessages(Collections.singletonList(localMessage));
                    } else {
                        localFolder.changeUid(localMessage);
                        for (MessagingListener l : getListeners()) {
                            l.messageUidChanged(account, folder, oldUid, localMessage.getUid());
                        }
                    }

                    if (remoteDate != null) {
                        remoteMessage.setFlag(Flag.DELETED, true);
                        if (Expunge.EXPUNGE_IMMEDIATELY == account.getExpungePolicy()) {
@@ -3172,9 +3185,8 @@ public class MessagingController {
    private void deleteMessagesSynchronous(final Account account, final String folder,
            final List<? extends Message> messages,
            MessagingListener listener) {
        Folder localFolder = null;
        Folder localTrashFolder = null;
        List<String> uids = getUidsFromMessages(messages);
        LocalFolder localFolder = null;
        LocalFolder localTrashFolder = null;
        try {
            //We need to make these callbacks before moving the messages to the trash
            //as messages get a new UID after being moved
@@ -3183,13 +3195,32 @@ public class MessagingController {
                    l.messageDeleted(account, folder, message);
                }
            }
            Store localStore = account.getLocalStore();

            List<Message> localOnlyMessages = new ArrayList<>();
            List<Message> syncedMessages = new ArrayList<>();
            List<String> syncedMessageUids = new ArrayList<>();
            for (Message message : messages) {
                String uid = message.getUid();
                if (uid.startsWith(K9.LOCAL_UID_PREFIX)) {
                    localOnlyMessages.add(message);
                } else {
                    syncedMessages.add(message);
                    syncedMessageUids.add(uid);
                }
            }

            LocalStore localStore = account.getLocalStore();
            localFolder = localStore.getFolder(folder);
            Map<String, String> uidMap = null;
            if (folder.equals(account.getTrashFolderName()) || !account.hasTrashFolder()) {
                Timber.d("Deleting messages in trash folder or trash set to -None-, not copying");

                localFolder.setFlags(messages, Collections.singleton(Flag.DELETED), true);
                if (!localOnlyMessages.isEmpty()) {
                    localFolder.destroyMessages(localOnlyMessages);
                }
                if (!syncedMessages.isEmpty()) {
                    localFolder.setFlags(syncedMessages, Collections.singleton(Flag.DELETED), true);
                }
            } else {
                localTrashFolder = localStore.getFolder(account.getTrashFolderName());
                if (!localTrashFolder.exists()) {
@@ -3221,19 +3252,22 @@ public class MessagingController {
                    queuePendingCommand(account, command);
                }
                processPendingCommands(account);
            } else if (account.getDeletePolicy() == DeletePolicy.ON_DELETE) {
            } else if (!syncedMessageUids.isEmpty()) {
                if (account.getDeletePolicy() == DeletePolicy.ON_DELETE) {
                    if (folder.equals(account.getTrashFolderName())) {
                    queueSetFlag(account, folder, true, Flag.DELETED, uids);
                        queueSetFlag(account, folder, true, Flag.DELETED, syncedMessageUids);
                    } else {
                    queueMoveOrCopy(account, folder, account.getTrashFolderName(), false, uids, uidMap);
                        queueMoveOrCopy(account, folder, account.getTrashFolderName(), false,
                                    syncedMessageUids, uidMap);
                    }
                    processPendingCommands(account);
                } else if (account.getDeletePolicy() == DeletePolicy.MARK_AS_READ) {
                queueSetFlag(account, folder, true, Flag.SEEN, uids);
                    queueSetFlag(account, folder, true, Flag.SEEN, syncedMessageUids);
                    processPendingCommands(account);
                } else {
                    Timber.d("Delete policy %s prevents delete from server", account.getDeletePolicy());
                }
            }

            unsuppressMessages(account, messages);
        } catch (UnavailableStorageException e) {
+1 −1
Original line number Diff line number Diff line
@@ -227,7 +227,7 @@ class ImapSync {
            if (account.syncRemoteDeletions()) {
                List<String> destroyMessageUids = new ArrayList<>();
                for (String localMessageUid : localUidMap.keySet()) {
                    if (remoteUidMap.get(localMessageUid) == null) {
                    if (!localMessageUid.startsWith(K9.LOCAL_UID_PREFIX) && remoteUidMap.get(localMessageUid) == null) {
                        destroyMessageUids.add(localMessageUid);
                    }
                }