package com.hawkbrowser.chromecontent;
import org.chromium.base.BaseSwitches;
import org.chromium.base.CommandLine;
import org.chromium.base.PathUtils;
import org.chromium.content.app.LibraryLoader;
import org.chromium.content.browser.BrowserStartupController;
import org.chromium.content.browser.ResourceExtractor;
import org.chromium.content.common.ProcessInitException;
import android.content.Context;
import android.util.Log;
public class ChromeInitializer {
public interface InitializeCallback {
void onSuccess(boolean alreadyStarted);
void onFailure();
}
public static final String COMMAND_LINE_FILE = "/data/local/tmp/content-shell-command-line";
private static final String TAG = "ChromeInitializer";
private static final String[] MANDATORY_PAK_FILES = new String[] {"content_shell.pak"};
private static final String PRIVATE_DATA_DIRECTORY_SUFFIX = "content_shell";
private static Object mLock = new Object();
private static ChromeInitializer mInstance = null;
private boolean mIsInitialized = false;
private boolean mIsStart = false;
private boolean mIsLibraryLoaded = false;
private boolean mIsStartFinished = false;
private InitializeCallback mCallback;
public static ChromeInitializer get() {
if(null == mInstance) {
synchronized(mLock) {
if(null == mInstance) {
mInstance = new ChromeInitializer();
}
}
}
return mInstance;
}
private ChromeInitializer() {
}
public boolean isInitialized() {
return mIsInitialized;
}
public void initialize() throws ProcessInitException {
if(mIsInitialized)
return;
mIsInitialized = true;
ResourceExtractor.setMandatoryPaksToExtract(MANDATORY_PAK_FILES);
PathUtils.setPrivateDataDirectorySuffix(PRIVATE_DATA_DIRECTORY_SUFFIX);
if (!CommandLine.isInitialized())
CommandLine.initFromFile(COMMAND_LINE_FILE);
waitForDebuggerIfNeeded();
}
// package internal only
public void ensureLibraryLoaded() throws ProcessInitException {
if(mIsLibraryLoaded)
return;
mIsLibraryLoaded = true;
try {
LibraryLoader.ensureInitialized();
} catch (ProcessInitException e) {
Log.e(TAG, "ContentView initialization failed.", e);
throw e;
}
}
public void setCallback(InitializeCallback callback) {
mCallback = callback;
}
public boolean isChromeStartFinished() {
return mIsStartFinished;
}
public void startChrome(Context context) throws ProcessInitException {
if(mIsStart)
return;
mIsStart = true;
try {
// single process mode
// BrowserStartupController.get(context).startBrowserProcessesSync(
// BrowserStartupController.MAX_RENDERERS_SINGLE_PROCESS);
//
// mIsStartFinished = true;
//
// multiple process mode
BrowserStartupController.get(context).startBrowserProcessesAsync(
new BrowserStartupController.StartupCallback() {
@Override
public void onSuccess(boolean alreadyStarted) {
mIsStartFinished = true;
if(null != mCallback)
mCallback.onSuccess(alreadyStarted);
}
@Override
public void onFailure() {
mIsStartFinished = true;
if(null != mCallback)
mCallback.onFailure();
}
});
} catch (ProcessInitException e) {
Log.e(TAG, "Unable to load native library.", e);
throw e;
}
}
//
private void waitForDebuggerIfNeeded() {
if (CommandLine.getInstance().hasSwitch(BaseSwitches.WAIT_FOR_JAVA_DEBUGGER)) {
Log.e(TAG, "Waiting for Java debugger to connect...");
android.os.Debug.waitForDebugger();
Log.e(TAG, "Java debugger connected. Resuming execution.");
}
}
}