| Index: chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a8e29abae58639bc3763efa8bf4032e475a4c155
|
| --- /dev/null
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
|
| @@ -0,0 +1,226 @@
|
| +// Copyright 2016 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.chrome.browser.init;
|
| +
|
| +import android.app.Activity;
|
| +import android.content.Context;
|
| +import android.content.Intent;
|
| +import android.view.View;
|
| +
|
| +import com.google.ipc.invalidation.external.client.android.service.AndroidLogger;
|
| +
|
| +import org.chromium.base.CommandLine;
|
| +import org.chromium.base.ContextUtils;
|
| +import org.chromium.base.Log;
|
| +import org.chromium.base.ThreadUtils;
|
| +import org.chromium.chrome.browser.ChromeApplication;
|
| +import org.chromium.chrome.browser.DeferredStartupHandler;
|
| +import org.chromium.chrome.browser.DevToolsServer;
|
| +import org.chromium.chrome.browser.download.DownloadController;
|
| +import org.chromium.chrome.browser.download.DownloadManagerService;
|
| +import org.chromium.chrome.browser.firstrun.ForcedSigninProcessor;
|
| +import org.chromium.chrome.browser.identity.UniqueIdentificationGeneratorFactory;
|
| +import org.chromium.chrome.browser.identity.UuidBasedUniqueIdentificationGenerator;
|
| +import org.chromium.chrome.browser.invalidation.UniqueIdInvalidationClientNameGenerator;
|
| +import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
|
| +import org.chromium.chrome.browser.rlz.RevenueStats;
|
| +import org.chromium.chrome.browser.services.AccountsChangedReceiver;
|
| +import org.chromium.chrome.browser.services.GoogleServicesManager;
|
| +import org.chromium.chrome.browser.sync.SyncController;
|
| +import org.chromium.components.sync.signin.AccountManagerHelper;
|
| +import org.chromium.content.common.ContentSwitches;
|
| +import org.chromium.ui.UiUtils;
|
| +
|
| +/**
|
| + * Handles the initialization dependences of the browser process. This is meant to handle the
|
| + * initialization that is not tied to any particular Activity, and the logic that should only be
|
| + * triggered a single time for the lifetime of the browser process.
|
| + */
|
| +public class ProcessInitializationHandler {
|
| +
|
| + private static final String SESSIONS_UUID_PREF_KEY = "chromium.sync.sessions.id";
|
| + private static final String DEV_TOOLS_SERVER_SOCKET_PREFIX = "chrome";
|
| +
|
| + private static Class<? extends ProcessInitializationHandler> sHandlerClassOverride;
|
| + private static ProcessInitializationHandler sInstance;
|
| +
|
| + private boolean mInitializedPreNative;
|
| + private boolean mInitializedDeferredStartupTasks;
|
| + private DevToolsServer mDevToolsServer;
|
| +
|
| + /**
|
| + * Overrides the type of ProcessInitializationHandler to be created.
|
| + * <p>
|
| + * This must be called before {@link #getInstance()} is triggered.
|
| + *
|
| + * @param classOverride The ProcessInitializationHandler class type to be created instead of
|
| + * the default.
|
| + */
|
| + public static void setProcessInitializationHandlerType(
|
| + Class<? extends ProcessInitializationHandler> classOverride) {
|
| + if (sInstance != null) {
|
| + throw new IllegalStateException("Browser delegate override set after initialized");
|
| + }
|
| + sHandlerClassOverride = classOverride;
|
| + }
|
| +
|
| + /**
|
| + * @return The ProcessInitializationHandler for use during the lifetime of the browser process.
|
| + */
|
| + public static ProcessInitializationHandler getInstance() {
|
| + ThreadUtils.assertOnUiThread();
|
| + if (sInstance == null) {
|
| + if (sHandlerClassOverride != null) {
|
| + try {
|
| + sInstance = sHandlerClassOverride.newInstance();
|
| + } catch (InstantiationException | IllegalAccessException e) {
|
| + assert false : "Unable to instantiate ProcessInitializationHandler override.";
|
| + }
|
| + }
|
| + if (sInstance == null) sInstance = new ProcessInitializationHandler();
|
| + }
|
| + return sInstance;
|
| + }
|
| +
|
| + /**
|
| + * Constructor exposed to allow overriding.
|
| + */
|
| + protected ProcessInitializationHandler() {}
|
| +
|
| + /**
|
| + * Initializes the any dependencies that must occur before native library has been loaded.
|
| + * <p>
|
| + * Adding anything expensive to this must be avoided as it would delay the Chrome startup path.
|
| + * <p>
|
| + * All entry points that do not rely on {@link ChromeBrowserInitializer} must call this on
|
| + * startup.
|
| + */
|
| + public final void initializePreNative() {
|
| + ThreadUtils.assertOnUiThread();
|
| + if (mInitializedPreNative) return;
|
| + mInitializedPreNative = true;
|
| + handlePreNativeInitialization();
|
| + }
|
| +
|
| + /**
|
| + * Performs the shared class initialization.
|
| + */
|
| + protected void handlePreNativeInitialization() {
|
| + ChromeApplication application = (ChromeApplication) ContextUtils.getApplicationContext();
|
| +
|
| + UiUtils.setKeyboardShowingDelegate(new UiUtils.KeyboardShowingDelegate() {
|
| + @Override
|
| + public boolean disableKeyboardCheck(Context context, View view) {
|
| + Activity activity = null;
|
| + if (context instanceof Activity) {
|
| + activity = (Activity) context;
|
| + } else if (view != null && view.getContext() instanceof Activity) {
|
| + activity = (Activity) view.getContext();
|
| + }
|
| +
|
| + // For multiwindow mode we do not track keyboard visibility.
|
| + return activity != null
|
| + && MultiWindowUtils.getInstance().isLegacyMultiWindow(activity);
|
| + }
|
| + });
|
| +
|
| + // Initialize the AccountManagerHelper with the correct AccountManagerDelegate. Must be done
|
| + // only once and before AccountMangerHelper.get(...) is called to avoid using the
|
| + // default AccountManagerDelegate.
|
| + AccountManagerHelper.initializeAccountManagerHelper(
|
| + application, application.createAccountManagerDelegate());
|
| +
|
| + // Set the unique identification generator for invalidations. The
|
| + // invalidations system can start and attempt to fetch the client ID
|
| + // very early. We need this generator to be ready before that happens.
|
| + UniqueIdInvalidationClientNameGenerator.doInitializeAndInstallGenerator(application);
|
| +
|
| + // Set minimum Tango log level. This sets an in-memory static field, and needs to be
|
| + // set in the ApplicationContext instead of an activity, since Tango can be woken up
|
| + // by the system directly though messages from GCM.
|
| + AndroidLogger.setMinimumAndroidLogLevel(Log.WARN);
|
| +
|
| + // Set up the identification generator for sync. The ID is actually generated
|
| + // in the SyncController constructor.
|
| + UniqueIdentificationGeneratorFactory.registerGenerator(SyncController.GENERATOR_ID,
|
| + new UuidBasedUniqueIdentificationGenerator(
|
| + application, SESSIONS_UUID_PREF_KEY), false);
|
| + }
|
| +
|
| + /**
|
| + * Initializes the deferred startup tasks that should only be triggered once per browser process
|
| + * lifetime.
|
| + */
|
| + public final void initializeDeferredStartupTasks() {
|
| + ThreadUtils.assertOnUiThread();
|
| + if (mInitializedDeferredStartupTasks) return;
|
| + mInitializedDeferredStartupTasks = true;
|
| + handleDeferredStartupTasksInitialization();
|
| + }
|
| +
|
| + /**
|
| + * Performs the deferred startup task initialization.
|
| + */
|
| + protected void handleDeferredStartupTasksInitialization() {
|
| + final ChromeApplication application =
|
| + (ChromeApplication) ContextUtils.getApplicationContext();
|
| +
|
| + DeferredStartupHandler.getInstance().addDeferredTask(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + ForcedSigninProcessor.start(application);
|
| + AccountsChangedReceiver.addObserver(
|
| + new AccountsChangedReceiver.AccountsChangedObserver() {
|
| + @Override
|
| + public void onAccountsChanged(Context context, Intent intent) {
|
| + ThreadUtils.runOnUiThread(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + ForcedSigninProcessor.start(application);
|
| + }
|
| + });
|
| + }
|
| + });
|
| + }
|
| + });
|
| +
|
| + DeferredStartupHandler.getInstance().addDeferredTask(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + GoogleServicesManager.get(application).onMainActivityStart();
|
| + RevenueStats.getInstance();
|
| + }
|
| + });
|
| +
|
| + DeferredStartupHandler.getInstance().addDeferredTask(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + mDevToolsServer = new DevToolsServer(DEV_TOOLS_SERVER_SOCKET_PREFIX);
|
| + mDevToolsServer.setRemoteDebuggingEnabled(
|
| + true, DevToolsServer.Security.ALLOW_DEBUG_PERMISSION);
|
| +
|
| + startApplicationActivityTracker();
|
| + }
|
| + });
|
| +
|
| + DeferredStartupHandler.getInstance().addDeferredTask(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + // Add process check to diagnose http://crbug.com/606309. Remove this after the bug
|
| + // is fixed.
|
| + assert !CommandLine.getInstance().hasSwitch(ContentSwitches.SWITCH_PROCESS_TYPE);
|
| + if (!CommandLine.getInstance().hasSwitch(ContentSwitches.SWITCH_PROCESS_TYPE)) {
|
| + DownloadController.setDownloadNotificationService(
|
| + DownloadManagerService.getDownloadManagerService(application));
|
| + }
|
| + }
|
| + });
|
| + }
|
| +
|
| + /**
|
| + * Initializes activity logging.
|
| + */
|
| + protected void startApplicationActivityTracker() {}
|
| +}
|
|
|