Fix G+ crash during account switch
Make sure Raw_contacts / groups deletion works with account column selection.
Bug 5970976
Change-Id: If32f716576d6e4362f72f32289aebce012d19e2f
diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java
index 9710bb1..eadccb8 100644
--- a/src/com/android/providers/contacts/ContactsProvider2.java
+++ b/src/com/android/providers/contacts/ContactsProvider2.java
@@ -3302,7 +3302,7 @@
case RAW_CONTACTS:
case PROFILE_RAW_CONTACTS: {
int numDeletes = 0;
- Cursor c = mActiveDb.get().query(Tables.RAW_CONTACTS,
+ Cursor c = mActiveDb.get().query(Views.RAW_CONTACTS,
new String[]{RawContacts._ID, RawContacts.CONTACT_ID},
appendAccountIdToSelection(uri, selection), selectionArgs,
null, null, null);
@@ -3352,7 +3352,7 @@
case GROUPS: {
int numDeletes = 0;
- Cursor c = mActiveDb.get().query(Tables.GROUPS, Projections.ID,
+ Cursor c = mActiveDb.get().query(Views.GROUPS, Projections.ID,
appendAccountIdToSelection(uri, selection), selectionArgs,
null, null, null);
try {
diff --git a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
index 046dec8..a722bd0 100644
--- a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
+++ b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
@@ -2327,6 +2327,65 @@
}
}
+ public void testGroupDelete_byAccountSelection() {
+ final Account account1 = new Account("accountName1", "accountType1");
+ final Account account2 = new Account("accountName2", "accountType2");
+
+ final long groupId1 = createGroup(account1, "sourceId1", "title1");
+ final long groupId2 = createGroup(account2, "sourceId2", "title2");
+ final long groupId3 = createGroup(account2, "sourceId3", "title3");
+
+ final int numDeleted = mResolver.delete(Groups.CONTENT_URI,
+ Groups.ACCOUNT_NAME + "=? AND " + Groups.ACCOUNT_TYPE + "=?",
+ new String[]{account2.name, account2.type});
+ assertEquals(2, numDeleted);
+
+ ContentValues v1 = new ContentValues();
+ v1.put(Groups._ID, groupId1);
+ v1.put(Groups.DELETED, 0);
+
+ ContentValues v2 = new ContentValues();
+ v2.put(Groups._ID, groupId2);
+ v2.put(Groups.DELETED, 1);
+
+ ContentValues v3 = new ContentValues();
+ v3.put(Groups._ID, groupId3);
+ v3.put(Groups.DELETED, 1);
+
+ assertStoredValues(Groups.CONTENT_URI, new ContentValues[] { v1, v2, v3 });
+ }
+
+ public void testGroupDelete_byAccountParam() {
+ final Account account1 = new Account("accountName1", "accountType1");
+ final Account account2 = new Account("accountName2", "accountType2");
+
+ final long groupId1 = createGroup(account1, "sourceId1", "title1");
+ final long groupId2 = createGroup(account2, "sourceId2", "title2");
+ final long groupId3 = createGroup(account2, "sourceId3", "title3");
+
+ final int numDeleted = mResolver.delete(
+ Groups.CONTENT_URI.buildUpon()
+ .appendQueryParameter(Groups.ACCOUNT_NAME, account2.name)
+ .appendQueryParameter(Groups.ACCOUNT_TYPE, account2.type)
+ .build(),
+ null, null);
+ assertEquals(2, numDeleted);
+
+ ContentValues v1 = new ContentValues();
+ v1.put(Groups._ID, groupId1);
+ v1.put(Groups.DELETED, 0);
+
+ ContentValues v2 = new ContentValues();
+ v2.put(Groups._ID, groupId2);
+ v2.put(Groups.DELETED, 1);
+
+ ContentValues v3 = new ContentValues();
+ v3.put(Groups._ID, groupId3);
+ v3.put(Groups.DELETED, 1);
+
+ assertStoredValues(Groups.CONTENT_URI, new ContentValues[] { v1, v2, v3 });
+ }
+
public void testGroupSummaryQuery() {
final Account account1 = new Account("accountName1", "accountType1");
final Account account2 = new Account("accountName2", "accountType2");
@@ -4492,7 +4551,7 @@
assertEquals(1, getCount(Contacts.CONTENT_URI, Contacts._ID + "=" + contactId, null));
}
- public void testRawContactDeletionWithAccounts() {
+ public void testRawContactDeletion_byAccountParam() {
long rawContactId = createRawContact(mAccount);
Uri uri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
@@ -4511,7 +4570,8 @@
.appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_NAME, mAccountTwo.name)
.appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_TYPE, mAccountTwo.type)
.build();
- mResolver.delete(deleteWithWrongAccountUri, null, null);
+ int numDeleted = mResolver.delete(deleteWithWrongAccountUri, null, null);
+ assertEquals(0, numDeleted);
assertStoredValue(uri, RawContacts.DELETED, "0");
@@ -4521,7 +4581,29 @@
.appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_NAME, mAccount.name)
.appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_TYPE, mAccount.type)
.build();
- mResolver.delete(deleteWithCorrectAccountUri, null, null);
+ numDeleted = mResolver.delete(deleteWithCorrectAccountUri, null, null);
+ assertEquals(1, numDeleted);
+
+ assertStoredValue(uri, RawContacts.DELETED, "1");
+ }
+
+ public void testRawContactDeletion_byAccountSelection() {
+ long rawContactId = createRawContact(mAccount);
+ Uri uri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
+
+ // Do not delete if we are deleting with wrong account.
+ int numDeleted = mResolver.delete(RawContacts.CONTENT_URI,
+ RawContacts.ACCOUNT_NAME + "=? AND " + RawContacts.ACCOUNT_TYPE + "=?",
+ new String[] {mAccountTwo.name, mAccountTwo.type});
+ assertEquals(0, numDeleted);
+
+ assertStoredValue(uri, RawContacts.DELETED, "0");
+
+ // Delete if we are deleting with correct account.
+ numDeleted = mResolver.delete(RawContacts.CONTENT_URI,
+ RawContacts.ACCOUNT_NAME + "=? AND " + RawContacts.ACCOUNT_TYPE + "=?",
+ new String[] {mAccount.name, mAccount.type});
+ assertEquals(1, numDeleted);
assertStoredValue(uri, RawContacts.DELETED, "1");
}