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 Original line Diff line number Diff line
@@ -18,7 +18,6 @@ package com.android.contacts;
import android.app.Activity;
import android.app.Activity;
import android.app.Fragment;
import android.app.Fragment;
import android.app.LoaderManager;
import android.app.LoaderManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Context;
import android.content.IntentFilter;
import android.content.IntentFilter;
import android.content.Loader;
import android.content.Loader;
@@ -26,7 +25,7 @@ import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.Nullable;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.material.snackbar.Snackbar;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;

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


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


import androidx.collection.ArrayMap;

import com.android.contacts.R;
import com.android.contacts.R;
import com.android.contacts.compat.CompatUtils;
import com.android.contacts.compat.CompatUtils;
import com.android.contacts.model.SimCard;
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.model.account.AccountWithDataSet;
import com.android.contacts.util.PermissionsUtil;
import com.android.contacts.util.PermissionsUtil;
import com.android.contacts.util.SharedPreferenceUtil;
import com.android.contacts.util.SharedPreferenceUtil;

import com.google.common.base.Joiner;
import com.google.common.base.Joiner;


import java.util.ArrayList;
import java.util.ArrayList;
@@ -75,14 +76,6 @@ public class SimContactDaoImpl extends SimContactDao {
    // query parameter limit.
    // query parameter limit.
    static final int QUERY_MAX_BATCH_SIZE = 100;
    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 Context mContext;
    private final ContentResolver mResolver;
    private final ContentResolver mResolver;
    private final TelephonyManager mTelephonyManager;
    private final TelephonyManager mTelephonyManager;
@@ -128,18 +121,14 @@ public class SimContactDaoImpl extends SimContactDao {
        if (sim.hasValidSubscriptionId()) {
        if (sim.hasValidSubscriptionId()) {
            return loadSimContacts(sim.getSubscriptionId());
            return loadSimContacts(sim.getSubscriptionId());
        }
        }
        return loadSimContacts();
        // Return an empty list.
        return new ArrayList<>(0);
    }
    }


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

    public ArrayList<SimContact> loadSimContacts() {
        return loadFrom(ICC_CONTENT_URI);
    }
    }


    @Override
    @Override
@@ -273,7 +262,12 @@ public class SimContactDaoImpl extends SimContactDao {
    private static final Object SIM_READ_LOCK = new Object();
    private static final Object SIM_READ_LOCK = new Object();
    private ArrayList<SimContact> loadFrom(Uri uri) {
    private ArrayList<SimContact> loadFrom(Uri uri) {
        synchronized (SIM_READ_LOCK) {
        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) {
            if (cursor == null) {
                // Assume null means there are no SIM contacts.
                // Assume null means there are no SIM contacts.
                return new ArrayList<>(0);
                return new ArrayList<>(0);
@@ -288,22 +282,20 @@ public class SimContactDaoImpl extends SimContactDao {
    }
    }


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


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


        while (cursor.moveToNext()) {
        while (cursor.moveToNext()) {
            final long id = cursor.getLong(colId);
            final int recordNumber = cursor.getInt(colRecordNumber);
            final String name = cursor.getString(colName);
            final String name = cursor.getString(colName);
            final String number = cursor.getString(colNumber);
            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
            // Only include contact if it has some useful data
            if (contact.hasName() || contact.hasPhone() || contact.hasEmails()) {
            if (contact.hasName() || contact.hasPhone()) {
                result.add(contact);
                result.add(contact);
            }
            }
        }
        }
@@ -392,10 +384,6 @@ public class SimContactDaoImpl extends SimContactDao {
        return ops;
        return ops;
    }
    }


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

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


@@ -78,11 +79,6 @@ public class SimCard {
        mCountryCode = countryCode != null ? countryCode.toUpperCase(Locale.US) : null;
        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() {
    public String getSimId() {
        return mSimId;
        return mSimId;
    }
    }
@@ -245,12 +241,14 @@ public class SimCard {


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


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


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


    public SimContact(SimContact other) {
    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() {
    public int getRecordNumber() {
        return mId;
        return mRecordNumber;
    }
    }


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


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


        final SimContact that = (SimContact) o;
        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);
                Objects.equals(mPhone, that.mPhone) && Arrays.equals(mEmails, that.mEmails);
    }
    }


    @Override
    @Override
    public int hashCode() {
    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 + (mName != null ? mName.hashCode() : 0);
        result = 31 * result + (mPhone != null ? mPhone.hashCode() : 0);
        result = 31 * result + (mPhone != null ? mPhone.hashCode() : 0);
        result = 31 * result + Arrays.hashCode(mEmails);
        result = 31 * result + Arrays.hashCode(mEmails);
@@ -186,7 +186,7 @@ public class SimContact implements Parcelable {


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


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


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