1
0
Fork 0
mirror of https://github.com/M66B/FairEmail.git synced 2025-02-24 07:01:05 +00:00

Cache contact info a short while

This commit is contained in:
M66B 2019-01-25 13:13:58 +00:00
parent 9f49191734
commit d1624fa800
3 changed files with 54 additions and 13 deletions

View file

@ -495,7 +495,12 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
ivAvatar.setTag(message.id); ivAvatar.setTag(message.id);
ivAvatar.setVisibility(View.INVISIBLE); ivAvatar.setVisibility(View.INVISIBLE);
tvFrom.setTag(message.id); tvFrom.setTag(message.id);
Address[] addresses = (Address[]) args.getSerializable("addresses"); Address[] addresses = (Address[]) args.getSerializable("addresses");
ContactInfo info = ContactInfo.get(context, addresses, true);
if (info != null && info.hasDisplayName())
setFrom(info, addresses);
else
tvFrom.setText(MessageHelper.formatAddresses(addresses, !compact, false)); tvFrom.setText(MessageHelper.formatAddresses(addresses, !compact, false));
} }
@ -503,7 +508,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
protected ContactInfo onExecute(Context context, Bundle args) { protected ContactInfo onExecute(Context context, Bundle args) {
Address[] addresses = (Address[]) args.getSerializable("addresses"); Address[] addresses = (Address[]) args.getSerializable("addresses");
ContactInfo info = ContactInfo.get(context, addresses); ContactInfo info = ContactInfo.get(context, addresses, false);
if ((info == null || !info.hasPhoto()) && if ((info == null || !info.hasPhoto()) &&
identicons && addresses != null && addresses.length > 0) { identicons && addresses != null && addresses.length > 0) {
@ -530,13 +535,9 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
} }
if ((long) tvFrom.getTag() == id) { if ((long) tvFrom.getTag() == id) {
if (info != null && info.hasDisplayName()) if (info != null && info.hasDisplayName()) {
try {
Address[] addresses = (Address[]) args.getSerializable("addresses"); Address[] addresses = (Address[]) args.getSerializable("addresses");
((InternetAddress) addresses[0]).setPersonal(info.getDisplayName()); setFrom(info, addresses);
tvFrom.setText(MessageHelper.formatAddresses(addresses, !compact, false));
} catch (UnsupportedEncodingException ex) {
Log.w(ex);
} }
} }
} }
@ -545,6 +546,16 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
protected void onException(Bundle args, Throwable ex) { protected void onException(Bundle args, Throwable ex) {
Helper.unexpectedError(context, owner, ex); Helper.unexpectedError(context, owner, ex);
} }
private void setFrom(ContactInfo info, Address[] addresses) {
try {
((InternetAddress) addresses[0]).setPersonal(info.getDisplayName());
tvFrom.setText(MessageHelper.formatAddresses(addresses, !compact, false));
} catch (UnsupportedEncodingException ex) {
Log.w(ex);
}
}
}.execute(context, owner, aargs, "message:avatar"); }.execute(context, owner, aargs, "message:avatar");
} else { } else {
ivAvatar.setVisibility(View.GONE); ivAvatar.setVisibility(View.GONE);

View file

@ -12,6 +12,9 @@ import android.net.Uri;
import android.provider.ContactsContract; import android.provider.ContactsContract;
import java.io.InputStream; import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.mail.Address; import javax.mail.Address;
import javax.mail.internet.InternetAddress; import javax.mail.internet.InternetAddress;
@ -23,6 +26,11 @@ public class ContactInfo {
private Drawable photo; private Drawable photo;
private String displayName; private String displayName;
private Uri lookupUri; private Uri lookupUri;
private long time;
private static Map<String, ContactInfo> emailContactInfo = new HashMap<>();
private static final long CACHE_DURATION = 60 * 1000L;
ContactInfo() { ContactInfo() {
} }
@ -70,7 +78,11 @@ public class ContactInfo {
return (lookupUri != null); return (lookupUri != null);
} }
static ContactInfo get(Context context, Address[] addresses) { private boolean isExpired() {
return (new Date().getTime() - time > CACHE_DURATION);
}
static ContactInfo get(Context context, Address[] addresses, boolean cached) {
if (addresses == null || addresses.length == 0) if (addresses == null || addresses.length == 0)
return null; return null;
@ -78,6 +90,16 @@ public class ContactInfo {
!= PackageManager.PERMISSION_GRANTED) != PackageManager.PERMISSION_GRANTED)
return null; return null;
String email = ((InternetAddress) addresses[0]).getAddress();
synchronized (emailContactInfo) {
ContactInfo info = emailContactInfo.get(email);
if (info != null && !info.isExpired())
return info;
}
if (cached)
return null;
try { try {
Cursor cursor = null; Cursor cursor = null;
try { try {
@ -90,7 +112,7 @@ public class ContactInfo {
}, },
ContactsContract.CommonDataKinds.Email.ADDRESS + " = ?", ContactsContract.CommonDataKinds.Email.ADDRESS + " = ?",
new String[]{ new String[]{
((InternetAddress) addresses[0]).getAddress() email
}, null); }, null);
if (cursor != null && cursor.moveToNext()) { if (cursor != null && cursor.moveToNext()) {
@ -106,6 +128,12 @@ public class ContactInfo {
info.is = ContactsContract.Contacts.openContactPhotoInputStream(resolver, lookupUri); info.is = ContactsContract.Contacts.openContactPhotoInputStream(resolver, lookupUri);
info.displayName = cursor.getString(colDisplayName); info.displayName = cursor.getString(colDisplayName);
info.lookupUri = lookupUri; info.lookupUri = lookupUri;
info.time = new Date().getTime();
synchronized (emailContactInfo) {
emailContactInfo.put(email, info);
}
return info; return info;
} }
} finally { } finally {

View file

@ -489,7 +489,9 @@ public class ServiceSynchronize extends LifecycleService {
// Get contact info // Get contact info
Map<TupleMessageEx, ContactInfo> messageContact = new HashMap<>(); Map<TupleMessageEx, ContactInfo> messageContact = new HashMap<>();
for (TupleMessageEx message : messages) { for (TupleMessageEx message : messages) {
ContactInfo info = ContactInfo.get(this, message.from); ContactInfo info = ContactInfo.get(this, message.from, true);
if (info == null)
info = ContactInfo.get(this, message.from, false);
if (info == null) if (info == null)
info = new ContactInfo(MessageHelper.formatAddressesShort(message.from)); info = new ContactInfo(MessageHelper.formatAddressesShort(message.from));
messageContact.put(message, info); messageContact.put(message, info);