diff --git a/res/xml/global_preferences.xml b/res/xml/global_preferences.xml index dbc54b117..5dca2b93c 100644 --- a/res/xml/global_preferences.xml +++ b/res/xml/global_preferences.xml @@ -264,25 +264,25 @@ - - - - (System.currentTimeMillis() - accountInterval)) - { - if (K9.DEBUG) - Log.v(K9.LOG_TAG, "Not syncing folder " + folder.getName() - + ", previously synced @ " + new Date(folder.getLastChecked()) - + " which would be too recent for the account period"); - - continue; - } - putBackground("sync" + folder.getName(), null, new Runnable() - { - public void run() - { - LocalFolder tLocalFolder = null; - try - { - // In case multiple Commands get enqueued, don't run more than - // once - final LocalStore localStore = account.getLocalStore(); - tLocalFolder = localStore.getFolder(folder.getName()); - tLocalFolder.open(Folder.OpenMode.READ_WRITE); - - if (!ignoreLastCheckedTime && tLocalFolder.getLastChecked() > - (System.currentTimeMillis() - accountInterval)) - { - if (K9.DEBUG) - Log.v(K9.LOG_TAG, "Not running Command for folder " + folder.getName() - + ", previously synced @ " + new Date(folder.getLastChecked()) - + " which would be too recent for the account period"); - return; - } - if (account.isShowOngoing()) - { - Notification notif = new Notification(R.drawable.ic_menu_refresh, - context.getString(R.string.notification_bg_sync_ticker, account.getDescription(), folder.getName()), - System.currentTimeMillis()); - Intent intent = MessageList.actionHandleFolderIntent(context, account, K9.INBOX); - PendingIntent pi = PendingIntent.getActivity(context, 0, intent, 0); - notif.setLatestEventInfo(context, context.getString(R.string.notification_bg_sync_title), account.getDescription() - + context.getString(R.string.notification_bg_title_separator) + folder.getName(), pi); - notif.flags = Notification.FLAG_ONGOING_EVENT; - if (K9.NOTIFICATION_LED_WHILE_SYNCING) - { - notif.flags |= Notification.FLAG_SHOW_LIGHTS; - notif.ledARGB = account.getNotificationSetting().getLedColor(); - notif.ledOnMS = K9.NOTIFICATION_LED_FAST_ON_TIME; - notif.ledOffMS = K9.NOTIFICATION_LED_FAST_OFF_TIME; - } - - notifMgr.notify(K9.FETCHING_EMAIL_NOTIFICATION - account.getAccountNumber(), notif); - } - try - { - synchronizeMailboxSynchronous(account, folder.getName(), listener, null); - } - finally - { - if (account.isShowOngoing()) - { - notifMgr.cancel(K9.FETCHING_EMAIL_NOTIFICATION - account.getAccountNumber()); - } - } - } - catch (Exception e) - { - - Log.e(K9.LOG_TAG, "Exception while processing folder " + - account.getDescription() + ":" + folder.getName(), e); - addErrorMessage(account, null, e); - } - finally - { - if (tLocalFolder != null) - { - tLocalFolder.close(); - } - } - } - } - ); - } - } - catch (MessagingException e) - { - Log.e(K9.LOG_TAG, "Unable to synchronize account " + account.getName(), e); - addErrorMessage(account, null, e); - } - finally - { - putBackground("clear notification flag for " + account.getDescription(), null, new Runnable() - { - public void run() - { - if (K9.DEBUG) - Log.v(K9.LOG_TAG, "Clearing notification flag for " + account.getDescription()); - account.setRingNotified(false); - try - { - AccountStats stats = account.getStats(context); - if (stats == null || stats.unreadMessageCount == 0) - { - notifyAccountCancel(context, account); - } - } - catch (MessagingException e) - { - Log.e(K9.LOG_TAG, "Unable to getUnreadMessageCount for account: " + account, e); - } - } - } - ); - } - - + checkMailForAccount(context, account,ignoreLastCheckedTime, notifMgr, prefs, listener); } + } catch (Exception e) { @@ -4495,6 +4316,200 @@ public class MessagingController implements Runnable }); } + + + private void checkMailForAccount(final Context context, final Account account, + final boolean ignoreLastCheckedTime, + final NotificationManager notifMgr, + final Preferences prefs, + final MessagingListener listener) + { + if (!account.isAvailable(context)) + { + if (K9.DEBUG) + { + Log.i(K9.LOG_TAG, "Skipping synchronizing unavailable account " + account.getDescription()); + } + return; + } + final long accountInterval = account.getAutomaticCheckIntervalMinutes() * 60 * 1000; + if (!ignoreLastCheckedTime && accountInterval <= 0) + { + if (K9.DEBUG) + Log.i(K9.LOG_TAG, "Skipping synchronizing account " + account.getDescription()); + return; + } + + if (K9.DEBUG) + Log.i(K9.LOG_TAG, "Synchronizing account " + account.getDescription()); + + account.setRingNotified(false); + + sendPendingMessages(account, listener); + + try + { + Account.FolderMode aDisplayMode = account.getFolderDisplayMode(); + Account.FolderMode aSyncMode = account.getFolderSyncMode(); + + Store localStore = account.getLocalStore(); + for (final Folder folder : localStore.getPersonalNamespaces(false)) + { + + folder.open(Folder.OpenMode.READ_WRITE); + folder.refresh(prefs); + + Folder.FolderClass fDisplayClass = folder.getDisplayClass(); + Folder.FolderClass fSyncClass = folder.getSyncClass(); + + if (modeMismatch(aDisplayMode, fDisplayClass)) + { + // Never sync a folder that isn't displayed + /* + if (K9.DEBUG) + Log.v(K9.LOG_TAG, "Not syncing folder " + folder.getName() + + " which is in display mode " + fDisplayClass + " while account is in display mode " + aDisplayMode); + */ + + return; + } + + if (modeMismatch(aSyncMode, fSyncClass)) + { + // Do not sync folders in the wrong class + /* + if (K9.DEBUG) + Log.v(K9.LOG_TAG, "Not syncing folder " + folder.getName() + + " which is in sync mode " + fSyncClass + " while account is in sync mode " + aSyncMode); + */ + + return; + } + + if (K9.DEBUG) + Log.v(K9.LOG_TAG, "Folder " + folder.getName() + " was last synced @ " + + new Date(folder.getLastChecked())); + + if (!ignoreLastCheckedTime && folder.getLastChecked() > + (System.currentTimeMillis() - accountInterval)) + { + if (K9.DEBUG) + Log.v(K9.LOG_TAG, "Not syncing folder " + folder.getName() + + ", previously synced @ " + new Date(folder.getLastChecked()) + + " which would be too recent for the account period"); + + return; + } + putBackground("sync" + folder.getName(), null, new Runnable() + { + public void run() + { + LocalFolder tLocalFolder = null; + try + { + // In case multiple Commands get enqueued, don't run more than + // once + final LocalStore localStore = account.getLocalStore(); + tLocalFolder = localStore.getFolder(folder.getName()); + tLocalFolder.open(Folder.OpenMode.READ_WRITE); + + if (!ignoreLastCheckedTime && tLocalFolder.getLastChecked() > + (System.currentTimeMillis() - accountInterval)) + { + if (K9.DEBUG) + Log.v(K9.LOG_TAG, "Not running Command for folder " + folder.getName() + + ", previously synced @ " + new Date(folder.getLastChecked()) + + " which would be too recent for the account period"); + return; + } + if (account.isShowOngoing()) + { + Notification notif = new Notification(R.drawable.ic_menu_refresh, + context.getString(R.string.notification_bg_sync_ticker, account.getDescription(), folder.getName()), + System.currentTimeMillis()); + Intent intent = MessageList.actionHandleFolderIntent(context, account, K9.INBOX); + PendingIntent pi = PendingIntent.getActivity(context, 0, intent, 0); + notif.setLatestEventInfo(context, context.getString(R.string.notification_bg_sync_title), account.getDescription() + + context.getString(R.string.notification_bg_title_separator) + folder.getName(), pi); + notif.flags = Notification.FLAG_ONGOING_EVENT; + if (K9.NOTIFICATION_LED_WHILE_SYNCING) + { + notif.flags |= Notification.FLAG_SHOW_LIGHTS; + notif.ledARGB = account.getNotificationSetting().getLedColor(); + notif.ledOnMS = K9.NOTIFICATION_LED_FAST_ON_TIME; + notif.ledOffMS = K9.NOTIFICATION_LED_FAST_OFF_TIME; + } + + notifMgr.notify(K9.FETCHING_EMAIL_NOTIFICATION - account.getAccountNumber(), notif); + } + try + { + synchronizeMailboxSynchronous(account, folder.getName(), listener, null); + } + finally + { + if (account.isShowOngoing()) + { + notifMgr.cancel(K9.FETCHING_EMAIL_NOTIFICATION - account.getAccountNumber()); + } + } + } + catch (Exception e) + { + + Log.e(K9.LOG_TAG, "Exception while processing folder " + + account.getDescription() + ":" + folder.getName(), e); + addErrorMessage(account, null, e); + } + finally + { + if (tLocalFolder != null) + { + tLocalFolder.close(); + } + } + } + } + ); + } + } + catch (MessagingException e) + { + Log.e(K9.LOG_TAG, "Unable to synchronize account " + account.getName(), e); + addErrorMessage(account, null, e); + } + finally + { + putBackground("clear notification flag for " + account.getDescription(), null, new Runnable() + { + public void run() + { + if (K9.DEBUG) + Log.v(K9.LOG_TAG, "Clearing notification flag for " + account.getDescription()); + account.setRingNotified(false); + try + { + AccountStats stats = account.getStats(context); + if (stats == null || stats.unreadMessageCount == 0) + { + notifyAccountCancel(context, account); + } + } + catch (MessagingException e) + { + Log.e(K9.LOG_TAG, "Unable to getUnreadMessageCount for account: " + account, e); + } + } + } + ); + } + + + } + + + + public void compact(final Account account, final MessagingListener ml) { putBackground("compact:" + account.getDescription(), ml, new Runnable() diff --git a/src/com/fsck/k9/mail/Message.java b/src/com/fsck/k9/mail/Message.java index ea6cd7112..cfb6e7dfb 100644 --- a/src/com/fsck/k9/mail/Message.java +++ b/src/com/fsck/k9/mail/Message.java @@ -224,5 +224,5 @@ public abstract class Message implements Part, Body MessageReference tmpReference = makeMessageReference(); return tmpReference.equals(ref); } - + }