diff options
-rw-r--r-- | src/com/android/providers/contacts/ContactsProvider2.java | 75 | ||||
-rw-r--r-- | tests/src/com/android/providers/contacts/ContactsProvider2Test.java | 35 |
2 files changed, 79 insertions, 31 deletions
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 @@ public class ContactsProvider2 extends AbstractContactsProvider } 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 @@ public class ContactsProvider2 extends AbstractContactsProvider 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 @@ public class ContactsProvider2Test extends BaseContactsProvider2Test { 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"); |