Loading legacy/core/src/main/java/com/fsck/k9/controller/MessagingController.java +53 −0 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ import com.fsck.k9.controller.ControllerExtension.ControllerInternals; import com.fsck.k9.controller.MessagingControllerCommands.PendingAppend; import com.fsck.k9.controller.MessagingControllerCommands.PendingCommand; import com.fsck.k9.controller.MessagingControllerCommands.PendingDelete; import com.fsck.k9.controller.MessagingControllerCommands.PendingEmptySpam; import com.fsck.k9.controller.MessagingControllerCommands.PendingEmptyTrash; import com.fsck.k9.controller.MessagingControllerCommands.PendingExpunge; import com.fsck.k9.controller.MessagingControllerCommands.PendingMarkAllAsRead; Loading Loading @@ -2099,6 +2100,58 @@ public class MessagingController implements MessagingControllerRegistry, Messagi return uids; } void processPendingEmptySpam(Account account) throws MessagingException { if (!account.hasSpamFolder()) { return; } long spamFolderId = account.getSpamFolderId(); LocalStore localStore = localStoreProvider.getInstance(account); LocalFolder folder = localStore.getFolder(spamFolderId); folder.open(); String spamFolderServerId = folder.getServerId(); Backend backend = getBackend(account); backend.deleteAllMessages(spamFolderServerId); // Remove all messages marked as deleted folder.destroyDeletedMessages(); compact(account); } public void emptySpam(final Account account, MessagingListener listener) { putBackground("emptySpam", listener, new Runnable() { @Override public void run() { try { Long spamFolderId = account.getSpamFolderId(); if (spamFolderId == null) { Timber.w("No Spam folder configured. Can't empty spam."); return; } LocalStore localStore = localStoreProvider.getInstance(account); LocalFolder localFolder = localStore.getFolder(spamFolderId); localFolder.open(); localFolder.destroyLocalOnlyMessages(); localFolder.setFlags(Collections.singleton(Flag.DELETED), true); for (MessagingListener l : getListeners()) { l.folderStatusChanged(account, spamFolderId); } PendingCommand command = PendingEmptySpam.create(); queuePendingCommand(account, command); processPendingCommands(account); } catch (Exception e) { Timber.e(e, "emptySpam failed"); } } }); } void processPendingEmptyTrash(Account account) throws MessagingException { if (!account.hasTrashFolder()) { return; Loading legacy/core/src/main/java/com/fsck/k9/controller/MessagingControllerCommands.java +17 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ public class MessagingControllerCommands { static final String COMMAND_EXPUNGE = "expunge"; static final String COMMAND_MOVE_OR_COPY = "move_or_copy"; static final String COMMAND_MOVE_AND_MARK_AS_READ = "move_and_mark_as_read"; static final String COMMAND_EMPTY_SPAM = "empty_spam"; static final String COMMAND_EMPTY_TRASH = "empty_trash"; public abstract static class PendingCommand { Loading Loading @@ -95,6 +96,22 @@ public class MessagingControllerCommands { } } public static class PendingEmptySpam extends PendingCommand { public static PendingEmptySpam create() { return new PendingEmptySpam(); } @Override public String getCommandName() { return COMMAND_EMPTY_SPAM; } @Override public void execute(MessagingController controller, Account account) throws MessagingException { controller.processPendingEmptySpam(account); } } public static class PendingEmptyTrash extends PendingCommand { public static PendingEmptyTrash create() { return new PendingEmptyTrash(); Loading legacy/core/src/main/java/com/fsck/k9/controller/PendingCommandSerializer.java +2 −0 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ import java.util.Map; import com.fsck.k9.controller.MessagingControllerCommands.PendingAppend; import com.fsck.k9.controller.MessagingControllerCommands.PendingCommand; import com.fsck.k9.controller.MessagingControllerCommands.PendingDelete; import com.fsck.k9.controller.MessagingControllerCommands.PendingEmptySpam; import com.fsck.k9.controller.MessagingControllerCommands.PendingEmptyTrash; import com.fsck.k9.controller.MessagingControllerCommands.PendingExpunge; import com.fsck.k9.controller.MessagingControllerCommands.PendingMarkAllAsRead; Loading Loading @@ -37,6 +38,7 @@ public class PendingCommandSerializer { moshi.adapter(PendingMoveAndMarkAsRead.class)); adapters.put(MessagingControllerCommands.COMMAND_APPEND, moshi.adapter(PendingAppend.class)); adapters.put(MessagingControllerCommands.COMMAND_REPLACE, moshi.adapter(PendingReplace.class)); adapters.put(MessagingControllerCommands.COMMAND_EMPTY_SPAM, moshi.adapter(PendingEmptySpam.class)); adapters.put(MessagingControllerCommands.COMMAND_EMPTY_TRASH, moshi.adapter(PendingEmptyTrash.class)); adapters.put(MessagingControllerCommands.COMMAND_EXPUNGE, moshi.adapter(PendingExpunge.class)); adapters.put(MessagingControllerCommands.COMMAND_MARK_ALL_AS_READ, moshi.adapter(PendingMarkAllAsRead.class)); Loading legacy/ui/legacy/src/main/java/com/fsck/k9/ui/messagelist/MessageListFragment.kt +27 −0 Original line number Diff line number Diff line Loading @@ -738,6 +738,18 @@ class MessageListFragment : } } private fun onEmptySpam() { if (isShowingSpamFolder) { showDialog(R.id.dialog_confirm_empty_spam) } } private val isShowingSpamFolder: Boolean get() { if (!isSingleFolderMode) return false return currentFolder!!.databaseId == account!!.spamFolderId } private fun onEmptyTrash() { if (isShowingTrashFolder) { showDialog(R.id.dialog_confirm_empty_trash) Loading Loading @@ -786,6 +798,14 @@ class MessageListFragment : ConfirmationDialogFragment.newInstance(dialogId, title, message, confirmText, cancelText) } R.id.dialog_confirm_empty_spam -> { val title = getString(R.string.dialog_confirm_empty_spam_title) val message = getString(R.string.dialog_confirm_empty_spam_message) val confirmText = getString(R.string.dialog_confirm_delete_confirm_button) val cancelText = getString(R.string.dialog_confirm_delete_cancel_button) ConfirmationDialogFragment.newInstance(dialogId, title, message, confirmText, cancelText) } R.id.dialog_confirm_empty_trash -> { val title = getString(R.string.dialog_confirm_empty_trash_title) val message = getString(R.string.dialog_confirm_empty_trash_message) Loading Loading @@ -820,6 +840,7 @@ class MessageListFragment : menu.findItem(R.id.set_sort).isVisible = true menu.findItem(R.id.select_all).isVisible = true menu.findItem(R.id.mark_all_as_read).isVisible = isMarkAllAsReadSupported menu.findItem(R.id.empty_spam).isVisible = isShowingSpamFolder menu.findItem(R.id.empty_trash).isVisible = isShowingTrashFolder if (isSingleAccountMode) { Loading @@ -843,6 +864,7 @@ class MessageListFragment : menu.findItem(R.id.select_all).isVisible = false menu.findItem(R.id.mark_all_as_read).isVisible = false menu.findItem(R.id.send_messages).isVisible = false menu.findItem(R.id.empty_spam).isVisible = false menu.findItem(R.id.empty_trash).isVisible = false menu.findItem(R.id.expunge).isVisible = false menu.findItem(R.id.search_everywhere).isVisible = false Loading @@ -862,6 +884,7 @@ class MessageListFragment : R.id.select_all -> selectAll() R.id.mark_all_as_read -> confirmMarkAllAsRead() R.id.send_messages -> onSendPendingMessages() R.id.empty_spam -> onEmptySpam() R.id.empty_trash -> onEmptyTrash() R.id.expunge -> onExpunge() R.id.search_everywhere -> onSearchEverywhere() Loading Loading @@ -1227,6 +1250,10 @@ class MessageListFragment : markAllAsRead() } R.id.dialog_confirm_empty_spam -> { messagingController.emptySpam(account, null) } R.id.dialog_confirm_empty_trash -> { messagingController.emptyTrash(account, null) } Loading legacy/ui/legacy/src/main/res/menu/message_list_option_menu.xml +7 −0 Original line number Diff line number Diff line Loading @@ -206,6 +206,13 @@ app:showAsAction="never" /> <!-- MessageList --> <item android:id="@+id/empty_spam" android:title="@string/empty_spam_action" app:showAsAction="never" /> <!-- MessageList --> <item android:id="@+id/empty_trash" Loading Loading
legacy/core/src/main/java/com/fsck/k9/controller/MessagingController.java +53 −0 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ import com.fsck.k9.controller.ControllerExtension.ControllerInternals; import com.fsck.k9.controller.MessagingControllerCommands.PendingAppend; import com.fsck.k9.controller.MessagingControllerCommands.PendingCommand; import com.fsck.k9.controller.MessagingControllerCommands.PendingDelete; import com.fsck.k9.controller.MessagingControllerCommands.PendingEmptySpam; import com.fsck.k9.controller.MessagingControllerCommands.PendingEmptyTrash; import com.fsck.k9.controller.MessagingControllerCommands.PendingExpunge; import com.fsck.k9.controller.MessagingControllerCommands.PendingMarkAllAsRead; Loading Loading @@ -2099,6 +2100,58 @@ public class MessagingController implements MessagingControllerRegistry, Messagi return uids; } void processPendingEmptySpam(Account account) throws MessagingException { if (!account.hasSpamFolder()) { return; } long spamFolderId = account.getSpamFolderId(); LocalStore localStore = localStoreProvider.getInstance(account); LocalFolder folder = localStore.getFolder(spamFolderId); folder.open(); String spamFolderServerId = folder.getServerId(); Backend backend = getBackend(account); backend.deleteAllMessages(spamFolderServerId); // Remove all messages marked as deleted folder.destroyDeletedMessages(); compact(account); } public void emptySpam(final Account account, MessagingListener listener) { putBackground("emptySpam", listener, new Runnable() { @Override public void run() { try { Long spamFolderId = account.getSpamFolderId(); if (spamFolderId == null) { Timber.w("No Spam folder configured. Can't empty spam."); return; } LocalStore localStore = localStoreProvider.getInstance(account); LocalFolder localFolder = localStore.getFolder(spamFolderId); localFolder.open(); localFolder.destroyLocalOnlyMessages(); localFolder.setFlags(Collections.singleton(Flag.DELETED), true); for (MessagingListener l : getListeners()) { l.folderStatusChanged(account, spamFolderId); } PendingCommand command = PendingEmptySpam.create(); queuePendingCommand(account, command); processPendingCommands(account); } catch (Exception e) { Timber.e(e, "emptySpam failed"); } } }); } void processPendingEmptyTrash(Account account) throws MessagingException { if (!account.hasTrashFolder()) { return; Loading
legacy/core/src/main/java/com/fsck/k9/controller/MessagingControllerCommands.java +17 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ public class MessagingControllerCommands { static final String COMMAND_EXPUNGE = "expunge"; static final String COMMAND_MOVE_OR_COPY = "move_or_copy"; static final String COMMAND_MOVE_AND_MARK_AS_READ = "move_and_mark_as_read"; static final String COMMAND_EMPTY_SPAM = "empty_spam"; static final String COMMAND_EMPTY_TRASH = "empty_trash"; public abstract static class PendingCommand { Loading Loading @@ -95,6 +96,22 @@ public class MessagingControllerCommands { } } public static class PendingEmptySpam extends PendingCommand { public static PendingEmptySpam create() { return new PendingEmptySpam(); } @Override public String getCommandName() { return COMMAND_EMPTY_SPAM; } @Override public void execute(MessagingController controller, Account account) throws MessagingException { controller.processPendingEmptySpam(account); } } public static class PendingEmptyTrash extends PendingCommand { public static PendingEmptyTrash create() { return new PendingEmptyTrash(); Loading
legacy/core/src/main/java/com/fsck/k9/controller/PendingCommandSerializer.java +2 −0 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ import java.util.Map; import com.fsck.k9.controller.MessagingControllerCommands.PendingAppend; import com.fsck.k9.controller.MessagingControllerCommands.PendingCommand; import com.fsck.k9.controller.MessagingControllerCommands.PendingDelete; import com.fsck.k9.controller.MessagingControllerCommands.PendingEmptySpam; import com.fsck.k9.controller.MessagingControllerCommands.PendingEmptyTrash; import com.fsck.k9.controller.MessagingControllerCommands.PendingExpunge; import com.fsck.k9.controller.MessagingControllerCommands.PendingMarkAllAsRead; Loading Loading @@ -37,6 +38,7 @@ public class PendingCommandSerializer { moshi.adapter(PendingMoveAndMarkAsRead.class)); adapters.put(MessagingControllerCommands.COMMAND_APPEND, moshi.adapter(PendingAppend.class)); adapters.put(MessagingControllerCommands.COMMAND_REPLACE, moshi.adapter(PendingReplace.class)); adapters.put(MessagingControllerCommands.COMMAND_EMPTY_SPAM, moshi.adapter(PendingEmptySpam.class)); adapters.put(MessagingControllerCommands.COMMAND_EMPTY_TRASH, moshi.adapter(PendingEmptyTrash.class)); adapters.put(MessagingControllerCommands.COMMAND_EXPUNGE, moshi.adapter(PendingExpunge.class)); adapters.put(MessagingControllerCommands.COMMAND_MARK_ALL_AS_READ, moshi.adapter(PendingMarkAllAsRead.class)); Loading
legacy/ui/legacy/src/main/java/com/fsck/k9/ui/messagelist/MessageListFragment.kt +27 −0 Original line number Diff line number Diff line Loading @@ -738,6 +738,18 @@ class MessageListFragment : } } private fun onEmptySpam() { if (isShowingSpamFolder) { showDialog(R.id.dialog_confirm_empty_spam) } } private val isShowingSpamFolder: Boolean get() { if (!isSingleFolderMode) return false return currentFolder!!.databaseId == account!!.spamFolderId } private fun onEmptyTrash() { if (isShowingTrashFolder) { showDialog(R.id.dialog_confirm_empty_trash) Loading Loading @@ -786,6 +798,14 @@ class MessageListFragment : ConfirmationDialogFragment.newInstance(dialogId, title, message, confirmText, cancelText) } R.id.dialog_confirm_empty_spam -> { val title = getString(R.string.dialog_confirm_empty_spam_title) val message = getString(R.string.dialog_confirm_empty_spam_message) val confirmText = getString(R.string.dialog_confirm_delete_confirm_button) val cancelText = getString(R.string.dialog_confirm_delete_cancel_button) ConfirmationDialogFragment.newInstance(dialogId, title, message, confirmText, cancelText) } R.id.dialog_confirm_empty_trash -> { val title = getString(R.string.dialog_confirm_empty_trash_title) val message = getString(R.string.dialog_confirm_empty_trash_message) Loading Loading @@ -820,6 +840,7 @@ class MessageListFragment : menu.findItem(R.id.set_sort).isVisible = true menu.findItem(R.id.select_all).isVisible = true menu.findItem(R.id.mark_all_as_read).isVisible = isMarkAllAsReadSupported menu.findItem(R.id.empty_spam).isVisible = isShowingSpamFolder menu.findItem(R.id.empty_trash).isVisible = isShowingTrashFolder if (isSingleAccountMode) { Loading @@ -843,6 +864,7 @@ class MessageListFragment : menu.findItem(R.id.select_all).isVisible = false menu.findItem(R.id.mark_all_as_read).isVisible = false menu.findItem(R.id.send_messages).isVisible = false menu.findItem(R.id.empty_spam).isVisible = false menu.findItem(R.id.empty_trash).isVisible = false menu.findItem(R.id.expunge).isVisible = false menu.findItem(R.id.search_everywhere).isVisible = false Loading @@ -862,6 +884,7 @@ class MessageListFragment : R.id.select_all -> selectAll() R.id.mark_all_as_read -> confirmMarkAllAsRead() R.id.send_messages -> onSendPendingMessages() R.id.empty_spam -> onEmptySpam() R.id.empty_trash -> onEmptyTrash() R.id.expunge -> onExpunge() R.id.search_everywhere -> onSearchEverywhere() Loading Loading @@ -1227,6 +1250,10 @@ class MessageListFragment : markAllAsRead() } R.id.dialog_confirm_empty_spam -> { messagingController.emptySpam(account, null) } R.id.dialog_confirm_empty_trash -> { messagingController.emptyTrash(account, null) } Loading
legacy/ui/legacy/src/main/res/menu/message_list_option_menu.xml +7 −0 Original line number Diff line number Diff line Loading @@ -206,6 +206,13 @@ app:showAsAction="never" /> <!-- MessageList --> <item android:id="@+id/empty_spam" android:title="@string/empty_spam_action" app:showAsAction="never" /> <!-- MessageList --> <item android:id="@+id/empty_trash" Loading