aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorke Lee <yorkelee@google.com>2012-09-12 17:47:36 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2012-09-12 17:47:36 -0700
commit634d21a343cd2b2e7d1cd5e668f4b45da7c59344 (patch)
treee9145f6ff54b9882ae17c1804f581ef8a912e8f5
parent0394f454b6ac76cbecb49f560700164dd3d0148f (diff)
parenta6f9ec007fb108f9f82e73bfdaef7ffc5e67cffc (diff)
downloadContactsProvider-634d21a343cd2b2e7d1cd5e668f4b45da7c59344.tar.gz
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.java59
-rw-r--r--tests/src/com/android/providers/contacts/ContactsProvider2Test.java58
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 81112aa4..95008d78 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 8970e5d2..77789c3e 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);