From b700f11c427d3fb7529fb96bdb8b8dee6850c92d Mon Sep 17 00:00:00 2001 From: Marcus Hagerott Date: Fri, 5 Feb 2021 15:31:36 -0800 Subject: Use SimPhonebookContract for Contacts app SIM import Test: atest ContactsTest Bug: 177366414 Change-Id: I1d936817a83b801908204879acfeba8f97e33578 --- .../contacts/activities/SimImportActivityTest.java | 18 +++-- .../contacts/database/SimContactDaoTests.java | 94 ++++++++-------------- .../android/contacts/tests/FakeSimContactDao.java | 1 - .../contacts/tests/SimContactsTestHelper.java | 47 +++++------ 4 files changed, 65 insertions(+), 95 deletions(-) (limited to 'tests/src/com') 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 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 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 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 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 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 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 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() { -- cgit v1.2.3