Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6042)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupAgent.java

Issue 2750323002: [Android] Histogram for Android restore (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupAgent.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupAgent.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupAgent.java
index 6e400876ab6b4c6d49b82dce9a742e47fae24a6a..47f867ac89c1626f86f95a49d99bcd7c31ba6653 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupAgent.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupAgent.java
@@ -10,6 +10,7 @@ import android.app.backup.BackupDataOutput;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.ParcelFileDescriptor;
+import android.support.annotation.IntDef;
import org.chromium.base.ContextUtils;
import org.chromium.base.Log;
@@ -18,6 +19,7 @@ import org.chromium.base.ThreadUtils;
import org.chromium.base.VisibleForTesting;
import org.chromium.base.annotations.SuppressFBWarnings;
import org.chromium.base.library_loader.ProcessInitException;
+import org.chromium.base.metrics.RecordHistogram;
import org.chromium.chrome.browser.firstrun.FirstRunGlueImpl;
import org.chromium.chrome.browser.firstrun.FirstRunSignInProcessor;
import org.chromium.chrome.browser.firstrun.FirstRunStatus;
@@ -32,6 +34,8 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.concurrent.Callable;
@@ -43,11 +47,36 @@ import java.util.concurrent.TimeUnit;
*/
public class ChromeBackupAgent extends BackupAgent {
+ /**
+ *
Bernhard Bauer 2017/03/16 11:36:36 :)
aberent 2017/03/16 12:16:50 Done.
+ */
private static final String ANDROID_DEFAULT_PREFIX = "AndroidDefault.";
private static final String NATIVE_PREF_PREFIX = "native.";
private static final String TAG = "ChromeBackupAgent";
+ @VisibleForTesting
+ static final String HISTOGRAM_ANDROID_RESTORE_RESULT = "Android.RestoreResult";
+ // Restore status is used to pass the result of any restore to Chrome's first run, so that
Bernhard Bauer 2017/03/16 11:36:36 Can you leave empty lines before comments?
aberent 2017/03/16 12:16:50 Done here, and where I think it helps readability
Bernhard Bauer 2017/03/16 14:34:01 That's fine, I wouldn't add them there either (or
+ // it can be recorded as a histogram.
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({NO_RESTORE, RESTORE_COMPLETED, RESTORE_AFTER_FIRST_RUN, BROWSER_STARTUP_FAILED,
+ NOT_SIGNED_IN, RESTORE_STATUS_RECORDED})
+ public @interface RestoreStatus {}
+
+ // Values must match those in histogram.xml AndroidRestoreResult.
+ static final int NO_RESTORE = 0;
+ static final int RESTORE_COMPLETED = 1;
+ static final int RESTORE_AFTER_FIRST_RUN = 2;
+ static final int BROWSER_STARTUP_FAILED = 3;
+ static final int NOT_SIGNED_IN = 4;
+ static final int RESTORE_HISTOGRAM_BOUNDARY = 5;
+ // Set RESTORE_STATUS_RECORDED when the histogram has been recorded; so that it is only recorded
+ // once.
+ public static final int RESTORE_STATUS_RECORDED = 5;
+
+ private static final String RESTORE_STATUS = "Android_restore_status";
Bernhard Bauer 2017/03/16 11:36:36 Nit: The combination of uppercase initial and unde
aberent 2017/03/16 12:16:50 Done.
+
// Lists of preferences that should be restored unchanged.
static final String[] BACKUP_ANDROID_BOOL_PREFS = {
@@ -217,9 +246,9 @@ public class ChromeBackupAgent extends BackupAgent {
// Check that the user hasn't already seen FRE (not sure if this can ever happen, but if it
// does then restoring the backup will overwrite the user's choices).
SharedPreferences sharedPrefs = ContextUtils.getAppSharedPreferences();
- if (sharedPrefs.getBoolean(FirstRunStatus.FIRST_RUN_FLOW_COMPLETE, false)
- || sharedPrefs.getBoolean(
- FirstRunStatus.LIGHTWEIGHT_FIRST_RUN_FLOW_COMPLETE, false)) {
+ if (FirstRunStatus.getFirstRunFlowComplete()
+ || FirstRunStatus.getLightweightFirstRunFlowComplete()) {
+ setRestoreStatus(RESTORE_AFTER_FIRST_RUN);
Log.w(TAG, "Restore attempted after first run");
return;
}
@@ -280,10 +309,12 @@ public class ChromeBackupAgent extends BackupAgent {
});
if (!browserStarted) {
// Something went wrong starting Chrome, skip the restore.
+ setRestoreStatus(BROWSER_STARTUP_FAILED);
return;
}
// If the user hasn't signed in, or can't sign in, then don't restore anything.
if (restoredUserName == null || !accountExistsOnDevice(restoredUserName)) {
+ setRestoreStatus(NOT_SIGNED_IN);
Log.i(TAG, "Chrome was not signed in with a known account name, not restoring");
return;
}
@@ -331,6 +362,7 @@ public class ChromeBackupAgent extends BackupAgent {
// The silent first run will change things, so there is no point in trying to prevent
// additional backups at this stage. Don't write anything to |newState|.
+ setRestoreStatus(RESTORE_COMPLETED);
Log.i(TAG, "Restore complete");
}
@@ -352,6 +384,40 @@ public class ChromeBackupAgent extends BackupAgent {
};
}
+ /**
+ * Get the saved result of any restore that may have happened.
+ *
+ * @return the restore status, a RestoreStatus value.
+ */
+ @VisibleForTesting
+ @RestoreStatus
+ static int getRestoreStatus() {
+ return ContextUtils.getAppSharedPreferences().getInt(RESTORE_STATUS, NO_RESTORE);
+ }
+
+ /**
+ * Set the restore status
Bernhard Bauer 2017/03/16 11:36:36 Nit: I don't think this comments adds any value.
aberent 2017/03/16 12:16:50 Updated comment.
+ *
+ * @param status the status.
+ */
+ @VisibleForTesting
+ static void setRestoreStatus(@RestoreStatus int status) {
+ ContextUtils.getAppSharedPreferences().edit().putInt(RESTORE_STATUS, status).apply();
+ }
+
+ /**
+ * Record the restore histogram. To be called from Chrome itself once it is running.
+ */
+ static void recordRestoreHistogram() {
+ int restoreStatus = getRestoreStatus();
+ // Ensure restore status is only recorded once
+ if (restoreStatus != RESTORE_STATUS_RECORDED) {
+ RecordHistogram.recordEnumeratedHistogram(
+ HISTOGRAM_ANDROID_RESTORE_RESULT, restoreStatus, RESTORE_HISTOGRAM_BOUNDARY);
+ setRestoreStatus(RESTORE_STATUS_RECORDED);
+ }
+ }
+
@VisibleForTesting
protected native String[] nativeGetBoolBackupNames();

Powered by Google App Engine
This is Rietveld 408576698