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