diff --git a/app/src/main/java/eu/faircode/email/ApplicationEx.java b/app/src/main/java/eu/faircode/email/ApplicationEx.java index 8f2f947de0..ffbc0c4a7d 100644 --- a/app/src/main/java/eu/faircode/email/ApplicationEx.java +++ b/app/src/main/java/eu/faircode/email/ApplicationEx.java @@ -105,7 +105,7 @@ public class ApplicationEx extends Application { CookieManager.getInstance().setAcceptCookie(false); MessageHelper.setSystemProperties(); - ContactInfo.init(this, new Handler()); + ContactInfo.init(this); try { WorkerWatchdog.init(this); diff --git a/app/src/main/java/eu/faircode/email/ContactInfo.java b/app/src/main/java/eu/faircode/email/ContactInfo.java index 613a8ac66d..7e10d97d7c 100644 --- a/app/src/main/java/eu/faircode/email/ContactInfo.java +++ b/app/src/main/java/eu/faircode/email/ContactInfo.java @@ -36,6 +36,7 @@ import android.graphics.Rect; import android.graphics.RectF; import android.net.Uri; import android.os.Handler; +import android.os.Looper; import android.provider.ContactsContract; import androidx.preference.PreferenceManager; @@ -45,6 +46,8 @@ import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import javax.mail.Address; import javax.mail.internet.InternetAddress; @@ -59,6 +62,9 @@ public class ContactInfo { private static Map emailLookup = new ConcurrentHashMap<>(); private static Map emailContactInfo = new HashMap<>(); + private static final ExecutorService executor = + Executors.newSingleThreadExecutor(Helper.backgroundThreadFactory); + private static final long CACHE_CONTACT_DURATION = 120 * 1000L; private ContactInfo() { @@ -211,29 +217,42 @@ public class ContactInfo { return info; } - static void init(final Context context, Handler handler) { - if (Helper.hasPermission(context, Manifest.permission.READ_CONTACTS)) - try { - ContentObserver observer = new ContentObserver(handler) { - @Override - public void onChange(boolean selfChange, Uri uri) { - Log.i("Contact changed uri=" + uri); - try { - emailLookup = getEmailLookup(context); - } catch (Throwable ex) { - Log.e(ex); + static void init(final Context context) { + if (Helper.hasPermission(context, Manifest.permission.READ_CONTACTS)) { + Handler handler = new Handler(Looper.getMainLooper()); + + ContentObserver observer = new ContentObserver(handler) { + @Override + public void onChange(boolean selfChange, Uri uri) { + Log.i("Contact changed uri=" + uri); + executor.submit(new Runnable() { + @Override + public void run() { + try { + emailLookup = getEmailLookup(context); + } catch (Throwable ex) { + Log.e(ex); + } } + }); + } + }; + + executor.submit(new Runnable() { + @Override + public void run() { + try { + emailLookup = getEmailLookup(context); + } catch (Throwable ex) { + Log.e(ex); } - }; - - emailLookup = getEmailLookup(context); + } + }); - Uri uri = ContactsContract.CommonDataKinds.Email.CONTENT_URI; - Log.i("Observing uri=" + uri); - context.getContentResolver().registerContentObserver(uri, true, observer); - } catch (Throwable ex) { - Log.e(ex); - } + Uri uri = ContactsContract.CommonDataKinds.Email.CONTENT_URI; + Log.i("Observing uri=" + uri); + context.getContentResolver().registerContentObserver(uri, true, observer); + } } static Uri getLookupUri(Context context, Address[] addresses) { @@ -253,6 +272,7 @@ public class ContactInfo { Map all = new ConcurrentHashMap<>(); if (Helper.hasPermission(context, Manifest.permission.READ_CONTACTS)) { + Log.i("Reading email/uri"); ContentResolver resolver = context.getContentResolver(); long untrusted = -1; diff --git a/app/src/main/java/eu/faircode/email/FragmentSetup.java b/app/src/main/java/eu/faircode/email/FragmentSetup.java index dd427c90a9..9864203ce8 100644 --- a/app/src/main/java/eu/faircode/email/FragmentSetup.java +++ b/app/src/main/java/eu/faircode/email/FragmentSetup.java @@ -385,6 +385,9 @@ public class FragmentSetup extends FragmentBase { break; } + if (has) + ContactInfo.init(getContext()); + tvPermissionsDone.setText(has ? R.string.title_setup_done : R.string.title_setup_to_do); tvPermissionsDone.setTextColor(has ? textColorPrimary : colorWarning); tvPermissionsDone.setCompoundDrawablesWithIntrinsicBounds(has ? check : null, null, null, null);