1
0
mirror of https://github.com/moparisthebest/k-9 synced 2024-11-11 20:15:03 -05:00

Allow user to set a limit on the number of folders to be handled with

push technology.  This provide a layer of safety in case of
misconfiguration (accidentally setting too many folders to push using
classes), which can bog down the device till it is unusable.  On a G1,
25 folders is a very large load.  Fixes Issue 871.

Also, move some pending commands to the background to make way for
more important user interface activity.
This commit is contained in:
Daniel Applebaum 2009-12-24 18:08:23 +00:00
parent 022b0241a1
commit 070fd635d4
6 changed files with 90 additions and 12 deletions

View File

@ -124,6 +124,26 @@
<item>NONE</item> <item>NONE</item>
</string-array> </string-array>
<string-array name="account_settings_push_limit_entries">
<item>@string/account_setup_push_limit_10</item>
<item>@string/account_setup_push_limit_25</item>
<item>@string/account_setup_push_limit_50</item>
<item>@string/account_setup_push_limit_100</item>
<item>@string/account_setup_push_limit_250</item>
<item>@string/account_setup_push_limit_500</item>
<item>@string/account_setup_push_limit_1000</item>
</string-array>
<string-array name="account_settings_push_limit_values">
<item>10</item>
<item>25</item>
<item>50</item>
<item>100</item>
<item>250</item>
<item>500</item>
<item>1000</item>
</string-array>
<string-array name="account_settings_folder_target_mode_entries"> <string-array name="account_settings_folder_target_mode_entries">
<item>@string/account_settings_folder_target_mode_all</item> <item>@string/account_settings_folder_target_mode_all</item>
<item>@string/account_settings_folder_target_mode_first_class</item> <item>@string/account_settings_folder_target_mode_first_class</item>

View File

@ -618,4 +618,13 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin
<string name="batch_select_all">Select all</string> <string name="batch_select_all">Select all</string>
<string name="batch_deselect_all">Deselect all</string> <string name="batch_deselect_all">Deselect all</string>
<string name="account_setup_push_limit_label">Max folders to check with push</string>
<string name="account_setup_push_limit_10">10 folders</string>
<string name="account_setup_push_limit_25">25 folders</string>
<string name="account_setup_push_limit_50">50 folders</string>
<string name="account_setup_push_limit_100">100 folders</string>
<string name="account_setup_push_limit_250">250 folders</string>
<string name="account_setup_push_limit_500">500 folders</string>
<string name="account_setup_push_limit_1000">1000 folders</string>
</resources> </resources>

View File

@ -79,7 +79,14 @@
android:entries="@array/account_settings_folder_push_mode_entries" android:entries="@array/account_settings_folder_push_mode_entries"
android:entryValues="@array/account_settings_folder_push_mode_values" android:entryValues="@array/account_settings_folder_push_mode_values"
android:dialogTitle="@string/account_settings_folder_push_mode_label" /> android:dialogTitle="@string/account_settings_folder_push_mode_label" />
<ListPreference
android:key="folder_push_limit"
android:title="@string/account_setup_push_limit_label"
android:entries="@array/account_settings_push_limit_entries"
android:entryValues="@array/account_settings_push_limit_values"
android:dialogTitle="@string/account_setup_push_limit_label" />
<ListPreference <ListPreference
android:key="delete_policy" android:key="delete_policy"
android:title="@string/account_setup_incoming_delete_policy_label" android:title="@string/account_setup_incoming_delete_policy_label"

View File

