diff options
author | Yorke Lee <yorkelee@google.com> | 2012-09-12 17:47:36 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2012-09-12 17:47:36 -0700 |
commit | 634d21a343cd2b2e7d1cd5e668f4b45da7c59344 (patch) | |
tree | e9145f6ff54b9882ae17c1804f581ef8a912e8f5 | |
parent | 0394f454b6ac76cbecb49f560700164dd3d0148f (diff) | |
parent | a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffc (diff) | |
download | packages_providers_ContactsProvider-634d21a343cd2b2e7d1cd5e668f4b45da7c59344.zip packages_providers_ContactsProvider-634d21a343cd2b2e7d1cd5e668f4b45da7c59344.tar.gz packages_providers_ContactsProvider-634d21a343cd2b2e7d1cd5e668f4b45da7c59344.tar.bz2 |
am a6f9ec00: Skip suffix match if mUseStrictPhoneNumberComparison is true
* commit 'a6f9ec007fb108f9f82e73bfdaef7ffc5e67cffc':
Skip suffix match if mUseStrictPhoneNumberComparison is true
-rw-r--r-- | src/com/android/providers/contacts/ContactsDatabaseHelper.java | 59 | ||||
-rw-r--r-- | tests/src/com/android/providers/contacts/ContactsProvider2Test.java | 58 |
2 files changed, 95 insertions, 22 deletions
diff --git a/src/com/android/providers/contacts/ContactsDatabaseHelper.java b/src/com/android/providers/contacts/ContactsDatabaseHelper.java index 81112aa..95008d7 100644 --- a/src/com/android/providers/contacts/ContactsDatabaseHelper.java +++ b/src/com/android/providers/contacts/ContactsDatabaseHelper.java @@ -4541,28 +4541,33 @@ public class ContactsDatabaseHelper extends SQLiteOpenHelper { sb.append(" OR "); } if (hasNumber) { - int numberLen = number.length(); - sb.append(" lookup.len <= "); - sb.append(numberLen); - sb.append(" AND substr("); - DatabaseUtils.appendEscapedSQLString(sb, number); - sb.append(','); - sb.append(numberLen); - sb.append(" - lookup.len + 1) = lookup.normalized_number"); - - // Some countries (e.g. Brazil) can have incoming calls which contain only the local - // number (no country calling code and no area code). This case is handled below. - // Details see b/5197612. - // This also handles a Gingerbread -> ICS upgrade issue; see b/5638376. - sb.append(" OR ("); - sb.append(" lookup.len > "); - sb.append(numberLen); - sb.append(" AND substr(lookup.normalized_number,"); - sb.append("lookup.len + 1 - "); - sb.append(numberLen); - sb.append(") = "); - DatabaseUtils.appendEscapedSQLString(sb, number); - sb.append(")"); + // skip the suffix match entirely if we are using strict number comparison + if (!mUseStrictPhoneNumberComparison) { + int numberLen = number.length(); + sb.append(" lookup.len <= "); + sb.append(numberLen); + sb.append(" AND substr("); + DatabaseUtils.appendEscapedSQLString(sb, number); + sb.append(','); + sb.append(numberLen); + sb.append(" - lookup.len + 1) = lookup.normalized_number"); + + // Some countries (e.g. Brazil) can have incoming calls which contain only the local + // number (no country calling code and no area code). This case is handled below. + // Details see b/5197612. + // This also handles a Gingerbread -> ICS upgrade issue; see b/5638376. + sb.append(" OR ("); + sb.append(" lookup.len > "); + sb.append(numberLen); + sb.append(" AND substr(lookup.normalized_number,"); + sb.append("lookup.len + 1 - "); + sb.append(numberLen); + sb.append(") = "); + DatabaseUtils.appendEscapedSQLString(sb, number); + sb.append(")"); + } else { + sb.append("0"); + } } sb.append(')'); } @@ -5291,6 +5296,16 @@ public class ContactsDatabaseHelper extends SQLiteOpenHelper { } @NeededForTesting + /* package */ void setUseStrictPhoneNumberComparisonForTest(boolean useStrict) { + mUseStrictPhoneNumberComparison = useStrict; + } + + @NeededForTesting + /* package */ boolean getUseStrictPhoneNumberComparisonForTest() { + return mUseStrictPhoneNumberComparison; + } + + @NeededForTesting /* package */ String querySearchIndexContentForTest(long contactId) { return DatabaseUtils.stringForQuery(getReadableDatabase(), "SELECT " + SearchIndexColumns.CONTENT + diff --git a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java index 8970e5d..77789c3 100644 --- a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java +++ b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java @@ -67,6 +67,7 @@ import android.test.suitebuilder.annotation.LargeTest; import android.text.TextUtils; import com.android.internal.util.ArrayUtils; +import com.android.providers.contacts.ContactsDatabaseHelper; import com.android.providers.contacts.ContactsDatabaseHelper.AggregationExceptionColumns; import com.android.providers.contacts.ContactsDatabaseHelper.DataUsageStatColumns; import com.android.providers.contacts.ContactsDatabaseHelper.DbProperties; @@ -1431,6 +1432,63 @@ public class ContactsProvider2Test extends BaseContactsProvider2Test { PhoneLookup.CONTENT_FILTER_URI, "4 879 601 0101"), null, null)); } + public void testPhoneLookupUseStrictPhoneNumberCompare() { + // Test lookup cases when mUseStrictPhoneNumberComparison is true + final ContactsProvider2 cp = (ContactsProvider2) getProvider(); + final ContactsDatabaseHelper dbHelper = cp.getThreadActiveDatabaseHelperForTest(); + // Get and save the original value of mUseStrictPhoneNumberComparison so that we + // can restore it when we are done with the test + final boolean oldUseStrict = dbHelper.getUseStrictPhoneNumberComparisonForTest(); + dbHelper.setUseStrictPhoneNumberComparisonForTest(true); + + + try { + String fullNumber = "01197297427289"; + ContentValues values = new ContentValues(); + values.put(RawContacts.CUSTOM_RINGTONE, "d"); + values.put(RawContacts.SEND_TO_VOICEMAIL, 1); + long rawContactId = ContentUris.parseId( + mResolver.insert(RawContacts.CONTENT_URI, values)); + insertStructuredName(rawContactId, "Senor", "Chang"); + insertPhoneNumber(rawContactId, fullNumber); + insertPhoneNumber(rawContactId, "5103337596"); + insertPhoneNumber(rawContactId, "+19012345678"); + // One match for full number + assertEquals(1, getCount(Uri.withAppendedPath( + PhoneLookup.CONTENT_FILTER_URI, fullNumber), null, null)); + + // No matches for extra digit at the front + assertEquals(0, getCount(Uri.withAppendedPath( + PhoneLookup.CONTENT_FILTER_URI, "55103337596"), null, null)); + // No matches for mispelled area code + assertEquals(0, getCount(Uri.withAppendedPath( + PhoneLookup.CONTENT_FILTER_URI, "5123337596"), null, null)); + + // One match for matching number with dashes + assertEquals(1, getCount(Uri.withAppendedPath( + PhoneLookup.CONTENT_FILTER_URI, "510-333-7596"), null, null)); + + // One match for matching number with international code + assertEquals(1, getCount(Uri.withAppendedPath( + PhoneLookup.CONTENT_FILTER_URI, "+1-510-333-7596"), null, null)); + values.clear(); + + // No matches for extra 0 in front + assertEquals(0, getCount(Uri.withAppendedPath( + PhoneLookup.CONTENT_FILTER_URI, "0-510-333-7596"), null, null)); + values.clear(); + + // No matches for different country code + assertEquals(0, getCount(Uri.withAppendedPath( + PhoneLookup.CONTENT_FILTER_URI, "+819012345678"), null, null)); + values.clear(); + } finally { + // restore the original value of mUseStrictPhoneNumberComparison + // upon test completion or failure + dbHelper.setUseStrictPhoneNumberComparisonForTest(oldUseStrict); + } + } + public void testPhoneUpdate() { ContentValues values = new ContentValues(); Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values); |