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