blob: d3ea8eaebfa07d2f38d749b24b5a6dd7a14aec74 [file] [log] [blame]
// Copyright 2014 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.chromecast.shell;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Debug;
import android.util.Log;
import org.chromium.base.BaseSwitches;
import org.chromium.base.CommandLine;
import org.chromium.base.library_loader.LibraryLoader;
import org.chromium.base.library_loader.ProcessInitException;
import org.chromium.content.browser.BrowserStartupController;
import org.chromium.content.browser.DeviceUtils;
import org.chromium.content.common.ContentSwitches;
/**
* Static, one-time initialization for the browser process.
*/
public class CastBrowserHelper {
private static final String TAG = "CastBrowserHelper";
public static final String COMMAND_LINE_FILE = "/data/local/tmp/castshell-command-line";
public static final String COMMAND_LINE_ARGS_KEY = "commandLineArgs";
private static boolean sIsBrowserInitialized = false;
/**
* Starts the browser process synchronously, returning success or failure. If the browser has
* already started, immediately returns true without performing any more initialization.
* This may only be called on the UI thread.
*
* @return whether or not the process started successfully
*/
public static boolean initializeBrowser(Context context) {
if (sIsBrowserInitialized) return true;
Log.d(TAG, "Performing one-time browser initialization");
// Initializing the command line must occur before loading the library.
if (!CommandLine.isInitialized()) {
if (allowCommandLineImport()) {
Log.d(TAG, "Initializing command line from " + COMMAND_LINE_FILE);
CommandLine.initFromFile(COMMAND_LINE_FILE);
} else {
CommandLine.init(null);
}
if (context instanceof Activity) {
Intent launchingIntent = ((Activity) context).getIntent();
String[] commandLineParams = getCommandLineParamsFromIntent(launchingIntent);
if (commandLineParams != null) {
CommandLine.getInstance().appendSwitchesAndArguments(commandLineParams);
}
}
}
CommandLine.getInstance().appendSwitchWithValue(
ContentSwitches.FORCE_DEVICE_SCALE_FACTOR, "1");
waitForDebuggerIfNeeded();
DeviceUtils.addDeviceSpecificUserAgentSwitch(context);
try {
LibraryLoader.ensureInitialized();
Log.d(TAG, "Loading BrowserStartupController...");
BrowserStartupController.get(context).startBrowserProcessesSync(false);
sIsBrowserInitialized = true;
return true;
} catch (ProcessInitException e) {
Log.e(TAG, "Unable to launch browser process.", e);
return false;
}
}
private static boolean allowCommandLineImport() {
return !Build.TYPE.equals("user");
}
private static String[] getCommandLineParamsFromIntent(Intent intent) {
return intent != null ? intent.getStringArrayExtra(COMMAND_LINE_ARGS_KEY) : null;
}
private static void waitForDebuggerIfNeeded() {
if (!CommandLine.getInstance().hasSwitch(BaseSwitches.WAIT_FOR_JAVA_DEBUGGER)) {
return;
}
Log.e(TAG, "Waiting for Java debugger to connect...");
Debug.waitForDebugger();
Log.e(TAG, "Java debugger connected. Resuming execution.");
}
}