Refactoring

This commit is contained in:
M66B 2021-12-24 14:00:12 +01:00
parent 69c8a2a356
commit 68bdc75c2b
4 changed files with 54 additions and 101 deletions

View File

@ -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<String> 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();
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);
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++;
if (!prefix_once)
return Helper.getString(context, language, resid, subject);
break;
}
}
if (!found)
break;
}
return count;
}
static String collapsePrefixes(Context context, String language, String subject, boolean forward) {
List<Pair<String, Boolean>> 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<Boolean> scanned = new ArrayList<>();
subject = subject.trim();
String subj = subject.trim();
while (true) {
boolean found = false;
for (Pair<String, Boolean> 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) {

View File

@ -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());

View File

@ -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)) {

View File

@ -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;