Chromium Code Reviews| Index: android_webview/java/src/org/chromium/android_webview/AwVariationsSeedFetcher.java |
| diff --git a/android_webview/java/src/org/chromium/android_webview/AwVariationsSeedFetcher.java b/android_webview/java/src/org/chromium/android_webview/AwVariationsSeedFetcher.java |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..5d2ead7f29787c518966df9c500945f4b10416a4 |
| --- /dev/null |
| +++ b/android_webview/java/src/org/chromium/android_webview/AwVariationsSeedFetcher.java |
| @@ -0,0 +1,94 @@ |
| +// Copyright 2017 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.android_webview; |
| + |
| +import android.content.Context; |
| + |
| +import org.chromium.base.ContextUtils; |
| +import org.chromium.base.Log; |
| +import org.chromium.base.ThreadUtils; |
| +import org.chromium.components.variations.firstrun.VariationsSeedFetcher; |
| + |
| +import java.io.FileNotFoundException; |
| +import java.io.FileOutputStream; |
| +import java.io.IOException; |
| +import java.io.ObjectOutputStream; |
| +import java.util.HashMap; |
| +import java.util.Map; |
| + |
| +/** |
| + * Fetches the variations seed before the actual first run of Android WebView. |
|
paulmiller
2017/07/06 23:09:05
I don't think this is true in WebView's case.
sgurun-gerrit only
2017/07/06 23:38:10
yep not true. Please update class doc to explain i
|
| + */ |
| +public class AwVariationsSeedFetcher { |
| + private static final String TAG = "AwVariatnsSeedFetch"; |
| + |
| + public static final String VARIATIONS_PLATFORM = "android_webview"; |
|
Alexei Svitkine (slow)
2017/07/06 22:01:10
I think this is fine to put in the VariationsSeedF
|
| + private static final String SEED_DATA_FILENAME = "seed"; |
| + private static final String SEED_DATA_PREF_FILENAME = "seed_pref"; |
| + |
| + // Synchronization lock |
|
paulmiller
2017/07/06 23:09:05
Superfluous comment (not yours, but still).
|
| + private static final Object sLock = new Object(); |
| + |
| + private static AwVariationsSeedFetcher sInstance; |
| + |
| + AwVariationsSeedFetcher() {} |
|
sgurun-gerrit only
2017/07/06 23:38:11
is this class supposed to be publicly instantiatab
|
| + |
| + public static AwVariationsSeedFetcher get() { |
| + // TODO(aberent) Check not running on UI thread. Doing so however makes Robolectric testing |
|
sgurun-gerrit only
2017/07/06 23:38:11
why are we expecting aberent to fix that? is this
|
| + // of dependent classes difficult. |
| + synchronized (sLock) { |
| + if (sInstance == null) { |
| + Log.d(TAG, "using android webview fetcher"); |
|
sgurun-gerrit only
2017/07/06 23:38:11
does not look necessary, remove.
|
| + sInstance = new AwVariationsSeedFetcher(); |
| + } |
| + return sInstance; |
| + } |
| + } |
| + |
| + public void fetchSeed(String restrictMode) { |
|
sgurun-gerrit only
2017/07/06 23:38:11
and who is going to call that? write tests maybe?
sgurun-gerrit only
2017/07/06 23:38:11
static
|
| + assert !ThreadUtils.runningOnUiThread(); |
| + // Prevent multiple simultaneous fetches |
|
sgurun-gerrit only
2017/07/06 23:38:11
document how multiple simultanous fetches are poss
|
| + synchronized (sLock) { |
| + Map<String, String> headerFields = new HashMap<String, String>(); |
| + byte[] rawSeed = VariationsSeedFetcher.get().downloadContent( |
| + VariationsSeedFetcher.VARIATIONS_SERVER_URL + VARIATIONS_PLATFORM, restrictMode, |
| + headerFields); |
| + storeSeed(rawSeed, headerFields); |
| + } |
| + } |
| + |
| + private void storeSeed(byte[] rawSeed, Map<String, String> headerFields) { |
|
sgurun-gerrit only
2017/07/06 23:38:11
static
|
| + FileOutputStream fosSeed = null; |
| + ObjectOutputStream fosSeedPref = null; |
| + try { |
| + fosSeed = ContextUtils.getApplicationContext().openFileOutput( |
| + SEED_DATA_FILENAME, Context.MODE_PRIVATE); |
| + fosSeed.write(rawSeed, 0, rawSeed.length); |
| + fosSeedPref = |
| + new ObjectOutputStream(ContextUtils.getApplicationContext().openFileOutput( |
| + SEED_DATA_PREF_FILENAME, Context.MODE_PRIVATE)); |
| + fosSeedPref.writeObject(headerFields); |
| + } catch (FileNotFoundException e) { |
| + Log.e(TAG, "FileNotFoundException storing seed: ", e); |
|
paulmiller
2017/07/06 23:09:05
Mention Finch in these error messages, so people h
|
| + } catch (IOException e) { |
| + Log.e(TAG, "IOException storing seed: ", e); |
| + } finally { |
| + if (fosSeed != null) { |
| + try { |
| + fosSeed.close(); |
| + } catch (IOException e) { |
| + Log.e(TAG, "IOException file close: ", e); |
| + } |
| + } |
| + if (fosSeedPref != null) { |
| + try { |
| + fosSeedPref.close(); |
| + } catch (IOException e) { |
| + Log.e(TAG, "IOException file close: ", e); |
| + } |
| + } |
| + } |
| + } |
| +} |