Merge "Don't show the invisible in frequent" into jb-dev
diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java
index 481cdde..53fa471 100644
--- a/src/com/android/providers/contacts/ContactsProvider2.java
+++ b/src/com/android/providers/contacts/ContactsProvider2.java
@@ -3310,7 +3310,7 @@
                 args[1] = Uri.encode(lookupKey);
                 lookupQb.appendWhere(Contacts._ID + "=? AND " + Contacts.LOOKUP_KEY + "=?");
                 Cursor c = query(mActiveDb.get(), lookupQb, null, selection, args, null, null,
-                        null, null);
+                        null, null, null);
                 try {
                     if (c.getCount() == 1) {
                         // contact was unmodified so go ahead and delete it
@@ -4869,6 +4869,7 @@
 
         SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
         String groupBy = null;
+        String having = null;
         String limit = getLimit(uri);
         boolean snippetDeferred = false;
 
@@ -5178,6 +5179,7 @@
                 setTablesAndProjectionMapForContacts(qb, uri, projection, true);
                 qb.setProjectionMap(sStrequentFrequentProjectionMap);
                 groupBy = Contacts._ID;
+                having = Contacts._ID + " IN " + Tables.DEFAULT_DIRECTORY;
                 if (!TextUtils.isEmpty(sortOrder)) {
                     sortOrder = FREQUENT_ORDER_BY + ", " + sortOrder;
                 } else {
@@ -5714,7 +5716,7 @@
                     qb.setStrict(true);
                     boolean foundResult = false;
                     Cursor cursor = query(mActiveDb.get(), qb, projection, selection, selectionArgs,
-                            sortOrder, groupBy, limit, cancellationSignal);
+                            sortOrder, groupBy, null, limit, cancellationSignal);
                     try {
                         if (cursor.getCount() > 0) {
                             foundResult = true;
@@ -5905,7 +5907,7 @@
 
         Cursor cursor =
                 query(mActiveDb.get(), qb, projection, selection, selectionArgs, sortOrder, groupBy,
-                limit, cancellationSignal);
+                having, limit, cancellationSignal);
 
         if (readBooleanQueryParameter(uri, ContactCounts.ADDRESS_BOOK_INDEX_EXTRAS, false)) {
             bundleFastScrollingIndexExtras(cursor, uri, mActiveDb.get(), qb, selection,
@@ -5919,14 +5921,15 @@
         return cursor;
     }
 
+
     private Cursor query(final SQLiteDatabase db, SQLiteQueryBuilder qb, String[] projection,
             String selection, String[] selectionArgs, String sortOrder, String groupBy,
-            String limit, CancellationSignal cancellationSignal) {
+            String having, String limit, CancellationSignal cancellationSignal) {
         if (projection != null && projection.length == 1
                 && BaseColumns._COUNT.equals(projection[0])) {
             qb.setProjectionMap(sCountProjectionMap);
         }
-        final Cursor c = qb.query(db, projection, selection, selectionArgs, groupBy, null,
+        final Cursor c = qb.query(db, projection, selection, selectionArgs, groupBy, having,
                 sortOrder, limit, cancellationSignal);
         if (c != null) {
             c.setNotificationUri(getContext().getContentResolver(), ContactsContract.AUTHORITY_URI);
@@ -5958,7 +5961,7 @@
         args[1] = Uri.encode(lookupKey);
         lookupQb.appendWhere(contactIdColumn + "=? AND " + lookupKeyColumn + "=?");
         Cursor c = query(db, lookupQb, projection, selection, args, sortOrder,
-                groupBy, limit, cancellationSignal);
+                groupBy, null, limit, cancellationSignal);
         if (c.getCount() != 0) {
             return c;
         }
diff --git a/tests/src/com/android/providers/contacts/BaseContactsProvider2Test.java b/tests/src/com/android/providers/contacts/BaseContactsProvider2Test.java
index 8bdd9d6..1154186 100644
--- a/tests/src/com/android/providers/contacts/BaseContactsProvider2Test.java
+++ b/tests/src/com/android/providers/contacts/BaseContactsProvider2Test.java
@@ -18,6 +18,7 @@
 
 import static com.android.providers.contacts.ContactsActor.PACKAGE_GREY;
 
+import com.android.providers.contacts.ContactsDatabaseHelper.Tables;
 import com.android.providers.contacts.util.Hex;
 import com.android.providers.contacts.util.MockClock;
 import com.google.android.collect.Sets;
@@ -33,6 +34,7 @@
 import android.database.sqlite.SQLiteDatabase;
 import android.net.Uri;
 import android.os.Bundle;
+import android.provider.BaseColumns;
 import android.provider.ContactsContract;
 import android.provider.ContactsContract.AggregationExceptions;
 import android.provider.ContactsContract.CommonDataKinds.Email;
@@ -570,6 +572,14 @@
         assertEquals(1, mResolver.update(AggregationExceptions.CONTENT_URI, values, null, null));
     }
 
+    protected void markInvisible(long contactId) {
+        // There's no api for this, so we just tweak the DB directly.
+        SQLiteDatabase db = ((ContactsProvider2) getProvider()).getDatabaseHelper()
+                .getWritableDatabase();
+        db.execSQL("DELETE FROM " + Tables.DEFAULT_DIRECTORY +
+                " WHERE " + BaseColumns._ID + "=" + contactId);
+    }
+
     protected Cursor queryRawContact(long rawContactId) {
         return mResolver.query(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId),
                 null, null, null, null);
diff --git a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
index d9721c8..aa34b1a 100644
--- a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
+++ b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
@@ -2084,6 +2084,29 @@
                 new ContentValues[] {});
     }
 
+    public void testQueryContactFrequentExcludingInvisible() {
+        ContentValues values1 = new ContentValues();
+        final String email1 = "a@acme.com";
+        final long cid1 = createContact(values1, "Noah", "Tever", "18004664411",
+                email1, StatusUpdates.OFFLINE, 0, 0, 0, 0);
+        ContentValues values2 = new ContentValues();
+        final String email2 = "b@acme.com";
+        final long cid2 = createContact(values2, "Sam", "Times", "18004664412",
+                email2, StatusUpdates.INVISIBLE, 0, 0, 0, 0);
+
+        sendFeedback(email1, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values1);
+        sendFeedback(email2, DataUsageFeedback.USAGE_TYPE_LONG_TEXT, values2);
+
+        // First, we have two contacts in frequent.
+        assertStoredValues(Contacts.CONTENT_FREQUENT_URI, new ContentValues[] {values2, values1});
+
+        // Contact 2 goes invisible.
+        markInvisible(cid2);
+
+        // Now we have only 1 frequent.
+        assertStoredValues(Contacts.CONTENT_FREQUENT_URI, new ContentValues[] {values1});
+    }
+
     public void testQueryContactGroup() {
         long groupId = createGroup(null, "testGroup", "Test Group");
 
diff --git a/tests/src/com/android/providers/contacts/aggregation/ContactAggregatorTest.java b/tests/src/com/android/providers/contacts/aggregation/ContactAggregatorTest.java
index d7e1479..8de5890 100644
--- a/tests/src/com/android/providers/contacts/aggregation/ContactAggregatorTest.java
+++ b/tests/src/com/android/providers/contacts/aggregation/ContactAggregatorTest.java
@@ -926,12 +926,8 @@
         // Contact 2 should be suggested.
         assertSuggestions(contactId1, contactId2);
 
-        // Make contact 2 invisible.  There's no good api for this, so we just tweak the DB
-        // directly.
-        SQLiteDatabase db = ((ContactsProvider2) getProvider()).getDatabaseHelper()
-                .getWritableDatabase();
-        db.execSQL("DELETE FROM " + Tables.DEFAULT_DIRECTORY +
-                " WHERE " + BaseColumns._ID + "=" + contactId2);
+        // Make contact 2 invisible.
+        markInvisible(contactId2);
 
         // Now contact 2 shuldn't be suggested.
         assertSuggestions(contactId1, new long[0]);