diff options
Diffstat (limited to 'src/com/android/swe/browser/BrowserActivity.java')
-rw-r--r-- | src/com/android/swe/browser/BrowserActivity.java | 381 |
1 files changed, 381 insertions, 0 deletions
diff --git a/src/com/android/swe/browser/BrowserActivity.java b/src/com/android/swe/browser/BrowserActivity.java new file mode 100644 index 00000000..a58e2a4b --- /dev/null +++ b/src/com/android/swe/browser/BrowserActivity.java @@ -0,0 +1,381 @@ +/* + * Copyright (C) 2006 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.browser; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.KeyguardManager; +import android.content.Context; +import android.content.Intent; +import android.content.res.Configuration; +import android.os.Bundle; +import android.os.Handler; +import android.os.PowerManager; +import android.util.Log; +import android.view.ActionMode; +import android.view.ContextMenu; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.View; +import android.view.Window; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.JavascriptInterface; + +import com.android.browser.UI.ComboViews; +import com.android.browser.search.DefaultSearchEngine; +import com.android.browser.search.SearchEngine; +import com.android.browser.stub.NullController; + +import com.google.common.annotations.VisibleForTesting; + +public class BrowserActivity extends Activity { + + public static final String ACTION_SHOW_BOOKMARKS = "show_bookmarks"; + public static final String ACTION_SHOW_BROWSER = "show_browser"; + public static final String ACTION_RESTART = "--restart--"; + private static final String EXTRA_STATE = "state"; + public static final String EXTRA_DISABLE_URL_OVERRIDE = "disable_url_override"; + + private final static String LOGTAG = "browser"; + + private final static boolean LOGV_ENABLED = Browser.LOGV_ENABLED; + + private ActivityController mController = NullController.INSTANCE; + private Handler mHandler = new Handler(); + + private UiController mUiController; + private Handler mHandlerEx = new Handler(); + private Runnable runnable = new Runnable() { + @Override + public void run() { + if (mUiController != null) { + WebView current = mUiController.getCurrentWebView(); + if (current != null) { + current.postInvalidate(); + } + } + } + }; + + @Override + public void onCreate(Bundle icicle) { + if (LOGV_ENABLED) { + Log.v(LOGTAG, this + " onStart, has state: " + + (icicle == null ? "false" : "true")); + } + super.onCreate(icicle); + + if (shouldIgnoreIntents()) { + finish(); + return; + } + + // If this was a web search request, pass it on to the default web + // search provider and finish this activity. + SearchEngine searchEngine = BrowserSettings.getInstance().getSearchEngine(); + boolean result = IntentHandler.handleWebSearchIntent(this, null, getIntent()); + if (result && (searchEngine instanceof DefaultSearchEngine)) { + finish(); + return; + } + mController = createController(); + + Intent intent = (icicle == null) ? getIntent() : null; + mController.start(intent); + } + + public static boolean isTablet(Context context) { + return context.getResources().getBoolean(R.bool.isTablet); + } + + private Controller createController() { + Controller controller = new Controller(this); + boolean xlarge = isTablet(this); + UI ui = null; + if (xlarge) { + XLargeUi tablet = new XLargeUi(this, controller); + ui = tablet; + mUiController = tablet.getUiController(); + } else { + PhoneUi phone = new PhoneUi(this, controller); + ui = phone; + mUiController = phone.getUiController(); + } + controller.setUi(ui); + return controller; + } + + @VisibleForTesting + Controller getController() { + return (Controller) mController; + } + + @Override + protected void onNewIntent(Intent intent) { + if (shouldIgnoreIntents()) return; + if (ACTION_RESTART.equals(intent.getAction())) { + Bundle outState = new Bundle(); + mController.onSaveInstanceState(outState); + finish(); + getApplicationContext().startActivity( + new Intent(getApplicationContext(), BrowserActivity.class) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .putExtra(EXTRA_STATE, outState)); + return; + } + mController.handleNewIntent(intent); + } + + private KeyguardManager mKeyguardManager; + private PowerManager mPowerManager; + private boolean shouldIgnoreIntents() { + // Only process intents if the screen is on and the device is unlocked + // aka, if we will be user-visible + if (mKeyguardManager == null) { + mKeyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); + } + if (mPowerManager == null) { + mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); + } + boolean ignore = !mPowerManager.isScreenOn(); + ignore |= mKeyguardManager.inKeyguardRestrictedInputMode(); + if (LOGV_ENABLED) { + Log.v(LOGTAG, "ignore intents: " + ignore); + } + return ignore; + } + + @Override + protected void onResume() { + super.onResume(); + if (LOGV_ENABLED) { + Log.v(LOGTAG, "BrowserActivity.onResume: this=" + this); + } + mController.onResume(); + } + + @Override + public boolean onMenuOpened(int featureId, Menu menu) { + if (Window.FEATURE_OPTIONS_PANEL == featureId) { + mController.onMenuOpened(featureId, menu); + } + return true; + } + + @Override + public void onOptionsMenuClosed(Menu menu) { + mController.onOptionsMenuClosed(menu); + } + + @Override + public void onContextMenuClosed(Menu menu) { + super.onContextMenuClosed(menu); + mController.onContextMenuClosed(menu); + } + + /** + * onSaveInstanceState(Bundle map) + * onSaveInstanceState is called right before onStop(). The map contains + * the saved state. + */ + @Override + protected void onSaveInstanceState(Bundle outState) { + if (LOGV_ENABLED) { + Log.v(LOGTAG, "BrowserActivity.onSaveInstanceState: this=" + this); + } + mController.onSaveInstanceState(outState); + } + + @Override + protected void onPause() { + mController.onPause(); + super.onPause(); + } + + @Override + protected void onDestroy() { + if (LOGV_ENABLED) { + Log.v(LOGTAG, "BrowserActivity.onDestroy: this=" + this); + } + super.onDestroy(); + mController.onDestroy(); + mController = NullController.INSTANCE; + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + mController.onConfgurationChanged(newConfig); + + //For avoiding bug CR520353 temporarily, delay 300ms to refresh WebView. + mHandlerEx.postDelayed(runnable, 300); + } + + @Override + public void onLowMemory() { + super.onLowMemory(); + mController.onLowMemory(); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + super.onCreateOptionsMenu(menu); + return mController.onCreateOptionsMenu(menu); + } + + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + super.onPrepareOptionsMenu(menu); + return mController.onPrepareOptionsMenu(menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (!mController.onOptionsItemSelected(item)) { + if (item.getItemId() == R.id.about_menu_id) { + final AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(R.string.about); + builder.setCancelable(true); + String ua = ""; + final WebView current = getController().getCurrentWebView(); + if (current != null) { + final WebSettings s = current.getSettings(); + if (s != null) { + ua = s.getUserAgentString(); + } + } + builder.setMessage("Agent:" + ua); + builder.setPositiveButton(android.R.string.ok, null); + builder.create().show(); + } + return super.onOptionsItemSelected(item); + } + return true; + } + + @Override + public void onCreateContextMenu(ContextMenu menu, View v, + ContextMenuInfo menuInfo) { + mController.onCreateContextMenu(menu, v, menuInfo); + } + + @Override + public boolean onContextItemSelected(MenuItem item) { + return mController.onContextItemSelected(item); + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + return mController.onKeyDown(keyCode, event) || + super.onKeyDown(keyCode, event); + } + + @Override + public boolean onKeyLongPress(int keyCode, KeyEvent event) { + return mController.onKeyLongPress(keyCode, event) || + super.onKeyLongPress(keyCode, event); + } + + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) { + return mController.onKeyUp(keyCode, event) || + super.onKeyUp(keyCode, event); + } + + @Override + public void onActionModeStarted(ActionMode mode) { + super.onActionModeStarted(mode); + mController.onActionModeStarted(mode); + } + + @Override + public void onActionModeFinished(ActionMode mode) { + super.onActionModeFinished(mode); + mController.onActionModeFinished(mode); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, + Intent intent) { + mController.onActivityResult(requestCode, resultCode, intent); + } + + @Override + public boolean onSearchRequested() { + return mController.onSearchRequested(); + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + return mController.dispatchKeyEvent(event) + || super.dispatchKeyEvent(event); + } + + @Override + public boolean dispatchKeyShortcutEvent(KeyEvent event) { + return mController.dispatchKeyShortcutEvent(event) + || super.dispatchKeyShortcutEvent(event); + } + + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + return mController.dispatchTouchEvent(ev) + || super.dispatchTouchEvent(ev); + } + + @Override + public boolean dispatchTrackballEvent(MotionEvent ev) { + return mController.dispatchTrackballEvent(ev) + || super.dispatchTrackballEvent(ev); + } + + @Override + public boolean dispatchGenericMotionEvent(MotionEvent ev) { + return mController.dispatchGenericMotionEvent(ev) || + super.dispatchGenericMotionEvent(ev); + } + + // add for carrier homepage feature + @JavascriptInterface + public void loadBookmarks() { + mHandler.post(new Runnable() { + @Override + public void run() { + if (mController instanceof Controller) { + ((Controller)mController).bookmarksOrHistoryPicker(ComboViews.Bookmarks); + } + } + }); + } + + // add for carrier homepage feature + @JavascriptInterface + public void loadHistory() { + mHandler.post(new Runnable() { + @Override + public void run() { + if (mController instanceof Controller) { + ((Controller)mController).bookmarksOrHistoryPicker(ComboViews.History); + } + } + }); + } +} |