Loading app/core/src/main/java/com/fsck/k9/controller/MessagingController.java +35 −20 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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()); Loading @@ -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"); Loading @@ -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 Loading @@ -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. Loading Loading @@ -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<>(); Loading Loading @@ -1881,7 +1891,8 @@ public class MessagingController { } } queueMoveOrCopy(account, srcFolder, destFolder, operation, uidMap); queueMoveOrCopy(account, localSrcFolder.getDatabaseId(), localDestFolder.getDatabaseId(), operation, uidMap); } processPendingCommands(account); Loading Loading @@ -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())) { Loading Loading @@ -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); Loading app/core/src/main/java/com/fsck/k9/controller/MessagingControllerCommands.java +14 −22 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; } Loading app/core/src/test/java/com/fsck/k9/controller/PendingCommandSerializerTest.java +4 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } Loading Loading
app/core/src/main/java/com/fsck/k9/controller/MessagingController.java +35 −20 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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()); Loading @@ -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"); Loading @@ -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 Loading @@ -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. Loading Loading @@ -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<>(); Loading Loading @@ -1881,7 +1891,8 @@ public class MessagingController { } } queueMoveOrCopy(account, srcFolder, destFolder, operation, uidMap); queueMoveOrCopy(account, localSrcFolder.getDatabaseId(), localDestFolder.getDatabaseId(), operation, uidMap); } processPendingCommands(account); Loading Loading @@ -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())) { Loading Loading @@ -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); Loading
app/core/src/main/java/com/fsck/k9/controller/MessagingControllerCommands.java +14 −22 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; } Loading
app/core/src/test/java/com/fsck/k9/controller/PendingCommandSerializerTest.java +4 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } Loading