Merge "Fix occasional hang when loading from SIM" into ub-contactsdialer-h-dev
diff --git a/src/com/android/contacts/common/database/SimContactDao.java b/src/com/android/contacts/common/database/SimContactDao.java
index 8805c52..3175ce4 100644
--- a/src/com/android/contacts/common/database/SimContactDao.java
+++ b/src/com/android/contacts/common/database/SimContactDao.java
@@ -24,7 +24,6 @@
 import android.content.pm.PackageManager;
 import android.database.Cursor;
 import android.net.Uri;
-import android.os.AsyncTask;
 import android.os.Build;
 import android.os.RemoteException;
 import android.provider.BaseColumns;
@@ -40,14 +39,12 @@
 import android.util.SparseArray;
 
 import com.android.contacts.R;
-import com.android.contacts.common.Experiments;
 import com.android.contacts.common.compat.CompatUtils;
 import com.android.contacts.common.model.SimCard;
 import com.android.contacts.common.model.SimContact;
 import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.common.util.PermissionsUtil;
 import com.android.contacts.util.SharedPreferenceUtil;
-import com.android.contactsbind.experiments.Flags;
 import com.google.common.base.Joiner;
 
 import java.util.ArrayList;
@@ -97,17 +94,6 @@
         mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
     }
 
-    public void warmupSimQueryIfNeeded() {
-        if (!canReadSimContacts()) return;
-
-        new AsyncTask<Void, Void, Void>() {
-            @Override
-            protected Void doInBackground(Void... params) {
-                getSimCardsWithContacts();
-                return null;
-            }
-        }.execute();
-    }
 
     public Context getContext() {
         return mContext;
@@ -279,13 +265,19 @@
         return contacts != null ? contacts : loadContactsForSim(sim);
     }
 
+    // See b/32831092
+    // Sometimes the SIM contacts provider seems to get stuck if read from multiple threads
+    // concurrently. So we just have a global lock around it to prevent potential issues.
+    private static final Object SIM_READ_LOCK = new Object();
     private ArrayList<SimContact> loadFrom(Uri uri) {
-        final Cursor cursor = mResolver.query(uri, null, null, null, null);
+        synchronized (SIM_READ_LOCK) {
+            final Cursor cursor = mResolver.query(uri, null, null, null, null);
 
-        try {
-            return loadFromCursor(cursor);
-        } finally {
-            cursor.close();
+            try {
+                return loadFromCursor(cursor);
+            } finally {
+                cursor.close();
+            }
         }
     }
 
@@ -423,10 +415,6 @@
         }
 
         @Override
-        public void warmupSimQueryIfNeeded() {
-        }
-
-        @Override
         public List<SimCard> getSimCards() {
             return SharedPreferenceUtil.restoreSimStates(getContext(), mSimCards);
         }