| Index: components/variations/android/java/src/org/chromium/components/variations/firstrun/VariationsSeedService.java
|
| diff --git a/components/variations/android/java/src/org/chromium/components/variations/firstrun/VariationsSeedService.java b/components/variations/android/java/src/org/chromium/components/variations/firstrun/VariationsSeedService.java
|
| index 7b1c7bb843b959a492261f8f3dd15d33f44fe3f3..26957722001f66647fd6e2629dfad0bd2ed2b12d 100644
|
| --- a/components/variations/android/java/src/org/chromium/components/variations/firstrun/VariationsSeedService.java
|
| +++ b/components/variations/android/java/src/org/chromium/components/variations/firstrun/VariationsSeedService.java
|
| @@ -6,15 +6,19 @@ package org.chromium.components.variations.firstrun;
|
|
|
| import android.app.IntentService;
|
| import android.content.Intent;
|
| +import android.os.SystemClock;
|
|
|
| import org.chromium.base.Log;
|
| +import org.chromium.base.metrics.CachedMetrics.SparseHistogramSample;
|
| +import org.chromium.base.metrics.CachedMetrics.TimesHistogramSample;
|
|
|
| import java.io.ByteArrayOutputStream;
|
| import java.io.IOException;
|
| import java.io.InputStream;
|
| import java.net.HttpURLConnection;
|
| -import java.net.MalformedURLException;
|
| +import java.net.SocketTimeoutException;
|
| import java.net.URL;
|
| +import java.util.concurrent.TimeUnit;
|
|
|
| /**
|
| * Background service that fetches the variations seed before the actual first run of Chrome.
|
| @@ -27,6 +31,12 @@ public class VariationsSeedService extends IntentService {
|
| private static final int READ_TIMEOUT = 10000; // time in ms
|
| private static final int REQUEST_TIMEOUT = 15000; // time in ms
|
|
|
| + // Values for the "Variations.FirstRun.SeedFetchResult" sparse histogram, which also logs
|
| + // HTTP result codes. These are negative so that they don't conflict with the HTTP codes.
|
| + // These values should not be renumbered or re-used since they are logged to UMA.
|
| + private static final int SEED_FETCH_RESULT_TIMEOUT = -2;
|
| + private static final int SEED_FETCH_RESULT_IOEXCEPTION = -1;
|
| +
|
| // Static variable that indicates a status of the variations seed fetch. If one request is in
|
| // progress, we do not start another fetch.
|
| private static boolean sFetchInProgress = false;
|
| @@ -45,9 +55,7 @@ public class VariationsSeedService extends IntentService {
|
| }
|
| setFetchInProgressFlagValue(true);
|
| try {
|
| - downloadContent(new URL(VARIATIONS_SERVER_URL));
|
| - } catch (MalformedURLException e) {
|
| - Log.w(TAG, "Variations server URL is malformed.", e);
|
| + downloadContent();
|
| } finally {
|
| setFetchInProgressFlagValue(false);
|
| }
|
| @@ -59,16 +67,32 @@ public class VariationsSeedService extends IntentService {
|
| sFetchInProgress = value;
|
| }
|
|
|
| - private boolean downloadContent(URL variationsServerUrl) {
|
| + private void recordFetchResultOrCode(int resultOrCode) {
|
| + SparseHistogramSample histogram =
|
| + new SparseHistogramSample("Variations.FirstRun.SeedFetchResult");
|
| + histogram.record(resultOrCode);
|
| + }
|
| +
|
| + private void recordSeedFetchTime(long timeDeltaMillis) {
|
| + Log.i(TAG, "Fetched first run seed in " + timeDeltaMillis + " ms");
|
| + TimesHistogramSample histogram = new TimesHistogramSample(
|
| + "Variations.FirstRun.SeedFetchTime", TimeUnit.MILLISECONDS);
|
| + histogram.record(timeDeltaMillis);
|
| + }
|
| +
|
| + private boolean downloadContent() {
|
| HttpURLConnection connection = null;
|
| try {
|
| - connection = (HttpURLConnection) variationsServerUrl.openConnection();
|
| + long startTimeMillis = SystemClock.elapsedRealtime();
|
| + URL url = new URL(VARIATIONS_SERVER_URL);
|
| + connection = (HttpURLConnection) url.openConnection();
|
| connection.setReadTimeout(READ_TIMEOUT);
|
| connection.setConnectTimeout(REQUEST_TIMEOUT);
|
| connection.setDoInput(true);
|
| connection.setRequestProperty("A-IM", "gzip");
|
| connection.connect();
|
| int responseCode = connection.getResponseCode();
|
| + recordFetchResultOrCode(responseCode);
|
| if (responseCode != HttpURLConnection.HTTP_OK) {
|
| Log.w(TAG, "Non-OK response code = %d", responseCode);
|
| return false;
|
| @@ -82,8 +106,14 @@ public class VariationsSeedService extends IntentService {
|
| boolean isGzipCompressed = getHeaderFieldOrEmpty(connection, "IM").equals("gzip");
|
| VariationsSeedBridge.setVariationsFirstRunSeed(
|
| getApplicationContext(), rawSeed, signature, country, date, isGzipCompressed);
|
| + recordSeedFetchTime(SystemClock.elapsedRealtime() - startTimeMillis);
|
| return true;
|
| + } catch (SocketTimeoutException e) {
|
| + recordFetchResultOrCode(SEED_FETCH_RESULT_TIMEOUT);
|
| + Log.w(TAG, "SocketTimeoutException fetching first run seed: ", e);
|
| + return false;
|
| } catch (IOException e) {
|
| + recordFetchResultOrCode(SEED_FETCH_RESULT_IOEXCEPTION);
|
| Log.w(TAG, "IOException fetching first run seed: ", e);
|
| return false;
|
| } finally {
|
|
|