Remove LegacyContactImporter

Contact data migration from donut is no longer supported.

Bug 5664971

Change-Id: I01c56752d93bb0f8e2a0e6ff81285f1971a7c893
diff --git a/proguard.flags b/proguard.flags
index f56ffff..3117066 100644
--- a/proguard.flags
+++ b/proguard.flags
@@ -11,3 +11,9 @@
 -keep class ** {
   *** *ForTest(...);
 }
+
+# Any class or method annotated with NeededForTesting.
+-keep @com.android.providers.contacts.util.NeededForTesting class *
+-keepclassmembers class * {
+@com.android.providers.contacts.util.NeededForTesting *;
+}
diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java
index 30b06d4..c9751d8 100644
--- a/src/com/android/providers/contacts/ContactsProvider2.java
+++ b/src/com/android/providers/contacts/ContactsProvider2.java
@@ -44,6 +44,7 @@
 import com.android.providers.contacts.ContactsDatabaseHelper.Views;
 import com.android.providers.contacts.SearchIndexManager.FtsQueryBuilder;
 import com.android.providers.contacts.util.DbQueryUtils;
+import com.android.providers.contacts.util.NeededForTesting;
 import com.android.vcard.VCardComposer;
 import com.android.vcard.VCardConfig;
 import com.google.android.collect.Lists;
@@ -182,7 +183,6 @@
 
     private static final int BACKGROUND_TASK_INITIALIZE = 0;
     private static final int BACKGROUND_TASK_OPEN_WRITE_ACCESS = 1;
-    private static final int BACKGROUND_TASK_IMPORT_LEGACY_CONTACTS = 2;
     private static final int BACKGROUND_TASK_UPDATE_ACCOUNTS = 3;
     private static final int BACKGROUND_TASK_UPDATE_LOCALE = 4;
     private static final int BACKGROUND_TASK_UPGRADE_AGGREGATION_ALGORITHM = 5;
@@ -212,13 +212,6 @@
      */
     private static final String PREAUTHORIZED_URI_TOKEN = "perm_token";
 
-    /**
-     * Property key for the legacy contact import version. The need for a version
-     * as opposed to a boolean flag is that if we discover bugs in the contact import process,
-     * we can trigger re-import by incrementing the import version.
-     */
-    private static final String PROPERTY_CONTACTS_IMPORTED = "contacts_imported_v1";
-    private static final int PROPERTY_CONTACTS_IMPORT_VERSION = 1;
     private static final String PREF_LOCALE = "locale";
 
     private static final String PROPERTY_AGGREGATION_ALGORITHM = "aggregation_v2";
@@ -1443,7 +1436,6 @@
                 DEFAULT_PREAUTHORIZED_URI_EXPIRATION);
 
         scheduleBackgroundTask(BACKGROUND_TASK_INITIALIZE);
-        scheduleBackgroundTask(BACKGROUND_TASK_IMPORT_LEGACY_CONTACTS);
         scheduleBackgroundTask(BACKGROUND_TASK_UPDATE_ACCOUNTS);
         scheduleBackgroundTask(BACKGROUND_TASK_UPDATE_LOCALE);
         scheduleBackgroundTask(BACKGROUND_TASK_UPGRADE_AGGREGATION_ALGORITHM);
@@ -1550,13 +1542,6 @@
                 break;
             }
 
