diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index 31749221c9..ead6be065e 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -827,8 +827,8 @@ public class AdapterMessage extends RecyclerView.Adapter 0) - tvFrom.setText(context.getString(R.string.title_from_to, - MessageHelper.formatAddresses(_senders == null ? senders : _senders, name_email, false), - MessageHelper.formatAddresses(_recipients == null ? recipients : _recipients, name_email, false))); - else - tvFrom.setText(MessageHelper.formatAddresses(_senders, name_email, false)); - if (distinguish_contacts) { boolean known = false; if (senders != null) @@ -1347,40 +1337,6 @@ public class AdapterMessage extends RecyclerView.Adapter map) { - if (addresses == null) - return null; - - boolean updated = false; - List
modified = new ArrayList<>(); - for (Address a : addresses) { - String email = ((InternetAddress) a).getAddress(); - if (TextUtils.isEmpty(email) || !map.containsKey(email)) - modified.add(a); - else { - String displayName = map.get(email).getDisplayName(); - if (TextUtils.isEmpty(displayName)) - modified.add(a); - else { - String personal = ((InternetAddress) a).getPersonal(); - if (TextUtils.isEmpty(personal) || - (prefer_contact && !personal.equals(displayName))) - try { - modified.add(new InternetAddress(email, displayName, StandardCharsets.UTF_8.name())); - updated = true; - } catch (UnsupportedEncodingException ex) { - Log.w(ex); - modified.add(a); - } - else - modified.add(a); - } - } - } - - return (updated ? modified.toArray(new Address[0]) : null); - } - private void bindExpandWarning(TupleMessageEx message, boolean expanded) { if (viewType != ViewType.THREAD || expanded || message.content || message.uid == null || unmetered) tvExpand.setVisibility(View.GONE); diff --git a/app/src/main/java/eu/faircode/email/ContactInfo.java b/app/src/main/java/eu/faircode/email/ContactInfo.java index b1052528b4..e3925677b5 100644 --- a/app/src/main/java/eu/faircode/email/ContactInfo.java +++ b/app/src/main/java/eu/faircode/email/ContactInfo.java @@ -31,14 +31,17 @@ import android.net.Uri; import android.os.Handler; import android.os.Looper; import android.provider.ContactsContract; +import android.text.TextUtils; import androidx.annotation.NonNull; import androidx.preference.PreferenceManager; import java.io.IOException; import java.io.InputStream; +import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; +import java.nio.charset.StandardCharsets; import java.util.Date; import java.util.HashMap; import java.util.Locale; @@ -57,7 +60,7 @@ public class ContactInfo { private boolean known; private long time; - private static Map emailLookup = new ConcurrentHashMap<>(); + private static Map emailLookup = new ConcurrentHashMap<>(); private static final Map emailContactInfo = new HashMap<>(); private static final Map emailGravatar = new HashMap<>(); private static final ExecutorService executor = @@ -311,21 +314,47 @@ public class ContactInfo { } } - static Uri getLookupUri(Context context, Address[] addresses) { + static Uri getLookupUri(Address[] addresses) { if (addresses == null) return null; for (Address from : addresses) { String email = ((InternetAddress) from).getAddress(); if (emailLookup.containsKey(email)) - return emailLookup.get(email); + return emailLookup.get(email).uri; } return null; } - private static Map getEmailLookup(Context context) { - Map all = new ConcurrentHashMap<>(); + static Address[] fillIn(Address[] addresses, boolean prefer_contact) { + if (addresses == null) + return null; + + Address[] modified = new Address[addresses.length]; + for (int i = 0; i < addresses.length; i++) { + InternetAddress address = (InternetAddress) addresses[i]; + String email = address.getAddress(); + String personal = address.getPersonal(); + if (!TextUtils.isEmpty(email) && emailLookup.containsKey(email)) { + Lookup lookup = emailLookup.get(email); + if (TextUtils.isEmpty(personal) || + (prefer_contact && !personal.equals(lookup.displayName))) + personal = lookup.displayName; + } + try { + modified[i] = new InternetAddress(email, personal, StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException ex) { + Log.e(ex); + modified[i] = address; + } + } + + return modified; + } + + private static Map getEmailLookup(Context context) { + Map all = new ConcurrentHashMap<>(); if (Helper.hasPermission(context, Manifest.permission.READ_CONTACTS)) { Log.i("Reading email/uri"); @@ -335,7 +364,8 @@ public class ContactInfo { new String[]{ ContactsContract.CommonDataKinds.Photo.CONTACT_ID, ContactsContract.Contacts.LOOKUP_KEY, - ContactsContract.CommonDataKinds.Email.ADDRESS + ContactsContract.CommonDataKinds.Email.ADDRESS, + ContactsContract.Contacts.DISPLAY_NAME }, ContactsContract.CommonDataKinds.Email.ADDRESS + " <> ''", null, null)) { @@ -343,9 +373,12 @@ public class ContactInfo { long contactId = cursor.getLong(0); String lookupKey = cursor.getString(1); String email = cursor.getString(2); + String displayName = cursor.getString(3); - Uri uri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey); - all.put(email, uri); + Lookup lookup = new Lookup(); + lookup.uri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey); + lookup.displayName = displayName; + all.put(email, lookup); } } catch (Throwable ex) { Log.e(ex); @@ -356,6 +389,11 @@ public class ContactInfo { return all; } + private static class Lookup { + Uri uri; + String displayName; + } + private static class Avatar { private boolean available; private long time; diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java index 3f53aebeaf..048e254e0e 100644 --- a/app/src/main/java/eu/faircode/email/Core.java +++ b/app/src/main/java/eu/faircode/email/Core.java @@ -1619,7 +1619,7 @@ class Core { message.identity = (identity == null ? null : identity.id); message.sender = MessageHelper.getSortKey(message.from); - Uri lookupUri = ContactInfo.getLookupUri(context, message.from); + Uri lookupUri = ContactInfo.getLookupUri(message.from); message.avatar = (lookupUri == null ? null : lookupUri.toString()); // No MX check @@ -2251,7 +2251,7 @@ class Core { message.identity = (identity == null ? null : identity.id); message.sender = MessageHelper.getSortKey(message.from); - Uri lookupUri = ContactInfo.getLookupUri(context, message.from); + Uri lookupUri = ContactInfo.getLookupUri(message.from); message.avatar = (lookupUri == null ? null : lookupUri.toString()); boolean check_mx = prefs.getBoolean("check_mx", false); @@ -2479,7 +2479,7 @@ class Core { Log.i(folder.name + " updated id=" + message.id + " uid=" + message.uid + " browsed=" + browsed); } - Uri uri = ContactInfo.getLookupUri(context, message.from); + Uri uri = ContactInfo.getLookupUri(message.from); if (uri != null) { String avatar = uri.toString(); if (!Objects.equals(message.avatar, avatar)) { @@ -2656,7 +2656,7 @@ class Core { for (Address address : addresses) { final String email = ((InternetAddress) address).getAddress(); final String name = ((InternetAddress) address).getPersonal(); - final Uri avatar = ContactInfo.getLookupUri(context, new Address[]{address}); + final Uri avatar = ContactInfo.getLookupUri(new Address[]{address}); try { db.beginTransaction(); diff --git a/app/src/main/java/eu/faircode/email/EntityRule.java b/app/src/main/java/eu/faircode/email/EntityRule.java index 3b0c886247..fdc96f901b 100644 --- a/app/src/main/java/eu/faircode/email/EntityRule.java +++ b/app/src/main/java/eu/faircode/email/EntityRule.java @@ -414,7 +414,7 @@ public class EntityRule { reply.received = new Date().getTime(); reply.sender = MessageHelper.getSortKey(reply.from); - Uri lookupUri = ContactInfo.getLookupUri(context, reply.from); + Uri lookupUri = ContactInfo.getLookupUri(reply.from); reply.avatar = (lookupUri == null ? null : lookupUri.toString()); reply.id = db.message().insertMessage(reply); diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index 7c4ff12e60..1343e37c73 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -3450,7 +3450,7 @@ public class FragmentCompose extends FragmentBase { data.draft.from = new InternetAddress[]{new InternetAddress(selected.email, selected.name)}; data.draft.sender = MessageHelper.getSortKey(data.draft.from); - Uri lookupUri = ContactInfo.getLookupUri(context, data.draft.from); + Uri lookupUri = ContactInfo.getLookupUri(data.draft.from); data.draft.avatar = (lookupUri == null ? null : lookupUri.toString()); data.draft.received = new Date().getTime(); @@ -3935,7 +3935,7 @@ public class FragmentCompose extends FragmentBase { draft.subject = subject; draft.signature = signature; draft.sender = MessageHelper.getSortKey(draft.from); - Uri lookupUri = ContactInfo.getLookupUri(context, draft.from); + Uri lookupUri = ContactInfo.getLookupUri(draft.from); draft.avatar = (lookupUri == null ? null : lookupUri.toString()); db.message().updateMessage(draft); }