From 318099082f9e155940ccc3b0c301930079b15bf6 Mon Sep 17 00:00:00 2001 From: Daniel Applebaum Date: Sat, 3 Jul 2010 13:10:38 +0000 Subject: [PATCH] Fixes Issue 794 Implements new setting "Sync remote deletions" which is checked by default. When unchecked, K-9 Mail will no longer remove messages from local storage just because the message was removed from the server. This functionality works for all account types. Messages will still be removed from the local store in order to stay within the limit imposed by the "Number of messages to display" setting. --- res/values/strings.xml | 3 ++ res/xml/account_settings_preferences.xml | 6 +++ src/com/fsck/k9/Account.java | 17 ++++++- .../k9/activity/setup/AccountSettings.java | 6 +++ .../k9/controller/MessagingController.java | 44 +++++++++++-------- 5 files changed, 57 insertions(+), 19 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 9e8773c31..7cf3cbec4 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -545,6 +545,9 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin 1st and 2nd Class folders All except 2nd Class folders + Sync remote deletions + Remove messages when deleted on server + Folder settings Show in top group diff --git a/res/xml/account_settings_preferences.xml b/res/xml/account_settings_preferences.xml index ec966ffcb..2a6c57190 100644 --- a/res/xml/account_settings_preferences.xml +++ b/res/xml/account_settings_preferences.xml @@ -109,6 +109,12 @@ android:entryValues="@array/account_setup_expunge_policy_values" android:dialogTitle="@string/account_setup_expunge_policy_label" /> + + identities; @@ -153,6 +154,7 @@ public class Account implements BaseAccount subscribedFoldersOnly = false; maximumPolledMessageAge = -1; mQuotePrefix = DEFAULT_QUOTE_PREFIX; + mSyncRemoteDeletions = true; searchableFolders = Searchable.ALL; @@ -214,7 +216,8 @@ public class Account implements BaseAccount mOutboxFolderName = preferences.getPreferences().getString(mUuid + ".outboxFolderName", "Outbox"); mExpungePolicy = preferences.getPreferences().getString(mUuid + ".expungePolicy", EXPUNGE_IMMEDIATELY); - + mSyncRemoteDeletions = preferences.getPreferences().getBoolean(mUuid + ".syncRemoteDeletions", true); + mMaxPushFolders = preferences.getPreferences().getInt(mUuid + ".maxPushFolders", 10); goToUnreadMessageSearch = preferences.getPreferences().getBoolean(mUuid + ".goToUnreadMessageSearch", false); @@ -393,6 +396,7 @@ public class Account implements BaseAccount editor.remove(mUuid + ".hideButtonsEnum"); editor.remove(mUuid + ".signatureBeforeQuotedText"); editor.remove(mUuid + ".expungePolicy"); + editor.remove(mUuid + ".syncRemoteDeletions"); editor.remove(mUuid + ".maxPushFolders"); editor.remove(mUuid + ".searchableFolders"); editor.remove(mUuid + ".chipColor"); @@ -481,6 +485,7 @@ public class Account implements BaseAccount editor.putString(mUuid + ".folderTargetMode", mFolderTargetMode.name()); editor.putBoolean(mUuid + ".signatureBeforeQuotedText", this.mIsSignatureBeforeQuotedText); editor.putString(mUuid + ".expungePolicy", mExpungePolicy); + editor.putBoolean(mUuid + ".syncRemoteDeletions", mSyncRemoteDeletions); editor.putInt(mUuid + ".maxPushFolders", mMaxPushFolders); editor.putString(mUuid + ".searchableFolders", searchableFolders.name()); editor.putInt(mUuid + ".chipColor", mChipColor); @@ -1329,4 +1334,14 @@ public class Account implements BaseAccount { mQuotePrefix = quotePrefix; } + + public boolean syncRemoteDeletions() + { + return mSyncRemoteDeletions; + } + + public void setSyncRemoteDeletions(boolean syncRemoteDeletions) + { + mSyncRemoteDeletions = syncRemoteDeletions; + } } diff --git a/src/com/fsck/k9/activity/setup/AccountSettings.java b/src/com/fsck/k9/activity/setup/AccountSettings.java index 9b032750d..3e50bea5c 100644 --- a/src/com/fsck/k9/activity/setup/AccountSettings.java +++ b/src/com/fsck/k9/activity/setup/AccountSettings.java @@ -56,6 +56,7 @@ public class AccountSettings extends K9PreferenceActivity private static final String PREFERENCE_NOTIFICATION_OPENS_UNREAD = "notification_opens_unread"; private static final String PREFERENCE_MESSAGE_AGE = "account_message_age"; private static final String PREFERENCE_QUOTE_PREFIX = "account_quote_prefix"; + private static final String PREFERENCE_SYNC_REMOTE_DELETIONS = "account_sync_remote_deletetions"; private Account mAccount; @@ -86,6 +87,7 @@ public class AccountSettings extends K9PreferenceActivity private boolean mIncomingChanged = false; private CheckBoxPreference mNotificationOpensUnread; private EditTextPreference mAccountQuotePrefix; + private CheckBoxPreference mSyncRemoteDeletions; public static void actionSettings(Context context, Account account) @@ -258,6 +260,9 @@ public class AccountSettings extends K9PreferenceActivity return false; } }); + + mSyncRemoteDeletions = (CheckBoxPreference) findPreference(PREFERENCE_SYNC_REMOTE_DELETIONS); + mSyncRemoteDeletions.setChecked(mAccount.syncRemoteDeletions()); mSearchableFolders = (ListPreference) findPreference(PREFERENCE_SEARCHABLE_FOLDERS); mSearchableFolders.setValue(mAccount.getSearchableFolders().name()); @@ -491,6 +496,7 @@ public class AccountSettings extends K9PreferenceActivity mAccount.setFolderTargetMode(Account.FolderMode.valueOf(mTargetMode.getValue())); mAccount.setDeletePolicy(Integer.parseInt(mDeletePolicy.getValue())); mAccount.setExpungePolicy(mExpungePolicy.getValue()); + mAccount.setSyncRemoteDeletions(mSyncRemoteDeletions.isChecked()); mAccount.setSearchableFolders(Account.Searchable.valueOf(mSearchableFolders.getValue())); mAccount.setQuotePrefix(mAccountQuotePrefix.getText()); diff --git a/src/com/fsck/k9/controller/MessagingController.java b/src/com/fsck/k9/controller/MessagingController.java index e5eb54326..28645829f 100644 --- a/src/com/fsck/k9/controller/MessagingController.java +++ b/src/com/fsck/k9/controller/MessagingController.java @@ -1177,20 +1177,22 @@ public class MessagingController implements Runnable /* * Remove any messages that are in the local store but no longer on the remote store or are too old */ - - for (Message localMessage : localMessages) + if (account.syncRemoteDeletions()) { - if (remoteUidMap.get(localMessage.getUid()) == null && !localMessage.isSet(Flag.DELETED)) + for (Message localMessage : localMessages) { - localMessage.setFlag(Flag.X_DESTROYED, true); - - for (MessagingListener l : getListeners()) + if (remoteUidMap.get(localMessage.getUid()) == null && !localMessage.isSet(Flag.DELETED)) { - l.synchronizeMailboxRemovedMessage(account, folder, localMessage); - } - if (listener != null && getListeners().contains(listener) == false) - { - listener.synchronizeMailboxRemovedMessage(account, folder, localMessage); + localMessage.setFlag(Flag.X_DESTROYED, true); + + for (MessagingListener l : getListeners()) + { + l.synchronizeMailboxRemovedMessage(account, folder, localMessage); + } + if (listener != null && getListeners().contains(listener) == false) + { + listener.synchronizeMailboxRemovedMessage(account, folder, localMessage); + } } } } @@ -1892,17 +1894,23 @@ public class MessagingController implements Runnable } if (remoteMessage.isSet(Flag.DELETED)) { - localMessage.setFlag(Flag.DELETED, true); - messageChanged = true; - } - for (Flag flag : new Flag[] { Flag.SEEN, Flag.FLAGGED, Flag.ANSWERED }) - { - if (remoteMessage.isSet(flag) != localMessage.isSet(flag)) + if (localMessage.getFolder().getAccount().syncRemoteDeletions()) { - localMessage.setFlag(flag, remoteMessage.isSet(flag)); + localMessage.setFlag(Flag.DELETED, true); messageChanged = true; } } + else + { + for (Flag flag : new Flag[] { Flag.SEEN, Flag.FLAGGED, Flag.ANSWERED }) + { + if (remoteMessage.isSet(flag) != localMessage.isSet(flag)) + { + localMessage.setFlag(flag, remoteMessage.isSet(flag)); + messageChanged = true; + } + } + } return messageChanged; } private String getRootCauseMessage(Throwable t)