BrowserActivity.java revision f4bb18a41259ce62209c768484547d33583f9c77
10c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project/* 20c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 30c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 40c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 50c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * you may not use this file except in compliance with the License. 60c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * You may obtain a copy of the License at 70c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 80c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 90c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * See the License for the specific language governing permissions and 140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * limitations under the License. 150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectpackage com.android.browser; 180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport com.google.android.googleapps.IGoogleLoginService; 200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport com.google.android.googlelogin.GoogleLoginServiceConstants; 210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.app.Activity; 230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.app.AlertDialog; 240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.app.ProgressDialog; 250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.app.SearchManager; 260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.ActivityNotFoundException; 270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.BroadcastReceiver; 280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.ComponentName; 290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.ContentResolver; 30b6b7f9ef3b4ed220063f555d8b7c205210a61a04Leon Scrogginsimport android.content.ContentUris; 310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.ContentValues; 320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.Context; 330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.DialogInterface; 340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.Intent; 350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.IntentFilter; 360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.ServiceConnection; 370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.DialogInterface.OnCancelListener; 38b4da0ad0351996f639b50f9f29b123a9b5c24fd0Grace Klobaimport android.content.pm.PackageInfo; 390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.pm.PackageManager; 400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.pm.ResolveInfo; 410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.res.AssetManager; 420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.res.Configuration; 430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.res.Resources; 440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.database.Cursor; 450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.database.sqlite.SQLiteDatabase; 460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.database.sqlite.SQLiteException; 470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.graphics.Bitmap; 480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.graphics.Canvas; 490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.graphics.DrawFilter; 500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.graphics.Paint; 510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.graphics.PaintFlagsDrawFilter; 520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.graphics.Picture; 533bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scrogginsimport android.graphics.PixelFormat; 543bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scrogginsimport android.graphics.Rect; 550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.graphics.drawable.Drawable; 560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.hardware.SensorListener; 570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.hardware.SensorManager; 580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.net.ConnectivityManager; 590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.net.Uri; 600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.net.WebAddress; 610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.net.http.EventHandler; 620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.net.http.SslCertificate; 630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.net.http.SslError; 640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.AsyncTask; 650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.Bundle; 660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.Debug; 670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.Environment; 680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.Handler; 690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.IBinder; 700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.Message; 710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.PowerManager; 720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.Process; 730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.RemoteException; 740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.ServiceManager; 750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.SystemClock; 760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.provider.Browser; 770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.provider.Contacts; 780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.provider.Downloads; 790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.provider.MediaStore; 800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.provider.Contacts.Intents.Insert; 810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.text.IClipboard; 820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.text.TextUtils; 830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.text.format.DateFormat; 840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.text.util.Regex; 850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.util.Log; 860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.ContextMenu; 870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.Gravity; 880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.KeyEvent; 890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.LayoutInflater; 900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.Menu; 910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.MenuInflater; 920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.MenuItem; 93f4bb18a41259ce62209c768484547d33583f9c77Leon Scrogginsimport android.view.MotionEvent; 940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.View; 950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.ViewGroup; 960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.Window; 970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.WindowManager; 980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.ContextMenu.ContextMenuInfo; 990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.MenuItem.OnMenuItemClickListener; 1000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.animation.AlphaAnimation; 1010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.animation.Animation; 1020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.animation.AnimationSet; 1030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.animation.DecelerateInterpolator; 1040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.animation.ScaleAnimation; 1050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.animation.TranslateAnimation; 1060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.CookieManager; 1070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.CookieSyncManager; 1080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.DownloadListener; 1092bc69918d97a767a02132090e58718077381ba1aSteve Blockimport android.webkit.GeolocationPermissions; 1100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.HttpAuthHandler; 111b4da0ad0351996f639b50f9f29b123a9b5c24fd0Grace Klobaimport android.webkit.PluginManager; 1120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.SslErrorHandler; 1130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.URLUtil; 1140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.WebChromeClient; 115c9b5556351b59caec77b4eec1ad30652fec6a4d9Andrei Popescuimport android.webkit.WebChromeClient.CustomViewCallback; 1160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.WebHistoryItem; 1170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.WebIconDatabase; 118092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdochimport android.webkit.WebStorage; 1190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.WebView; 1200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.WebViewClient; 1210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.EditText; 1220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.FrameLayout; 1230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.LinearLayout; 1240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.TextView; 1250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.Toast; 1260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.io.BufferedOutputStream; 128b6b7f9ef3b4ed220063f555d8b7c205210a61a04Leon Scrogginsimport java.io.ByteArrayOutputStream; 1290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.io.File; 1300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.io.FileInputStream; 1310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.io.FileOutputStream; 1320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.io.IOException; 1330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.io.InputStream; 1340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.net.MalformedURLException; 1350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.net.URI; 1369918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackbornimport java.net.URISyntaxException; 1370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.net.URL; 1380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.net.URLEncoder; 1390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.text.ParseException; 1400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.Date; 1410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.Enumeration; 1420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.HashMap; 14337911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scottimport java.util.LinkedList; 1440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.Vector; 1450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.regex.Matcher; 1460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.regex.Pattern; 1470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.zip.ZipEntry; 1480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.zip.ZipFile; 1490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectpublic class BrowserActivity extends Activity 1510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project implements KeyTracker.OnKeyTracker, 1520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project View.OnCreateContextMenuListener, 1530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project DownloadListener { 1540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15531a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort /* Define some aliases to make these debugging flags easier to refer to. 15631a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort * This file imports android.provider.Browser, so we can't just refer to "Browser.DEBUG". 15731a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort */ 15831a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort private final static boolean DEBUG = com.android.browser.Browser.DEBUG; 15931a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort private final static boolean LOGV_ENABLED = com.android.browser.Browser.LOGV_ENABLED; 16031a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort private final static boolean LOGD_ENABLED = com.android.browser.Browser.LOGD_ENABLED; 16131a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort 1620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private IGoogleLoginService mGls = null; 1630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private ServiceConnection mGlsConnection = null; 1640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private SensorManager mSensorManager = null; 1660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 167565505b1a2c1d3099496af5910760087602e994aSatish Sampath // These are single-character shortcuts for searching popular sources. 168565505b1a2c1d3099496af5910760087602e994aSatish Sampath private static final int SHORTCUT_INVALID = 0; 169565505b1a2c1d3099496af5910760087602e994aSatish Sampath private static final int SHORTCUT_GOOGLE_SEARCH = 1; 170565505b1a2c1d3099496af5910760087602e994aSatish Sampath private static final int SHORTCUT_WIKIPEDIA_SEARCH = 2; 171565505b1a2c1d3099496af5910760087602e994aSatish Sampath private static final int SHORTCUT_DICTIONARY_SEARCH = 3; 172565505b1a2c1d3099496af5910760087602e994aSatish Sampath private static final int SHORTCUT_GOOGLE_MOBILE_LOCAL_SEARCH = 4; 173565505b1a2c1d3099496af5910760087602e994aSatish Sampath 1740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* Whitelisted webpages 1750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static HashSet<String> sWhiteList; 1760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project static { 1780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList = new HashSet<String>(); 1790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList.add("cnn.com/"); 1800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList.add("espn.go.com/"); 1810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList.add("nytimes.com/"); 1820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList.add("engadget.com/"); 1830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList.add("yahoo.com/"); 1840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList.add("msn.com/"); 1850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList.add("amazon.com/"); 1860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList.add("consumerist.com/"); 1870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList.add("google.com/m/news"); 1880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 1900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void setupHomePage() { 1920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Runnable getAccount = new Runnable() { 1930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void run() { 1940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Lower priority 1950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); 1960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // get the default home page 1970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String homepage = mSettings.getHomePage(); 1980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 2000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mGls == null) return; 2010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 202f2c5c1b555904400f4092888ae81b8ed74bfe026Grace Kloba if (!homepage.startsWith("http://www.google.")) return; 203f2c5c1b555904400f4092888ae81b8ed74bfe026Grace Kloba if (homepage.indexOf('?') == -1) return; 204f2c5c1b555904400f4092888ae81b8ed74bfe026Grace Kloba 2050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String hostedUser = mGls.getAccount(GoogleLoginServiceConstants.PREFER_HOSTED); 2060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String googleUser = mGls.getAccount(GoogleLoginServiceConstants.REQUIRE_GOOGLE); 2070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // three cases: 2090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // 2100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // hostedUser == googleUser 2110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // The device has only a google account 2120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // 2130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // hostedUser != googleUser 2140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // The device has a hosted account and a google account 2150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // 2160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // hostedUser != null, googleUser == null 2170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // The device has only a hosted account (so far) 2180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // developers might have no accounts at all 2200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (hostedUser == null) return; 2210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (googleUser == null || !hostedUser.equals(googleUser)) { 2230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String domain = hostedUser.substring(hostedUser.lastIndexOf('@')+1); 224f2c5c1b555904400f4092888ae81b8ed74bfe026Grace Kloba homepage = homepage.replace("?", "/a/" + domain + "?"); 2250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (RemoteException ignore) { 2270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Login service died; carry on 2280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (RuntimeException ignore) { 2290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Login service died; carry on 2300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } finally { 2310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project finish(homepage); 2320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void finish(final String homepage) { 2360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.post(new Runnable() { 2370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void run() { 2380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSettings.setHomePage(BrowserActivity.this, homepage); 2390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resumeAfterCredentials(); 2400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // as this is running in a separate thread, 2420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // BrowserActivity's onDestroy() may have been called, 2430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // which also calls unbindService(). 2440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mGlsConnection != null) { 2450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // we no longer need to keep GLS open 2460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project unbindService(mGlsConnection); 2470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mGlsConnection = null; 2480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } }); 2500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } }; 2510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final boolean[] done = { false }; 2530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Open a connection to the Google Login Service. The first 2550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // time the connection is established, set up the homepage depending on 2560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the account in a background thread. 2570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mGlsConnection = new ServiceConnection() { 2580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onServiceConnected(ComponentName className, IBinder service) { 2590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mGls = IGoogleLoginService.Stub.asInterface(service); 2600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (done[0] == false) { 2610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project done[0] = true; 2620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Thread account = new Thread(getAccount); 2630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project account.setName("GLSAccount"); 2640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project account.start(); 2650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onServiceDisconnected(ComponentName className) { 2680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mGls = null; 2690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 2710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project bindService(GoogleLoginServiceConstants.SERVICE_INTENT, 2730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mGlsConnection, Context.BIND_AUTO_CREATE); 2740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 276a977124eb29b195127fd161120ebbc58b255fb48Cary Clark private static class ClearThumbnails extends AsyncTask<File, Void, Void> { 2770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 2780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public Void doInBackground(File... files) { 2790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (files != null) { 2800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project for (File f : files) { 281d6be1758b38d5b066ff10b6af906aa66c63670cdCary Clark if (!f.delete()) { 282d6be1758b38d5b066ff10b6af906aa66c63670cdCary Clark Log.e(LOGTAG, f.getPath() + " was not deleted"); 283d6be1758b38d5b066ff10b6af906aa66c63670cdCary Clark } 2840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return null; 2870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2903bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins /** 2913bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * This layout holds everything you see below the status bar, including the 2923bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * error console, the custom view container, and the webviews. 2933bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins */ 2943bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins private FrameLayout mBrowserFrameLayout; 29581db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins 2960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override public void onCreate(Bundle icicle) { 29731a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 2980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, this + " onStart"); 2990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onCreate(icicle); 3013bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins this.requestWindowFeature(Window.FEATURE_NO_TITLE); 3020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // test the browser in OpenGL 3030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // requestWindowFeature(Window.FEATURE_OPENGL); 3040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL); 3060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mResolver = getContentResolver(); 3080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // 3100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // start MASF proxy service 3110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // 3120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //Intent proxyServiceIntent = new Intent(); 3130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //proxyServiceIntent.setComponent 3140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // (new ComponentName( 3150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "com.android.masfproxyservice", 3160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "com.android.masfproxyservice.MasfProxyService")); 3170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //startService(proxyServiceIntent, null); 3180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSecLockIcon = Resources.getSystem().getDrawable( 3200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project android.R.drawable.ic_secure); 3210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMixLockIcon = Resources.getSystem().getDrawable( 3220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project android.R.drawable.ic_partial_secure); 3230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32481db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins FrameLayout frameLayout = (FrameLayout) getWindow().getDecorView() 32581db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins .findViewById(com.android.internal.R.id.content); 3263bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mBrowserFrameLayout = (FrameLayout) LayoutInflater.from(this) 3273bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins .inflate(R.layout.custom_screen, null); 3283bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mContentView = (FrameLayout) mBrowserFrameLayout.findViewById( 3293bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins R.id.main_content); 3303bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mErrorConsoleContainer = (LinearLayout) mBrowserFrameLayout 3313bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins .findViewById(R.id.error_console); 3323bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mCustomViewContainer = (FrameLayout) mBrowserFrameLayout 3333bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins .findViewById(R.id.fullscreen_custom_content); 3343bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins frameLayout.addView(mBrowserFrameLayout, COVER_SCREEN_PARAMS); 3353bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mTitleBar = new TitleBarSet(this); 3360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Create the tab control and our initial tab 3380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl = new TabControl(this); 3390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Open the icon database and retain all the bookmark urls for favicons 3410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project retainIconsOnStartup(); 3420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Keep a settings instance handy. 3440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSettings = BrowserSettings.getInstance(); 3450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSettings.setTabControl(mTabControl); 3460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSettings.loadFromDb(this); 3470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 3490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Browser"); 3500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 351a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba /* enables registration for changes in network status from 352a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba http stack */ 353a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba mNetworkStateChangedFilter = new IntentFilter(); 354a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba mNetworkStateChangedFilter.addAction( 355a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba ConnectivityManager.CONNECTIVITY_ACTION); 356a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba mNetworkStateIntentReceiver = new BroadcastReceiver() { 357a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba @Override 358a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba public void onReceive(Context context, Intent intent) { 359a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba if (intent.getAction().equals( 360a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba ConnectivityManager.CONNECTIVITY_ACTION)) { 361a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba boolean down = intent.getBooleanExtra( 362a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); 363a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba onNetworkToggle(!down); 364a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba } 365a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba } 366a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba }; 367a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba 368615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED); 369615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba filter.addAction(Intent.ACTION_PACKAGE_REMOVED); 370615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba filter.addDataScheme("package"); 371615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba mPackageInstallationReceiver = new BroadcastReceiver() { 372615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba @Override 373615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba public void onReceive(Context context, Intent intent) { 374615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba final String action = intent.getAction(); 375615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba final String packageName = intent.getData() 376615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba .getSchemeSpecificPart(); 377615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba final boolean replacing = intent.getBooleanExtra( 378615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba Intent.EXTRA_REPLACING, false); 379615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba if (Intent.ACTION_PACKAGE_REMOVED.equals(action) && replacing) { 380615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba // if it is replacing, refreshPlugins() when adding 381615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba return; 382615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba } 383615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba PackageManager pm = BrowserActivity.this.getPackageManager(); 384615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba PackageInfo pkgInfo = null; 385615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba try { 386615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba pkgInfo = pm.getPackageInfo(packageName, 387615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba PackageManager.GET_PERMISSIONS); 388615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba } catch (PackageManager.NameNotFoundException e) { 389615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba return; 390615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba } 391615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba if (pkgInfo != null) { 392615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba String permissions[] = pkgInfo.requestedPermissions; 393615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba if (permissions == null) { 394615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba return; 395615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba } 396615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba boolean permissionOk = false; 397615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba for (String permit : permissions) { 398615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba if (PluginManager.PLUGIN_PERMISSION.equals(permit)) { 399615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba permissionOk = true; 400615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba break; 401615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba } 402615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba } 403615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba if (permissionOk) { 404615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba PluginManager.getInstance(BrowserActivity.this) 405615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba .refreshPlugins( 406615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba Intent.ACTION_PACKAGE_ADDED 407615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba .equals(action)); 408615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba } 409615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba } 410615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba } 411615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba }; 412615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba registerReceiver(mPackageInstallationReceiver, filter); 413615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba 414565505b1a2c1d3099496af5910760087602e994aSatish Sampath // If this was a web search request, pass it on to the default web search provider. 415565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (handleWebSearchIntent(getIntent())) { 416565505b1a2c1d3099496af5910760087602e994aSatish Sampath moveTaskToBack(true); 417565505b1a2c1d3099496af5910760087602e994aSatish Sampath return; 418565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 419565505b1a2c1d3099496af5910760087602e994aSatish Sampath 4200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!mTabControl.restoreState(icicle)) { 4210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // clear up the thumbnail directory if we can't restore the state as 4220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // none of the files in the directory are referenced any more. 4230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new ClearThumbnails().execute( 4240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.getThumbnailDir().listFiles()); 425aab3f09b5c2d39b19067e57635614080b2403a46Grace Kloba // there is no quit on Android. But if we can't restore the state, 426aab3f09b5c2d39b19067e57635614080b2403a46Grace Kloba // we can treat it as a new Browser, remove the old session cookies. 427aab3f09b5c2d39b19067e57635614080b2403a46Grace Kloba CookieManager.getInstance().removeSessionCookie(); 4280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Intent intent = getIntent(); 4290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Bundle extra = intent.getExtras(); 4300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Create an initial tab. 4310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If the intent is ACTION_VIEW and data is not null, the Browser is 4320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // invoked to view the content by another application. In this case, 4330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the tab will be close when exit. 43425ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima UrlData urlData = getUrlDataFromIntent(intent); 43525ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima 4360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final TabControl.Tab t = mTabControl.createNewTab( 4370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent.ACTION_VIEW.equals(intent.getAction()) && 438f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project intent.getData() != null, 43925ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima intent.getStringExtra(Browser.EXTRA_APPLICATION_ID), urlData.mUrl); 4400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.setCurrentTab(t); 4410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project attachTabToContentView(t); 4420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView webView = t.getWebView(); 4430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (extra != null) { 4440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int scale = extra.getInt(Browser.INITIAL_ZOOM_LEVEL, 0); 4450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (scale > 0 && scale <= 1000) { 4460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project webView.setInitialScale(scale); 4470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 4480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 4490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If we are not restoring from an icicle, then there is a high 4500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // likely hood this is the first run. So, check to see if the 4510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // homepage needs to be configured and copy any plugins from our 4520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // asset directory to the data partition. 4530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if ((extra == null || !extra.getBoolean("testing")) 4540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project && !mSettings.isLoginInitialized()) { 4550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setupHomePage(); 4560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 4570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 45825ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima if (urlData.isEmpty()) { 459304442375719effd41dbd53ae62de7a8d0cec7d9Leon Scroggins if (mSettings.isLoginInitialized()) { 460304442375719effd41dbd53ae62de7a8d0cec7d9Leon Scroggins webView.loadUrl(mSettings.getHomePage()); 461304442375719effd41dbd53ae62de7a8d0cec7d9Leon Scroggins } else { 462304442375719effd41dbd53ae62de7a8d0cec7d9Leon Scroggins waitForCredentials(); 463304442375719effd41dbd53ae62de7a8d0cec7d9Leon Scroggins } 4640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 46581678d9216458266ea70cd62d52f28f744873556Grace Kloba if (extra != null) { 46681678d9216458266ea70cd62d52f28f744873556Grace Kloba urlData.setPostData(extra 46781678d9216458266ea70cd62d52f28f744873556Grace Kloba .getByteArray(Browser.EXTRA_POST_DATA)); 46881678d9216458266ea70cd62d52f28f744873556Grace Kloba } 46925ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima urlData.loadIn(webView); 4700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 4710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 4720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // TabControl.restoreState() will create a new tab even if 4731f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // restoring the state fails. 4740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project attachTabToContentView(mTabControl.getCurrentTab()); 4750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 476615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba 4773bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mTitleBar.init(this); 4783bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // Create title bars for all of the tabs that have been created 4793bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins for (int i = 0; i < mTabControl.getTabCount(); i ++) { 4803bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins WebView view = mTabControl.getTab(i).getWebView(); 4813bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mTitleBar.addTab(view, false); 4821f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 4831f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins 4843bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mTitleBar.setCurrentTab(mTabControl.getCurrentIndex()); 4853bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins 486b3c02da4553b1a629b16377970fdabae28394c94Feng Qian // Read JavaScript flags if it exists. 487b3c02da4553b1a629b16377970fdabae28394c94Feng Qian String jsFlags = mSettings.getJsFlags(); 488b3c02da4553b1a629b16377970fdabae28394c94Feng Qian if (jsFlags.trim().length() != 0) { 489b3c02da4553b1a629b16377970fdabae28394c94Feng Qian mTabControl.getCurrentWebView().setJsFlags(jsFlags); 490b3c02da4553b1a629b16377970fdabae28394c94Feng Qian } 4910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 4920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 4930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 4940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project protected void onNewIntent(Intent intent) { 4950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TabControl.Tab current = mTabControl.getCurrentTab(); 4960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // When a tab is closed on exit, the current tab index is set to -1. 4970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Reset before proceed as Browser requires the current tab to be set. 4980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current == null) { 4990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Try to reset the tab in case the index was incorrect. 5000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project current = mTabControl.getTab(0); 5010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current == null) { 5020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // No tabs at all so just ignore this intent. 5030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 5040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.setCurrentTab(current); 5063bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mTitleBar.setCurrentTab(mTabControl.getTabIndex(current)); 5070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project attachTabToContentView(current); 5080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleAndIcon(current.getWebView()); 5090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final String action = intent.getAction(); 5110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final int flags = intent.getFlags(); 5120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (Intent.ACTION_MAIN.equals(action) || 5130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (flags & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0) { 5140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // just resume the browser 5150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 5160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (Intent.ACTION_VIEW.equals(action) 5180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || Intent.ACTION_SEARCH.equals(action) 5190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action) 5200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || Intent.ACTION_WEB_SEARCH.equals(action)) { 521565505b1a2c1d3099496af5910760087602e994aSatish Sampath // If this was a search request (e.g. search query directly typed into the address bar), 522565505b1a2c1d3099496af5910760087602e994aSatish Sampath // pass it on to the default web search provider. 523565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (handleWebSearchIntent(intent)) { 524565505b1a2c1d3099496af5910760087602e994aSatish Sampath return; 525565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 526565505b1a2c1d3099496af5910760087602e994aSatish Sampath 52725ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima UrlData urlData = getUrlDataFromIntent(intent); 52825ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima if (urlData.isEmpty()) { 52925ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima urlData = new UrlData(mSettings.getHomePage()); 5300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 53181678d9216458266ea70cd62d52f28f744873556Grace Kloba urlData.setPostData(intent 53281678d9216458266ea70cd62d52f28f744873556Grace Kloba .getByteArrayExtra(Browser.EXTRA_POST_DATA)); 53325ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima 534cc63403643786905262f505ab5266d8e80b9924cGrace Kloba final String appId = intent 535cc63403643786905262f505ab5266d8e80b9924cGrace Kloba .getStringExtra(Browser.EXTRA_APPLICATION_ID); 536cc63403643786905262f505ab5266d8e80b9924cGrace Kloba if (Intent.ACTION_VIEW.equals(action) 537cc63403643786905262f505ab5266d8e80b9924cGrace Kloba && !getPackageName().equals(appId) 538cc63403643786905262f505ab5266d8e80b9924cGrace Kloba && (flags & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { 539cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott TabControl.Tab appTab = mTabControl.getTabFromId(appId); 540f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project if (appTab != null) { 541f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project Log.i(LOGTAG, "Reusing tab for " + appId); 542f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // Dismiss the subwindow if applicable. 543f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project dismissSubWindow(appTab); 544f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // Since we might kill the WebView, remove it from the 545f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // content view first. 546f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project removeTabFromContentView(appTab); 547f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // Recreate the main WebView after destroying the old one. 548f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // If the WebView has the same original url and is on that 549f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // page, it can be reused. 550f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project boolean needsLoad = 55125ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima mTabControl.recreateWebView(appTab, urlData.mUrl); 552bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 553f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project if (current != appTab) { 5541f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins switchToTab(mTabControl.getTabIndex(appTab)); 5551f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (needsLoad) { 5561f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins urlData.loadIn(appTab.getWebView()); 5571f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 558f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project } else { 5591f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // If the tab was the current tab, we have to attach 5601f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // it to the view system again. 5611f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins attachTabToContentView(appTab); 5621f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (needsLoad) { 5631f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins urlData.loadIn(appTab.getWebView()); 564f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project } 565f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project } 566f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project return; 567cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott } else { 568cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott // No matching application tab, try to find a regular tab 569cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott // with a matching url. 570cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott appTab = mTabControl.findUnusedTabWithUrl(urlData.mUrl); 57125515f8bd458a2471d13d876cfb0e18d8ff2a00fLeon Scroggins if (appTab != null) { 57225515f8bd458a2471d13d876cfb0e18d8ff2a00fLeon Scroggins if (current != appTab) { 57325515f8bd458a2471d13d876cfb0e18d8ff2a00fLeon Scroggins switchToTab(mTabControl.getTabIndex(appTab)); 57425515f8bd458a2471d13d876cfb0e18d8ff2a00fLeon Scroggins } 57525515f8bd458a2471d13d876cfb0e18d8ff2a00fLeon Scroggins // Otherwise, we are already viewing the correct tab. 576cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott } else { 577cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott // if FLAG_ACTIVITY_BROUGHT_TO_FRONT flag is on, the url 578cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott // will be opened in a new tab unless we have reached 579cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott // MAX_TABS. Then the url will be opened in the current 580cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott // tab. If a new tab is created, it will have "true" for 581cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott // exit on close. 5821f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins openTabAndShow(urlData, true, appId); 583cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott } 584f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project } 5850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 58625ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima if ("about:debug".equals(urlData.mUrl)) { 5870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSettings.toggleDebugSettings(); 5880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 5890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5901f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // Get rid of the subwindow if it exists 5911f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins dismissSubWindow(current); 5921f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins urlData.loadIn(current.getWebView()); 5930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 597565505b1a2c1d3099496af5910760087602e994aSatish Sampath private int parseUrlShortcut(String url) { 598565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (url == null) return SHORTCUT_INVALID; 599565505b1a2c1d3099496af5910760087602e994aSatish Sampath 600565505b1a2c1d3099496af5910760087602e994aSatish Sampath // FIXME: quick search, need to be customized by setting 601565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (url.length() > 2 && url.charAt(1) == ' ') { 602565505b1a2c1d3099496af5910760087602e994aSatish Sampath switch (url.charAt(0)) { 603565505b1a2c1d3099496af5910760087602e994aSatish Sampath case 'g': return SHORTCUT_GOOGLE_SEARCH; 604565505b1a2c1d3099496af5910760087602e994aSatish Sampath case 'w': return SHORTCUT_WIKIPEDIA_SEARCH; 605565505b1a2c1d3099496af5910760087602e994aSatish Sampath case 'd': return SHORTCUT_DICTIONARY_SEARCH; 606565505b1a2c1d3099496af5910760087602e994aSatish Sampath case 'l': return SHORTCUT_GOOGLE_MOBILE_LOCAL_SEARCH; 607565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 608565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 609565505b1a2c1d3099496af5910760087602e994aSatish Sampath return SHORTCUT_INVALID; 610565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 611565505b1a2c1d3099496af5910760087602e994aSatish Sampath 612565505b1a2c1d3099496af5910760087602e994aSatish Sampath /** 613565505b1a2c1d3099496af5910760087602e994aSatish Sampath * Launches the default web search activity with the query parameters if the given intent's data 614565505b1a2c1d3099496af5910760087602e994aSatish Sampath * are identified as plain search terms and not URLs/shortcuts. 615565505b1a2c1d3099496af5910760087602e994aSatish Sampath * @return true if the intent was handled and web search activity was launched, false if not. 616565505b1a2c1d3099496af5910760087602e994aSatish Sampath */ 617565505b1a2c1d3099496af5910760087602e994aSatish Sampath private boolean handleWebSearchIntent(Intent intent) { 618565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (intent == null) return false; 619565505b1a2c1d3099496af5910760087602e994aSatish Sampath 620565505b1a2c1d3099496af5910760087602e994aSatish Sampath String url = null; 621565505b1a2c1d3099496af5910760087602e994aSatish Sampath final String action = intent.getAction(); 622565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (Intent.ACTION_VIEW.equals(action)) { 623565505b1a2c1d3099496af5910760087602e994aSatish Sampath url = intent.getData().toString(); 624565505b1a2c1d3099496af5910760087602e994aSatish Sampath } else if (Intent.ACTION_SEARCH.equals(action) 625565505b1a2c1d3099496af5910760087602e994aSatish Sampath || MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action) 626565505b1a2c1d3099496af5910760087602e994aSatish Sampath || Intent.ACTION_WEB_SEARCH.equals(action)) { 627565505b1a2c1d3099496af5910760087602e994aSatish Sampath url = intent.getStringExtra(SearchManager.QUERY); 628565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 62915e9f2dc92cf1621f95071b3c740f46079aa0f3bSatish Sampath return handleWebSearchRequest(url, intent.getBundleExtra(SearchManager.APP_DATA)); 630565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 631565505b1a2c1d3099496af5910760087602e994aSatish Sampath 632565505b1a2c1d3099496af5910760087602e994aSatish Sampath /** 633565505b1a2c1d3099496af5910760087602e994aSatish Sampath * Launches the default web search activity with the query parameters if the given url string 634565505b1a2c1d3099496af5910760087602e994aSatish Sampath * was identified as plain search terms and not URL/shortcut. 635565505b1a2c1d3099496af5910760087602e994aSatish Sampath * @return true if the request was handled and web search activity was launched, false if not. 636565505b1a2c1d3099496af5910760087602e994aSatish Sampath */ 63715e9f2dc92cf1621f95071b3c740f46079aa0f3bSatish Sampath private boolean handleWebSearchRequest(String inUrl, Bundle appData) { 638565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (inUrl == null) return false; 639565505b1a2c1d3099496af5910760087602e994aSatish Sampath 640565505b1a2c1d3099496af5910760087602e994aSatish Sampath // In general, we shouldn't modify URL from Intent. 641565505b1a2c1d3099496af5910760087602e994aSatish Sampath // But currently, we get the user-typed URL from search box as well. 642565505b1a2c1d3099496af5910760087602e994aSatish Sampath String url = fixUrl(inUrl).trim(); 643565505b1a2c1d3099496af5910760087602e994aSatish Sampath 644565505b1a2c1d3099496af5910760087602e994aSatish Sampath // URLs and site specific search shortcuts are handled by the regular flow of control, so 645565505b1a2c1d3099496af5910760087602e994aSatish Sampath // return early. 646565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (Regex.WEB_URL_PATTERN.matcher(url).matches() 647bc5b9f358a2b75bf3a104b9f5cd477ad2f6f740fSatish Sampath || ACCEPTED_URI_SCHEMA.matcher(url).matches() 648565505b1a2c1d3099496af5910760087602e994aSatish Sampath || parseUrlShortcut(url) != SHORTCUT_INVALID) { 649565505b1a2c1d3099496af5910760087602e994aSatish Sampath return false; 650565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 651565505b1a2c1d3099496af5910760087602e994aSatish Sampath 652565505b1a2c1d3099496af5910760087602e994aSatish Sampath Browser.updateVisitedHistory(mResolver, url, false); 653565505b1a2c1d3099496af5910760087602e994aSatish Sampath Browser.addSearchUrl(mResolver, url); 654565505b1a2c1d3099496af5910760087602e994aSatish Sampath 655565505b1a2c1d3099496af5910760087602e994aSatish Sampath Intent intent = new Intent(Intent.ACTION_WEB_SEARCH); 656565505b1a2c1d3099496af5910760087602e994aSatish Sampath intent.addCategory(Intent.CATEGORY_DEFAULT); 657565505b1a2c1d3099496af5910760087602e994aSatish Sampath intent.putExtra(SearchManager.QUERY, url); 65815e9f2dc92cf1621f95071b3c740f46079aa0f3bSatish Sampath if (appData != null) { 65915e9f2dc92cf1621f95071b3c740f46079aa0f3bSatish Sampath intent.putExtra(SearchManager.APP_DATA, appData); 66015e9f2dc92cf1621f95071b3c740f46079aa0f3bSatish Sampath } 661cc63403643786905262f505ab5266d8e80b9924cGrace Kloba intent.putExtra(Browser.EXTRA_APPLICATION_ID, getPackageName()); 662565505b1a2c1d3099496af5910760087602e994aSatish Sampath startActivity(intent); 663565505b1a2c1d3099496af5910760087602e994aSatish Sampath 664565505b1a2c1d3099496af5910760087602e994aSatish Sampath return true; 665565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 666565505b1a2c1d3099496af5910760087602e994aSatish Sampath 66725ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima private UrlData getUrlDataFromIntent(Intent intent) { 6680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String url = null; 6690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (intent != null) { 6700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final String action = intent.getAction(); 6710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (Intent.ACTION_VIEW.equals(action)) { 6720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = smartUrlFilter(intent.getData()); 6730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null && url.startsWith("content:")) { 6740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* Append mimetype so webview knows how to display */ 6750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String mimeType = intent.resolveType(getContentResolver()); 6760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mimeType != null) { 6770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url += "?" + mimeType; 6780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 6790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 68025ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima if ("inline:".equals(url)) { 68125ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima return new InlinedUrlData( 68225ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima intent.getStringExtra(Browser.EXTRA_INLINE_CONTENT), 68325ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima intent.getType(), 68425ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima intent.getStringExtra(Browser.EXTRA_INLINE_ENCODING), 68525ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima intent.getStringExtra(Browser.EXTRA_INLINE_FAILURL)); 68625ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima } 6870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (Intent.ACTION_SEARCH.equals(action) 6880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action) 6890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || Intent.ACTION_WEB_SEARCH.equals(action)) { 6900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = intent.getStringExtra(SearchManager.QUERY); 6910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null) { 6920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mLastEnteredUrl = url; 6930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Don't add Urls, just search terms. 6940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Urls will get added when the page is loaded. 6950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!Regex.WEB_URL_PATTERN.matcher(url).matches()) { 6960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Browser.updateVisitedHistory(mResolver, url, false); 6970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 6980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // In general, we shouldn't modify URL from Intent. 6990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // But currently, we get the user-typed URL from search box as well. 7000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = fixUrl(url); 7010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = smartUrlFilter(url); 7020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String searchSource = "&source=android-" + GOOGLE_SEARCH_SOURCE_SUGGEST + "&"; 7030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url.contains(searchSource)) { 7040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String source = null; 7050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Bundle appData = intent.getBundleExtra(SearchManager.APP_DATA); 7060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (appData != null) { 7070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project source = appData.getString(SearchManager.SOURCE); 7080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (TextUtils.isEmpty(source)) { 7100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project source = GOOGLE_SEARCH_SOURCE_UNKNOWN; 7110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = url.replace(searchSource, "&source=android-"+source+"&"); 7130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 71725ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima return new UrlData(url); 7180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 7200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ static String fixUrl(String inUrl) { 721652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark // FIXME: Converting the url to lower case 722652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark // duplicates functionality in smartUrlFilter(). 723652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark // However, changing all current callers of fixUrl to 724652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark // call smartUrlFilter in addition may have unwanted 725652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark // consequences, and is deferred for now. 726652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark int colon = inUrl.indexOf(':'); 727652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark boolean allLower = true; 728652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark for (int index = 0; index < colon; index++) { 729652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark char ch = inUrl.charAt(index); 730652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark if (!Character.isLetter(ch)) { 731652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark break; 732652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark } 733652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark allLower &= Character.isLowerCase(ch); 734652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark if (index == colon - 1 && !allLower) { 735652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark inUrl = inUrl.substring(0, colon).toLowerCase() 736652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark + inUrl.substring(colon); 737652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark } 738652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark } 7390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (inUrl.startsWith("http://") || inUrl.startsWith("https://")) 7400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return inUrl; 7410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (inUrl.startsWith("http:") || 7420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inUrl.startsWith("https:")) { 7430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (inUrl.startsWith("http:/") || inUrl.startsWith("https:/")) { 7440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inUrl = inUrl.replaceFirst("/", "//"); 7450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else inUrl = inUrl.replaceFirst(":", "://"); 7460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return inUrl; 7480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 7500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 7510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Looking for the pattern like this 7520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 7530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * * 7540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * * * 7550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * *** * ******* 7560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * * * 7570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * * * 7580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * * 7590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 7600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final SensorListener mSensorListener = new SensorListener() { 7610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mLastGestureTime; 7620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private float[] mPrev = new float[3]; 7630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private float[] mPrevDiff = new float[3]; 7640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private float[] mDiff = new float[3]; 7650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private float[] mRevertDiff = new float[3]; 7660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 7670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onSensorChanged(int sensor, float[] values) { 7680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean show = false; 7690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project float[] diff = new float[3]; 7700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 7710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project for (int i = 0; i < 3; i++) { 7720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project diff[i] = values[i] - mPrev[i]; 7730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (Math.abs(diff[i]) > 1) { 7740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project show = true; 7750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if ((diff[i] > 1.0 && mDiff[i] < 0.2) 7770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || (diff[i] < -1.0 && mDiff[i] > -0.2)) { 7780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // start track when there is a big move, or revert 7790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mRevertDiff[i] = mDiff[i]; 7800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mDiff[i] = 0; 7810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (diff[i] > -0.2 && diff[i] < 0.2) { 7820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // reset when it is flat 7830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mDiff[i] = mRevertDiff[i] = 0; 7840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mDiff[i] += diff[i]; 7860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPrevDiff[i] = diff[i]; 7870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPrev[i] = values[i]; 7880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 7900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (false) { 7910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // only shows if we think the delta is big enough, in an attempt 7920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // to detect "serious" moves left/right or up/down 7930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.d("BrowserSensorHack", "sensorChanged " + sensor + " (" 7940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + values[0] + ", " + values[1] + ", " + values[2] + ")" 7950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + " diff(" + diff[0] + " " + diff[1] + " " + diff[2] 7960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + ")"); 7970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.d("BrowserSensorHack", " mDiff(" + mDiff[0] + " " 7980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + mDiff[1] + " " + mDiff[2] + ")" + " mRevertDiff(" 7990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + mRevertDiff[0] + " " + mRevertDiff[1] + " " 8000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + mRevertDiff[2] + ")"); 8010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 8030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project long now = android.os.SystemClock.uptimeMillis(); 8040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (now - mLastGestureTime > 1000) { 8050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mLastGestureTime = 0; 8060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 8070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project float y = mDiff[1]; 8080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project float z = mDiff[2]; 8090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project float ay = Math.abs(y); 8100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project float az = Math.abs(z); 8110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project float ry = mRevertDiff[1]; 8120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project float rz = mRevertDiff[2]; 8130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project float ary = Math.abs(ry); 8140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project float arz = Math.abs(rz); 8150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean gestY = ay > 2.5f && ary > 1.0f && ay > ary; 8160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean gestZ = az > 3.5f && arz > 1.0f && az > arz; 8170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 8180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if ((gestY || gestZ) && !(gestY && gestZ)) { 8190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView view = mTabControl.getCurrentWebView(); 8200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 8210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (view != null) { 8220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (gestZ) { 8230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (z < 0) { 8240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project view.zoomOut(); 8250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 8260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project view.zoomIn(); 8270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 8290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project view.flingScroll(0, Math.round(y * 100)); 8300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mLastGestureTime = now; 8330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 8370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onAccuracyChanged(int sensor, int accuracy) { 8380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // TODO Auto-generated method stub 8390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 8400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 8420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 8430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override protected void onResume() { 8440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onResume(); 84531a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 8460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, "BrowserActivity.onResume: this=" + this); 8470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 8490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!mActivityInPause) { 8500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(LOGTAG, "BrowserActivity is already resumed."); 8510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 8520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 8547bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed mTabControl.resumeCurrentTab(); 8550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mActivityInPause = false; 8567bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed resumeWebViewTimers(); 8570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 8580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mWakeLock.isHeld()) { 8590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.removeMessages(RELEASE_WAKELOCK); 8600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWakeLock.release(); 8610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 8630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mCredsDlg != null) { 8640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!mHandler.hasMessages(CANCEL_CREDS_REQUEST)) { 8650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // In case credential request never comes back 8660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.sendEmptyMessageDelayed(CANCEL_CREDS_REQUEST, 6000); 8670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 8700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project registerReceiver(mNetworkStateIntentReceiver, 8710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mNetworkStateChangedFilter); 8720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView.enablePlatformNotifications(); 8730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 8740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mSettings.doFlick()) { 8750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mSensorManager == null) { 8760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSensorManager = (SensorManager) getSystemService( 8770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Context.SENSOR_SERVICE); 8780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSensorManager.registerListener(mSensorListener, 8800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project SensorManager.SENSOR_ACCELEROMETER, 8810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project SensorManager.SENSOR_DELAY_FASTEST); 8820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 8830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSensorManager = null; 8840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 8873bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins /** 8883bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * Since the actual title bar is embedded in the WebView, and removing it 8893bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * would change its appearance, create a temporary title bar to go at 8903bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * the top of the screen while the menu is open. 8913bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins */ 8923bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins private TitleBar mFakeTitleBar; 8933bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins 8943bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins /** 8953bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * Keeps track of whether the options menu is open. This is important in 8963bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * determining whether to show or hide the title bar overlay. 8973bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins */ 8983bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins private boolean mOptionsMenuOpen; 8993bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins 9003bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins /** 9013bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * Only meaningful when mOptionsMenuOpen is true. This variable keeps track 9023bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * of whether the configuration has changed. The first onMenuOpened call 9033bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * after a configuration change is simply a reopening of the same menu 9043bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * (i.e. mIconView did not change). 9053bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins */ 9063bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins private boolean mConfigChanged; 9073bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins 9083bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins /** 9093bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * Whether or not the options menu is in its smaller, icon menu form. When 9103bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * true, we want the title bar overlay to be up. When false, we do not. 9113bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * Only meaningful if mOptionsMenuOpen is true. 9123bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins */ 9133bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins private boolean mIconView; 9143bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins 915a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins @Override 916a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins public boolean onMenuOpened(int featureId, Menu menu) { 9173bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins if (Window.FEATURE_OPTIONS_PANEL == featureId) { 9183bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins if (mOptionsMenuOpen) { 9193bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins if (mConfigChanged) { 9203bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // We do not need to make any changes to the state of the 9213bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // title bar, since the only thing that happened was a 9223bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // change in orientation 9233bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mConfigChanged = false; 9243bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } else { 9253bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins if (mIconView) { 9263bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // Switching the menu to expanded view, so hide the 9273bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // title bar. 9283bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins hideFakeTitleBar(); 9293bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mIconView = false; 9303bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } else { 9313bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // Switching the menu back to icon view, so show the 9323bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // title bar once again. 9333bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins showFakeTitleBar(); 9343bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mIconView = true; 9353bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } 9363bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } 9373bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } else { 9383bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // The options menu is closed, so open it, and show the title 9393bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins showFakeTitleBar(); 9403bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mOptionsMenuOpen = true; 9413bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mConfigChanged = false; 9423bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mIconView = true; 9433bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } 9443bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } 945a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins return true; 946a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins } 947a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins 9483bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins private void showFakeTitleBar() { 9493bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins if (mFakeTitleBar == null) { 950f4bb18a41259ce62209c768484547d33583f9c77Leon Scroggins final WebView webView = getTopWindow(); 9513bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mFakeTitleBar = new TitleBar(this, webView); 9523bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mFakeTitleBar.setTitleAndUrl(null, webView.getUrl()); 9533bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mFakeTitleBar.setProgress(webView.getProgress()); 9543bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mFakeTitleBar.setFavicon(webView.getFavicon()); 9553bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins updateLockIconToLatest(); 956f4bb18a41259ce62209c768484547d33583f9c77Leon Scroggins final View title = mFakeTitleBar.findViewById(R.id.title); 957f4bb18a41259ce62209c768484547d33583f9c77Leon Scroggins mFakeTitleBar.setOnTouchListener(new View.OnTouchListener() { 958f4bb18a41259ce62209c768484547d33583f9c77Leon Scroggins public boolean onTouch(View v, MotionEvent event) { 959f4bb18a41259ce62209c768484547d33583f9c77Leon Scroggins if (event.getAction() == MotionEvent.ACTION_UP) { 960f4bb18a41259ce62209c768484547d33583f9c77Leon Scroggins if (event.getX() > title.getRight()) { 961f4bb18a41259ce62209c768484547d33583f9c77Leon Scroggins if (webView != null 962f4bb18a41259ce62209c768484547d33583f9c77Leon Scroggins && webView.getProgress() < 100) { 963f4bb18a41259ce62209c768484547d33583f9c77Leon Scroggins if (webView != null) { 964f4bb18a41259ce62209c768484547d33583f9c77Leon Scroggins webView.stopLoading(); 965f4bb18a41259ce62209c768484547d33583f9c77Leon Scroggins } 966f4bb18a41259ce62209c768484547d33583f9c77Leon Scroggins } else { 967f4bb18a41259ce62209c768484547d33583f9c77Leon Scroggins bookmarksOrHistoryPicker(false); 968f4bb18a41259ce62209c768484547d33583f9c77Leon Scroggins } 969f4bb18a41259ce62209c768484547d33583f9c77Leon Scroggins } else { 970f4bb18a41259ce62209c768484547d33583f9c77Leon Scroggins onSearchRequested(); 971f4bb18a41259ce62209c768484547d33583f9c77Leon Scroggins } 972f4bb18a41259ce62209c768484547d33583f9c77Leon Scroggins closeOptionsMenu(); 973f4bb18a41259ce62209c768484547d33583f9c77Leon Scroggins } 974f4bb18a41259ce62209c768484547d33583f9c77Leon Scroggins return true; 9753bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } 9763bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins }); 9773bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins 9783bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins WindowManager manager 9793bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins = (WindowManager) getSystemService(Context.WINDOW_SERVICE); 9803bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins 9813bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // Add the title bar to the window manager so it can receive touches 9823bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // while the menu is up 9833bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins WindowManager.LayoutParams params 9843bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins = new WindowManager.LayoutParams( 9853bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins ViewGroup.LayoutParams.FILL_PARENT, 9863bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins ViewGroup.LayoutParams.WRAP_CONTENT, 9873bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL, 9883bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 9893bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins PixelFormat.OPAQUE); 9903bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins params.gravity = Gravity.TOP; 991a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins WebView mainView = mTabControl.getCurrentWebView(); 992a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins params.windowAnimations = mainView == null 993a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins || mainView.getScrollY() != 0 994a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins ? com.android.internal.R.style.Animation_DropDownDown : 0; 9953bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // XXX : Without providing an offset, the fake title bar will be 9963bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // placed underneath the status bar. Use the global visible rect 9973bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // of mBrowserFrameLayout to determine the bottom of the status bar 9983bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins Rect rectangle = new Rect(); 9993bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mBrowserFrameLayout.getGlobalVisibleRect(rectangle); 10003bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins params.y = rectangle.top; 10013bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins manager.addView(mFakeTitleBar, params); 10023bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } 10033bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } 10043bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins 10053bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins @Override 10063bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins public void onOptionsMenuClosed(Menu menu) { 10073bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mOptionsMenuOpen = false; 1008a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins if (!mInLoad) { 1009a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins hideFakeTitleBar(); 1010a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins } else if (!mIconView) { 1011a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins // The page is currently loading, and we are in expanded mode, so 1012a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins // we were not showing the menu. Show it once again. It will be 1013a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins // removed when the page finishes. 1014a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins showFakeTitleBar(); 1015a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins } 10163bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } 10173bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins private void hideFakeTitleBar() { 10183bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins if (mFakeTitleBar == null) return; 10193bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins WindowManager manager 10203bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins = (WindowManager) getSystemService(Context.WINDOW_SERVICE); 10213bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins manager.removeView(mFakeTitleBar); 10223bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mFakeTitleBar = null; 10233bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } 10243bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins 10250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 10260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * onSaveInstanceState(Bundle map) 10270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * onSaveInstanceState is called right before onStop(). The map contains 10280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * the saved state. 10290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 10300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override protected void onSaveInstanceState(Bundle outState) { 103131a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 10320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, "BrowserActivity.onSaveInstanceState: this=" + this); 10330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the default implementation requires each view to have an id. As the 10350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // browser handles the state itself and it doesn't use id for the views, 10360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // don't call the default implementation. Otherwise it will trigger the 10370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // warning like this, "couldn't save which view has focus because the 10380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // focused view XXX has no id". 10390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Save all the tabs 10410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.saveState(outState); 10420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override protected void onPause() { 10450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onPause(); 10460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mActivityInPause) { 10480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(LOGTAG, "BrowserActivity is already paused."); 10490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 10500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10527bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed mTabControl.pauseCurrentTab(); 10530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mActivityInPause = true; 10547bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed if (mTabControl.getCurrentIndex() >= 0 && !pauseWebViewTimers()) { 10550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWakeLock.acquire(); 10560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.sendMessageDelayed(mHandler 10570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .obtainMessage(RELEASE_WAKELOCK), WAKELOCK_TIMEOUT); 10580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Clear the credentials toast if it is up 10610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mCredsDlg != null && mCredsDlg.isShowing()) { 10620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCredsDlg.dismiss(); 10630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCredsDlg = null; 10650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1066a2ab6a7dc0f7023c1d7ebb1cbad397c5dc3d6453Leon Scroggins // FIXME: This removes the active tabs page and resets the menu to 1067a2ab6a7dc0f7023c1d7ebb1cbad397c5dc3d6453Leon Scroggins // MAIN_MENU. A better solution might be to do this work in onNewIntent 1068a2ab6a7dc0f7023c1d7ebb1cbad397c5dc3d6453Leon Scroggins // but then we would need to save it in onSaveInstanceState and restore 1069a2ab6a7dc0f7023c1d7ebb1cbad397c5dc3d6453Leon Scroggins // it in onCreate/onRestoreInstanceState 1070a2ab6a7dc0f7023c1d7ebb1cbad397c5dc3d6453Leon Scroggins if (mActiveTabsPage != null) { 1071a2ab6a7dc0f7023c1d7ebb1cbad397c5dc3d6453Leon Scroggins removeActiveTabPage(true); 1072a2ab6a7dc0f7023c1d7ebb1cbad397c5dc3d6453Leon Scroggins } 1073a2ab6a7dc0f7023c1d7ebb1cbad397c5dc3d6453Leon Scroggins 10740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project cancelStopToast(); 10750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // unregister network state listener 10770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project unregisterReceiver(mNetworkStateIntentReceiver); 10780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView.disablePlatformNotifications(); 10790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mSensorManager != null) { 10810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSensorManager.unregisterListener(mSensorListener); 10820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override protected void onDestroy() { 108631a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 10870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, "BrowserActivity.onDestroy: this=" + this); 10880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onDestroy(); 10900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Remove the current tab and sub window 10910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TabControl.Tab t = mTabControl.getCurrentTab(); 1092fb5e77fac7b8b311fe72827183f8988f5ee92a5fPatrick Scott if (t != null) { 1093fb5e77fac7b8b311fe72827183f8988f5ee92a5fPatrick Scott dismissSubWindow(t); 1094fb5e77fac7b8b311fe72827183f8988f5ee92a5fPatrick Scott removeTabFromContentView(t); 1095fb5e77fac7b8b311fe72827183f8988f5ee92a5fPatrick Scott } 10960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Destroy all the tabs 10970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.destroy(); 10980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebIconDatabase.getInstance().close(); 10990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mGlsConnection != null) { 11000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project unbindService(mGlsConnection); 11010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mGlsConnection = null; 11020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // 11050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // stop MASF proxy service 11060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // 11070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //Intent proxyServiceIntent = new Intent(); 11080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //proxyServiceIntent.setComponent 11090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // (new ComponentName( 11100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "com.android.masfproxyservice", 11110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "com.android.masfproxyservice.MasfProxyService")); 11120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //stopService(proxyServiceIntent); 1113b4da0ad0351996f639b50f9f29b123a9b5c24fd0Grace Kloba 1114b4da0ad0351996f639b50f9f29b123a9b5c24fd0Grace Kloba unregisterReceiver(mPackageInstallationReceiver); 11150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 11180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onConfigurationChanged(Configuration newConfig) { 11193bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mConfigChanged = true; 11200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onConfigurationChanged(newConfig); 11210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mPageInfoDialog != null) { 11230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoDialog.dismiss(); 11240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showPageInfo( 11250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoView, 11260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoFromShowSSLCertificateOnError.booleanValue()); 11270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mSSLCertificateDialog != null) { 11290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateDialog.dismiss(); 11300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificate( 11310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateView); 11320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mSSLCertificateOnErrorDialog != null) { 11340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorDialog.dismiss(); 11350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificateOnError( 11360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView, 11370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler, 11380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError); 11390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mHttpAuthenticationDialog != null) { 11410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String title = ((TextView) mHttpAuthenticationDialog 11420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .findViewById(com.android.internal.R.id.alertTitle)).getText() 11430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .toString(); 11440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String name = ((TextView) mHttpAuthenticationDialog 11450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .findViewById(R.id.username_edit)).getText().toString(); 11460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String password = ((TextView) mHttpAuthenticationDialog 11470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .findViewById(R.id.password_edit)).getText().toString(); 11480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int focusId = mHttpAuthenticationDialog.getCurrentFocus() 11490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .getId(); 11500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthenticationDialog.dismiss(); 11510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showHttpAuthentication(mHttpAuthHandler, null, null, title, 11520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project name, password, focusId); 11530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mFindDialog != null && mFindDialog.isShowing()) { 11550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mFindDialog.onConfigurationChanged(newConfig); 11560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override public void onLowMemory() { 11600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onLowMemory(); 11610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.freeMemory(); 11620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11647bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed private boolean resumeWebViewTimers() { 11650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if ((!mActivityInPause && !mPageStarted) || 11660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (mActivityInPause && mPageStarted)) { 11670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project CookieSyncManager.getInstance().startSync(); 11680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = mTabControl.getCurrentWebView(); 11690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 11700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.resumeTimers(); 11710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 11730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 11740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 11750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11787bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed private boolean pauseWebViewTimers() { 11790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mActivityInPause && !mPageStarted) { 11800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project CookieSyncManager.getInstance().stopSync(); 11810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = mTabControl.getCurrentWebView(); 11820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 11830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.pauseTimers(); 11840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 11860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 11870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 11880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11911f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // FIXME: Do we want to call this when loading google for the first time? 11920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* 11930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * This function is called when we are launching for the first time. We 11940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * are waiting for the login credentials before loading Google home 11950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * pages. This way the user will be logged in straight away. 11960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 11970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void waitForCredentials() { 11980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Show a toast 11990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCredsDlg = new ProgressDialog(this); 12000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCredsDlg.setIndeterminate(true); 12010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCredsDlg.setMessage(getText(R.string.retrieving_creds_dlg_msg)); 12020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If the user cancels the operation, then cancel the Google 12030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Credentials request. 12040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCredsDlg.setCancelMessage(mHandler.obtainMessage(CANCEL_CREDS_REQUEST)); 12050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCredsDlg.show(); 12060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 12070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // We set a timeout for the retrieval of credentials in onResume() 12080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // as that is when we have freed up some CPU time to get 12090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the login credentials. 12100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 12120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* 12130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * If we have received the credentials or we have timed out and we are 12140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * showing the credentials dialog, then it is time to move on. 12150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 12160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void resumeAfterCredentials() { 12170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mCredsDlg == null) { 12180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 12190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 12210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Clear the toast 12220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mCredsDlg.isShowing()) { 12230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCredsDlg.dismiss(); 12240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCredsDlg = null; 12260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 12270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Clear any pending timeout 12280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.removeMessages(CANCEL_CREDS_REQUEST); 12290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 12300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Load the page 12310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = mTabControl.getCurrentWebView(); 12320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 12330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.loadUrl(mSettings.getHomePage()); 12340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 12360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Update the settings, need to do this last as it can take a moment 12370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // to persist the settings. In the mean time we could be loading 12380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // content. 12390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSettings.setLoginInitialized(this); 12400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 12420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Open the icon database and retain all the icons for visited sites. 12430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void retainIconsOnStartup() { 12440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebIconDatabase db = WebIconDatabase.getInstance(); 12450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project db.open(getDir("icons", 0).getPath()); 12460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 12470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Cursor c = Browser.getAllBookmarks(mResolver); 12480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!c.moveToFirst()) { 12490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project c.deactivate(); 12500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 12510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int urlIndex = c.getColumnIndex(Browser.BookmarkColumns.URL); 12530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project do { 12540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String url = c.getString(urlIndex); 12550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project db.retainIconForPageUrl(url); 12560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } while (c.moveToNext()); 12570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project c.deactivate(); 12580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (IllegalStateException e) { 12590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(LOGTAG, "retainIconsOnStartup", e); 12600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 12630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Helper method for getting the top window. 12640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView getTopWindow() { 12650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return mTabControl.getCurrentTopWebView(); 12660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 12680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 12690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onCreateOptionsMenu(Menu menu) { 12700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onCreateOptionsMenu(menu); 12710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 12720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project MenuInflater inflater = getMenuInflater(); 12730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inflater.inflate(R.menu.browser, menu); 12740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenu = menu; 12750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project updateInLoadMenuItems(); 12760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 12770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 12790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 12800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * As the menu can be open when loading state changes 12810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * we must manually update the state of the stop/reload menu 12820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * item 12830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 12840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void updateInLoadMenuItems() { 12850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mMenu == null) { 12860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 12870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project MenuItem src = mInLoad ? 12890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenu.findItem(R.id.stop_menu_id): 12900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenu.findItem(R.id.reload_menu_id); 12910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project MenuItem dest = mMenu.findItem(R.id.stop_reload_menu_id); 12920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dest.setIcon(src.getIcon()); 12930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dest.setTitle(src.getTitle()); 12940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 12960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 12970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onContextItemSelected(MenuItem item) { 12980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // chording is not an issue with context menus, but we use the same 12990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // options selector, so set mCanChord to true so we can access them. 13000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCanChord = true; 13010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int id = item.getItemId(); 13020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView webView = getTopWindow(); 13030d7ae0ed82e21d472cde8cf92b5657d8ee8ca0d8Leon Scroggins if (null == webView) { 13040d7ae0ed82e21d472cde8cf92b5657d8ee8ca0d8Leon Scroggins return false; 13050d7ae0ed82e21d472cde8cf92b5657d8ee8ca0d8Leon Scroggins } 13060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final HashMap hrefMap = new HashMap(); 13070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project hrefMap.put("webview", webView); 13080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Message msg = mHandler.obtainMessage( 13090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project FOCUS_NODE_HREF, id, 0, hrefMap); 13100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (id) { 13110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // -- Browser context menu 13120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.open_context_menu_id: 13130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.open_newtab_context_menu_id: 13140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.bookmark_context_menu_id: 13150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.save_link_context_menu_id: 13160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.share_link_context_menu_id: 13170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.copy_link_context_menu_id: 13180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project webView.requestFocusNodeHref(msg); 13190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project default: 13220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // For other context menus 13230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return onOptionsItemSelected(item); 13240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 13250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCanChord = false; 13260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 13270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 13280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Bundle createGoogleSearchSourceBundle(String source) { 13300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Bundle bundle = new Bundle(); 13310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project bundle.putString(SearchManager.SOURCE, source); 13320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return bundle; 13330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 13340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 13364e5f58704099c37186d4825c3d55ea5b0527867fThe Android Open Source Project * Overriding this to insert a local information bundle 13370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 13380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 13390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onSearchRequested() { 13405bbe98025a2c606a35c91b826760020890daadb1Leon Scroggins String url = (getTopWindow() == null) ? null : getTopWindow().getUrl(); 134183f473462fcd7869031a423c02b957c6e938a2f6Grace Kloba startSearch(mSettings.getHomePage().equals(url) ? null : url, true, 13424e5f58704099c37186d4825c3d55ea5b0527867fThe Android Open Source Project createGoogleSearchSourceBundle(GOOGLE_SEARCH_SOURCE_SEARCHKEY), false); 13430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 13440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 13450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 13470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void startSearch(String initialQuery, boolean selectInitialQuery, 13480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Bundle appSearchData, boolean globalSearch) { 13490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (appSearchData == null) { 13500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project appSearchData = createGoogleSearchSourceBundle(GOOGLE_SEARCH_SOURCE_TYPE); 13510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 13520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.startSearch(initialQuery, selectInitialQuery, appSearchData, globalSearch); 13530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 13540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13551f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins /** 13561f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins * Switch tabs. Called by the TitleBarSet when sliding the title bar 13571f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins * results in changing tabs. 1358160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * @param index Index of the tab to change to, as defined by 1359160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * mTabControl.getTabIndex(Tab t). 1360160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * @return boolean True if we successfully switched to a different tab. If 1361160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * the indexth tab is null, or if that tab is the same as 1362160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * the current one, return false. 13631f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins */ 1364160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins /* package */ boolean switchToTab(int index) { 13651f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins TabControl.Tab tab = mTabControl.getTab(index); 13661f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins TabControl.Tab currentTab = mTabControl.getCurrentTab(); 13671f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (tab == null || tab == currentTab) { 1368160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins return false; 13691f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 13701f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (currentTab != null) { 13711f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // currentTab may be null if it was just removed. In that case, 13721f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // we do not need to remove it 13731f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins removeTabFromContentView(currentTab); 13741f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 13751f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins removeTabFromContentView(tab); 13761f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins mTabControl.setCurrentTab(tab); 13771f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins attachTabToContentView(tab); 13783bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mTitleBar.setCurrentTab(index); 1379160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins return true; 13801f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 13811f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins 13820a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins /* package */ TabControl.Tab openTabToHomePage() { 13830a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins return openTabAndShow(mSettings.getHomePage(), false, null); 13840a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins } 13850a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins 13861f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins /* package */ void closeCurrentWindow() { 13871f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins final TabControl.Tab current = mTabControl.getCurrentTab(); 1388160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins if (mTabControl.getTabCount() == 1) { 1389304442375719effd41dbd53ae62de7a8d0cec7d9Leon Scroggins // This is the last tab. Open a new one, with the home 1390304442375719effd41dbd53ae62de7a8d0cec7d9Leon Scroggins // page and close the current one. 13910a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins TabControl.Tab newTab = openTabToHomePage(); 1392160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins closeTab(current); 1393160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins return; 1394160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins } 13951f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins final TabControl.Tab parent = current.getParentTab(); 13961f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins int indexToShow = -1; 13971f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (parent != null) { 13981f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins indexToShow = mTabControl.getTabIndex(parent); 13991f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } else { 1400160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins final int currentIndex = mTabControl.getCurrentIndex(); 1401160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins // Try to move to the tab to the right 1402160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins indexToShow = currentIndex + 1; 1403160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins if (indexToShow > mTabControl.getTabCount() - 1) { 1404160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins // Try to move to the tab to the left 1405160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins indexToShow = currentIndex - 1; 14061f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 14071f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 1408160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins if (switchToTab(indexToShow)) { 1409160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins // Close window 1410160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins closeTab(current); 1411160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins } 14121f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 14131f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins 14140a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins private ActiveTabsPage mActiveTabsPage; 14150a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins 14160a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins /** 14170a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins * Remove the active tabs page. 14180a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins * @param needToAttach If true, the active tabs page did not attach a tab 14190a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins * to the content view, so we need to do that here. 14200a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins */ 14210a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins /* package */ void removeActiveTabPage(boolean needToAttach) { 14220a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins mContentView.removeView(mActiveTabsPage); 14230a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins mActiveTabsPage = null; 14240a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins mMenuState = R.id.MAIN_MENU; 14250a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins if (needToAttach) { 14260a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins attachTabToContentView(mTabControl.getCurrentTab()); 14270a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins } 14280a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins getTopWindow().requestFocus(); 14290a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins } 14300a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins 14310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 14320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onOptionsItemSelected(MenuItem item) { 14330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!mCanChord) { 14340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // The user has already fired a shortcut with this hold down of the 14350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // menu key. 14360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 14370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14381f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (null == getTopWindow()) { 14390d7ae0ed82e21d472cde8cf92b5657d8ee8ca0d8Leon Scroggins return false; 14400d7ae0ed82e21d472cde8cf92b5657d8ee8ca0d8Leon Scroggins } 14416ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba if (mMenuIsDown) { 14426ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba // The shortcut action consumes the MENU. Even if it is still down, 14436ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba // it won't trigger the next shortcut action. In the case of the 14446ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba // shortcut action triggering a new activity, like Bookmarks, we 14456ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba // won't get onKeyUp for MENU. So it is important to reset it here. 14466ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba mMenuIsDown = false; 14476ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba } 14480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (item.getItemId()) { 14490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // -- Main menu 1450a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins case R.id.new_tab_menu_id: 14510a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins openTabToHomePage(); 1452a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins break; 1453a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins 145464b80f3efd95d7b5192731e995ccde79c4c6c11fLeon Scroggins case R.id.goto_menu_id: 1455304442375719effd41dbd53ae62de7a8d0cec7d9Leon Scroggins bookmarksOrHistoryPicker(false); 14560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14580a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins case R.id.active_tabs_menu_id: 14590a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins mActiveTabsPage = new ActiveTabsPage(this, mTabControl); 14600a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins removeTabFromContentView(mTabControl.getCurrentTab()); 14610a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins mContentView.addView(mActiveTabsPage, COVER_SCREEN_PARAMS); 14620a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins mActiveTabsPage.requestFocus(); 14630a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins mMenuState = EMPTY_MENU; 14640a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins break; 14650a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins 14661f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins case R.id.add_bookmark_menu_id: 14671f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins Intent i = new Intent(BrowserActivity.this, 14681f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins AddBookmarkPage.class); 14691f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins WebView w = getTopWindow(); 14701f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins i.putExtra("url", w.getUrl()); 14711f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins i.putExtra("title", w.getTitle()); 14721f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins startActivity(i); 14730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.stop_reload_menu_id: 14760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mInLoad) { 14770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project stopLoading(); 14780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 14790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().reload(); 14800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.back_menu_id: 14840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().goBack(); 14850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.forward_menu_id: 14880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().goForward(); 14890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.close_menu_id: 14920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Close the subwindow if it exists. 14930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabControl.getCurrentSubWindow() != null) { 14940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dismissSubWindow(mTabControl.getCurrentTab()); 14950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14971f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins closeCurrentWindow(); 14980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.homepage_menu_id: 15010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TabControl.Tab current = mTabControl.getCurrentTab(); 15020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current != null) { 15030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dismissSubWindow(current); 15040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project current.getWebView().loadUrl(mSettings.getHomePage()); 15050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.preferences_menu_id: 15090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent = new Intent(this, 15100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserPreferencesPage.class); 15110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project startActivityForResult(intent, PREFERENCES_PAGE); 15120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.find_menu_id: 15150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (null == mFindDialog) { 15160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mFindDialog = new FindDialog(this); 15170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mFindDialog.setWebView(getTopWindow()); 15190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mFindDialog.show(); 15200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenuState = EMPTY_MENU; 15210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.select_text_id: 15240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().emulateShiftHeld(); 15250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.page_info_menu_id: 15270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showPageInfo(mTabControl.getCurrentTab(), false); 15280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.classic_history_menu_id: 1531304442375719effd41dbd53ae62de7a8d0cec7d9Leon Scroggins bookmarksOrHistoryPicker(true); 15320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.share_page_menu_id: 15350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Browser.sendString(this, getTopWindow().getUrl()); 15360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.dump_nav_menu_id: 15390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().debugDump(); 15400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.zoom_in_menu_id: 15430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().zoomIn(); 15440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.zoom_out_menu_id: 15470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().zoomOut(); 15480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.view_downloads_menu_id: 15510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project viewDownloads(null); 15520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_one_menu_id: 15550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_two_menu_id: 15560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_three_menu_id: 15570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_four_menu_id: 15580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_five_menu_id: 15590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_six_menu_id: 15600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_seven_menu_id: 15610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_eight_menu_id: 15620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project { 15630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int menuid = item.getItemId(); 15640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project for (int id = 0; id < WINDOW_SHORTCUT_ID_ARRAY.length; id++) { 15650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (WINDOW_SHORTCUT_ID_ARRAY[id] == menuid) { 15660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TabControl.Tab desiredTab = mTabControl.getTab(id); 15670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (desiredTab != null && 15680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project desiredTab != mTabControl.getCurrentTab()) { 15691f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins switchToTab(id); 15700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project default: 15780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!super.onOptionsItemSelected(item)) { 15790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 15800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Otherwise fall through. 15820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCanChord = false; 15840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 15850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void closeFind() { 15880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenuState = R.id.MAIN_MENU; 15890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override public boolean onPrepareOptionsMenu(Menu menu) 15920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project { 15930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // This happens when the user begins to hold down the menu key, so 15940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // allow them to chord to get a shortcut. 15950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCanChord = true; 15960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Note: setVisible will decide whether an item is visible; while 15970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // setEnabled() will decide whether an item is enabled, which also means 15980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // whether the matching shortcut key will function. 15990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onPrepareOptionsMenu(menu); 16000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (mMenuState) { 16010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case EMPTY_MENU: 16020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mCurrentMenuState != mMenuState) { 16030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.MAIN_MENU, false); 16040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupEnabled(R.id.MAIN_MENU, false); 16050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupEnabled(R.id.MAIN_SHORTCUT_MENU, false); 16060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 16080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project default: 16090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mCurrentMenuState != mMenuState) { 16100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.MAIN_MENU, true); 16110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupEnabled(R.id.MAIN_MENU, true); 16120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupEnabled(R.id.MAIN_SHORTCUT_MENU, true); 16130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView w = getTopWindow(); 16150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean canGoBack = false; 16160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean canGoForward = false; 16170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean isHome = false; 16180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 16190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project canGoBack = w.canGoBack(); 16200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project canGoForward = w.canGoForward(); 16210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project isHome = mSettings.getHomePage().equals(w.getUrl()); 16220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final MenuItem back = menu.findItem(R.id.back_menu_id); 16240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project back.setEnabled(canGoBack); 16250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final MenuItem home = menu.findItem(R.id.homepage_menu_id); 16270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project home.setEnabled(!isHome); 16280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.forward_menu_id) 16300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setEnabled(canGoForward); 16310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1632a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins menu.findItem(R.id.new_tab_menu_id).setEnabled( 1633a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins mTabControl.getTabCount() < TabControl.MAX_TABS); 1634a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins 16350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // decide whether to show the share link option 16360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project PackageManager pm = getPackageManager(); 16370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent send = new Intent(Intent.ACTION_SEND); 16380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project send.setType("text/plain"); 16390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ResolveInfo ri = pm.resolveActivity(send, PackageManager.MATCH_DEFAULT_ONLY); 16400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.share_page_menu_id).setVisible(ri != null); 16410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean isNavDump = mSettings.isNavDump(); 16430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final MenuItem nav = menu.findItem(R.id.dump_nav_menu_id); 16440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project nav.setVisible(isNavDump); 16450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project nav.setEnabled(isNavDump); 16460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 16470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCurrentMenuState = mMenuState; 16490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 16500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 16530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCreateContextMenu(ContextMenu menu, View v, 16540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ContextMenuInfo menuInfo) { 16550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView webview = (WebView) v; 16560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView.HitTestResult result = webview.getHitTestResult(); 16570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (result == null) { 16580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 16590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int type = result.getType(); 16620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (type == WebView.HitTestResult.UNKNOWN_TYPE) { 16630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.w(LOGTAG, 16640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "We should not show context menu when nothing is touched"); 16650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 16660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (type == WebView.HitTestResult.EDIT_TEXT_TYPE) { 16680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // let TextView handles context menu 16690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 16700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Note, http://b/issue?id=1106666 is requesting that 16730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // an inflated menu can be used again. This is not available 16740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // yet, so inflate each time (yuk!) 16750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project MenuInflater inflater = getMenuInflater(); 16760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inflater.inflate(R.menu.browsercontext, menu); 16770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Show the correct menu group 16790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String extra = result.getExtra(); 16800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.PHONE_MENU, 16810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project type == WebView.HitTestResult.PHONE_TYPE); 16820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.EMAIL_MENU, 16830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project type == WebView.HitTestResult.EMAIL_TYPE); 16840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.GEO_MENU, 16850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project type == WebView.HitTestResult.GEO_TYPE); 16860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.IMAGE_MENU, 16870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project type == WebView.HitTestResult.IMAGE_TYPE 16880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE); 16890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.ANCHOR_MENU, 16900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project type == WebView.HitTestResult.SRC_ANCHOR_TYPE 16910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE); 16920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Setup custom handling depending on the type 16940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (type) { 16950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.PHONE_TYPE: 16960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setHeaderTitle(Uri.decode(extra)); 16970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.dial_context_menu_id).setIntent( 16980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Intent(Intent.ACTION_VIEW, Uri 16990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .parse(WebView.SCHEME_TEL + extra))); 17000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent addIntent = new Intent(Intent.ACTION_INSERT_OR_EDIT); 17010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project addIntent.putExtra(Insert.PHONE, Uri.decode(extra)); 17020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project addIntent.setType(Contacts.People.CONTENT_ITEM_TYPE); 17030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.add_contact_context_menu_id).setIntent( 17040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project addIntent); 17050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.copy_phone_context_menu_id).setOnMenuItemClickListener( 17060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Copy(extra)); 17070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 17080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.EMAIL_TYPE: 17100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setHeaderTitle(extra); 17110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.email_context_menu_id).setIntent( 17120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Intent(Intent.ACTION_VIEW, Uri 17130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .parse(WebView.SCHEME_MAILTO + extra))); 17140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.copy_mail_context_menu_id).setOnMenuItemClickListener( 17150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Copy(extra)); 17160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 17170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.GEO_TYPE: 17190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setHeaderTitle(extra); 17200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.map_context_menu_id).setIntent( 17210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Intent(Intent.ACTION_VIEW, Uri 17220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .parse(WebView.SCHEME_GEO 17230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + URLEncoder.encode(extra)))); 17240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.copy_geo_context_menu_id).setOnMenuItemClickListener( 17250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Copy(extra)); 17260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 17270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.SRC_ANCHOR_TYPE: 17290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE: 17300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TextView titleView = (TextView) LayoutInflater.from(this) 17310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(android.R.layout.browser_link_context_header, 17320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project null); 17330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project titleView.setText(extra); 17340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setHeaderView(titleView); 17350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // decide whether to show the open link in new tab option 17360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.open_newtab_context_menu_id).setVisible( 17370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.getTabCount() < TabControl.MAX_TABS); 17380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project PackageManager pm = getPackageManager(); 17390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent send = new Intent(Intent.ACTION_SEND); 17400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project send.setType("text/plain"); 17410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ResolveInfo ri = pm.resolveActivity(send, PackageManager.MATCH_DEFAULT_ONLY); 17420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.share_link_context_menu_id).setVisible(ri != null); 17430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (type == WebView.HitTestResult.SRC_ANCHOR_TYPE) { 17440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 17450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // otherwise fall through to handle image part 17470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.IMAGE_TYPE: 17480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (type == WebView.HitTestResult.IMAGE_TYPE) { 17490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setHeaderTitle(extra); 17500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.view_image_context_menu_id).setIntent( 17520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Intent(Intent.ACTION_VIEW, Uri.parse(extra))); 17530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.download_context_menu_id). 17540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setOnMenuItemClickListener(new Download(extra)); 17550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 17560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project default: 17580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.w(LOGTAG, "We should not get here."); 17590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 17600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Attach the given tab to the content view. 17640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void attachTabToContentView(TabControl.Tab t) { 17652bc69918d97a767a02132090e58718077381ba1aSteve Block // Attach the container that contains the main WebView and any other UI 17662bc69918d97a767a02132090e58718077381ba1aSteve Block // associated with the tab. 17672bc69918d97a767a02132090e58718077381ba1aSteve Block mContentView.addView(t.getContainer(), COVER_SCREEN_PARAMS); 1768bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 1769bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch if (mShouldShowErrorConsole) { 1770bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch ErrorConsoleView errorConsole = mTabControl.getCurrentErrorConsole(true); 1771bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch if (errorConsole.numberOfErrors() == 0) { 1772bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch errorConsole.showConsole(ErrorConsoleView.SHOW_NONE); 1773bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } else { 1774bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch errorConsole.showConsole(ErrorConsoleView.SHOW_MINIMIZED); 1775bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 1776bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 1777bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch mErrorConsoleContainer.addView(errorConsole, 1778bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, 1779bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch ViewGroup.LayoutParams.WRAP_CONTENT)); 1780bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 1781bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 178239ab28eba0c8c837ac80851ec0dd2af336aa3f85Leon Scroggins WebView view = t.getWebView(); 178355a5bc2a8f3c9a0721eeaa5a45241e00d5da95efLeon Scroggins view.setEmbeddedTitleBar(mTitleBar); 17840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Attach the sub window if necessary 17850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project attachSubWindow(t); 17860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Request focus on the top window. 17870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project t.getTopWindow().requestFocus(); 17880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Attach a sub window to the main WebView of the given tab. 17910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void attachSubWindow(TabControl.Tab t) { 17920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If a sub window exists, attach it to the content view. 17930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView subView = t.getSubWebView(); 17940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (subView != null) { 17950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final View container = t.getSubWebViewContainer(); 17960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mContentView.addView(container, COVER_SCREEN_PARAMS); 17970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project subView.requestFocus(); 17980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Remove the given tab from the content view. 18020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void removeTabFromContentView(TabControl.Tab t) { 18032bc69918d97a767a02132090e58718077381ba1aSteve Block // Remove the container that contains the main WebView. 18042bc69918d97a767a02132090e58718077381ba1aSteve Block mContentView.removeView(t.getContainer()); 1805bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 1806bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch if (mTabControl.getCurrentErrorConsole(false) != null) { 1807bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch mErrorConsoleContainer.removeView(mTabControl.getCurrentErrorConsole(false)); 1808bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 1809bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 181039ab28eba0c8c837ac80851ec0dd2af336aa3f85Leon Scroggins WebView view = t.getWebView(); 181155a5bc2a8f3c9a0721eeaa5a45241e00d5da95efLeon Scroggins view.setEmbeddedTitleBar(null); 181239ab28eba0c8c837ac80851ec0dd2af336aa3f85Leon Scroggins 18130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Remove the sub window if it exists. 18140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (t.getSubWebView() != null) { 18150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mContentView.removeView(t.getSubWebViewContainer()); 18160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Remove the sub window if it exists. Also called by TabControl when the 18200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // user clicks the 'X' to dismiss a sub window. 18210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ void dismissSubWindow(TabControl.Tab t) { 18220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView mainView = t.getWebView(); 18230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (t.getSubWebView() != null) { 18240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Remove the container view and request focus on the main WebView. 18250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mContentView.removeView(t.getSubWebViewContainer()); 18260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mainView.requestFocus(); 18270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Tell the TabControl to dismiss the subwindow. This will destroy 18280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the WebView. 18290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.dismissSubWindow(t); 18300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18331f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // A wrapper function of {@link #openTabAndShow(UrlData, boolean, String)} 183425ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima // that accepts url as string. 18351f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins private TabControl.Tab openTabAndShow(String url, boolean closeOnExit, 18361f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins String appId) { 18371f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins return openTabAndShow(new UrlData(url), closeOnExit, appId); 18380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // This method does a ton of stuff. It will attempt to create a new tab 18410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we haven't reached MAX_TABS. Otherwise it uses the current tab. If 18421f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // url isn't null, it will load the given url. 18431f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins /* package */ TabControl.Tab openTabAndShow(UrlData urlData, 1844f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project boolean closeOnExit, String appId) { 18450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final boolean newTab = mTabControl.getTabCount() != TabControl.MAX_TABS; 18460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final TabControl.Tab currentTab = mTabControl.getCurrentTab(); 18470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (newTab) { 18481f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins final TabControl.Tab tab = mTabControl.createNewTab( 18491f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins closeOnExit, appId, urlData.mUrl); 18501f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins WebView webview = tab.getWebView(); 18513bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mTitleBar.addTab(webview, true); 18520a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins // If the last tab was removed from the active tabs page, currentTab 18530a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins // will be null. 18540a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins if (currentTab != null) { 18550a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins removeTabFromContentView(currentTab); 18560a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins } 18571f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins attachTabToContentView(tab); 18588bbd69f50abd537bfe7eb314b3a3e20241ac22bdPatrick Scott // We must set the new tab as the current tab to reflect the old 18598bbd69f50abd537bfe7eb314b3a3e20241ac22bdPatrick Scott // animation behavior. 18608bbd69f50abd537bfe7eb314b3a3e20241ac22bdPatrick Scott mTabControl.setCurrentTab(tab); 1861160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins if (!urlData.isEmpty()) { 18621f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins urlData.loadIn(webview); 18630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18641f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins return tab; 186564b80f3efd95d7b5192731e995ccde79c4c6c11fLeon Scroggins } else { 18661f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // Get rid of the subwindow if it exists 18671f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins dismissSubWindow(currentTab); 18681f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (!urlData.isEmpty()) { 18691f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // Load the given url. 18701f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins urlData.loadIn(currentTab.getWebView()); 18710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1873c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba return currentTab; 18740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1876c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba private TabControl.Tab openTab(String url) { 18770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mSettings.openInBackground()) { 1878f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project TabControl.Tab t = mTabControl.createNewTab(); 18790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (t != null) { 18801f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins WebView view = t.getWebView(); 18813bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mTitleBar.addTab(view, false); 18821f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins view.loadUrl(url); 18830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1884c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba return t; 18850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 18861f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins return openTabAndShow(url, false, null); 18870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private class Copy implements OnMenuItemClickListener { 18910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private CharSequence mText; 18920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onMenuItemClick(MenuItem item) { 18940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project copy(mText); 18950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 18960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public Copy(CharSequence toCopy) { 18990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mText = toCopy; 19000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private class Download implements OnMenuItemClickListener { 19040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String mText; 19050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onMenuItemClick(MenuItem item) { 19070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project onDownloadStartNoStream(mText, null, null, null, -1); 19080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 19090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public Download(String toDownload) { 19120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mText = toDownload; 19130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void copy(CharSequence text) { 19170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 19180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project IClipboard clip = IClipboard.Stub.asInterface(ServiceManager.getService("clipboard")); 19190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (clip != null) { 19200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project clip.setClipboardText(text); 19210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (android.os.RemoteException e) { 19230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(LOGTAG, "Copy failed", e); 19240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 19280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Resets the browser title-view to whatever it must be (for example, if we 19290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * load a page from history). 19300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 19310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void resetTitle() { 19320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetLockIcon(); 19330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleIconAndProgress(); 19340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 19370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Resets the browser title-view to whatever it must be 19380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * (for example, if we had a loading error) 19390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * When we have a new page, we call resetTitle, when we 19400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * have to reset the titlebar to whatever it used to be 19410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * (for example, if the user chose to stop loading), we 19420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * call resetTitleAndRevertLockIcon. 19430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 19440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ void resetTitleAndRevertLockIcon() { 19450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project revertLockIcon(); 19460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleIconAndProgress(); 19470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 19500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Reset the title, favicon, and progress. 19510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 19520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void resetTitleIconAndProgress() { 19530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView current = mTabControl.getCurrentWebView(); 19540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current == null) { 19550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 19560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleAndIcon(current); 19580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int progress = current.getProgress(); 19590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWebChromeClient.onProgressChanged(current, progress); 19600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Reset the title and the icon based on the given item. 19630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void resetTitleAndIcon(WebView view) { 19640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebHistoryItem item = view.copyBackForwardList().getCurrentItem(); 19650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (item != null) { 19661f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins setUrlTitle(item.getUrl(), item.getTitle(), view); 19670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setFavicon(item.getFavicon()); 19680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 19691f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins setUrlTitle(null, null, view); 19700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setFavicon(null); 19710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 19750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Sets a title composed of the URL and the title string. 19760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param url The URL of the site being loaded. 19770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param title The title of the site being loaded. 19780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 19791f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins private void setUrlTitle(String url, String title, WebView view) { 19800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mUrl = url; 19810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTitle = title; 19820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19833bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mTitleBar.setTitleAndUrl(title, url, view); 19843bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins if (mFakeTitleBar != null) { 19853bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mFakeTitleBar.setTitleAndUrl(title, url); 19860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 19900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param url The URL to build a title version of the URL from. 19910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @return The title version of the URL or null if fails. 19920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * The title version of the URL can be either the URL hostname, 19930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * or the hostname with an "https://" prefix (for secure URLs), 19940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * or an empty string if, for example, the URL in question is a 19950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * file:// URL with no hostname. 19960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 199732e14a6deccfa75490b3032bb4ddd5ae90f89de8Leon Scroggins /* package */ static String buildTitleUrl(String url) { 19980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String titleUrl = null; 19990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null) { 20010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 20020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // parse the url string 20030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project URL urlObj = new URL(url); 20040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (urlObj != null) { 20050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project titleUrl = ""; 20060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String protocol = urlObj.getProtocol(); 20080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String host = urlObj.getHost(); 20090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (host != null && 0 < host.length()) { 20110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project titleUrl = host; 20120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (protocol != null) { 20130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if a secure site, add an "https://" prefix! 20140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (protocol.equalsIgnoreCase("https")) { 20150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project titleUrl = protocol + "://" + host; 20160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (MalformedURLException e) {} 20210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return titleUrl; 20240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Set the favicon in the title bar. 20270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void setFavicon(Bitmap icon) { 20283bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mTitleBar.setFavicon(icon, getTopWindow()); 20293bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins if (mFakeTitleBar != null) { 20303bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mFakeTitleBar.setFavicon(icon); 20310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 20350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Saves the current lock-icon state before resetting 20360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * the lock icon. If we have an error, we may need to 20370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * roll back to the previous state. 20380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 20390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void saveLockIcon() { 20400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPrevLockType = mLockIconType; 20410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 20440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Reverts the lock-icon state to the last saved state, 20450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * for example, if we had an error, and need to cancel 20460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * the load. 20470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 20480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void revertLockIcon() { 20490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mLockIconType = mPrevLockType; 20500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 205131a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 20520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, "BrowserActivity.revertLockIcon:" + 20530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project " revert lock icon to " + mLockIconType); 20540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20563bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins updateLockIconToLatest(); 20570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20591f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins /** 20600a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins * Close the tab, remove its associated title bar, and adjust mTabControl's 20610a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins * current tab to a valid value. 20621f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins */ 20630a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins /* package */ void closeTab(TabControl.Tab t) { 20640a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins int currentIndex = mTabControl.getCurrentIndex(); 20650a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins int removeIndex = mTabControl.getTabIndex(t); 20663bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mTitleBar.removeTab(removeIndex); 20671f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins mTabControl.removeTab(t); 20680a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins if (currentIndex >= removeIndex && currentIndex != 0) { 20690a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins currentIndex--; 20700a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins } 20710a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins mTabControl.setCurrentTab(mTabControl.getTab(currentIndex)); 20720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void goBackOnePageOrQuit() { 20750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TabControl.Tab current = mTabControl.getCurrentTab(); 20760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current == null) { 20770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* 20780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Instead of finishing the activity, simply push this to the back 20790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * of the stack and let ActivityManager to choose the foreground 20800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * activity. As BrowserActivity is singleTask, it will be always the 20810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * root of the task. So we can use either true or false for 20820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * moveTaskToBack(). 20830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 20840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project moveTaskToBack(true); 20850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = current.getWebView(); 20870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w.canGoBack()) { 20880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.goBack(); 20890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 20900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Check to see if we are closing a window that was created by 20910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // another window. If so, we switch back to that window. 20920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TabControl.Tab parent = current.getParentTab(); 20930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (parent != null) { 20941f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins switchToTab(mTabControl.getTabIndex(parent)); 20951f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // Now we close the other tab 20961f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins closeTab(current); 20970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 20980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current.closeOnExit()) { 2099bb0af5ced906e5100d54f0c08e073e669edf2290Grace Kloba // force mPageStarted to be false as we are going to either 2100bb0af5ced906e5100d54f0c08e073e669edf2290Grace Kloba // finish the activity or remove the tab. This will ensure 2101bb0af5ced906e5100d54f0c08e073e669edf2290Grace Kloba // pauseWebView() taking action. 2102bb0af5ced906e5100d54f0c08e073e669edf2290Grace Kloba mPageStarted = false; 21030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabControl.getTabCount() == 1) { 21040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project finish(); 21050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 21060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21077bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed // call pauseWebViewTimers() now, we won't be able to call 21087bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed // it in onPause() as the WebView won't be valid. 2109ec1b5ad8d8283b1fbbc5d7fa1cd50ef95b9e594dGrace Kloba // Temporarily change mActivityInPause to be true as 2110ec1b5ad8d8283b1fbbc5d7fa1cd50ef95b9e594dGrace Kloba // pauseWebViewTimers() will do nothing if mActivityInPause 2111ec1b5ad8d8283b1fbbc5d7fa1cd50ef95b9e594dGrace Kloba // is false. 2112918e1d78b2db6ef21c71a07868572d9cda498476Grace Kloba boolean savedState = mActivityInPause; 2113918e1d78b2db6ef21c71a07868572d9cda498476Grace Kloba if (savedState) { 2114ec1b5ad8d8283b1fbbc5d7fa1cd50ef95b9e594dGrace Kloba Log.e(LOGTAG, "BrowserActivity is already paused " 2115ec1b5ad8d8283b1fbbc5d7fa1cd50ef95b9e594dGrace Kloba + "while handing goBackOnePageOrQuit."); 2116918e1d78b2db6ef21c71a07868572d9cda498476Grace Kloba } 2117918e1d78b2db6ef21c71a07868572d9cda498476Grace Kloba mActivityInPause = true; 21187bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed pauseWebViewTimers(); 2119918e1d78b2db6ef21c71a07868572d9cda498476Grace Kloba mActivityInPause = savedState; 21200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project removeTabFromContentView(current); 21213bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mTitleBar.removeTab(mTabControl.getTabIndex(current)); 21220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.removeTab(current); 21230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* 21250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Instead of finishing the activity, simply push this to the back 21260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * of the stack and let ActivityManager to choose the foreground 21270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * activity. As BrowserActivity is singleTask, it will be always the 21280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * root of the task. So we can use either true or false for 21290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * moveTaskToBack(). 21300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 21310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project moveTaskToBack(true); 21320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 21360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public KeyTracker.State onKeyTracker(int keyCode, 21370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project KeyEvent event, 21380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project KeyTracker.Stage stage, 21390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int duration) { 21400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if onKeyTracker() is called after activity onStop() 21410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // because of accumulated key events, 21420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // we should ignore it as browser is not active any more. 21430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView topWindow = getTopWindow(); 2144adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu if (topWindow == null && mCustomView == null) 21450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return KeyTracker.State.NOT_TRACKING; 21460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 21470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (keyCode == KeyEvent.KEYCODE_BACK) { 2148adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu // Check if a custom view is currently showing and, if it is, hide it. 2149adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu if (mCustomView != null) { 2150adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu mWebChromeClient.onHideCustomView(); 2151adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu return KeyTracker.State.DONE_TRACKING; 2152adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu } 21530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (stage == KeyTracker.Stage.LONG_REPEAT) { 2154304442375719effd41dbd53ae62de7a8d0cec7d9Leon Scroggins bookmarksOrHistoryPicker(true); 21550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return KeyTracker.State.DONE_TRACKING; 21560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (stage == KeyTracker.Stage.UP) { 21570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // FIXME: Currently, we do not have a notion of the 21580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // history picker for the subwindow, but maybe we 21590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // should? 21600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView subwindow = mTabControl.getCurrentSubWindow(); 21610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (subwindow != null) { 21620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (subwindow.canGoBack()) { 21630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project subwindow.goBack(); 21640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 21650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dismissSubWindow(mTabControl.getCurrentTab()); 21660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 21680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project goBackOnePageOrQuit(); 21690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return KeyTracker.State.DONE_TRACKING; 21710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return KeyTracker.State.KEEP_TRACKING; 21730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return KeyTracker.State.NOT_TRACKING; 21750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 21770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override public boolean onKeyDown(int keyCode, KeyEvent event) { 21780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (keyCode == KeyEvent.KEYCODE_MENU) { 21790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenuIsDown = true; 21806ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba } else if (mMenuIsDown) { 21816ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba // The default key mode is DEFAULT_KEYS_SEARCH_LOCAL. As the MENU is 21826ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba // still down, we don't want to trigger the search. Pretend to 21836ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba // consume the key and do nothing. 21846ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba return true; 21850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean handled = mKeyTracker.doKeyDown(keyCode, event); 21870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!handled) { 21880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (keyCode) { 21890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case KeyEvent.KEYCODE_SPACE: 21900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (event.isShiftPressed()) { 21910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().pageUp(false); 21920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 21930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().pageDown(false); 21940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handled = true; 21960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 21970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 21980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project default: 21990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 22000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return handled || super.onKeyDown(keyCode, event); 22030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override public boolean onKeyUp(int keyCode, KeyEvent event) { 22060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (keyCode == KeyEvent.KEYCODE_MENU) { 22070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenuIsDown = false; 22080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return mKeyTracker.doKeyUp(keyCode, event) || super.onKeyUp(keyCode, event); 22100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void stopLoading() { 22130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleAndRevertLockIcon(); 22140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = getTopWindow(); 22150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.stopLoading(); 22160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWebViewClient.onPageFinished(w, w.getUrl()); 22170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project cancelStopToast(); 22190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mStopToast = Toast 22200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .makeText(this, R.string.stopping, Toast.LENGTH_SHORT); 22210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mStopToast.show(); 22220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void cancelStopToast() { 22250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mStopToast != null) { 22260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mStopToast.cancel(); 22270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mStopToast = null; 22280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // called by a non-UI thread to post the message 22320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void postMessage(int what, int arg1, int arg2, Object obj) { 22330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.sendMessage(mHandler.obtainMessage(what, arg1, arg2, obj)); 22340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // public message ids 22370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public final static int LOAD_URL = 1001; 22380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public final static int STOP_LOAD = 1002; 22390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Message Ids 22410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static final int FOCUS_NODE_HREF = 102; 22420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static final int CANCEL_CREDS_REQUEST = 103; 224392c18a52ca7a79c114028b5ba22c3dfe443bd1a4Grace Kloba private static final int RELEASE_WAKELOCK = 107; 22440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Private handler for handling javascript and saving passwords 22460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Handler mHandler = new Handler() { 22470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void handleMessage(Message msg) { 22490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (msg.what) { 22500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case FOCUS_NODE_HREF: 22510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String url = (String) msg.getData().get("url"); 22520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url == null || url.length() == 0) { 22530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 22540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project HashMap focusNodeMap = (HashMap) msg.obj; 22560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView view = (WebView) focusNodeMap.get("webview"); 22570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Only apply the action if the top window did not change. 22580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (getTopWindow() != view) { 22590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 22600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (msg.arg1) { 22620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.open_context_menu_id: 22630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.view_image_context_menu_id: 22640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project loadURL(getTopWindow(), url); 22650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 22660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.open_newtab_context_menu_id: 2267c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba final TabControl.Tab parent = mTabControl 2268c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba .getCurrentTab(); 2269c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba final TabControl.Tab newTab = openTab(url); 2270c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba if (newTab != parent) { 2271c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba parent.addChildTab(newTab); 2272c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba } 22730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 22740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.bookmark_context_menu_id: 22750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent = new Intent(BrowserActivity.this, 22760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project AddBookmarkPage.class); 22770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.putExtra("url", url); 22780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project startActivity(intent); 22790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 22800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.share_link_context_menu_id: 22810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Browser.sendString(BrowserActivity.this, url); 22820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 22830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.copy_link_context_menu_id: 22840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project copy(url); 22850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 22860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.save_link_context_menu_id: 22870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.download_context_menu_id: 22880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project onDownloadStartNoStream(url, null, null, null, -1); 22890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 22900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 22920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case LOAD_URL: 22940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project loadURL(getTopWindow(), (String) msg.obj); 22950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 22960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case STOP_LOAD: 22980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project stopLoading(); 22990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 23000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 23010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case CANCEL_CREDS_REQUEST: 23020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resumeAfterCredentials(); 23030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 23040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 23050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case RELEASE_WAKELOCK: 23060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mWakeLock.isHeld()) { 23070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWakeLock.release(); 23080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 23100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 23130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 231489c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins private void updateScreenshot(WebView view) { 231589c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins // If this is a bookmarked site, add a screenshot to the database. 231689c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins // FIXME: When should we update? Every time? 231789c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins // FIXME: Would like to make sure there is actually something to 231889c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins // draw, but the API for that (WebViewCore.pictureReady()) is not 231989c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins // currently accessible here. 23203918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott ContentResolver cr = getContentResolver(); 23213918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott final Cursor c = BrowserBookmarksAdapter.queryBookmarksForUrl( 2322a5d669e4c08f0e64387c2c539c41a26ac8c845abLeon Scroggins cr, view.getOriginalUrl(), view.getUrl(), false); 23233918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott if (c != null) { 232489c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins boolean succeed = c.moveToFirst(); 232589c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins ContentValues values = null; 232689c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins while (succeed) { 232789c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins if (values == null) { 232889c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins final ByteArrayOutputStream os 232989c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins = new ByteArrayOutputStream(); 233089c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins Picture thumbnail = view.capturePicture(); 233189c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins // Keep width and height in sync with BrowserBookmarksPage 233289c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins // and bookmark_thumb 233389c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins Bitmap bm = Bitmap.createBitmap(100, 80, 233489c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins Bitmap.Config.ARGB_4444); 233589c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins Canvas canvas = new Canvas(bm); 233689c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins // May need to tweak these values to determine what is the 233789c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins // best scale factor 233889c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins canvas.scale(.5f, .5f); 233989c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins thumbnail.draw(canvas); 234089c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins bm.compress(Bitmap.CompressFormat.PNG, 100, os); 234189c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins values = new ContentValues(); 234289c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins values.put(Browser.BookmarkColumns.THUMBNAIL, 234389c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins os.toByteArray()); 234489c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins } 234589c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins cr.update(ContentUris.withAppendedId(Browser.BOOKMARKS_URI, 234689c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins c.getInt(0)), values, null, null); 234789c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins succeed = c.moveToNext(); 234889c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins } 234989c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins c.close(); 235089c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins } 235189c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins } 235289c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins 23530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // ------------------------------------------------------------------------- 23540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // WebViewClient implementation. 23550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //------------------------------------------------------------------------- 23560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 23570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Use in overrideUrlLoading 23580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ final static String SCHEME_WTAI = "wtai://wp/"; 23590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ final static String SCHEME_WTAI_MC = "wtai://wp/mc;"; 23600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ final static String SCHEME_WTAI_SD = "wtai://wp/sd;"; 23610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ final static String SCHEME_WTAI_AP = "wtai://wp/ap;"; 23620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 23630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ WebViewClient getWebViewClient() { 23640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return mWebViewClient; 23650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 23673918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott private void updateIcon(WebView view, Bitmap icon) { 23680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (icon != null) { 23690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserBookmarksAdapter.updateBookmarkFavicon(mResolver, 23703918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott view, icon); 23710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setFavicon(icon); 23730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 23750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final WebViewClient mWebViewClient = new WebViewClient() { 23760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 23770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onPageStarted(WebView view, String url, Bitmap favicon) { 23780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetLockIcon(url); 23791f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins setUrlTitle(url, null, view); 2380bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 2381bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch ErrorConsoleView errorConsole = mTabControl.getCurrentErrorConsole(false); 2382bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch if (errorConsole != null) { 2383bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch errorConsole.clearErrorMessages(); 2384bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch if (mShouldShowErrorConsole) { 2385bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch errorConsole.showConsole(ErrorConsoleView.SHOW_NONE); 2386bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 2387bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 2388bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 23890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Call updateIcon instead of setFavicon so the bookmark 23900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // database can be updated. 23913918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott updateIcon(view, favicon); 23920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 23934d7880fe3061ed691d220e64cd9e54a8c7b2d1bfGrace Kloba if (mSettings.isTracing()) { 23940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String host; 23950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 23960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebAddress uri = new WebAddress(url); 23970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project host = uri.mHost; 23980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (android.net.ParseException ex) { 23994d7880fe3061ed691d220e64cd9e54a8c7b2d1bfGrace Kloba host = "browser"; 24000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project host = host.replace('.', '_'); 24024d7880fe3061ed691d220e64cd9e54a8c7b2d1bfGrace Kloba host += ".trace"; 24030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mInTrace = true; 24044d7880fe3061ed691d220e64cd9e54a8c7b2d1bfGrace Kloba Debug.startMethodTracing(host, 20 * 1024 * 1024); 24050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 24070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Performance probe 24080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (false) { 24090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mStart = SystemClock.uptimeMillis(); 24100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mProcessStart = Process.getElapsedCpuTime(); 24110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project long[] sysCpu = new long[7]; 24120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (Process.readProcFile("/proc/stat", SYSTEM_CPU_FORMAT, null, 24130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sysCpu, null)) { 24140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mUserStart = sysCpu[0] + sysCpu[1]; 24150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSystemStart = sysCpu[2]; 24160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mIdleStart = sysCpu[3]; 24170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mIrqStart = sysCpu[4] + sysCpu[5] + sysCpu[6]; 24180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mUiStart = SystemClock.currentThreadTimeMillis(); 24200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 24220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!mPageStarted) { 24230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageStarted = true; 24247bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed // if onResume() has been called, resumeWebViewTimers() does 24257bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed // nothing. 24267bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed resumeWebViewTimers(); 24270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 24290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // reset sync timer to avoid sync starts during loading a page 24300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project CookieSyncManager.getInstance().resetSync(); 24310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 24320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mInLoad = true; 2433a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins WebView currentWebView = mTabControl.getCurrentWebView(); 2434a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins if (currentWebView == null || currentWebView.getScrollY() != 0) { 2435a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins // This page has begun to load, so show the title bar 2436a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins showFakeTitleBar(); 2437a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins } 24380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project updateInLoadMenuItems(); 24390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!mIsNetworkUp) { 24400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if ( mAlertDialog == null) { 24410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mAlertDialog = new AlertDialog.Builder(BrowserActivity.this) 24420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.loadSuspendedTitle) 24430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setMessage(R.string.loadSuspended) 24440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, null) 24450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 24460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (view != null) { 24480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project view.setNetworkAvailable(false); 24490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 24530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 24540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onPageFinished(WebView view, String url) { 24550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Reset the title and icon in case we stopped a provisional 24560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // load. 24570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleAndIcon(view); 24580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 24590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Update the lock icon image only once we are done loading 24603bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins updateLockIconToLatest(); 246189c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins updateScreenshot(view); 2462b6b7f9ef3b4ed220063f555d8b7c205210a61a04Leon Scroggins 24630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Performance probe 2464cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project if (false) { 24650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project long[] sysCpu = new long[7]; 24660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (Process.readProcFile("/proc/stat", SYSTEM_CPU_FORMAT, null, 24670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sysCpu, null)) { 24680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String uiInfo = "UI thread used " 24690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + (SystemClock.currentThreadTimeMillis() - mUiStart) 24700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + " ms"; 247131a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGD_ENABLED) { 24720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.d(LOGTAG, uiInfo); 24730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //The string that gets written to the log 24750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String performanceString = "It took total " 24760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + (SystemClock.uptimeMillis() - mStart) 24770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + " ms clock time to load the page." 24780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + "\nbrowser process used " 24790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + (Process.getElapsedCpuTime() - mProcessStart) 24800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + " ms, user processes used " 24810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + (sysCpu[0] + sysCpu[1] - mUserStart) * 10 24820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + " ms, kernel used " 24830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + (sysCpu[2] - mSystemStart) * 10 24840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + " ms, idle took " + (sysCpu[3] - mIdleStart) * 10 24850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + " ms and irq took " 24860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + (sysCpu[4] + sysCpu[5] + sysCpu[6] - mIrqStart) 24870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 10 + " ms, " + uiInfo; 248831a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGD_ENABLED) { 24890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.d(LOGTAG, performanceString + "\nWebpage: " + url); 24900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null) { 24920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // strip the url to maintain consistency 24930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String newUrl = new String(url); 24940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (newUrl.startsWith("http://www.")) { 24950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project newUrl = newUrl.substring(11); 24960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (newUrl.startsWith("http://")) { 24970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project newUrl = newUrl.substring(7); 24980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (newUrl.startsWith("https://www.")) { 24990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project newUrl = newUrl.substring(12); 25000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (newUrl.startsWith("https://")) { 25010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project newUrl = newUrl.substring(8); 25020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 250331a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGD_ENABLED) { 25040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.d(LOGTAG, newUrl + " loaded"); 25050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* 25070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (sWhiteList.contains(newUrl)) { 25080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // The string that gets pushed to the statistcs 25090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // service 25100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project performanceString = performanceString 25110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + "\nWebpage: " 25120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + newUrl 25130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + "\nCarrier: " 25140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + android.os.SystemProperties 25150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .get("gsm.sim.operator.alpha"); 25160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mWebView != null 25170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project && mWebView.getContext() != null 25180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project && mWebView.getContext().getSystemService( 25190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Context.CONNECTIVITY_SERVICE) != null) { 25200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ConnectivityManager cManager = 25210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (ConnectivityManager) mWebView 25220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .getContext().getSystemService( 25230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Context.CONNECTIVITY_SERVICE); 25240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project NetworkInfo nInfo = cManager 25250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .getActiveNetworkInfo(); 25260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (nInfo != null) { 25270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project performanceString = performanceString 25280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + "\nNetwork Type: " 25290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + nInfo.getType().toString(); 25300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Checkin.logEvent(mResolver, 25330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Checkin.Events.Tag.WEBPAGE_LOAD, 25340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project performanceString); 25350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.w(LOGTAG, "pushed to the statistics service"); 25360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 25380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 25420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mInTrace) { 25430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mInTrace = false; 25440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Debug.stopMethodTracing(); 25450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 25470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mPageStarted) { 25480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageStarted = false; 25497bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed // pauseWebViewTimers() will do nothing and return false if 25507bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed // onPause() is not called yet. 25517bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed if (pauseWebViewTimers()) { 25520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mWakeLock.isHeld()) { 25530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.removeMessages(RELEASE_WAKELOCK); 25540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWakeLock.release(); 25550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 25600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // return true if want to hijack the url to let another app to handle it 25610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 25620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean shouldOverrideUrlLoading(WebView view, String url) { 25630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url.startsWith(SCHEME_WTAI)) { 25640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // wtai://wp/mc;number 25650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // number=string(phone-number) 25660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url.startsWith(SCHEME_WTAI_MC)) { 25670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent = new Intent(Intent.ACTION_VIEW, 25680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Uri.parse(WebView.SCHEME_TEL + 25690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url.substring(SCHEME_WTAI_MC.length()))); 25700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project startActivity(intent); 25710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 25720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // wtai://wp/sd;dtmf 25740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // dtmf=string(dialstring) 25750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url.startsWith(SCHEME_WTAI_SD)) { 25760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // TODO 25770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // only send when there is active voice connection 25780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 25790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // wtai://wp/ap;number;name 25810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // number=string(phone-number) 25820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // name=string 25830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url.startsWith(SCHEME_WTAI_AP)) { 25840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // TODO 25850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 25860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 25899918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn // The "about:" schemes are internal to the browser; don't 25909918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn // want these to be dispatched to other apps. 25919918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn if (url.startsWith("about:")) { 25929918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn return false; 25939918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn } 2594bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 25959918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn Intent intent; 2596bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 25979918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn // perform generic parsing of the URI to turn it into an Intent. 25980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 25999918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME); 26009918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn } catch (URISyntaxException ex) { 26019918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn Log.w("Browser", "Bad URI " + url + ": " + ex.getMessage()); 26020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 26030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 26055b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba // check whether the intent can be resolved. If not, we will see 26065b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba // whether we can download it from the Market. 26075b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba if (getPackageManager().resolveActivity(intent, 0) == null) { 26085b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba String packagename = intent.getPackage(); 26095b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba if (packagename != null) { 26105b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba intent = new Intent(Intent.ACTION_VIEW, Uri 26115b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba .parse("market://search?q=pname:" + packagename)); 26125b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba intent.addCategory(Intent.CATEGORY_BROWSABLE); 26135b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba startActivity(intent); 26145b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba return true; 26155b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba } else { 26165b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba return false; 26175b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba } 26185b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba } 26195b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba 26209918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn // sanitize the Intent, ensuring web pages can not bypass browser 26219918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn // security (only access to BROWSABLE activities). 26220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.addCategory(Intent.CATEGORY_BROWSABLE); 26239918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn intent.setComponent(null); 26240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 26250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (startActivityIfNeeded(intent, -1)) { 26260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 26270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (ActivityNotFoundException ex) { 26290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // ignore the error. If no application can handle the URL, 26300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // eg about:blank, assume the browser can handle it. 26310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 26330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mMenuIsDown) { 26340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project openTab(url); 26350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project closeOptionsMenu(); 26360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 26370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 26390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 26400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 26420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 26430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Updates the lock icon. This method is called when we discover another 26440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * resource to be loaded for this page (for example, javascript). While 26450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * we update the icon type, we do not update the lock icon itself until 26460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * we are done loading, it is slightly more secure this way. 26470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 26480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 26490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onLoadResource(WebView view, String url) { 26500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null && url.length() > 0) { 26510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // It is only if the page claims to be secure 26520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // that we may have to update the lock: 26530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mLockIconType == LOCK_ICON_SECURE) { 26540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If NOT a 'safe' url, change the lock to mixed content! 26550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!(URLUtil.isHttpsUrl(url) || URLUtil.isDataUrl(url) || URLUtil.isAboutUrl(url))) { 26560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mLockIconType = LOCK_ICON_MIXED; 265731a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 26580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, "BrowserActivity.updateLockIcon:" + 26590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project " updated lock icon to " + mLockIconType + " due to " + url); 26600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 26660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 26670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Show the dialog, asking the user if they would like to continue after 26680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * an excessive number of HTTP redirects. 26690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 26700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 26710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onTooManyRedirects(WebView view, final Message cancelMsg, 26720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Message continueMsg) { 26730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(BrowserActivity.this) 26740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.browserFrameRedirect) 26750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setMessage(R.string.browserFrame307Post) 26760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 26770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, int which) { 26780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project continueMsg.sendToTarget(); 26790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 26800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 26810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, int which) { 26820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project cancelMsg.sendToTarget(); 26830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 26840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setOnCancelListener(new OnCancelListener() { 26850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCancel(DialogInterface dialog) { 26860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project cancelMsg.sendToTarget(); 26870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 26880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 26890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 269137911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott // Container class for the next error dialog that needs to be 269237911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott // displayed. 269337911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott class ErrorDialog { 269437911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott public final int mTitle; 269537911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott public final String mDescription; 269637911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott public final int mError; 269737911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott ErrorDialog(int title, String desc, int error) { 269837911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott mTitle = title; 269937911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott mDescription = desc; 270037911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott mError = error; 270137911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott } 270237911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott }; 270337911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott 270437911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott private void processNextError() { 270537911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott if (mQueuedErrors == null) { 270637911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott return; 270737911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott } 270837911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott // The first one is currently displayed so just remove it. 270937911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott mQueuedErrors.removeFirst(); 271037911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott if (mQueuedErrors.size() == 0) { 271137911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott mQueuedErrors = null; 271237911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott return; 271337911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott } 271437911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott showError(mQueuedErrors.getFirst()); 271537911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott } 271637911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott 271737911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott private DialogInterface.OnDismissListener mDialogListener = 271837911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott new DialogInterface.OnDismissListener() { 271937911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott public void onDismiss(DialogInterface d) { 272037911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott processNextError(); 272137911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott } 272237911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott }; 272337911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott private LinkedList<ErrorDialog> mQueuedErrors; 272437911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott 272537911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott private void queueError(int err, String desc) { 272637911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott if (mQueuedErrors == null) { 272737911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott mQueuedErrors = new LinkedList<ErrorDialog>(); 272837911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott } 272937911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott for (ErrorDialog d : mQueuedErrors) { 273037911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott if (d.mError == err) { 273137911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott // Already saw a similar error, ignore the new one. 273237911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott return; 273337911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott } 273437911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott } 273537911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott ErrorDialog errDialog = new ErrorDialog( 27365d61a6c4dfb1f6e7b811f33c2a9bbe09b955293bPatrick Scott err == WebViewClient.ERROR_FILE_NOT_FOUND ? 273737911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott R.string.browserFrameFileErrorLabel : 273837911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott R.string.browserFrameNetworkErrorLabel, 273937911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott desc, err); 274037911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott mQueuedErrors.addLast(errDialog); 274137911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott 274237911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott // Show the dialog now if the queue was empty. 274337911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott if (mQueuedErrors.size() == 1) { 274437911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott showError(errDialog); 274537911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott } 274637911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott } 274737911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott 274837911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott private void showError(ErrorDialog errDialog) { 274937911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott AlertDialog d = new AlertDialog.Builder(BrowserActivity.this) 275037911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott .setTitle(errDialog.mTitle) 275137911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott .setMessage(errDialog.mDescription) 275237911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott .setPositiveButton(R.string.ok, null) 275337911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott .create(); 275437911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott d.setOnDismissListener(mDialogListener); 275537911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott d.show(); 275637911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott } 275737911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott 27580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 27590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Show a dialog informing the user of the network error reported by 27600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * WebCore. 27610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 27620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 27630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onReceivedError(WebView view, int errorCode, 27640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String description, String failingUrl) { 27655d61a6c4dfb1f6e7b811f33c2a9bbe09b955293bPatrick Scott if (errorCode != WebViewClient.ERROR_HOST_LOOKUP && 27665d61a6c4dfb1f6e7b811f33c2a9bbe09b955293bPatrick Scott errorCode != WebViewClient.ERROR_CONNECT && 27675d61a6c4dfb1f6e7b811f33c2a9bbe09b955293bPatrick Scott errorCode != WebViewClient.ERROR_BAD_URL && 27685d61a6c4dfb1f6e7b811f33c2a9bbe09b955293bPatrick Scott errorCode != WebViewClient.ERROR_UNSUPPORTED_SCHEME && 27695d61a6c4dfb1f6e7b811f33c2a9bbe09b955293bPatrick Scott errorCode != WebViewClient.ERROR_FILE) { 277037911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott queueError(errorCode, description); 27710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 277237911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott Log.e(LOGTAG, "onReceivedError " + errorCode + " " + failingUrl 277337911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott + " " + description); 27740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 27750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // We need to reset the title after an error. 27760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleAndRevertLockIcon(); 27770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 27790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 27800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Check with the user if it is ok to resend POST data as the page they 27810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * are trying to navigate to is the result of a POST. 27820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 27830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 27840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onFormResubmission(WebView view, final Message dontResend, 27850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Message resend) { 27860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(BrowserActivity.this) 27870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.browserFrameFormResubmitLabel) 27880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setMessage(R.string.browserFrameFormResubmitMessage) 27890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 27900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, int which) { 27910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resend.sendToTarget(); 27920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 27930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 27940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, int which) { 27950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dontResend.sendToTarget(); 27960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 27970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setOnCancelListener(new OnCancelListener() { 27980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCancel(DialogInterface dialog) { 27990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dontResend.sendToTarget(); 28000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 28010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 28020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 28040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 28050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Insert the url into the visited history database. 28060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param url The url to be inserted. 28070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param isReload True if this url is being reloaded. 28080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * FIXME: Not sure what to do when reloading the page. 28090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 28100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 28110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void doUpdateVisitedHistory(WebView view, String url, 28120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean isReload) { 28130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url.regionMatches(true, 0, "about:", 0, 6)) { 28140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 28150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28166b52a55ecd3b91ca31a0d7111f87a5d7937f215bGrace Kloba // remove "client" before updating it to the history so that it wont 28176b52a55ecd3b91ca31a0d7111f87a5d7937f215bGrace Kloba // show up in the auto-complete list. 28186b52a55ecd3b91ca31a0d7111f87a5d7937f215bGrace Kloba int index = url.indexOf("client=ms-"); 28196b52a55ecd3b91ca31a0d7111f87a5d7937f215bGrace Kloba if (index > 0 && url.contains(".google.")) { 28206b52a55ecd3b91ca31a0d7111f87a5d7937f215bGrace Kloba int end = url.indexOf('&', index); 28216b52a55ecd3b91ca31a0d7111f87a5d7937f215bGrace Kloba if (end > 0) { 28226b52a55ecd3b91ca31a0d7111f87a5d7937f215bGrace Kloba url = url.substring(0, index-1).concat(url.substring(end)); 28236b52a55ecd3b91ca31a0d7111f87a5d7937f215bGrace Kloba } else { 28246b52a55ecd3b91ca31a0d7111f87a5d7937f215bGrace Kloba url = url.substring(0, index-1); 28256b52a55ecd3b91ca31a0d7111f87a5d7937f215bGrace Kloba } 28266b52a55ecd3b91ca31a0d7111f87a5d7937f215bGrace Kloba } 28270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Browser.updateVisitedHistory(mResolver, url, true); 28280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebIconDatabase.getInstance().retainIconForPageUrl(url); 28290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 28310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 28320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Displays SSL error(s) dialog to the user. 28330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 28340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 28350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onReceivedSslError( 28360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView view, final SslErrorHandler handler, final SslError error) { 28370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 28380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mSettings.showSecurityWarnings()) { 28390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final LayoutInflater factory = 28400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LayoutInflater.from(BrowserActivity.this); 28410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final View warningsView = 28420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project factory.inflate(R.layout.ssl_warnings, null); 28430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final LinearLayout placeholder = 28440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (LinearLayout)warningsView.findViewById(R.id.placeholder); 28450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 28460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_UNTRUSTED)) { 28470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 28480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, null); 28490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 28500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_untrusted); 28510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project placeholder.addView(ll); 28520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 28540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_IDMISMATCH)) { 28550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 28560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, null); 28570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 28580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_mismatch); 28590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project placeholder.addView(ll); 28600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 28620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_EXPIRED)) { 28630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 28640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, null); 28650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 28660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_expired); 28670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project placeholder.addView(ll); 28680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 28700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_NOTYETVALID)) { 28710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 28720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, null); 28730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 28740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_not_yet_valid); 28750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project placeholder.addView(ll); 28760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 28780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(BrowserActivity.this) 28790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.security_warning) 28800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setIcon(android.R.drawable.ic_dialog_alert) 28810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setView(warningsView) 28820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ssl_continue, 28830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 28840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, int whichButton) { 28850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.proceed(); 28860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 28880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setNeutralButton(R.string.view_certificate, 28890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 28900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, int whichButton) { 28910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificateOnError(view, handler, error); 28920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 28940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setNegativeButton(R.string.cancel, 28950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 28960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, int whichButton) { 28970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.cancel(); 28980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserActivity.this.resetTitleAndRevertLockIcon(); 28990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 29010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setOnCancelListener( 29020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnCancelListener() { 29030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCancel(DialogInterface dialog) { 29040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.cancel(); 29050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserActivity.this.resetTitleAndRevertLockIcon(); 29060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 29080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 29090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 29100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.proceed(); 29110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 29150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Handles an HTTP authentication request. 29160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 29170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param handler The authentication handler 29180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param host The host 29190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param realm The realm 29200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 29210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 29220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onReceivedHttpAuthRequest(WebView view, 29230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final HttpAuthHandler handler, final String host, final String realm) { 29240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String username = null; 29250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String password = null; 29260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean reuseHttpAuthUsernamePassword = 29280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.useHttpAuthUsernamePassword(); 29290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (reuseHttpAuthUsernamePassword && 29310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (mTabControl.getCurrentWebView() != null)) { 29320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String[] credentials = 29330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.getCurrentWebView() 29340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .getHttpAuthUsernamePassword(host, realm); 29350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (credentials != null && credentials.length == 2) { 29360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project username = credentials[0]; 29370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project password = credentials[1]; 29380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (username != null && password != null) { 29420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.proceed(username, password); 29430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 29440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showHttpAuthentication(handler, host, realm, null, null, null, 0); 29450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 29490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) { 29500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mMenuIsDown) { 29510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // only check shortcut key when MENU is held 29520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return getWindow().isShortcutKey(event.getKeyCode(), event); 29530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 29540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 29550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 29590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onUnhandledKeyEvent(WebView view, KeyEvent event) { 29600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (view != mTabControl.getCurrentTopWebView()) { 29610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 29620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (event.isDown()) { 29640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserActivity.this.onKeyDown(event.getKeyCode(), event); 29650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 29660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserActivity.this.onKeyUp(event.getKeyCode(), event); 29670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 29700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //-------------------------------------------------------------------------- 29720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // WebChromeClient implementation 29730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //-------------------------------------------------------------------------- 29740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ WebChromeClient getWebChromeClient() { 29760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return mWebChromeClient; 29770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final WebChromeClient mWebChromeClient = new WebChromeClient() { 29800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Helper method to create a new tab or sub window. 29810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void createWindow(final boolean dialog, final Message msg) { 29820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (dialog) { 29830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.createSubWindow(); 29840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final TabControl.Tab t = mTabControl.getCurrentTab(); 29850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project attachSubWindow(t); 29860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView.WebViewTransport transport = 29870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (WebView.WebViewTransport) msg.obj; 29880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project transport.setWebView(t.getSubWebView()); 29890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project msg.sendToTarget(); 29900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 29910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final TabControl.Tab parent = mTabControl.getCurrentTab(); 29921f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins final TabControl.Tab newTab 29931f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins = openTabAndShow(EMPTY_URL_DATA, false, null); 2994c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba if (newTab != parent) { 2995c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba parent.addChildTab(newTab); 2996c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba } 29970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView.WebViewTransport transport = 29980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (WebView.WebViewTransport) msg.obj; 29990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project transport.setWebView(mTabControl.getCurrentWebView()); 30001f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins msg.sendToTarget(); 30010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 30040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 30050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onCreateWindow(WebView view, final boolean dialog, 30060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final boolean userGesture, final Message resultMsg) { 30070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Short-circuit if we can't create any more tabs or sub windows. 30080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (dialog && mTabControl.getCurrentSubWindow() != null) { 30090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(BrowserActivity.this) 30100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.too_many_subwindows_dialog_title) 30110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setIcon(android.R.drawable.ic_dialog_alert) 30120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setMessage(R.string.too_many_subwindows_dialog_message) 30130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, null) 30140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 30150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 30160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (mTabControl.getTabCount() >= TabControl.MAX_TABS) { 30170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(BrowserActivity.this) 30180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.too_many_windows_dialog_title) 30190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setIcon(android.R.drawable.ic_dialog_alert) 30200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setMessage(R.string.too_many_windows_dialog_message) 30210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, null) 30220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 30230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 30240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 30260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Short-circuit if this was a user gesture. 30270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (userGesture) { 30280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project createWindow(dialog, resultMsg); 30290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 30300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 30320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Allow the popup and create the appropriate window. 30330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final AlertDialog.OnClickListener allowListener = 30340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.OnClickListener() { 30350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface d, 30360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int which) { 30370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project createWindow(dialog, resultMsg); 30380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 30400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 30410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Block the popup by returning a null WebView. 30420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final AlertDialog.OnClickListener blockListener = 30430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.OnClickListener() { 30440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface d, int which) { 30450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resultMsg.sendToTarget(); 30460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 30480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 30490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Build a confirmation dialog to display to the user. 30500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final AlertDialog d = 30510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(BrowserActivity.this) 30520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.attention) 30530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setIcon(android.R.drawable.ic_dialog_alert) 30540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setMessage(R.string.popup_window_attempt) 30550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.allow, allowListener) 30560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setNegativeButton(R.string.block, blockListener) 30570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setCancelable(false) 30580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .create(); 30590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 30600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Show the confirmation dialog. 30610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project d.show(); 30620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 30630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 30650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 30660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCloseWindow(WebView window) { 30671f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins final TabControl.Tab current = mTabControl.getCurrentTab(); 30681f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins final TabControl.Tab parent = current.getParentTab(); 30690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (parent != null) { 30700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // JavaScript can only close popup window. 30711f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins switchToTab(mTabControl.getTabIndex(parent)); 30721f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // Now we need to close the window 30731f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins closeTab(current); 30740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 30770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 30780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onProgressChanged(WebView view, int newProgress) { 30793bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mTitleBar.setProgress(newProgress, view); 30803bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins if (mFakeTitleBar != null) { 30813bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mFakeTitleBar.setProgress(newProgress); 30820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 30840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (newProgress == 100) { 30850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // onProgressChanged() is called for sub-frame too while 30860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // onPageFinished() is only called for the main frame. sync 30870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // cookie and cache promptly here. 30880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project CookieSyncManager.getInstance().sync(); 3089cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project if (mInLoad) { 3090cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project mInLoad = false; 3091cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project updateInLoadMenuItems(); 3092a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins // If the options menu is open, leave the title bar 3093a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins if (!mOptionsMenuOpen || !mIconView) { 3094a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins hideFakeTitleBar(); 3095a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins } 3096cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project } 3097a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins } else if (!mInLoad) { 3098cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project // onPageFinished may have already been called but a subframe 3099cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project // is still loading and updating the progress. Reset mInLoad 3100cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project // and update the menu items. 3101a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins mInLoad = true; 3102a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins updateInLoadMenuItems(); 3103a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins WebView currentWebView = mTabControl.getCurrentWebView(); 3104a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins if ((currentWebView == null || currentWebView.getScrollY() != 0) 3105a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins && (!mOptionsMenuOpen || mIconView)) { 3106a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins // This page has begun to load, so show the title bar 3107a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins showFakeTitleBar(); 3108cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project } 31090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 31130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onReceivedTitle(WebView view, String title) { 3114598c9ccf8641e0e4563bba2fd5613bcb4de766ecPatrick Scott String url = view.getUrl(); 31150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // here, if url is null, we want to reset the title 31171f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins setUrlTitle(url, title, view); 31180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url == null || 31200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url.length() >= SQLiteDatabase.SQLITE_MAX_LIKE_PATTERN_LENGTH) { 31210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 31220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3123fce182bff7713a12714018327f6da9500011ab17Leon Scroggins // See if we can find the current url in our history database and 3124fce182bff7713a12714018327f6da9500011ab17Leon Scroggins // add the new title to it. 31250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url.startsWith("http://www.")) { 31260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = url.substring(11); 31270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (url.startsWith("http://")) { 31280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = url.substring(4); 31290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 31310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = "%" + url; 31320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String [] selArgs = new String[] { url }; 31330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String where = Browser.BookmarkColumns.URL + " LIKE ? AND " 31350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + Browser.BookmarkColumns.BOOKMARK + " = 0"; 31360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Cursor c = mResolver.query(Browser.BOOKMARKS_URI, 31370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Browser.HISTORY_PROJECTION, where, selArgs, null); 31380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (c.moveToFirst()) { 31390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Current implementation of database only has one entry per 31400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // url. 3141fce182bff7713a12714018327f6da9500011ab17Leon Scroggins ContentValues map = new ContentValues(); 3142fce182bff7713a12714018327f6da9500011ab17Leon Scroggins map.put(Browser.BookmarkColumns.TITLE, title); 3143fce182bff7713a12714018327f6da9500011ab17Leon Scroggins mResolver.update(Browser.BOOKMARKS_URI, map, 3144fce182bff7713a12714018327f6da9500011ab17Leon Scroggins "_id = " + c.getInt(0), null); 31450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project c.close(); 31470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (IllegalStateException e) { 31480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(LOGTAG, "BrowserActivity onReceived title", e); 31490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (SQLiteException ex) { 31500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(LOGTAG, "onReceivedTitle() caught SQLiteException: ", ex); 31510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 31550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onReceivedIcon(WebView view, Bitmap icon) { 31563918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott updateIcon(view, icon); 31573918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 31583918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 31593918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott @Override 31603918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott public void onReceivedTouchIconUrl(WebView view, String url) { 31613918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott final ContentResolver cr = getContentResolver(); 31623918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott final Cursor c = 31633918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott BrowserBookmarksAdapter.queryBookmarksForUrl(cr, 3164a5d669e4c08f0e64387c2c539c41a26ac8c845abLeon Scroggins view.getOriginalUrl(), view.getUrl(), true); 31653918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott if (c != null) { 31663918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott if (c.getCount() > 0) { 31673918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott new DownloadTouchIcon(cr, c, view).execute(url); 31683918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } else { 31693918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott c.close(); 31703918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 31713918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 31720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3173092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdoch 3174adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu @Override 3175c9b5556351b59caec77b4eec1ad30652fec6a4d9Andrei Popescu public void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback) { 3176adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu if (mCustomView != null) 3177adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu return; 3178adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu 3179adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu // Add the custom view to its container. 3180adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu mCustomViewContainer.addView(view, COVER_SCREEN_GRAVITY_CENTER); 3181adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu mCustomView = view; 3182c9b5556351b59caec77b4eec1ad30652fec6a4d9Andrei Popescu mCustomViewCallback = callback; 3183adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu // Save the menu state and set it to empty while the custom 3184adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu // view is showing. 3185adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu mOldMenuState = mMenuState; 3186adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu mMenuState = EMPTY_MENU; 3187c9b5556351b59caec77b4eec1ad30652fec6a4d9Andrei Popescu // Hide the content view. 3188c9b5556351b59caec77b4eec1ad30652fec6a4d9Andrei Popescu mContentView.setVisibility(View.GONE); 3189adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu // Finally show the custom view container. 3190c9b5556351b59caec77b4eec1ad30652fec6a4d9Andrei Popescu mCustomViewContainer.setVisibility(View.VISIBLE); 3191c9b5556351b59caec77b4eec1ad30652fec6a4d9Andrei Popescu mCustomViewContainer.bringToFront(); 3192adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu } 3193adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu 3194adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu @Override 3195adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu public void onHideCustomView() { 3196adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu if (mCustomView == null) 3197adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu return; 3198adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu 3199c9b5556351b59caec77b4eec1ad30652fec6a4d9Andrei Popescu // Hide the custom view. 3200c9b5556351b59caec77b4eec1ad30652fec6a4d9Andrei Popescu mCustomView.setVisibility(View.GONE); 3201adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu // Remove the custom view from its container. 3202adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu mCustomViewContainer.removeView(mCustomView); 3203adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu mCustomView = null; 3204adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu // Reset the old menu state. 3205adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu mMenuState = mOldMenuState; 3206adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu mOldMenuState = EMPTY_MENU; 3207adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu mCustomViewContainer.setVisibility(View.GONE); 3208c9b5556351b59caec77b4eec1ad30652fec6a4d9Andrei Popescu mCustomViewCallback.onCustomViewHidden(); 3209c9b5556351b59caec77b4eec1ad30652fec6a4d9Andrei Popescu // Show the content view. 3210c9b5556351b59caec77b4eec1ad30652fec6a4d9Andrei Popescu mContentView.setVisibility(View.VISIBLE); 3211adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu } 3212adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu 3213092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdoch /** 321479e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu * The origin has exceeded its database quota. 3215092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdoch * @param url the URL that exceeded the quota 3216092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdoch * @param databaseIdentifier the identifier of the database on 3217092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdoch * which the transaction that caused the quota overflow was run 3218092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdoch * @param currentQuota the current quota for the origin. 321925a1523642bead2f7e7f929ba9d6d1143dce06a0Ben Murdoch * @param estimatedSize the estimated size of the database. 322079e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu * @param totalUsedQuota is the sum of all origins' quota. 3221092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdoch * @param quotaUpdater The callback to run when a decision to allow or 3222092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdoch * deny quota has been made. Don't forget to call this! 3223092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdoch */ 3224092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdoch @Override 3225092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdoch public void onExceededDatabaseQuota(String url, 322625a1523642bead2f7e7f929ba9d6d1143dce06a0Ben Murdoch String databaseIdentifier, long currentQuota, long estimatedSize, 322725a1523642bead2f7e7f929ba9d6d1143dce06a0Ben Murdoch long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater) { 322879e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu mSettings.getWebStorageSizeManager().onExceededDatabaseQuota( 322925a1523642bead2f7e7f929ba9d6d1143dce06a0Ben Murdoch url, databaseIdentifier, currentQuota, estimatedSize, 323025a1523642bead2f7e7f929ba9d6d1143dce06a0Ben Murdoch totalUsedQuota, quotaUpdater); 323179e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu } 323279e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu 323379e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu /** 323479e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu * The Application Cache has exceeded its max size. 323579e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu * @param spaceNeeded is the amount of disk space that would be needed 323679e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu * in order for the last appcache operation to succeed. 323779e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu * @param totalUsedQuota is the sum of all origins' quota. 323879e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu * @param quotaUpdater A callback to inform the WebCore thread that a new 323979e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu * app cache size is available. This callback must always be executed at 324079e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu * some point to ensure that the sleeping WebCore thread is woken up. 324179e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu */ 324279e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu @Override 324379e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu public void onReachedMaxAppCacheSize(long spaceNeeded, 324479e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater) { 324579e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu mSettings.getWebStorageSizeManager().onReachedMaxAppCacheSize( 324679e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu spaceNeeded, totalUsedQuota, quotaUpdater); 3247092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdoch } 32487db26347577132b8c4def47ccd410e7b9d0821bbBen Murdoch 32492bc69918d97a767a02132090e58718077381ba1aSteve Block /** 32502bc69918d97a767a02132090e58718077381ba1aSteve Block * Instructs the browser to show a prompt to ask the user to set the 32512bc69918d97a767a02132090e58718077381ba1aSteve Block * Geolocation permission state for the specified origin. 32522bc69918d97a767a02132090e58718077381ba1aSteve Block * @param origin The origin for which Geolocation permissions are 32532bc69918d97a767a02132090e58718077381ba1aSteve Block * requested. 32542bc69918d97a767a02132090e58718077381ba1aSteve Block * @param callback The callback to call once the user has set the 32552bc69918d97a767a02132090e58718077381ba1aSteve Block * Geolocation permission state. 32562bc69918d97a767a02132090e58718077381ba1aSteve Block */ 32572bc69918d97a767a02132090e58718077381ba1aSteve Block @Override 32582bc69918d97a767a02132090e58718077381ba1aSteve Block public void onGeolocationPermissionsShowPrompt(String origin, 32592bc69918d97a767a02132090e58718077381ba1aSteve Block GeolocationPermissions.Callback callback) { 32602bc69918d97a767a02132090e58718077381ba1aSteve Block mTabControl.getCurrentTab().getGeolocationPermissionsPrompt().show( 32612bc69918d97a767a02132090e58718077381ba1aSteve Block origin, callback); 32622bc69918d97a767a02132090e58718077381ba1aSteve Block } 32632bc69918d97a767a02132090e58718077381ba1aSteve Block 32642bc69918d97a767a02132090e58718077381ba1aSteve Block /** 32652bc69918d97a767a02132090e58718077381ba1aSteve Block * Instructs the browser to hide the Geolocation permissions prompt. 32662bc69918d97a767a02132090e58718077381ba1aSteve Block */ 32672bc69918d97a767a02132090e58718077381ba1aSteve Block @Override 32682bc69918d97a767a02132090e58718077381ba1aSteve Block public void onGeolocationPermissionsHidePrompt() { 32692bc69918d97a767a02132090e58718077381ba1aSteve Block mTabControl.getCurrentTab().getGeolocationPermissionsPrompt().hide(); 32702bc69918d97a767a02132090e58718077381ba1aSteve Block } 32712bc69918d97a767a02132090e58718077381ba1aSteve Block 32727db26347577132b8c4def47ccd410e7b9d0821bbBen Murdoch /* Adds a JavaScript error message to the system log. 32737db26347577132b8c4def47ccd410e7b9d0821bbBen Murdoch * @param message The error message to report. 32747db26347577132b8c4def47ccd410e7b9d0821bbBen Murdoch * @param lineNumber The line number of the error. 32757db26347577132b8c4def47ccd410e7b9d0821bbBen Murdoch * @param sourceID The name of the source file that caused the error. 32767db26347577132b8c4def47ccd410e7b9d0821bbBen Murdoch */ 32777db26347577132b8c4def47ccd410e7b9d0821bbBen Murdoch @Override 32787db26347577132b8c4def47ccd410e7b9d0821bbBen Murdoch public void addMessageToConsole(String message, int lineNumber, String sourceID) { 3279bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch ErrorConsoleView errorConsole = mTabControl.getCurrentErrorConsole(true); 3280bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch errorConsole.addErrorMessage(message, sourceID, lineNumber); 3281bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch if (mShouldShowErrorConsole && 3282bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch errorConsole.getShowState() != ErrorConsoleView.SHOW_MAXIMIZED) { 3283bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch errorConsole.showConsole(ErrorConsoleView.SHOW_MINIMIZED); 3284bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 3285bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch Log.w(LOGTAG, "Console: " + message + " " + sourceID + ":" + lineNumber); 32867db26347577132b8c4def47ccd410e7b9d0821bbBen Murdoch } 32870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 32880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 32900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Notify the host application a download should be done, or that 32910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * the data should be streamed if a streaming viewer is available. 32920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param url The full url to the content that should be downloaded 32930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param contentDisposition Content-disposition http header, if 32940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * present. 32950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param mimetype The mimetype of the content reported by the server 32960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param contentLength The file size reported by the server 32970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 32980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onDownloadStart(String url, String userAgent, 32990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String contentDisposition, String mimetype, long contentLength) { 33000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we're dealing wih A/V content that's not explicitly marked 33010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // for download, check if it's streamable. 33020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (contentDisposition == null 3303e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott || !contentDisposition.regionMatches( 3304e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott true, 0, "attachment", 0, 10)) { 33050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // query the package manager to see if there's a registered handler 33060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // that matches. 33070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent = new Intent(Intent.ACTION_VIEW); 33080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.setDataAndType(Uri.parse(url), mimetype); 3309e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott ResolveInfo info = getPackageManager().resolveActivity(intent, 3310e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott PackageManager.MATCH_DEFAULT_ONLY); 3311e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott if (info != null) { 3312e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott ComponentName myName = getComponentName(); 3313e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott // If we resolved to ourselves, we don't want to attempt to 3314e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott // load the url only to try and download it again. 3315e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott if (!myName.getPackageName().equals( 3316e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott info.activityInfo.packageName) 3317e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott || !myName.getClassName().equals( 3318e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott info.activityInfo.name)) { 3319e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott // someone (other than us) knows how to handle this mime 3320e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott // type with this scheme, don't download. 3321e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott try { 3322e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott startActivity(intent); 3323e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott return; 3324e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott } catch (ActivityNotFoundException ex) { 3325e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott if (LOGD_ENABLED) { 3326e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott Log.d(LOGTAG, "activity not found for " + mimetype 3327e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott + " over " + Uri.parse(url).getScheme(), 3328e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott ex); 3329e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott } 3330e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott // Best behavior is to fall back to a download in this 3331e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott // case 33320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project onDownloadStartNoStream(url, userAgent, contentDisposition, mimetype, contentLength); 33370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 33400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Notify the host application a download should be done, even if there 33410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * is a streaming viewer available for thise type. 33420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param url The full url to the content that should be downloaded 33430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param contentDisposition Content-disposition http header, if 33440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * present. 33450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param mimetype The mimetype of the content reported by the server 33460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param contentLength The file size reported by the server 33470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 33480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /*package */ void onDownloadStartNoStream(String url, String userAgent, 33490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String contentDisposition, String mimetype, long contentLength) { 33500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String filename = URLUtil.guessFileName(url, 33520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project contentDisposition, mimetype); 33530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Check to see if we have an SDCard 33550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String status = Environment.getExternalStorageState(); 33560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!status.equals(Environment.MEDIA_MOUNTED)) { 33570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int title; 33580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String msg; 33590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Check to see if the SDCard is busy, same as the music app 33610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (status.equals(Environment.MEDIA_SHARED)) { 33620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project msg = getString(R.string.download_sdcard_busy_dlg_msg); 33630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = R.string.download_sdcard_busy_dlg_title; 33640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 33650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project msg = getString(R.string.download_no_sdcard_dlg_msg, filename); 33660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = R.string.download_no_sdcard_dlg_title; 33670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(this) 33700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(title) 33710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setIcon(android.R.drawable.ic_dialog_alert) 33720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setMessage(msg) 33730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, null) 33740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 33750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 33760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // java.net.URI is a lot stricter than KURL so we have to undo 33790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // KURL's percent-encoding and redo the encoding using java.net.URI. 33800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project URI uri = null; 33810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 33820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Undo the percent-encoding that KURL may have done. 33830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String newUrl = new String(URLUtil.decode(url.getBytes())); 33840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Parse the url into pieces 33850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebAddress w = new WebAddress(newUrl); 33860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String frag = null; 33870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String query = null; 33880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String path = w.mPath; 33890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Break the path into path, query, and fragment 33900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (path.length() > 0) { 33910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Strip the fragment 33920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int idx = path.lastIndexOf('#'); 33930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (idx != -1) { 33940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project frag = path.substring(idx + 1); 33950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project path = path.substring(0, idx); 33960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project idx = path.lastIndexOf('?'); 33980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (idx != -1) { 33990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project query = path.substring(idx + 1); 34000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project path = path.substring(0, idx); 34010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project uri = new URI(w.mScheme, w.mAuthInfo, w.mHost, w.mPort, path, 34040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project query, frag); 34050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (Exception e) { 34060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(LOGTAG, "Could not parse url for download: " + url, e); 34070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 34080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // XXX: Have to use the old url since the cookies were stored using the 34110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // old percent-encoded url. 34120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String cookies = CookieManager.getInstance().getCookie(url); 34130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ContentValues values = new ContentValues(); 34153dc09b269fe4af164371f7a8268a5554b32c1be2Jean-Baptiste Queru values.put(Downloads.COLUMN_URI, uri.toString()); 34163dc09b269fe4af164371f7a8268a5554b32c1be2Jean-Baptiste Queru values.put(Downloads.COLUMN_COOKIE_DATA, cookies); 34173dc09b269fe4af164371f7a8268a5554b32c1be2Jean-Baptiste Queru values.put(Downloads.COLUMN_USER_AGENT, userAgent); 34183dc09b269fe4af164371f7a8268a5554b32c1be2Jean-Baptiste Queru values.put(Downloads.COLUMN_NOTIFICATION_PACKAGE, 34190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getPackageName()); 34203dc09b269fe4af164371f7a8268a5554b32c1be2Jean-Baptiste Queru values.put(Downloads.COLUMN_NOTIFICATION_CLASS, 34210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserDownloadPage.class.getCanonicalName()); 34223dc09b269fe4af164371f7a8268a5554b32c1be2Jean-Baptiste Queru values.put(Downloads.COLUMN_VISIBILITY, Downloads.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 34233dc09b269fe4af164371f7a8268a5554b32c1be2Jean-Baptiste Queru values.put(Downloads.COLUMN_MIME_TYPE, mimetype); 34243dc09b269fe4af164371f7a8268a5554b32c1be2Jean-Baptiste Queru values.put(Downloads.COLUMN_FILE_NAME_HINT, filename); 34253dc09b269fe4af164371f7a8268a5554b32c1be2Jean-Baptiste Queru values.put(Downloads.COLUMN_DESCRIPTION, uri.getHost()); 34260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (contentLength > 0) { 34273dc09b269fe4af164371f7a8268a5554b32c1be2Jean-Baptiste Queru values.put(Downloads.COLUMN_TOTAL_BYTES, contentLength); 34280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mimetype == null) { 34300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // We must have long pressed on a link or image to download it. We 34310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // are not sure of the mimetype in this case, so do a head request 34320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new FetchUrlMimeType(this).execute(values); 34330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 34340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Uri contentUri = 34350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getContentResolver().insert(Downloads.CONTENT_URI, values); 34360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project viewDownloads(contentUri); 34370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 34420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Resets the lock icon. This method is called when we start a new load and 34430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * know the url to be loaded. 34440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 34450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void resetLockIcon(String url) { 34460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Save the lock-icon state (we revert to it if the load gets cancelled) 34470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project saveLockIcon(); 34480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mLockIconType = LOCK_ICON_UNSECURE; 34500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (URLUtil.isHttpsUrl(url)) { 34510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mLockIconType = LOCK_ICON_SECURE; 345231a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 34530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, "BrowserActivity.resetLockIcon:" + 34540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project " reset lock icon to " + mLockIconType); 34550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project updateLockIconImage(LOCK_ICON_UNSECURE); 34590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 34620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Resets the lock icon. This method is called when the icon needs to be 34630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * reset but we do not know whether we are loading a secure or not secure 34640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * page. 34650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 34660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void resetLockIcon() { 34670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Save the lock-icon state (we revert to it if the load gets cancelled) 34680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project saveLockIcon(); 34690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mLockIconType = LOCK_ICON_UNSECURE; 34710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 347231a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 34730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, "BrowserActivity.resetLockIcon:" + 34740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project " reset lock icon to " + mLockIconType); 34750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project updateLockIconImage(LOCK_ICON_UNSECURE); 34780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 34813bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * Update the lock icon to correspond to our latest state. 34823bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins */ 34833bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins /* package */ void updateLockIconToLatest() { 34843bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins updateLockIconImage(mLockIconType); 34853bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } 34863bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins 34873bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins /** 34880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Updates the lock-icon image in the title-bar. 34890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 34900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void updateLockIconImage(int lockIconType) { 34910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Drawable d = null; 34920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (lockIconType == LOCK_ICON_SECURE) { 34930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project d = mSecLockIcon; 34940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (lockIconType == LOCK_ICON_MIXED) { 34950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project d = mMixLockIcon; 34960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34973bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mTitleBar.setLock(d, getTopWindow()); 34983bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins if (mFakeTitleBar != null) { 34993bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mFakeTitleBar.setLock(d); 35000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 35040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Displays a page-info dialog. 35050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param tab The tab to show info about 35060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param fromShowSSLCertificateOnError The flag that indicates whether 35070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * this dialog was opened from the SSL-certificate-on-error dialog or 35080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * not. This is important, since we need to know whether to return to 35090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * the parent dialog or simply dismiss. 35100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 35110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void showPageInfo(final TabControl.Tab tab, 35120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final boolean fromShowSSLCertificateOnError) { 35130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final LayoutInflater factory = LayoutInflater 35140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .from(this); 35150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final View pageInfoView = factory.inflate(R.layout.page_info, null); 35170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView view = tab.getWebView(); 35190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String url = null; 35210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String title = null; 35220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (view == null) { 35240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = tab.getUrl(); 35250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = tab.getTitle(); 35260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (view == mTabControl.getCurrentWebView()) { 35270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Use the cached title and url if this is the current WebView 35280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = mUrl; 35290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = mTitle; 35300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 35310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = view.getUrl(); 35320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = view.getTitle(); 35330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url == null) { 35360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = ""; 35370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (title == null) { 35390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = ""; 35400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) pageInfoView.findViewById(R.id.address)).setText(url); 35430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) pageInfoView.findViewById(R.id.title)).setText(title); 35440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoView = tab; 35460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoFromShowSSLCertificateOnError = new Boolean(fromShowSSLCertificateOnError); 35470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project AlertDialog.Builder alertDialogBuilder = 35490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(this) 35500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.page_info).setIcon(android.R.drawable.ic_dialog_info) 35510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setView(pageInfoView) 35520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton( 35530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.string.ok, 35540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 35550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 35560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 35570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoDialog = null; 35580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoView = null; 35590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoFromShowSSLCertificateOnError = null; 35600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we came here from the SSL error dialog 35620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (fromShowSSLCertificateOnError) { 35630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // go back to the SSL error dialog 35640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificateOnError( 35650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView, 35660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler, 35670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError); 35680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 35710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setOnCancelListener( 35720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnCancelListener() { 35730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCancel(DialogInterface dialog) { 35740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoDialog = null; 35750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoView = null; 35760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoFromShowSSLCertificateOnError = null; 35770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we came here from the SSL error dialog 35790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (fromShowSSLCertificateOnError) { 35800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // go back to the SSL error dialog 35810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificateOnError( 35820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView, 35830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler, 35840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError); 35850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }); 35880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we have a main top-level page SSL certificate set or a certificate 35900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // error 35910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (fromShowSSLCertificateOnError || 35920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (view != null && view.getCertificate() != null)) { 35930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // add a 'View Certificate' button 35940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project alertDialogBuilder.setNeutralButton( 35950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.string.view_certificate, 35960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 35970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 35980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 35990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoDialog = null; 36000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoView = null; 36010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoFromShowSSLCertificateOnError = null; 36020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we came here from the SSL error dialog 36040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (fromShowSSLCertificateOnError) { 36050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // go back to the SSL error dialog 36060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificateOnError( 36070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView, 36080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler, 36090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError); 36100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 36110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // otherwise, display the top-most certificate from 36120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the chain 36130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (view.getCertificate() != null) { 36140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificate(tab); 36150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }); 36190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoDialog = alertDialogBuilder.show(); 36220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 36250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Displays the main top-level page SSL certificate dialog 36260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * (accessible from the Page-Info dialog). 36270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param tab The tab to show certificate for. 36280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 36290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void showSSLCertificate(final TabControl.Tab tab) { 36300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final View certificateView = 36310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inflateCertificateView(tab.getWebView().getCertificate()); 36320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (certificateView == null) { 36330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 36340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LayoutInflater factory = LayoutInflater.from(this); 36370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final LinearLayout placeholder = 36390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (LinearLayout)certificateView.findViewById(R.id.placeholder); 36400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout) factory.inflate( 36420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.layout.ssl_success, placeholder); 36430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.success)) 36440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_certificate_is_valid); 36450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateView = tab; 36470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateDialog = 36480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(this) 36490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.ssl_certificate).setIcon( 36500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.drawable.ic_dialog_browser_certificate_secure) 36510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setView(certificateView) 36520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, 36530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 36540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 36550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 36560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateDialog = null; 36570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateView = null; 36580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showPageInfo(tab, false); 36600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 36620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setOnCancelListener( 36630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnCancelListener() { 36640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCancel(DialogInterface dialog) { 36650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateDialog = null; 36660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateView = null; 36670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showPageInfo(tab, false); 36690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 36710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 36720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 36750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Displays the SSL error certificate dialog. 36760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param view The target web-view. 36770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param handler The SSL error handler responsible for cancelling the 36780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * connection that resulted in an SSL error or proceeding per user request. 36790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param error The SSL error object. 36800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 36810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void showSSLCertificateOnError( 36820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView view, final SslErrorHandler handler, final SslError error) { 36830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final View certificateView = 36850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inflateCertificateView(error.getCertificate()); 36860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (certificateView == null) { 36870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 36880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LayoutInflater factory = LayoutInflater.from(this); 36910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final LinearLayout placeholder = 36930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (LinearLayout)certificateView.findViewById(R.id.placeholder); 36940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_UNTRUSTED)) { 36960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 36970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, placeholder); 36980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 36990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_untrusted); 37000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 37010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_IDMISMATCH)) { 37030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 37040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, placeholder); 37050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 37060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_mismatch); 37070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 37080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_EXPIRED)) { 37100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 37110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, placeholder); 37120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 37130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_expired); 37140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 37150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_NOTYETVALID)) { 37170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 37180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, placeholder); 37190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 37200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_not_yet_valid); 37210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 37220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler = handler; 37240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView = view; 37250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError = error; 37260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorDialog = 37270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(this) 37280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.ssl_certificate).setIcon( 37290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.drawable.ic_dialog_browser_certificate_partially_secure) 37300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setView(certificateView) 37310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, 37320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 37330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 37340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 37350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorDialog = null; 37360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView = null; 37370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler = null; 37380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError = null; 37390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWebViewClient.onReceivedSslError( 37410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project view, handler, error); 37420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 37430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 37440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setNeutralButton(R.string.page_info_view, 37450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 37460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 37470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 37480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorDialog = null; 37490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // do not clear the dialog state: we will 37510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // need to show the dialog again once the 37520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // user is done exploring the page-info details 37530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showPageInfo(mTabControl.getTabFromView(view), 37550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project true); 37560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 37570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 37580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setOnCancelListener( 37590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnCancelListener() { 37600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCancel(DialogInterface dialog) { 37610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorDialog = null; 37620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView = null; 37630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler = null; 37640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError = null; 37650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWebViewClient.onReceivedSslError( 37670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project view, handler, error); 37680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 37690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 37700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 37710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 37720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 37740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Inflates the SSL certificate view (helper method). 37750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param certificate The SSL certificate. 37760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @return The resultant certificate view with issued-to, issued-by, 37770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * issued-on, expires-on, and possibly other fields set. 37780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * If the input certificate is null, returns null. 37790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 37800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private View inflateCertificateView(SslCertificate certificate) { 37810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (certificate == null) { 37820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return null; 37830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 37840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LayoutInflater factory = LayoutInflater.from(this); 37860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project View certificateView = factory.inflate( 37880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.layout.ssl_certificate, null); 37890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // issued to: 37910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project SslCertificate.DName issuedTo = certificate.getIssuedTo(); 37920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (issuedTo != null) { 37930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.to_common)) 37940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedTo.getCName()); 37950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.to_org)) 37960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedTo.getOName()); 37970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.to_org_unit)) 37980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedTo.getUName()); 37990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // issued by: 38020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project SslCertificate.DName issuedBy = certificate.getIssuedBy(); 38030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (issuedBy != null) { 38040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.by_common)) 38050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedBy.getCName()); 38060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.by_org)) 38070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedBy.getOName()); 38080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.by_org_unit)) 38090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedBy.getUName()); 38100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // issued on: 38130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String issuedOn = reformatCertificateDate( 38140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project certificate.getValidNotBefore()); 38150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.issued_on)) 38160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedOn); 38170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // expires on: 38190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String expiresOn = reformatCertificateDate( 38200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project certificate.getValidNotAfter()); 38210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.expires_on)) 38220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(expiresOn); 38230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return certificateView; 38250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 38280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Re-formats the certificate date (Date.toString()) string to 38290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * a properly localized date string. 38300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @return Properly localized version of the certificate date string and 38310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * the original certificate date string if fails to localize. 38320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * If the original string is null, returns an empty string "". 38330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 38340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String reformatCertificateDate(String certificateDate) { 38350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String reformattedDate = null; 38360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (certificateDate != null) { 38380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Date date = null; 38390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 38400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project date = java.text.DateFormat.getInstance().parse(certificateDate); 38410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (ParseException e) { 38420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project date = null; 38430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (date != null) { 38460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project reformattedDate = 38470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project DateFormat.getDateFormat(this).format(date); 38480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return reformattedDate != null ? reformattedDate : 38520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (certificateDate != null ? certificateDate : ""); 38530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 38560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Displays an http-authentication dialog. 38570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 38580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void showHttpAuthentication(final HttpAuthHandler handler, 38590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final String host, final String realm, final String title, 38600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final String name, final String password, int focusId) { 38610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LayoutInflater factory = LayoutInflater.from(this); 38620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final View v = factory 38630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.http_authentication, null); 38640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (name != null) { 38650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((EditText) v.findViewById(R.id.username_edit)).setText(name); 38660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (password != null) { 38680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((EditText) v.findViewById(R.id.password_edit)).setText(password); 38690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String titleText = title; 38720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (titleText == null) { 38730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project titleText = getText(R.string.sign_in_to).toString().replace( 38740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "%s1", host).replace("%s2", realm); 38750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthHandler = handler; 38780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project AlertDialog dialog = new AlertDialog.Builder(this) 38790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(titleText) 38800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setIcon(android.R.drawable.ic_dialog_alert) 38810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setView(v) 38820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.action, 38830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 38840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 38850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 38860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String nm = ((EditText) v 38870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .findViewById(R.id.username_edit)) 38880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .getText().toString(); 38890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String pw = ((EditText) v 38900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .findViewById(R.id.password_edit)) 38910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .getText().toString(); 38920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserActivity.this.setHttpAuthUsernamePassword 38930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (host, realm, nm, pw); 38940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.proceed(nm, pw); 38950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthenticationDialog = null; 38960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthHandler = null; 38970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 38980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setNegativeButton(R.string.cancel, 38990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 39000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 39010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 39020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.cancel(); 39030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserActivity.this.resetTitleAndRevertLockIcon(); 39040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthenticationDialog = null; 39050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthHandler = null; 39060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 39070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setOnCancelListener(new DialogInterface.OnCancelListener() { 39080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCancel(DialogInterface dialog) { 39090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.cancel(); 39100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserActivity.this.resetTitleAndRevertLockIcon(); 39110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthenticationDialog = null; 39120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthHandler = null; 39130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 39140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .create(); 39150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Make the IME appear when the dialog is displayed if applicable. 39160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dialog.getWindow().setSoftInputMode( 39170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); 39180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dialog.show(); 39190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (focusId != 0) { 39200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dialog.findViewById(focusId).requestFocus(); 39210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 39220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project v.findViewById(R.id.username_edit).requestFocus(); 39230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthenticationDialog = dialog; 39250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public int getProgress() { 39280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = mTabControl.getCurrentWebView(); 39290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 39300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return w.getProgress(); 39310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 39320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return 100; 39330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 39370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Set HTTP authentication password. 39380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 39390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param host The host for the password 39400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param realm The realm for the password 39410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param username The username for the password. If it is null, it means 39420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * password can't be saved. 39430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param password The password 39440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 39450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void setHttpAuthUsernamePassword(String host, String realm, 39460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String username, 39470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String password) { 39480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = mTabControl.getCurrentWebView(); 39490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 39500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.setHttpAuthUsernamePassword(host, realm, username, password); 39510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 39550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * connectivity manager says net has come or gone... inform the user 39560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param up true if net has come up, false if net has gone down 39570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 39580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onNetworkToggle(boolean up) { 39590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (up == mIsNetworkUp) { 39600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 39610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (up) { 39620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mIsNetworkUp = true; 39630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mAlertDialog != null) { 39640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mAlertDialog.cancel(); 39650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mAlertDialog = null; 39660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 39680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mIsNetworkUp = false; 39690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mInLoad && mAlertDialog == null) { 39700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mAlertDialog = new AlertDialog.Builder(this) 39710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.loadSuspendedTitle) 39720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setMessage(R.string.loadSuspended) 39730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, null) 39740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 39750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = mTabControl.getCurrentWebView(); 39780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 39790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.setNetworkAvailable(up); 39800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 39840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project protected void onActivityResult(int requestCode, int resultCode, 39850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent) { 39860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (requestCode) { 39870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case COMBO_PAGE: 39880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (resultCode == RESULT_OK && intent != null) { 39890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String data = intent.getAction(); 39900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Bundle extras = intent.getExtras(); 39910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (extras != null && extras.getBoolean("new_window", false)) { 3992b0e4fc7b8efc66b20cf83a8d5f8dc9110d67da4fPatrick Scott final TabControl.Tab newTab = openTab(data); 3993b0e4fc7b8efc66b20cf83a8d5f8dc9110d67da4fPatrick Scott if (mSettings.openInBackground() && 39941f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins newTab != null) { 3995b0e4fc7b8efc66b20cf83a8d5f8dc9110d67da4fPatrick Scott mTabControl.populatePickerData(newTab); 3996b0e4fc7b8efc66b20cf83a8d5f8dc9110d67da4fPatrick Scott mTabControl.setCurrentTab(newTab); 39971f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins int newIndex = mTabControl.getCurrentIndex(); 39983bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mTitleBar.setCurrentTab(newIndex); 3999b0e4fc7b8efc66b20cf83a8d5f8dc9110d67da4fPatrick Scott } 40000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 40010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final TabControl.Tab currentTab = 40020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.getCurrentTab(); 40031f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins dismissSubWindow(currentTab); 40041f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (data != null && data.length() != 0) { 40051f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins getTopWindow().loadUrl(data); 40060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 40100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project default: 40110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 40120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 4013304442375719effd41dbd53ae62de7a8d0cec7d9Leon Scroggins getTopWindow().requestFocus(); 40140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* 40170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * This method is called as a result of the user selecting the options 40180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * menu to see the download window, or when a download changes state. It 40190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * shows the download window ontop of the current window. 40200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 40210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ void viewDownloads(Uri downloadRecord) { 40220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent = new Intent(this, 40230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserDownloadPage.class); 40240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.setData(downloadRecord); 40250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project startActivityForResult(intent, this.DOWNLOAD_PAGE); 40260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 4029160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins /** 4030160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * Open the Go page. 4031160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * @param startWithHistory If true, open starting on the history tab. 4032160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * Otherwise, start with the bookmarks tab. 4033160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins */ 4034304442375719effd41dbd53ae62de7a8d0cec7d9Leon Scroggins /* package */ void bookmarksOrHistoryPicker(boolean startWithHistory) { 40350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView current = mTabControl.getCurrentWebView(); 40360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current == null) { 40370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 40380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent = new Intent(this, 40400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project CombinedBookmarkHistoryActivity.class); 40410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String title = current.getTitle(); 40420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String url = current.getUrl(); 40430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Just in case the user opens bookmarks before a page finishes loading 40440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // so the current history item, and therefore the page, is null. 40450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (null == url) { 40460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = mLastEnteredUrl; 40470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // This can happen. 40480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (null == url) { 40490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = mSettings.getHomePage(); 40500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // In case the web page has not yet received its associated title. 40530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (title == null) { 40540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = url; 40550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.putExtra("title", title); 40570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.putExtra("url", url); 4058304442375719effd41dbd53ae62de7a8d0cec7d9Leon Scroggins // Disable opening in a new window if we have maxed out the windows 4059304442375719effd41dbd53ae62de7a8d0cec7d9Leon Scroggins intent.putExtra("disable_new_window", mTabControl.getTabCount() 4060304442375719effd41dbd53ae62de7a8d0cec7d9Leon Scroggins >= TabControl.MAX_TABS); 40613918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott intent.putExtra("touch_icon_url", current.getTouchIconUrl()); 40620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (startWithHistory) { 40630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.putExtra(CombinedBookmarkHistoryActivity.STARTING_TAB, 40640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project CombinedBookmarkHistoryActivity.HISTORY_TAB); 40650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project startActivityForResult(intent, COMBO_PAGE); 40670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Called when loading from context menu or LOAD_URL message 40700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void loadURL(WebView view, String url) { 40710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // In case the user enters nothing. 40720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null && url.length() != 0 && view != null) { 40730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = smartUrlFilter(url); 40740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!mWebViewClient.shouldOverrideUrlLoading(view, url)) { 40750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project view.loadUrl(url); 40760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String smartUrlFilter(Uri inUri) { 40810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (inUri != null) { 40820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return smartUrlFilter(inUri.toString()); 40830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return null; 40850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // get window count 40890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int getWindowCount(){ 40910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if(mTabControl != null){ 40920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return mTabControl.getTabCount(); 40930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return 0; 40950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 4097b34f87a2e13af13d697130482af01b537ab7c5fdFeng Qian protected static final Pattern ACCEPTED_URI_SCHEMA = Pattern.compile( 40980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "(?i)" + // switch on case insensitive matching 40990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "(" + // begin group for schema 41000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "(?:http|https|file):\\/\\/" + 410125ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima "|(?:inline|data|about|content|javascript):" + 41020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ")" + 41030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "(.*)" ); 41040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 41050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 41060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Attempts to determine whether user input is a URL or search 41070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * terms. Anything with a space is passed to search. 41080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 41090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Converts to lowercase any mistakenly uppercased schema (i.e., 41100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * "Http://" converts to "http://" 41110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 41120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @return Original or modified URL 41130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 41140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 41150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String smartUrlFilter(String url) { 41160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 41170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String inUrl = url.trim(); 41180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean hasSpace = inUrl.indexOf(' ') != -1; 41190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 41200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Matcher matcher = ACCEPTED_URI_SCHEMA.matcher(inUrl); 41210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (matcher.matches()) { 41220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // force scheme to lowercase 41230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String scheme = matcher.group(1); 41240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String lcScheme = scheme.toLowerCase(); 41250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!lcScheme.equals(scheme)) { 4126123ecfb21e7ca670e3d04efe58780b3bac54a9a1Mitsuru Oshima inUrl = lcScheme + matcher.group(2); 4127123ecfb21e7ca670e3d04efe58780b3bac54a9a1Mitsuru Oshima } 4128123ecfb21e7ca670e3d04efe58780b3bac54a9a1Mitsuru Oshima if (hasSpace) { 4129123ecfb21e7ca670e3d04efe58780b3bac54a9a1Mitsuru Oshima inUrl = inUrl.replace(" ", "%20"); 41300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 41310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return inUrl; 41320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 41330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (hasSpace) { 4134565505b1a2c1d3099496af5910760087602e994aSatish Sampath // FIXME: Is this the correct place to add to searches? 4135565505b1a2c1d3099496af5910760087602e994aSatish Sampath // what if someone else calls this function? 4136565505b1a2c1d3099496af5910760087602e994aSatish Sampath int shortcut = parseUrlShortcut(inUrl); 4137565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (shortcut != SHORTCUT_INVALID) { 4138565505b1a2c1d3099496af5910760087602e994aSatish Sampath Browser.addSearchUrl(mResolver, inUrl); 4139565505b1a2c1d3099496af5910760087602e994aSatish Sampath String query = inUrl.substring(2); 4140565505b1a2c1d3099496af5910760087602e994aSatish Sampath switch (shortcut) { 4141565505b1a2c1d3099496af5910760087602e994aSatish Sampath case SHORTCUT_GOOGLE_SEARCH: 414247fdfdb989ffb79590a39c40792be995de32e521Grace Kloba return URLUtil.composeSearchUrl(query, QuickSearch_G, QUERY_PLACE_HOLDER); 4143565505b1a2c1d3099496af5910760087602e994aSatish Sampath case SHORTCUT_WIKIPEDIA_SEARCH: 4144565505b1a2c1d3099496af5910760087602e994aSatish Sampath return URLUtil.composeSearchUrl(query, QuickSearch_W, QUERY_PLACE_HOLDER); 4145565505b1a2c1d3099496af5910760087602e994aSatish Sampath case SHORTCUT_DICTIONARY_SEARCH: 4146565505b1a2c1d3099496af5910760087602e994aSatish Sampath return URLUtil.composeSearchUrl(query, QuickSearch_D, QUERY_PLACE_HOLDER); 4147565505b1a2c1d3099496af5910760087602e994aSatish Sampath case SHORTCUT_GOOGLE_MOBILE_LOCAL_SEARCH: 41480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // FIXME: we need location in this case 4149565505b1a2c1d3099496af5910760087602e994aSatish Sampath return URLUtil.composeSearchUrl(query, QuickSearch_L, QUERY_PLACE_HOLDER); 41500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 41510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 41520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 41530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (Regex.WEB_URL_PATTERN.matcher(inUrl).matches()) { 41540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return URLUtil.guessUrl(inUrl); 41550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 41560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 41570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 41580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Browser.addSearchUrl(mResolver, inUrl); 415947fdfdb989ffb79590a39c40792be995de32e521Grace Kloba return URLUtil.composeSearchUrl(inUrl, QuickSearch_G, QUERY_PLACE_HOLDER); 41600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 41610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 4162bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch /* package */ void setShouldShowErrorConsole(boolean flag) { 4163bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch if (flag == mShouldShowErrorConsole) { 4164bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch // Nothing to do. 4165bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch return; 4166bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 4167bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 4168bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch mShouldShowErrorConsole = flag; 4169bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 4170bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch ErrorConsoleView errorConsole = mTabControl.getCurrentErrorConsole(true); 4171bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 4172bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch if (flag) { 4173bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch // Setting the show state of the console will cause it's the layout to be inflated. 4174bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch if (errorConsole.numberOfErrors() > 0) { 4175bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch errorConsole.showConsole(ErrorConsoleView.SHOW_MINIMIZED); 4176bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } else { 4177bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch errorConsole.showConsole(ErrorConsoleView.SHOW_NONE); 4178bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 4179bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 4180bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch // Now we can add it to the main view. 4181bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch mErrorConsoleContainer.addView(errorConsole, 4182bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, 4183bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch ViewGroup.LayoutParams.WRAP_CONTENT)); 4184bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } else { 4185bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch mErrorConsoleContainer.removeView(errorConsole); 4186bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 4187bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 4188bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 4189bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 41900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final static int LOCK_ICON_UNSECURE = 0; 41910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final static int LOCK_ICON_SECURE = 1; 41920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final static int LOCK_ICON_MIXED = 2; 41930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 41940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private int mLockIconType = LOCK_ICON_UNSECURE; 41950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private int mPrevLockType = LOCK_ICON_UNSECURE; 41960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 41970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private BrowserSettings mSettings; 41980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private TabControl mTabControl; 41990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private ContentResolver mResolver; 42000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private FrameLayout mContentView; 4201adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu private View mCustomView; 4202adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu private FrameLayout mCustomViewContainer; 4203c9b5556351b59caec77b4eec1ad30652fec6a4d9Andrei Popescu private WebChromeClient.CustomViewCallback mCustomViewCallback; 42040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // FIXME, temp address onPrepareMenu performance problem. When we move everything out of 42060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // view, we should rewrite this. 42070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private int mCurrentMenuState = 0; 42080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private int mMenuState = R.id.MAIN_MENU; 4209adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu private int mOldMenuState = EMPTY_MENU; 42100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static final int EMPTY_MENU = -1; 42110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Menu mMenu; 42120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private FindDialog mFindDialog; 42140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Used to prevent chording to result in firing two shortcuts immediately 42150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // one after another. Fixes bug 1211714. 42160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean mCanChord; 42170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private boolean mInLoad; 42190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private boolean mIsNetworkUp; 42200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private boolean mPageStarted; 42220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private boolean mActivityInPause = true; 42230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private boolean mMenuIsDown; 42250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final KeyTracker mKeyTracker = new KeyTracker(this); 42270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // As trackball doesn't send repeat down, we have to track it ourselves 42290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private boolean mTrackTrackball; 42300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static boolean mInTrace; 42320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Performance probe 42340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static final int[] SYSTEM_CPU_FORMAT = new int[] { 42350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_COMBINE, 42360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 1: user time 42370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 2: nice time 42380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 3: sys time 42390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 4: idle time 42400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 5: iowait time 42410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 6: irq time 42420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG // 7: softirq time 42430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 42440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mStart; 42460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mProcessStart; 42470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mUserStart; 42480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mSystemStart; 42490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mIdleStart; 42500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mIrqStart; 42510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mUiStart; 42530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Drawable mMixLockIcon; 42550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Drawable mSecLockIcon; 42560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* hold a ref so we can auto-cancel if necessary */ 42580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private AlertDialog mAlertDialog; 42590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Wait for credentials before loading google.com 42610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private ProgressDialog mCredsDlg; 42620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // The up-to-date URL and title (these can be different from those stored 42640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // in WebView, since it takes some time for the information in WebView to 42650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // get updated) 42660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String mUrl; 42670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String mTitle; 42680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // As PageInfo has different style for landscape / portrait, we have 42700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // to re-open it when configuration changed 42710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private AlertDialog mPageInfoDialog; 42720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private TabControl.Tab mPageInfoView; 42730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If the Page-Info dialog is launched from the SSL-certificate-on-error 42740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // dialog, we should not just dismiss it, but should get back to the 42750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // SSL-certificate-on-error dialog. This flag is used to store this state 42760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Boolean mPageInfoFromShowSSLCertificateOnError; 42770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // as SSLCertificateOnError has different style for landscape / portrait, 42790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // we have to re-open it when configuration changed 42800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private AlertDialog mSSLCertificateOnErrorDialog; 42810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private WebView mSSLCertificateOnErrorView; 42820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private SslErrorHandler mSSLCertificateOnErrorHandler; 42830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private SslError mSSLCertificateOnErrorError; 42840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // as SSLCertificate has different style for landscape / portrait, we 42860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // have to re-open it when configuration changed 42870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private AlertDialog mSSLCertificateDialog; 42880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private TabControl.Tab mSSLCertificateView; 42890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // as HttpAuthentication has different style for landscape / portrait, we 42910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // have to re-open it when configuration changed 42920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private AlertDialog mHttpAuthenticationDialog; 42930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private HttpAuthHandler mHttpAuthHandler; 42940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /*package*/ static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS = 42960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new FrameLayout.LayoutParams( 42970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ViewGroup.LayoutParams.FILL_PARENT, 42980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ViewGroup.LayoutParams.FILL_PARENT); 4299adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu /*package*/ static final FrameLayout.LayoutParams COVER_SCREEN_GRAVITY_CENTER = 4300adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu new FrameLayout.LayoutParams( 4301adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu ViewGroup.LayoutParams.FILL_PARENT, 4302adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu ViewGroup.LayoutParams.FILL_PARENT, 4303adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu Gravity.CENTER); 430447fdfdb989ffb79590a39c40792be995de32e521Grace Kloba // Google search 430547fdfdb989ffb79590a39c40792be995de32e521Grace Kloba final static String QuickSearch_G = "http://www.google.com/m?q=%s"; 43060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Wikipedia search 43070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String QuickSearch_W = "http://en.wikipedia.org/w/index.php?search=%s&go=Go"; 43080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Dictionary search 43090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String QuickSearch_D = "http://dictionary.reference.com/search?q=%s"; 43100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Google Mobile Local search 43110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String QuickSearch_L = "http://www.google.com/m/search?site=local&q=%s&near=mountain+view"; 43120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 43130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String QUERY_PLACE_HOLDER = "%s"; 43140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 43150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "source" parameter for Google search through search key 43160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String GOOGLE_SEARCH_SOURCE_SEARCHKEY = "browser-key"; 43170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "source" parameter for Google search through goto menu 43180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String GOOGLE_SEARCH_SOURCE_GOTO = "browser-goto"; 43190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "source" parameter for Google search through simplily type 43200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String GOOGLE_SEARCH_SOURCE_TYPE = "browser-type"; 43210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "source" parameter for Google search suggested by the browser 43220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String GOOGLE_SEARCH_SOURCE_SUGGEST = "browser-suggest"; 43230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "source" parameter for Google search from unknown source 43240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String GOOGLE_SEARCH_SOURCE_UNKNOWN = "unknown"; 43250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 43260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final static String LOGTAG = "browser"; 43270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 43280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String mLastEnteredUrl; 43290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 43300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private PowerManager.WakeLock mWakeLock; 43310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final static int WAKELOCK_TIMEOUT = 5 * 60 * 1000; // 5 minutes 43320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 43330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Toast mStopToast; 43340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 43351f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins private TitleBarSet mTitleBar; 433681db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins 4337bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch private LinearLayout mErrorConsoleContainer = null; 4338bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch private boolean mShouldShowErrorConsole = false; 4339bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 43400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // As the ids are dynamically created, we can't guarantee that they will 43410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // be in sequence, so this static array maps ids to a window number. 43420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static private int[] WINDOW_SHORTCUT_ID_ARRAY = 43430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project { R.id.window_one_menu_id, R.id.window_two_menu_id, R.id.window_three_menu_id, 43440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.id.window_four_menu_id, R.id.window_five_menu_id, R.id.window_six_menu_id, 43450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.id.window_seven_menu_id, R.id.window_eight_menu_id }; 43460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 43470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // monitor platform changes 43480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private IntentFilter mNetworkStateChangedFilter; 43490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private BroadcastReceiver mNetworkStateIntentReceiver; 43500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 4351b4da0ad0351996f639b50f9f29b123a9b5c24fd0Grace Kloba private BroadcastReceiver mPackageInstallationReceiver; 4352b4da0ad0351996f639b50f9f29b123a9b5c24fd0Grace Kloba 43530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // activity requestCode 435478a98e459323f938e97789a6131beddbebb459ceNicolas Roard final static int COMBO_PAGE = 1; 435578a98e459323f938e97789a6131beddbebb459ceNicolas Roard final static int DOWNLOAD_PAGE = 2; 435678a98e459323f938e97789a6131beddbebb459ceNicolas Roard final static int PREFERENCES_PAGE = 3; 43570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 435825ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima /** 435925ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima * A UrlData class to abstract how the content will be set to WebView. 436025ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima * This base class uses loadUrl to show the content. 436125ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima */ 436225ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima private static class UrlData { 436325ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima String mUrl; 436460e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba byte[] mPostData; 436560e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba 436625ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima UrlData(String url) { 436725ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima this.mUrl = url; 436825ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima } 436960e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba 437060e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba void setPostData(byte[] postData) { 437160e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba mPostData = postData; 437260e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba } 437360e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba 437425ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima boolean isEmpty() { 437525ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima return mUrl == null || mUrl.length() == 0; 437625ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima } 437725ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima 43787944b7def8b04c3dc0cb8815a8527aba8c91b219Mitsuru Oshima public void loadIn(WebView webView) { 437960e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba if (mPostData != null) { 438060e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba webView.postUrl(mUrl, mPostData); 438160e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba } else { 438260e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba webView.loadUrl(mUrl); 438360e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba } 438425ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima } 438525ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima }; 438625ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima 438725ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima /** 438825ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima * A subclass of UrlData class that can display inlined content using 438925ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima * {@link WebView#loadDataWithBaseURL(String, String, String, String, String)}. 439025ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima */ 439125ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima private static class InlinedUrlData extends UrlData { 439225ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima InlinedUrlData(String inlined, String mimeType, String encoding, String failUrl) { 439325ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima super(failUrl); 439425ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima mInlined = inlined; 439525ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima mMimeType = mimeType; 439625ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima mEncoding = encoding; 439725ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima } 439825ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima String mMimeType; 439925ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima String mInlined; 440025ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima String mEncoding; 44017944b7def8b04c3dc0cb8815a8527aba8c91b219Mitsuru Oshima @Override 440225ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima boolean isEmpty() { 4403bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch return mInlined == null || mInlined.length() == 0 || super.isEmpty(); 440425ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima } 440525ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima 44067944b7def8b04c3dc0cb8815a8527aba8c91b219Mitsuru Oshima @Override 44077944b7def8b04c3dc0cb8815a8527aba8c91b219Mitsuru Oshima public void loadIn(WebView webView) { 440825ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima webView.loadDataWithBaseURL(null, mInlined, mMimeType, mEncoding, mUrl); 440925ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima } 441025ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima } 441125ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima 44121f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins /* package */ static final UrlData EMPTY_URL_DATA = new UrlData(null); 44130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project} 4414