Improved address handling

pull/147/head
M66B 7 years ago
parent d9528a3ca4
commit aadbeec1d9

@ -480,7 +480,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
ivFlagged.setImageTintList(ColorStateList.valueOf(flagged > 0 ? colorAccent : textColorSecondary)); ivFlagged.setImageTintList(ColorStateList.valueOf(flagged > 0 ? colorAccent : textColorSecondary));
ivFlagged.setVisibility(message.uid == null ? View.INVISIBLE : View.VISIBLE); ivFlagged.setVisibility(message.uid == null ? View.INVISIBLE : View.VISIBLE);
tvFrom.setText(MessageHelper.getFormattedAddresses(outgoing ? message.to : message.from, false)); tvFrom.setText(MessageHelper.formatAddressesShort(outgoing ? message.to : message.from));
tvSize.setText(message.size == null ? null : Helper.humanReadableByteCount(message.size, true)); tvSize.setText(message.size == null ? null : Helper.humanReadableByteCount(message.size, true));
tvSize.setVisibility(message.size == null || message.content ? View.GONE : View.VISIBLE); tvSize.setVisibility(message.size == null || message.content ? View.GONE : View.VISIBLE);
tvTime.setText(DateUtils.getRelativeTimeSpanString(context, message.received)); tvTime.setText(DateUtils.getRelativeTimeSpanString(context, message.received));
@ -585,11 +585,11 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
if (show_expanded) { if (show_expanded) {
ivExpanderAddress.setImageResource(show_addresses ? R.drawable.baseline_expand_less_24 : R.drawable.baseline_expand_more_24); ivExpanderAddress.setImageResource(show_addresses ? R.drawable.baseline_expand_less_24 : R.drawable.baseline_expand_more_24);
tvFromEx.setText(MessageHelper.getFormattedAddresses(message.from, true)); tvFromEx.setText(MessageHelper.formatAddresses(message.from));
tvTo.setText(MessageHelper.getFormattedAddresses(message.to, true)); tvTo.setText(MessageHelper.formatAddresses(message.to));
tvReplyTo.setText(MessageHelper.getFormattedAddresses(message.reply, true)); tvReplyTo.setText(MessageHelper.formatAddresses(message.reply));
tvCc.setText(MessageHelper.getFormattedAddresses(message.cc, true)); tvCc.setText(MessageHelper.formatAddresses(message.cc));
tvBcc.setText(MessageHelper.getFormattedAddresses(message.bcc, true)); tvBcc.setText(MessageHelper.formatAddresses(message.bcc));
tvTimeEx.setText(df.format(message.received)); tvTimeEx.setText(df.format(message.received));
@ -998,7 +998,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
lbm.sendBroadcast( lbm.sendBroadcast(
new Intent(ActivityView.ACTION_VIEW_FULL) new Intent(ActivityView.ACTION_VIEW_FULL)
.putExtra("id", message.id) .putExtra("id", message.id)
.putExtra("from", MessageHelper.getFormattedAddresses(message.from, true))); .putExtra("from", MessageHelper.formatAddresses(message.from)));
} }
private void onShowQuotes(final TupleMessageEx message) { private void onShowQuotes(final TupleMessageEx message) {

@ -437,7 +437,7 @@ public class FragmentCompose extends FragmentBase {
if (name == null) if (name == null)
sb.append(email); sb.append(email);
else { else {
sb.append(name.replace(",", "")).append(" "); sb.append("\"").append(name).append("\" ");
sb.append("<").append(email).append(">"); sb.append("<").append(email).append(">");
} }
return sb.toString(); return sb.toString();
@ -812,8 +812,7 @@ public class FragmentCompose extends FragmentBase {
final TextView tvMessage = dview.findViewById(R.id.tvMessage); final TextView tvMessage = dview.findViewById(R.id.tvMessage);
final CheckBox cbNotAgain = dview.findViewById(R.id.cbNotAgain); final CheckBox cbNotAgain = dview.findViewById(R.id.cbNotAgain);
tvMessage.setText(getString(R.string.title_ask_send, tvMessage.setText(getString(R.string.title_ask_send, MessageHelper.formatAddressesShort(ato)));
MessageHelper.getFormattedAddresses(ato, false)));
new DialogBuilderLifecycle(getContext(), getViewLifecycleOwner()) new DialogBuilderLifecycle(getContext(), getViewLifecycleOwner())
.setView(dview) .setView(dview)
@ -1083,9 +1082,8 @@ public class FragmentCompose extends FragmentBase {
else if (requestCode == ActivityCompose.REQUEST_CONTACT_BCC) else if (requestCode == ActivityCompose.REQUEST_CONTACT_BCC)
text = etBcc.getText().toString(); text = etBcc.getText().toString();
InternetAddress address = new InternetAddress(email, name);
StringBuilder sb = new StringBuilder(text); StringBuilder sb = new StringBuilder(text);
sb.append(address.toString().replace(",", "")).append(", "); sb.append("\"").append(name).append("\" <").append(email).append(">, ");
if (requestCode == ActivityCompose.REQUEST_CONTACT_TO) if (requestCode == ActivityCompose.REQUEST_CONTACT_TO)
etTo.setText(sb.toString()); etTo.setText(sb.toString());
@ -1417,7 +1415,7 @@ public class FragmentCompose extends FragmentBase {
if (ref.from != null && ref.from.length > 0) { if (ref.from != null && ref.from.length > 0) {
String from = Helper.canonicalAddress(((InternetAddress) ref.from[0]).getAddress()); String from = Helper.canonicalAddress(((InternetAddress) ref.from[0]).getAddress());
Log.i("From=" + from + " to=" + MessageHelper.getFormattedAddresses(ref.to, false)); Log.i("From=" + from + " to=" + MessageHelper.formatAddressesShort(ref.to));
for (EntityIdentity identity : identities) { for (EntityIdentity identity : identities) {
String email = Helper.canonicalAddress(identity.email); String email = Helper.canonicalAddress(identity.email);
if (from.equals(email)) { if (from.equals(email)) {
@ -1632,9 +1630,9 @@ public class FragmentCompose extends FragmentBase {
Log.i("Loaded draft id=" + result.draft.id + " action=" + action); Log.i("Loaded draft id=" + result.draft.id + " action=" + action);
etExtra.setText(result.draft.extra); etExtra.setText(result.draft.extra);
etTo.setText(MessageHelper.getFormattedAddresses(result.draft.to, true)); etTo.setText(MessageHelper.formatAddressesCompose(result.draft.to));
etCc.setText(MessageHelper.getFormattedAddresses(result.draft.cc, true)); etCc.setText(MessageHelper.formatAddressesCompose(result.draft.cc));
etBcc.setText(MessageHelper.getFormattedAddresses(result.draft.bcc, true)); etBcc.setText(MessageHelper.formatAddressesCompose(result.draft.bcc));
etSubject.setText(result.draft.subject); etSubject.setText(result.draft.subject);
long reference = args.getLong("reference", -1); long reference = args.getLong("reference", -1);
@ -1835,22 +1833,13 @@ public class FragmentCompose extends FragmentBase {
InternetAddress abcc[] = null; InternetAddress abcc[] = null;
if (!TextUtils.isEmpty(to)) if (!TextUtils.isEmpty(to))
try { ato = InternetAddress.parse(to);
ato = InternetAddress.parse(to);
} catch (AddressException ignored) {
}
if (!TextUtils.isEmpty(cc)) if (!TextUtils.isEmpty(cc))
try { acc = InternetAddress.parse(cc);
acc = InternetAddress.parse(cc);
} catch (AddressException ignored) {
}
if (!TextUtils.isEmpty(bcc)) if (!TextUtils.isEmpty(bcc))
try { abcc = InternetAddress.parse(bcc);
abcc = InternetAddress.parse(bcc);
} catch (AddressException ignored) {
}
if (TextUtils.isEmpty(extra)) if (TextUtils.isEmpty(extra))
extra = null; extra = null;
@ -1979,9 +1968,9 @@ public class FragmentCompose extends FragmentBase {
int action = args.getInt("action"); int action = args.getInt("action");
Log.i("Loaded action id=" + (draft == null ? null : draft.id) + " action=" + action); Log.i("Loaded action id=" + (draft == null ? null : draft.id) + " action=" + action);
etTo.setText(MessageHelper.getFormattedAddresses(draft.to, true)); etTo.setText(MessageHelper.formatAddressesCompose(draft.to));
etCc.setText(MessageHelper.getFormattedAddresses(draft.cc, true)); etCc.setText(MessageHelper.formatAddressesCompose(draft.cc));
etBcc.setText(MessageHelper.getFormattedAddresses(draft.bcc, true)); etBcc.setText(MessageHelper.formatAddressesCompose(draft.bcc));
if (action == R.id.action_delete) { if (action == R.id.action_delete) {
autosave = false; autosave = false;
@ -2003,7 +1992,7 @@ public class FragmentCompose extends FragmentBase {
protected void onException(Bundle args, Throwable ex) { protected void onException(Bundle args, Throwable ex) {
if (ex instanceof MessageRemovedException) if (ex instanceof MessageRemovedException)
finish(); finish();
else if (ex instanceof IllegalArgumentException) else if (ex instanceof IllegalArgumentException || ex instanceof AddressException)
Snackbar.make(view, ex.getMessage(), Snackbar.LENGTH_LONG).show(); Snackbar.make(view, ex.getMessage(), Snackbar.LENGTH_LONG).show();
else else
Helper.unexpectedError(getContext(), getViewLifecycleOwner(), ex); Helper.unexpectedError(getContext(), getViewLifecycleOwner(), ex);

@ -253,7 +253,7 @@ public class HtmlHelper {
String html = EntityMessage.read(context, id); String html = EntityMessage.read(context, id);
return String.format("<p>%s %s:</p>\n<blockquote>%s</blockquote>", return String.format("<p>%s %s:</p>\n<blockquote>%s</blockquote>",
Html.escapeHtml(new Date(message.received).toString()), Html.escapeHtml(new Date(message.received).toString()),
Html.escapeHtml(MessageHelper.getFormattedAddresses(message.from, true)), Html.escapeHtml(MessageHelper.formatAddresses(message.from)),
sanitize ? sanitize(html, true) : getBody(html)); sanitize ? sanitize(html, true) : getBody(html));
} }

@ -499,7 +499,22 @@ public class MessageHelper {
return (size < 0 ? null : size); return (size < 0 ? null : size);
} }
static String getFormattedAddresses(Address[] addresses, boolean full) { static String formatAddresses(Address[] addresses) {
return formatAddresses(addresses, true, false);
}
static String formatAddressesShort(Address[] addresses) {
return formatAddresses(addresses, false, false);
}
static String formatAddressesCompose(Address[] addresses) {
String result = formatAddresses(addresses, true, true);
if (!TextUtils.isEmpty(result))
result += ", ";
return result;
}
private static String formatAddresses(Address[] addresses, boolean full, boolean compose) {
if (addresses == null || addresses.length == 0) if (addresses == null || addresses.length == 0)
return ""; return "";
@ -511,7 +526,17 @@ public class MessageHelper {
if (TextUtils.isEmpty(personal)) if (TextUtils.isEmpty(personal))
formatted.add(address.toString()); formatted.add(address.toString());
else { else {
personal = personal.replaceAll("[\\,\\<\\>]", ""); if (compose) {
boolean quote = false;
for (int i = 0; i < personal.length(); i++)
if ("()<>,;:\\\"[]@".indexOf(personal.charAt(i)) >= 0) {
quote = true;
break;
}
if (quote)
personal = "\"" + personal + "\"";
}
if (full) if (full)
formatted.add(personal + " <" + a.getAddress() + ">"); formatted.add(personal + " <" + a.getAddress() + ">");
else else

@ -569,7 +569,7 @@ public class ServiceSynchronize extends LifecycleService {
DateFormat df = SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.SHORT, SimpleDateFormat.SHORT); DateFormat df = SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.SHORT, SimpleDateFormat.SHORT);
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (EntityMessage message : messages) { for (EntityMessage message : messages) {
sb.append("<strong>").append(MessageHelper.getFormattedAddresses(message.from, false)).append("</strong>"); sb.append("<strong>").append(MessageHelper.formatAddressesShort(message.from)).append("</strong>");
if (!TextUtils.isEmpty(message.subject)) if (!TextUtils.isEmpty(message.subject))
sb.append(": ").append(message.subject); sb.append(": ").append(message.subject);
sb.append(" ").append(df.format(message.received)); sb.append(" ").append(df.format(message.received));
@ -640,7 +640,7 @@ public class ServiceSynchronize extends LifecycleService {
mbuilder mbuilder
.addExtras(args) .addExtras(args)
.setSmallIcon(R.drawable.baseline_email_white_24) .setSmallIcon(R.drawable.baseline_email_white_24)
.setContentTitle(MessageHelper.getFormattedAddresses(message.from, true)) .setContentTitle(MessageHelper.formatAddresses(message.from))
.setSubText(message.accountName + " · " + folderName) .setSubText(message.accountName + " · " + folderName)
.setContentIntent(piContent) .setContentIntent(piContent)
.setWhen(message.received) .setWhen(message.received)
@ -1882,13 +1882,13 @@ public class ServiceSynchronize extends LifecycleService {
sb.append(sfe.getMessage()); sb.append(sfe.getMessage());
sb.append(' ').append(getString(R.string.title_address_sent)); sb.append(' ').append(getString(R.string.title_address_sent));
sb.append(' ').append(MessageHelper.getFormattedAddresses(sfe.getValidSentAddresses(), true)); sb.append(' ').append(MessageHelper.formatAddresses(sfe.getValidSentAddresses()));
sb.append(' ').append(getString(R.string.title_address_unsent)); sb.append(' ').append(getString(R.string.title_address_unsent));
sb.append(' ').append(MessageHelper.getFormattedAddresses(sfe.getValidUnsentAddresses(), true)); sb.append(' ').append(MessageHelper.formatAddresses(sfe.getValidUnsentAddresses()));
sb.append(' ').append(getString(R.string.title_address_invalid)); sb.append(' ').append(getString(R.string.title_address_invalid));
sb.append(' ').append(MessageHelper.getFormattedAddresses(sfe.getInvalidAddresses(), true)); sb.append(' ').append(MessageHelper.formatAddresses(sfe.getInvalidAddresses()));
ex = new SendFailedException( ex = new SendFailedException(
sb.toString(), sb.toString(),

Loading…
Cancel
Save