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

Commit 3ed3af2f authored by John Shao's avatar John Shao
Browse files

Move logic to SimContactDao

Move logic to do with sim contacts to the Dao
layer.
Only add duplicates util fragment if we are not
starting assistant

Test: manual

Bug:32030750
Change-Id: Ie57c0aed76f6b93b0dece591fc1f6e7ad8667f0c
parent fc1b96d8
Loading
Loading
Loading
Loading
+9 −7
Original line number Diff line number Diff line
@@ -809,6 +809,7 @@ public class PeopleActivity extends ContactsDrawerActivity {
            }
            transaction.replace(R.id.contacts_list_container, uiFragment, fragmentTag);

            if (!Flags.getInstance().getBoolean(Experiments.ASSISTANT)) {
                Fragment duplicatesUtilFragment =
                        fragmentManager.findFragmentByTag(TAG_DUPLICATES_UTIL);
                if (duplicatesUtilFragment == null) {
@@ -817,6 +818,7 @@ public class PeopleActivity extends ContactsDrawerActivity {
                if (!duplicatesUtilFragment.isAdded()) {
                    transaction.add(duplicatesUtilFragment, TAG_DUPLICATES_UTIL);
                }
            }
            resetToolBarStatusBarColor();
        }
        transaction.addToBackStack(TAG_SECOND_LEVEL);
+79 −15
Original line number Diff line number Diff line
@@ -22,16 +22,28 @@ import android.content.Context;
import android.content.OperationApplicationException;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.RemoteException;
import android.provider.BaseColumns;
import android.provider.ContactsContract;
import android.support.annotation.VisibleForTesting;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.util.ArraySet;

import com.android.contacts.common.Experiments;
import com.android.contacts.common.model.SimContact;
import com.android.contacts.common.model.account.AccountWithDataSet;
import com.android.contacts.util.SharedPreferenceUtil;
import com.android.contactsbind.experiments.Flags;
import com.google.common.collect.Sets;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;

/**
 * Provides data access methods for loading contacts from a SIM card and and migrating these
@@ -46,15 +58,66 @@ public class SimContactDao {
    public static String NUMBER = "number";
    public static String EMAILS = "emails";

    private ContentResolver mResolver;
    private final Context mContext;
    private final ContentResolver mResolver;
    private final TelephonyManager mTelephonyManager;

    public SimContactDao(Context context) {
        this(context.getContentResolver());
        mContext = context;
        mResolver = context.getContentResolver();
        mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    }

    @VisibleForTesting
    public SimContactDao(ContentResolver resolver) {
        mResolver = resolver;
    public void warmupSimQueryIfNeeded() {
        // Not needed if we don't have an Assistant section
        if (!Flags.getInstance().getBoolean(Experiments.ASSISTANT) ||
                !shouldLoad()) return;

        new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                // We don't actually have to do any caching ourselves. Some other layer must do
                // caching of the data (OS or framework) because subsequent queries are very fast.
                final Cursor cursor = mResolver.query(ICC_CONTENT_URI, null, null, null, null);
                if (cursor != null) {
                    cursor.close();
                }
                return null;
            }
        }.execute();
    }

    public boolean shouldLoad() {
        final Set<String> simIds = getSimCardIds();
        return !Sets.difference(simIds, SharedPreferenceUtil.getImportedSims(mContext)).isEmpty()
                && getSimState() != TelephonyManager.SIM_STATE_ABSENT;
    }

    public Set<String> getSimCardIds() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
            final SubscriptionManager subscriptionManager = SubscriptionManager.from(mContext);
            final List<SubscriptionInfo> subscriptions = subscriptionManager
                    .getActiveSubscriptionInfoList();
            if (subscriptions == null) {
                return Collections.emptySet();
            }
            final ArraySet<String> result = new ArraySet<>(
                    subscriptionManager.getActiveSubscriptionInfoCount());

            for (SubscriptionInfo info : subscriptions) {
                result.add(info.getIccId());
            }
            return result;
        }
        return Collections.singleton(getSimSerialNumber());
    }

    public int getSimState() {
        return mTelephonyManager.getSimState();
    }

    public String getSimSerialNumber() {
        return mTelephonyManager.getSimSerialNumber();
    }

    public ArrayList<SimContact> loadSimContacts(int subscriptionId) {
@@ -101,19 +164,11 @@ public class SimContactDao {
    public ContentProviderResult[] importContacts(List<SimContact> contacts,
            AccountWithDataSet targetAccount)
            throws RemoteException, OperationApplicationException {
        final ArrayList<ContentProviderOperation> ops = createImportOperations(contacts, targetAccount);
        final ArrayList<ContentProviderOperation> ops =
                createImportOperations(contacts, targetAccount);
        return mResolver.applyBatch(ContactsContract.AUTHORITY, ops);
    }

    public void warmup() {
        // We don't actually have to do any caching ourselves. Some other layer must do caching
        // of the data (OS or framework) because subsequent queries are very fast.
        final Cursor cursor = mResolver.query(ICC_CONTENT_URI, null, null, null, null);
        if (cursor != null) {
            cursor.close();
        }
    }

    private ArrayList<ContentProviderOperation> createImportOperations(List<SimContact> contacts,
            AccountWithDataSet targetAccount) {
        final ArrayList<ContentProviderOperation> ops = new ArrayList<>();
@@ -126,4 +181,13 @@ public class SimContactDao {
    private String[] parseEmails(String emails) {
        return emails != null ? emails.split(",") : null;
    }

    public void persistImportSuccess() {
        // TODO: either need to have an assistant card per SIM card or show contacts from all
        // SIMs in the import view.
        final Set<String> simIds = getSimCardIds();
        for (String id : simIds) {
            SharedPreferenceUtil.addImportedSim(mContext, id);
        }
    }
}
+33 −5
Original line number Diff line number Diff line
@@ -18,9 +18,21 @@ package com.android.contacts.util;

import android.content.Context;
import android.content.SharedPreferences;
import android.telephony.SubscriptionInfo;
import android.telephony.TelephonyManager;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

public class SharedPreferenceUtil {

    public static final String PREFERENCE_KEY_ACCOUNT_SYNC_OFF_DISMISSES =
            "num-of-dismisses-account-sync-off";

    public static final String PREFERENCE_KEY_GLOBAL_SYNC_OFF_DISMISSES =
            "num-of-dismisses-auto-sync-off";

    private static final String PREFERENCE_KEY_HAMBURGER_PROMO_DISPLAYED_BEFORE =
            "hamburgerPromoDisplayedBefore";

@@ -30,11 +42,8 @@ public class SharedPreferenceUtil {
    private static final String PREFERENCE_KEY_HAMBURGER_PROMO_TRIGGER_ACTION_HAPPENED_BEFORE =
            "hamburgerPromoTriggerActionHappenedBefore";

    public static final String PREFERENCE_KEY_GLOBAL_SYNC_OFF_DISMISSES =
            "num-of-dismisses-auto-sync-off";

    public static final String PREFERENCE_KEY_ACCOUNT_SYNC_OFF_DISMISSES
            = "num-of-dismisses-account-sync-off";
    private static final String PREFERENCE_KEY_IMPORTED_SIM_CARDS =
            "importedSimCards";

    public static boolean getHamburgerPromoDisplayedBefore(Context context) {
        return getSharedPreferences(context)
@@ -131,4 +140,23 @@ public class SharedPreferenceUtil {
        getSharedPreferences(context).edit()
                .putInt(buildSharedPrefsName(accountName), value + 1).apply();
    }

    /**
     * Persist an identifier for a SIM card which has been successfully imported.
     *
     * @param simId an identifier for the SIM card this should be one of
     * {@link TelephonyManager#getSimSerialNumber()} or {@link SubscriptionInfo#getIccId()}
     * depending on API level. The source of the value should be consistent on a particular device
     */
    public static void addImportedSim(Context context, String simId) {
        final Set<String> current = new HashSet<>(getImportedSims(context));
        current.add(simId);
        getSharedPreferences(context).edit()
                .putStringSet(PREFERENCE_KEY_IMPORTED_SIM_CARDS, current).apply();
    }

    public static Set<String> getImportedSims(Context context) {
        return getSharedPreferences(context)
                .getStringSet(PREFERENCE_KEY_IMPORTED_SIM_CARDS, Collections.<String>emptySet());
    }
}