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

Unified Diff: components/variations/android/java/src/org/chromium/components/variations/firstrun/VariationsSeedService.java

Issue 2627093009: Fetch Finch seed during restore (Closed)
Patch Set: Fix nits and tests Created 3 years, 11 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: 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
deleted file mode 100644
index 2e5775384e5425e52cf9f083f08e91aa7eac8080..0000000000000000000000000000000000000000
--- a/components/variations/android/java/src/org/chromium/components/variations/firstrun/VariationsSeedService.java
+++ /dev/null
@@ -1,169 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.components.variations.firstrun;
-
-import android.app.IntentService;
-import android.content.Intent;
-import android.os.SystemClock;
-import android.support.v4.content.LocalBroadcastManager;
-
-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.SocketTimeoutException;
-import java.net.URL;
-import java.net.UnknownHostException;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Background service that fetches the variations seed before the actual first run of Chrome.
- */
-public class VariationsSeedService extends IntentService {
- private static final String TAG = "VariationsSeedServ";
-
- public static final String COMPLETE_BROADCAST = "VariationsseedService.Complete";
-
- private static final String VARIATIONS_SERVER_URL =
- "https://clientservices.googleapis.com/chrome-variations/seed?osname=android";
- private static final int BUFFER_SIZE = 4096;
- private static final int READ_TIMEOUT = 3000; // time in ms
- private static final int REQUEST_TIMEOUT = 1000; // 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_UNKNOWN_HOST_EXCEPTION = -3;
- private static final int SEED_FETCH_RESULT_TIMEOUT = -2;
- private static final int SEED_FETCH_RESULT_IOEXCEPTION = -1;
-
- public VariationsSeedService() {
- super(TAG);
- }
-
- @Override
- public void onHandleIntent(Intent intent) {
- // Early return if the seed has already been fetched. In such a case, either the Java-side
- // variations seed pref is set, or a different Java pref is set that indicates that the
- // seed exists in the native prefs.
- // Note: There is no need to check for a concurrent seed fetch here, because the service
- // runs all its intents on the same worker thread serially.
- if (VariationsSeedBridge.hasJavaPref(getApplicationContext())
- || VariationsSeedBridge.hasNativePref(getApplicationContext())) {
- broadcastCompleteIntent();
- return;
- }
- try {
- downloadContent();
- } finally {
- broadcastCompleteIntent();
- }
- }
-
- private void broadcastCompleteIntent() {
- LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent(COMPLETE_BROADCAST));
- }
-
- 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 void recordSeedConnectTime(long timeDeltaMillis) {
- TimesHistogramSample histogram = new TimesHistogramSample(
- "Variations.FirstRun.SeedConnectTime", TimeUnit.MILLISECONDS);
- histogram.record(timeDeltaMillis);
- }
-
- private boolean downloadContent() {
- HttpURLConnection connection = null;
- try {
- 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;
- }
-
- recordSeedConnectTime(SystemClock.elapsedRealtime() - startTimeMillis);
- // Convert the InputStream into a byte array.
- byte[] rawSeed = getRawSeed(connection);
- String signature = getHeaderFieldOrEmpty(connection, "X-Seed-Signature");
- String country = getHeaderFieldOrEmpty(connection, "X-Country");
- String date = getHeaderFieldOrEmpty(connection, "Date");
- 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 (UnknownHostException e) {
- recordFetchResultOrCode(SEED_FETCH_RESULT_UNKNOWN_HOST_EXCEPTION);
- Log.w(TAG, "UnknownHostException 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 {
- if (connection != null) {
- connection.disconnect();
- }
- }
- }
-
- private String getHeaderFieldOrEmpty(HttpURLConnection connection, String name) {
- String headerField = connection.getHeaderField(name);
- if (headerField == null) {
- return "";
- }
- return headerField.trim();
- }
-
- private byte[] getRawSeed(HttpURLConnection connection) throws IOException {
- InputStream inputStream = null;
- try {
- inputStream = connection.getInputStream();
- return convertInputStreamToByteArray(inputStream);
- } finally {
- if (inputStream != null) {
- inputStream.close();
- }
- }
- }
-
- private byte[] convertInputStreamToByteArray(InputStream inputStream) throws IOException {
- ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
- byte[] buffer = new byte[BUFFER_SIZE];
- int charactersReadCount = 0;
- while ((charactersReadCount = inputStream.read(buffer)) != -1) {
- byteBuffer.write(buffer, 0, charactersReadCount);
- }
- return byteBuffer.toByteArray();
- }
-}

Powered by Google App Engine
This is Rietveld 408576698