Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cf5d2610 authored by Marcus Hagerott's avatar Marcus Hagerott
Browse files

Fix occasional hang when loading from SIM

Reading the SIM from multiple threads concurrently can cause issues
in some cases.

Test
See Ib46c4521318547f50e4077e87d5daf6b47b760b4

Bug 32831092

Change-Id: I29cc67a126497c49468ca2ce830ed7732500f5ed
parent 054fbdcb
Loading
Loading
Loading
Loading
+11 −23
Original line number Diff line number Diff line
@@ -24,7 +24,6 @@ import android.content.OperationApplicationException;
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.telephony.TelephonyManager;
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 @@ public class SimContactDao {
        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,7 +265,12 @@ public class SimContactDao {
        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) {
        synchronized (SIM_READ_LOCK) {
            final Cursor cursor = mResolver.query(uri, null, null, null, null);

            try {
@@ -288,6 +279,7 @@ public class SimContactDao {
                cursor.close();
            }
        }
    }

    private ArrayList<SimContact> loadFromCursor(Cursor cursor) {
        final int colId = cursor.getColumnIndex(_ID);
@@ -422,10 +414,6 @@ public class SimContactDao {
            return this;
        }

        @Override
        public void warmupSimQueryIfNeeded() {
        }

        @Override
        public List<SimCard> getSimCards() {
            return SharedPreferenceUtil.restoreSimStates(getContext(), mSimCards);