From 68bdc75c2b002e04f69b6440c3efc6c3e1467e5b Mon Sep 17 00:00:00 2001 From: M66B Date: Fri, 24 Dec 2021 14:00:12 +0100 Subject: [PATCH] Refactoring --- .../java/eu/faircode/email/EntityMessage.java | 85 +++++++++---------- .../java/eu/faircode/email/EntityRule.java | 25 ++---- .../eu/faircode/email/FragmentCompose.java | 37 +------- .../java/eu/faircode/email/ServiceUI.java | 8 +- 4 files changed, 54 insertions(+), 101 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/EntityMessage.java b/app/src/main/java/eu/faircode/email/EntityMessage.java index a53709f6da..2c5eb3639e 100644 --- a/app/src/main/java/eu/faircode/email/EntityMessage.java +++ b/app/src/main/java/eu/faircode/email/EntityMessage.java @@ -320,46 +320,22 @@ public class EntityMessage implements Serializable { return MessageHelper.equalDomain(context, reply, from); } - static int getReplies(Context context, String language, String subject) { - int count = 0; + static String getSubject(Context context, String language, String subject, boolean forward) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + boolean prefix_once = prefs.getBoolean("prefix_once", true); + boolean prefix_count = prefs.getBoolean("prefix_count", false); + boolean alt = prefs.getBoolean(forward ? "alt_fwd" : "alt_re", 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, ""))); + if (subject == null) + subject = ""; - subject = subject.trim(); - while (true) { - boolean found = false; - for (String re : res) { - Matcher m = getPattern(re.trim()).matcher(subject); - if (m.matches()) { - found = true; - subject = m.group(m.groupCount()).trim(); - - if (re.trim().endsWith(":")) - try { - String n = m.group(2); - if (n == null) - count++; - else - count += Integer.parseInt(n.substring(1, n.length() - 1)); - } catch (NumberFormatException ex) { - Log.e(ex); - count++; - } - else - count++; + int resid = forward + ? (alt ? R.string.title_subject_forward_alt : R.string.title_subject_forward) + : (alt ? R.string.title_subject_reply_alt : R.string.title_subject_reply); - break; - } - } - if (!found) - break; - } - return count; - } + if (!prefix_once) + return Helper.getString(context, language, resid, subject); - 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, false)); @@ -370,15 +346,33 @@ public class EntityMessage implements Serializable { for (String fwd : Helper.getStrings(context, language, R.string.title_subject_forward_alt, "")) prefixes.add(new Pair<>(fwd, true)); + int replies = 0; + boolean re = !forward; List scanned = new ArrayList<>(); - subject = subject.trim(); + String subj = subject.trim(); while (true) { boolean found = false; for (Pair prefix : prefixes) { - Matcher m = getPattern(prefix.first.trim()).matcher(subject); + Matcher m = getPattern(prefix.first.trim()).matcher(subj); if (m.matches()) { found = true; - subject = m.group(m.groupCount()).trim(); + subj = m.group(m.groupCount()).trim(); + + re = (re && !prefix.second); + if (re) + if (prefix.first.trim().endsWith(":")) + try { + String n = m.group(2); + if (n == null) + replies++; + else + replies += Integer.parseInt(n.substring(1, n.length() - 1)); + } catch (NumberFormatException ex) { + Log.e(ex); + replies++; + } + else + replies++; int count = scanned.size(); if (!prefix.second.equals(count == 0 ? forward : scanned.get(count - 1))) @@ -391,19 +385,24 @@ public class EntityMessage implements Serializable { break; } - StringBuilder result = new StringBuilder(); + String pre = Helper.getString(context, language, resid, ""); + int semi = pre.lastIndexOf(':'); + if (prefix_count && replies > 0 && semi > 0) + pre = pre.substring(0, semi) + "[" + (replies + 1) + "]" + pre.substring(semi); + + StringBuilder result = new StringBuilder(pre); for (int i = 0; i < scanned.size(); i++) result.append(context.getString(scanned.get(i) ? R.string.title_subject_forward : R.string.title_subject_reply, "")); - result.append(subject); + result.append(subj); return result.toString(); } private static Pattern getPattern(String prefix) { - String pre = prefix.endsWith(":") + String pat = prefix.endsWith(":") ? "(^" + Pattern.quote(prefix.substring(0, prefix.length() - 1)) + ")" + "((\\[\\d+\\])|(\\(\\d+\\)))?" + ":" : "(^" + Pattern.quote(prefix) + ")"; - return Pattern.compile(pre + "(\\s*)(.*)", Pattern.CASE_INSENSITIVE); + return Pattern.compile(pat + "(\\s*)(.*)", Pattern.CASE_INSENSITIVE); } Element getReplyHeader(Context context, Document document, boolean separate, boolean extended) { diff --git a/app/src/main/java/eu/faircode/email/EntityRule.java b/app/src/main/java/eu/faircode/email/EntityRule.java index f26ae822de..345a834534 100644 --- a/app/src/main/java/eu/faircode/email/EntityRule.java +++ b/app/src/main/java/eu/faircode/email/EntityRule.java @@ -650,14 +650,13 @@ public class EntityRule { boolean cc = jargs.optBoolean("cc"); boolean attachments = jargs.optBoolean("attachments"); + boolean isReply = TextUtils.isEmpty(to); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - boolean prefix_once = prefs.getBoolean("prefix_once", true); - boolean alt_re = prefs.getBoolean("alt_re", false); - boolean alt_fwd = prefs.getBoolean("alt_fwd", false); boolean separate_reply = prefs.getBoolean("separate_reply", false); boolean extended_reply = prefs.getBoolean("extended_reply", false); boolean quote_reply = prefs.getBoolean("quote_reply", true); - boolean quote = (quote_reply && TextUtils.isEmpty(to)); + boolean quote = (quote_reply && isReply); EntityIdentity identity = db.identity().getIdentity(iid); if (identity == null) @@ -665,7 +664,7 @@ public class EntityRule { EntityAnswer answer; if (aid < 0) { - if (TextUtils.isEmpty(to)) + if (isReply) throw new IllegalArgumentException("Rule template missing name=" + rule.name); answer = new EntityAnswer(); @@ -703,7 +702,7 @@ public class EntityRule { reply.identity = identity.id; reply.msgid = EntityMessage.generateMessageId(); - if (TextUtils.isEmpty(to)) { + if (isReply) { reply.references = (message.references == null ? "" : message.references + " ") + message.msgid; reply.inreplyto = message.msgid; reply.thread = message.thread; @@ -719,20 +718,10 @@ public class EntityRule { reply.cc = message.cc; reply.unsubscribe = "mailto:" + identity.email; reply.auto_submitted = true; - - String subject = (message.subject == null ? "" : message.subject); - if (prefix_once) - subject = EntityMessage.collapsePrefixes(context, message.language, subject, !TextUtils.isEmpty(to)); - - reply.subject = context.getString( - TextUtils.isEmpty(to) - ? (alt_re ? R.string.title_subject_reply_alt : R.string.title_subject_reply) - : (alt_fwd ? R.string.title_subject_forward_alt : R.string.title_subject_forward), - subject); - + reply.subject = EntityMessage.getSubject(context, message.language, message.subject, !isReply); reply.received = new Date().getTime(); - reply.sender = MessageHelper.getSortKey(reply.from); + Uri lookupUri = ContactInfo.getLookupUri(reply.from); reply.avatar = (lookupUri == null ? null : lookupUri.toString()); diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index 8e729849ee..c27e21f0d1 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -164,7 +164,6 @@ import org.jsoup.select.Elements; import org.jsoup.select.NodeFilter; import org.openintents.openpgp.OpenPgpError; import org.openintents.openpgp.util.OpenPgpApi; -import org.openintents.openpgp.util.OpenPgpServiceConnection; import org.w3c.dom.css.CSSStyleSheet; import java.io.BufferedOutputStream; @@ -273,10 +272,6 @@ public class FragmentCompose extends FragmentBase { private ContentResolver resolver; 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; private String compose_font; private Integer encrypt = null; @@ -335,10 +330,6 @@ public class FragmentCompose extends FragmentBase { super.onCreate(savedInstanceState); 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); compose_font = prefs.getString("compose_font", monospaced ? "monospace" : "sans-serif"); media = prefs.getBoolean("compose_media", true); @@ -4580,24 +4571,8 @@ public class FragmentCompose extends FragmentBase { // Subject String subject = (ref.subject == null ? "" : ref.subject); if ("reply".equals(action) || "reply_all".equals(action)) { - int replies = 0; - if (prefix_once) { - if (prefix_count) - replies = EntityMessage.getReplies(context, ref.language, subject); - subject = EntityMessage.collapsePrefixes(context, ref.language, subject, false); - } - 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; + data.draft.subject = + EntityMessage.getSubject(context, ref.language, subject, false); if (external_text != null) { Element div = document.createElement("div"); @@ -4610,12 +4585,8 @@ public class FragmentCompose extends FragmentBase { document.body().appendChild(div); } } else if ("forward".equals(action)) { - if (prefix_once) - subject = EntityMessage.collapsePrefixes(context, ref.language, subject, true); - data.draft.subject = Helper.getString(context, - ref.language, - alt_fwd ? R.string.title_subject_forward_alt : R.string.title_subject_forward, - subject); + data.draft.subject = + EntityMessage.getSubject(context, ref.language, subject, true); } else if ("resend".equals(action)) { data.draft.subject = ref.subject; } else if ("editasnew".equals(action)) { diff --git a/app/src/main/java/eu/faircode/email/ServiceUI.java b/app/src/main/java/eu/faircode/email/ServiceUI.java index 1a03cf066b..01a3371138 100644 --- a/app/src/main/java/eu/faircode/email/ServiceUI.java +++ b/app/src/main/java/eu/faircode/email/ServiceUI.java @@ -303,8 +303,6 @@ public class ServiceUI extends IntentService { private void onReplyDirect(long id, Intent intent) throws IOException { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - boolean prefix_once = prefs.getBoolean("prefix_once", true); - boolean alt_re = prefs.getBoolean("alt_re", false); boolean plain_only = prefs.getBoolean("plain_only", false); DB db = DB.getInstance(this); @@ -321,10 +319,6 @@ public class ServiceUI extends IntentService { if (outbox == null) throw new IllegalArgumentException("outbox not found"); - String subject = (ref.subject == null ? "" : ref.subject); - if (prefix_once) - subject = EntityMessage.collapsePrefixes(this, ref.language, subject, false); - Bundle results = RemoteInput.getResultsFromIntent(intent); String body = results.getString("text"); if (body != null) @@ -346,7 +340,7 @@ public class ServiceUI extends IntentService { reply.thread = ref.thread; reply.to = ref.from; reply.from = new Address[]{new InternetAddress(identity.email, identity.name, StandardCharsets.UTF_8.name())}; - reply.subject = getString(alt_re ? R.string.title_subject_reply_alt : R.string.title_subject_reply, subject); + reply.subject = EntityMessage.getSubject(this, ref.language, ref.subject, false); reply.received = new Date().getTime(); reply.seen = true; reply.ui_seen = true;