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

Commit 46a22c8a authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Use SimPhonebookContract for Contacts app SIM import" am: fefa2ff7 am: 7342d6d5

Original change: https://android-review.googlesource.com/c/platform/packages/apps/Contacts/+/1580476

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: I4da61d6d4551d7f27b30fae5b88faa047fc3f648
parents e60e6472 7342d6d5
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