diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java
index 5ae434b..a7b59d6 100644
--- a/src/com/android/providers/contacts/ContactsProvider2.java
+++ b/src/com/android/providers/contacts/ContactsProvider2.java
@@ -890,6 +890,8 @@
      * Note {@link Groups#SUMMARY_COUNT} doesn't exist in groups/view_groups.
      * When we detect this column being requested, we join {@link Joins#GROUP_MEMBER_COUNT} to
      * generate it.
+     *
+     * TODO Support SUMMARY_GROUP_COUNT_PER_ACCOUNT too.  See also queryLocal().
      */
     private static final ProjectionMap sGroupsSummaryProjectionMap = ProjectionMap.builder()
             .addAll(sGroupsProjectionMap)
@@ -898,27 +900,7 @@
                     "(SELECT COUNT(" + ContactsColumns.CONCRETE_ID + ") FROM "
                         + Tables.CONTACTS_JOIN_RAW_CONTACTS_DATA_FILTERED_BY_GROUPMEMBERSHIP
                         + " WHERE " + Contacts.HAS_PHONE_NUMBER + ")")
-            .build();
-
-    // This is only exposed as hidden API for the contacts app, so we can be very specific in
-    // the filtering
-    private static final ProjectionMap sGroupsSummaryProjectionMapWithGroupCountPerAccount =
-            ProjectionMap.builder()
-            .addAll(sGroupsSummaryProjectionMap)
-            .add(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT,
-                    "(SELECT COUNT(*) FROM " + Views.GROUPS + " WHERE "
-                        + "(" + Groups.ACCOUNT_NAME + "="
-                            + GroupsColumns.CONCRETE_ACCOUNT_NAME
-                            + " AND "
-                            + Groups.ACCOUNT_TYPE + "=" + GroupsColumns.CONCRETE_ACCOUNT_TYPE
-                            + " AND "
-                            + Groups.DELETED + "=0 AND "
-                            + Groups.FAVORITES + "=0 AND "
-                            + Groups.AUTO_ADD + "=0"
-                        + ")"
-                        + " GROUP BY "
-                            + Groups.ACCOUNT_NAME + ", " + Groups.ACCOUNT_TYPE
-                   + ")")
+            .add(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, "0") // Always returns 0 for now.
             .build();
 
     /** Contains the agg_exceptions columns */
@@ -5842,17 +5824,18 @@
             }
 
             case GROUPS_SUMMARY: {
-                final boolean returnGroupCountPerAccount =
-                        readBooleanQueryParameter(uri, Groups.PARAM_RETURN_GROUP_COUNT_PER_ACCOUNT,
-                                false);
                 String tables = Views.GROUPS + " AS " + Tables.GROUPS;
                 if (ContactsDatabaseHelper.isInProjection(projection, Groups.SUMMARY_COUNT)) {
                     tables = tables + Joins.GROUP_MEMBER_COUNT;
                 }
+                if (ContactsDatabaseHelper.isInProjection(projection,
+                        Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT)) {
+                    // TODO Add join for this column too (and update the projection map)
+                    // TODO Also remove Groups.PARAM_RETURN_GROUP_COUNT_PER_ACCOUNT when it works.
+                    Log.w(TAG, Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT + " is not supported yet");
+                }
                 qb.setTables(tables);
-                qb.setProjectionMap(returnGroupCountPerAccount ?
-                        sGroupsSummaryProjectionMapWithGroupCountPerAccount
-                        : sGroupsSummaryProjectionMap);
+                qb.setProjectionMap(sGroupsSummaryProjectionMap);
                 appendAccountFromParameter(qb, uri);
                 groupBy = GroupsColumns.CONCRETE_ID;
                 break;
diff --git a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
index 599f1e7..ef8d995 100644
--- a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
+++ b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
@@ -558,6 +558,7 @@
                 Groups.SYNC4,
                 Groups.SUMMARY_COUNT,
                 Groups.SUMMARY_WITH_PHONES,
+                Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT,
         });
     }
 
@@ -2316,19 +2317,29 @@
 
         assertStoredValues(Groups.CONTENT_SUMMARY_URI, new ContentValues[] { v1, v2, v3 });
 
-        final Uri uri = Groups.CONTENT_SUMMARY_URI.buildUpon()
-                .appendQueryParameter(Groups.PARAM_RETURN_GROUP_COUNT_PER_ACCOUNT, "true")
-                .build();
-        v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 1);
-        v2.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 2);
-        v3.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 2);
+        final Uri uri = Groups.CONTENT_SUMMARY_URI;
+
+        // TODO Once SUMMARY_GROUP_COUNT_PER_ACCOUNT is supported remove all the if(false).
+        if (false) {
+            v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 1);
+            v2.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 2);
+            v3.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 2);
+        } else {
+            v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0);
+            v2.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0);
+            v3.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0);
+        }
         assertStoredValues(uri, new ContentValues[] { v1, v2, v3 });
 
         // Introduce another group in account1, testing SUMMARY_GROUP_COUNT_PER_ACCOUNT correctly
         // reflects the change.
         final long groupId4 = createGroup(account1, "sourceId4", "title4");
-        v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT,
-                v1.getAsInteger(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT) + 1);
+        if (false) {
+            v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT,
+                    v1.getAsInteger(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT) + 1);
+        } else {
+            v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0);
+        }
         ContentValues v4 = new ContentValues();
         v4.put(Groups._ID, groupId4);
         v4.put(Groups.TITLE, "title4");
@@ -2337,8 +2348,12 @@
         v4.put(Groups.ACCOUNT_TYPE, account1.type);
         v4.put(Groups.SUMMARY_COUNT, 0);
         v4.put(Groups.SUMMARY_WITH_PHONES, 0);
-        v4.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT,
-                v1.getAsInteger(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT));
+        if (false) {
+            v4.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT,
+                    v1.getAsInteger(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT));
+        } else {
+            v4.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0);
+        }
         assertStoredValues(uri, new ContentValues[] { v1, v2, v3, v4 });
 
         // We change the tables dynamically according to the requested projection.
