diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index 9bb16c396f..328a1b03ef 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -425,7 +425,7 @@ public class ServiceSynchronize extends LifecycleService { // Update folder list try { - synchronizeFolders(account, istore); + synchronizeFolders(account, istore, state); } catch (MessagingException ex) { // Don't show to user throw new IllegalStateException("synchronize folders", ex); @@ -505,7 +505,7 @@ public class ServiceSynchronize extends LifecycleService { }); // Fetch e-mail - synchronizeMessages(account, folder, ifolder); + synchronizeMessages(account, folder, ifolder, state); // Flags (like "seen") at the remote could be changed while synchronizing @@ -1050,7 +1050,7 @@ public class ServiceSynchronize extends LifecycleService { } } - private void synchronizeFolders(EntityAccount account, IMAPStore istore) throws MessagingException { + private void synchronizeFolders(EntityAccount account, IMAPStore istore, ServiceState state) throws MessagingException { try { Log.v(Helper.TAG, "Start sync folders"); @@ -1065,6 +1065,9 @@ public class ServiceSynchronize extends LifecycleService { Log.i(Helper.TAG, "Remote folder count=" + ifolders.length); for (Folder ifolder : ifolders) { + if (!state.running) + return; + String[] attrs = ((IMAPFolder) ifolder).getAttributes(); boolean selectable = true; for (String attr : attrs) { @@ -1104,7 +1107,7 @@ public class ServiceSynchronize extends LifecycleService { } } - private void synchronizeMessages(EntityAccount account, EntityFolder folder, IMAPFolder ifolder) throws MessagingException, IOException { + private void synchronizeMessages(EntityAccount account, EntityFolder folder, IMAPFolder ifolder, ServiceState state) throws MessagingException, IOException { try { Log.v(Helper.TAG, folder.name + " start sync after=" + folder.after); @@ -1143,7 +1146,10 @@ public class ServiceSynchronize extends LifecycleService { long fetch = SystemClock.elapsedRealtime(); Log.i(Helper.TAG, folder.name + " remote fetched=" + (SystemClock.elapsedRealtime() - fetch) + " ms"); - for (Message imessage : imessages) + for (Message imessage : imessages) { + if (!state.running) + return; + try { uids.remove(ifolder.getUID(imessage)); } catch (MessageRemovedException ex) { @@ -1154,6 +1160,7 @@ public class ServiceSynchronize extends LifecycleService { db.folder().setFolderError(folder.id, Helper.formatThrowable(ex)); } + } // Delete local messages not at remote Log.i(Helper.TAG, folder.name + " delete=" + uids.size());