blob: 27f7d97ff709534d6026eabcbb831a6628af0f18 [file] [log] [blame]
The Android Open Source Project0c908882009-03-03 19:32:16 -08001/*
2 * Copyright (C) 2006 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Bijan Amirzada41242f22014-03-21 12:12:18 -070017package com.android.browser;
The Android Open Source Project0c908882009-03-03 19:32:16 -080018
The Android Open Source Project0c908882009-03-03 19:32:16 -080019import android.app.Activity;
qqzhoue6ff8b42013-07-23 17:28:48 +080020import android.app.AlertDialog;
John Reck7878f222012-04-18 16:23:14 -070021import android.app.KeyguardManager;
John Reck9d27ff52011-02-11 17:47:54 -080022import android.content.Context;
The Android Open Source Project0c908882009-03-03 19:32:16 -080023import android.content.Intent;
The Android Open Source Project0c908882009-03-03 19:32:16 -080024import android.content.res.Configuration;
The Android Open Source Project0c908882009-03-03 19:32:16 -080025import android.os.Bundle;
qqzhou8c5b0a32013-07-22 15:31:03 +080026import android.os.Handler;
John Reck7878f222012-04-18 16:23:14 -070027import android.os.PowerManager;
The Android Open Source Project0c908882009-03-03 19:32:16 -080028import android.util.Log;
Leon Scroggins III8e4fbf12010-08-17 16:58:15 -040029import android.view.ActionMode;
The Android Open Source Project0c908882009-03-03 19:32:16 -080030import android.view.ContextMenu;
Michael Kolba2b2ba82010-08-04 17:54:03 -070031import android.view.ContextMenu.ContextMenuInfo;
The Android Open Source Project0c908882009-03-03 19:32:16 -080032import android.view.KeyEvent;
The Android Open Source Project0c908882009-03-03 19:32:16 -080033import android.view.Menu;
The Android Open Source Project0c908882009-03-03 19:32:16 -080034import android.view.MenuItem;
Michael Kolbc3af0672011-08-09 10:24:41 -070035import android.view.MotionEvent;
The Android Open Source Project0c908882009-03-03 19:32:16 -080036import android.view.View;
The Android Open Source Project0c908882009-03-03 19:32:16 -080037import android.view.Window;
qqzhou8c5b0a32013-07-22 15:31:03 +080038import android.webkit.JavascriptInterface;
The Android Open Source Project0c908882009-03-03 19:32:16 -080039
John Reckd3e4d5b2011-07-13 15:48:43 -070040import com.google.common.annotations.VisibleForTesting;
Bijan Amirzada41242f22014-03-21 12:12:18 -070041import com.android.browser.R;
42import com.android.browser.UI.ComboViews;
43import com.android.browser.search.DefaultSearchEngine;
44import com.android.browser.search.SearchEngine;
45import com.android.browser.stub.NullController;
Bijan Amirzada9b1e9882014-02-26 17:15:46 -080046
Bijan Amirzada9b1e9882014-02-26 17:15:46 -080047import org.codeaurora.swe.WebSettings;
48import org.codeaurora.swe.WebView;
Tarun Nainanief749cb2014-05-19 18:16:53 -070049import org.chromium.content.browser.TracingControllerAndroid;
John Reckd3e4d5b2011-07-13 15:48:43 -070050
Michael Kolb8233fac2010-10-26 16:08:53 -070051public class BrowserActivity extends Activity {
The Android Open Source Project0c908882009-03-03 19:32:16 -080052
John Reck439c9a52010-12-14 10:04:39 -080053 public static final String ACTION_SHOW_BOOKMARKS = "show_bookmarks";
54 public static final String ACTION_SHOW_BROWSER = "show_browser";
John Reck63bb6872010-12-01 19:29:32 -080055 public static final String ACTION_RESTART = "--restart--";
56 private static final String EXTRA_STATE = "state";
John Reck38b39652012-06-05 09:22:59 -070057 public static final String EXTRA_DISABLE_URL_OVERRIDE = "disable_url_override";
John Reck63bb6872010-12-01 19:29:32 -080058
Michael Kolb8233fac2010-10-26 16:08:53 -070059 private final static String LOGTAG = "browser";
The Android Open Source Project0c908882009-03-03 19:32:16 -080060
John Reck6c2e2f32011-08-22 13:41:23 -070061 private final static boolean LOGV_ENABLED = Browser.LOGV_ENABLED;
Dave Bort31a6d1c2009-04-13 15:56:49 -070062
John Reck9c35b9c2012-05-30 10:08:50 -070063 private ActivityController mController = NullController.INSTANCE;
Tarun Nainanief749cb2014-05-19 18:16:53 -070064 private TracingControllerAndroid mTracingController;
Bijan Amirzada9b1e9882014-02-26 17:15:46 -080065
66
qqzhou8c5b0a32013-07-22 15:31:03 +080067 private Handler mHandler = new Handler();
Jeff Davidson43610292010-07-16 16:03:58 -070068
kaiyizbb2db872013-08-01 22:24:07 -040069 private UiController mUiController;
70 private Handler mHandlerEx = new Handler();
71 private Runnable runnable = new Runnable() {
72 @Override
73 public void run() {
74 if (mUiController != null) {
75 WebView current = mUiController.getCurrentWebView();
76 if (current != null) {
77 current.postInvalidate();
78 }
79 }
80 }
81 };
82
Tarun Nainanief749cb2014-05-19 18:16:53 -070083 private TracingControllerAndroid getTracingController() {
84 if (mTracingController == null) {
85 mTracingController = new TracingControllerAndroid(this);
86 }
87 return mTracingController;
88 }
Bijan Amirzada9b1e9882014-02-26 17:15:46 -080089
Grace Kloba22ac16e2009-10-07 18:00:23 -070090 @Override
91 public void onCreate(Bundle icicle) {
Dave Bort31a6d1c2009-04-13 15:56:49 -070092 if (LOGV_ENABLED) {
John Reck6c2e2f32011-08-22 13:41:23 -070093 Log.v(LOGTAG, this + " onStart, has state: "
94 + (icicle == null ? "false" : "true"));
The Android Open Source Project0c908882009-03-03 19:32:16 -080095 }
96 super.onCreate(icicle);
Derek Sollenbergerffa561e2010-11-16 14:19:01 -050097
Pankaj Gargf04dbda2014-10-02 13:52:46 -070098 Thread.setDefaultUncaughtExceptionHandler(new CrashLogExceptionHandler(this));
99
John Reck7878f222012-04-18 16:23:14 -0700100 if (shouldIgnoreIntents()) {
101 finish();
102 return;
103 }
104
John Reckf57c0292011-07-21 18:15:39 -0700105 // If this was a web search request, pass it on to the default web
106 // search provider and finish this activity.
Bijan Amirzada41242f22014-03-21 12:12:18 -0700107 /*
kaiyiza2368f12013-09-02 10:43:31 +0800108 SearchEngine searchEngine = BrowserSettings.getInstance().getSearchEngine();
109 boolean result = IntentHandler.handleWebSearchIntent(this, null, getIntent());
110 if (result && (searchEngine instanceof DefaultSearchEngine)) {
John Reckf57c0292011-07-21 18:15:39 -0700111 finish();
112 return;
113 }
Bijan Amirzada41242f22014-03-21 12:12:18 -0700114 */
John Reck9c35b9c2012-05-30 10:08:50 -0700115 mController = createController();
The Android Open Source Project0c908882009-03-03 19:32:16 -0800116
George Mount3636d0a2011-11-21 09:08:21 -0800117 Intent intent = (icicle == null) ? getIntent() : null;
118 mController.start(intent);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800119 }
120
John Recka5176f32011-05-17 12:35:37 -0700121 public static boolean isTablet(Context context) {
122 return context.getResources().getBoolean(R.bool.isTablet);
John Reck9d27ff52011-02-11 17:47:54 -0800123 }
124
John Reck9c35b9c2012-05-30 10:08:50 -0700125 private Controller createController() {
126 Controller controller = new Controller(this);
127 boolean xlarge = isTablet(this);
128 UI ui = null;
129 if (xlarge) {
kaiyizbb2db872013-08-01 22:24:07 -0400130 XLargeUi tablet = new XLargeUi(this, controller);
131 ui = tablet;
132 mUiController = tablet.getUiController();
John Reck9c35b9c2012-05-30 10:08:50 -0700133 } else {
kaiyizbb2db872013-08-01 22:24:07 -0400134 PhoneUi phone = new PhoneUi(this, controller);
135 ui = phone;
136 mUiController = phone.getUiController();
John Reck9c35b9c2012-05-30 10:08:50 -0700137 }
138 controller.setUi(ui);
139 return controller;
140 }
141
John Reck41554852010-12-01 12:53:37 -0800142 @VisibleForTesting
Tarun Nainani436b8732014-06-10 13:58:41 -0700143 //public to facilitate testing
144 public Controller getController() {
John Reck9c35b9c2012-05-30 10:08:50 -0700145 return (Controller) mController;
Michael Kolba2b2ba82010-08-04 17:54:03 -0700146 }
147
The Android Open Source Project0c908882009-03-03 19:32:16 -0800148 @Override
149 protected void onNewIntent(Intent intent) {
John Reck7878f222012-04-18 16:23:14 -0700150 if (shouldIgnoreIntents()) return;
John Reck63bb6872010-12-01 19:29:32 -0800151 if (ACTION_RESTART.equals(intent.getAction())) {
152 Bundle outState = new Bundle();
John Reck1cf4b792011-07-26 10:22:22 -0700153 mController.onSaveInstanceState(outState);
John Reck63bb6872010-12-01 19:29:32 -0800154 finish();
155 getApplicationContext().startActivity(
156 new Intent(getApplicationContext(), BrowserActivity.class)
157 .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
158 .putExtra(EXTRA_STATE, outState));
159 return;
160 }
Michael Kolb8233fac2010-10-26 16:08:53 -0700161 mController.handleNewIntent(intent);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800162 }
163
John Reck7878f222012-04-18 16:23:14 -0700164 private KeyguardManager mKeyguardManager;
165 private PowerManager mPowerManager;
166 private boolean shouldIgnoreIntents() {
167 // Only process intents if the screen is on and the device is unlocked
168 // aka, if we will be user-visible
169 if (mKeyguardManager == null) {
170 mKeyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
171 }
172 if (mPowerManager == null) {
173 mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
174 }
175 boolean ignore = !mPowerManager.isScreenOn();
176 ignore |= mKeyguardManager.inKeyguardRestrictedInputMode();
177 if (LOGV_ENABLED) {
178 Log.v(LOGTAG, "ignore intents: " + ignore);
179 }
180 return ignore;
181 }
182
Grace Kloba22ac16e2009-10-07 18:00:23 -0700183 @Override
184 protected void onResume() {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800185 super.onResume();
Dave Bort31a6d1c2009-04-13 15:56:49 -0700186 if (LOGV_ENABLED) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800187 Log.v(LOGTAG, "BrowserActivity.onResume: this=" + this);
188 }
John Reck9c35b9c2012-05-30 10:08:50 -0700189 mController.onResume();
Tarun Nainanief749cb2014-05-19 18:16:53 -0700190
191 getTracingController().registerReceiver(this);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800192 }
193
Leon Scrogginsa81a7642009-08-31 17:05:41 -0400194 @Override
195 public boolean onMenuOpened(int featureId, Menu menu) {
Leon Scroggins3bbb6ca2009-09-09 12:51:10 -0400196 if (Window.FEATURE_OPTIONS_PANEL == featureId) {
Michael Kolb8233fac2010-10-26 16:08:53 -0700197 mController.onMenuOpened(featureId, menu);
Leon Scroggins3bbb6ca2009-09-09 12:51:10 -0400198 }
Leon Scrogginsa81a7642009-08-31 17:05:41 -0400199 return true;
200 }
201
Leon Scroggins3bbb6ca2009-09-09 12:51:10 -0400202 @Override
203 public void onOptionsMenuClosed(Menu menu) {
Michael Kolb8233fac2010-10-26 16:08:53 -0700204 mController.onOptionsMenuClosed(menu);
Leon Scrogginsc6fa1102009-09-21 10:40:01 -0400205 }
206
Leon Scrogginsb2b19f52009-10-09 16:10:00 -0400207 @Override
208 public void onContextMenuClosed(Menu menu) {
209 super.onContextMenuClosed(menu);
Michael Kolb8233fac2010-10-26 16:08:53 -0700210 mController.onContextMenuClosed(menu);
Leon Scrogginsb2b19f52009-10-09 16:10:00 -0400211 }
212
Leon Scrogginsc6fa1102009-09-21 10:40:01 -0400213 /**
The Android Open Source Project0c908882009-03-03 19:32:16 -0800214 * onSaveInstanceState(Bundle map)
215 * onSaveInstanceState is called right before onStop(). The map contains
216 * the saved state.
217 */
Grace Kloba22ac16e2009-10-07 18:00:23 -0700218 @Override
219 protected void onSaveInstanceState(Bundle outState) {
Dave Bort31a6d1c2009-04-13 15:56:49 -0700220 if (LOGV_ENABLED) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800221 Log.v(LOGTAG, "BrowserActivity.onSaveInstanceState: this=" + this);
222 }
John Reck9c35b9c2012-05-30 10:08:50 -0700223 mController.onSaveInstanceState(outState);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800224 }
225
Grace Kloba22ac16e2009-10-07 18:00:23 -0700226 @Override
227 protected void onPause() {
John Reck9c35b9c2012-05-30 10:08:50 -0700228 mController.onPause();
The Android Open Source Project0c908882009-03-03 19:32:16 -0800229 super.onPause();
Tarun Nainanief749cb2014-05-19 18:16:53 -0700230 getTracingController().unregisterReceiver(this);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800231 }
232
Grace Kloba22ac16e2009-10-07 18:00:23 -0700233 @Override
234 protected void onDestroy() {
Dave Bort31a6d1c2009-04-13 15:56:49 -0700235 if (LOGV_ENABLED) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800236 Log.v(LOGTAG, "BrowserActivity.onDestroy: this=" + this);
237 }
238 super.onDestroy();
John Reck9c35b9c2012-05-30 10:08:50 -0700239 mController.onDestroy();
240 mController = NullController.INSTANCE;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800241 }
242
243 @Override
244 public void onConfigurationChanged(Configuration newConfig) {
245 super.onConfigurationChanged(newConfig);
John Reck9c35b9c2012-05-30 10:08:50 -0700246 mController.onConfgurationChanged(newConfig);
kaiyizbb2db872013-08-01 22:24:07 -0400247
248 //For avoiding bug CR520353 temporarily, delay 300ms to refresh WebView.
249 mHandlerEx.postDelayed(runnable, 300);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800250 }
251
Grace Kloba22ac16e2009-10-07 18:00:23 -0700252 @Override
253 public void onLowMemory() {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800254 super.onLowMemory();
Michael Kolb8233fac2010-10-26 16:08:53 -0700255 mController.onLowMemory();
Grace Kloba22ac16e2009-10-07 18:00:23 -0700256 }
257
The Android Open Source Project0c908882009-03-03 19:32:16 -0800258 @Override
259 public boolean onCreateOptionsMenu(Menu menu) {
260 super.onCreateOptionsMenu(menu);
John Reck9c35b9c2012-05-30 10:08:50 -0700261 return mController.onCreateOptionsMenu(menu);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800262 }
263
264 @Override
Michael Kolb8233fac2010-10-26 16:08:53 -0700265 public boolean onPrepareOptionsMenu(Menu menu) {
266 super.onPrepareOptionsMenu(menu);
John Reckb3417f02011-01-14 11:01:05 -0800267 return mController.onPrepareOptionsMenu(menu);
Cary Clark01cfcdd2010-06-04 16:36:45 -0400268 }
269
The Android Open Source Project0c908882009-03-03 19:32:16 -0800270 @Override
271 public boolean onOptionsItemSelected(MenuItem item) {
Michael Kolb8233fac2010-10-26 16:08:53 -0700272 if (!mController.onOptionsItemSelected(item)) {
273 return super.onOptionsItemSelected(item);
Michael Kolb370a4f32010-10-06 10:45:32 -0700274 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800275 return true;
276 }
277
278 @Override
279 public void onCreateContextMenu(ContextMenu menu, View v,
280 ContextMenuInfo menuInfo) {
Michael Kolb8233fac2010-10-26 16:08:53 -0700281 mController.onCreateContextMenu(menu, v, menuInfo);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800282 }
283
Michael Kolb8233fac2010-10-26 16:08:53 -0700284 @Override
285 public boolean onContextItemSelected(MenuItem item) {
286 return mController.onContextItemSelected(item);
Grace Kloba22ac16e2009-10-07 18:00:23 -0700287 }
288
Grace Kloba5942df02009-09-18 11:48:29 -0700289 @Override
290 public boolean onKeyDown(int keyCode, KeyEvent event) {
Michael Kolb8233fac2010-10-26 16:08:53 -0700291 return mController.onKeyDown(keyCode, event) ||
292 super.onKeyDown(keyCode, event);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800293 }
294
Grace Kloba5942df02009-09-18 11:48:29 -0700295 @Override
John Recke6bf4ab2011-02-24 15:48:05 -0800296 public boolean onKeyLongPress(int keyCode, KeyEvent event) {
297 return mController.onKeyLongPress(keyCode, event) ||
298 super.onKeyLongPress(keyCode, event);
299 }
300
301 @Override
Grace Kloba5942df02009-09-18 11:48:29 -0700302 public boolean onKeyUp(int keyCode, KeyEvent event) {
Michael Kolb8233fac2010-10-26 16:08:53 -0700303 return mController.onKeyUp(keyCode, event) ||
304 super.onKeyUp(keyCode, event);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800305 }
306
Michael Kolbe421c242010-10-04 19:29:01 -0700307 @Override
Michael Kolb8233fac2010-10-26 16:08:53 -0700308 public void onActionModeStarted(ActionMode mode) {
309 super.onActionModeStarted(mode);
310 mController.onActionModeStarted(mode);
Michael Kolbe421c242010-10-04 19:29:01 -0700311 }
312
Michael Kolbe421c242010-10-04 19:29:01 -0700313 @Override
Michael Kolb8233fac2010-10-26 16:08:53 -0700314 public void onActionModeFinished(ActionMode mode) {
315 super.onActionModeFinished(mode);
316 mController.onActionModeFinished(mode);
Michael Kolbe421c242010-10-04 19:29:01 -0700317 }
318
The Android Open Source Project0c908882009-03-03 19:32:16 -0800319 @Override
320 protected void onActivityResult(int requestCode, int resultCode,
Michael Kolb8233fac2010-10-26 16:08:53 -0700321 Intent intent) {
322 mController.onActivityResult(requestCode, resultCode, intent);
Andrei Popescu163ab742009-10-20 17:58:23 +0100323 }
324
Michael Kolbfbc579a2011-07-07 15:59:33 -0700325 @Override
326 public boolean onSearchRequested() {
327 return mController.onSearchRequested();
328 }
329
Michael Kolbc3af0672011-08-09 10:24:41 -0700330 @Override
331 public boolean dispatchKeyEvent(KeyEvent event) {
332 return mController.dispatchKeyEvent(event)
333 || super.dispatchKeyEvent(event);
334 }
335
336 @Override
337 public boolean dispatchKeyShortcutEvent(KeyEvent event) {
338 return mController.dispatchKeyShortcutEvent(event)
339 || super.dispatchKeyShortcutEvent(event);
340 }
341
342 @Override
343 public boolean dispatchTouchEvent(MotionEvent ev) {
344 return mController.dispatchTouchEvent(ev)
345 || super.dispatchTouchEvent(ev);
346 }
347
348 @Override
349 public boolean dispatchTrackballEvent(MotionEvent ev) {
350 return mController.dispatchTrackballEvent(ev)
351 || super.dispatchTrackballEvent(ev);
352 }
353
354 @Override
355 public boolean dispatchGenericMotionEvent(MotionEvent ev) {
356 return mController.dispatchGenericMotionEvent(ev) ||
357 super.dispatchGenericMotionEvent(ev);
358 }
359
qqzhou8c5b0a32013-07-22 15:31:03 +0800360 // add for carrier homepage feature
361 @JavascriptInterface
362 public void loadBookmarks() {
363 mHandler.post(new Runnable() {
364 @Override
365 public void run() {
366 if (mController instanceof Controller) {
367 ((Controller)mController).bookmarksOrHistoryPicker(ComboViews.Bookmarks);
368 }
369 }
370 });
371 }
372
373 // add for carrier homepage feature
374 @JavascriptInterface
375 public void loadHistory() {
376 mHandler.post(new Runnable() {
377 @Override
378 public void run() {
379 if (mController instanceof Controller) {
380 ((Controller)mController).bookmarksOrHistoryPicker(ComboViews.History);
381 }
382 }
383 });
384 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800385}