diff --git a/CHANGELOG.md b/CHANGELOG.md index bc3aebed1e..09efe3a112 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ For support you can use [the contact form](https://contact.faircode.eu/?product= ### Next version +* Added option to to delay automatically marking messages as read * Replaced [javadns](https://github.com/dnsjava/dnsjava) by [MiniDNS](https://github.com/MiniDNS/minidns) * Added account/identity option to enforce DNSSEC * Added account/identity option to enforce DANE, see [the FAQ](https://github.com/M66B/FairEmail/blob/master/FAQ.md#faq202) diff --git a/app/src/main/assets/CHANGELOG.md b/app/src/main/assets/CHANGELOG.md index bc3aebed1e..09efe3a112 100644 --- a/app/src/main/assets/CHANGELOG.md +++ b/app/src/main/assets/CHANGELOG.md @@ -8,6 +8,7 @@ For support you can use [the contact form](https://contact.faircode.eu/?product= ### Next version +* Added option to to delay automatically marking messages as read * Replaced [javadns](https://github.com/dnsjava/dnsjava) by [MiniDNS](https://github.com/MiniDNS/minidns) * Added account/identity option to enforce DNSSEC * Added account/identity option to enforce DANE, see [the FAQ](https://github.com/M66B/FairEmail/blob/master/FAQ.md#faq202) diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index e32b75fe05..46bda5cdb1 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -340,6 +340,7 @@ public class FragmentMessages extends FragmentBase private int actionbar_delete_id; private int actionbar_archive_id; private boolean actionbar_color; + private int seen_delay = 0; private boolean autoexpand; private boolean autoclose; private String onclose; @@ -493,6 +494,7 @@ public class FragmentMessages extends FragmentBase actionbar_delete_id = (actionbar_swap ? R.id.action_archive : R.id.action_delete); actionbar_archive_id = (actionbar_swap ? R.id.action_delete : R.id.action_archive); actionbar_color = prefs.getBoolean("actionbar_color", false); + seen_delay = prefs.getInt("seen_delay", 0); autoexpand = prefs.getBoolean("autoexpand", true); autoclose = prefs.getBoolean("autoclose", true); onclose = (autoclose ? null : prefs.getString("onclose", null)); @@ -2546,7 +2548,7 @@ public class FragmentMessages extends FragmentBase @Override public void setExpanded(TupleMessageEx message, boolean value, boolean scroll) { // Prevent flicker - if (value && message.accountAutoSeen && + if (value && message.accountAutoSeen && seen_delay == 0 && (message.uid != null || message.accountProtocol == EntityAccount.TYPE_POP)) { message.unseen = 0; message.ui_seen = true; @@ -7601,13 +7603,11 @@ public class FragmentMessages extends FragmentBase } private void handleExpand(long id) { - Bundle args = new Bundle(); - args.putLong("id", id); - - new SimpleTask() { + SimpleTask taskExpand = new SimpleTask() { @Override protected Void onExecute(Context context, Bundle args) { long id = args.getLong("id"); + boolean seen = args.getBoolean("seen"); Long reload = null; @@ -7630,19 +7630,24 @@ public class FragmentMessages extends FragmentBase if (!"connected".equals(account.state) && !account.isTransient(context)) reload = account.id; - if (message.ui_unsnoozed) - db.message().setMessageUnsnoozed(message.id, false); + if (seen) { + if (message.ui_unsnoozed) + db.message().setMessageUnsnoozed(message.id, false); - if (!account.auto_seen && !message.ui_ignored && message.ui_snoozed == null) { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - boolean notify_remove = prefs.getBoolean("notify_remove", true); - if (notify_remove) - db.message().setMessageUiIgnored(message.id, true); + if (!account.auto_seen && !message.ui_ignored && message.ui_snoozed == null) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + boolean notify_remove = prefs.getBoolean("notify_remove", true); + if (notify_remove) + db.message().setMessageUiIgnored(message.id, true); + } + + if (account.protocol != EntityAccount.TYPE_IMAP || message.uid != null) { + if (account.auto_seen) + EntityOperation.queue(context, message, EntityOperation.SEEN, true); + } } if (account.protocol != EntityAccount.TYPE_IMAP || message.uid != null) { - if (account.auto_seen) - EntityOperation.queue(context, message, EntityOperation.SEEN, true); if (!message.content) EntityOperation.queue(context, message, EntityOperation.BODY); } @@ -7664,7 +7669,27 @@ public class FragmentMessages extends FragmentBase protected void onException(Bundle args, Throwable ex) { Log.unexpectedError(getParentFragmentManager(), ex); } - }.setLog(false).execute(this, args, "messages:expand"); + }.setLog(false); + + Bundle args = new Bundle(); + args.putLong("id", id); + args.putBoolean("seen", seen_delay == 0); + taskExpand.execute(this, args, "messages:expand"); + + if (seen_delay == 0) + return; + + view.postDelayed(new RunnableEx("seen_delay") { + @Override + public void delegate() { + if (values.containsKey("expanded") && values.get("expanded").contains(id)) { + Bundle dargs = new Bundle(); + dargs.putLong("id", id); + dargs.putBoolean("seen", true); + taskExpand.execute(FragmentMessages.this, dargs, "messages:seen_delay"); + } + } + }, seen_delay); } private void handleAutoClose() { @@ -8438,6 +8463,9 @@ public class FragmentMessages extends FragmentBase return; } + if (expanded > 0) + values.get("expanded").clear(); + handleExit(); FragmentActivity activity = getActivity(); diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsBehavior.java b/app/src/main/java/eu/faircode/email/FragmentOptionsBehavior.java index c6fb5621ec..b24e3f17f9 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsBehavior.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsBehavior.java @@ -87,6 +87,7 @@ public class FragmentOptionsBehavior extends FragmentBase implements SharedPrefe private SwitchCompat swExpandAll; private SwitchCompat swExpandOne; private SwitchCompat swAutoClose; + private Spinner spSeenDelay; private TextView tvAutoSeenHint; private TextView tvOnClose; private Spinner spOnClose; @@ -123,6 +124,7 @@ public class FragmentOptionsBehavior extends FragmentBase implements SharedPrefe "pull", "pull_all", "autoscroll", "quick_filter", "quick_scroll", "quick_actions", "swipe_sensitivity", "foldernav", "doubletap", "swipenav", "volumenav", "updown", "reversed", "swipe_close", "swipe_move", "autoexpand", "expand_first", "expand_all", "expand_one", "collapse_multiple", + "seen_delay", "autoclose", "onclose", "autoclose_unseen", "autoclose_send", "collapse_marked", "undo_timeout", "autoread", "flag_snoozed", "autounflag", "auto_important", "reset_importance", @@ -171,6 +173,7 @@ public class FragmentOptionsBehavior extends FragmentBase implements SharedPrefe swExpandAll = view.findViewById(R.id.swExpandAll); swExpandOne = view.findViewById(R.id.swExpandOne); swCollapseMultiple = view.findViewById(R.id.swCollapseMultiple); + spSeenDelay = view.findViewById(R.id.spSeenDelay); tvAutoSeenHint = view.findViewById(R.id.tvAutoSeenHint); swAutoClose = view.findViewById(R.id.swAutoClose); tvOnClose = view.findViewById(R.id.tvOnClose); @@ -201,6 +204,7 @@ public class FragmentOptionsBehavior extends FragmentBase implements SharedPrefe // Wire controls final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); + int[] undoValues = getResources().getIntArray(R.array.undoValues); ibHelp.setOnClickListener(new View.OnClickListener() { @Override @@ -442,6 +446,19 @@ public class FragmentOptionsBehavior extends FragmentBase implements SharedPrefe } }); + spSeenDelay.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int position, long id) { + int value = undoValues[position]; + prefs.edit().putInt("seen_delay", value).apply(); + } + + @Override + public void onNothingSelected(AdapterView parent) { + prefs.edit().remove("seen_delay").apply(); + } + }); + tvAutoSeenHint.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -500,8 +517,7 @@ public class FragmentOptionsBehavior extends FragmentBase implements SharedPrefe spUndoTimeout.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView adapterView, View view, int position, long id) { - int[] values = getResources().getIntArray(R.array.undoValues); - int value = values[position]; + int value = undoValues[position]; prefs.edit().putInt("undo_timeout", value).apply(); } @@ -680,6 +696,8 @@ public class FragmentOptionsBehavior extends FragmentBase implements SharedPrefe if (view == null || getContext() == null) return; + int[] undoValues = getResources().getIntArray(R.array.undoValues); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); swRestoreOnLaunch.setChecked(prefs.getBoolean("restore_on_launch", false)); @@ -723,6 +741,13 @@ public class FragmentOptionsBehavior extends FragmentBase implements SharedPrefe swExpandOne.setEnabled(!swExpandAll.isChecked()); swCollapseMultiple.setChecked(prefs.getBoolean("collapse_multiple", true)); + int seen_delay = prefs.getInt("seen_delay", 0); + for (int pos = 0; pos < undoValues.length; pos++) + if (undoValues[pos] == seen_delay) { + spSeenDelay.setSelection(pos); + break; + } + swAutoClose.setChecked(prefs.getBoolean("autoclose", true)); String onClose = prefs.getString("onclose", ""); @@ -741,7 +766,6 @@ public class FragmentOptionsBehavior extends FragmentBase implements SharedPrefe swCollapseMarked.setChecked(prefs.getBoolean("collapse_marked", true)); int undo_timeout = prefs.getInt("undo_timeout", 5000); - int[] undoValues = getResources().getIntArray(R.array.undoValues); for (int pos = 0; pos < undoValues.length; pos++) if (undoValues[pos] == undo_timeout) { spUndoTimeout.setSelection(pos); diff --git a/app/src/main/res/layout/fragment_options_behavior.xml b/app/src/main/res/layout/fragment_options_behavior.xml index 24027b2b86..791dc58d7a 100644 --- a/app/src/main/res/layout/fragment_options_behavior.xml +++ b/app/src/main/res/layout/fragment_options_behavior.xml @@ -574,6 +574,28 @@ app:layout_constraintTop_toBottomOf="@id/swExpandOne" app:switchPadding="12dp" /> + + + + + app:layout_constraintTop_toBottomOf="@id/spSeenDelay" /> Automatically expand all read messages Expand only one message at a time Collapse messages in a conversation with multiple messages on \'back\' + Delay automatically marking messages as read Automatically close conversations Automatically close conversations after sending messages On closing a conversation diff --git a/metadata/en-US/changelogs/2147.txt b/metadata/en-US/changelogs/2147.txt index 3d7f8a1328..c0a6cf830a 100644 --- a/metadata/en-US/changelogs/2147.txt +++ b/metadata/en-US/changelogs/2147.txt @@ -8,6 +8,7 @@ Ypupiara Next version +* Added option to to delay automatically marking messages as read * Replaced javadns * Added account/identity option to enforce DNSSEC * Added account/identity option to enforce DANE, see the FAQ