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;
     }
 }