am 8697c675: am c4de8153: am ee3253ca: am 43f9a00c: am cc9ce6b1: Dealing with some edge cases with soft deleted contacts. 1. Exlude soft deleted contacts for aggregator algorithm upgrade. 2. Make sure to update the contacts.name_raw_contact_id column for soft deleted
* commit '8697c675d86672d5f491042c0aeb7ae4ab3476ee':
Dealing with some edge cases with soft deleted contacts. 1. Exlude soft deleted contacts for aggregator algorithm upgrade. 2. Make sure to update the contacts.name_raw_contact_id column for soft deleted raw contact.
diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java
index 73b88e8..d760b7b 100644
--- a/src/com/android/providers/contacts/ContactsProvider2.java
+++ b/src/com/android/providers/contacts/ContactsProvider2.java
@@ -3862,17 +3862,20 @@
// because it's in a trigger. Consider removing trigger and replacing with java code.
// This has to happen before the raw contact is deleted since it relies on the number
// of raw contacts.
- ContactsTableUtil.deleteContactIfSingleton(db, rawContactId);
+ if (ContactsTableUtil.deleteContactIfSingleton(db, rawContactId) == 0) {
+ mAggregator.get().updateAggregateData(mTransactionContext.get(), contactId);
+ }
db.delete(Tables.PRESENCE, PresenceColumns.RAW_CONTACT_ID + "=" + rawContactId, null);
int count = db.delete(Tables.RAW_CONTACTS, RawContacts._ID + "=" + rawContactId, null);
- mAggregator.get().updateAggregateData(mTransactionContext.get(), contactId);
mTransactionContext.get().markRawContactChangedOrDeletedOrInserted(rawContactId);
return count;
}
- ContactsTableUtil.deleteContactIfSingleton(db, rawContactId);
+ if (ContactsTableUtil.deleteContactIfSingleton(db, rawContactId) == 0) {
+ mAggregator.get().updateAggregateData(mTransactionContext.get(), contactId);
+ }
return markRawContactAsDeleted(db, rawContactId, callerIsSyncAdapter);
}
diff --git a/src/com/android/providers/contacts/aggregation/AbstractContactAggregator.java b/src/com/android/providers/contacts/aggregation/AbstractContactAggregator.java
index cfbad32..c18c1d6 100644
--- a/src/com/android/providers/contacts/aggregation/AbstractContactAggregator.java
+++ b/src/com/android/providers/contacts/aggregation/AbstractContactAggregator.java
@@ -602,7 +602,8 @@
final int count;
final Cursor cursor = db.rawQuery("SELECT " + RawContacts._ID +
" FROM " + Tables.RAW_CONTACTS +
- " WHERE " + RawContactsColumns.AGGREGATION_NEEDED + "=1", null);
+ " WHERE " + RawContactsColumns.AGGREGATION_NEEDED + "=1 AND " +
+ RawContacts.DELETED + "=0", null);
try {
count = cursor.getCount();
cursor.moveToPosition(-1);
diff --git a/src/com/android/providers/contacts/database/ContactsTableUtil.java b/src/com/android/providers/contacts/database/ContactsTableUtil.java
index dbc3d3e..bb29f90 100644
--- a/src/com/android/providers/contacts/database/ContactsTableUtil.java
+++ b/src/com/android/providers/contacts/database/ContactsTableUtil.java
@@ -118,7 +118,7 @@
* Delete the aggregate contact if it has no constituent raw contacts other than the supplied
* one.
*/
- public static void deleteContactIfSingleton(SQLiteDatabase db, long rawContactId) {
+ public static int deleteContactIfSingleton(SQLiteDatabase db, long rawContactId) {
// This query will find a contact id if the contact has a raw contacts other than the one
// passed in.
final String sql = "select " + ContactsContract.RawContacts.CONTACT_ID + ", count(1)"
@@ -136,11 +136,12 @@
if (numRawContacts == 1) {
// Only one raw contact, we can delete the parent.
- deleteContact(db, contactId);
+ return deleteContact(db, contactId);
}
}
} finally {
MoreCloseables.closeQuietly(cursor);
}
+ return 0;
}
}