From 79da181f366f4a286808aa3a3d8e4ecc54f9dd43 Mon Sep 17 00:00:00 2001 From: M66B Date: Thu, 26 Sep 2019 12:51:39 +0200 Subject: [PATCH] Improved local contact handling --- .../eu/faircode/email/AdapterMessage.java | 5 +- app/src/main/java/eu/faircode/email/Core.java | 124 ++++++++++-------- .../java/eu/faircode/email/EntityMessage.java | 13 +- 3 files changed, 75 insertions(+), 67 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index 2e4d8b350b..d385d7e28e 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -1826,13 +1826,12 @@ public class AdapterMessage extends RecyclerView.Adapter 0) { + if (message.from != null && message.from.length > 0) { EntityIdentity identity = db.identity().getIdentity(message.identity); if (identity == null) return null; - for (Address sender : senders) + for (Address sender : message.from) if (identity.similarAddress(sender)) { outgoing = true; break; diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java index fe84c40755..51561aa969 100644 --- a/app/src/main/java/eu/faircode/email/Core.java +++ b/app/src/main/java/eu/faircode/email/Core.java @@ -1788,7 +1788,7 @@ class Core { } } - static EntityMessage _synchronizeMessage( + private static EntityMessage _synchronizeMessage( Context context, EntityAccount account, EntityFolder folder, long uid, MimeMessage imessage, @@ -2148,7 +2148,7 @@ class Core { } private static void updateContactInfo(Context context, final EntityFolder folder, final EntityMessage message) { - final DB db = DB.getInstance(context); + DB db = DB.getInstance(context); if (EntityFolder.DRAFTS.equals(folder.type) || EntityFolder.ARCHIVE.equals(folder.type) || @@ -2156,7 +2156,25 @@ class Core { EntityFolder.JUNK.equals(folder.type)) return; - final int type = (folder.isOutgoing() ? EntityContact.TYPE_TO : EntityContact.TYPE_FROM); + int type = (folder.isOutgoing() ? EntityContact.TYPE_TO : EntityContact.TYPE_FROM); + + // Check if from self + if (type == EntityContact.TYPE_FROM) { + if (message.from != null) { + List identities = db.identity().getSynchronizingIdentities(folder.account); + if (identities != null) { + for (Address sender : message.from) { + for (EntityIdentity identity : identities) + if (identity.similarAddress(sender)) { + type = EntityContact.TYPE_TO; + break; + } + if (type == EntityContact.TYPE_TO) + break; + } + } + } + } SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); boolean suggest_sent = prefs.getBoolean("suggest_sent", false); @@ -2167,61 +2185,55 @@ class Core { if (type == EntityContact.TYPE_FROM && !suggest_received) return; - Address[] recipients = (type == EntityContact.TYPE_TO - ? message.to - : (message.reply != null ? message.reply : message.from)); - - // Check if from self - if (type == EntityContact.TYPE_FROM && recipients != null && recipients.length > 0) { - boolean me = false; - List identities = db.identity().getSynchronizingIdentities(folder.account); - if (identities != null) - for (Address recipient : recipients) { - for (EntityIdentity identity : identities) - if (identity.similarAddress(recipient)) { - me = true; - break; - } - if (me) - break; - } - if (me) - recipients = message.to; + List
addresses = new ArrayList<>(); + if (type == EntityContact.TYPE_FROM) { + if (message.reply == null || message.reply.length == 0) { + if (message.from != null) + addresses.addAll(Arrays.asList(message.from)); + } else + addresses.addAll(Arrays.asList(message.reply)); + } else if (type == EntityContact.TYPE_TO) { + if (message.to != null) + addresses.addAll(Arrays.asList(message.to)); + if (message.cc != null) + addresses.addAll(Arrays.asList(message.cc)); } - if (recipients != null) { - for (Address recipient : recipients) { - final String email = ((InternetAddress) recipient).getAddress(); - final String name = ((InternetAddress) recipient).getPersonal(); - final Uri avatar = ContactInfo.getLookupUri(context, new Address[]{recipient}); - db.runInTransaction(new Runnable() { - @Override - public void run() { - EntityContact contact = db.contact().getContact(folder.account, type, email); - if (contact == null) { - contact = new EntityContact(); - contact.account = folder.account; - contact.type = type; - contact.email = email; - contact.name = name; - contact.avatar = (avatar == null ? null : avatar.toString()); - contact.times_contacted = 1; - contact.first_contacted = message.received; - contact.last_contacted = message.received; - contact.id = db.contact().insertContact(contact); - Log.i("Inserted contact=" + contact + " type=" + type); - } else { - if (!TextUtils.isEmpty(name)) - contact.name = name; - contact.avatar = (avatar == null ? null : avatar.toString()); - contact.times_contacted++; - contact.first_contacted = Math.min(contact.first_contacted, message.received); - contact.last_contacted = message.received; - db.contact().updateContact(contact); - Log.i("Updated contact=" + contact + " type=" + type); - } - } - }); + 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}); + + try { + db.beginTransaction(); + + EntityContact contact = db.contact().getContact(folder.account, type, email); + if (contact == null) { + contact = new EntityContact(); + contact.account = folder.account; + contact.type = type; + contact.email = email; + contact.name = name; + contact.avatar = (avatar == null ? null : avatar.toString()); + contact.times_contacted = 1; + contact.first_contacted = message.received; + contact.last_contacted = message.received; + contact.id = db.contact().insertContact(contact); + Log.i("Inserted contact=" + contact + " type=" + type); + } else { + if (!TextUtils.isEmpty(name)) + contact.name = name; + contact.avatar = (avatar == null ? null : avatar.toString()); + contact.times_contacted++; + contact.first_contacted = Math.min(contact.first_contacted, message.received); + contact.last_contacted = message.received; + db.contact().updateContact(contact); + Log.i("Updated contact=" + contact + " type=" + type); + } + + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); } } } diff --git a/app/src/main/java/eu/faircode/email/EntityMessage.java b/app/src/main/java/eu/faircode/email/EntityMessage.java index 91153ee693..a0b44a5184 100644 --- a/app/src/main/java/eu/faircode/email/EntityMessage.java +++ b/app/src/main/java/eu/faircode/email/EntityMessage.java @@ -163,14 +163,11 @@ public class EntityMessage implements Serializable { } boolean replySelf(List identities) { - if (identities != null) { - Address[] senders = (reply == null || reply.length == 0 ? from : reply); - if (senders != null) - for (Address sender : senders) - for (TupleIdentityEx identity : identities) - if (identity.similarAddress(sender)) - return true; - } + if (identities != null && from != null) + for (Address sender : from) + for (TupleIdentityEx identity : identities) + if (identity.similarAddress(sender)) + return true; return false; }