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.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.setVisibility(message.size == null || message.content ? View.GONE : View.VISIBLE);
tvTime.setText(DateUtils.getRelativeTimeSpanString(context, message.received));
@ -585,11 +585,11 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
if (show_expanded) {
ivExpanderAddress.setImageResource(show_addresses ? R.drawable.baseline_expand_less_24 : R.drawable.baseline_expand_more_24);
tvFromEx.setText(MessageHelper.getFormattedAddresses(message.from, true));
tvTo.setText(MessageHelper.getFormattedAddresses(message.to, true));
tvReplyTo.setText(MessageHelper.getFormattedAddresses(message.reply, true));
tvCc.setText(MessageHelper.getFormattedAddresses(message.cc, true));
tvBcc.setText(MessageHelper.getFormattedAddresses(message.bcc, true));
tvFromEx.setText(MessageHelper.formatAddresses(message.from));
tvTo.setText(MessageHelper.formatAddresses(message.to));
tvReplyTo.setText(MessageHelper.formatAddresses(message.reply));
tvCc.setText(MessageHelper.formatAddresses(message.cc));
tvBcc.setText(MessageHelper.formatAddresses(message.bcc));
tvTimeEx.setText(df.format(message.received));
@ -998,7 +998,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
lbm.sendBroadcast(
new Intent(ActivityView.ACTION_VIEW_FULL)
.putExtra("id", message.id)
.putExtra("from", MessageHelper.getFormattedAddresses(message.from, true)));
.putExtra("from", MessageHelper.formatAddresses(message.from)));
}
private void onShowQuotes(final TupleMessageEx message) {

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

@ -253,7 +253,7 @@ public class HtmlHelper {
String html = EntityMessage.read(context, id);
return String.format("<p>%s %s:</p>\n<blockquote>%s</blockquote>",
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));
}

@ -499,7 +499,22 @@ public class MessageHelper {
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)
return "";
@ -511,7 +526,17 @@ public class MessageHelper {
if (TextUtils.isEmpty(personal))
formatted.add(address.toString());
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)
formatted.add(personal + " <" + a.getAddress() + ">");
else

@ -569,7 +569,7 @@ public class ServiceSynchronize extends LifecycleService {
DateFormat df = SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.SHORT, SimpleDateFormat.SHORT);
StringBuilder sb = new StringBuilder();
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))
sb.append(": ").append(message.subject);
sb.append(" ").append(df.format(message.received));
@ -640,7 +640,7 @@ public class ServiceSynchronize extends LifecycleService {
mbuilder
.addExtras(args)
.setSmallIcon(R.drawable.baseline_email_white_24)
.setContentTitle(MessageHelper.getFormattedAddresses(message.from, true))
.setContentTitle(MessageHelper.formatAddresses(message.from))
.setSubText(message.accountName + " · " + folderName)
.setContentIntent(piContent)
.setWhen(message.received)
@ -1882,13 +1882,13 @@ public class ServiceSynchronize extends LifecycleService {
sb.append(sfe.getMessage());
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(MessageHelper.getFormattedAddresses(sfe.getValidUnsentAddresses(), true));
sb.append(' ').append(MessageHelper.formatAddresses(sfe.getValidUnsentAddresses()));
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(
sb.toString(),

Loading…
Cancel
Save