Support new query parameters introduced in Iaab5c38a

The new query parameters controls which field hone.CONTENT_FILTER_URI should
search.

Bug 6662259

Change-Id: I6f4cb4439dc4414cb96cf6a9fc66d0758ddf9faa
diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java
index 5d96b97..c321489 100644
--- a/src/com/android/providers/contacts/ContactsProvider2.java
+++ b/src/com/android/providers/contacts/ContactsProvider2.java
@@ -5395,14 +5395,25 @@
                 }
 
                 if (uri.getPathSegments().size() > 2) {
-                    String filterParam = uri.getLastPathSegment();
-                    StringBuilder sb = new StringBuilder();
+                    final String filterParam = uri.getLastPathSegment();
+                    final boolean searchDisplayName = uri.getBooleanQueryParameter(
+                            Phone.SEARCH_DISPLAY_NAME_KEY, true);
+                    final boolean searchPhoneNumber = uri.getBooleanQueryParameter(
+                            Phone.SEARCH_PHONE_NUMBER_KEY, true);
+
+                    final StringBuilder sb = new StringBuilder();
                     sb.append(" AND (");
 
                     boolean hasCondition = false;
-                    final String ftsMatchQuery = SearchIndexManager.getFtsMatchQuery(
-                            filterParam, FtsQueryBuilder.UNSCOPED_NORMALIZING);
-                    if (ftsMatchQuery.length() > 0) {
+                    // TODO This only searches the name field.  Search other fields, such as
+                    // note, nickname, as well.  (Which should be disabled by default.)
+                    // Fix EMAILS_FILTER too.
+                    final String ftsMatchQuery =
+                            searchDisplayName
+                            ? SearchIndexManager.getFtsMatchQuery(filterParam,
+                                    FtsQueryBuilder.UNSCOPED_NORMALIZING)
+                            : null;
+                    if (!TextUtils.isEmpty(ftsMatchQuery)) {
                         sb.append(Data.RAW_CONTACT_ID + " IN " +
                                 "(SELECT " + RawContactsColumns.CONCRETE_ID +
                                 " FROM " + Tables.SEARCH_INDEX +
@@ -5415,35 +5426,37 @@
                         hasCondition = true;
                     }
 
-                    String number = PhoneNumberUtils.normalizeNumber(filterParam);
-                    if (!TextUtils.isEmpty(number)) {
-                        if (hasCondition) {
-                            sb.append(" OR ");
+                    if (searchPhoneNumber) {
+                        final String number = PhoneNumberUtils.normalizeNumber(filterParam);
+                        if (!TextUtils.isEmpty(number)) {
+                            if (hasCondition) {
+                                sb.append(" OR ");
+                            }
+                            sb.append(Data._ID +
+                                    " IN (SELECT DISTINCT " + PhoneLookupColumns.DATA_ID
+                                    + " FROM " + Tables.PHONE_LOOKUP
+                                    + " WHERE " + PhoneLookupColumns.NORMALIZED_NUMBER + " LIKE '");
+                            sb.append(number);
+                            sb.append("%')");
+                            hasCondition = true;
                         }
-                        sb.append(Data._ID +
-                                " IN (SELECT DISTINCT " + PhoneLookupColumns.DATA_ID
-                                + " FROM " + Tables.PHONE_LOOKUP
-                                + " WHERE " + PhoneLookupColumns.NORMALIZED_NUMBER + " LIKE '");
-                        sb.append(number);
-                        sb.append("%')");
-                        hasCondition = true;
-                    }
 
-                    if (!TextUtils.isEmpty(filterParam) && match == CALLABLES_FILTER) {
-                        // If the request is via Callable uri, Sip addresses matching the filter
-                        // parameter should be returned.
-                        if (hasCondition) {
-                            sb.append(" OR ");
+                        if (!TextUtils.isEmpty(filterParam) && match == CALLABLES_FILTER) {
+                            // If the request is via Callable uri, Sip addresses matching the filter
+                            // parameter should be returned.
+                            if (hasCondition) {
+                                sb.append(" OR ");
+                            }
+                            sb.append("(");
+                            sb.append(mimeTypeIsSipExpression);
+                            sb.append(" AND ((" + Data.DATA1 + " LIKE ");
+                            DatabaseUtils.appendEscapedSQLString(sb, filterParam + '%');
+                            sb.append(") OR (" + Data.DATA1 + " LIKE ");
+                            // Users may want SIP URIs starting from "sip:"
+                            DatabaseUtils.appendEscapedSQLString(sb, "sip:"+ filterParam + '%');
+                            sb.append(")))");
+                            hasCondition = true;
                         }
-                        sb.append("(");
-                        sb.append(mimeTypeIsSipExpression);
-                        sb.append(" AND ((" + Data.DATA1 + " LIKE ");
-                        DatabaseUtils.appendEscapedSQLString(sb, filterParam + '%');
-                        sb.append(") OR (" + Data.DATA1 + " LIKE ");
-                        // Users may want SIP URIs starting from "sip:"
-                        DatabaseUtils.appendEscapedSQLString(sb, "sip:"+ filterParam + '%');
-                        sb.append(")))");
-                        hasCondition = true;
                     }
 
                     if (!hasCondition) {
diff --git a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
index aa34b1a..5706925 100644
--- a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
+++ b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
@@ -1172,6 +1172,41 @@
         assertStoredValues(filterUri6, new ContentValues[] {values1, values2, values3} );
     }
 
+    public void testPhonesFilterSearchParams() {
+        final long rid1 = createRawContactWithName("Dad", null);
+        insertPhoneNumber(rid1, "123-456-7890");
+
+        final long rid2 = createRawContactWithName("Mam", null);
+        insertPhoneNumber(rid2, "323-123-4567");
+
+        // By default, "dad" will match both the display name and the phone number.
+        // Because "dad" is "323" after the dialpad conversion, it'll match "Mam" too.
+        assertStoredValues(
+                Phone.CONTENT_FILTER_URI.buildUpon().appendPath("dad").build(),
+                cv(Phone.DISPLAY_NAME, "Dad", Phone.NUMBER, "123-456-7890"),
+                cv(Phone.DISPLAY_NAME, "Mam", Phone.NUMBER, "323-123-4567")
+                );
+        assertStoredValues(
+                Phone.CONTENT_FILTER_URI.buildUpon().appendPath("dad")
+                    .appendQueryParameter(Phone.SEARCH_PHONE_NUMBER_KEY, "0")
+                    .build(),
+                cv(Phone.DISPLAY_NAME, "Dad", Phone.NUMBER, "123-456-7890")
+                );
+
+        assertStoredValues(
+                Phone.CONTENT_FILTER_URI.buildUpon().appendPath("dad")
+                    .appendQueryParameter(Phone.SEARCH_DISPLAY_NAME_KEY, "0")
+                    .build(),
+                cv(Phone.DISPLAY_NAME, "Mam", Phone.NUMBER, "323-123-4567")
+                );
+        assertStoredValues(
+                Phone.CONTENT_FILTER_URI.buildUpon().appendPath("dad")
+                    .appendQueryParameter(Phone.SEARCH_DISPLAY_NAME_KEY, "0")
+                    .appendQueryParameter(Phone.SEARCH_PHONE_NUMBER_KEY, "0")
+                    .build()
+                );
+    }
+
     public void testPhoneLookup() {
         ContentValues values = new ContentValues();
         values.put(RawContacts.CUSTOM_RINGTONE, "d");