summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTyler Gunn <tgunn@google.com>2014-06-30 19:57:44 -0700
committerTyler Gunn <tgunn@google.com>2014-06-30 19:57:44 -0700
commit778df2417da0c0186862b25519ce65ed633a9b6d (patch)
tree8ce37261ab90bf1f598d308f1b97079e8117159d
parent90343852ba1309aa4471cead018d50761a13e131 (diff)
downloadpackages_providers_ContactsProvider-778df2417da0c0186862b25519ce65ed633a9b6d.zip
packages_providers_ContactsProvider-778df2417da0c0186862b25519ce65ed633a9b6d.tar.gz
packages_providers_ContactsProvider-778df2417da0c0186862b25519ce65ed633a9b6d.tar.bz2
Changing call log adapter to normalize phone number where possible.
Bug: 15616526 Change-Id: Id8fe981a622bdea786a48cbadf9ff08289ae3987
-rw-r--r--src/com/android/providers/contacts/ContactsDatabaseHelper.java60
-rw-r--r--src/com/android/providers/contacts/DefaultCallLogInsertionHelper.java11
-rw-r--r--tests/src/com/android/providers/contacts/CallLogInsertionHelperTest.java74
3 files changed, 144 insertions, 1 deletions
diff --git a/src/com/android/providers/contacts/ContactsDatabaseHelper.java b/src/com/android/providers/contacts/ContactsDatabaseHelper.java
index 8572531..8034841 100644
--- a/src/com/android/providers/contacts/ContactsDatabaseHelper.java
+++ b/src/com/android/providers/contacts/ContactsDatabaseHelper.java
@@ -114,7 +114,7 @@ public class ContactsDatabaseHelper extends SQLiteOpenHelper {
* 900-999 L
* </pre>
*/
- static final int DATABASE_VERSION = 902;
+ static final int DATABASE_VERSION = 903;
public interface Tables {
public static final String CONTACTS = "contacts";
@@ -2747,6 +2747,11 @@ public class ContactsDatabaseHelper extends SQLiteOpenHelper {
oldVersion = 902;
}
+ if (oldVersion < 903) {
+ upgradeToVersion903(db);
+ oldVersion = 903;
+ }
+
if (upgradeViewsAndTriggers) {
createContactsViews(db);
createGroupsView(db);
@@ -4056,6 +4061,59 @@ public class ContactsDatabaseHelper extends SQLiteOpenHelper {
db.execSQL("ALTER TABLE calls ADD "+ Calls.SUBSCRIPTION_ID + " TEXT;");
}
+ /**
+ * Searches for any calls in the call log with no normalized phone number and attempts to add
+ * one if the number can be normalized.
+ *
+ * @param db The database.
+ */
+ private void upgradeToVersion903(SQLiteDatabase db) {
+ // Find the calls in the call log with no normalized phone number.
+ final Cursor c = db.rawQuery(
+ "SELECT _id, number, countryiso FROM calls " +
+ " WHERE (normalized_number is null OR normalized_number = '') " +
+ " AND countryiso != '' AND countryiso is not null " +
+ " AND number != '' AND number is not null;",
+ null
+ );
+
+ try {
+ if (c.getCount() == 0) {
+ return;
+ }
+
+ db.beginTransaction();
+ try {
+ c.moveToPosition(-1);
+ while (c.moveToNext()) {
+ final long callId = c.getLong(0);
+ final String unNormalizedNumber = c.getString(1);
+ final String countryIso = c.getString(2);
+
+ // Attempt to get normalized number.
+ String normalizedNumber = PhoneNumberUtils
+ .formatNumberToE164(unNormalizedNumber, countryIso);
+
+ if (!TextUtils.isEmpty(normalizedNumber)) {
+ db.execSQL("UPDATE calls set normalized_number = ? " +
+ "where _id = ?;",
+ new String[]{
+ normalizedNumber,
+ String.valueOf(callId),
+ }
+ );
+ }
+ }
+
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ }
+ } finally {
+ c.close();
+ }
+ }
+
public String extractHandleFromEmailAddress(String email) {
Rfc822Token[] tokens = Rfc822Tokenizer.tokenize(email);
if (tokens.length == 0) {
diff --git a/src/com/android/providers/contacts/DefaultCallLogInsertionHelper.java b/src/com/android/providers/contacts/DefaultCallLogInsertionHelper.java
index 9e90197..1e23275 100644
--- a/src/com/android/providers/contacts/DefaultCallLogInsertionHelper.java
+++ b/src/com/android/providers/contacts/DefaultCallLogInsertionHelper.java
@@ -19,6 +19,8 @@ package com.android.providers.contacts;
import android.content.ContentValues;
import android.content.Context;
import android.provider.CallLog.Calls;
+import android.telephony.PhoneNumberUtils;
+import android.text.TextUtils;
import com.android.i18n.phonenumbers.NumberParseException;
import com.android.i18n.phonenumbers.PhoneNumberUtil;
@@ -74,6 +76,15 @@ import java.util.Set;
values.put(Calls.NUMBER_PRESENTATION, Calls.PRESENTATION_UNKNOWN);
values.put(Calls.NUMBER, "");
}
+
+ // Check for a normalized number; if not present attempt to determine one now.
+ if (!values.containsKey(Calls.CACHED_NORMALIZED_NUMBER) &&
+ !TextUtils.isEmpty(number)) {
+ String normalizedNumber = PhoneNumberUtils.formatNumberToE164(number, countryIso);
+ if (!TextUtils.isEmpty(normalizedNumber)) {
+ values.put(Calls.CACHED_NORMALIZED_NUMBER, normalizedNumber);
+ }
+ }
}
private String getCurrentCountryIso() {
diff --git a/tests/src/com/android/providers/contacts/CallLogInsertionHelperTest.java b/tests/src/com/android/providers/contacts/CallLogInsertionHelperTest.java
new file mode 100644
index 0000000..7bb88a8
--- /dev/null
+++ b/tests/src/com/android/providers/contacts/CallLogInsertionHelperTest.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.providers.contacts;
+
+import android.content.ContentValues;
+import android.provider.CallLog.Calls;
+
+import android.test.AndroidTestCase;
+
+/**
+ * Test cases for {@link com.android.providers.contacts.DefaultCallLogInsertionHelper}.
+ */
+public class CallLogInsertionHelperTest extends AndroidTestCase {
+
+ /**
+ * The default insertion helper under test.
+ */
+ private CallLogInsertionHelper mInsertionHelper =
+ DefaultCallLogInsertionHelper.getInstance(this.getContext());
+
+ /**
+ * Tests cases where valid, normalizable phone numbers are provided.
+ */
+ public void testValidNumber() {
+ checkNormalization("650-555-1212", "+16505551212");
+ checkNormalization("1-650-555-1212", "+16505551212");
+ checkNormalization("+16505551212", "+16505551212");
+ checkNormalization("011-81-3-6384-9000", "+81363849000");
+ }
+
+ /**
+ * Test cases where invalid unformatted numbers are entered.
+ */
+ public void testInvalidNumber() {
+ checkNormalization("", null);
+ // Invalid area code.
+ checkNormalization("663-555-1212", null);
+ // No area code.
+ checkNormalization("555-1212", null);
+ // Number as it should be dialed from Japan.
+ checkNormalization("03-6384-9000", null);
+ // SIP address
+ checkNormalization("test@sip.org", null);
+ }
+
+ /**
+ * Runs the DefaultCallLogInsertionHelper to determine if it produces the correct normalized
+ * phone number.
+ *
+ * @param number The unformatted phone number.
+ * @param expectedNormalized The expected normalized number.
+ */
+ private void checkNormalization(String number, String expectedNormalized) {
+ ContentValues values = new ContentValues();
+ values.put(Calls.NUMBER, number);
+ mInsertionHelper.addComputedValues(values);
+
+ assertEquals(expectedNormalized, values.getAsString(Calls.CACHED_NORMALIZED_NUMBER));
+ }
+}