From eb3847ce50b829ae7f6e1879227c8034735662d2 Mon Sep 17 00:00:00 2001 From: M66B Date: Sun, 2 Dec 2018 20:34:18 +0100 Subject: [PATCH] Allow archiving selection --- .../eu/faircode/email/FragmentMessages.java | 158 ++++++++++-------- 1 file changed, 86 insertions(+), 72 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 1e775dbe6b..8c967324d4 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -564,8 +564,10 @@ public class FragmentMessages extends FragmentEx { private final int action_unseen = 2; private final int action_flag = 3; private final int action_unflag = 4; - private final int action_move = 5; + private final int action_archive = 5; private final int action_trash = 6; + private final int action_delete = 7; + private final int action_move = 8; @Override public void onClick(View v) { @@ -579,13 +581,9 @@ public class FragmentMessages extends FragmentEx { long fid = args.getLong("folder"); long[] ids = args.getLongArray("ids"); - Boolean[] result = new Boolean[6]; - result[0] = false; - result[1] = false; - result[2] = false; - result[3] = false; - result[4] = false; - result[5] = false; + Boolean[] result = new Boolean[8]; + for (int i = 0; i < result.length; i++) + result[i] = false; DB db = DB.getInstance(context); @@ -595,14 +593,19 @@ public class FragmentMessages extends FragmentEx { result[message.flagged ? 3 : 2] = true; } - EntityFolder folder = db.folder().getFolder(fid); - if (folder != null && EntityFolder.TRASH.equals(folder.type)) - result[4] = true; - EntityMessage m0 = db.message().getMessage(ids[0]); + EntityFolder archive = db.folder().getFolderByType(m0.account, EntityFolder.ARCHIVE); EntityFolder trash = db.folder().getFolderByType(m0.account, EntityFolder.TRASH); + + result[4] = (archive != null); result[5] = (trash != null); + EntityFolder folder = db.folder().getFolder(fid); + if (folder != null) { + result[6] = EntityFolder.ARCHIVE.equals(folder.type); + result[7] = EntityFolder.TRASH.equals(folder.type); + } + return result; } @@ -620,10 +623,16 @@ public class FragmentMessages extends FragmentEx { if (result[3]) popupMenu.getMenu().add(Menu.NONE, action_unflag, 4, R.string.title_unflag); - popupMenu.getMenu().add(Menu.NONE, action_move, 5, R.string.title_move); + if (result[4] && !result[6]) // has archive and not is archive + popupMenu.getMenu().add(Menu.NONE, action_archive, 5, R.string.title_archive); + + if (result[5]) // has trash + if (result[7]) // is trash + popupMenu.getMenu().add(Menu.NONE, action_delete, 6, R.string.title_trash); + else + popupMenu.getMenu().add(Menu.NONE, action_trash, 6, R.string.title_trash); - if (result[4] || result[5]) // is trash or has trash - popupMenu.getMenu().add(Menu.NONE, action_trash, 6, R.string.title_trash); + popupMenu.getMenu().add(Menu.NONE, action_move, 7, R.string.title_move); popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override @@ -641,14 +650,17 @@ public class FragmentMessages extends FragmentEx { case action_unflag: onActionFlag(false); return true; - case action_move: - onActionMove(); + case action_archive: + onActionMove(EntityFolder.ARCHIVE); return true; case action_trash: - if (result[4]) // is trash - onActionDelete(); - else - onActionTrash(); + onActionMove(EntityFolder.TRASH); + return true; + case action_delete: + onActionDelete(); + return true; + case action_move: + onActionMove(); return true; default: return false; @@ -758,6 +770,59 @@ public class FragmentMessages extends FragmentEx { }.load(FragmentMessages.this, args); } + private void onActionMove(String type) { + Bundle args = new Bundle(); + args.putString("type", type); + args.putLongArray("ids", getSelection()); + + selectionTracker.clearSelection(); + + new SimpleTask() { + @Override + protected MessageTarget onLoad(Context context, Bundle args) { + String type = args.getString("type"); + long[] ids = args.getLongArray("ids"); + + MessageTarget result = new MessageTarget(); + + DB db = DB.getInstance(context); + try { + db.beginTransaction(); + + EntityMessage m0 = db.message().getMessage(ids[0]); + result.target = db.folder().getFolderByType(m0.account, type); + + for (long id : ids) { + EntityMessage message = db.message().getMessage(id); + List messages = db.message().getMessageByThread( + message.account, message.thread, threading ? null : id, message.ui_found); + for (EntityMessage threaded : messages) + if (threaded.folder.equals(message.folder)) { + result.ids.add(threaded.id); + db.message().setMessageUiHide(threaded.id, true); + } + } + + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + + return result; + } + + @Override + protected void onLoaded(Bundle args, MessageTarget result) { + moveUndo(result); + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Helper.unexpectedError(getContext(), getViewLifecycleOwner(), ex); + } + }.load(FragmentMessages.this, args); + } + private void onActionMove() { Bundle args = new Bundle(); args.putLong("folder", folder); @@ -859,57 +924,6 @@ public class FragmentMessages extends FragmentEx { }.load(FragmentMessages.this, args); } - private void onActionTrash() { - Bundle args = new Bundle(); - args.putLongArray("ids", getSelection()); - - selectionTracker.clearSelection(); - - new SimpleTask() { - @Override - protected MessageTarget onLoad(Context context, Bundle args) { - long[] ids = args.getLongArray("ids"); - - MessageTarget result = new MessageTarget(); - - DB db = DB.getInstance(context); - try { - db.beginTransaction(); - - EntityMessage m0 = db.message().getMessage(ids[0]); - result.target = db.folder().getFolderByType(m0.account, EntityFolder.TRASH); - - for (long id : ids) { - EntityMessage message = db.message().getMessage(id); - List messages = db.message().getMessageByThread( - message.account, message.thread, threading ? null : id, message.ui_found); - for (EntityMessage threaded : messages) - if (threaded.folder.equals(message.folder)) { - result.ids.add(threaded.id); - db.message().setMessageUiHide(threaded.id, true); - } - } - - db.setTransactionSuccessful(); - } finally { - db.endTransaction(); - } - - return result; - } - - @Override - protected void onLoaded(Bundle args, MessageTarget result) { - moveUndo(result); - } - - @Override - protected void onException(Bundle args, Throwable ex) { - Helper.unexpectedError(getContext(), getViewLifecycleOwner(), ex); - } - }.load(FragmentMessages.this, args); - } - private void onActionDelete() { new DialogBuilderLifecycle(getContext(), getViewLifecycleOwner()) .setMessage(R.string.title_ask_delete_selected)