Пример #1
0
  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);
    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);

    mContactsProvider.insertNameLookupForStructuredName(
        id, dataId, name, mNameSplitter.getAdjustedFullNameStyle(fullNameStyle));
    if (splitName.phoneticFamilyName != null
        || splitName.phoneticMiddleName != null
        || splitName.phoneticGivenName != null) {
      mContactsProvider.insertNameLookupForPhoneticName(
          id,
          dataId,
          splitName.phoneticFamilyName,
          splitName.phoneticMiddleName,
          splitName.phoneticGivenName);
    }
  }
  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();

    /*
     * 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();

    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();
    importGroups();
    importPeople();
    importOrganizations();
    importPhones();
    importContactMethods();
    importPhotos();
    importGroupMemberships();

    // 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();
    mTargetDb.endTransaction();

    importCalls();
  }
  public void importContacts() throws Exception {
    String path = mContext.getDatabasePath(DATABASE_NAME).getPath();
    Log.w(TAG, "Importing contacts from " + path);

    if (!new File(path).exists()) {
      Log.i(TAG, "Legacy contacts database does not exist");
      return;
    }

    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;

      } 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();
        }
      }
    }
  }
  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());

    if (mPhoneticNameAvailable) {
      // TODO: add the ability to insert an unstructured phonetic name
      String phoneticName = c.getString(PeopleQuery.PHONETIC_NAME);
    }

    long dataId = insert(insert);

    mContactsProvider.insertNameLookupForStructuredName(id, dataId, name);
  }
Пример #5
0
 private void updateDisplayNamesAndLookupKeys() {
   // Compute display names, sort keys, lookup key, etc. for all Raw Cont
   Cursor cursor =
       mResolver.query(
           FakeContract.RAW_CONTACTS_CONTENT_URI,
           new String[] {RawContacts._ID},
           null,
           null,
           null);
   try {
     while (cursor.moveToNext()) {
       long rawContactId = cursor.getLong(0);
       mContactsProvider.updateRawContactDisplayName(mTargetDb, rawContactId);
       mContactsProvider.updateLookupKeyForRawContact(mTargetDb, rawContactId);
     }
   } finally {
     cursor.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.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);
    mContactsProvider.insertNameLookupForEmail(personId, dataId, email);
  }
Пример #7
0
  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;
  }
  @Override
  public void onReceive(Context context, Intent intent) {
    // We are now running with the system up, but no apps started,
    // so can do whatever cleanup after an upgrade that we want.

    try {
      long startTime = System.currentTimeMillis();

      // Lookup the last known database version
      final SharedPreferences prefs = context.getSharedPreferences(TAG, Context.MODE_PRIVATE);
      final int prefDbVersion = prefs.getInt(PREF_DB_VERSION, 0);

      final String curIcuVersion = ICU.getIcuVersion();
      final String curOsVersion = getOsVersionString();

      final String prefIcuVersion = prefs.getString(PREF_ICU_VERSION, "");
      final String prefOsVersion = prefs.getString(PREF_OS_VERSION, "");

      // If the version is old go ahead and attempt to create or upgrade the database.
      if (prefDbVersion != ContactsDatabaseHelper.DATABASE_VERSION
          || !prefIcuVersion.equals(curIcuVersion)
          || !prefOsVersion.equals(curOsVersion)) {
        // Store the current version so this receiver isn't run again until the database
        // version number changes. This is intentionally done even before the upgrade path
        // is attempted to be conservative. If the upgrade fails for some reason and we
        // crash and burn we don't want to get into a loop doing so.
        SharedPreferences.Editor editor = prefs.edit();
        editor.putInt(PREF_DB_VERSION, ContactsDatabaseHelper.DATABASE_VERSION);
        editor.putString(PREF_ICU_VERSION, curIcuVersion);
        editor.putString(PREF_OS_VERSION, curOsVersion);
        editor.commit();

        // Ask for a reference to the database to force the helper to either
        // create the database or open it up, performing any necessary upgrades
        // in the process.
        ContactsDatabaseHelper helper = ContactsDatabaseHelper.getInstance(context);
        ProfileDatabaseHelper profileHelper = ProfileDatabaseHelper.getInstance(context);
        CallLogDatabaseHelper calllogHelper = CallLogDatabaseHelper.getInstance(context);

        Log.i(TAG, "Creating or opening contacts database");

        helper.getWritableDatabase();
        helper.clearDirectoryScanComplete();

        profileHelper.getWritableDatabase();
        calllogHelper.getWritableDatabase();

        ContactsProvider2.updateLocaleOffline(context, helper, profileHelper);

        // Log the total time taken for the receiver to perform the operation
        EventLogTags.writeContactsUpgradeReceiver(System.currentTimeMillis() - startTime);
      }
    } catch (Throwable t) {
      // Something has gone terribly wrong. Disable this receiver for good so we can't
      // possibly end up in a reboot loop.
      Log.wtf(TAG, "Error during upgrade attempt. Disabling receiver.", t);
      context
          .getPackageManager()
          .setComponentEnabledSetting(
              new ComponentName(context, getClass()),
              PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
              PackageManager.DONT_KILL_APP);
    }
  }
 public LegacyContactImporter(Context context, ContactsProvider2 contactsProvider) {
   mContext = context;
   mContactsProvider = contactsProvider;
   mResolver = mContactsProvider.getContext().getContentResolver();
 }