Fixing legacy API support for phone lookup.
diff --git a/src/com/android/providers/contacts/LegacyApiSupport.java b/src/com/android/providers/contacts/LegacyApiSupport.java
index 18fd816..6c7e53b 100644
--- a/src/com/android/providers/contacts/LegacyApiSupport.java
+++ b/src/com/android/providers/contacts/LegacyApiSupport.java
@@ -24,7 +24,6 @@
import com.android.providers.contacts.OpenHelper.Tables;
import android.accounts.Account;
-import android.accounts.AccountManager;
import android.app.SearchManager;
import android.content.ContentUris;
import android.content.ContentValues;
@@ -52,7 +51,6 @@
import android.provider.ContactsContract.CommonDataKinds.Photo;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
-import android.util.Log;
import java.util.HashMap;
@@ -94,6 +92,7 @@
private static final int DELETED_PEOPLE = 30;
private static final int DELETED_GROUPS = 31;
private static final int SEARCH_SUGGESTIONS = 32;
+ private static final int PHONES_FILTER = 33;
private static final String PEOPLE_JOINS =
" LEFT OUTER JOIN data name ON (raw_contacts._id = name.raw_contact_id"
@@ -209,6 +208,7 @@
private static final HashMap<String, String> sPhotoProjectionMap;
private static final HashMap<String, String> sPresenceProjectionMap;
+
static {
// Contacts URI matching table
@@ -261,7 +261,7 @@
matcher.addURI(authority, "deleted_groups", DELETED_GROUPS);
matcher.addURI(authority, "phones", PHONES);
// matcher.addURI(authority, "phones_with_presence", PHONES_WITH_PRESENCE);
-// matcher.addURI(authority, "phones/filter/*", PHONES_FILTER);
+ matcher.addURI(authority, "phones/filter/*", PHONES_FILTER);
// matcher.addURI(authority, "phones/filter_name/*", PHONES_FILTER_NAME);
// matcher.addURI(authority, "phones/mobile_filter_name/*",
// PHONES_MOBILE_FILTER_NAME);
@@ -1242,6 +1242,19 @@
qb.appendWhere(uri.getPathSegments().get(1));
break;
+ case PHONES_FILTER:
+ qb.setTables(LegacyTables.PHONES);
+ qb.setProjectionMap(sPhoneProjectionMap);
+ applyRawContactsAccount(qb, uri);
+ if (uri.getPathSegments().size() > 2) {
+ String filterParam = uri.getLastPathSegment();
+ StringBuilder sb = new StringBuilder();
+ sb.append(" AND person =");
+ mOpenHelper.appendRawContactsByPhoneNumberAsNestedQuery(sb, filterParam);
+ qb.appendWhere(sb.toString());
+ }
+ break;
+
case PEOPLE_PHONES:
qb.setTables(LegacyTables.PHONES);
qb.setProjectionMap(sPhoneProjectionMap);
diff --git a/src/com/android/providers/contacts/OpenHelper.java b/src/com/android/providers/contacts/OpenHelper.java
index f6952a3..73b51ca 100644
--- a/src/com/android/providers/contacts/OpenHelper.java
+++ b/src/com/android/providers/contacts/OpenHelper.java
@@ -1242,6 +1242,7 @@
mNameLookupInsert.executeInsert();
}
+ @Deprecated
public static void buildPhoneLookupQuery(SQLiteQueryBuilder qb, String number,
boolean joinWithMimetypes) {
final String normalizedNumber = PhoneNumberUtils.toCallerIDMinMatch(number);
@@ -1262,6 +1263,20 @@
qb.appendWhere(")");
}
+ public void appendRawContactsByPhoneNumberAsNestedQuery(StringBuilder sb, String number) {
+ final String normalizedNumber = PhoneNumberUtils.toCallerIDMinMatch(number);
+ sb.append("(SELECT DISTINCT raw_contact_id"
+ + " FROM " + Tables.RAW_CONTACTS
+ + ", (SELECT data_id FROM phone_lookup "
+ + "WHERE (phone_lookup.normalized_number GLOB '");
+ sb.append(normalizedNumber);
+ sb.append("*')) AS lookup, " + Tables.DATA
+ + " WHERE lookup.data_id=data._id"
+ + " AND data.raw_contact_id=raw_contacts._id"
+ + " AND PHONE_NUMBERS_EQUAL(data." + Phone.NUMBER + ", ");
+ DatabaseUtils.appendEscapedSQLString(sb, number);
+ sb.append("))");
+ }
/**
* Loads common nickname mappings into the database.
diff --git a/tests/src/com/android/providers/contacts/LegacyContactsProviderTest.java b/tests/src/com/android/providers/contacts/LegacyContactsProviderTest.java
index 487f5dd..466a06f 100644
--- a/tests/src/com/android/providers/contacts/LegacyContactsProviderTest.java
+++ b/tests/src/com/android/providers/contacts/LegacyContactsProviderTest.java
@@ -323,6 +323,29 @@
Phones.TYPE_CUSTOM, Phones.TYPE_OTHER, Phones.LABEL);
}
+ public void testPhonesFilterQuery() {
+ ContentValues values = new ContentValues();
+ putContactValues(values);
+ Uri personUri = mResolver.insert(People.CONTENT_URI, values);
+ long personId = ContentUris.parseId(personUri);
+
+ values.clear();
+ values.put(Phones.PERSON_ID, personId);
+ values.put(Phones.TYPE, Phones.TYPE_CUSTOM);
+ values.put(Phones.LABEL, "Directory");
+ values.put(Phones.NUMBER, "1-800-4664-411");
+ values.put(Phones.ISPRIMARY, 1);
+
+ Uri uri = mResolver.insert(Phones.CONTENT_URI, values);
+
+ Uri filterUri1 = Uri.withAppendedPath(Phones.CONTENT_FILTER_URL, "8004664411");
+ assertStoredValues(filterUri1, values);
+
+ Uri filterUri2 = Uri.withAppendedPath(Phones.CONTENT_FILTER_URL, "7773334444");
+ assertEquals(0, getCount(filterUri2, null, null));
+ }
+
+
public void testEmailInsert() {
assertContactMethodInsert(Contacts.KIND_EMAIL, ContactMethods.TYPE_CUSTOM,
"Some other way", "foo@acme.com", null, true);