diff --git a/app/src/main/java/eu/faircode/email/ApplicationEx.java b/app/src/main/java/eu/faircode/email/ApplicationEx.java index 512cea1cb8..2cc3b89ddf 100644 --- a/app/src/main/java/eu/faircode/email/ApplicationEx.java +++ b/app/src/main/java/eu/faircode/email/ApplicationEx.java @@ -720,6 +720,11 @@ public class ApplicationEx extends Application if (!prefs.contains("filter_" + type + "_" + name)) editor.putBoolean("filter_" + type + "_" + name, prefs.getBoolean("filter_" + name, false)); } + } else if (version < 2084) { + boolean thread_sent_trash = prefs.getBoolean("thread_sent_trash", false); + if (thread_sent_trash) + editor.putBoolean("move_thread_sent", true); + editor.remove("thread_sent_trash"); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && !BuildConfig.DEBUG) diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index d638cbf290..29644de0ec 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -336,7 +336,8 @@ public class FragmentMessages extends FragmentBase private boolean threading; private boolean swipenav; private boolean seekbar; - private boolean thread_sent_trash; + private boolean move_thread_all; + private boolean move_thread_sent; private boolean actionbar; private int actionbar_delete_id; private int actionbar_archive_id; @@ -488,8 +489,8 @@ public class FragmentMessages extends FragmentBase args.getBoolean("force_threading")); swipenav = prefs.getBoolean("swipenav", true); seekbar = prefs.getBoolean("seekbar", false); - thread_sent_trash = (prefs.getBoolean("thread_sent_trash", true) || - EntityFolder.SENT.equals(type)); + move_thread_all = prefs.getBoolean("move_thread_all", false); + move_thread_sent = (move_thread_all || prefs.getBoolean("move_thread_sent", false)); actionbar = prefs.getBoolean("actionbar", true); boolean actionbar_swap = prefs.getBoolean("actionbar_swap", false); actionbar_delete_id = (actionbar_swap ? R.id.action_archive : R.id.action_delete); @@ -1378,7 +1379,7 @@ public class FragmentMessages extends FragmentBase args.putString("thread", thread); args.putLong("id", id); args.putString("type", folderType); - args.putBoolean("thread_sent_trash", thread_sent_trash); + args.putBoolean("move_thread_sent", move_thread_sent); args.putBoolean("filter_archive", filter_archive); new SimpleTask>() { @@ -1388,7 +1389,7 @@ public class FragmentMessages extends FragmentBase String thread = args.getString("thread"); long id = args.getLong("id"); String type = args.getString("type"); - boolean thread_sent_trash = args.getBoolean("thread_sent_trash"); + boolean move_thread_sent = args.getBoolean("move_thread_sent"); boolean filter_archive = args.getBoolean("filter_archive"); ArrayList result = new ArrayList<>(); @@ -1415,7 +1416,7 @@ public class FragmentMessages extends FragmentBase !EntityFolder.DRAFTS.equals(sourceFolder.type) && !EntityFolder.OUTBOX.equals(sourceFolder.type) && !(EntityFolder.SENT.equals(sourceFolder.type) && EntityFolder.ARCHIVE.equals(targetFolder.type)) && !(EntityFolder.SENT.equals(sourceFolder.type) && EntityFolder.JUNK.equals(targetFolder.type)) && - (!EntityFolder.SENT.equals(sourceFolder.type) || !EntityFolder.TRASH.equals(targetFolder.type) || thread_sent_trash) && + (!EntityFolder.SENT.equals(sourceFolder.type) || !EntityFolder.TRASH.equals(targetFolder.type) || move_thread_sent) && !EntityFolder.TRASH.equals(sourceFolder.type) && !EntityFolder.JUNK.equals(sourceFolder.type)) result.add(new MessageTarget(context, threaded, account, sourceFolder, account, targetFolder)); } @@ -2139,6 +2140,7 @@ public class FragmentMessages extends FragmentBase args.putLong("account", account); args.putString("thread", thread); args.putLong("id", id); + args.putBoolean("move_thread_sent", move_thread_sent); args.putBoolean("filter_archive", filter_archive); args.putLongArray("disabled", new long[]{folder}); @@ -4543,7 +4545,8 @@ public class FragmentMessages extends FragmentBase args.putString("type", type); args.putBoolean("block", block); args.putLongArray("ids", getSelection()); - args.putBoolean("thread_sent_trash", thread_sent_trash); + args.putBoolean("move_thread_all", move_thread_all); + args.putBoolean("move_thread_sent", move_thread_sent); args.putBoolean("filter_archive", filter_archive); new SimpleTask>() { @@ -4552,7 +4555,8 @@ public class FragmentMessages extends FragmentBase String type = args.getString("type"); boolean block = args.getBoolean("block"); long[] ids = args.getLongArray("ids"); - boolean thread_sent_trash = args.getBoolean("thread_sent_trash"); + boolean move_thread_all = args.getBoolean("move_thread_all"); + boolean move_thread_sent = args.getBoolean("move_thread_sent"); boolean filter_archive = args.getBoolean("filter_archive"); ArrayList result = new ArrayList<>(); @@ -4577,16 +4581,20 @@ public class FragmentMessages extends FragmentBase List messages = db.message().getMessagesByThread( message.account, message.thread, threading ? null : id, - EntityFolder.TRASH.equals(targetFolder.type) ? null : message.folder); + move_thread_all || move_thread_sent ? null : message.folder); for (EntityMessage threaded : messages) { EntityFolder sourceFolder = db.folder().getFolder(threaded.folder); if (sourceFolder == null || sourceFolder.read_only || sourceFolder.id.equals(targetFolder.id)) continue; + + if (!threaded.folder.equals(message.folder) && + !(move_thread_all || + (move_thread_sent && EntityFolder.SENT.equals(sourceFolder.type)))) + continue; + if (EntityFolder.TRASH.equals(targetFolder.type)) { - if (EntityFolder.SENT.equals(sourceFolder.type) && !thread_sent_trash) - continue; if (EntityFolder.ARCHIVE.equals(sourceFolder.type) && filter_archive) continue; if (EntityFolder.JUNK.equals(sourceFolder.type) && !threaded.folder.equals(message.folder)) @@ -4630,6 +4638,9 @@ public class FragmentMessages extends FragmentBase args.putBoolean("cancopy", true); args.putLongArray("disabled", Helper.toLongArray(disabled)); args.putLongArray("messages", getSelection()); + args.putBoolean("move_thread_all", move_thread_all); + args.putBoolean("move_thread_sent", move_thread_sent); + args.putBoolean("filter_archive", filter_archive); FragmentDialogSelectFolder fragment = new FragmentDialogSelectFolder(); fragment.setArguments(args); @@ -4646,6 +4657,9 @@ public class FragmentMessages extends FragmentBase long[] ids = args.getLongArray("ids"); long tid = args.getLong("folder"); boolean copy = args.getBoolean("copy"); + boolean move_thread_all = args.getBoolean("move_thread_all"); + boolean move_thread_sent = args.getBoolean("move_thread_sent"); + boolean filter_archive = args.getBoolean("filter_archive"); ArrayList result = new ArrayList<>(); @@ -4671,7 +4685,8 @@ public class FragmentMessages extends FragmentBase continue; List messages = db.message().getMessagesByThread( - message.account, message.thread, threading ? null : id, message.folder); + message.account, message.thread, threading ? null : id, + move_thread_all || move_thread_sent ? null : message.folder); for (EntityMessage threaded : messages) { EntityFolder sourceFolder = db.folder().getFolder(threaded.folder); if (sourceFolder == null || @@ -4679,6 +4694,18 @@ public class FragmentMessages extends FragmentBase sourceFolder.id.equals(targetFolder.id)) continue; + if (!threaded.folder.equals(message.folder) && + !(move_thread_all || + (move_thread_sent && EntityFolder.SENT.equals(sourceFolder.type)))) + continue; + + if (EntityFolder.TRASH.equals(targetFolder.type)) { + if (EntityFolder.ARCHIVE.equals(sourceFolder.type) && filter_archive) + continue; + if (EntityFolder.JUNK.equals(sourceFolder.type) && !threaded.folder.equals(message.folder)) + continue; + } + result.add(new MessageTarget(context, threaded, sourceAccount, sourceFolder, targetAccount, targetFolder).setCopy(copy)); } } @@ -4715,12 +4742,10 @@ public class FragmentMessages extends FragmentBase long aid = args.getLong("account"); String thread = args.getString("thread"); long id = args.getLong("id"); + boolean move_thread_sent = args.getBoolean("move_thread_sent"); boolean filter_archive = args.getBoolean("filter_archive"); long tid = args.getLong("folder"); - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - boolean move_thread_sent = prefs.getBoolean("move_thread_sent", false); - ArrayList result = new ArrayList<>(); DB db = DB.getInstance(context); @@ -7171,7 +7196,7 @@ public class FragmentMessages extends FragmentBase args.putLong("account", account); args.putString("thread", thread); args.putLong("id", id); - args.putBoolean("thread_sent_trash", thread_sent_trash); + args.putBoolean("move_thread_sent", move_thread_sent); args.putBoolean("filter_archive", filter_archive); new SimpleTask() { @@ -7180,7 +7205,7 @@ public class FragmentMessages extends FragmentBase long aid = args.getLong("account"); String thread = args.getString("thread"); long id = args.getLong("id"); - boolean thread_sent_trash = args.getBoolean("thread_sent_trash"); + boolean move_thread_sent = args.getBoolean("move_thread_sent"); boolean filter_archive = args.getBoolean("filter_archive"); EntityAccount account; @@ -7217,7 +7242,7 @@ public class FragmentMessages extends FragmentBase if (!folder.read_only && !EntityFolder.DRAFTS.equals(folder.type) && !EntityFolder.OUTBOX.equals(folder.type) && - (!EntityFolder.SENT.equals(folder.type) || thread_sent_trash) && + (!EntityFolder.SENT.equals(folder.type) || move_thread_sent) && !EntityFolder.TRASH.equals(folder.type) && !EntityFolder.JUNK.equals(folder.type)) trashable = true; diff --git a/app/src/main/java/eu/faircode/email/FragmentOptions.java b/app/src/main/java/eu/faircode/email/FragmentOptions.java index 8ae25222f9..d4532a6dd9 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptions.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptions.java @@ -152,7 +152,8 @@ public class FragmentOptions extends FragmentBase { "collapse_quotes", "image_placeholders", "inline_images", "seekbar", "actionbar", "actionbar_swap", "actionbar_color", "group_category", "autoscroll", "swipenav", "reversed", "swipe_close", "swipe_move", "autoexpand", "autoclose", "onclose", - "thread_sent_trash", "auto_hide_answer", "swipe_reply", + "auto_hide_answer", "swipe_reply", + "move_thread_all", "move_thread_sent", "language_detection", "quick_filter", "quick_scroll", "quick_actions", "experiments", "debug", "log_level", "test1", "test2", "test3", "test4", "test5", diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsBehavior.java b/app/src/main/java/eu/faircode/email/FragmentOptionsBehavior.java index 46793b3774..4b3a9a7a5e 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsBehavior.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsBehavior.java @@ -100,8 +100,8 @@ public class FragmentOptionsBehavior extends FragmentBase implements SharedPrefe private SwitchCompat swAutoBlockSender; private SwitchCompat swAutoHideAnswer; private SwitchCompat swSwipeReply; + private SwitchCompat swMoveThreadAll; private SwitchCompat swMoveThreadSent; - private SwitchCompat swThreadSentTrash; private Button btnDefaultFolder; private TextView tvDefaultFolder; @@ -122,7 +122,7 @@ public class FragmentOptionsBehavior extends FragmentBase implements SharedPrefe "undo_timeout", "autoread", "flag_snoozed", "autounflag", "auto_important", "reset_importance", "reset_snooze", "auto_block_sender", "auto_hide_answer", "swipe_reply", - "move_thread_sent", "thread_sent_trash", + "move_thread_all", "move_thread_sent", "default_folder" }; @@ -183,8 +183,8 @@ public class FragmentOptionsBehavior extends FragmentBase implements SharedPrefe swAutoBlockSender = view.findViewById(R.id.swAutoBlockSender); swAutoHideAnswer = view.findViewById(R.id.swAutoHideAnswer); swSwipeReply = view.findViewById(R.id.swSwipeReply); + swMoveThreadAll = view.findViewById(R.id.swMoveThreadAll); swMoveThreadSent = view.findViewById(R.id.swMoveThreadSent); - swThreadSentTrash = view.findViewById(R.id.swThreadSentTrash); btnDefaultFolder = view.findViewById(R.id.btnDefaultFolder); tvDefaultFolder = view.findViewById(R.id.tvDefaultFolder); @@ -569,6 +569,14 @@ public class FragmentOptionsBehavior extends FragmentBase implements SharedPrefe } }); + swMoveThreadAll.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { + prefs.edit().putBoolean("move_thread_all", checked).apply(); + swMoveThreadSent.setEnabled(!checked); + } + }); + swMoveThreadSent.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { @@ -576,13 +584,6 @@ public class FragmentOptionsBehavior extends FragmentBase implements SharedPrefe } }); - swThreadSentTrash.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { - prefs.edit().putBoolean("thread_sent_trash", checked).apply(); - } - }); - Intent tree = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); Helper.openAdvanced(getContext(), tree); PackageManager pm = getContext().getPackageManager(); @@ -734,8 +735,9 @@ public class FragmentOptionsBehavior extends FragmentBase implements SharedPrefe swAutoHideAnswer.setChecked(prefs.getBoolean("auto_hide_answer", !accessibility)); swSwipeReply.setChecked(prefs.getBoolean("swipe_reply", false)); + swMoveThreadAll.setChecked(prefs.getBoolean("move_thread_all", false)); swMoveThreadSent.setChecked(prefs.getBoolean("move_thread_sent", false)); - swThreadSentTrash.setChecked(prefs.getBoolean("thread_sent_trash", true)); + swMoveThreadSent.setEnabled(!swMoveThreadAll.isChecked()); tvDefaultFolder.setText(prefs.getString("default_folder", null)); } catch (Throwable ex) { diff --git a/app/src/main/res/layout/fragment_options_behavior.xml b/app/src/main/res/layout/fragment_options_behavior.xml index b5e673e806..1e068f08a8 100644 --- a/app/src/main/res/layout/fragment_options_behavior.xml +++ b/app/src/main/res/layout/fragment_options_behavior.xml @@ -834,25 +834,26 @@ app:switchPadding="12dp" />