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)