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

Commit fefa2ff7 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Use SimPhonebookContract for Contacts app SIM import"

parents b250588e b700f11c
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ package com.android.contacts;
import android.app.Activity;
import android.app.Fragment;
import android.app.LoaderManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.content.Loader;
@@ -26,7 +25,7 @@ import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.android.material.snackbar.Snackbar;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;

import androidx.collection.ArrayMap;
import androidx.core.view.ViewCompat;
import androidx.core.widget.ContentLoadingProgressBar;
@@ -372,7 +371,7 @@ public class SimImportFragment extends Fragment
            if (position < 0 || position >= getCount()) {
                return View.NO_ID;
            }
            return getItem(position).getId();
            return getItem(position).getRecordNumber();
        }

        @Override
+22 −34
Original line number Diff line number Diff line
@@ -26,20 +26,20 @@ import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.RemoteException;
import android.provider.BaseColumns;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.RawContacts;
import androidx.annotation.VisibleForTesting;
import androidx.collection.ArrayMap;
import android.provider.SimPhonebookContract;
import android.provider.SimPhonebookContract.SimRecords;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.SparseArray;

import androidx.collection.ArrayMap;

import com.android.contacts.R;
import com.android.contacts.compat.CompatUtils;
import com.android.contacts.model.SimCard;
@@ -47,6 +47,7 @@ import com.android.contacts.model.SimContact;
import com.android.contacts.model.account.AccountWithDataSet;
import com.android.contacts.util.PermissionsUtil;
import com.android.contacts.util.SharedPreferenceUtil;

import com.google.common.base.Joiner;

