blob: e1d0d31a48782895a8870f1e0fa7907595e171d2 [file] [log] [blame]
// Copyright 2012 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.content_shell_apk;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.widget.Toast;
import org.chromium.base.CommandLine;
import org.chromium.base.MemoryPressureListener;
import org.chromium.base.library_loader.LibraryLoader;
import org.chromium.base.library_loader.LibraryProcessType;
import org.chromium.base.library_loader.ProcessInitException;
import org.chromium.content.browser.BrowserStartupController;
import org.chromium.content.browser.DeviceUtils;
import org.chromium.content_public.browser.WebContents;
import org.chromium.content_shell.Shell;
import org.chromium.content_shell.ShellManager;
import org.chromium.ui.base.ActivityWindowAndroid;
/**
* Activity for managing the Content Shell.
*/
public class ContentShellActivity extends Activity {
private static final String TAG = "ContentShellActivity";
private static final String ACTIVE_SHELL_URL_KEY = "activeUrl";
public static final String COMMAND_LINE_ARGS_KEY = "commandLineArgs";
// Native switch - shell_switches::kRunWebTests
private static final String RUN_WEB_TESTS_SWITCH = "run-web-tests";
private ShellManager mShellManager;
private ActivityWindowAndroid mWindowAndroid;
private Intent mLastSentIntent;
private String mStartupUrl;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Initializing the command line must occur before loading the library.
if (!CommandLine.isInitialized()) {
((ContentShellApplication) getApplication()).initCommandLine();
String[] commandLineParams = getCommandLineParamsFromIntent(getIntent());
if (commandLineParams != null) {
CommandLine.getInstance().appendSwitchesAndArguments(commandLineParams);
}
}
DeviceUtils.addDeviceSpecificUserAgentSwitch(this);
try {
LibraryLoader.get(LibraryProcessType.PROCESS_BROWSER).ensureInitialized();
} catch (ProcessInitException e) {
Log.e(TAG, "ContentView initialization failed.", e);
// Since the library failed to initialize nothing in the application
// can work, so kill the whole application not just the activity
System.exit(-1);
return;
}
setContentView(R.layout.content_shell_activity);
mShellManager = (ShellManager) findViewById(R.id.shell_container);
final boolean listenToActivityState = true;
mWindowAndroid = new ActivityWindowAndroid(this, listenToActivityState);
mWindowAndroid.restoreInstanceState(savedInstanceState);
mShellManager.setWindow(mWindowAndroid);
// Set up the animation placeholder to be the SurfaceView. This disables the
// SurfaceView's 'hole' clipping during animations that are notified to the window.
mWindowAndroid.setAnimationPlaceholderView(
mShellManager.getContentViewRenderView().getSurfaceView());
mStartupUrl = getUrlFromIntent(getIntent());
if (!TextUtils.isEmpty(mStartupUrl)) {
mShellManager.setStartupUrl(Shell.sanitizeUrl(mStartupUrl));
}
if (CommandLine.getInstance().hasSwitch(RUN_WEB_TESTS_SWITCH)) {
try {
BrowserStartupController.get(LibraryProcessType.PROCESS_BROWSER)
.startBrowserProcessesSync(false);
} catch (ProcessInitException e) {
Log.e(TAG, "Failed to load native library.", e);
System.exit(-1);
}
} else {
try {
BrowserStartupController.get(LibraryProcessType.PROCESS_BROWSER)
.startBrowserProcessesAsync(
true, new BrowserStartupController.StartupCallback() {
@Override
public void onSuccess() {
finishInitialization(savedInstanceState);
}
@Override
public void onFailure() {
initializationFailed();
}
});
} catch (ProcessInitException e) {
Log.e(TAG, "Unable to load native library.", e);
System.exit(-1);
}
}
}
private void finishInitialization(Bundle savedInstanceState) {
String shellUrl;
if (!TextUtils.isEmpty(mStartupUrl)) {
shellUrl = mStartupUrl;
} else {
shellUrl = ShellManager.DEFAULT_SHELL_URL;
}
if (savedInstanceState != null
&& savedInstanceState.containsKey(ACTIVE_SHELL_URL_KEY)) {
shellUrl = savedInstanceState.getString(ACTIVE_SHELL_URL_KEY);
}
mShellManager.launchShell(shellUrl);
}
private void initializationFailed() {
Log.e(TAG, "ContentView initialization failed.");
Toast.makeText(ContentShellActivity.this,
R.string.browser_process_initialization_failed,
Toast.LENGTH_SHORT).show();
finish();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
WebContents webContents = getActiveWebContents();
if (webContents != null) {
outState.putString(ACTIVE_SHELL_URL_KEY, webContents.getLastCommittedUrl());
}
mWindowAndroid.saveInstanceState(outState);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
WebContents webContents = getActiveWebContents();
if (webContents != null && webContents.getNavigationController().canGoBack()) {
webContents.getNavigationController().goBack();
return true;
}
}
return super.onKeyUp(keyCode, event);
}
@Override
protected void onNewIntent(Intent intent) {
if (getCommandLineParamsFromIntent(intent) != null) {
Log.i(TAG, "Ignoring command line params: can only be set when creating the activity.");
}
if (MemoryPressureListener.handleDebugIntent(this, intent.getAction())) return;
String url = getUrlFromIntent(intent);
if (!TextUtils.isEmpty(url)) {
Shell activeView = getActiveShell();
if (activeView != null) {
activeView.loadUrl(url);
}
}
}
@Override
protected void onStart() {
super.onStart();
WebContents webContents = getActiveWebContents();
if (webContents != null) webContents.onShow();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mWindowAndroid.onActivityResult(requestCode, resultCode, data);
}
@Override
public void startActivity(Intent i) {
mLastSentIntent = i;
super.startActivity(i);
}
@Override
protected void onDestroy() {
if (mShellManager != null) mShellManager.destroy();
super.onDestroy();
}
public Intent getLastSentIntent() {
return mLastSentIntent;
}
private static String getUrlFromIntent(Intent intent) {
return intent != null ? intent.getDataString() : null;
}
private static String[] getCommandLineParamsFromIntent(Intent intent) {
return intent != null ? intent.getStringArrayExtra(COMMAND_LINE_ARGS_KEY) : null;
}
/**
* @return The {@link ShellManager} configured for the activity or null if it has not been
* created yet.
*/
public ShellManager getShellManager() {
return mShellManager;
}
/**
* @return The currently visible {@link Shell} or null if one is not showing.
*/
public Shell getActiveShell() {
return mShellManager != null ? mShellManager.getActiveShell() : null;
}
/**
* @return The {@link WebContents} owned by the currently visible {@link Shell} or null if
* one is not showing.
*/
public WebContents getActiveWebContents() {
Shell shell = getActiveShell();
return shell != null ? shell.getWebContents() : null;
}
}