Index: chrome/android/java/src/org/chromium/chrome/browser/init/NativeInitializationController.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/NativeInitializationController.java b/chrome/android/java/src/org/chromium/chrome/browser/init/NativeInitializationController.java |
index 09d44e5f06a071a1ff1516a848796a85ecd71481..5cc01c8061ab0a82adada3a01deb04338d87d731 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/NativeInitializationController.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/NativeInitializationController.java |
@@ -4,13 +4,9 @@ |
package org.chromium.chrome.browser.init; |
-import android.content.BroadcastReceiver; |
-import android.content.Context; |
import android.content.Intent; |
-import android.content.IntentFilter; |
import android.os.Handler; |
import android.os.Looper; |
-import android.support.v4.content.LocalBroadcastManager; |
import android.util.Log; |
import org.chromium.base.ContextUtils; |
@@ -18,10 +14,7 @@ import org.chromium.base.ThreadUtils; |
import org.chromium.base.library_loader.LibraryLoader; |
import org.chromium.base.library_loader.LibraryProcessType; |
import org.chromium.base.library_loader.ProcessInitException; |
-import org.chromium.chrome.browser.ChromeVersionInfo; |
import org.chromium.chrome.browser.firstrun.FirstRunFlowSequencer; |
-import org.chromium.components.variations.firstrun.VariationsSeedService; |
-import org.chromium.content.browser.ChildProcessLauncher; |
import java.util.ArrayList; |
import java.util.List; |
@@ -43,9 +36,8 @@ class NativeInitializationController { |
private List<Intent> mPendingNewIntents; |
private List<ActivityResult> mPendingActivityResults; |
- private boolean mLibraryLoaded; |
+ private boolean mBackgroundTasksComplete; |
private boolean mHasDoneFirstDraw; |
- private boolean mWaitingForVariationsFetch; |
private boolean mHasSignaledLibraryLoaded; |
private boolean mInitializationComplete; |
@@ -85,77 +77,38 @@ class NativeInitializationController { |
public void startBackgroundTasks(final boolean allocateChildConnection) { |
ThreadUtils.assertOnUiThread(); |
- // TODO(asvitkine): Consider moving this logic to a singleton, like |
- // ChromeBrowserInitializer. |
- if (ChromeVersionInfo.isOfficialBuild()) { |
- Context context = ContextUtils.getApplicationContext(); |
- Intent initialIntent = mActivityDelegate.getInitialIntent(); |
- if (FirstRunFlowSequencer.checkIfFirstRunIsNecessary(context, initialIntent, false) |
- != null) { |
- mWaitingForVariationsFetch = true; |
- IntentFilter filter = new IntentFilter(VariationsSeedService.COMPLETE_BROADCAST); |
- final LocalBroadcastManager manager = LocalBroadcastManager.getInstance(context); |
- manager.registerReceiver( |
- new BroadcastReceiver() { |
- @Override |
- public void onReceive(Context context, Intent intent) { |
- // This check is needed because onReceive() can be called multiple |
- // times even after having unregistered below if two broadcasts |
- // arrive in rapid succession. |
- if (!mWaitingForVariationsFetch) return; |
- mWaitingForVariationsFetch = false; |
- manager.unregisterReceiver(this); |
- signalNativeLibraryLoadedIfReady(); |
- } |
- }, |
- filter); |
- context.startService(new Intent(context, VariationsSeedService.class)); |
+ boolean fetchVariationsSeed = FirstRunFlowSequencer.checkIfFirstRunIsNecessary( |
+ ContextUtils.getApplicationContext(), |
+ mActivityDelegate.getInitialIntent(), false) |
+ != null; |
+ |
+ mBackgroundTasksComplete = false; |
+ new AsyncInitTaskRunner() { |
+ |
+ @Override |
+ protected void onSuccess() { |
+ ThreadUtils.assertOnUiThread(); |
+ |
+ mBackgroundTasksComplete = true; |
+ signalNativeLibraryLoadedIfReady(); |
} |
- } |
- // TODO(yusufo) : Investigate using an AsyncTask for this. |
- new Thread() { |
@Override |
- public void run() { |
- try { |
- LibraryLoader libraryLoader = |
- LibraryLoader.get(LibraryProcessType.PROCESS_BROWSER); |
- libraryLoader.ensureInitialized(); |
- // The prefetch is done after the library load for two reasons: |
- // - It is easier to know the library location after it has |
- // been loaded. |
- // - Testing has shown that this gives the best compromise, |
- // by avoiding performance regression on any tested |
- // device, and providing performance improvement on |
- // some. Doing it earlier delays UI inflation and more |
- // generally startup on some devices, most likely by |
- // competing for IO. |
- // For experimental results, see http://crbug.com/460438. |
- libraryLoader.asyncPrefetchLibrariesToMemory(); |
- } catch (ProcessInitException e) { |
- Log.e(TAG, "Unable to load native library.", e); |
- mActivityDelegate.onStartupFailure(); |
- return; |
- } |
- if (allocateChildConnection) { |
- ChildProcessLauncher.warmUp(ContextUtils.getApplicationContext()); |
- } |
- ThreadUtils.runOnUiThread(new Runnable() { |
- @Override |
- public void run() { |
- mLibraryLoaded = true; |
- signalNativeLibraryLoadedIfReady(); |
- } |
- }); |
+ protected void onFailure() { |
+ // Initialization has failed, call onStartup failure to abandon the activity. |
+ // This is not expected to return, so there is no need to set |
+ // mBackgroundTasksComplete or do any other tidying up. |
+ mActivityDelegate.onStartupFailure(); |
} |
- }.start(); |
+ |
+ }.startBackgroundTasks(allocateChildConnection, fetchVariationsSeed); |
} |
private void signalNativeLibraryLoadedIfReady() { |
ThreadUtils.assertOnUiThread(); |
// Called on UI thread when any of the booleans below have changed. |
- if (mHasDoneFirstDraw && mLibraryLoaded && !mWaitingForVariationsFetch) { |
+ if (mHasDoneFirstDraw && mBackgroundTasksComplete) { |
// This block should only be hit once. |
assert !mHasSignaledLibraryLoaded; |
mHasSignaledLibraryLoaded = true; |