mirror of
https://github.com/M66B/FairEmail.git
synced 2026-04-16 22:13:34 +02:00
Improved address handling
This commit is contained in:
@@ -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(),
|
||||
|
||||
Reference in New Issue
Block a user