From 778df2417da0c0186862b25519ce65ed633a9b6d Mon Sep 17 00:00:00 2001 From: Tyler Gunn Date: Mon, 30 Jun 2014 19:57:44 -0700 Subject: Changing call log adapter to normalize phone number where possible. Bug: 15616526 Change-Id: Id8fe981a622bdea786a48cbadf9ff08289ae3987 --- .../providers/contacts/ContactsDatabaseHelper.java | 60 +++++++++++++++++- .../contacts/DefaultCallLogInsertionHelper.java | 11 ++++ .../contacts/CallLogInsertionHelperTest.java | 74 ++++++++++++++++++++++ 3 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 tests/src/com/android/providers/contacts/CallLogInsertionHelperTest.java 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 * */ - 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)); + } +} -- cgit v1.1