import java.util.ArrayList;
@@ -75,14 +76,6 @@ public class SimContactDaoImpl extends SimContactDao {
    // query parameter limit.
    static final int QUERY_MAX_BATCH_SIZE = 100;

    @VisibleForTesting
    public static final Uri ICC_CONTENT_URI = Uri.parse("content://icc/adn");

    public static String _ID = BaseColumns._ID;
    public static String NAME = "name";
    public static String NUMBER = "number";
    public static String EMAILS = "emails";

    private final Context mContext;
    private final ContentResolver mResolver;
    private final TelephonyManager mTelephonyManager;
@@ -128,18 +121,14 @@ public class SimContactDaoImpl extends SimContactDao {
        if (sim.hasValidSubscriptionId()) {
            return loadSimContacts(sim.getSubscriptionId());
        }
        return loadSimContacts();
        // Return an empty list.
        return new ArrayList<>(0);
    }

    public ArrayList<SimContact> loadSimContacts(int subscriptionId) {
        return loadFrom(ICC_CONTENT_URI.buildUpon()
                .appendPath("subId")
                .appendPath(String.valueOf(subscriptionId))
                .build());
    }

    public ArrayList<SimContact> loadSimContacts() {
        return loadFrom(ICC_CONTENT_URI);
        return loadFrom(
                SimRecords.getContentUri(
                        subscriptionId, SimPhonebookContract.ElementaryFiles.EF_ADN));
    }

    @Override
@@ -273,7 +262,12 @@ public class SimContactDaoImpl extends SimContactDao {
    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);
            final Cursor cursor = mResolver.query(uri,
                    new String[]{
                            SimRecords.RECORD_NUMBER,
                            SimRecords.NAME,
                            SimRecords.PHONE_NUMBER
                    }, null, null);
            if (cursor == null) {
                // Assume null means there are no SIM contacts.
                return new ArrayList<>(0);
@@ -288,22 +282,20 @@ public class SimContactDaoImpl extends SimContactDao {
    }

    private ArrayList<SimContact> loadFromCursor(Cursor cursor) {
        final int colId = cursor.getColumnIndex(_ID);
        final int colName = cursor.getColumnIndex(NAME);
        final int colNumber = cursor.getColumnIndex(NUMBER);
        final int colEmails = cursor.getColumnIndex(EMAILS);
        final int colRecordNumber = cursor.getColumnIndex(SimRecords.RECORD_NUMBER);
        final int colName = cursor.getColumnIndex(SimRecords.NAME);
        final int colNumber = cursor.getColumnIndex(SimRecords.PHONE_NUMBER);

        final ArrayList<SimContact> result = new ArrayList<>();

        while (cursor.moveToNext()) {
            final long id = cursor.getLong(colId);
            final int recordNumber = cursor.getInt(colRecordNumber);
            final String name = cursor.getString(colName);
            final String number = cursor.getString(colNumber);
            final String emails = cursor.getString(colEmails);

            final SimContact contact = new SimContact(id, name, number, parseEmails(emails));
            final SimContact contact = new SimContact(recordNumber, name, number, null);
            // Only include contact if it has some useful data
            if (contact.hasName() || contact.hasPhone() || contact.hasEmails()) {
            if (contact.hasName() || contact.hasPhone()) {
                result.add(contact);
            }
        }
@@ -392,10 +384,6 @@ public class SimContactDaoImpl extends SimContactDao {
        return ops;
    }

    private String[] parseEmails(String emails) {
        return !TextUtils.isEmpty(emails) ? emails.split(",") : null;
    }

    private boolean hasTelephony() {
        return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
    }
+5 −7
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ import android.os.Build;
import androidx.annotation.RequiresApi;
import android.telephony.PhoneNumberUtils;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.util.Log;

@@ -78,11 +79,6 @@ public class SimCard {
        mCountryCode = countryCode != null ? countryCode.toUpperCase(Locale.US) : null;
    }

    public SimCard(String simId, CharSequence carrierName,
            CharSequence displayName, String phoneNumber, String countryCode) {
        this(simId, NO_SUBSCRIPTION_ID, carrierName, displayName, phoneNumber, countryCode);
    }

    public String getSimId() {
        return mSimId;
    }
@@ -245,12 +241,14 @@ public class SimCard {

    public static SimCard create(TelephonyManager telephony, String displayLabel) {
        if (telephony.getSimState() == TelephonyManager.SIM_STATE_READY) {
            return new SimCard(telephony.getSimSerialNumber(),
            return new SimCard(telephony.getSimSerialNumber(), telephony.getSubscriptionId(),
                    telephony.getSimOperatorName(), displayLabel, telephony.getLine1Number(),
                    telephony.getSimCountryIso());
        } else {
            // This should never happen but in case it does just fallback to an "empty" instance
            return new SimCard(/* SIM id */ "", /* operator name */ null, displayLabel,
            return new SimCard(/* SIM id */ "",
                    /* subscriptionId */ SubscriptionManager.INVALID_SUBSCRIPTION_ID,
                    /* operator name */ null, displayLabel,
                    /* phone number */ "", /* Country code */ null);
        }
    }
+16 −16
Original line number Diff line number Diff line
@@ -43,28 +43,28 @@ import java.util.Objects;
 * Holds data for contacts loaded from the SIM card.
 */
public class SimContact implements Parcelable {
    private final long mId;
    private final int mRecordNumber;
    private final String mName;
    private final String mPhone;
    private final String[] mEmails;

    public SimContact(long id, String name, String phone) {
        this(id, name, phone, null);
    public SimContact(int recordNumber, String name, String phone) {
        this(recordNumber, name, phone, null);
    }

    public SimContact(long id, String name, String phone, String[] emails) {
        mId = id;
    public SimContact(int recordNumber, String name, String phone, String[] emails) {
        mRecordNumber = recordNumber;
        mName = name;
        mPhone = phone == null ? "" : phone.trim();
        mEmails = emails;
    }

    public SimContact(SimContact other) {
        this(other.mId, other.mName, other.mPhone, other.mEmails);
        this(other.mRecordNumber, other.mName, other.mPhone, other.mEmails);
    }

    public long getId() {
        return mId;
    public int getRecordNumber() {
        return mRecordNumber;
    }

    public String getName() {
@@ -117,7 +117,7 @@ public class SimContact implements Parcelable {
    }

    public void appendAsContactRow(MatrixCursor cursor) {
        cursor.newRow().add(ContactsContract.Contacts._ID, mId)
        cursor.newRow().add(ContactsContract.Contacts._ID, mRecordNumber)
                .add(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY, mName)
                .add(ContactsContract.Contacts.LOOKUP_KEY, getLookupKey());
    }
@@ -152,7 +152,7 @@ public class SimContact implements Parcelable {
    @Override
    public String toString() {
        return "SimContact{" +
                "mId=" + mId +
                "mId=" + mRecordNumber +
                ", mName='" + mName + '\'' +
                ", mPhone='" + mPhone + '\'' +
                ", mEmails=" + Arrays.toString(mEmails) +
@@ -166,13 +166,13 @@ public class SimContact implements Parcelable {

        final SimContact that = (SimContact) o;

        return mId == that.mId && Objects.equals(mName, that.mName) &&
        return mRecordNumber == that.mRecordNumber && Objects.equals(mName, that.mName) &&
                Objects.equals(mPhone, that.mPhone) && Arrays.equals(mEmails, that.mEmails);
    }

    @Override
    public int hashCode() {
        int result = (int) (mId ^ (mId >>> 32));
        int result = (int) (mRecordNumber ^ (mRecordNumber >>> 32));
        result = 31 * result + (mName != null ? mName.hashCode() : 0);
        result = 31 * result + (mPhone != null ? mPhone.hashCode() : 0);
        result = 31 * result + Arrays.hashCode(mEmails);
@@ -186,7 +186,7 @@ public class SimContact implements Parcelable {

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeLong(mId);
        dest.writeInt(mRecordNumber);
        dest.writeString(mName);
        dest.writeString(mPhone);
        dest.writeStringArray(mEmails);
@@ -195,11 +195,11 @@ public class SimContact implements Parcelable {
    public static final Creator<SimContact> CREATOR = new Creator<SimContact>() {
        @Override
        public SimContact createFromParcel(Parcel source) {
            final long id = source.readLong();
            final int recordNumber = source.readInt();
            final String name = source.readString();
            final String phone = source.readString();
            final String[] emails = source.createStringArray();
            return new SimContact(id, name, phone, emails);
            return new SimContact(recordNumber, name, phone, emails);
        }

        @Override
@@ -253,7 +253,7 @@ public class SimContact implements Parcelable {
            @Override
            public int compare(SimContact lhs, SimContact rhs) {
                // We assume ids are unique.
                return Long.compare(lhs.mId, rhs.mId);
                return Long.compare(lhs.mRecordNumber, rhs.mRecordNumber);
            }
        };
    }
+2 −0
Original line number Diff line number Diff line
@@ -12,6 +12,8 @@ android_test {

    static_libs: [
        "androidx.test.rules",
        "androidx.test.runner",
        "androidx.test.ext.junit",
        "hamcrest-library",
        "mockito-target-minus-junit4",
        "ub-uiautomator",
Loading