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:
parent
9f49191734
commit
d1624fa800
3 changed files with 54 additions and 13 deletions
|
@ -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);
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue