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]);