From 4bf9e9cc85d024431c98046ecc6568fc6c99fa51 Mon Sep 17 00:00:00 2001 From: M66B Date: Thu, 23 Dec 2021 19:12:02 +0100 Subject: [PATCH] Added reply count option --- .../java/eu/faircode/email/EntityMessage.java | 43 ++++++++++++++----- .../eu/faircode/email/FragmentCompose.java | 18 +++++++- .../faircode/email/FragmentOptionsSend.java | 14 +++++- .../main/res/layout/fragment_options_send.xml | 14 +++++- app/src/main/res/values/strings.xml | 1 + 5 files changed, 76 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/EntityMessage.java b/app/src/main/java/eu/faircode/email/EntityMessage.java index 86d7552645..444b50593e 100644 --- a/app/src/main/java/eu/faircode/email/EntityMessage.java +++ b/app/src/main/java/eu/faircode/email/EntityMessage.java @@ -320,29 +320,45 @@ public class EntityMessage implements Serializable { return MessageHelper.equalDomain(context, reply, from); } - private static String SUBJECT_COUNT = "((\\[\\d+\\])|(\\(\\d+\\)))?"; + static int getReplies(Context context, String language, String subject) { + boolean found = false; + List res = new ArrayList<>(); + res.addAll(Arrays.asList(Helper.getStrings(context, language, R.string.title_subject_reply, ""))); + res.addAll(Arrays.asList(Helper.getStrings(context, language, R.string.title_subject_reply_alt, ""))); + for (String re : res) { + Matcher m = getPattern(re.trim()).matcher(subject); + if (m.matches()) { + found = true; + if (re.trim().endsWith(":")) + try { + String n = m.group(2); + if (n != null) + return Integer.parseInt(n.substring(1, n.length() - 1)); + } catch (NumberFormatException ex) { + Log.e(ex); + } + } + } + return (found ? 1 : 0); + } static String collapsePrefixes(Context context, String language, String subject, boolean forward) { List> prefixes = new ArrayList<>(); for (String re : Helper.getStrings(context, language, R.string.title_subject_reply, "")) - prefixes.add(new Pair<>(re.trim().toLowerCase(), false)); + prefixes.add(new Pair<>(re, false)); for (String re : Helper.getStrings(context, language, R.string.title_subject_reply_alt, "")) - prefixes.add(new Pair<>(re.trim().toLowerCase(), false)); + prefixes.add(new Pair<>(re, false)); for (String fwd : Helper.getStrings(context, language, R.string.title_subject_forward, "")) - prefixes.add(new Pair<>(fwd.trim().toLowerCase(), true)); + prefixes.add(new Pair<>(fwd, true)); for (String fwd : Helper.getStrings(context, language, R.string.title_subject_forward_alt, "")) - prefixes.add(new Pair<>(fwd.trim().toLowerCase(), true)); + prefixes.add(new Pair<>(fwd, true)); List scanned = new ArrayList<>(); subject = subject.trim(); while (true) { boolean found = false; for (Pair prefix : prefixes) { - String pre = prefix.first.endsWith(":") - ? "(^" + Pattern.quote(prefix.first.substring(0, prefix.first.length() - 1)) + SUBJECT_COUNT + ":)" - : "(^" + Pattern.quote(prefix.first) + ")"; - Pattern p = Pattern.compile(pre + "(\\s*)(.*)", Pattern.CASE_INSENSITIVE); - Matcher m = p.matcher(subject); + Matcher m = getPattern(prefix.first.trim()).matcher(subject); if (m.matches()) { found = true; int count = scanned.size(); @@ -364,6 +380,13 @@ public class EntityMessage implements Serializable { return result.toString(); } + private static Pattern getPattern(String prefix) { + String pre = prefix.endsWith(":") + ? "(^" + Pattern.quote(prefix.substring(0, prefix.length() - 1)) + ")" + "((\\[\\d+\\])|(\\(\\d+\\)))?" + ":" + : "(^" + Pattern.quote(prefix) + ")"; + return Pattern.compile(pre + "(\\s*)(.*)", Pattern.CASE_INSENSITIVE); + } + Element getReplyHeader(Context context, Document document, boolean separate, boolean extended) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); boolean language_detection = prefs.getBoolean("language_detection", false); diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index 852ea60387..8e729849ee 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -274,6 +274,7 @@ public class FragmentCompose extends FragmentBase { private AdapterAttachment adapter; private boolean prefix_once = false; + private boolean prefix_count = false; private boolean alt_re = false; private boolean alt_fwd = false; private boolean monospaced = false; @@ -335,6 +336,7 @@ public class FragmentCompose extends FragmentBase { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); prefix_once = prefs.getBoolean("prefix_once", true); + prefix_count = prefs.getBoolean("prefix_count", false); alt_re = prefs.getBoolean("alt_re", false); alt_fwd = prefs.getBoolean("alt_fwd", false); monospaced = prefs.getBoolean("monospaced", false); @@ -4578,12 +4580,24 @@ public class FragmentCompose extends FragmentBase { // Subject String subject = (ref.subject == null ? "" : ref.subject); if ("reply".equals(action) || "reply_all".equals(action)) { - if (prefix_once) + int replies = 0; + if (prefix_once) { + if (prefix_count) + replies = EntityMessage.getReplies(context, ref.language, subject); subject = EntityMessage.collapsePrefixes(context, ref.language, subject, false); - data.draft.subject = Helper.getString(context, + } + String re = Helper.getString(context, + ref.language, + alt_re ? R.string.title_subject_reply_alt : R.string.title_subject_reply, + "").trim(); + String s = Helper.getString(context, ref.language, alt_re ? R.string.title_subject_reply_alt : R.string.title_subject_reply, subject); + if (replies > 0 && re.endsWith(":") && s.startsWith(re)) + s = re.substring(0, re.length() - 1) + "[" + (replies + 1) + "]:" + + s.substring(re.length()); + data.draft.subject = s; if (external_text != null) { Element div = document.createElement("div"); diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsSend.java b/app/src/main/java/eu/faircode/email/FragmentOptionsSend.java index d02ddba485..93509a6cdf 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsSend.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsSend.java @@ -59,6 +59,7 @@ public class FragmentOptionsSend extends FragmentBase implements SharedPreferenc private SwitchCompat swSuggestFrequently; private Button btnLocalContacts; private SwitchCompat swPrefixOnce; + private SwitchCompat swPrefixCount; private RadioGroup rgRe; private RadioGroup rgFwd; private SwitchCompat swSendReminders; @@ -97,7 +98,7 @@ public class FragmentOptionsSend extends FragmentBase implements SharedPreferenc "alt_re", "alt_fwd", "send_reminders", "send_delayed", "attach_new", "reply_all", "send_pending", - "compose_font", "prefix_once", "separate_reply", "extended_reply", "write_below", "quote_reply", "quote_limit", "resize_reply", + "compose_font", "prefix_once", "prefix_count", "separate_reply", "extended_reply", "write_below", "quote_reply", "quote_limit", "resize_reply", "signature_location", "signature_new", "signature_reply", "signature_forward", "discard_delete", "reply_move", "auto_link", "plain_only", "format_flowed", "usenet_signature", "remove_signatures", @@ -122,6 +123,7 @@ public class FragmentOptionsSend extends FragmentBase implements SharedPreferenc swSuggestFrequently = view.findViewById(R.id.swSuggestFrequently); btnLocalContacts = view.findViewById(R.id.btnLocalContacts); swPrefixOnce = view.findViewById(R.id.swPrefixOnce); + swPrefixCount = view.findViewById(R.id.swPrefixCount); rgRe = view.findViewById(R.id.rgRe); rgFwd = view.findViewById(R.id.rgFwd); swSendReminders = view.findViewById(R.id.swSendReminders); @@ -231,6 +233,14 @@ public class FragmentOptionsSend extends FragmentBase implements SharedPreferenc @Override public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { prefs.edit().putBoolean("prefix_once", checked).apply(); + swPrefixOnce.setEnabled(checked); + } + }); + + swPrefixCount.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { + prefs.edit().putBoolean("prefix_count", checked).apply(); } }); @@ -534,6 +544,8 @@ public class FragmentOptionsSend extends FragmentBase implements SharedPreferenc swSuggestFrequently.setEnabled(swSuggestSent.isChecked() || swSuggestReceived.isChecked()); swPrefixOnce.setChecked(prefs.getBoolean("prefix_once", true)); + swPrefixCount.setChecked(prefs.getBoolean("prefix_count", false)); + swPrefixCount.setEnabled(swPrefixOnce.isChecked()); rgRe.check(prefs.getBoolean("alt_re", false) ? R.id.rbRe2 : R.id.rbRe1); rgFwd.check(prefs.getBoolean("alt_fwd", false) ? R.id.rbFwd2 : R.id.rbFwd1); diff --git a/app/src/main/res/layout/fragment_options_send.xml b/app/src/main/res/layout/fragment_options_send.xml index ea540fa063..fb912755e5 100644 --- a/app/src/main/res/layout/fragment_options_send.xml +++ b/app/src/main/res/layout/fragment_options_send.xml @@ -195,6 +195,18 @@ app:layout_constraintTop_toBottomOf="@id/btnLocalContacts" app:switchPadding="12dp" /> + + + app:layout_constraintTop_toBottomOf="@id/swPrefixCount" /> Default font Prefix subject only once on replying or forwarding + Add count to reply prefix Insert a horizontal line before a reply/forward header Use extended reply/forward header Write above the sender\'s text