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