Loading k9mail/src/main/java/com/fsck/k9/controller/MessagingController.java +314 −265 Original line number Diff line number Diff line Loading @@ -373,7 +373,8 @@ public class MessagingController { * foreground. * TODO this needs to cache the remote folder list */ public void listFoldersSynchronous(final Account account, final boolean refreshRemote, final MessagingListener listener) { public void listFoldersSynchronous(final Account account, final boolean refreshRemote, final MessagingListener listener) { for (MessagingListener l : getListeners(listener)) { l.listFoldersStarted(account); } Loading Loading @@ -521,9 +522,13 @@ public class MessagingController { // Collecting statistics of the search result MessageRetrievalListener<LocalMessage> retrievalListener = new MessageRetrievalListener<LocalMessage>() { @Override public void messageStarted(String message, int number, int ofTotal) { } public void messageStarted(String message, int number, int ofTotal) { } @Override public void messagesFinished(int number) { } public void messagesFinished(int number) { } @Override public void messageFinished(LocalMessage message, int number, int ofTotal) { if (!isMessageSuppressed(message)) { Loading Loading @@ -620,7 +625,8 @@ public class MessagingController { messages.clear(); if (listener != null) { listener.remoteSearchServerQueryComplete(folderName, remoteMessages.size(), acct.getRemoteSearchNumResults()); listener.remoteSearchServerQueryComplete(folderName, remoteMessages.size(), acct.getRemoteSearchNumResults()); } Collections.sort(remoteMessages, new UidReverseComparator()); Loading Loading @@ -746,7 +752,7 @@ public class MessagingController { /** * Start foreground synchronization of the specified folder. This is generally only called * by synchronizeMailbox. * * <p> * TODO Break this method up into smaller chunks. */ @VisibleForTesting Loading Loading @@ -899,7 +905,8 @@ public class MessagingController { } List<? extends Message> remoteMessageArray = remoteFolder.getMessages(remoteStart, remoteMessageCount, earliestDate, null); List<? extends Message> remoteMessageArray = remoteFolder.getMessages(remoteStart, remoteMessageCount, earliestDate, null); int messageCount = remoteMessageArray.size(); Loading Loading @@ -1023,7 +1030,8 @@ public class MessagingController { } notifyUserIfCertificateProblem(account, e, true); addErrorMessage(account, null, e); Log.e(K9.LOG_TAG, "Failed synchronizing folder " + account.getDescription() + ":" + folder + " @ " + new Date()); Log.e(K9.LOG_TAG, "Failed synchronizing folder " + account.getDescription() + ":" + folder + " @ " + new Date()); } finally { if (providedRemoteFolder == null) { Loading Loading @@ -1175,10 +1183,12 @@ public class MessagingController { fp.add(FetchProfile.Item.ENVELOPE); if (K9.DEBUG) { Log.d(K9.LOG_TAG, "SYNC: About to fetch " + unsyncedMessages.size() + " unsynced messages for folder " + folder); Log.d(K9.LOG_TAG, "SYNC: About to fetch " + unsyncedMessages.size() + " unsynced messages for folder " + folder); } fetchUnsyncedMessages(account, remoteFolder, unsyncedMessages, smallMessages, largeMessages, progress, todo, fp); fetchUnsyncedMessages(account, remoteFolder, unsyncedMessages, smallMessages, largeMessages, progress, todo, fp); String updatedPushState = localFolder.getPushState(); for (Message message : unsyncedMessages) { Loading Loading @@ -1211,14 +1221,16 @@ public class MessagingController { fp.add(FetchProfile.Item.BODY); // fp.add(FetchProfile.Item.FLAGS); // fp.add(FetchProfile.Item.ENVELOPE); downloadSmallMessages(account, remoteFolder, localFolder, smallMessages, progress, unreadBeforeStart, newMessages, todo, fp); downloadSmallMessages(account, remoteFolder, localFolder, smallMessages, progress, unreadBeforeStart, newMessages, todo, fp); smallMessages.clear(); /* * Now do the large messages that require more round trips. */ fp = new FetchProfile(); fp.add(FetchProfile.Item.STRUCTURE); downloadLargeMessages(account, remoteFolder, localFolder, largeMessages, progress, unreadBeforeStart, newMessages, todo, fp); downloadLargeMessages(account, remoteFolder, localFolder, largeMessages, progress, unreadBeforeStart, newMessages, todo, fp); largeMessages.clear(); /* Loading @@ -1229,7 +1241,8 @@ public class MessagingController { refreshLocalMessageFlags(account, remoteFolder, localFolder, syncFlagMessages, progress, todo); if (K9.DEBUG) { Log.d(K9.LOG_TAG, "SYNC: Synced remote messages for folder " + folder + ", " + newMessages.get() + " new messages"); Log.d(K9.LOG_TAG, "SYNC: Synced remote messages for folder " + folder + ", " + newMessages.get() + " new messages"); } if (purgeToVisibleLimit) { Loading Loading @@ -1354,10 +1367,12 @@ public class MessagingController { if (message.isSet(Flag.DELETED) || message.olderThan(earliestDate)) { if (K9.DEBUG) { if (message.isSet(Flag.DELETED)) { Log.v(K9.LOG_TAG, "Newly downloaded message " + account + ":" + folder + ":" + message.getUid() Log.v(K9.LOG_TAG, "Newly downloaded message " + account + ":" + folder + ":" + message.getUid() + " was marked deleted on server, skipping"); } else { Log.d(K9.LOG_TAG, "Newly downloaded message " + message.getUid() + " is older than " Log.d(K9.LOG_TAG, "Newly downloaded message " + message.getUid() + " is older than " + earliestDate + ", skipping"); } } Loading @@ -1382,7 +1397,8 @@ public class MessagingController { } @Override public void messageStarted(String uid, int number, int ofTotal) { } public void messageStarted(String uid, int number, int ofTotal) { } @Override public void messagesFinished(int total) { Loading Loading @@ -1474,10 +1490,12 @@ public class MessagingController { } @Override public void messageStarted(String uid, int number, int ofTotal) { } public void messageStarted(String uid, int number, int ofTotal) { } @Override public void messagesFinished(int total) { } public void messagesFinished(int total) { } }); if (K9.DEBUG) { Loading Loading @@ -1543,7 +1561,8 @@ public class MessagingController { } private void downloadPartial(Folder remoteFolder, LocalFolder localFolder, Message message) throws MessagingException { private void downloadPartial(Folder remoteFolder, LocalFolder localFolder, Message message) throws MessagingException { /* * We have a structure to deal with, from which * we can pull down the parts we want to actually store. Loading Loading @@ -1693,6 +1712,7 @@ public class MessagingController { } return messageChanged; } private String getRootCauseMessage(Throwable t) { Throwable rootCause = t; Throwable nextCause; Loading Loading @@ -1731,7 +1751,8 @@ public class MessagingController { try { processPendingCommandsSynchronous(account); } catch (UnavailableStorageException e) { Log.i(K9.LOG_TAG, "Failed to process pending command because storage is not available - trying again later."); Log.i(K9.LOG_TAG, "Failed to process pending command because storage is not available - trying again later."); throw new UnavailableAccountException(e); } catch (MessagingException me) { Log.e(K9.LOG_TAG, "processPendingCommands", me); Loading Loading @@ -1787,7 +1808,8 @@ public class MessagingController { } catch (MessagingException me) { if (me.isPermanentFailure()) { addErrorMessage(account, null, me); Log.e(K9.LOG_TAG, "Failure of command '" + command + "' was permanent, removing command from queue"); Log.e(K9.LOG_TAG, "Failure of command '" + command + "' was permanent, removing command from queue"); localStore.removePendingCommand(processingCommand); } else { throw me; Loading Loading @@ -1860,7 +1882,8 @@ public class MessagingController { if (remoteMessage == null) { if (localMessage.isSet(Flag.X_REMOTE_COPY_STARTED)) { Log.w(K9.LOG_TAG, "Local message with uid " + localMessage.getUid() + " has flag " + Flag.X_REMOTE_COPY_STARTED + " already set, checking for remote message with " + " has flag " + Flag.X_REMOTE_COPY_STARTED + " already set, checking for remote message with " + " same message id"); String rUid = remoteFolder.getUidFromMessageId(localMessage); if (rUid != null) { Loading Loading @@ -1943,7 +1966,9 @@ public class MessagingController { closeFolder(localFolder); } } private void queueMoveOrCopy(Account account, String srcFolder, String destFolder, boolean isCopy, List<String> uids) { private void queueMoveOrCopy(Account account, String srcFolder, String destFolder, boolean isCopy, List<String> uids) { if (account.getErrorFolderName().equals(srcFolder)) { return; } Loading Loading @@ -1991,7 +2016,8 @@ public class MessagingController { } if (!remoteSrcFolder.exists()) { throw new MessagingException("processingPendingMoveOrCopy: remoteFolder " + srcFolder + " does not exist", true); throw new MessagingException( "processingPendingMoveOrCopy: remoteFolder " + srcFolder + " does not exist", true); } remoteSrcFolder.open(Folder.OPEN_MODE_RW); if (remoteSrcFolder.getMode() != Folder.OPEN_MODE_RW) { Loading @@ -2001,7 +2027,8 @@ public class MessagingController { if (K9.DEBUG) { Log.d(K9.LOG_TAG, "processingPendingMoveOrCopy: source folder = " + srcFolder + ", " + messages.size() + " messages, destination folder = " + destFolder + ", isCopy = " + isCopy); + ", " + messages.size() + " messages, destination folder = " + destFolder + ", isCopy = " + isCopy); } Map<String, String> remoteUidMap = null; Loading @@ -2027,7 +2054,8 @@ public class MessagingController { } if (!isCopy && Expunge.EXPUNGE_IMMEDIATELY == account.getExpungePolicy()) { if (K9.DEBUG) { Log.i(K9.LOG_TAG, "processingPendingMoveOrCopy expunging folder " + account.getDescription() + ":" + srcFolder); Log.i(K9.LOG_TAG, "processingPendingMoveOrCopy expunging folder " + account.getDescription() + ":" + srcFolder); } remoteSrcFolder.expunge(); Loading Loading @@ -2073,6 +2101,7 @@ public class MessagingController { } }); } /** * Processes a pending mark read or unread command. */ Loading Loading @@ -2123,6 +2152,7 @@ public class MessagingController { } }); } void processPendingExpunge(PendingExpunge command, Account account) throws MessagingException { String folder = command.folder; Loading Loading @@ -2232,6 +2262,7 @@ public class MessagingController { } private static AtomicBoolean loopCatch = new AtomicBoolean(); private void addErrorMessage(Account account, String subject, String body) { if (!K9.DEBUG) { return; Loading Loading @@ -2270,7 +2301,6 @@ public class MessagingController { } public void markAllMessagesRead(final Account account, final String folder) { if (K9.DEBUG) { Loading Loading @@ -2370,7 +2400,7 @@ public class MessagingController { /** * Set or remove a flag for a set of messages in a specific folder. * * <p> * <p> * The {@link Message} objects passed in are updated to reflect the new flag state. * </p> Loading Loading @@ -2536,7 +2566,8 @@ public class MessagingController { message.setFlag(Flag.X_DOWNLOADED_PARTIAL, false); }*/ /*if (!message.isSet(Flag.X_DOWNLOADED_FULL)) */ { /*if (!message.isSet(Flag.X_DOWNLOADED_FULL)) */ { /* * At this point the message is not available, so we need to download it * fully if possible. Loading Loading @@ -2923,13 +2954,15 @@ public class MessagingController { } else { LocalFolder localSentFolder = localStore.getFolder(account.getSentFolderName()); if (K9.DEBUG) { Log.i(K9.LOG_TAG, "Moving sent message to folder '" + account.getSentFolderName() + "' (" + localSentFolder.getId() + ") "); Log.i(K9.LOG_TAG, "Moving sent message to folder '" + account.getSentFolderName() + "' (" + localSentFolder.getId() + ") "); } localFolder.moveMessages(Collections.singletonList(message), localSentFolder); if (K9.DEBUG) { Log.i(K9.LOG_TAG, "Moved sent message to folder '" + account.getSentFolderName() + "' (" + localSentFolder.getId() + ") "); Log.i(K9.LOG_TAG, "Moved sent message to folder '" + account.getSentFolderName() + "' (" + localSentFolder.getId() + ") "); } PendingCommand command = PendingAppend.create(localSentFolder.getName(), message.getUid()); Loading Loading @@ -3086,10 +3119,10 @@ public class MessagingController { } public boolean isMoveCapable(MessageReference messageReference) { return !messageReference.getUid().startsWith(K9.LOCAL_UID_PREFIX); } public boolean isCopyCapable(MessageReference message) { return isMoveCapable(message); } Loading @@ -3105,6 +3138,7 @@ public class MessagingController { return false; } } public boolean isCopyCapable(final Account account) { try { Store localStore = account.getLocalStore(); Loading @@ -3115,6 +3149,7 @@ public class MessagingController { return false; } } public void moveMessages(final Account srcAccount, final String srcFolder, List<MessageReference> messageReferences, final String destFolder) { actOnMessageGroup(srcAccount, srcFolder, messageReferences, new MessageActor() { Loading Loading @@ -3240,7 +3275,8 @@ public class MessagingController { if (K9.DEBUG) { Log.i(K9.LOG_TAG, "moveOrCopyMessageSynchronous: source folder = " + srcFolder + ", " + messages.size() + " messages, " + ", destination folder = " + destFolder + ", isCopy = " + isCopy); + ", " + messages.size() + " messages, " + ", destination folder = " + destFolder + ", isCopy = " + isCopy); } Map<String, String> uidMap; Loading Loading @@ -3329,7 +3365,8 @@ public class MessagingController { public void deleteThreads(final List<MessageReference> messages) { actOnMessagesGroupedByAccountAndFolder(messages, new MessageActor() { @Override public void act(final Account account, final LocalFolder messageFolder, final List<LocalMessage> accountMessages) { public void act(final Account account, final LocalFolder messageFolder, final List<LocalMessage> accountMessages) { suppressMessages(account, accountMessages); putBackground("deleteThreads", null, new Runnable() { Loading Loading @@ -3380,7 +3417,8 @@ public class MessagingController { actOnMessagesGroupedByAccountAndFolder(messages, new MessageActor() { @Override public void act(final Account account, final LocalFolder messageFolder, final List<LocalMessage> accountMessages) { public void act(final Account account, final LocalFolder messageFolder, final List<LocalMessage> accountMessages) { suppressMessages(account, accountMessages); putBackground("deleteMessages", null, new Runnable() { Loading Loading @@ -3423,7 +3461,8 @@ public class MessagingController { } private void deleteMessagesSynchronous(final Account account, final String folder, final List<? extends Message> messages, private void deleteMessagesSynchronous(final Account account, final String folder, final List<? extends Message> messages, MessagingListener listener) { Folder localFolder = null; Folder localTrashFolder = null; Loading Loading @@ -3463,12 +3502,14 @@ public class MessagingController { for (MessagingListener l : getListeners()) { l.folderStatusChanged(account, folder, localFolder.getUnreadMessageCount()); if (localTrashFolder != null) { l.folderStatusChanged(account, account.getTrashFolderName(), localTrashFolder.getUnreadMessageCount()); l.folderStatusChanged(account, account.getTrashFolderName(), localTrashFolder.getUnreadMessageCount()); } } if (K9.DEBUG) { Log.d(K9.LOG_TAG, "Delete policy for account " + account.getDescription() + " is " + account.getDeletePolicy()); Log.d(K9.LOG_TAG, "Delete policy for account " + account.getDescription() + " is " + account.getDeletePolicy()); } if (folder.equals(account.getOutboxFolderName())) { Loading Loading @@ -3612,7 +3653,7 @@ public class MessagingController { /** * Find out whether the account type only supports a local Trash folder. * * <p> * <p>Note: Currently this is only the case for POP3 accounts.</p> * * @param account Loading Loading @@ -3745,7 +3786,6 @@ public class MessagingController { } private void checkMailForAccount(final Context context, final Account account, final boolean ignoreLastCheckedTime, final MessagingListener listener) { Loading Loading @@ -3925,7 +3965,8 @@ public class MessagingController { l.accountSizeChanged(account, oldSize, newSize); } } catch (UnavailableStorageException e) { Log.i(K9.LOG_TAG, "Failed to compact account because storage is not available - trying again later."); Log.i(K9.LOG_TAG, "Failed to compact account because storage is not available - trying again later."); throw new UnavailableAccountException(e); } catch (Exception e) { Log.e(K9.LOG_TAG, "Failed to compact account " + account.getDescription(), e); Loading Loading @@ -3981,7 +4022,8 @@ public class MessagingController { l.accountStatusChanged(account, stats); } } catch (UnavailableStorageException e) { Log.i(K9.LOG_TAG, "Failed to recreate an account because storage is not available - trying again later."); Log.i(K9.LOG_TAG, "Failed to recreate an account because storage is not available - trying again later."); throw new UnavailableAccountException(e); } catch (Exception e) { Log.e(K9.LOG_TAG, "Failed to recreate account " + account.getDescription(), e); Loading Loading @@ -4075,8 +4117,12 @@ public class MessagingController { /** * Save a draft message. * @param account Account we are saving for. * @param message Message to save. * * @param account * Account we are saving for. * @param message * Message to save. * * @return Message representing the entry in the local store. */ public Message saveDraft(final Account account, final Message message, long existingDraftId, boolean saveRemotely) { Loading Loading @@ -4138,6 +4184,7 @@ public class MessagingController { } private static AtomicInteger sequencing = new AtomicInteger(0); private static class Command implements Comparable<Command> { public Runnable runnable; public MessagingListener listener; Loading Loading @@ -4242,7 +4289,8 @@ public class MessagingController { if (names.size() > maxPushFolders) { if (K9.DEBUG) { Log.i(K9.LOG_TAG, "Count of folders to push for account " + account.getDescription() + " is " + names.size() Log.i(K9.LOG_TAG, "Count of folders to push for account " + account.getDescription() + " is " + names.size() + ", greater than limit of " + maxPushFolders + ", truncating"); } Loading Loading @@ -4324,7 +4372,8 @@ public class MessagingController { localFolder.setStatus(null); if (K9.DEBUG) { Log.i(K9.LOG_TAG, "messagesArrived newCount = " + newCount + ", unread count = " + unreadMessageCount); Log.i(K9.LOG_TAG, "messagesArrived newCount = " + newCount + ", unread count = " + unreadMessageCount); } if (unreadMessageCount == 0) { Loading Loading
k9mail/src/main/java/com/fsck/k9/controller/MessagingController.java +314 −265 Original line number Diff line number Diff line Loading @@ -373,7 +373,8 @@ public class MessagingController { * foreground. * TODO this needs to cache the remote folder list */ public void listFoldersSynchronous(final Account account, final boolean refreshRemote, final MessagingListener listener) { public void listFoldersSynchronous(final Account account, final boolean refreshRemote, final MessagingListener listener) { for (MessagingListener l : getListeners(listener)) { l.listFoldersStarted(account); } Loading Loading @@ -521,9 +522,13 @@ public class MessagingController { // Collecting statistics of the search result MessageRetrievalListener<LocalMessage> retrievalListener = new MessageRetrievalListener<LocalMessage>() { @Override public void messageStarted(String message, int number, int ofTotal) { } public void messageStarted(String message, int number, int ofTotal) { } @Override public void messagesFinished(int number) { } public void messagesFinished(int number) { } @Override public void messageFinished(LocalMessage message, int number, int ofTotal) { if (!isMessageSuppressed(message)) { Loading Loading @@ -620,7 +625,8 @@ public class MessagingController { messages.clear(); if (listener != null) { listener.remoteSearchServerQueryComplete(folderName, remoteMessages.size(), acct.getRemoteSearchNumResults()); listener.remoteSearchServerQueryComplete(folderName, remoteMessages.size(), acct.getRemoteSearchNumResults()); } Collections.sort(remoteMessages, new UidReverseComparator()); Loading Loading @@ -746,7 +752,7 @@ public class MessagingController { /** * Start foreground synchronization of the specified folder. This is generally only called * by synchronizeMailbox. * * <p> * TODO Break this method up into smaller chunks. */ @VisibleForTesting Loading Loading @@ -899,7 +905,8 @@ public class MessagingController { } List<? extends Message> remoteMessageArray = remoteFolder.getMessages(remoteStart, remoteMessageCount, earliestDate, null); List<? extends Message> remoteMessageArray = remoteFolder.getMessages(remoteStart, remoteMessageCount, earliestDate, null); int messageCount = remoteMessageArray.size(); Loading Loading @@ -1023,7 +1030,8 @@ public class MessagingController { } notifyUserIfCertificateProblem(account, e, true); addErrorMessage(account, null, e); Log.e(K9.LOG_TAG, "Failed synchronizing folder " + account.getDescription() + ":" + folder + " @ " + new Date()); Log.e(K9.LOG_TAG, "Failed synchronizing folder " + account.getDescription() + ":" + folder + " @ " + new Date()); } finally { if (providedRemoteFolder == null) { Loading Loading @@ -1175,10 +1183,12 @@ public class MessagingController { fp.add(FetchProfile.Item.ENVELOPE); if (K9.DEBUG) { Log.d(K9.LOG_TAG, "SYNC: About to fetch " + unsyncedMessages.size() + " unsynced messages for folder " + folder); Log.d(K9.LOG_TAG, "SYNC: About to fetch " + unsyncedMessages.size() + " unsynced messages for folder " + folder); } fetchUnsyncedMessages(account, remoteFolder, unsyncedMessages, smallMessages, largeMessages, progress, todo, fp); fetchUnsyncedMessages(account, remoteFolder, unsyncedMessages, smallMessages, largeMessages, progress, todo, fp); String updatedPushState = localFolder.getPushState(); for (Message message : unsyncedMessages) { Loading Loading @@ -1211,14 +1221,16 @@ public class MessagingController { fp.add(FetchProfile.Item.BODY); // fp.add(FetchProfile.Item.FLAGS); // fp.add(FetchProfile.Item.ENVELOPE); downloadSmallMessages(account, remoteFolder, localFolder, smallMessages, progress, unreadBeforeStart, newMessages, todo, fp); downloadSmallMessages(account, remoteFolder, localFolder, smallMessages, progress, unreadBeforeStart, newMessages, todo, fp); smallMessages.clear(); /* * Now do the large messages that require more round trips. */ fp = new FetchProfile(); fp.add(FetchProfile.Item.STRUCTURE); downloadLargeMessages(account, remoteFolder, localFolder, largeMessages, progress, unreadBeforeStart, newMessages, todo, fp); downloadLargeMessages(account, remoteFolder, localFolder, largeMessages, progress, unreadBeforeStart, newMessages, todo, fp); largeMessages.clear(); /* Loading @@ -1229,7 +1241,8 @@ public class MessagingController { refreshLocalMessageFlags(account, remoteFolder, localFolder, syncFlagMessages, progress, todo); if (K9.DEBUG) { Log.d(K9.LOG_TAG, "SYNC: Synced remote messages for folder " + folder + ", " + newMessages.get() + " new messages"); Log.d(K9.LOG_TAG, "SYNC: Synced remote messages for folder " + folder + ", " + newMessages.get() + " new messages"); } if (purgeToVisibleLimit) { Loading Loading @@ -1354,10 +1367,12 @@ public class MessagingController { if (message.isSet(Flag.DELETED) || message.olderThan(earliestDate)) { if (K9.DEBUG) { if (message.isSet(Flag.DELETED)) { Log.v(K9.LOG_TAG, "Newly downloaded message " + account + ":" + folder + ":" + message.getUid() Log.v(K9.LOG_TAG, "Newly downloaded message " + account + ":" + folder + ":" + message.getUid() + " was marked deleted on server, skipping"); } else { Log.d(K9.LOG_TAG, "Newly downloaded message " + message.getUid() + " is older than " Log.d(K9.LOG_TAG, "Newly downloaded message " + message.getUid() + " is older than " + earliestDate + ", skipping"); } } Loading @@ -1382,7 +1397,8 @@ public class MessagingController { } @Override public void messageStarted(String uid, int number, int ofTotal) { } public void messageStarted(String uid, int number, int ofTotal) { } @Override public void messagesFinished(int total) { Loading Loading @@ -1474,10 +1490,12 @@ public class MessagingController { } @Override public void messageStarted(String uid, int number, int ofTotal) { } public void messageStarted(String uid, int number, int ofTotal) { } @Override public void messagesFinished(int total) { } public void messagesFinished(int total) { } }); if (K9.DEBUG) { Loading Loading @@ -1543,7 +1561,8 @@ public class MessagingController { } private void downloadPartial(Folder remoteFolder, LocalFolder localFolder, Message message) throws MessagingException { private void downloadPartial(Folder remoteFolder, LocalFolder localFolder, Message message) throws MessagingException { /* * We have a structure to deal with, from which * we can pull down the parts we want to actually store. Loading Loading @@ -1693,6 +1712,7 @@ public class MessagingController { } return messageChanged; } private String getRootCauseMessage(Throwable t) { Throwable rootCause = t; Throwable nextCause; Loading Loading @@ -1731,7 +1751,8 @@ public class MessagingController { try { processPendingCommandsSynchronous(account); } catch (UnavailableStorageException e) { Log.i(K9.LOG_TAG, "Failed to process pending command because storage is not available - trying again later."); Log.i(K9.LOG_TAG, "Failed to process pending command because storage is not available - trying again later."); throw new UnavailableAccountException(e); } catch (MessagingException me) { Log.e(K9.LOG_TAG, "processPendingCommands", me); Loading Loading @@ -1787,7 +1808,8 @@ public class MessagingController { } catch (MessagingException me) { if (me.isPermanentFailure()) { addErrorMessage(account, null, me); Log.e(K9.LOG_TAG, "Failure of command '" + command + "' was permanent, removing command from queue"); Log.e(K9.LOG_TAG, "Failure of command '" + command + "' was permanent, removing command from queue"); localStore.removePendingCommand(processingCommand); } else { throw me; Loading Loading @@ -1860,7 +1882,8 @@ public class MessagingController { if (remoteMessage == null) { if (localMessage.isSet(Flag.X_REMOTE_COPY_STARTED)) { Log.w(K9.LOG_TAG, "Local message with uid " + localMessage.getUid() + " has flag " + Flag.X_REMOTE_COPY_STARTED + " already set, checking for remote message with " + " has flag " + Flag.X_REMOTE_COPY_STARTED + " already set, checking for remote message with " + " same message id"); String rUid = remoteFolder.getUidFromMessageId(localMessage); if (rUid != null) { Loading Loading @@ -1943,7 +1966,9 @@ public class MessagingController { closeFolder(localFolder); } } private void queueMoveOrCopy(Account account, String srcFolder, String destFolder, boolean isCopy, List<String> uids) { private void queueMoveOrCopy(Account account, String srcFolder, String destFolder, boolean isCopy, List<String> uids) { if (account.getErrorFolderName().equals(srcFolder)) { return; } Loading Loading @@ -1991,7 +2016,8 @@ public class MessagingController { } if (!remoteSrcFolder.exists()) { throw new MessagingException("processingPendingMoveOrCopy: remoteFolder " + srcFolder + " does not exist", true); throw new MessagingException( "processingPendingMoveOrCopy: remoteFolder " + srcFolder + " does not exist", true); } remoteSrcFolder.open(Folder.OPEN_MODE_RW); if (remoteSrcFolder.getMode() != Folder.OPEN_MODE_RW) { Loading @@ -2001,7 +2027,8 @@ public class MessagingController { if (K9.DEBUG) { Log.d(K9.LOG_TAG, "processingPendingMoveOrCopy: source folder = " + srcFolder + ", " + messages.size() + " messages, destination folder = " + destFolder + ", isCopy = " + isCopy); + ", " + messages.size() + " messages, destination folder = " + destFolder + ", isCopy = " + isCopy); } Map<String, String> remoteUidMap = null; Loading @@ -2027,7 +2054,8 @@ public class MessagingController { } if (!isCopy && Expunge.EXPUNGE_IMMEDIATELY == account.getExpungePolicy()) { if (K9.DEBUG) { Log.i(K9.LOG_TAG, "processingPendingMoveOrCopy expunging folder " + account.getDescription() + ":" + srcFolder); Log.i(K9.LOG_TAG, "processingPendingMoveOrCopy expunging folder " + account.getDescription() + ":" + srcFolder); } remoteSrcFolder.expunge(); Loading Loading @@ -2073,6 +2101,7 @@ public class MessagingController { } }); } /** * Processes a pending mark read or unread command. */ Loading Loading @@ -2123,6 +2152,7 @@ public class MessagingController { } }); } void processPendingExpunge(PendingExpunge command, Account account) throws MessagingException { String folder = command.folder; Loading Loading @@ -2232,6 +2262,7 @@ public class MessagingController { } private static AtomicBoolean loopCatch = new AtomicBoolean(); private void addErrorMessage(Account account, String subject, String body) { if (!K9.DEBUG) { return; Loading Loading @@ -2270,7 +2301,6 @@ public class MessagingController { } public void markAllMessagesRead(final Account account, final String folder) { if (K9.DEBUG) { Loading Loading @@ -2370,7 +2400,7 @@ public class MessagingController { /** * Set or remove a flag for a set of messages in a specific folder. * * <p> * <p> * The {@link Message} objects passed in are updated to reflect the new flag state. * </p> Loading Loading @@ -2536,7 +2566,8 @@ public class MessagingController { message.setFlag(Flag.X_DOWNLOADED_PARTIAL, false); }*/ /*if (!message.isSet(Flag.X_DOWNLOADED_FULL)) */ { /*if (!message.isSet(Flag.X_DOWNLOADED_FULL)) */ { /* * At this point the message is not available, so we need to download it * fully if possible. Loading Loading @@ -2923,13 +2954,15 @@ public class MessagingController { } else { LocalFolder localSentFolder = localStore.getFolder(account.getSentFolderName()); if (K9.DEBUG) { Log.i(K9.LOG_TAG, "Moving sent message to folder '" + account.getSentFolderName() + "' (" + localSentFolder.getId() + ") "); Log.i(K9.LOG_TAG, "Moving sent message to folder '" + account.getSentFolderName() + "' (" + localSentFolder.getId() + ") "); } localFolder.moveMessages(Collections.singletonList(message), localSentFolder); if (K9.DEBUG) { Log.i(K9.LOG_TAG, "Moved sent message to folder '" + account.getSentFolderName() + "' (" + localSentFolder.getId() + ") "); Log.i(K9.LOG_TAG, "Moved sent message to folder '" + account.getSentFolderName() + "' (" + localSentFolder.getId() + ") "); } PendingCommand command = PendingAppend.create(localSentFolder.getName(), message.getUid()); Loading Loading @@ -3086,10 +3119,10 @@ public class MessagingController { } public boolean isMoveCapable(MessageReference messageReference) { return !messageReference.getUid().startsWith(K9.LOCAL_UID_PREFIX); } public boolean isCopyCapable(MessageReference message) { return isMoveCapable(message); } Loading @@ -3105,6 +3138,7 @@ public class MessagingController { return false; } } public boolean isCopyCapable(final Account account) { try { Store localStore = account.getLocalStore(); Loading @@ -3115,6 +3149,7 @@ public class MessagingController { return false; } } public void moveMessages(final Account srcAccount, final String srcFolder, List<MessageReference> messageReferences, final String destFolder) { actOnMessageGroup(srcAccount, srcFolder, messageReferences, new MessageActor() { Loading Loading @@ -3240,7 +3275,8 @@ public class MessagingController { if (K9.DEBUG) { Log.i(K9.LOG_TAG, "moveOrCopyMessageSynchronous: source folder = " + srcFolder + ", " + messages.size() + " messages, " + ", destination folder = " + destFolder + ", isCopy = " + isCopy); + ", " + messages.size() + " messages, " + ", destination folder = " + destFolder + ", isCopy = " + isCopy); } Map<String, String> uidMap; Loading Loading @@ -3329,7 +3365,8 @@ public class MessagingController { public void deleteThreads(final List<MessageReference> messages) { actOnMessagesGroupedByAccountAndFolder(messages, new MessageActor() { @Override public void act(final Account account, final LocalFolder messageFolder, final List<LocalMessage> accountMessages) { public void act(final Account account, final LocalFolder messageFolder, final List<LocalMessage> accountMessages) { suppressMessages(account, accountMessages); putBackground("deleteThreads", null, new Runnable() { Loading Loading @@ -3380,7 +3417,8 @@ public class MessagingController { actOnMessagesGroupedByAccountAndFolder(messages, new MessageActor() { @Override public void act(final Account account, final LocalFolder messageFolder, final List<LocalMessage> accountMessages) { public void act(final Account account, final LocalFolder messageFolder, final List<LocalMessage> accountMessages) { suppressMessages(account, accountMessages); putBackground("deleteMessages", null, new Runnable() { Loading Loading @@ -3423,7 +3461,8 @@ public class MessagingController { } private void deleteMessagesSynchronous(final Account account, final String folder, final List<? extends Message> messages, private void deleteMessagesSynchronous(final Account account, final String folder, final List<? extends Message> messages, MessagingListener listener) { Folder localFolder = null; Folder localTrashFolder = null; Loading Loading @@ -3463,12 +3502,14 @@ public class MessagingController { for (MessagingListener l : getListeners()) { l.folderStatusChanged(account, folder, localFolder.getUnreadMessageCount()); if (localTrashFolder != null) { l.folderStatusChanged(account, account.getTrashFolderName(), localTrashFolder.getUnreadMessageCount()); l.folderStatusChanged(account, account.getTrashFolderName(), localTrashFolder.getUnreadMessageCount()); } } if (K9.DEBUG) { Log.d(K9.LOG_TAG, "Delete policy for account " + account.getDescription() + " is " + account.getDeletePolicy()); Log.d(K9.LOG_TAG, "Delete policy for account " + account.getDescription() + " is " + account.getDeletePolicy()); } if (folder.equals(account.getOutboxFolderName())) { Loading Loading @@ -3612,7 +3653,7 @@ public class MessagingController { /** * Find out whether the account type only supports a local Trash folder. * * <p> * <p>Note: Currently this is only the case for POP3 accounts.</p> * * @param account Loading Loading @@ -3745,7 +3786,6 @@ public class MessagingController { } private void checkMailForAccount(final Context context, final Account account, final boolean ignoreLastCheckedTime, final MessagingListener listener) { Loading Loading @@ -3925,7 +3965,8 @@ public class MessagingController { l.accountSizeChanged(account, oldSize, newSize); } } catch (UnavailableStorageException e) { Log.i(K9.LOG_TAG, "Failed to compact account because storage is not available - trying again later."); Log.i(K9.LOG_TAG, "Failed to compact account because storage is not available - trying again later."); throw new UnavailableAccountException(e); } catch (Exception e) { Log.e(K9.LOG_TAG, "Failed to compact account " + account.getDescription(), e); Loading Loading @@ -3981,7 +4022,8 @@ public class MessagingController { l.accountStatusChanged(account, stats); } } catch (UnavailableStorageException e) { Log.i(K9.LOG_TAG, "Failed to recreate an account because storage is not available - trying again later."); Log.i(K9.LOG_TAG, "Failed to recreate an account because storage is not available - trying again later."); throw new UnavailableAccountException(e); } catch (Exception e) { Log.e(K9.LOG_TAG, "Failed to recreate account " + account.getDescription(), e); Loading Loading @@ -4075,8 +4117,12 @@ public class MessagingController { /** * Save a draft message. * @param account Account we are saving for. * @param message Message to save. * * @param account * Account we are saving for. * @param message * Message to save. * * @return Message representing the entry in the local store. */ public Message saveDraft(final Account account, final Message message, long existingDraftId, boolean saveRemotely) { Loading Loading @@ -4138,6 +4184,7 @@ public class MessagingController { } private static AtomicInteger sequencing = new AtomicInteger(0); private static class Command implements Comparable<Command> { public Runnable runnable; public MessagingListener listener; Loading Loading @@ -4242,7 +4289,8 @@ public class MessagingController { if (names.size() > maxPushFolders) { if (K9.DEBUG) { Log.i(K9.LOG_TAG, "Count of folders to push for account " + account.getDescription() + " is " + names.size() Log.i(K9.LOG_TAG, "Count of folders to push for account " + account.getDescription() + " is " + names.size() + ", greater than limit of " + maxPushFolders + ", truncating"); } Loading Loading @@ -4324,7 +4372,8 @@ public class MessagingController { localFolder.setStatus(null); if (K9.DEBUG) { Log.i(K9.LOG_TAG, "messagesArrived newCount = " + newCount + ", unread count = " + unreadMessageCount); Log.i(K9.LOG_TAG, "messagesArrived newCount = " + newCount + ", unread count = " + unreadMessageCount); } if (unreadMessageCount == 0) { Loading