Loading src/com/android/contacts/SimImportFragment.java +2 −3 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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 Loading src/com/android/contacts/database/SimContactDaoImpl.java +22 −34 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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); Loading @@ -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); } } Loading Loading @@ -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); } Loading src/com/android/contacts/model/SimCard.java +5 −7 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } Loading Loading @@ -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); } } Loading src/com/android/contacts/model/SimContact.java +16 −16 Original line number Diff line number Diff line Loading @@ -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() { Loading Loading @@ -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()); } Loading Loading @@ -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) + Loading @@ -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); Loading @@ -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); Loading @@ -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 Loading Loading @@ -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); } }; } Loading tests/Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
src/com/android/contacts/SimImportFragment.java +2 −3 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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 Loading
src/com/android/contacts/database/SimContactDaoImpl.java +22 −34 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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); Loading @@ -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); } } Loading Loading @@ -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); } Loading
src/com/android/contacts/model/SimCard.java +5 −7 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } Loading Loading @@ -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); } } Loading
src/com/android/contacts/model/SimContact.java +16 −16 Original line number Diff line number Diff line Loading @@ -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() { Loading Loading @@ -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()); } Loading Loading @@ -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) + Loading @@ -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); Loading @@ -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); Loading @@ -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 Loading Loading @@ -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); } }; } Loading
tests/Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -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