blob: 85af8af3b003b4cddfb16076cd71afeb147185d4 [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
17package com.android.browser;
18
The Android Open Source Project0c908882009-03-03 19:32:16 -080019import android.app.Activity;
LuK13372be2de92015-12-17 21:32:46 +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;
LuK13372be2de92015-12-17 21:32:46 +080024import android.content.pm.PackageManager;
The Android Open Source Project0c908882009-03-03 19:32:16 -080025import android.content.res.Configuration;
The Android Open Source Project0c908882009-03-03 19:32:16 -080026import android.os.Bundle;
John Reck7878f222012-04-18 16:23:14 -070027import android.os.PowerManager;
LuK13372be2de92015-12-17 21:32:46 +080028import android.support.v4.app.ActivityCompat;
The Android Open Source Project0c908882009-03-03 19:32:16 -080029import android.util.Log;
Leon Scroggins III8e4fbf12010-08-17 16:58:15 -040030import android.view.ActionMode;
The Android Open Source Project0c908882009-03-03 19:32:16 -080031import android.view.ContextMenu;
Michael Kolba2b2ba82010-08-04 17:54:03 -070032import android.view.ContextMenu.ContextMenuInfo;
The Android Open Source Project0c908882009-03-03 19:32:16 -080033import android.view.KeyEvent;
The Android Open Source Project0c908882009-03-03 19:32:16 -080034import android.view.Menu;
The Android Open Source Project0c908882009-03-03 19:32:16 -080035import android.view.MenuItem;
Michael Kolbc3af0672011-08-09 10:24:41 -070036import android.view.MotionEvent;
The Android Open Source Project0c908882009-03-03 19:32:16 -080037import android.view.View;
The Android Open Source Project0c908882009-03-03 19:32:16 -080038import android.view.Window;
The Android Open Source Project0c908882009-03-03 19:32:16 -080039
John Reck9c35b9c2012-05-30 10:08:50 -070040import com.android.browser.stub.NullController;
John Reckd3e4d5b2011-07-13 15:48:43 -070041import com.google.common.annotations.VisibleForTesting;
42
LuK13372be2de92015-12-17 21:32:46 +080043public class BrowserActivity extends Activity
44 implements ActivityCompat.OnRequestPermissionsResultCallback {
The Android Open Source Project0c908882009-03-03 19:32:16 -080045
John Reck439c9a52010-12-14 10:04:39 -080046 public static final String ACTION_SHOW_BOOKMARKS = "show_bookmarks";
47 public static final String ACTION_SHOW_BROWSER = "show_browser";
John Reck63bb6872010-12-01 19:29:32 -080048 public static final String ACTION_RESTART = "--restart--";
49 private static final String EXTRA_STATE = "state";
John Reck38b39652012-06-05 09:22:59 -070050 public static final String EXTRA_DISABLE_URL_OVERRIDE = "disable_url_override";
John Reck63bb6872010-12-01 19:29:32 -080051
Michael Kolb8233fac2010-10-26 16:08:53 -070052 private final static String LOGTAG = "browser";
The Android Open Source Project0c908882009-03-03 19:32:16 -080053
John Reck6c2e2f32011-08-22 13:41:23 -070054 private final static boolean LOGV_ENABLED = Browser.LOGV_ENABLED;
Dave Bort31a6d1c2009-04-13 15:56:49 -070055
John Reck9c35b9c2012-05-30 10:08:50 -070056 private ActivityController mController = NullController.INSTANCE;
Jeff Davidson43610292010-07-16 16:03:58 -070057
LuK13372be2de92015-12-17 21:32:46 +080058 public static final int PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 1;
59
Grace Kloba22ac16e2009-10-07 18:00:23 -070060 @Override
61 public void onCreate(Bundle icicle) {
Dave Bort31a6d1c2009-04-13 15:56:49 -070062 if (LOGV_ENABLED) {
John Reck6c2e2f32011-08-22 13:41:23 -070063 Log.v(LOGTAG, this + " onStart, has state: "
64 + (icicle == null ? "false" : "true"));
The Android Open Source Project0c908882009-03-03 19:32:16 -080065 }
66 super.onCreate(icicle);
Derek Sollenbergerffa561e2010-11-16 14:19:01 -050067
John Reck7878f222012-04-18 16:23:14 -070068 if (shouldIgnoreIntents()) {
69 finish();
70 return;
71 }
72
John Reckf57c0292011-07-21 18:15:39 -070073 // If this was a web search request, pass it on to the default web
74 // search provider and finish this activity.
75 if (IntentHandler.handleWebSearchIntent(this, null, getIntent())) {
76 finish();
77 return;
78 }
John Reck9c35b9c2012-05-30 10:08:50 -070079 mController = createController();
The Android Open Source Project0c908882009-03-03 19:32:16 -080080
George Mount3636d0a2011-11-21 09:08:21 -080081 Intent intent = (icicle == null) ? getIntent() : null;
82 mController.start(intent);
The Android Open Source Project0c908882009-03-03 19:32:16 -080083 }
84
John Recka5176f32011-05-17 12:35:37 -070085 public static boolean isTablet(Context context) {
86 return context.getResources().getBoolean(R.bool.isTablet);
John Reck9d27ff52011-02-11 17:47:54 -080087 }
88
John Reck9c35b9c2012-05-30 10:08:50 -070089 private Controller createController() {
90 Controller controller = new Controller(this);
91 boolean xlarge = isTablet(this);
92 UI ui = null;
93 if (xlarge) {
94 ui = new XLargeUi(this, controller);
95 } else {
96 ui = new PhoneUi(this, controller);
97 }
98 controller.setUi(ui);
99 return controller;
100 }
101
John Reck41554852010-12-01 12:53:37 -0800102 @VisibleForTesting
Michael Kolb8233fac2010-10-26 16:08:53 -0700103 Controller getController() {
John Reck9c35b9c2012-05-30 10:08:50 -0700104 return (Controller) mController;
Michael Kolba2b2ba82010-08-04 17:54:03 -0700105 }
106
The Android Open Source Project0c908882009-03-03 19:32:16 -0800107 @Override
108 protected void onNewIntent(Intent intent) {
John Reck7878f222012-04-18 16:23:14 -0700109 if (shouldIgnoreIntents()) return;
John Reck63bb6872010-12-01 19:29:32 -0800110 if (ACTION_RESTART.equals(intent.getAction())) {
111 Bundle outState = new Bundle();
John Reck1cf4b792011-07-26 10:22:22 -0700112 mController.onSaveInstanceState(outState);
John Reck63bb6872010-12-01 19:29:32 -0800113 finish();
114 getApplicationContext().startActivity(
115 new Intent(getApplicationContext(), BrowserActivity.class)
116 .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
117 .putExtra(EXTRA_STATE, outState));
118 return;
119 }
Michael Kolb8233fac2010-10-26 16:08:53 -0700120 mController.handleNewIntent(intent);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800121 }
122
John Reck7878f222012-04-18 16:23:14 -0700123 private KeyguardManager mKeyguardManager;
124 private PowerManager mPowerManager;
125 private boolean shouldIgnoreIntents() {
126 // Only process intents if the screen is on and the device is unlocked
127 // aka, if we will be user-visible
128 if (mKeyguardManager == null) {
129 mKeyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
130 }
131 if (mPowerManager == null) {
132 mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
133 }
134 boolean ignore = !mPowerManager.isScreenOn();
135 ignore |= mKeyguardManager.inKeyguardRestrictedInputMode();
136 if (LOGV_ENABLED) {
137 Log.v(LOGTAG, "ignore intents: " + ignore);
138 }
139 return ignore;
140 }
141
Grace Kloba22ac16e2009-10-07 18:00:23 -0700142 @Override
143 protected void onResume() {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800144 super.onResume();
Dave Bort31a6d1c2009-04-13 15:56:49 -0700145 if (LOGV_ENABLED) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800146 Log.v(LOGTAG, "BrowserActivity.onResume: this=" + this);
147 }
John Reck9c35b9c2012-05-30 10:08:50 -0700148 mController.onResume();
The Android Open Source Project0c908882009-03-03 19:32:16 -0800149 }
150
Leon Scrogginsa81a7642009-08-31 17:05:41 -0400151 @Override
152 public boolean onMenuOpened(int featureId, Menu menu) {
Leon Scroggins3bbb6ca2009-09-09 12:51:10 -0400153 if (Window.FEATURE_OPTIONS_PANEL == featureId) {
Michael Kolb8233fac2010-10-26 16:08:53 -0700154 mController.onMenuOpened(featureId, menu);
Leon Scroggins3bbb6ca2009-09-09 12:51:10 -0400155 }
Leon Scrogginsa81a7642009-08-31 17:05:41 -0400156 return true;
157 }
158
Leon Scroggins3bbb6ca2009-09-09 12:51:10 -0400159 @Override
160 public void onOptionsMenuClosed(Menu menu) {
Michael Kolb8233fac2010-10-26 16:08:53 -0700161 mController.onOptionsMenuClosed(menu);
Leon Scrogginsc6fa1102009-09-21 10:40:01 -0400162 }
163
Leon Scrogginsb2b19f52009-10-09 16:10:00 -0400164 @Override
165 public void onContextMenuClosed(Menu menu) {
166 super.onContextMenuClosed(menu);
Michael Kolb8233fac2010-10-26 16:08:53 -0700167 mController.onContextMenuClosed(menu);
Leon Scrogginsb2b19f52009-10-09 16:10:00 -0400168 }
169
Leon Scrogginsc6fa1102009-09-21 10:40:01 -0400170 /**
The Android Open Source Project0c908882009-03-03 19:32:16 -0800171 * onSaveInstanceState(Bundle map)
172 * onSaveInstanceState is called right before onStop(). The map contains
173 * the saved state.
174 */
Grace Kloba22ac16e2009-10-07 18:00:23 -0700175 @Override
176 protected void onSaveInstanceState(Bundle outState) {
Dave Bort31a6d1c2009-04-13 15:56:49 -0700177 if (LOGV_ENABLED) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800178 Log.v(LOGTAG, "BrowserActivity.onSaveInstanceState: this=" + this);
179 }
John Reck9c35b9c2012-05-30 10:08:50 -0700180 mController.onSaveInstanceState(outState);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800181 }
182
Grace Kloba22ac16e2009-10-07 18:00:23 -0700183 @Override
184 protected void onPause() {
John Reck9c35b9c2012-05-30 10:08:50 -0700185 mController.onPause();
The Android Open Source Project0c908882009-03-03 19:32:16 -0800186 super.onPause();
The Android Open Source Project0c908882009-03-03 19:32:16 -0800187 }
188
Grace Kloba22ac16e2009-10-07 18:00:23 -0700189 @Override
190 protected void onDestroy() {
Dave Bort31a6d1c2009-04-13 15:56:49 -0700191 if (LOGV_ENABLED) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800192 Log.v(LOGTAG, "BrowserActivity.onDestroy: this=" + this);
193 }
194 super.onDestroy();
John Reck9c35b9c2012-05-30 10:08:50 -0700195 mController.onDestroy();
196 mController = NullController.INSTANCE;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800197 }
198
199 @Override
200 public void onConfigurationChanged(Configuration newConfig) {
201 super.onConfigurationChanged(newConfig);
John Reck9c35b9c2012-05-30 10:08:50 -0700202 mController.onConfgurationChanged(newConfig);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800203 }
204
Grace Kloba22ac16e2009-10-07 18:00:23 -0700205 @Override
206 public void onLowMemory() {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800207 super.onLowMemory();
Michael Kolb8233fac2010-10-26 16:08:53 -0700208 mController.onLowMemory();
Grace Kloba22ac16e2009-10-07 18:00:23 -0700209 }
210
The Android Open Source Project0c908882009-03-03 19:32:16 -0800211 @Override
212 public boolean onCreateOptionsMenu(Menu menu) {
213 super.onCreateOptionsMenu(menu);
John Reck9c35b9c2012-05-30 10:08:50 -0700214 return mController.onCreateOptionsMenu(menu);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800215 }
216
217 @Override
Michael Kolb8233fac2010-10-26 16:08:53 -0700218 public boolean onPrepareOptionsMenu(Menu menu) {
219 super.onPrepareOptionsMenu(menu);
John Reckb3417f02011-01-14 11:01:05 -0800220 return mController.onPrepareOptionsMenu(menu);
Cary Clark01cfcdd2010-06-04 16:36:45 -0400221 }
222
The Android Open Source Project0c908882009-03-03 19:32:16 -0800223 @Override
224 public boolean onOptionsItemSelected(MenuItem item) {
Michael Kolb8233fac2010-10-26 16:08:53 -0700225 if (!mController.onOptionsItemSelected(item)) {
226 return super.onOptionsItemSelected(item);
Michael Kolb370a4f32010-10-06 10:45:32 -0700227 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800228 return true;
229 }
230
231 @Override
232 public void onCreateContextMenu(ContextMenu menu, View v,
233 ContextMenuInfo menuInfo) {
Michael Kolb8233fac2010-10-26 16:08:53 -0700234 mController.onCreateContextMenu(menu, v, menuInfo);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800235 }
236
Michael Kolb8233fac2010-10-26 16:08:53 -0700237 @Override
238 public boolean onContextItemSelected(MenuItem item) {
239 return mController.onContextItemSelected(item);
Grace Kloba22ac16e2009-10-07 18:00:23 -0700240 }
241
Grace Kloba5942df02009-09-18 11:48:29 -0700242 @Override
243 public boolean onKeyDown(int keyCode, KeyEvent event) {
Michael Kolb8233fac2010-10-26 16:08:53 -0700244 return mController.onKeyDown(keyCode, event) ||
245 super.onKeyDown(keyCode, event);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800246 }
247
Grace Kloba5942df02009-09-18 11:48:29 -0700248 @Override
John Recke6bf4ab2011-02-24 15:48:05 -0800249 public boolean onKeyLongPress(int keyCode, KeyEvent event) {
250 return mController.onKeyLongPress(keyCode, event) ||
251 super.onKeyLongPress(keyCode, event);
252 }
253
254 @Override
Grace Kloba5942df02009-09-18 11:48:29 -0700255 public boolean onKeyUp(int keyCode, KeyEvent event) {
Michael Kolb8233fac2010-10-26 16:08:53 -0700256 return mController.onKeyUp(keyCode, event) ||
257 super.onKeyUp(keyCode, event);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800258 }
259
Michael Kolbe421c242010-10-04 19:29:01 -0700260 @Override
Michael Kolb8233fac2010-10-26 16:08:53 -0700261 public void onActionModeStarted(ActionMode mode) {
262 super.onActionModeStarted(mode);
263 mController.onActionModeStarted(mode);
Michael Kolbe421c242010-10-04 19:29:01 -0700264 }
265
Michael Kolbe421c242010-10-04 19:29:01 -0700266 @Override
Michael Kolb8233fac2010-10-26 16:08:53 -0700267 public void onActionModeFinished(ActionMode mode) {
268 super.onActionModeFinished(mode);
269 mController.onActionModeFinished(mode);
Michael Kolbe421c242010-10-04 19:29:01 -0700270 }
271
The Android Open Source Project0c908882009-03-03 19:32:16 -0800272 @Override
273 protected void onActivityResult(int requestCode, int resultCode,
Michael Kolb8233fac2010-10-26 16:08:53 -0700274 Intent intent) {
275 mController.onActivityResult(requestCode, resultCode, intent);
Andrei Popescu163ab742009-10-20 17:58:23 +0100276 }
277
Michael Kolbfbc579a2011-07-07 15:59:33 -0700278 @Override
279 public boolean onSearchRequested() {
280 return mController.onSearchRequested();
281 }
282
Michael Kolbc3af0672011-08-09 10:24:41 -0700283 @Override
284 public boolean dispatchKeyEvent(KeyEvent event) {
285 return mController.dispatchKeyEvent(event)
286 || super.dispatchKeyEvent(event);
287 }
288
289 @Override
290 public boolean dispatchKeyShortcutEvent(KeyEvent event) {
291 return mController.dispatchKeyShortcutEvent(event)
292 || super.dispatchKeyShortcutEvent(event);
293 }
294
295 @Override
296 public boolean dispatchTouchEvent(MotionEvent ev) {
297 return mController.dispatchTouchEvent(ev)
298 || super.dispatchTouchEvent(ev);
299 }
300
301 @Override
302 public boolean dispatchTrackballEvent(MotionEvent ev) {
303 return mController.dispatchTrackballEvent(ev)
304 || super.dispatchTrackballEvent(ev);
305 }
306
307 @Override
308 public boolean dispatchGenericMotionEvent(MotionEvent ev) {
309 return mController.dispatchGenericMotionEvent(ev) ||
310 super.dispatchGenericMotionEvent(ev);
311 }
312
LuK13372be2de92015-12-17 21:32:46 +0800313
314 @Override
315 public void onRequestPermissionsResult(int requestCode, String[] permissions,
316 int[] grantResults) {
317 switch (requestCode) {
318 case PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE:
319 // If request is cancelled, the result array is empty
320 if (grantResults.length > 0 &&
321 grantResults[0] == PackageManager.PERMISSION_GRANTED) {
322 DownloadHandler.checkPendingDownloads(this);
323 } else {
324 new AlertDialog.Builder(this)
325 .setTitle(R.string.permission_not_granted_dialog_title)
326 .setMessage(R.string.permission_not_granted_dialog_message)
327 .setPositiveButton(android.R.string.ok, null)
328 .show();
329 }
330 break;
331 }
332 }
333
The Android Open Source Project0c908882009-03-03 19:32:16 -0800334}