@ -58,7 +58,8 @@ public class Account implements Serializable
HideButtons mHideMessageViewButtons; HideButtons mHideMessageViewButtons;
boolean mIsSignatureBeforeQuotedText; boolean mIsSignatureBeforeQuotedText;
boolean mLeftHanded; boolean mLeftHanded;
public String mExpungePolicy = EXPUNGE_IMMEDIATELY; private String mExpungePolicy = EXPUNGE_IMMEDIATELY;
private int mMaxPushFolders;
List<Identity> identities; List<Identity> identities;
@ -105,8 +106,9 @@ public class Account implements Serializable
mHideMessageViewButtons = HideButtons.NEVER; mHideMessageViewButtons = HideButtons.NEVER;
mRingtoneUri = "content://settings/system/notification_sound"; mRingtoneUri = "content://settings/system/notification_sound";
mIsSignatureBeforeQuotedText = false; mIsSignatureBeforeQuotedText = false;
mExpungePolicy = EXPUNGE_IMMEDIATELY;
mAutoExpandFolderName = "INBOX"; mAutoExpandFolderName = "INBOX";
mMaxPushFolders = 10;
identities = new ArrayList<Identity>(); identities = new ArrayList<Identity>();
@ -201,6 +203,8 @@ public class Account implements Serializable
"Outbox"); "Outbox");
mExpungePolicy = preferences.getPreferences().getString(mUuid + ".expungePolicy", EXPUNGE_IMMEDIATELY); mExpungePolicy = preferences.getPreferences().getString(mUuid + ".expungePolicy", EXPUNGE_IMMEDIATELY);
mMaxPushFolders = preferences.getPreferences().getInt(mUuid + ".maxPushFolders", 10);
// Between r418 and r431 (version 0.103), folder names were set empty if the Incoming settings were // Between r418 and r431 (version 0.103), folder names were set empty if the Incoming settings were
// opened for non-IMAP accounts. 0.103 was never a market release, so perhaps this code // opened for non-IMAP accounts. 0.103 was never a market release, so perhaps this code
// should be deleted sometime soon // should be deleted sometime soon
@ -536,6 +540,7 @@ public class Account implements Serializable
editor.remove(mUuid + ".hideButtonsEnum"); editor.remove(mUuid + ".hideButtonsEnum");
editor.remove(mUuid + ".signatureBeforeQuotedText"); editor.remove(mUuid + ".signatureBeforeQuotedText");
editor.remove(mUuid + ".expungePolicy"); editor.remove(mUuid + ".expungePolicy");
editor.remove(mUuid + ".maxPushFolders");
deleteIdentities(preferences.getPreferences(), editor); deleteIdentities(preferences.getPreferences(), editor);
editor.commit(); editor.commit();
} }
@ -607,7 +612,7 @@ public class Account implements Serializable
editor.putString(mUuid + ".folderTargetMode", mFolderTargetMode.name()); editor.putString(mUuid + ".folderTargetMode", mFolderTargetMode.name());
editor.putBoolean(mUuid + ".signatureBeforeQuotedText", this.mIsSignatureBeforeQuotedText); editor.putBoolean(mUuid + ".signatureBeforeQuotedText", this.mIsSignatureBeforeQuotedText);
editor.putString(mUuid + ".expungePolicy", mExpungePolicy); editor.putString(mUuid + ".expungePolicy", mExpungePolicy);
editor.putInt(mUuid + ".maxPushFolders", mMaxPushFolders);
saveIdentities(preferences.getPreferences(), editor); saveIdentities(preferences.getPreferences(), editor);
editor.commit(); editor.commit();
@ -951,4 +956,14 @@ public class Account implements Serializable
mExpungePolicy = expungePolicy; mExpungePolicy = expungePolicy;
} }
public int getMaxPushFolders()
{
return mMaxPushFolders;
}
public void setMaxPushFolders(int maxPushFolders)
{
mMaxPushFolders = maxPushFolders;
}
} }

View File