-            case BACKGROUND_TASK_IMPORT_LEGACY_CONTACTS: {
-                if (isLegacyContactImportNeeded()) {
-                    importLegacyContactsInBackground();
-                }
-                break;
-            }
-
             case BACKGROUND_TASK_UPDATE_ACCOUNTS: {
                 Context context = getContext();
                 if (!mAccountUpdateListenerRegistered) {
@@ -1860,99 +1845,11 @@
         return profileMode != null && profileMode;
     }
 
-    protected boolean isLegacyContactImportNeeded() {
-        int version = Integer.parseInt(
-                mContactsHelper.getProperty(PROPERTY_CONTACTS_IMPORTED, "0"));
-        return version < PROPERTY_CONTACTS_IMPORT_VERSION;
-    }
-
-    protected LegacyContactImporter getLegacyContactImporter() {
-        return new LegacyContactImporter(getContext(), this);
-    }
-
-    /**
-     * Imports legacy contacts as a background task.
-     */
-    private void importLegacyContactsInBackground() {
-        Log.v(TAG, "Importing legacy contacts");
-        setProviderStatus(ProviderStatus.STATUS_UPGRADING);
-
-        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
-        mContactsHelper.setLocale(this, mCurrentLocale);
-        prefs.edit().putString(PREF_LOCALE, mCurrentLocale.toString()).commit();
-
-        LegacyContactImporter importer = getLegacyContactImporter();
-        if (importLegacyContacts(importer)) {
-            onLegacyContactImportSuccess();
-        } else {
-            onLegacyContactImportFailure();
-        }
-    }
-
-    /**
-     * Unlocks the provider and declares that the import process is complete.
-     */
-    private void onLegacyContactImportSuccess() {
-        NotificationManager nm =
-            (NotificationManager)getContext().getSystemService(Context.NOTIFICATION_SERVICE);
-        nm.cancel(LEGACY_IMPORT_FAILED_NOTIFICATION);
-
-        // Store a property in the database indicating that the conversion process succeeded
-        mContactsHelper.setProperty(PROPERTY_CONTACTS_IMPORTED,
-                String.valueOf(PROPERTY_CONTACTS_IMPORT_VERSION));
-        setProviderStatus(ProviderStatus.STATUS_NORMAL);
-        Log.v(TAG, "Completed import of legacy contacts");
-    }
-
-    /**
-     * Announces the provider status and keeps the provider locked.
-     */
-    private void onLegacyContactImportFailure() {
-        Context context = getContext();
-        NotificationManager nm =
-            (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
-
-        // Show a notification
-        Notification n = new Notification(android.R.drawable.stat_notify_error,
-                context.getString(R.string.upgrade_out_of_memory_notification_ticker),
-                System.currentTimeMillis());
-        n.setLatestEventInfo(context,
-                context.getString(R.string.upgrade_out_of_memory_notification_title),
-                context.getString(R.string.upgrade_out_of_memory_notification_text),
-                PendingIntent.getActivity(context, 0, new Intent(Intents.UI.LIST_DEFAULT), 0));
-        n.flags |= Notification.FLAG_NO_CLEAR | Notification.FLAG_ONGOING_EVENT;
-
-        nm.notify(LEGACY_IMPORT_FAILED_NOTIFICATION, n);
-
-        setProviderStatus(ProviderStatus.STATUS_UPGRADE_OUT_OF_MEMORY);
-        Log.v(TAG, "Failed to import legacy contacts");
-
-        // Do not let any database changes until this issue is resolved.
-        mOkToOpenAccess = false;
-    }
-
-    @VisibleForTesting
-    boolean importLegacyContacts(LegacyContactImporter importer) {
-        boolean aggregatorEnabled = mContactAggregator.isEnabled();
-        mContactAggregator.setEnabled(false);
-        try {
-            if (importer.importContacts()) {
-
-                // TODO aggregate all newly added raw contacts
-                mContactAggregator.setEnabled(aggregatorEnabled);
-                return true;
-            }
-        } catch (Throwable e) {
-           Log.e(TAG, "Legacy contact import failed", e);
-        }
-        mEstimatedStorageRequirement = importer.getEstimatedStorageRequirement();
-        return false;
-    }
-
     /**
      * Wipes all data from the contacts database.
      */
-    /* package */ void wipeData() {
+    @NeededForTesting
+    void wipeData() {
         mContactsHelper.wipeData();
         mProfileHelper.wipeData();
         mContactsPhotoStore.clear();
@@ -2070,18 +1967,11 @@
     @Override
     public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
         if (mWriteAccessLatch != null) {
-            // We are stuck trying to upgrade contacts db.  The only update request
-            // allowed in this case is an update of provider status, which will trigger
-            // an attempt to upgrade contacts again.
+            // Update on PROVIDER_STATUS used to be used as a trigger to re-start legacy contact
+            // import.  Now that we no longer support it, we just ignore it.
             int match = sUriMatcher.match(uri);
             if (match == PROVIDER_STATUS) {
-                Integer newStatus = values.getAsInteger(ProviderStatus.STATUS);
-                if (newStatus != null && newStatus == ProviderStatus.STATUS_UPGRADING) {
-                    scheduleBackgroundTask(BACKGROUND_TASK_IMPORT_LEGACY_CONTACTS);
-                    return 1;
-                } else {
-                    return 0;
-                }
+                return 0;
             }
         }
         waitForAccess(mWriteAccessLatch);
diff --git a/src/com/android/providers/contacts/LegacyContactImporter.java b/src/com/android/providers/contacts/LegacyContactImporter.java
deleted file mode 100644
index 239f08d..0000000
--- a/src/com/android/providers/contacts/LegacyContactImporter.java
+++ /dev/null
@@ -1,1310 +0,0 @@
-/*
- * Copyright (C) 2009 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 com.android.providers.contacts.ContactsDatabaseHelper.DataColumns;
-import com.android.providers.contacts.ContactsDatabaseHelper.PhoneColumns;
-import com.android.providers.contacts.ContactsDatabaseHelper.PhoneLookupColumns;
-import com.android.providers.contacts.ContactsDatabaseHelper.RawContactsColumns;
-import com.android.providers.contacts.ContactsDatabaseHelper.Tables;
-
-import android.content.ContentResolver;
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.database.DatabaseUtils;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteException;
-import android.database.sqlite.SQLiteStatement;
-import android.provider.CallLog.Calls;
-import android.provider.ContactsContract.Contacts;
-import android.provider.ContactsContract.Data;
-import android.provider.ContactsContract.Groups;
-import android.provider.ContactsContract.RawContacts;
-import android.provider.ContactsContract.CommonDataKinds.Email;
-import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
-import android.provider.ContactsContract.CommonDataKinds.Im;
-import android.provider.ContactsContract.CommonDataKinds.Note;
-import android.provider.ContactsContract.CommonDataKinds.Organization;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.provider.ContactsContract.CommonDataKinds.Photo;
-import android.provider.ContactsContract.CommonDataKinds.StructuredName;
-import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
-import android.telephony.PhoneNumberUtils;
-import android.text.TextUtils;
-import android.util.Log;
-
-import java.io.File;
-
-public class LegacyContactImporter {
-
-    public static final String TAG = "LegacyContactImporter";
-
-    private static final int MAX_ATTEMPTS = 5;
-    private static final int DELAY_BETWEEN_ATTEMPTS = 2000;
-
-    public static final String DEFAULT_ACCOUNT_TYPE = "com.google";
-    private static final String DATABASE_NAME = "contacts.db";
-
-    private static final int INSERT_BATCH_SIZE = 200;
-
-    /**
-     * Estimated increase in database size after import.
-     */
-    private static final long DATABASE_SIZE_MULTIPLIER = 4;
-
-    /**
-     * Estimated minimum database size in megabytes.
-     */
-    private static final long DATABASE_MIN_SIZE = 5;
-
-    private final Context mContext;
-    private final ContactsProvider2 mContactsProvider;
-    private final NameLookupBuilder mNameLookupBuilder;
-
-    private ContactsDatabaseHelper mDbHelper;
-    private ContentValues mValues = new ContentValues();
-    private ContentResolver mResolver;
-    private boolean mPhoneticNameAvailable = true;
-
-    private SQLiteDatabase mSourceDb;
-    private SQLiteDatabase mTargetDb;
-
-    private NameSplitter mNameSplitter;
-    private int mBatchCounter;
-
-    private int mContactCount;
-
-    private long mStructuredNameMimetypeId;
-    private long mNoteMimetypeId;
-    private long mOrganizationMimetypeId;
-    private long mPhoneMimetypeId;
-    private long mEmailMimetypeId;
-    private long mImMimetypeId;
-    private long mPostalMimetypeId;
-    private long mPhotoMimetypeId;
-    private long mGroupMembershipMimetypeId;
-
-    private long mEstimatedStorageRequirement = DATABASE_MIN_SIZE;
-
-    public LegacyContactImporter(Context context, ContactsProvider2 contactsProvider) {
-        mContext = context;
-        mContactsProvider = contactsProvider;
-        mResolver = mContactsProvider.getContext().getContentResolver();
-        mNameLookupBuilder = mContactsProvider.getNameLookupBuilder();
-    }
-
-    public boolean importContacts() throws Exception {
-        String path = mContext.getDatabasePath(DATABASE_NAME).getPath();
-        File file = new File(path);
-        if (!file.exists()) {
-            Log.i(TAG, "Legacy contacts database does not exist at " + path);
-            return true;
-        }
-
-        Log.w(TAG, "Importing contacts from " + path);
-
-        for (int i = 0; i < MAX_ATTEMPTS; i++) {
-            try {
-                mSourceDb = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
-                importContactsFromLegacyDb();
-                Log.i(TAG, "Imported legacy contacts: " + mContactCount);
-                mContactsProvider.notifyChange();
-                return true;
-
-            } catch (SQLiteException e) {
-                Log.e(TAG, "Database import exception. Will retry in " + DELAY_BETWEEN_ATTEMPTS
-                        + "ms", e);
-
-                // We could get a "database locked" exception here, in which
-                // case we should retry
-                Thread.sleep(DELAY_BETWEEN_ATTEMPTS);
-
-            } finally {
-                if (mSourceDb != null) {
-                    mSourceDb.close();
-                }
-            }
-        }
-
-        long oldDatabaseSize = file.length();
-        mEstimatedStorageRequirement = oldDatabaseSize * DATABASE_SIZE_MULTIPLIER / 1024 / 1024;
-        if (mEstimatedStorageRequirement < DATABASE_MIN_SIZE) {
-            mEstimatedStorageRequirement = DATABASE_MIN_SIZE;
-        }
-
-        return false;
-    }
-
-    public long getEstimatedStorageRequirement() {
-        return mEstimatedStorageRequirement;
-    }
-
-    private void importContactsFromLegacyDb() {
-        int version = mSourceDb.getVersion();
-
-        // Upgrade to version 78 was the latest that wiped out data.  Might as well follow suit
-        // and ignore earlier versions.
-        if (version < 78) {
-            return;
-        }
-
-        if (version < 80) {
-            mPhoneticNameAvailable = false;
-        }
-
-        mDbHelper = (ContactsDatabaseHelper)mContactsProvider.getDatabaseHelper();
-        mTargetDb = mDbHelper.getWritableDatabase();
-
-        mStructuredNameMimetypeId = mDbHelper.getMimeTypeId(StructuredName.CONTENT_ITEM_TYPE);
-        mNoteMimetypeId = mDbHelper.getMimeTypeId(Note.CONTENT_ITEM_TYPE);
-        mOrganizationMimetypeId = mDbHelper.getMimeTypeId(Organization.CONTENT_ITEM_TYPE);
-        mPhoneMimetypeId = mDbHelper.getMimeTypeId(Phone.CONTENT_ITEM_TYPE);
-        mEmailMimetypeId = mDbHelper.getMimeTypeId(Email.CONTENT_ITEM_TYPE);
-        mImMimetypeId = mDbHelper.getMimeTypeId(Im.CONTENT_ITEM_TYPE);
-        mPostalMimetypeId = mDbHelper.getMimeTypeId(StructuredPostal.CONTENT_ITEM_TYPE);
-        mPhotoMimetypeId = mDbHelper.getMimeTypeId(Photo.CONTENT_ITEM_TYPE);
-        mGroupMembershipMimetypeId =
-                mDbHelper.getMimeTypeId(GroupMembership.CONTENT_ITEM_TYPE);
-
-        mNameSplitter = mContactsProvider.getNameSplitter();
-
-        mTargetDb.beginTransaction();
-        try {
-            checkForImportFailureTest();
-
-            /*
-             * At this point there should be no data in the contacts provider, but in case
-             * some was inserted by mistake, we should remove it. The main reason for this
-             * is that we will be preserving original contact IDs and don't want to run into
-             * any collisions.
-             */
-            mContactsProvider.wipeData();
-
-            importGroups();
-            importPeople();
-            importOrganizations();
-            importPhones();
-            importContactMethods();
-            importPhotos();
-            importGroupMemberships();
-            updateDisplayNamesAndLookupKeys();
-
-            // Deleted contacts should be inserted after everything else, because
-            // the legacy table does not provide an _ID field - the _ID field
-            // will be autoincremented
-            importDeletedPeople();
-
-            mDbHelper.updateAllVisible();
-
-            mTargetDb.setTransactionSuccessful();
-        } finally {
-            mTargetDb.endTransaction();
-        }
-
-        importCalls();
-    }
-
-    /**
-     * This is used for simulating an import failure. Insert a row into the "settings"
-     * table with key='TEST' and then proceed with the upgrade.  Remove the record
-     * after verifying the failure handling.
-     */
-    private void checkForImportFailureTest() {
-        long isTest = DatabaseUtils.longForQuery(mSourceDb,
-                "SELECT COUNT(*) FROM settings WHERE key='TEST'", null);
-        if (isTest != 0) {
-            throw new SQLiteException("Testing import failure.");
-        }
-    }
-
-    private interface GroupsQuery {
-        String TABLE = "groups";
-
-        String[] COLUMNS = {
-                "_id", "name", "notes", "should_sync", "system_id", "_sync_account", "_sync_id",
-                "_sync_dirty",
-        };
-
-        static int ID = 0;
-        static int NAME = 1;
-        static int NOTES = 2;
-        static int SHOULD_SYNC = 3;            // TODO add this feature to Groups
-        static int SYSTEM_ID = 4;
-
-        static int _SYNC_ACCOUNT = 5;
-        static int _SYNC_ID = 6;
-        static int _SYNC_DIRTY = 7;
-    }
-
-    private interface GroupsInsert {
-        String INSERT_SQL = "INSERT INTO " + Tables.GROUPS + "(" +
-                Groups._ID + "," +
-                Groups.TITLE + "," +
-                Groups.NOTES + "," +
-                Groups.SYSTEM_ID + "," +
-                Groups.DIRTY + "," +
-                Groups.GROUP_VISIBLE + "," +
-                Groups.ACCOUNT_NAME + "," +
-                Groups.ACCOUNT_TYPE + "," +
-                Groups.SOURCE_ID +
-        ") VALUES (?,?,?,?,?,?,?,?,?)";
-
-        int ID = 1;
-        int TITLE = 2;
-        int NOTES = 3;
-        int SYSTEM_ID = 4;
-        int DIRTY = 5;
-        int GROUP_VISIBLE = 6;
-        int ACCOUNT_NAME = 7;
-        int ACCOUNT_TYPE = 8;
-        int SOURCE_ID = 9;
-    }
-
-    private void importGroups() {
-        SQLiteStatement insert = mTargetDb.compileStatement(GroupsInsert.INSERT_SQL);
-        Cursor c = mSourceDb.query(GroupsQuery.TABLE, GroupsQuery.COLUMNS, null, null,
-                null, null, null);
-        try {
-            while (c.moveToNext()) {
-                insertGroup(c, insert);
-            }
-        } finally {
-            c.close();
-            insert.close();
-        }
-    }
-
-    private void insertGroup(Cursor c, SQLiteStatement insert) {
-        long id = c.getLong(GroupsQuery.ID);
-
-        insert.bindLong(GroupsInsert.ID, id);
-        bindString(insert, GroupsInsert.TITLE, c.getString(GroupsQuery.NAME));
-        bindString(insert, GroupsInsert.NOTES, c.getString(GroupsQuery.NOTES));
-        bindString(insert, GroupsInsert.SYSTEM_ID, c.getString(GroupsQuery.SYSTEM_ID));
-        insert.bindLong(GroupsInsert.DIRTY, c.getLong(GroupsQuery._SYNC_DIRTY));
-        insert.bindLong(GroupsInsert.GROUP_VISIBLE, 1);
-
-        String account = c.getString(GroupsQuery._SYNC_ACCOUNT);
-        if (!TextUtils.isEmpty(account)) {
-            bindString(insert, GroupsInsert.ACCOUNT_NAME, account);
-            bindString(insert, GroupsInsert.ACCOUNT_TYPE, DEFAULT_ACCOUNT_TYPE);
-            bindString(insert, GroupsInsert.SOURCE_ID, c.getString(GroupsQuery._SYNC_ID));
-        } else {
-            insert.bindNull(GroupsInsert.ACCOUNT_NAME);
-            insert.bindNull(GroupsInsert.ACCOUNT_TYPE);
-            insert.bindNull(GroupsInsert.SOURCE_ID);
-        }
-        insert(insert);
-    }
-
-    private interface PeopleQuery {
-        String TABLE = "people";
-
-        String NAME_SQL =
-                "(CASE WHEN (name IS NOT NULL AND name != '') "
-                    + "THEN name "
-                + "ELSE "
-                    + "(CASE WHEN primary_organization is NOT NULL THEN "
-                        + "(SELECT company FROM organizations WHERE "
-                            + "organizations._id = primary_organization) "
-                    + "ELSE "
-                        + "(CASE WHEN primary_phone IS NOT NULL THEN "
-                            +"(SELECT number FROM phones WHERE phones._id = primary_phone) "
-                        + "ELSE "
-                            + "(CASE WHEN primary_email IS NOT NULL THEN "
-                                + "(SELECT data FROM contact_methods WHERE "
-                                    + "contact_methods._id = primary_email) "
-                            + "ELSE "
-                                + "null "
-                            + "END) "
-                        + "END) "
-                    + "END) "
-                + "END) ";
-
-
-        String[] COLUMNS_WITH_DISPLAY_NAME_WITHOUT_PHONETIC_NAME = {
-                "_id", NAME_SQL, "notes", "times_contacted", "last_time_contacted", "starred",
-                "primary_phone", "primary_organization", "primary_email", "custom_ringtone",
-                "send_to_voicemail", "_sync_account", "_sync_id", "_sync_time", "_sync_local_id",
-                "_sync_dirty",
-        };
-
-        String[] COLUMNS_WITH_DISPLAY_NAME_WITH_PHONETIC_NAME = {
-                "_id", NAME_SQL, "notes", "times_contacted", "last_time_contacted", "starred",
-                "primary_phone", "primary_organization", "primary_email", "custom_ringtone",
-                "send_to_voicemail", "_sync_account", "_sync_id", "_sync_time", "_sync_local_id",
-                "_sync_dirty", "phonetic_name",
-        };
-
-        String[] COLUMNS_WITHOUT_PHONETIC_NAME = {
-                "_id", "name", "notes", "times_contacted", "last_time_contacted", "starred",
-                "primary_phone", "primary_organization", "primary_email", "custom_ringtone",
-                "send_to_voicemail", "_sync_account", "_sync_id", "_sync_time", "_sync_local_id",
-                "_sync_dirty",
-        };
-
-        String[] COLUMNS_WITH_PHONETIC_NAME = {
-                "_id", "name", "notes", "times_contacted", "last_time_contacted", "starred",
-                "primary_phone", "primary_organization", "primary_email", "custom_ringtone",
-                "send_to_voicemail", "_sync_account", "_sync_id", "_sync_time", "_sync_local_id",
-                "_sync_dirty", "phonetic_name",
-        };
-
-        static int _ID = 0;
-        static int NAME = 1;
-        static int NOTES = 2;
-        static int TIMES_CONTACTED = 3;
-        static int LAST_TIME_CONTACTED = 4;
-        static int STARRED = 5;
-        static int PRIMARY_PHONE = 6;
-        static int PRIMARY_ORGANIZATION = 7;
-        static int PRIMARY_EMAIL = 8;
-        static int CUSTOM_RINGTONE = 9;
-        static int SEND_TO_VOICEMAIL = 10;
-
-        static int _SYNC_ACCOUNT = 11;
-        static int _SYNC_ID = 12;
-        static int _SYNC_TIME = 13;
-        static int _SYNC_LOCAL_ID = 14;
-        static int _SYNC_DIRTY = 15;
-
-        static int PHONETIC_NAME = 16;
-    }
-
-
-    private interface RawContactsInsert {
-        String INSERT_SQL = "INSERT INTO " + Tables.RAW_CONTACTS + "(" +
-                RawContacts._ID + "," +
-                RawContacts.CONTACT_ID + "," +
-                RawContacts.CUSTOM_RINGTONE + "," +
-                RawContacts.DIRTY + "," +
-                RawContacts.LAST_TIME_CONTACTED + "," +
-                RawContacts.SEND_TO_VOICEMAIL + "," +
-                RawContacts.STARRED + "," +
-                RawContacts.TIMES_CONTACTED + "," +
-                RawContacts.SYNC1 + "," +
-                RawContacts.SYNC2 + "," +
-                RawContacts.ACCOUNT_NAME + "," +
-                RawContacts.ACCOUNT_TYPE + "," +
-                RawContacts.SOURCE_ID + "," +
-                RawContactsColumns.DISPLAY_NAME +
-         ") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
-
-        int ID = 1;
-        int CONTACT_ID = 2;
-        int CUSTOM_RINGTONE = 3;
-        int DIRTY = 4;
-        int LAST_TIME_CONTACTED = 5;
-        int SEND_TO_VOICEMAIL = 6;
-        int STARRED = 7;
-        int TIMES_CONTACTED = 8;
-        int SYNC1 = 9;
-        int SYNC2 = 10;
-        int ACCOUNT_NAME = 11;
-        int ACCOUNT_TYPE = 12;
-        int SOURCE_ID = 13;
-        int DISPLAY_NAME = 14;
-    }
-
-    private interface ContactsInsert {
-        String INSERT_SQL = "INSERT INTO " + Tables.CONTACTS + "(" +
-                Contacts._ID + "," +
-                Contacts.CUSTOM_RINGTONE + "," +
-                Contacts.LAST_TIME_CONTACTED + "," +
-                Contacts.SEND_TO_VOICEMAIL + "," +
-                Contacts.STARRED + "," +
-                Contacts.TIMES_CONTACTED + "," +
-                Contacts.NAME_RAW_CONTACT_ID +
-         ") VALUES (?,?,?,?,?,?,?)";
-
-        int ID = 1;
-        int CUSTOM_RINGTONE = 2;
-        int LAST_TIME_CONTACTED = 3;
-        int SEND_TO_VOICEMAIL = 4;
-        int STARRED = 5;
-        int TIMES_CONTACTED = 6;
-        int NAME_RAW_CONTACT_ID = 7;
-    }
-
-    private interface StructuredNameInsert {
-        String INSERT_SQL = "INSERT INTO " + Tables.DATA + "(" +
-                Data.RAW_CONTACT_ID + "," +
-                DataColumns.MIMETYPE_ID + "," +
-                StructuredName.DISPLAY_NAME + "," +
-                StructuredName.PREFIX + "," +
-                StructuredName.GIVEN_NAME + "," +
-                StructuredName.MIDDLE_NAME + "," +
-                StructuredName.FAMILY_NAME + "," +
-                StructuredName.SUFFIX + "," +
-                StructuredName.FULL_NAME_STYLE + "," +
-                StructuredName.PHONETIC_FAMILY_NAME + "," +
-                StructuredName.PHONETIC_MIDDLE_NAME + "," +
-                StructuredName.PHONETIC_GIVEN_NAME + "," +
-                StructuredName.PHONETIC_NAME_STYLE +
-         ") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)";
-
-        int RAW_CONTACT_ID = 1;
-        int MIMETYPE_ID = 2;
-        int DISPLAY_NAME = 3;
-        int PREFIX = 4;
-        int GIVEN_NAME = 5;
-        int MIDDLE_NAME = 6;
-        int FAMILY_NAME = 7;
-        int SUFFIX = 8;
-        int FULL_NAME_STYLE = 9;
-        int PHONETIC_FAMILY_NAME = 10;
-        int PHONETIC_MIDDLE_NAME = 11;
-        int PHONETIC_GIVEN_NAME = 12;
-        int PHONETIC_NAME_STYLE = 13;
-    }
-
-    private interface NoteInsert {
-        String INSERT_SQL = "INSERT INTO " + Tables.DATA + "(" +
-                Data.RAW_CONTACT_ID + "," +
-                DataColumns.MIMETYPE_ID + "," +
-                Note.NOTE +
-         ") VALUES (?,?,?)";
-
-        int RAW_CONTACT_ID = 1;
-        int MIMETYPE_ID = 2;
-        int NOTE = 3;
-    }
-
-    private void importPeople() {
-        SQLiteStatement rawContactInsert = mTargetDb.compileStatement(RawContactsInsert.INSERT_SQL);
-        SQLiteStatement contactInsert = mTargetDb.compileStatement(ContactsInsert.INSERT_SQL);
-        SQLiteStatement structuredNameInsert =
-                mTargetDb.compileStatement(StructuredNameInsert.INSERT_SQL);
-        SQLiteStatement noteInsert = mTargetDb.compileStatement(NoteInsert.INSERT_SQL);
-        try {
-            String[] columns = mPhoneticNameAvailable
-                    ? PeopleQuery.COLUMNS_WITH_DISPLAY_NAME_WITH_PHONETIC_NAME
-                    : PeopleQuery.COLUMNS_WITH_DISPLAY_NAME_WITHOUT_PHONETIC_NAME;
-            Cursor c = mSourceDb.query(PeopleQuery.TABLE, columns, "name IS NULL", null, null,
-                    null, null);
-            try {
-                while (c.moveToNext()) {
-                    insertRawContact(c, rawContactInsert);
-                    insertContact(c, contactInsert);
-                    insertNote(c, noteInsert);
-                    mContactCount++;
-                }
-            } finally {
-                c.close();
-            }
-
-            columns = mPhoneticNameAvailable
-                    ? PeopleQuery.COLUMNS_WITH_PHONETIC_NAME
-                    : PeopleQuery.COLUMNS_WITHOUT_PHONETIC_NAME;
-            c = mSourceDb.query(PeopleQuery.TABLE, columns, "name IS NOT NULL", null, null, null,
-                    null);
-            try {
-                while (c.moveToNext()) {
-                    long id = insertRawContact(c, rawContactInsert);
-                    insertContact(c, contactInsert);
-                    insertStructuredName(c, structuredNameInsert);
-                    insertNote(c, noteInsert);
-                    mContactCount++;
-                }
-            } finally {
-                c.close();
-            }
-        } finally {
-            rawContactInsert.close();
-            contactInsert.close();
-            structuredNameInsert.close();
-            noteInsert.close();
-        }
-    }
-
-    private long insertRawContact(Cursor c, SQLiteStatement insert) {
-        long id = c.getLong(PeopleQuery._ID);
-        insert.bindLong(RawContactsInsert.ID, id);
-        insert.bindLong(RawContactsInsert.CONTACT_ID, id);
-        bindString(insert, RawContactsInsert.CUSTOM_RINGTONE,
-                c.getString(PeopleQuery.CUSTOM_RINGTONE));
-        bindString(insert, RawContactsInsert.DIRTY,
-                c.getString(PeopleQuery._SYNC_DIRTY));
-        insert.bindLong(RawContactsInsert.LAST_TIME_CONTACTED,
-                c.getLong(PeopleQuery.LAST_TIME_CONTACTED));
-        insert.bindLong(RawContactsInsert.SEND_TO_VOICEMAIL,
-                c.getLong(PeopleQuery.SEND_TO_VOICEMAIL));
-        insert.bindLong(RawContactsInsert.STARRED,
-                c.getLong(PeopleQuery.STARRED));
-        insert.bindLong(RawContactsInsert.TIMES_CONTACTED,
-                c.getLong(PeopleQuery.TIMES_CONTACTED));
-        bindString(insert, RawContactsInsert.SYNC1,
-                c.getString(PeopleQuery._SYNC_TIME));
-        bindString(insert, RawContactsInsert.SYNC2,
-                c.getString(PeopleQuery._SYNC_LOCAL_ID));
-        bindString(insert, RawContactsInsert.DISPLAY_NAME,
-                c.getString(PeopleQuery.NAME));
-
-        String account = c.getString(PeopleQuery._SYNC_ACCOUNT);
-        if (!TextUtils.isEmpty(account)) {
-            bindString(insert, RawContactsInsert.ACCOUNT_NAME, account);
-            bindString(insert, RawContactsInsert.ACCOUNT_TYPE, DEFAULT_ACCOUNT_TYPE);
-            bindString(insert, RawContactsInsert.SOURCE_ID, c.getString(PeopleQuery._SYNC_ID));
-        } else {
-            insert.bindNull(RawContactsInsert.ACCOUNT_NAME);
-            insert.bindNull(RawContactsInsert.ACCOUNT_TYPE);
-            insert.bindNull(RawContactsInsert.SOURCE_ID);
-        }
-        insert(insert);
-        return id;
-    }
-
-    private void insertContact(Cursor c, SQLiteStatement insert) {
-        long id = c.getLong(PeopleQuery._ID);
-        insert.bindLong(ContactsInsert.ID, id);
-        bindString(insert, ContactsInsert.CUSTOM_RINGTONE,
-                c.getString(PeopleQuery.CUSTOM_RINGTONE));
-        insert.bindLong(ContactsInsert.LAST_TIME_CONTACTED,
-                c.getLong(PeopleQuery.LAST_TIME_CONTACTED));
-        insert.bindLong(ContactsInsert.SEND_TO_VOICEMAIL,
-                c.getLong(PeopleQuery.SEND_TO_VOICEMAIL));
-        insert.bindLong(ContactsInsert.STARRED,
-                c.getLong(PeopleQuery.STARRED));
-        insert.bindLong(ContactsInsert.TIMES_CONTACTED,
-                c.getLong(PeopleQuery.TIMES_CONTACTED));
-        insert.bindLong(ContactsInsert.NAME_RAW_CONTACT_ID, id);
-
-        insert(insert);
-    }
-
-    private void insertStructuredName(Cursor c, SQLiteStatement insert) {
-        String name = c.getString(PeopleQuery.NAME);
-        if (TextUtils.isEmpty(name)) {
-            return;
-        }
-
-        long id = c.getLong(PeopleQuery._ID);
-
-        insert.bindLong(StructuredNameInsert.RAW_CONTACT_ID, id);
-        insert.bindLong(StructuredNameInsert.MIMETYPE_ID, mStructuredNameMimetypeId);
-        bindString(insert, StructuredNameInsert.DISPLAY_NAME, name);
-
-        NameSplitter.Name splitName = new NameSplitter.Name();
-        mNameSplitter.split(splitName, name);
-
-        bindString(insert, StructuredNameInsert.PREFIX,
-                splitName.getPrefix());
-        bindString(insert, StructuredNameInsert.GIVEN_NAME,
-                splitName.getGivenNames());
-        bindString(insert, StructuredNameInsert.MIDDLE_NAME,
-                splitName.getMiddleName());
-        bindString(insert, StructuredNameInsert.FAMILY_NAME,
-                splitName.getFamilyName());
-        bindString(insert, StructuredNameInsert.SUFFIX,
-                splitName.getSuffix());
-        final String joined = mNameSplitter.join(splitName, true, true);
-        bindString(insert, StructuredNameInsert.DISPLAY_NAME, joined);
-
-        if (mPhoneticNameAvailable) {
-            String phoneticName = c.getString(PeopleQuery.PHONETIC_NAME);
-            if (phoneticName != null) {
-                int index = phoneticName.indexOf(' ');
-                if (index == -1) {
-                    splitName.phoneticFamilyName = phoneticName;
-                } else {
-                    splitName.phoneticFamilyName = phoneticName.substring(0, index).trim();
-                    splitName.phoneticGivenName = phoneticName.substring(index + 1).trim();
-                }
-            }
-        }
-
-        mNameSplitter.guessNameStyle(splitName);
-
-        int fullNameStyle = splitName.getFullNameStyle();
-        insert.bindLong(StructuredNameInsert.FULL_NAME_STYLE,
-                fullNameStyle);
-        bindString(insert, StructuredNameInsert.PHONETIC_FAMILY_NAME,
-                splitName.phoneticFamilyName);
-        bindString(insert, StructuredNameInsert.PHONETIC_MIDDLE_NAME,
-                splitName.phoneticMiddleName);
-        bindString(insert, StructuredNameInsert.PHONETIC_GIVEN_NAME,
-                splitName.phoneticGivenName);
-        insert.bindLong(StructuredNameInsert.PHONETIC_NAME_STYLE,
-                splitName.phoneticNameStyle);
-
-        long dataId = insert(insert);
-
-        mNameLookupBuilder.insertNameLookup(id, dataId, name,
-                mNameSplitter.getAdjustedFullNameStyle(fullNameStyle));
-
-        if (splitName.phoneticFamilyName != null
-                || splitName.phoneticMiddleName != null
-                || splitName.phoneticGivenName != null) {
-            mDbHelper.insertNameLookupForPhoneticName(id, dataId,
-                    splitName.phoneticFamilyName,
-                    splitName.phoneticMiddleName,
-                    splitName.phoneticGivenName);
-        }
-    }
-
-    private void insertNote(Cursor c, SQLiteStatement insert) {
-        String notes = c.getString(PeopleQuery.NOTES);
-
-        if (TextUtils.isEmpty(notes)) {
-            return;
-        }
-
-        long id = c.getLong(PeopleQuery._ID);
-        insert.bindLong(NoteInsert.RAW_CONTACT_ID, id);
-        insert.bindLong(NoteInsert.MIMETYPE_ID, mNoteMimetypeId);
-        bindString(insert, NoteInsert.NOTE, notes);
-        insert(insert);
-    }
-
-    private interface OrganizationsQuery {
-        String TABLE = "organizations";
-
-        String[] COLUMNS = {
-                "person", "company", "title", "isprimary", "type", "label",
-        };
-
-        static int PERSON = 0;
-        static int COMPANY = 1;
-        static int TITLE = 2;
-        static int ISPRIMARY = 3;
-        static int TYPE = 4;
-        static int LABEL = 5;
-    }
-
-    private interface OrganizationInsert {
-        String INSERT_SQL = "INSERT INTO " + Tables.DATA + "(" +
-                Data.RAW_CONTACT_ID + "," +
-                DataColumns.MIMETYPE_ID + "," +
-                Data.IS_PRIMARY + "," +
-                Data.IS_SUPER_PRIMARY + "," +
-                Organization.COMPANY + "," +
-                Organization.TITLE + "," +
-                Organization.TYPE + "," +
-                Organization.LABEL +
-         ") VALUES (?,?,?,?,?,?,?,?)";
-
-        int RAW_CONTACT_ID = 1;
-        int MIMETYPE_ID = 2;
-        int IS_PRIMARY = 3;
-        int IS_SUPER_PRIMARY = 4;
-        int COMPANY = 5;
-        int TITLE = 6;
-        int TYPE = 7;
-        int LABEL = 8;
-    }
-
-    private void importOrganizations() {
-        SQLiteStatement insert = mTargetDb.compileStatement(OrganizationInsert.INSERT_SQL);
-        Cursor c = mSourceDb.query(OrganizationsQuery.TABLE, OrganizationsQuery.COLUMNS, null, null,
-                null, null, null);
-        try {
-            while (c.moveToNext()) {
-                insertOrganization(c, insert);
-            }
-        } finally {
-            c.close();
-            insert.close();
-        }
-    }
-
-    private void insertOrganization(Cursor c, SQLiteStatement insert) {
-        long id = c.getLong(OrganizationsQuery.PERSON);
-        insert.bindLong(OrganizationInsert.RAW_CONTACT_ID, id);
-        insert.bindLong(OrganizationInsert.MIMETYPE_ID, mOrganizationMimetypeId);
-        bindString(insert, OrganizationInsert.IS_PRIMARY, c.getString(OrganizationsQuery.ISPRIMARY));
-        bindString(insert, OrganizationInsert.IS_SUPER_PRIMARY,
-                c.getString(OrganizationsQuery.ISPRIMARY));
-        bindString(insert, OrganizationInsert.COMPANY, c.getString(OrganizationsQuery.COMPANY));
-        bindString(insert, OrganizationInsert.TITLE, c.getString(OrganizationsQuery.TITLE));
-        bindString(insert, OrganizationInsert.TYPE, c.getString(OrganizationsQuery.TYPE));
-        bindString(insert, OrganizationInsert.LABEL, c.getString(OrganizationsQuery.LABEL));
-        insert(insert);
-    }
-
-    private interface ContactMethodsQuery {
-        String TABLE = "contact_methods";
-
-        String[] COLUMNS = {
-                "person", "kind", "data", "aux_data", "type", "label", "isprimary",
-        };
-
-        static int PERSON = 0;
-        static int KIND = 1;
-        static int DATA = 2;
-        static int AUX_DATA = 3;
-        static int TYPE = 4;
-        static int LABEL = 5;
-        static int ISPRIMARY = 6;
-    }
-
-    private interface EmailInsert {
-        String INSERT_SQL = "INSERT INTO " + Tables.DATA + "(" +
-                Data.RAW_CONTACT_ID + "," +
-                DataColumns.MIMETYPE_ID + "," +
-                Data.IS_PRIMARY + "," +
-                Data.IS_SUPER_PRIMARY + "," +
-                Email.DATA + "," +
-                Email.TYPE + "," +
-                Email.LABEL + "," +
-                Data.DATA14 +
-         ") VALUES (?,?,?,?,?,?,?,?)";
-
-        int RAW_CONTACT_ID = 1;
-        int MIMETYPE_ID = 2;
-        int IS_PRIMARY = 3;
-        int IS_SUPER_PRIMARY = 4;
-        int DATA = 5;
-        int TYPE = 6;
-        int LABEL = 7;
-        int AUX_DATA = 8;
-    }
-
-    private interface ImInsert {
-        String INSERT_SQL = "INSERT INTO " + Tables.DATA + "(" +
-                Data.RAW_CONTACT_ID + "," +
-                DataColumns.MIMETYPE_ID + "," +
-                Data.IS_PRIMARY + "," +
-                Data.IS_SUPER_PRIMARY + "," +
-                Im.DATA + "," +
-                Im.TYPE + "," +
-                Im.LABEL + "," +
-                Data.DATA14 +
-         ") VALUES (?,?,?,?,?,?,?,?)";
-
-        int RAW_CONTACT_ID = 1;
-        int MIMETYPE_ID = 2;
-        int IS_PRIMARY = 3;
-        int IS_SUPER_PRIMARY = 4;
-        int DATA = 5;
-        int TYPE = 6;
-        int LABEL = 7;
-        int AUX_DATA = 8;
-    }
-
-    private interface PostalInsert {
-        String INSERT_SQL = "INSERT INTO " + Tables.DATA + "(" +
-                Data.RAW_CONTACT_ID + "," +
-                DataColumns.MIMETYPE_ID + "," +
-                Data.IS_PRIMARY + "," +
-                Data.IS_SUPER_PRIMARY + "," +
-                StructuredPostal.FORMATTED_ADDRESS + "," +
-                StructuredPostal.TYPE + "," +
-                StructuredPostal.LABEL + "," +
-                Data.DATA14 +
-         ") VALUES (?,?,?,?,?,?,?,?)";
-
-        int RAW_CONTACT_ID = 1;
-        int MIMETYPE_ID = 2;
-        int IS_PRIMARY = 3;
-        int IS_SUPER_PRIMARY = 4;
-        int DATA = 5;
-        int TYPE = 6;
-        int LABEL = 7;
-        int AUX_DATA = 8;
-    }
-
-    private void importContactMethods() {
-        SQLiteStatement emailInsert = mTargetDb.compileStatement(EmailInsert.INSERT_SQL);
-        SQLiteStatement imInsert = mTargetDb.compileStatement(ImInsert.INSERT_SQL);
-        SQLiteStatement postalInsert = mTargetDb.compileStatement(PostalInsert.INSERT_SQL);
-        Cursor c = mSourceDb.query(ContactMethodsQuery.TABLE, ContactMethodsQuery.COLUMNS, null,
-                null, null, null, null);
-        try {
-            while (c.moveToNext()) {
-                int kind = c.getInt(ContactMethodsQuery.KIND);
-                switch (kind) {
-                    case android.provider.Contacts.KIND_EMAIL:
-                        insertEmail(c, emailInsert);
-                        break;
-
-                    case android.provider.Contacts.KIND_IM:
-                        insertIm(c, imInsert);
-                        break;
-
-                    case android.provider.Contacts.KIND_POSTAL:
-                        insertPostal(c, postalInsert);
-                        break;
-                }
-            }
-        } finally {
-            c.close();
-            emailInsert.close();
-            imInsert.close();
-            postalInsert.close();
-        }
-
-    }
-
-    private void insertEmail(Cursor c, SQLiteStatement insert) {
-        long personId = c.getLong(ContactMethodsQuery.PERSON);
-        String email = c.getString(ContactMethodsQuery.DATA);
-
-        insert.bindLong(EmailInsert.RAW_CONTACT_ID, personId);
-        insert.bindLong(EmailInsert.MIMETYPE_ID, mEmailMimetypeId);
-        bindString(insert, EmailInsert.IS_PRIMARY, c.getString(ContactMethodsQuery.ISPRIMARY));
-        bindString(insert, EmailInsert.IS_SUPER_PRIMARY, c.getString(ContactMethodsQuery.ISPRIMARY));
-        bindString(insert, EmailInsert.DATA, email);
-        bindString(insert, EmailInsert.AUX_DATA, c.getString(ContactMethodsQuery.AUX_DATA));
-        bindString(insert, EmailInsert.TYPE, c.getString(ContactMethodsQuery.TYPE));
-        bindString(insert, EmailInsert.LABEL, c.getString(ContactMethodsQuery.LABEL));
-
-        long dataId = insert(insert);
-        mDbHelper.insertNameLookupForEmail(personId, dataId, email);
-    }
-
-    private void insertIm(Cursor c, SQLiteStatement insert) {
-        long personId = c.getLong(ContactMethodsQuery.PERSON);
-
-        insert.bindLong(ImInsert.RAW_CONTACT_ID, personId);
-        insert.bindLong(ImInsert.MIMETYPE_ID, mImMimetypeId);
-        bindString(insert, ImInsert.IS_PRIMARY, c.getString(ContactMethodsQuery.ISPRIMARY));
-        bindString(insert, ImInsert.IS_SUPER_PRIMARY, c.getString(ContactMethodsQuery.ISPRIMARY));
-        bindString(insert, ImInsert.DATA, c.getString(ContactMethodsQuery.DATA));
-        bindString(insert, ImInsert.AUX_DATA, c.getString(ContactMethodsQuery.AUX_DATA));
-        bindString(insert, ImInsert.TYPE, c.getString(ContactMethodsQuery.TYPE));
-        bindString(insert, ImInsert.LABEL, c.getString(ContactMethodsQuery.LABEL));
-        insert(insert);
-    }
-
-    private void insertPostal(Cursor c, SQLiteStatement insert) {
-        long personId = c.getLong(ContactMethodsQuery.PERSON);
-
-        insert.bindLong(PostalInsert.RAW_CONTACT_ID, personId);
-        insert.bindLong(PostalInsert.MIMETYPE_ID, mPostalMimetypeId);
-        bindString(insert, PostalInsert.IS_PRIMARY, c.getString(ContactMethodsQuery.ISPRIMARY));
-        bindString(insert, PostalInsert.IS_SUPER_PRIMARY,
-                c.getString(ContactMethodsQuery.ISPRIMARY));
-        bindString(insert, PostalInsert.DATA, c.getString(ContactMethodsQuery.DATA));
-        bindString(insert, PostalInsert.AUX_DATA, c.getString(ContactMethodsQuery.AUX_DATA));
-        bindString(insert, PostalInsert.TYPE, c.getString(ContactMethodsQuery.TYPE));
-        bindString(insert, PostalInsert.LABEL, c.getString(ContactMethodsQuery.LABEL));
-        insert(insert);
-    }
-
-    private interface PhonesQuery {
-        String TABLE = "phones";
-
-        String[] COLUMNS = {
-                "person", "type", "number", "label", "isprimary",
-        };
-
-        static int PERSON = 0;
-        static int TYPE = 1;
-        static int NUMBER = 2;
-        static int LABEL = 3;
-        static int ISPRIMARY = 4;
-    }
-
-    private interface PhoneInsert {
-        String INSERT_SQL = "INSERT INTO " + Tables.DATA + "(" +
-                Data.RAW_CONTACT_ID + "," +
-                DataColumns.MIMETYPE_ID + "," +
-                Data.IS_PRIMARY + "," +
-                Data.IS_SUPER_PRIMARY + "," +
-                Phone.NUMBER + "," +
-                Phone.TYPE + "," +
-                Phone.LABEL + "," +
-                PhoneColumns.NORMALIZED_NUMBER +
-         ") VALUES (?,?,?,?,?,?,?,?)";
-
-        int RAW_CONTACT_ID = 1;
-        int MIMETYPE_ID = 2;
-        int IS_PRIMARY = 3;
-        int IS_SUPER_PRIMARY = 4;
-        int NUMBER = 5;
-        int TYPE = 6;
-        int LABEL = 7;
-        int NORMALIZED_NUMBER = 8;
-    }
-
-    private interface PhoneLookupInsert {
-        String INSERT_SQL = "INSERT INTO " + Tables.PHONE_LOOKUP + "(" +
-                PhoneLookupColumns.RAW_CONTACT_ID + "," +
-                PhoneLookupColumns.DATA_ID + "," +
-                PhoneLookupColumns.NORMALIZED_NUMBER + "," +
-                PhoneLookupColumns.MIN_MATCH +
-         ") VALUES (?,?,?,?)";
-
-        int RAW_CONTACT_ID = 1;
-        int DATA_ID = 2;
-        int NORMALIZED_NUMBER = 3;
-        int MIN_MATCH = 4;
-    }
-
-    private interface HasPhoneNumberUpdate {
-        String UPDATE_SQL = "UPDATE " + Tables.CONTACTS +
-                " SET " + Contacts.HAS_PHONE_NUMBER + "=1 WHERE " + Contacts._ID + "=?";
-
-        int CONTACT_ID = 1;
-    }
-
-    private void importPhones() {
-        SQLiteStatement phoneInsert = mTargetDb.compileStatement(PhoneInsert.INSERT_SQL);
-        SQLiteStatement phoneLookupInsert =
-                mTargetDb.compileStatement(PhoneLookupInsert.INSERT_SQL);
-        SQLiteStatement hasPhoneUpdate =
-                mTargetDb.compileStatement(HasPhoneNumberUpdate.UPDATE_SQL);
-        Cursor c = mSourceDb.query(PhonesQuery.TABLE, PhonesQuery.COLUMNS, null, null,
-                null, null, null);
-        try {
-            while (c.moveToNext()) {
-                insertPhone(c, phoneInsert, phoneLookupInsert, hasPhoneUpdate);
-            }
-        } finally {
-            c.close();
-            phoneInsert.close();
-            phoneLookupInsert.close();
-            hasPhoneUpdate.close();
-        }
-    }
-
-    private void insertPhone(Cursor c, SQLiteStatement phoneInsert,
-            SQLiteStatement phoneLookupInsert, SQLiteStatement hasPhoneUpdate) {
-        long lastUpdatedContact = -1;
-        long id = c.getLong(PhonesQuery.PERSON);
-        String number = c.getString(PhonesQuery.NUMBER);
-        String normalizedNumber = null;
-        if (number != null) {
-            normalizedNumber = PhoneNumberUtils.getStrippedReversed(number);
-        }
-        phoneInsert.bindLong(PhoneInsert.RAW_CONTACT_ID, id);
-        phoneInsert.bindLong(PhoneInsert.MIMETYPE_ID, mPhoneMimetypeId);
-        bindString(phoneInsert, PhoneInsert.IS_PRIMARY, c.getString(PhonesQuery.ISPRIMARY));
-        bindString(phoneInsert, PhoneInsert.IS_SUPER_PRIMARY, c.getString(PhonesQuery.ISPRIMARY));
-        bindString(phoneInsert, PhoneInsert.NUMBER, number);
-        bindString(phoneInsert, PhoneInsert.TYPE, c.getString(PhonesQuery.TYPE));
-        bindString(phoneInsert, PhoneInsert.LABEL, c.getString(PhonesQuery.LABEL));
-        bindString(phoneInsert, PhoneInsert.NORMALIZED_NUMBER, normalizedNumber);
-
-        long dataId = insert(phoneInsert);
-        if (normalizedNumber != null) {
-            phoneLookupInsert.bindLong(PhoneLookupInsert.RAW_CONTACT_ID, id);
-            phoneLookupInsert.bindLong(PhoneLookupInsert.DATA_ID, dataId);
-            phoneLookupInsert.bindString(PhoneLookupInsert.NORMALIZED_NUMBER, normalizedNumber);
-            phoneLookupInsert.bindString(PhoneLookupInsert.MIN_MATCH,
-                    PhoneNumberUtils.toCallerIDMinMatch(number));
-            insert(phoneLookupInsert);
-
-            if (lastUpdatedContact != id) {
-                lastUpdatedContact = id;
-                hasPhoneUpdate.bindLong(HasPhoneNumberUpdate.CONTACT_ID, id);
-                hasPhoneUpdate.execute();
-            }
-        }
-    }
-
-    private interface PhotosQuery {
-        String TABLE = "photos";
-
-        String[] COLUMNS = {
-                "person", "data", "_sync_id", "_sync_account"
-        };
-
-        static int PERSON = 0;
-        static int DATA = 1;
-        static int _SYNC_ID = 2;
-        static int _SYNC_ACCOUNT = 3;
-    }
-
-    private interface PhotoInsert {
-        String INSERT_SQL = "INSERT INTO " + Tables.DATA + "(" +
-                Data.RAW_CONTACT_ID + "," +
-                DataColumns.MIMETYPE_ID + "," +
-                Photo.PHOTO + "," +
-                Data.SYNC1 +
-         ") VALUES (?,?,?,?)";
-
-        int RAW_CONTACT_ID = 1;
-        int MIMETYPE_ID = 2;
-        int PHOTO = 3;
-        int SYNC1 = 4;
-    }
-
-    private interface PhotoIdUpdate {
-        String UPDATE_SQL = "UPDATE " + Tables.CONTACTS +
-                " SET " + Contacts.PHOTO_ID + "=? WHERE " + Contacts._ID + "=?";
-
-        int PHOTO_ID = 1;
-        int CONTACT_ID = 2;
-    }
-
-    private void importPhotos() {
-        SQLiteStatement insert = mTargetDb.compileStatement(PhotoInsert.INSERT_SQL);
-        SQLiteStatement photoIdUpdate = mTargetDb.compileStatement(PhotoIdUpdate.UPDATE_SQL);
-        Cursor c = mSourceDb.query(PhotosQuery.TABLE, PhotosQuery.COLUMNS, null, null,
-                null, null, null);
-        try {
-            while (c.moveToNext()) {
-                insertPhoto(c, insert, photoIdUpdate);
-            }
-        } finally {
-            c.close();
-            insert.close();
-            photoIdUpdate.close();
-        }
-    }
-
-    private void insertPhoto(Cursor c, SQLiteStatement insert, SQLiteStatement photoIdUpdate) {
-        if (c.isNull(PhotosQuery.DATA)) {
-            return;
-        }
-
-        long personId = c.getLong(PhotosQuery.PERSON);
-
-        insert.bindLong(PhotoInsert.RAW_CONTACT_ID, personId);
-        insert.bindLong(PhotoInsert.MIMETYPE_ID, mPhotoMimetypeId);
-        insert.bindBlob(PhotoInsert.PHOTO, c.getBlob(PhotosQuery.DATA));
-
-        String account = c.getString(PhotosQuery._SYNC_ACCOUNT);
-        if (!TextUtils.isEmpty(account)) {
-            bindString(insert, PhotoInsert.SYNC1, c.getString(PhotosQuery._SYNC_ID));
-        } else {
-            insert.bindNull(PhotoInsert.SYNC1);
-        }
-
-        long rowId = insert(insert);
-        photoIdUpdate.bindLong(PhotoIdUpdate.PHOTO_ID, rowId);
-        photoIdUpdate.bindLong(PhotoIdUpdate.CONTACT_ID, personId);
-        photoIdUpdate.execute();
-    }
-
-    private interface GroupMembershipQuery {
-        String TABLE = "groupmembership";
-
-        String[] COLUMNS = {
-                "person", "group_id", "group_sync_account", "group_sync_id"
-        };
-
-        static int PERSON_ID = 0;
-        static int GROUP_ID = 1;
-        static int GROUP_SYNC_ACCOUNT = 2;
-        static int GROUP_SYNC_ID = 3;
-    }
-
-    private interface GroupMembershipInsert {
-        String INSERT_SQL = "INSERT INTO " + Tables.DATA + "(" +
-                Data.RAW_CONTACT_ID + "," +
-                DataColumns.MIMETYPE_ID + "," +
-                GroupMembership.GROUP_ROW_ID +
-         ") VALUES (?,?,?)";
-
-        int RAW_CONTACT_ID = 1;
-        int MIMETYPE_ID = 2;
-        int GROUP_ROW_ID = 3;
-    }
-
-    private void importGroupMemberships() {
-        SQLiteStatement insert = mTargetDb.compileStatement(GroupMembershipInsert.INSERT_SQL);
-        Cursor c = mSourceDb.query(GroupMembershipQuery.TABLE, GroupMembershipQuery.COLUMNS, null,
-                null, null, null, null);
-        try {
-            while (c.moveToNext()) {
-                insertGroupMembership(c, insert);
-            }
-        } finally {
-            c.close();
-            insert.close();
-        }
-    }
-
-    private void insertGroupMembership(Cursor c, SQLiteStatement insert) {
-        long personId = c.getLong(GroupMembershipQuery.PERSON_ID);
-
-        long groupId = 0;
-        if (c.isNull(GroupMembershipQuery.GROUP_ID)) {
-            String account = c.getString(GroupMembershipQuery.GROUP_SYNC_ACCOUNT);
-            if (!TextUtils.isEmpty(account)) {
-                String syncId = c.getString(GroupMembershipQuery.GROUP_SYNC_ID);
-
-                Cursor cursor = mTargetDb.query(Tables.GROUPS,
-                        new String[]{Groups._ID}, Groups.SOURCE_ID + "=?", new String[]{syncId},
-                        null, null, null);
-                try {
-                    if (cursor.moveToFirst()) {
-                        groupId = cursor.getLong(0);
-                    }
-                } finally {
-                    cursor.close();
-                }
-
-                if (groupId == 0) {
-                    ContentValues values = new ContentValues();
-                    values.put(Groups.ACCOUNT_NAME, account);
-                    values.put(Groups.ACCOUNT_TYPE, DEFAULT_ACCOUNT_TYPE);
-                    values.put(Groups.GROUP_VISIBLE, true);
-                    values.put(Groups.SOURCE_ID, syncId);
-                    groupId = mTargetDb.insert(Tables.GROUPS, null, values);
-                }
-            }
-        } else {
-            groupId = c.getLong(GroupMembershipQuery.GROUP_ID);
-        }
-
-        insert.bindLong(GroupMembershipInsert.RAW_CONTACT_ID, personId);
-        insert.bindLong(GroupMembershipInsert.MIMETYPE_ID, mGroupMembershipMimetypeId);
-        insert.bindLong(GroupMembershipInsert.GROUP_ROW_ID, groupId);
-        insert(insert);
-    }
-
-    private interface CallsQuery {
-        String TABLE = "calls";
-
-        String[] COLUMNS = {
-                "_id", "number", "date", "duration", "type", "new", "name", "numbertype",
-                "numberlabel"
-        };
-
-        static int ID = 0;
-        static int NUMBER = 1;
-        static int DATE = 2;
-        static int DURATION = 3;
-        static int TYPE = 4;
-        static int NEW = 5;
-        static int NAME = 6;
-        static int NUMBER_TYPE = 7;
-        static int NUMBER_LABEL = 8;
-    }
-
-    private void importCalls() {
-        Cursor c = mSourceDb.query(CallsQuery.TABLE, CallsQuery.COLUMNS, null, null,
-                null, null, null);
-        try {
-            while (c.moveToNext()) {
-                insertCall(c);
-            }
-        } finally {
-            c.close();
-        }
-    }
-
-    private void insertCall(Cursor c) {
-
-        // Cannot use batch operations here, because call log is serviced by a separate provider
-        mValues.clear();
-        mValues.put(Calls._ID, c.getLong(CallsQuery.ID));
-        mValues.put(Calls.NUMBER, c.getString(CallsQuery.NUMBER));
-        mValues.put(Calls.DATE, c.getLong(CallsQuery.DATE));
-        mValues.put(Calls.DURATION, c.getLong(CallsQuery.DURATION));
-        mValues.put(Calls.NEW, c.getLong(CallsQuery.NEW));
-        mValues.put(Calls.TYPE, c.getLong(CallsQuery.TYPE));
-        mValues.put(Calls.CACHED_NAME, c.getString(CallsQuery.NAME));
-        mValues.put(Calls.CACHED_NUMBER_LABEL, c.getString(CallsQuery.NUMBER_LABEL));
-        mValues.put(Calls.CACHED_NUMBER_TYPE, c.getString(CallsQuery.NUMBER_TYPE));
-
-        // TODO: confirm that we can use the CallLogProvider at this point, that it is guaranteed
-        // to have been registered.
-        mResolver.insert(Calls.CONTENT_URI, mValues);
-    }
-
-    private void updateDisplayNamesAndLookupKeys() {
-        // Compute display names, sort keys, lookup key, etc. for all Raw Cont
-        Cursor cursor = mResolver.query(RawContacts.CONTENT_URI,
-                new String[] { RawContacts._ID }, null, null, null);
-        try {
-            while (cursor.moveToNext()) {
-                long rawContactId = cursor.getLong(0);
-                mDbHelper.updateRawContactDisplayName(mTargetDb, rawContactId);
-                mContactsProvider.updateLookupKeyForRawContact(mTargetDb, rawContactId);
-            }
-        } finally {
-            cursor.close();
-        }
-    }
-
-    private interface DeletedPeopleQuery {
-        String TABLE = "_deleted_people";
-
-        String[] COLUMNS = {
-                "_sync_id", "_sync_account"
-        };
-
-        static int _SYNC_ID = 0;
-        static int _SYNC_ACCOUNT = 1;
-    }
-
-    private interface DeletedRawContactInsert {
-        String INSERT_SQL = "INSERT INTO " + Tables.RAW_CONTACTS + "(" +
-                RawContacts.ACCOUNT_NAME + "," +
-                RawContacts.ACCOUNT_TYPE + "," +
-                RawContacts.SOURCE_ID + "," +
-                RawContacts.DELETED + "," +
-                RawContacts.AGGREGATION_MODE +
-         ") VALUES (?,?,?,?,?)";
-
-
-        int ACCOUNT_NAME = 1;
-        int ACCOUNT_TYPE = 2;
-        int SOURCE_ID = 3;
-        int DELETED = 4;
-        int AGGREGATION_MODE = 5;
-    }
-
-    private void importDeletedPeople() {
-        SQLiteStatement insert = mTargetDb.compileStatement(DeletedRawContactInsert.INSERT_SQL);
-        Cursor c = mSourceDb.query(DeletedPeopleQuery.TABLE, DeletedPeopleQuery.COLUMNS, null, null,
-                null, null, null);
-        try {
-            while (c.moveToNext()) {
-                insertDeletedPerson(c, insert);
-            }
-        } finally {
-            c.close();
-            insert.close();
-        }
-    }
-
-    private void insertDeletedPerson(Cursor c, SQLiteStatement insert) {
-        String account = c.getString(DeletedPeopleQuery._SYNC_ACCOUNT);
-        if (account == null) {
-            return;
-        }
-
-        insert.bindString(DeletedRawContactInsert.ACCOUNT_NAME, account);
-        insert.bindString(DeletedRawContactInsert.ACCOUNT_TYPE, DEFAULT_ACCOUNT_TYPE);
-        bindString(insert, DeletedRawContactInsert.SOURCE_ID,
-                c.getString(DeletedPeopleQuery._SYNC_ID));
-        insert.bindLong(DeletedRawContactInsert.DELETED, 1);
-        insert.bindLong(DeletedRawContactInsert.AGGREGATION_MODE,
-                RawContacts.AGGREGATION_MODE_DISABLED);
-        insert(insert);
-    }
-
-    private void bindString(SQLiteStatement insert, int index, String string) {
-        if (string == null) {
-            insert.bindNull(index);
-        } else {
-            insert.bindString(index, string);
-        }
-    }
-
-    private long insert(SQLiteStatement insertStatement) {
-        long rowId = insertStatement.executeInsert();
-        if (rowId == 0) {
-            throw new RuntimeException("Insert failed");
-        }
-
-        mBatchCounter++;
-        if (mBatchCounter >= INSERT_BATCH_SIZE) {
-            mTargetDb.setTransactionSuccessful();
-            mTargetDb.endTransaction();
-            mTargetDb.beginTransaction();
-            mBatchCounter = 0;
-        }
-        return rowId;
-    }
-}
diff --git a/src/com/android/providers/contacts/NameSplitter.java b/src/com/android/providers/contacts/NameSplitter.java
index 27e5056..fd5b096 100644
--- a/src/com/android/providers/contacts/NameSplitter.java
+++ b/src/com/android/providers/contacts/NameSplitter.java
@@ -15,6 +15,8 @@
  */
 package com.android.providers.contacts;
 
+import com.android.providers.contacts.util.NeededForTesting;
+
 import android.content.ContentValues;
 import android.provider.ContactsContract.FullNameStyle;
 import android.provider.ContactsContract.PhoneticNameStyle;
@@ -106,6 +108,7 @@
             this.suffix = suffix;
         }
 
+        @NeededForTesting
         public String getPrefix() {
             return prefix;
         }
@@ -122,6 +125,7 @@
             return familyName;
         }
 
+        @NeededForTesting
         public String getSuffix() {
             return suffix;
         }
diff --git a/src/com/android/providers/contacts/util/NeededForTesting.java b/src/com/android/providers/contacts/util/NeededForTesting.java
new file mode 100644
index 0000000..0eb418e
--- /dev/null
+++ b/src/com/android/providers/contacts/util/NeededForTesting.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2011 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.util;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Denotes that the class, constructor, method or field is used by tests and therefore cannot be
+ * removed by tools like ProGuard.
+ */
+@Retention(RetentionPolicy.CLASS)
+@Target({ElementType.TYPE, ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.FIELD})
+public @interface NeededForTesting {}
diff --git a/tests/src/com/android/providers/contacts/LegacyContactImporterPerformanceTest.java b/tests/src/com/android/providers/contacts/LegacyContactImporterPerformanceTest.java
deleted file mode 100644
index d78193b..0000000
--- a/tests/src/com/android/providers/contacts/LegacyContactImporterPerformanceTest.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 2009 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.ContentProvider;
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.content.res.Resources;
-import android.os.Debug;
-import android.provider.CallLog;
-import android.provider.ContactsContract;
-import android.test.AndroidTestCase;
-import android.test.IsolatedContext;
-import android.test.RenamingDelegatingContext;
-import android.test.mock.MockContentResolver;
-import android.test.mock.MockContext;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.util.Log;
-
-import java.io.File;
-
-/**
- * Performance test for {@link ContactAggregator}. Run the test like this:
- * <code>
- * adb push <large contacts.db> \
- *         data/data/com.android.providers.contacts/databases/perf_imp.contacts.db
- * adb shell am instrument \
- *         -e class com.android.providers.contacts.LegacyContactImporterPerformanceTest \
- *         -w com.android.providers.contacts.tests/android.test.InstrumentationTestRunner
- * </code>
- *
- * Note that this SHOULD be a large test, but had to be bumped down to medium due to a bug in the
- * SQLite cleanup code.
- */
-@MediumTest
-public class LegacyContactImporterPerformanceTest extends AndroidTestCase {
-
-    private static final String TAG = "LegacyContactImporterPerformanceTest";
-
-    private static final boolean TRACE = false;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        SynchronousContactsProvider2.resetOpenHelper();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        SynchronousContactsProvider2.resetOpenHelper();
-    }
-
-    public void testPerformance() {
-        final Context targetContext = getContext();
-        MockContentResolver resolver = new MockContentResolver();
-        MockContext context = new MockContext() {
-            @Override
-            public Resources getResources() {
-                return targetContext.getResources();
-            }
-
-            @Override
-            public String getPackageName() {
-                return "no.package";
-            }
-
-            @Override
-            public ApplicationInfo getApplicationInfo() {
-                ApplicationInfo ai = new ApplicationInfo();
-                ai.packageName = "contactsTestPackage";
-                return ai;
-            }
-
-            @Override
-            public PackageManager getPackageManager() {
-                return new ContactsMockPackageManager();
-            }
-        };
-
-        RenamingDelegatingContext targetContextWrapper = new RenamingDelegatingContext(context,
-                targetContext, "perf_imp.");
-        targetContextWrapper.makeExistingFilesAndDbsAccessible();
-        IsolatedContext providerContext = new IsolatedContext(resolver, targetContextWrapper) {
-            @Override
-            public File getFilesDir() {
-                // TODO: Need to figure out something more graceful than this.
-                return new File("/data/data/com.android.providers.contacts.tests/files");
-            }
-        };
-        SynchronousContactsProvider2 provider = new SynchronousContactsProvider2();
-        provider.setDataWipeEnabled(false);
-        provider.attachInfo(providerContext, null);
-        resolver.addProvider(ContactsContract.AUTHORITY, provider);
-
-        ContentProvider callLogProvider = new TestCallLogProvider();
-        callLogProvider.attachInfo(providerContext, null);
-        resolver.addProvider(CallLog.AUTHORITY, callLogProvider);
-
-        LegacyContactImporter importer = new LegacyContactImporter(providerContext, provider);
-
-        provider.wipeData();
-
-        long start = System.currentTimeMillis();
-        if (TRACE) {
-            Debug.startMethodTracing("import");
-        }
-        provider.importLegacyContacts(importer);
-        if (TRACE) {
-            Debug.stopMethodTracing();
-        }
-        long end = System.currentTimeMillis();
-        long contactCount = provider.getRawContactCount();
-        Log.i(TAG, String.format("Imported contacts in %d ms.\n"
-                + "Contacts: %d\n"
-                + "Per contact: %.3f",
-                end - start,
-                contactCount,
-                ((double)(end - start) / contactCount)));
-    }
-
-    public static class TestCallLogProvider extends CallLogProvider {
-        private static ContactsDatabaseHelper mDbHelper;
-
-        @Override
-        protected ContactsDatabaseHelper getDatabaseHelper(final Context context) {
-            if (mDbHelper == null) {
-                mDbHelper = new ContactsDatabaseHelper(context);
-            }
-            return mDbHelper;
-        }
-    }
-}
diff --git a/tests/src/com/android/providers/contacts/LegacyContactImporterTest.java b/tests/src/com/android/providers/contacts/LegacyContactImporterTest.java
deleted file mode 100644
index 61108af..0000000
--- a/tests/src/com/android/providers/contacts/LegacyContactImporterTest.java
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * Copyright (C) 2009 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.Context;
-import android.database.Cursor;
-import android.database.DatabaseUtils;
-import android.database.sqlite.SQLiteDatabase;
-import android.net.Uri;
-import android.provider.BaseColumns;
-import android.provider.CallLog;
-import android.provider.CallLog.Calls;
-import android.provider.ContactsContract.Contacts;
-import android.provider.ContactsContract.Data;
-import android.provider.ContactsContract.Groups;
-import android.provider.ContactsContract.RawContacts;
-import android.test.mock.MockContext;
-import android.test.suitebuilder.annotation.MediumTest;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Unit tests for {@link LegacyContactImporter}.
- *
- * Run the test like this:
- * <code>
- * adb shell am instrument -e class com.android.providers.contacts.LegacyContactImporterTest -w \
- *         com.android.providers.contacts.tests/android.test.InstrumentationTestRunner
- * </code>
- *
- * Note that this SHOULD be a large test, but had to be bumped down to medium due to a bug in the
- * SQLite cleanup code.
- */
-@MediumTest
-public class LegacyContactImporterTest extends BaseContactsProvider2Test {
-
-    private static class LegacyMockContext extends MockContext {
-
-        private String mFileName;
-
-        public LegacyMockContext(String fileName) {
-            mFileName = fileName;
-        }
-
-        @Override
-        public SQLiteDatabase openOrCreateDatabase(String file, int mode,
-                SQLiteDatabase.CursorFactory factory) {
-            return SQLiteDatabase.openDatabase(mFileName, factory, SQLiteDatabase.OPEN_READONLY);
-        }
-
-        @Override
-        public File getDatabasePath(String name) {
-            return new File(mFileName);
-        }
-    }
-
-    private LegacyMockContext createLegacyMockContext(String folder) throws IOException {
-        Context context = getTestContext();
-        File tempDb = new File(context.getFilesDir(), "legacy_contacts.db");
-        if (tempDb.exists()) {
-            tempDb.delete();
-        }
-        createSQLiteDatabaseFromDumpFile(tempDb.getPath(),
-                new File(folder, "legacy_contacts.sql").getPath());
-        return new LegacyMockContext(tempDb.getPath());
-    }
-
-    private void createSQLiteDatabaseFromDumpFile(String tempDbPath, String dumpFileAssetPath)
-        throws IOException {
-
-        final String[] ignoredTables = new String[] {"android_metadata", "sqlite_sequence"};
-
-        Context context = getTestContext();
-        SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(tempDbPath, null);
-        try {
-            String data = readAssetAsString(dumpFileAssetPath);
-            String[] commands = data.split(";\r|;\n|;\r\n");
-            for (String command : commands) {
-                boolean ignore = false;
-                for (String ignoredTable : ignoredTables) {
-                    if (command.contains(ignoredTable)) {
-                        ignore = true;
-                        break;
-                    }
-                }
-                if (!ignore) {
-                    database.execSQL(command);
-                }
-            }
-
-            assertTrue(
-                    "Database Version not set. Be sure to add " +
-                    "'PRAGMA user_version = <number>;' to the SQL Script",
-                    database.getVersion() != 0);
-        } finally {
-            database.close();
-        }
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        SynchronousContactsProvider2.resetOpenHelper();
-        super.setUp();
-        addProvider(TestCallLogProvider.class, CallLog.AUTHORITY);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        SynchronousContactsProvider2.resetOpenHelper();
-    }
-
-    public void testContactUpgrade1() throws Exception {
-        testAssetSet("test1");
-    }
-
-    public void testSyncedContactsUpgrade() throws Exception {
-        testAssetSet("testSynced");
-    }
-
-    public void testUnsyncedContactsUpgrade() throws Exception {
-        testAssetSet("testUnsynced");
-    }
-
-    private void testAssetSet(String folder) throws Exception {
-        ContactsProvider2 provider = (ContactsProvider2)getProvider();
-        LegacyContactImporter importer =
-                new LegacyContactImporter(createLegacyMockContext(folder), provider);
-        provider.importLegacyContacts(importer);
-
-        assertQueryResults(folder + "/expected_groups.txt", Groups.CONTENT_URI, new String[]{
-                Groups._ID,
-                Groups.ACCOUNT_NAME,
-                Groups.ACCOUNT_TYPE,
-                Groups.DIRTY,
-                Groups.GROUP_VISIBLE,
-                Groups.NOTES,
-                Groups.RES_PACKAGE,
-                Groups.SOURCE_ID,
-                Groups.SYSTEM_ID,
-                Groups.TITLE,
-                Groups.VERSION,
-                Groups.SYNC1,
-                Groups.SYNC2,
-                Groups.SYNC3,
-                Groups.SYNC4,
-        });
-
-        assertQueryResults(folder + "/expected_contacts.txt", Contacts.CONTENT_URI, new String[]{
-                Contacts._ID,
-                Contacts.DISPLAY_NAME_PRIMARY,
-                Contacts.SORT_KEY_PRIMARY,
-                Contacts.PHOTO_ID,
-                Contacts.TIMES_CONTACTED,
-                Contacts.LAST_TIME_CONTACTED,
-                Contacts.CUSTOM_RINGTONE,
-                Contacts.SEND_TO_VOICEMAIL,
-                Contacts.STARRED,
-                Contacts.IN_VISIBLE_GROUP,
-                Contacts.HAS_PHONE_NUMBER,
-                Contacts.IS_USER_PROFILE,
-                Contacts.LOOKUP_KEY,
-        });
-
-        assertQueryResults(folder + "/expected_raw_contacts.txt", RawContacts.CONTENT_URI,
-                new String[]{
-                    RawContacts._ID,
-                    RawContacts.ACCOUNT_NAME,
-                    RawContacts.ACCOUNT_TYPE,
-                    RawContacts.DELETED,
-                    RawContacts.DIRTY,
-                    RawContacts.SOURCE_ID,
-                    RawContacts.VERSION,
-                    RawContacts.SYNC1,
-                    RawContacts.SYNC2,
-                    RawContacts.SYNC3,
-                    RawContacts.SYNC4,
-                    RawContacts.DISPLAY_NAME_SOURCE,
-                    RawContacts.DISPLAY_NAME_PRIMARY,
-                    RawContacts.DISPLAY_NAME_ALTERNATIVE,
-                    RawContacts.SORT_KEY_PRIMARY,
-                    RawContacts.SORT_KEY_ALTERNATIVE,
-        });
-
-        assertQueryResults(folder + "/expected_data.txt", Data.CONTENT_URI, new String[]{
-                Data._ID,
-                Data.RAW_CONTACT_ID,
-                Data.MIMETYPE,
-                Data.DATA1,
-                Data.DATA2,
-                Data.DATA3,
-                Data.DATA4,
-                Data.DATA5,
-                Data.DATA6,
-                Data.DATA7,
-                Data.DATA8,
-                Data.DATA9,
-                Data.DATA10,
-                Data.DATA11,
-                Data.DATA12,
-                Data.DATA13,
-                Data.DATA14,
-                Data.DATA15,
-                Data.IS_PRIMARY,
-                Data.IS_SUPER_PRIMARY,
-                Data.DATA_VERSION,
-                Data.SYNC1,
-                Data.SYNC2,
-                Data.SYNC3,
-                Data.SYNC4,
-        });
-
-        assertQueryResults(folder + "/expected_calls.txt", Calls.CONTENT_URI, new String[]{
-                Calls._ID,
-                Calls.NUMBER,
-                Calls.DATE,
-                Calls.DURATION,
-                Calls.NEW,
-                Calls.TYPE,
-                Calls.CACHED_NAME,
-                Calls.CACHED_NUMBER_LABEL,
-                Calls.CACHED_NUMBER_TYPE,
-        });
-
-        provider.getDatabaseHelper().close();
-    }
-
-    private void assertQueryResults(String fileName, Uri uri, String[] projection)
-            throws Exception {
-        String expected = readAssetAsString(fileName).trim();
-        String actual = dumpCursorToString(uri, projection).trim();
-        assertEquals("Checking golden file " + fileName, expected, actual);
-    }
-
-    private String readAssetAsString(String fileName) throws IOException {
-        Context context = getTestContext();
-        InputStream input = context.getAssets().open(fileName);
-        ByteArrayOutputStream contents = new ByteArrayOutputStream();
-        int len;
-        byte[] data = new byte[1024];
-        do {
-            len = input.read(data);
-            if (len > 0) contents.write(data, 0, len);
-        } while (len == data.length);
-        return contents.toString();
-    }
-
-    private String dumpCursorToString(Uri uri, String[] projection) {
-        Cursor c = mResolver.query(uri, projection, null, null, BaseColumns._ID);
-        if (c == null) {
-            return "Null cursor";
-        }
-
-        String cursorDump = DatabaseUtils.dumpCursorToString(c);
-        c.close();
-        return insertLineNumbers(cursorDump);
-    }
-
-    private String insertLineNumbers(String multiline) {
-        String[] lines = multiline.split("\n");
-        StringBuilder sb = new StringBuilder();
-
-        // Ignore the first line that is a volatile header and the last line which is "<<<<<"
-        for (int i = 1; i < lines.length - 1; i++) {
-            sb.append(i).append(" ").append(lines[i]).append('\n');
-        }
-        return sb.toString();
-    }
-
-
-    public static class TestCallLogProvider extends CallLogProvider {
-        private static ContactsDatabaseHelper mDbHelper;
-
-        @Override
-        protected ContactsDatabaseHelper getDatabaseHelper(final Context context) {
-            if (mDbHelper == null) {
-                mDbHelper = new ContactsDatabaseHelper(context);
-            }
-            return mDbHelper;
-        }
-    }
-}
diff --git a/tests/src/com/android/providers/contacts/SynchronousContactsProvider2.java b/tests/src/com/android/providers/contacts/SynchronousContactsProvider2.java
index 9fb450f..2844fc1 100644
--- a/tests/src/com/android/providers/contacts/SynchronousContactsProvider2.java
+++ b/tests/src/com/android/providers/contacts/SynchronousContactsProvider2.java
@@ -193,11 +193,4 @@
 
         getContactDirectoryManagerForTest().scanAllPackages();
     }
-
-    @Override
-    protected boolean isLegacyContactImportNeeded() {
-
-        // We have an explicit test for data conversion - no need to do it every time
-        return false;
-    }
 }