@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);
    }
  }
 @Override
 public void onEvent(int event, String path) {
   EventLogTags.writeCacheFileDeleted(path);
 }
  private void writeToEventLog() {
    byte packageManagerInstallResultByte = 0;
    if (mResult == RESULT_PACKAGE_MANAGER_INSTALL_FAILED) {
      // PackageManager install error codes are negative, starting from -1 and going to
      // -111 (at the moment). We thus store them in negated form.
      packageManagerInstallResultByte =
          clipUnsignedValueToUnsignedByte(-mPackageManagerInstallResult);
    }

    final int resultAndFlags =
        (mResult & 0xff)
            | ((packageManagerInstallResultByte & 0xff) << 8)
            | ((mFlags & 0xffff) << 16);

    // Total elapsed time from start to end, in milliseconds.
    final int totalElapsedTime =
        clipUnsignedLongToUnsignedInt(mEndTimestampMillis - mStartTimestampMillis);

    // Total elapsed time from start till information about the package being installed was
    // obtained, in milliseconds.
    final int elapsedTimeTillPackageInfoObtained =
        (isPackageInfoObtained())
            ? clipUnsignedLongToUnsignedInt(
                mPackageInfoObtainedTimestampMillis - mStartTimestampMillis)
            : 0;

    // Total elapsed time from start till Install button clicked, in milliseconds
    // milliseconds.
    final int elapsedTimeTillInstallButtonClick =
        (isInstallButtonClicked())
            ? clipUnsignedLongToUnsignedInt(
                mInstallButtonClickTimestampMillis - mStartTimestampMillis)
            : 0;

    // If this user has consented to app verification, augment the logged event with the hash of
    // the contents of the APK.
    if (((mFlags & FLAG_FILE_URI) != 0)
        && ((mFlags & FLAG_VERIFY_APPS_ENABLED) != 0)
        && (isUserConsentToVerifyAppsGranted())) {
      // Log the hash of the APK's contents.
      // Reading the APK may take a while -- perform in background.
      AsyncTask.THREAD_POOL_EXECUTOR.execute(
          new Runnable() {
            @Override
            public void run() {
              byte[] digest = null;
              try {
                digest = getPackageContentsDigest();
              } catch (IOException e) {
                Log.w(TAG, "Failed to hash APK contents", e);
              } finally {
                String digestHex =
                    (digest != null) ? IntegralToString.bytesToHexString(digest, false) : "";
                EventLogTags.writeInstallPackageAttempt(
                    resultAndFlags,
                    totalElapsedTime,
                    elapsedTimeTillPackageInfoObtained,
                    elapsedTimeTillInstallButtonClick,
                    digestHex);
              }
            }
          });
    } else {
      // Do not log the hash of the APK's contents
      EventLogTags.writeInstallPackageAttempt(
          resultAndFlags,
          totalElapsedTime,
          elapsedTimeTillPackageInfoObtained,
          elapsedTimeTillInstallButtonClick,
          "");
    }
    mLogged = true;

    if (Log.isLoggable(TAG, Log.VERBOSE)) {
      Log.v(
          TAG,
          "Analytics:"
              + "\n\tinstallsFromUnknownSourcesPermitted: "
              + isInstallsFromUnknownSourcesPermitted()
              + "\n\tinstallRequestFromUnknownSource: "
              + isInstallRequestFromUnknownSource()
              + "\n\tverifyAppsEnabled: "
              + isVerifyAppsEnabled()
              + "\n\tappVerifierInstalled: "
              + isAppVerifierInstalled()
              + "\n\tfileUri: "
              + isFileUri()
              + "\n\treplace: "
              + isReplace()
              + "\n\tsystemApp: "
              + isSystemApp()
              + "\n\tpackageInfoObtained: "
              + isPackageInfoObtained()
              + "\n\tinstallButtonClicked: "
              + isInstallButtonClicked()
              + "\n\tpermissionsDisplayed: "
              + isPermissionsDisplayed()
              + "\n\tnewPermissionsDisplayed: "
              + isNewPermissionsDisplayed()
              + "\n\tallPermissionsDisplayed: "
              + isAllPermissionsDisplayed()
              + "\n\tnewPermissionsFound: "
              + isNewPermissionsFound()
              + "\n\tresult: "
              + mResult
              + "\n\tpackageManagerInstallResult: "
              + mPackageManagerInstallResult
              + "\n\ttotalDuration: "
              + (mEndTimestampMillis - mStartTimestampMillis)
              + " ms"
              + "\n\ttimeTillPackageInfoObtained: "
              + ((isPackageInfoObtained())
                  ? ((mPackageInfoObtainedTimestampMillis - mStartTimestampMillis) + " ms")
                  : "n/a")
              + "\n\ttimeTillInstallButtonClick: "
              + ((isInstallButtonClicked())
                  ? ((mInstallButtonClickTimestampMillis - mStartTimestampMillis) + " ms")
                  : "n/a"));
      Log.v(
          TAG,
          "Wrote to Event Log: 0x"
              + Long.toString(resultAndFlags & 0xffffffffL, 16)
              + ", "
              + totalElapsedTime
              + ", "
              + elapsedTimeTillPackageInfoObtained
              + ", "
              + elapsedTimeTillInstallButtonClick);
    }
  }