diff options
9 files changed, 112 insertions, 155 deletions
diff --git a/src/com/android/contacts/SimImportFragment.java b/src/com/android/contacts/SimImportFragment.java index cee1b1a9a..1d16df0b3 100644 --- a/src/com/android/contacts/SimImportFragment.java +++ b/src/com/android/contacts/SimImportFragment.java @@ -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 diff --git a/src/com/android/contacts/database/SimContactDaoImpl.java b/src/com/android/contacts/database/SimContactDaoImpl.java index 5ba6bd571..54106f041 100644 --- a/src/com/android/contacts/database/SimContactDaoImpl.java +++ b/src/com/android/contacts/database/SimContactDaoImpl.java @@ -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); } diff --git a/src/com/android/contacts/model/SimCard.java b/src/com/android/contacts/model/SimCard.java index ea743796a..969d96d10 100644 --- a/src/com/android/contacts/model/SimCard.java +++ b/src/com/android/contacts/model/SimCard.java @@ -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); } } diff --git a/src/com/android/contacts/model/SimContact.java b/src/com/android/contacts/model/SimContact.java index 7babe27ca..820e3464a 100644 --- a/src/com/android/contacts/model/SimContact.java +++ b/src/com/android/contacts/model/SimContact.java @@ -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); } }; } diff --git a/tests/Android.bp b/tests/Android.bp index 2e1d47b9d..e09186e18 100644 --- a/tests/Android.bp +++ b/tests/Android.bp @@ -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", diff --git a/tests/src/com/android/contacts/activities/SimImportActivityTest.java b/tests/src/com/android/contacts/activities/SimImportActivityTest.java index 7069ef18f..250ce4b6c 100644 --- a/tests/src/com/android/contacts/activities/SimImportActivityTest.java +++ b/tests/src/com/android/contacts/activities/SimImportActivityTest.java @@ -40,6 +40,8 @@ import android.os.Build; import android.provider.ContactsContract; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.Data; +import android.provider.SimPhonebookContract; +import android.provider.SimPhonebookContract.SimRecords; import android.support.test.uiautomator.By; import android.support.test.uiautomator.UiDevice; import android.support.test.uiautomator.Until; @@ -48,9 +50,9 @@ import android.test.mock.MockContentResolver; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.test.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.LargeTest; import androidx.test.filters.SdkSuppress; -import androidx.test.runner.AndroidJUnit4; import com.android.contacts.SimImportService; import com.android.contacts.database.SimContactDao; @@ -224,10 +226,10 @@ public class SimImportActivityTest { final AccountWithDataSet targetAccount = mAccountHelper.addTestAccount( mAccountHelper.generateAccountName("SimImportActivity0_targetAccount_")); - final MockContentProvider iccProvider = new MockContentProvider(); - iccProvider.expect(MockContentProvider.Query.forAnyUri()) - .withDefaultProjection(new String[] {SimContactDaoImpl._ID, SimContactDaoImpl.NAME, - SimContactDaoImpl.NUMBER, SimContactDaoImpl.EMAILS }) + final MockContentProvider simPhonebookProvider = new MockContentProvider(); + simPhonebookProvider.expect(MockContentProvider.Query.forAnyUri()) + .withProjection( + SimRecords.RECORD_NUMBER, SimRecords.NAME, SimRecords.PHONE_NUMBER) .anyNumberOfTimes() .returnRow(toCursorRow(new SimContact(1, "Import One", "5550101"))) .returnRow(toCursorRow(new SimContact(2, "Skip Two", "5550102"))) @@ -236,7 +238,7 @@ public class SimImportActivityTest { .returnRow(toCursorRow(new SimContact(5, "Skip Five", "5550105"))) .returnRow(toCursorRow(new SimContact(6, "Import Six", "5550106"))); final MockContentResolver mockResolver = new MockContentResolver(); - mockResolver.addProvider("icc", iccProvider); + mockResolver.addProvider(SimPhonebookContract.AUTHORITY, simPhonebookProvider); final ContentProviderClient contactsProviderClient = mContext.getContentResolver() .acquireContentProviderClient(ContactsContract.AUTHORITY); mockResolver.addProvider(ContactsContract.AUTHORITY, new ForwardingContentProvider( @@ -258,6 +260,7 @@ public class SimImportActivityTest { mActivity = mInstrumentation.startActivitySync( new Intent(mContext, SimImportActivity.class) + .putExtra(SimImportActivity.EXTRA_SUBSCRIPTION_ID, 1) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); assertTrue(mDevice.wait(Until.hasObject(By.desc("Show more")), TIMEOUT)); @@ -319,6 +322,7 @@ public class SimImportActivityTest { mActivity = mInstrumentation.startActivitySync( new Intent(mContext, SimImportActivity.class) + .putExtra(SimImportActivity.EXTRA_SUBSCRIPTION_ID, 1) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); assertTrue(mDevice.wait(Until.hasObject(By.text("Import One")), TIMEOUT)); @@ -351,7 +355,7 @@ public class SimImportActivityTest { } private Object[] toCursorRow(SimContact contact) { - return new Object[] { contact.getId(), contact.getName(), contact.getPhone(), null }; + return new Object[]{contact.getRecordNumber(), contact.getName(), contact.getPhone()}; } private SimCard someSimCard() { diff --git a/tests/src/com/android/contacts/database/SimContactDaoTests.java b/tests/src/com/android/contacts/database/SimContactDaoTests.java index 0b5b37f8d..680ba106e 100644 --- a/tests/src/com/android/contacts/database/SimContactDaoTests.java +++ b/tests/src/com/android/contacts/database/SimContactDaoTests.java @@ -45,16 +45,18 @@ import android.provider.ContactsContract.CommonDataKinds.Email; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.CommonDataKinds.StructuredName; import android.provider.ContactsContract.Data; +import android.provider.SimPhonebookContract; +import android.provider.SimPhonebookContract.SimRecords; import android.test.mock.MockContentResolver; import android.test.mock.MockContext; import androidx.annotation.RequiresApi; import androidx.test.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.LargeTest; import androidx.test.filters.SdkSuppress; import androidx.test.filters.SmallTest; import androidx.test.filters.Suppress; -import androidx.test.runner.AndroidJUnit4; import com.android.contacts.model.SimCard; import com.android.contacts.model.SimContact; @@ -578,92 +580,78 @@ public class SimContactDaoTests { @RunWith(AndroidJUnit4.class) public static class LoadContactsUnitTests { - private MockContentProvider mMockIccProvider; + private MockContentProvider mMockSimPhonebookProvider; private Context mContext; @Before public void setUp() { mContext = mock(MockContext.class); final MockContentResolver mockResolver = new MockContentResolver(); - mMockIccProvider = new MockContentProvider(); - mockResolver.addProvider("icc", mMockIccProvider); + mMockSimPhonebookProvider = new MockContentProvider(); + mockResolver.addProvider(SimPhonebookContract.AUTHORITY, mMockSimPhonebookProvider); when(mContext.getContentResolver()).thenReturn(mockResolver); } @Test public void createsContactsFromCursor() { - mMockIccProvider.expect(MockContentProvider.Query.forAnyUri()) + mMockSimPhonebookProvider.expect(MockContentProvider.Query.forAnyUri()) .withDefaultProjection( - SimContactDaoImpl._ID, SimContactDaoImpl.NAME, - SimContactDaoImpl.NUMBER, SimContactDaoImpl.EMAILS) + SimRecords.RECORD_NUMBER, SimRecords.NAME, SimRecords.PHONE_NUMBER) .withAnyProjection() .withAnySelection() .withAnySortOrder() - .returnRow(1, "Name One", "5550101", null) - .returnRow(2, "Name Two", "5550102", null) - .returnRow(3, "Name Three", null, null) - .returnRow(4, null, "5550104", null) - .returnRow(5, "Name Five", "5550105", - "five@example.com,nf@example.com,name.five@example.com") - .returnRow(6, "Name Six", "5550106", "thesix@example.com"); + .returnRow(1, "Name One", "5550101") + .returnRow(2, "Name Two", "5550102") + .returnRow(3, "Name Three", null) + .returnRow(4, null, "5550104"); final SimContactDao sut = SimContactDao.create(mContext); final List<SimContact> contacts = sut - .loadContactsForSim(new SimCard("123", "carrier", "sim", null, "us")); + .loadContactsForSim(new SimCard("123", 1, "carrier", "sim", null, "us")); assertThat(contacts, equalTo( Arrays.asList( new SimContact(1, "Name One", "5550101", null), new SimContact(2, "Name Two", "5550102", null), new SimContact(3, "Name Three", null, null), - new SimContact(4, null, "5550104", null), - new SimContact(5, "Name Five", "5550105", new String[] { - "five@example.com", "nf@example.com", "name.five@example.com" - }), - new SimContact(6, "Name Six", "5550106", new String[] { - "thesix@example.com" - }) + new SimContact(4, null, "5550104", null) ))); } @Test public void excludesEmptyContactsFromResult() { - mMockIccProvider.expect(MockContentProvider.Query.forAnyUri()) + mMockSimPhonebookProvider.expect(MockContentProvider.Query.forAnyUri()) .withDefaultProjection( - SimContactDaoImpl._ID, SimContactDaoImpl.NAME, - SimContactDaoImpl.NUMBER, SimContactDaoImpl.EMAILS) + SimRecords.RECORD_NUMBER, SimRecords.NAME, SimRecords.PHONE_NUMBER) .withAnyProjection() .withAnySelection() .withAnySortOrder() - .returnRow(1, "Non Empty1", "5550101", null) - .returnRow(2, "", "", "") - .returnRow(3, "Non Empty2", null, null) - .returnRow(4, null, null, null) - .returnRow(5, "", null, null) - .returnRow(6, null, "5550102", null) - .returnRow(7, null, null, "user@example.com"); + .returnRow(1, "Non Empty1", "5550101") + .returnRow(2, "", "") + .returnRow(3, "Non Empty2", null) + .returnRow(4, null, null) + .returnRow(5, "", null) + .returnRow(6, null, "5550102"); final SimContactDao sut = SimContactDao.create(mContext); final List<SimContact> contacts = sut - .loadContactsForSim(new SimCard("123", "carrier", "sim", null, "us")); + .loadContactsForSim(new SimCard("123", 1, "carrier", "sim", null, "us")); assertThat(contacts, equalTo( Arrays.asList( new SimContact(1, "Non Empty1", "5550101", null), new SimContact(3, "Non Empty2", null, null), - new SimContact(6, null, "5550102", null), - new SimContact(7, null, null, new String[] { "user@example.com" }) + new SimContact(6, null, "5550102", null) ))); } @Test public void usesSimCardSubscriptionIdIfAvailable() { - mMockIccProvider.expectQuery(SimContactDaoImpl.ICC_CONTENT_URI.buildUpon() - .appendPath("subId").appendPath("2").build()) + mMockSimPhonebookProvider.expectQuery(SimRecords.getContentUri(2, + SimPhonebookContract.ElementaryFiles.EF_ADN)) .withDefaultProjection( - SimContactDaoImpl._ID, SimContactDaoImpl.NAME, - SimContactDaoImpl.NUMBER, SimContactDaoImpl.EMAILS) + SimRecords.RECORD_NUMBER, SimRecords.NAME, SimRecords.PHONE_NUMBER) .withAnyProjection() .withAnySelection() .withAnySortOrder() @@ -671,32 +659,14 @@ public class SimContactDaoTests { final SimContactDao sut = SimContactDao.create(mContext); sut.loadContactsForSim(new SimCard("123", 2, "carrier", "sim", null, "us")); - mMockIccProvider.verify(); - } - - @Test - public void omitsSimCardSubscriptionIdIfUnavailable() { - mMockIccProvider.expectQuery(SimContactDaoImpl.ICC_CONTENT_URI) - .withDefaultProjection( - SimContactDaoImpl._ID, SimContactDaoImpl.NAME, - SimContactDaoImpl.NUMBER, SimContactDaoImpl.EMAILS) - .withAnyProjection() - .withAnySelection() - .withAnySortOrder() - .returnEmptyCursor(); - - final SimContactDao sut = SimContactDao.create(mContext); - sut.loadContactsForSim(new SimCard("123", SimCard.NO_SUBSCRIPTION_ID, - "carrier", "sim", null, "us")); - mMockIccProvider.verify(); + mMockSimPhonebookProvider.verify(); } @Test public void returnsEmptyListForEmptyCursor() { - mMockIccProvider.expect(MockContentProvider.Query.forAnyUri()) + mMockSimPhonebookProvider.expect(MockContentProvider.Query.forAnyUri()) .withDefaultProjection( - SimContactDaoImpl._ID, SimContactDaoImpl.NAME, - SimContactDaoImpl.NUMBER, SimContactDaoImpl.EMAILS) + SimRecords.RECORD_NUMBER, SimRecords.NAME, SimRecords.PHONE_NUMBER) .withAnyProjection() .withAnySelection() .withAnySortOrder() @@ -704,7 +674,7 @@ public class SimContactDaoTests { final SimContactDao sut = SimContactDao.create(mContext); List<SimContact> result = sut - .loadContactsForSim(new SimCard("123", "carrier", "sim", null, "us")); + .loadContactsForSim(new SimCard("123", 1, "carrier", "sim", null, "us")); assertTrue(result.isEmpty()); } @@ -725,7 +695,7 @@ public class SimContactDaoTests { final SimContactDao sut = SimContactDao.create(mContext); final List<SimContact> result = sut - .loadContactsForSim(new SimCard("123", "carrier", "sim", null, "us")); + .loadContactsForSim(new SimCard("123", 1, "carrier", "sim", null, "us")); assertTrue(result.isEmpty()); } } diff --git a/tests/src/com/android/contacts/tests/FakeSimContactDao.java b/tests/src/com/android/contacts/tests/FakeSimContactDao.java index c40ab2548..ab6c653f6 100644 --- a/tests/src/com/android/contacts/tests/FakeSimContactDao.java +++ b/tests/src/com/android/contacts/tests/FakeSimContactDao.java @@ -110,5 +110,4 @@ public class FakeSimContactDao extends SimContactDao { result.canReadSimContacts = false; return result; } - } diff --git a/tests/src/com/android/contacts/tests/SimContactsTestHelper.java b/tests/src/com/android/contacts/tests/SimContactsTestHelper.java index 740d0132d..99c95cb48 100644 --- a/tests/src/com/android/contacts/tests/SimContactsTestHelper.java +++ b/tests/src/com/android/contacts/tests/SimContactsTestHelper.java @@ -28,13 +28,15 @@ import android.content.OperationApplicationException; import android.database.Cursor; import android.net.Uri; import android.os.RemoteException; +import android.provider.SimPhonebookContract; +import android.provider.SimPhonebookContract.ElementaryFiles; +import android.provider.SimPhonebookContract.SimRecords; import android.telephony.TelephonyManager; import androidx.annotation.NonNull; import androidx.test.InstrumentationRegistry; import com.android.contacts.database.SimContactDao; -import com.android.contacts.database.SimContactDaoImpl; import com.android.contacts.model.SimCard; import com.android.contacts.model.SimContact; @@ -47,6 +49,8 @@ public class SimContactsTestHelper { private final TelephonyManager mTelephonyManager; private final ContentResolver mResolver; private final SimContactDao mSimDao; + private final int mSubscriptionId; + private final Uri mDefaultSimAdnUri; public SimContactsTestHelper() { this(InstrumentationRegistry.getTargetContext()); @@ -57,10 +61,13 @@ public class SimContactsTestHelper { mResolver = context.getContentResolver(); mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); mSimDao = SimContactDao.create(context); + mSubscriptionId = mTelephonyManager.getSubscriptionId(); + mDefaultSimAdnUri = SimRecords.getContentUri( + mTelephonyManager.getSubscriptionId(), ElementaryFiles.EF_ADN); } public int getSimContactCount() { - Cursor cursor = mContext.getContentResolver().query(SimContactDaoImpl.ICC_CONTENT_URI, + Cursor cursor = mContext.getContentResolver().query(mDefaultSimAdnUri, null, null, null, null); try { return cursor.getCount(); @@ -71,15 +78,13 @@ public class SimContactsTestHelper { public Uri addSimContact(String name, String number) { ContentValues values = new ContentValues(); - // Oddly even though it's called name when querying we have to use "tag" for it to work - // when inserting. if (name != null) { - values.put("tag", name); + values.put(SimRecords.NAME, name); } if (number != null) { - values.put(SimContactDaoImpl.NUMBER, number); + values.put(SimRecords.PHONE_NUMBER, number); } - return mResolver.insert(SimContactDaoImpl.ICC_CONTENT_URI, values); + return mResolver.insert(mDefaultSimAdnUri, values); } public ContentProviderResult[] deleteAllSimContacts() @@ -92,11 +97,11 @@ public class SimContactsTestHelper { ArrayList<ContentProviderOperation> ops = new ArrayList<>(); for (SimContact contact : contacts) { ops.add(ContentProviderOperation - .newDelete(SimContactDaoImpl.ICC_CONTENT_URI) - .withSelection(getWriteSelection(contact), null) + .newDelete(SimRecords.getItemUri( + mSubscriptionId, ElementaryFiles.EF_ADN, contact.getRecordNumber())) .build()); } - return mResolver.applyBatch(SimContactDaoImpl.ICC_CONTENT_URI.getAuthority(), ops); + return mResolver.applyBatch(SimPhonebookContract.AUTHORITY, ops); } public ContentProviderResult[] restore(ArrayList<ContentProviderOperation> restoreOps) @@ -106,7 +111,7 @@ public class SimContactsTestHelper { // Remove SIM contacts because we assume that caller wants the data to be in the exact // state as when the restore ops were captured. deleteAllSimContacts(); - return mResolver.applyBatch(SimContactDaoImpl.ICC_CONTENT_URI.getAuthority(), restoreOps); + return mResolver.applyBatch(SimPhonebookContract.AUTHORITY, restoreOps); } public ArrayList<ContentProviderOperation> captureRestoreSnapshot() { @@ -124,24 +129,16 @@ public class SimContactsTestHelper { " Please manually remove SIM contacts with emails."); } ops.add(ContentProviderOperation - .newInsert(SimContactDaoImpl.ICC_CONTENT_URI) - .withValue("tag", contact.getName()) - .withValue("number", contact.getPhone()) + .newInsert(mDefaultSimAdnUri) + .withValue(SimRecords.NAME, contact.getName()) + .withValue(SimRecords.PHONE_NUMBER, contact.getPhone()) .build()); } return ops; } - public String getWriteSelection(SimContact simContact) { - return "tag='" + simContact.getName() + "' AND " + SimContactDaoImpl.NUMBER + "='" + - simContact.getPhone() + "'"; - } - - public int deleteSimContact(@NonNull String name, @NonNull String number) { - // IccProvider doesn't use the selection args. - final String selection = "tag='" + name + "' AND " + - SimContactDaoImpl.NUMBER + "='" + number + "'"; - return mResolver.delete(SimContactDaoImpl.ICC_CONTENT_URI, selection, null); + public int deleteSimContact(@NonNull Uri recordUri) { + return mResolver.delete(recordUri, null); } public boolean isSimReady() { @@ -156,7 +153,7 @@ public class SimContactsTestHelper { if (!isSimReady()) return false; final String name = "writabeProbe" + System.nanoTime(); final Uri uri = addSimContact(name, "15095550101"); - return uri != null && deleteSimContact(name, "15095550101") == 1; + return uri != null && deleteSimContact(uri) == 1; } public void assumeSimReady() { |