Index: chrome/android/java_staging/src/org/chromium/chrome/browser/customtabs/ChromeBrowserConnection.java |
diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/customtabs/ChromeBrowserConnection.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/customtabs/ChromeBrowserConnection.java |
index 4127c04df2c987eb109e3ecc5f64641104a7de3f..153cfdc1eb8e7d3129731a9076b15624e93234e1 100644 |
--- a/chrome/android/java_staging/src/org/chromium/chrome/browser/customtabs/ChromeBrowserConnection.java |
+++ b/chrome/android/java_staging/src/org/chromium/chrome/browser/customtabs/ChromeBrowserConnection.java |
@@ -18,6 +18,7 @@ import android.os.Binder; |
import android.os.Bundle; |
import android.os.IBinder; |
import android.os.RemoteException; |
+import android.os.SystemClock; |
import android.util.LongSparseArray; |
import android.util.SparseArray; |
@@ -25,6 +26,7 @@ import org.chromium.base.Log; |
import org.chromium.base.ThreadUtils; |
import org.chromium.base.annotations.SuppressFBWarnings; |
import org.chromium.base.library_loader.ProcessInitException; |
+import org.chromium.base.metrics.RecordHistogram; |
import org.chromium.chrome.browser.ChromiumApplication; |
import org.chromium.chrome.browser.WarmupManager; |
import org.chromium.content.browser.ChildProcessLauncher; |
@@ -34,6 +36,7 @@ import java.security.SecureRandom; |
import java.util.ArrayList; |
import java.util.Arrays; |
import java.util.List; |
+import java.util.concurrent.TimeUnit; |
import java.util.concurrent.atomic.AtomicBoolean; |
/** |
@@ -44,6 +47,12 @@ class ChromeBrowserConnection extends IBrowserConnectionService.Stub { |
private static final long RESULT_OK = 0; |
private static final long RESULT_ERROR = -1; |
+ // Values for the "CustomTabs.PredictionStatus" UMA histogram. Append-only. |
+ private static final int NO_PREDICTION = 0; |
+ private static final int GOOD_PREDICTION = 1; |
+ private static final int BAD_PREDICTION = 2; |
+ private static final int PREDICTION_STATUS_COUNT = 3; |
+ |
private static final Object sConstructionLock = new Object(); |
private static ChromeBrowserConnection sInstance; |
@@ -54,10 +63,14 @@ class ChromeBrowserConnection extends IBrowserConnectionService.Stub { |
private static class SessionParams { |
public final int mUid; |
private ServiceConnection mServiceConnection; |
+ private String mPredictedUrl; |
+ private long mLastMayLaunchUrlTimestamp; |
public SessionParams(int uid) { |
mUid = uid; |
mServiceConnection = null; |
+ mPredictedUrl = null; |
+ mLastMayLaunchUrlTimestamp = 0; |
} |
public ServiceConnection getServiceConnection() { |
@@ -67,6 +80,19 @@ class ChromeBrowserConnection extends IBrowserConnectionService.Stub { |
public void setServiceConnection(ServiceConnection serviceConnection) { |
mServiceConnection = serviceConnection; |
} |
+ |
+ public void setPredictionMetrics(String predictedUrl, long lastMayLaunchUrlTimestamp) { |
+ mPredictedUrl = predictedUrl; |
+ mLastMayLaunchUrlTimestamp = lastMayLaunchUrlTimestamp; |
+ } |
+ |
+ public String getPredictedUrl() { |
+ return mPredictedUrl; |
+ } |
+ |
+ public long getLastMayLaunchUrlTimestamp() { |
+ return mLastMayLaunchUrlTimestamp; |
+ } |
} |
private final Object mLock; |
@@ -182,6 +208,7 @@ class ChromeBrowserConnection extends IBrowserConnectionService.Stub { |
synchronized (mLock) { |
SessionParams sessionParams = mSessionParams.get(sessionId); |
if (sessionParams == null || sessionParams.mUid != uid) return RESULT_ERROR; |
+ sessionParams.setPredictionMetrics(url, SystemClock.elapsedRealtime()); |
} |
ThreadUtils.postOnUiThread(new Runnable() { |
@Override |
@@ -195,6 +222,35 @@ class ChromeBrowserConnection extends IBrowserConnectionService.Stub { |
} |
/** |
+ * Registers a launch of a |url| for a given |sessionId|. |
+ * |
+ * This is used for accounting. |
+ */ |
+ void registerLaunch(long sessionId, String url) { |
+ int outcome; |
+ long elapsedTimeMs = -1; |
+ synchronized (mLock) { |
+ SessionParams sessionParams = mSessionParams.get(sessionId); |
+ if (sessionParams == null) { |
+ outcome = NO_PREDICTION; |
+ } else { |
+ String predictedUrl = sessionParams.getPredictedUrl(); |
+ outcome = predictedUrl == null ? NO_PREDICTION |
+ : predictedUrl.equals(url) ? GOOD_PREDICTION : BAD_PREDICTION; |
+ elapsedTimeMs = SystemClock.elapsedRealtime() |
+ - sessionParams.getLastMayLaunchUrlTimestamp(); |
+ sessionParams.setPredictionMetrics(null, 0); |
+ } |
+ } |
+ RecordHistogram.recordEnumeratedHistogram( |
+ "CustomTabs.PredictionStatus", outcome, PREDICTION_STATUS_COUNT); |
+ if (outcome == GOOD_PREDICTION) { |
+ RecordHistogram.recordCustomTimesHistogram("CustomTabs.PredictionToLaunch", |
+ elapsedTimeMs, 1, TimeUnit.MINUTES.toMillis(3), TimeUnit.MILLISECONDS, 100); |
+ } |
+ } |
+ |
+ /** |
* Transfers a prerendered WebContents if one exists. |
* |
* This resets the internal WebContents; a subsequent call to this method |