@ -1535,7 +1535,7 @@ public class MessagingController implements Runnable
private void processPendingCommands(final Account account) private void processPendingCommands(final Account account)
{ {
put("processPendingCommands", null, new Runnable() putBackground("processPendingCommands", null, new Runnable()
{ {
public void run() public void run()
{ {
@ -1963,7 +1963,7 @@ public class MessagingController implements Runnable
private void queueSetFlag(final Account account, final String folderName, final String newState, final String flag, final String[] uids) private void queueSetFlag(final Account account, final String folderName, final String newState, final String flag, final String[] uids)
{ {
put("queueSetFlag " + account.getDescription() + ":" + folderName, null, new Runnable() putBackground("queueSetFlag " + account.getDescription() + ":" + folderName, null, new Runnable()
{ {
public void run() public void run()
{ {
@ -2086,7 +2086,7 @@ public class MessagingController implements Runnable
} }
private void queueExpunge(final Account account, final String folderName) private void queueExpunge(final Account account, final String folderName)
{ {
put("queueExpunge " + account.getDescription() + ":" + folderName, null, new Runnable() putBackground("queueExpunge " + account.getDescription() + ":" + folderName, null, new Runnable()
{ {
public void run() public void run()
{ {
@ -3278,7 +3278,7 @@ public class MessagingController implements Runnable
if (!message.getUid().startsWith(K9.LOCAL_UID_PREFIX)) if (!message.getUid().startsWith(K9.LOCAL_UID_PREFIX))
{ {
suppressMessage(account, srcFolder, message); suppressMessage(account, srcFolder, message);
put("moveMessage", null, new Runnable() putBackground("moveMessage", null, new Runnable()
{ {
public void run() public void run()
{ {
@ -3357,7 +3357,7 @@ public class MessagingController implements Runnable
{ {
if (!message.getUid().startsWith(K9.LOCAL_UID_PREFIX)) if (!message.getUid().startsWith(K9.LOCAL_UID_PREFIX))
{ {
put("copyMessage", null, new Runnable() putBackground("copyMessage", null, new Runnable()
{ {
public void run() public void run()
{ {
@ -3429,7 +3429,7 @@ public class MessagingController implements Runnable
public void expunge(final Account account, final String folder, final MessagingListener listener) public void expunge(final Account account, final String folder, final MessagingListener listener)
{ {
put("expunge", null, new Runnable() putBackground("expunge", null, new Runnable()
{ {
public void run() public void run()
{ {
@ -3446,7 +3446,7 @@ public class MessagingController implements Runnable
suppressMessage(account, folder, message); suppressMessage(account, folder, message);
} }
put("deleteMessages", null, new Runnable() putBackground("deleteMessages", null, new Runnable()
{ {
public void run() public void run()
{ {
@ -3613,7 +3613,7 @@ public class MessagingController implements Runnable
public void emptyTrash(final Account account, MessagingListener listener) public void emptyTrash(final Account account, MessagingListener listener)
{ {
put("emptyTrash", listener, new Runnable() putBackground("emptyTrash", listener, new Runnable()
{ {
public void run() public void run()
{ {
@ -4277,6 +4277,14 @@ public class MessagingController implements Runnable
if (names.size() > 0) if (names.size() > 0)
{ {
PushReceiver receiver = new MessagingControllerPushReceiver(mApplication, account, this); PushReceiver receiver = new MessagingControllerPushReceiver(mApplication, account, this);
int maxPushFolders = account.getMaxPushFolders();
if (names.size() > maxPushFolders)
{
Log.i(K9.LOG_TAG, "Count of folders to push for account " + account.getDescription() + " is " + names.size()
+ ", greater than limit of " + maxPushFolders + ", truncating");
names = names.subList(0, maxPushFolders);
}
try try
{ {

View File

@ -40,6 +40,7 @@ public class AccountSettings extends K9PreferenceActivity
private static final String PREFERENCE_DISPLAY_MODE = "folder_display_mode"; private static final String PREFERENCE_DISPLAY_MODE = "folder_display_mode";
private static final String PREFERENCE_SYNC_MODE = "folder_sync_mode"; private static final String PREFERENCE_SYNC_MODE = "folder_sync_mode";
private static final String PREFERENCE_PUSH_MODE = "folder_push_mode"; private static final String PREFERENCE_PUSH_MODE = "folder_push_mode";
private static final String PREFERENCE_PUSH_LIMIT = "folder_push_limit";
private static final String PREFERENCE_TARGET_MODE = "folder_target_mode"; private static final String PREFERENCE_TARGET_MODE = "folder_target_mode";
private static final String PREFERENCE_DELETE_POLICY = "delete_policy"; private static final String PREFERENCE_DELETE_POLICY = "delete_policy";
private static final String PREFERENCE_EXPUNGE_POLICY = "expunge_policy"; private static final String PREFERENCE_EXPUNGE_POLICY = "expunge_policy";
@ -62,6 +63,7 @@ public class AccountSettings extends K9PreferenceActivity
private ListPreference mDisplayMode; private ListPreference mDisplayMode;
private ListPreference mSyncMode; private ListPreference mSyncMode;
private ListPreference mPushMode; private ListPreference mPushMode;
private ListPreference mPushLimit;
private ListPreference mTargetMode; private ListPreference mTargetMode;
private ListPreference mDeletePolicy; private ListPreference mDeletePolicy;
private ListPreference mExpungePolicy; private ListPreference mExpungePolicy;
@ -178,6 +180,22 @@ public class AccountSettings extends K9PreferenceActivity
return false; return false;
} }
}); });
mPushLimit = (ListPreference) findPreference(PREFERENCE_PUSH_LIMIT);
mPushLimit.setEnabled(isPushCapable);
mPushLimit.setValue(String.valueOf(mAccount.getMaxPushFolders()));
mPushLimit.setSummary(mPushLimit.getEntry());
mPushLimit.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener()
{
public boolean onPreferenceChange(Preference preference, Object newValue)
{
final String summary = newValue.toString();
int index = mPushLimit.findIndexOfValue(summary);
mPushLimit.setSummary(mPushLimit.getEntries()[index]);
mPushLimit.setValue(summary);
return false;
}
});
mTargetMode = (ListPreference) findPreference(PREFERENCE_TARGET_MODE); mTargetMode = (ListPreference) findPreference(PREFERENCE_TARGET_MODE);
mTargetMode.setValue(mAccount.getFolderTargetMode().name()); mTargetMode.setValue(mAccount.getFolderTargetMode().name());
@ -361,6 +379,7 @@ public class AccountSettings extends K9PreferenceActivity
mAccount.setFolderDisplayMode(Account.FolderMode.valueOf(mDisplayMode.getValue())); mAccount.setFolderDisplayMode(Account.FolderMode.valueOf(mDisplayMode.getValue()));
mAccount.setFolderSyncMode(Account.FolderMode.valueOf(mSyncMode.getValue())); mAccount.setFolderSyncMode(Account.FolderMode.valueOf(mSyncMode.getValue()));
mAccount.setFolderPushMode(Account.FolderMode.valueOf(mPushMode.getValue())); mAccount.setFolderPushMode(Account.FolderMode.valueOf(mPushMode.getValue()));
mAccount.setMaxPushFolders(Integer.parseInt(mPushLimit.getValue()));
mAccount.setFolderTargetMode(Account.FolderMode.valueOf(mTargetMode.getValue())); mAccount.setFolderTargetMode(Account.FolderMode.valueOf(mTargetMode.getValue()));
mAccount.setDeletePolicy(Integer.parseInt(mDeletePolicy.getValue())); mAccount.setDeletePolicy(Integer.parseInt(mDeletePolicy.getValue()));
mAccount.setExpungePolicy(mExpungePolicy.getValue()); mAccount.setExpungePolicy(mExpungePolicy.getValue());