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

Commit 5c10cfc6 authored by cketti's avatar cketti
Browse files

Use folder database ID for PendingMoveOrCopy and PendingMoveAndMarkAsRead

parent cc1002ee
Loading
Loading
Loading
Loading
+35 −20
Original line number Diff line number Diff line
@@ -809,18 +809,18 @@ public class MessagingController {
        }
    }

    private void queueMoveOrCopy(Account account, String srcFolder, String destFolder, MoveOrCopyFlavor operation,
    private void queueMoveOrCopy(Account account, long srcFolderId, long destFolderId, MoveOrCopyFlavor operation,
            Map<String, String> uidMap) {
        PendingCommand command;
        switch (operation) {
            case MOVE:
                command = PendingMoveOrCopy.create(srcFolder, destFolder, false, uidMap);
                command = PendingMoveOrCopy.create(srcFolderId, destFolderId, false, uidMap);
                break;
            case COPY:
                command = PendingMoveOrCopy.create(srcFolder, destFolder, true, uidMap);
                command = PendingMoveOrCopy.create(srcFolderId, destFolderId, true, uidMap);
                break;
            case MOVE_AND_MARK_AS_READ:
                command = PendingMoveAndMarkAsRead.create(srcFolder, destFolder, uidMap);
                command = PendingMoveAndMarkAsRead.create(srcFolderId, destFolderId, uidMap);
                break;
            default:
                return;
@@ -829,8 +829,8 @@ public class MessagingController {
    }

    void processPendingMoveOrCopy(PendingMoveOrCopy command, Account account) throws MessagingException {
        String srcFolder = command.srcFolder;
        String destFolder = command.destFolder;
        long srcFolder = command.srcFolderId;
        long destFolder = command.destFolderId;
        MoveOrCopyFlavor operation = command.isCopy ? MoveOrCopyFlavor.COPY : MoveOrCopyFlavor.MOVE;

        Map<String, String> newUidMap = command.newUidMap;
@@ -840,8 +840,8 @@ public class MessagingController {
    }

    void processPendingMoveAndRead(PendingMoveAndMarkAsRead command, Account account) throws MessagingException {
        String srcFolder = command.srcFolder;
        String destFolder = command.destFolder;
        long srcFolder = command.srcFolderId;
        long destFolder = command.destFolderId;
        Map<String, String> newUidMap = command.newUidMap;
        List<String> uids = new ArrayList<>(newUidMap.keySet());

@@ -850,25 +850,32 @@ public class MessagingController {
    }

    @VisibleForTesting
    void processPendingMoveOrCopy(Account account, String srcFolder, String destFolder, List<String> uids,
    void processPendingMoveOrCopy(Account account, long srcFolderId, long destFolderId, List<String> uids,
                                  MoveOrCopyFlavor operation, Map<String, String> newUidMap) throws MessagingException {
        checkNotNull(newUidMap);

        LocalStore localStore = localStoreProvider.getInstance(account);
        LocalFolder localDestFolder = localStore.getFolder(destFolder);

        LocalFolder localSourceFolder = localStore.getFolder(srcFolderId);
        localSourceFolder.open();
        String srcFolderServerId = localSourceFolder.getServerId();

        LocalFolder localDestFolder = localStore.getFolder(destFolderId);
        localDestFolder.open();
        String destFolderServerId = localDestFolder.getServerId();

        Backend backend = getBackend(account);

        Map<String, String> remoteUidMap;
        switch (operation) {
            case COPY:
                remoteUidMap = backend.copyMessages(srcFolder, destFolder, uids);
                remoteUidMap = backend.copyMessages(srcFolderServerId, destFolderServerId, uids);
                break;
            case MOVE:
                remoteUidMap = backend.moveMessages(srcFolder, destFolder, uids);
                remoteUidMap = backend.moveMessages(srcFolderServerId, destFolderServerId, uids);
                break;
            case MOVE_AND_MARK_AS_READ:
                remoteUidMap = backend.moveMessagesAndMarkAsRead(srcFolder, destFolder, uids);
                remoteUidMap = backend.moveMessagesAndMarkAsRead(srcFolderServerId, destFolderServerId, uids);
                break;
            default:
                throw new RuntimeException("Unsupported messaging operation");
@@ -876,8 +883,8 @@ public class MessagingController {

        if (operation != MoveOrCopyFlavor.COPY && backend.getSupportsExpunge()
                && account.getExpungePolicy() == Expunge.EXPUNGE_IMMEDIATELY) {
            Timber.i("processingPendingMoveOrCopy expunging folder %s:%s", account.getDescription(), srcFolder);
            backend.expungeMessages(srcFolder, uids);
            Timber.i("processingPendingMoveOrCopy expunging folder %s:%s", account.getDescription(), srcFolderServerId);
            backend.expungeMessages(srcFolderServerId, uids);
        }

        // TODO: Change Backend interface to ensure we never receive null for remoteUidMap
@@ -901,7 +908,7 @@ public class MessagingController {
                localMessage.setUid(newUid);
                localDestFolder.changeUid(localMessage);
                for (MessagingListener l : getListeners()) {
                    l.messageUidChanged(account, destFolder, localUid, newUid);
                    l.messageUidChanged(account, destFolderServerId, localUid, newUid);
                }
            } else {
                // New server ID wasn't provided. Remove local message.
@@ -1812,7 +1819,10 @@ public class MessagingController {
            }

            LocalFolder localSrcFolder = localStore.getFolder(srcFolder);
            localSrcFolder.open();

            LocalFolder localDestFolder = localStore.getFolder(destFolder);
            localDestFolder.open();

            boolean unreadCountAffected = false;
            List<String> uids = new LinkedList<>();
@@ -1881,7 +1891,8 @@ public class MessagingController {
                    }
                }

                queueMoveOrCopy(account, srcFolder, destFolder, operation, uidMap);
                queueMoveOrCopy(account, localSrcFolder.getDatabaseId(), localDestFolder.getDatabaseId(),
                        operation, uidMap);
            }

            processPendingCommands(account);
@@ -2041,6 +2052,8 @@ public class MessagingController {

            LocalStore localStore = localStoreProvider.getInstance(account);
            localFolder = localStore.getFolder(folder);
            localFolder.open();

            Map<String, String> uidMap = null;
            if (folder.equals(account.getTrashFolder()) || !account.hasTrashFolder() ||
                    (backend.getSupportsTrashFolder() && !backend.isDeleteMoveToTrash())) {
@@ -2082,15 +2095,17 @@ public class MessagingController {
                processPendingCommands(account);
            } else if (!syncedMessageUids.isEmpty()) {
                if (account.getDeletePolicy() == DeletePolicy.ON_DELETE) {
                    long folderId = localFolder.getDatabaseId();
                    if (!account.hasTrashFolder() || folder.equals(account.getTrashFolder()) ||
                            !backend.isDeleteMoveToTrash()) {
                        long folderId = localFolder.getDatabaseId();
                        queueDelete(account, folderId, syncedMessageUids);
                    } else if (account.isMarkMessageAsReadOnDelete()) {
                        queueMoveOrCopy(account, folder, account.getTrashFolder(),
                        long trashFolderId = getFolderId(account, account.getTrashFolder());
                        queueMoveOrCopy(account, folderId, trashFolderId,
                                MoveOrCopyFlavor.MOVE_AND_MARK_AS_READ, uidMap);
                    } else {
                        queueMoveOrCopy(account, folder, account.getTrashFolder(),
                        long trashFolderId = getFolderId(account, account.getTrashFolder());
                        queueMoveOrCopy(account, folderId, trashFolderId,
                                MoveOrCopyFlavor.MOVE, uidMap);
                    }
                    processPendingCommands(account);
+14 −22
Original line number Diff line number Diff line
@@ -33,29 +33,23 @@ public class MessagingControllerCommands {
    }

    public static class PendingMoveOrCopy extends PendingCommand {
        public final String srcFolder;
        public final String destFolder;
        public final long srcFolderId;
        public final long destFolderId;
        public final boolean isCopy;
        public final List<String> uids;
        public final Map<String, String> newUidMap;


        public static PendingMoveOrCopy create(String srcFolder, String destFolder, boolean isCopy,
        public static PendingMoveOrCopy create(long srcFolderId, long destFolderId, boolean isCopy,
                Map<String, String> uidMap) {
            checkNotNull(srcFolder);
            checkNotNull(destFolder);
            requireValidUids(uidMap);
            return new PendingMoveOrCopy(srcFolder, destFolder, isCopy, null, uidMap);
            return new PendingMoveOrCopy(srcFolderId, destFolderId, isCopy, null, uidMap);
        }

        public static PendingMoveOrCopy createLegacy(String srcFolder, String destFolder, boolean isCopy, List<String> uids) {
            return new PendingMoveOrCopy(srcFolder, destFolder, isCopy, uids, null);
        }

        private PendingMoveOrCopy(String srcFolder, String destFolder, boolean isCopy, List<String> uids,
        private PendingMoveOrCopy(long srcFolderId, long destFolderId, boolean isCopy, List<String> uids,
                Map<String, String> newUidMap) {
            this.srcFolder = srcFolder;
            this.destFolder = destFolder;
            this.srcFolderId = srcFolderId;
            this.destFolderId = destFolderId;
            this.isCopy = isCopy;
            this.uids = uids;
            this.newUidMap = newUidMap;
@@ -73,21 +67,19 @@ public class MessagingControllerCommands {
    }

    public static class PendingMoveAndMarkAsRead extends PendingCommand {
        public final String srcFolder;
        public final String destFolder;
        public final long srcFolderId;
        public final long destFolderId;
        public final Map<String, String> newUidMap;


        public static PendingMoveAndMarkAsRead create(String srcFolder, String destFolder, Map<String, String> uidMap) {
            checkNotNull(srcFolder);
            checkNotNull(destFolder);
        public static PendingMoveAndMarkAsRead create(long srcFolderId, long destFolderId, Map<String, String> uidMap) {
            requireValidUids(uidMap);
            return new PendingMoveAndMarkAsRead(srcFolder, destFolder, uidMap);
            return new PendingMoveAndMarkAsRead(srcFolderId, destFolderId, uidMap);
        }

        private PendingMoveAndMarkAsRead(String srcFolder, String destFolder, Map<String, String> newUidMap) {
            this.srcFolder = srcFolder;
            this.destFolder = destFolder;
        private PendingMoveAndMarkAsRead(long srcFolderId, long destFolderId, Map<String, String> newUidMap) {
            this.srcFolderId = srcFolderId;
            this.destFolderId = destFolderId;
            this.newUidMap = newUidMap;
        }

+4 −5
Original line number Diff line number Diff line
@@ -16,9 +16,8 @@ import static org.junit.Assert.assertEquals;
public class PendingCommandSerializerTest {
    static final int DATABASE_ID = 123;
    static final String UID = "uid";
    static final String SOURCE_FOLDER = "source_folder";
    static final long SOURCE_FOLDER_ID = 42;
    static final String DEST_FOLDER = "dest_folder";
    static final long DEST_FOLDER_ID = 23;
    static final HashMap<String, String> UID_MAP = new HashMap<>();
    public static final boolean IS_COPY = true;

@@ -58,15 +57,15 @@ public class PendingCommandSerializerTest {
    @Test
    public void testSerializeDeserialize__withComplexArguments() {
        PendingCommand pendingCommand = PendingMoveOrCopy.create(
                SOURCE_FOLDER, DEST_FOLDER, IS_COPY, UID_MAP);
                SOURCE_FOLDER_ID, DEST_FOLDER_ID, IS_COPY, UID_MAP);

        String serializedCommand = pendingCommandSerializer.serialize(pendingCommand);
        PendingMoveOrCopy unserializedCommand = (PendingMoveOrCopy) pendingCommandSerializer.unserialize(
                DATABASE_ID, pendingCommand.getCommandName(), serializedCommand);

        assertEquals(DATABASE_ID, unserializedCommand.databaseId);
        assertEquals(SOURCE_FOLDER, unserializedCommand.srcFolder);
        assertEquals(DEST_FOLDER, unserializedCommand.destFolder);
        assertEquals(SOURCE_FOLDER_ID, unserializedCommand.srcFolderId);
        assertEquals(DEST_FOLDER_ID, unserializedCommand.destFolderId);
        assertEquals(UID_MAP, unserializedCommand.newUidMap);
    }