From 164ee7cbfdfe3bad959d7c352e4cba457d92f8d5 Mon Sep 17 00:00:00 2001 From: Daniel Applebaum Date: Sun, 7 Feb 2010 21:23:33 +0000 Subject: [PATCH] Fixes Issue 1059 Only reschedule polling and setup pushing when necessary due to particular setting changes. Makes the K-9 Mail UI much more responsive to setting changes that do not affect polling and pushing. The poll schedule is deliberately only rescheduled when the period is decreased. An increase in period will still allow the next scheduled check to happen as originally scheduled. --- src/com/fsck/k9/Account.java | 42 ++++++-- src/com/fsck/k9/K9.java | 13 +-- src/com/fsck/k9/activity/FolderList.java | 5 +- .../k9/activity/setup/AccountSettings.java | 38 +++++-- .../k9/activity/setup/FolderSettings.java | 15 ++- src/com/fsck/k9/activity/setup/Prefs.java | 7 +- src/com/fsck/k9/service/BootReceiver.java | 4 +- src/com/fsck/k9/service/MailService.java | 98 +++++++++++-------- src/com/fsck/k9/service/PollService.java | 2 +- .../fsck/k9/service/RemoteControlService.java | 42 ++++---- 10 files changed, 174 insertions(+), 92 deletions(-) diff --git a/src/com/fsck/k9/Account.java b/src/com/fsck/k9/Account.java index aa8aa8fcc..f28570e4d 100644 --- a/src/com/fsck/k9/Account.java +++ b/src/com/fsck/k9/Account.java @@ -732,9 +732,21 @@ public class Account implements Serializable /** * @param automaticCheckIntervalMinutes or -1 for never. */ - public void setAutomaticCheckIntervalMinutes(int automaticCheckIntervalMinutes) + public boolean setAutomaticCheckIntervalMinutes(int automaticCheckIntervalMinutes) { + int oldInterval = this.mAutomaticCheckIntervalMinutes; + int newInterval = automaticCheckIntervalMinutes; this.mAutomaticCheckIntervalMinutes = automaticCheckIntervalMinutes; + + if (oldInterval == -1 && newInterval != -1) + { + return true; + } + if (newInterval < oldInterval) + { + return true; + } + return false; } /** @@ -863,9 +875,11 @@ public class Account implements Serializable return mFolderDisplayMode; } - public void setFolderDisplayMode(FolderMode displayMode) + public boolean setFolderDisplayMode(FolderMode displayMode) { + FolderMode oldDisplayMode = mFolderDisplayMode; mFolderDisplayMode = displayMode; + return oldDisplayMode != displayMode; } public FolderMode getFolderSyncMode() @@ -873,9 +887,20 @@ public class Account implements Serializable return mFolderSyncMode; } - public void setFolderSyncMode(FolderMode syncMode) + public boolean setFolderSyncMode(FolderMode syncMode) { + FolderMode oldSyncMode = mFolderSyncMode; mFolderSyncMode = syncMode; + + if (syncMode == FolderMode.NONE && oldSyncMode != FolderMode.NONE) + { + return true; + } + if (syncMode != FolderMode.NONE && oldSyncMode == FolderMode.NONE) + { + return true; + } + return false; } public FolderMode getFolderPushMode() @@ -883,9 +908,12 @@ public class Account implements Serializable return mFolderPushMode; } - public void setFolderPushMode(FolderMode syncMode) + public boolean setFolderPushMode(FolderMode pushMode) { - mFolderPushMode = syncMode; + FolderMode oldPushMode = mFolderPushMode; + + mFolderPushMode = pushMode; + return pushMode != oldPushMode; } public boolean isShowOngoing() @@ -953,9 +981,11 @@ public class Account implements Serializable return mMaxPushFolders; } - public void setMaxPushFolders(int maxPushFolders) + public boolean setMaxPushFolders(int maxPushFolders) { + int oldMaxPushFolders = mMaxPushFolders; mMaxPushFolders = maxPushFolders; + return oldMaxPushFolders != maxPushFolders; } public boolean isRing() diff --git a/src/com/fsck/k9/K9.java b/src/com/fsck/k9/K9.java index 21f4148f9..6aa84c649 100644 --- a/src/com/fsck/k9/K9.java +++ b/src/com/fsck/k9/K9.java @@ -246,7 +246,6 @@ public class K9 extends Application */ public static void setServicesEnabled(Context context) { - int acctLength = Preferences.getPreferences(context).getAccounts().length; setServicesEnabled(context, acctLength > 0, null); @@ -270,7 +269,7 @@ public class K9 extends Application * If no accounts now exist but the service is still enabled we're about to disable it * so we'll reschedule to kill off any existing alarms. */ - MailService.actionReschedule(context, wakeLockId); + MailService.actionReset(context, wakeLockId); } Class[] classes = { MessageCompose.class, BootReceiver.class, MailService.class }; @@ -297,7 +296,7 @@ public class K9 extends Application * And now if accounts do exist then we've just enabled the service and we want to * schedule alarms for the new accounts. */ - MailService.actionReschedule(context, wakeLockId); + MailService.actionReset(context, wakeLockId); } } @@ -427,14 +426,16 @@ public class K9 extends Application return backgroundOps; } - public static void setBackgroundOps(BACKGROUND_OPS backgroundOps) + public static boolean setBackgroundOps(BACKGROUND_OPS backgroundOps) { + BACKGROUND_OPS oldBackgroundOps = K9.backgroundOps; K9.backgroundOps = backgroundOps; + return backgroundOps != oldBackgroundOps; } - public static void setBackgroundOps(String nbackgroundOps) + public static boolean setBackgroundOps(String nbackgroundOps) { - K9.backgroundOps = BACKGROUND_OPS.valueOf(nbackgroundOps); + return setBackgroundOps(BACKGROUND_OPS.valueOf(nbackgroundOps)); } public static boolean isAnimations() diff --git a/src/com/fsck/k9/activity/FolderList.java b/src/com/fsck/k9/activity/FolderList.java index 9f052c88c..402d0ee4f 100644 --- a/src/com/fsck/k9/activity/FolderList.java +++ b/src/com/fsck/k9/activity/FolderList.java @@ -413,7 +413,10 @@ public class FolderList extends K9ListActivity { mAccount.setFolderDisplayMode(newMode); mAccount.save(Preferences.getPreferences(this)); - MailService.actionReschedule(this, null); // TODO: really should just refresh pushers + if (mAccount.getFolderPushMode() != FolderMode.NONE) + { + MailService.actionRestartPushers(this, null); + } onRefresh(false); } diff --git a/src/com/fsck/k9/activity/setup/AccountSettings.java b/src/com/fsck/k9/activity/setup/AccountSettings.java index b26cb906f..2fbc94ac8 100644 --- a/src/com/fsck/k9/activity/setup/AccountSettings.java +++ b/src/com/fsck/k9/activity/setup/AccountSettings.java @@ -12,10 +12,12 @@ import android.util.Log; import android.view.KeyEvent; import android.widget.Toast; import com.fsck.k9.*; +import com.fsck.k9.Account.FolderMode; import com.fsck.k9.activity.ChooseFolder; import com.fsck.k9.activity.ChooseIdentity; import com.fsck.k9.activity.ManageIdentities; import com.fsck.k9.mail.Store; +import com.fsck.k9.service.MailService; public class AccountSettings extends K9PreferenceActivity { @@ -72,6 +74,7 @@ public class AccountSettings extends K9PreferenceActivity private ListPreference mExpungePolicy; private Preference mAutoExpandFolder; private CheckBoxPreference mStoreAttachmentsOnSdCard; + private boolean mIncomingChanged = false; public static void actionSettings(Context context, Account account) @@ -87,7 +90,7 @@ public class AccountSettings extends K9PreferenceActivity super.onCreate(savedInstanceState); mAccount = (Account)getIntent().getSerializableExtra(EXTRA_ACCOUNT); - mAccount.refresh(Preferences.getPreferences(this)); + mAccount.refresh(Preferences.getPreferences(this)); boolean isPushCapable = false; boolean isExpungeCapable = false; @@ -341,6 +344,7 @@ public class AccountSettings extends K9PreferenceActivity { public boolean onPreferenceClick(Preference preference) { + mIncomingChanged = true; onIncomingSettings(); return true; } @@ -392,22 +396,29 @@ public class AccountSettings extends K9PreferenceActivity { Preferences.getPreferences(this).setDefaultAccount(mAccount); } + mAccount.setDescription(mAccountDescription.getText()); mAccount.setNotifyNewMail(mAccountNotify.isChecked()); mAccount.setNotifySelfNewMail(mAccountNotifySelf.isChecked()); mAccount.setShowOngoing(mAccountNotifySync.isChecked()); - mAccount.setAutomaticCheckIntervalMinutes(Integer.parseInt(mCheckFrequency.getValue())); mAccount.setDisplayCount(Integer.parseInt(mDisplayCount.getValue())); mAccount.setVibrate(mAccountVibrate.isChecked()); - mAccount.setFolderDisplayMode(Account.FolderMode.valueOf(mDisplayMode.getValue())); - mAccount.setFolderSyncMode(Account.FolderMode.valueOf(mSyncMode.getValue())); - mAccount.setFolderPushMode(Account.FolderMode.valueOf(mPushMode.getValue())); - mAccount.setMaxPushFolders(Integer.parseInt(mPushLimit.getValue())); mAccount.setFolderTargetMode(Account.FolderMode.valueOf(mTargetMode.getValue())); mAccount.setDeletePolicy(Integer.parseInt(mDeletePolicy.getValue())); mAccount.setExpungePolicy(mExpungePolicy.getValue()); mAccount.setStoreAttachmentOnSdCard(mStoreAttachmentsOnSdCard.isChecked()); - + + boolean needsRefresh = mAccount.setAutomaticCheckIntervalMinutes(Integer.parseInt(mCheckFrequency.getValue())); + needsRefresh |= mAccount.setFolderSyncMode(Account.FolderMode.valueOf(mSyncMode.getValue())); + + boolean needsPushRestart = mAccount.setFolderPushMode(Account.FolderMode.valueOf(mPushMode.getValue())); + if (mAccount.getFolderPushMode() != FolderMode.NONE) + { + needsPushRestart |= mAccount.setFolderDisplayMode(Account.FolderMode.valueOf(mDisplayMode.getValue())); + needsPushRestart |= mAccount.setMaxPushFolders(Integer.parseInt(mPushLimit.getValue())); + needsPushRestart |= mIncomingChanged; + } + SharedPreferences prefs = mAccountRingtone.getPreferenceManager().getSharedPreferences(); String newRingtone = prefs.getString(PREFERENCE_RINGTONE, null); if (newRingtone != null) @@ -426,7 +437,18 @@ public class AccountSettings extends K9PreferenceActivity mAccount.setHideMessageViewButtons(Account.HideButtons.valueOf(mAccountHideButtons.getValue())); mAccount.setAutoExpandFolderName(reverseTranslateFolder(mAutoExpandFolder.getSummary().toString())); mAccount.save(Preferences.getPreferences(this)); - K9.setServicesEnabled(this); + if (needsRefresh && needsPushRestart) + { + MailService.actionReset(this, null); + } + else if (needsRefresh) + { + MailService.actionReschedulePoll(this, null); + } + else if (needsPushRestart) + { + MailService.actionRestartPushers(this, null); + } // TODO: refresh folder list here } diff --git a/src/com/fsck/k9/activity/setup/FolderSettings.java b/src/com/fsck/k9/activity/setup/FolderSettings.java index 8dfc7c219..ffe655d87 100644 --- a/src/com/fsck/k9/activity/setup/FolderSettings.java +++ b/src/com/fsck/k9/activity/setup/FolderSettings.java @@ -13,6 +13,7 @@ import com.fsck.k9.mail.Folder.FolderClass; import com.fsck.k9.mail.MessagingException; import com.fsck.k9.mail.Store; import com.fsck.k9.mail.store.LocalStore.LocalFolder; +import com.fsck.k9.service.MailService; public class FolderSettings extends K9PreferenceActivity { @@ -140,14 +141,24 @@ public class FolderSettings extends K9PreferenceActivity private void saveSettings() { + // We call getPushClass() because display class changes can affect push class when push class is set to inherit + FolderClass oldPushClass = mFolder.getPushClass(); + FolderClass oldDisplayClass = mFolder.getDisplayClass(); mFolder.setDisplayClass(FolderClass.valueOf(mDisplayClass.getValue())); mFolder.setSyncClass(FolderClass.valueOf(mSyncClass.getValue())); mFolder.setPushClass(FolderClass.valueOf(mPushClass.getValue())); - + + FolderClass newPushClass = mFolder.getPushClass(); + FolderClass newDisplayClass = mFolder.getDisplayClass(); + try { mFolder.save(Preferences.getPreferences(this)); - K9.setServicesEnabled(this); + if (oldPushClass != newPushClass + || (newPushClass != FolderClass.NO_CLASS && oldDisplayClass != newDisplayClass)) + { + MailService.actionRestartPushers(getApplication(), null); + } } catch (MessagingException me) { diff --git a/src/com/fsck/k9/activity/setup/Prefs.java b/src/com/fsck/k9/activity/setup/Prefs.java index 19b1757ef..d8f9c813a 100644 --- a/src/com/fsck/k9/activity/setup/Prefs.java +++ b/src/com/fsck/k9/activity/setup/Prefs.java @@ -148,8 +148,7 @@ public class Prefs extends K9PreferenceActivity K9.setK9Theme(mTheme.getValue().equals("dark") ? android.R.style.Theme : android.R.style.Theme_Light); K9.DEBUG = mDebugLogging.isChecked(); K9.DEBUG_SENSITIVE = mSensitiveLogging.isChecked(); - String newBackgroundOps = mBackgroundOps.getValue(); - K9.setBackgroundOps(newBackgroundOps); + boolean needsRefresh = K9.setBackgroundOps(mBackgroundOps.getValue()); K9.setAnimations(mAnimations.isChecked()); K9.setMessageListStars(mStars.isChecked()); @@ -161,9 +160,9 @@ public class Prefs extends K9PreferenceActivity K9.save(editor); DateFormatter.setDateFormat(editor, mDateFormat.getValue()); editor.commit(); - if (newBackgroundOps.equals(initBackgroundOps) == false) + if (needsRefresh) { - MailService.backgroundDataChanged(this, null); + MailService.actionRestartPushers(this, null); } } diff --git a/src/com/fsck/k9/service/BootReceiver.java b/src/com/fsck/k9/service/BootReceiver.java index 805aa6835..f3513cc0d 100644 --- a/src/com/fsck/k9/service/BootReceiver.java +++ b/src/com/fsck/k9/service/BootReceiver.java @@ -40,7 +40,7 @@ public class BootReceiver extends CoreReceiver } else if (Intent.ACTION_DEVICE_STORAGE_OK.equals(intent.getAction())) { - MailService.actionReschedule(context, tmpWakeLockId); + MailService.actionReset(context, tmpWakeLockId); tmpWakeLockId = null; } else if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) @@ -51,7 +51,7 @@ public class BootReceiver extends CoreReceiver } else if (ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED.equals(intent.getAction())) { - MailService.backgroundDataChanged(context, tmpWakeLockId); + MailService.actionRestartPushers(context, tmpWakeLockId); tmpWakeLockId = null; } else if (FIRE_INTENT.equals(intent.getAction())) diff --git a/src/com/fsck/k9/service/MailService.java b/src/com/fsck/k9/service/MailService.java index 9b22e67d2..822cf58fc 100644 --- a/src/com/fsck/k9/service/MailService.java +++ b/src/com/fsck/k9/service/MailService.java @@ -1,6 +1,9 @@ package com.fsck.k9.service; +import java.util.Collection; +import java.util.Date; + import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; @@ -10,40 +13,36 @@ import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.NetworkInfo.State; import android.os.IBinder; -import android.os.PowerManager; -import android.os.PowerManager.WakeLock; -import android.util.Config; import android.util.Log; -import com.fsck.k9.*; -import com.fsck.k9.mail.Pusher; -import java.util.Collection; -import java.util.Date; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import com.fsck.k9.Account; +import com.fsck.k9.K9; +import com.fsck.k9.MessagingController; +import com.fsck.k9.Preferences; +import com.fsck.k9.R; +import com.fsck.k9.Account.FolderMode; +import com.fsck.k9.mail.Pusher; /** */ public class MailService extends CoreService { private static final String ACTION_CHECK_MAIL = "com.fsck.k9.intent.action.MAIL_SERVICE_WAKEUP"; - private static final String ACTION_RESCHEDULE = "com.fsck.k9.intent.action.MAIL_SERVICE_RESCHEDULE"; - private static final String ACTION_RESCHEDULE_CHECK = "com.fsck.k9.intent.action.MAIL_SERVICE_RESCHEDULE_CHECK"; + private static final String ACTION_RESET = "com.fsck.k9.intent.action.MAIL_SERVICE_RESET"; + private static final String ACTION_RESCHEDULE_POLL = "com.fsck.k9.intent.action.MAIL_SERVICE_RESCHEDULE_POLL"; private static final String ACTION_CANCEL = "com.fsck.k9.intent.action.MAIL_SERVICE_CANCEL"; private static final String ACTION_REFRESH_PUSHERS = "com.fsck.k9.intent.action.MAIL_SERVICE_REFRESH_PUSHERS"; + private static final String ACTION_RESTART_PUSHERS = "com.fsck.k9.intent.action.MAIL_SERVICE_RESTART_PUSHERS"; private static final String CONNECTIVITY_CHANGE = "com.fsck.k9.intent.action.MAIL_SERVICE_CONNECTIVITY_CHANGE"; - private static final String BACKGROUND_DATA_CHANGED = "com.fsck.k9.intent.action.MAIL_SERVICE_BACKGROUND_DATA_CHANGED"; private static final String CANCEL_CONNECTIVITY_NOTICE = "com.fsck.k9.intent.action.MAIL_SERVICE_CANCEL_CONNECTIVITY_NOTICE"; private static final String HAS_CONNECTIVITY = "com.fsck.k9.intent.action.MAIL_SERVICE_HAS_CONNECTIVITY"; - - - public static void actionReschedule(Context context, Integer wakeLockId) + public static void actionReset(Context context, Integer wakeLockId) { Intent i = new Intent(); i.setClass(context, MailService.class); - i.setAction(MailService.ACTION_RESCHEDULE); + i.setAction(MailService.ACTION_RESET); addWakeLockId(i, wakeLockId); if (wakeLockId == null) { @@ -51,13 +50,30 @@ public class MailService extends CoreService } context.startService(i); } - - public static void rescheduleCheck(Context context, Integer wakeLockId) + + public static void actionRestartPushers(Context context, Integer wakeLockId) { Intent i = new Intent(); i.setClass(context, MailService.class); - i.setAction(MailService.ACTION_RESCHEDULE_CHECK); + i.setAction(MailService.ACTION_RESTART_PUSHERS); addWakeLockId(i, wakeLockId); + if (wakeLockId == null) + { + addWakeLock(context, i); + } + context.startService(i); + } + + public static void actionReschedulePoll(Context context, Integer wakeLockId) + { + Intent i = new Intent(); + i.setClass(context, MailService.class); + i.setAction(MailService.ACTION_RESCHEDULE_POLL); + addWakeLockId(i, wakeLockId); + if (wakeLockId == null) + { + addWakeLock(context, i); + } context.startService(i); } @@ -80,15 +96,6 @@ public class MailService extends CoreService context.startService(i); } - public static void backgroundDataChanged(Context context, Integer wakeLockId) - { - Intent i = new Intent(); - i.setClass(context, MailService.class); - i.setAction(MailService.BACKGROUND_DATA_CHANGED); - addWakeLockId(i, wakeLockId); - context.startService(i); - } - @Override public void onCreate() { @@ -149,7 +156,7 @@ public class MailService extends CoreService cancel(); } - else if (ACTION_RESCHEDULE.equals(intent.getAction())) + else if (ACTION_RESET.equals(intent.getAction())) { if (K9.DEBUG) Log.v(K9.LOG_TAG, "***** MailService *****: reschedule"); @@ -158,11 +165,18 @@ public class MailService extends CoreService startIdObj = null; } - else if (ACTION_RESCHEDULE_CHECK.equals(intent.getAction())) + else if (ACTION_RESTART_PUSHERS.equals(intent.getAction())) { if (K9.DEBUG) - Log.v(K9.LOG_TAG, "***** MailService *****: reschedule check"); + Log.v(K9.LOG_TAG, "***** MailService *****: restarting pushers"); + reschedulePushers(hasConnectivity, doBackground, startIdObj); + startIdObj = null; + } + else if (ACTION_RESCHEDULE_POLL.equals(intent.getAction())) + { + if (K9.DEBUG) + Log.v(K9.LOG_TAG, "***** MailService *****: rescheduling poll"); reschedule(startIdObj); startIdObj = null; @@ -176,8 +190,7 @@ public class MailService extends CoreService startIdObj = null; } } - else if (CONNECTIVITY_CHANGE.equals(intent.getAction()) || - BACKGROUND_DATA_CHANGED.equals(intent.getAction())) + else if (CONNECTIVITY_CHANGE.equals(intent.getAction()) ) { notifyConnectionStatus(hasConnectivity); rescheduleAll(hasConnectivity, doBackground, startIdObj); @@ -206,12 +219,9 @@ public class MailService extends CoreService if (hasConnectivity && doBackground) { reschedule(null); - reschedulePushers(startId); - } - else - { - stopPushers(startId); } + reschedulePushers(hasConnectivity, doBackground, startId); + } private void notifyConnectionStatus(boolean hasConnectivity) @@ -273,6 +283,7 @@ public class MailService extends CoreService for (Account account : Preferences.getPreferences(MailService.this).getAccounts()) { if (account.getAutomaticCheckIntervalMinutes() != -1 + && account.getFolderSyncMode() != FolderMode.NONE && (account.getAutomaticCheckIntervalMinutes() < shortestInterval || shortestInterval == -1)) { shortestInterval = account.getAutomaticCheckIntervalMinutes(); @@ -282,7 +293,7 @@ public class MailService extends CoreService if (shortestInterval == -1) { if (K9.DEBUG) - Log.v(K9.LOG_TAG, "No next check scheduled for package " + getApplication().getPackageName()); + Log.i(K9.LOG_TAG, "No next check scheduled for package " + getApplication().getPackageName()); cancel(); } else @@ -325,7 +336,7 @@ public class MailService extends CoreService , K9.MAIL_SERVICE_WAKE_LOCK_TIMEOUT, startId); } - private void reschedulePushers(final Integer startId) + private void reschedulePushers(final boolean hasConnectivity, final boolean doBackground, final Integer startId) { execute(getApplication(), new Runnable() { @@ -335,8 +346,11 @@ public class MailService extends CoreService if (K9.DEBUG) Log.i(K9.LOG_TAG, "Rescheduling pushers"); stopPushers(null); - setupPushers(null); - schedulePushers(startId); + if (hasConnectivity && doBackground) + { + setupPushers(null); + schedulePushers(startId); + } } } diff --git a/src/com/fsck/k9/service/PollService.java b/src/com/fsck/k9/service/PollService.java index 26d4e0d4a..98f5314b0 100644 --- a/src/com/fsck/k9/service/PollService.java +++ b/src/com/fsck/k9/service/PollService.java @@ -142,7 +142,7 @@ public class PollService extends CoreService { MessagingController controller = MessagingController.getInstance(getApplication()); controller.setCheckMailListener(null); - MailService.rescheduleCheck(PollService.this, null); + MailService.actionReschedulePoll(PollService.this, null); wakeLockRelease(); if (K9.DEBUG) Log.i(K9.LOG_TAG, "PollService stopping with startId = " + startId); diff --git a/src/com/fsck/k9/service/RemoteControlService.java b/src/com/fsck/k9/service/RemoteControlService.java index d3624ea13..8b44dc7ef 100644 --- a/src/com/fsck/k9/service/RemoteControlService.java +++ b/src/com/fsck/k9/service/RemoteControlService.java @@ -20,6 +20,7 @@ import android.widget.Toast; public class RemoteControlService extends CoreService { private final static String RESCHEDULE_ACTION = "com.fsck.k9.service.RemoteControlService.RESCHEDULE_ACTION"; + private final static String PUSH_RESTART_ACTION = "com.fsck.k9.service.RemoteControlService.PUSH_RESTART_ACTION"; private final static String SET_ACTION = "com.fsck.k9.service.RemoteControlService.SET_ACTION"; @@ -48,8 +49,14 @@ public class RemoteControlService extends CoreService if (RESCHEDULE_ACTION.equals(intent.getAction())) { if (K9.DEBUG) - Log.i(K9.LOG_TAG, "RemoteControlService requesting MailService reschedule"); - MailService.actionReschedule(this, null); + Log.i(K9.LOG_TAG, "RemoteControlService requesting MailService poll reschedule"); + MailService.actionReschedulePoll(this, null); + } + if (PUSH_RESTART_ACTION.equals(intent.getAction())) + { + if (K9.DEBUG) + Log.i(K9.LOG_TAG, "RemoteControlService requesting MailService push restart"); + MailService.actionRestartPushers(this, null); } else if (RemoteControlService.SET_ACTION.equals(intent.getAction())) { @@ -62,6 +69,7 @@ public class RemoteControlService extends CoreService try { boolean needsReschedule = false; + boolean needsPushRestart = false; String uuid = intent.getStringExtra(K9_ACCOUNT_UUID); boolean allAccounts = intent.getBooleanExtra(K9_ALL_ACCOUNTS, false); if (K9.DEBUG) @@ -105,17 +113,11 @@ public class RemoteControlService extends CoreService } if (pushClasses != null) { - FolderMode newClasses = FolderMode.valueOf(pushClasses); - if (newClasses.equals(account.getFolderPushMode()) == false) - { - account.setFolderPushMode(newClasses); - needsReschedule = true; - } - + needsPushRestart |= account.setFolderPushMode(FolderMode.valueOf(pushClasses)); } if (pollClasses != null) { - account.setFolderSyncMode(FolderMode.valueOf(pollClasses)); + needsReschedule |= account.setFolderSyncMode(FolderMode.valueOf(pollClasses)); } if (pollFrequency != null) { @@ -125,11 +127,7 @@ public class RemoteControlService extends CoreService if (allowedFrequency.equals(pollFrequency)) { Integer newInterval = Integer.parseInt(allowedFrequency); - if (newInterval.equals(account.getAutomaticCheckIntervalMinutes()) == false) - { - account.setAutomaticCheckIntervalMinutes(newInterval); - needsReschedule = true; - } + needsReschedule |= account.setAutomaticCheckIntervalMinutes(newInterval); } } } @@ -145,11 +143,7 @@ public class RemoteControlService extends CoreService || K9RemoteControl.K9_BACKGROUND_OPERATIONS_WHEN_CHECKED.equals(backgroundOps)) { BACKGROUND_OPS newBackgroundOps = BACKGROUND_OPS.valueOf(backgroundOps); - if (K9.getBackgroundOps().equals(newBackgroundOps) == false) - { - K9.setBackgroundOps(newBackgroundOps); - needsReschedule = true; - } + needsPushRestart |= K9.setBackgroundOps(newBackgroundOps); } String theme = intent.getStringExtra(K9_THEME); @@ -172,6 +166,14 @@ public class RemoteControlService extends CoreService long nextTime = System.currentTimeMillis() + 10000; BootReceiver.scheduleIntent(RemoteControlService.this, nextTime, i); } + if (needsPushRestart) + { + Intent i = new Intent(); + i.setClassName(getApplication().getPackageName(), "com.fsck.k9.service.RemoteControlService"); + i.setAction(PUSH_RESTART_ACTION); + long nextTime = System.currentTimeMillis() + 10000; + BootReceiver.scheduleIntent(RemoteControlService.this, nextTime, i); + } } catch (Exception e) {