BrowserActivity.java revision a11b75a4ef9cb8e264e59e3d2aadd56cf62e2afe
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.Color; 500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.graphics.DrawFilter; 510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.graphics.Paint; 520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.graphics.PaintFlagsDrawFilter; 530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.graphics.Picture; 540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.graphics.drawable.BitmapDrawable; 550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.graphics.drawable.Drawable; 560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.graphics.drawable.LayerDrawable; 570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.graphics.drawable.PaintDrawable; 580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.hardware.SensorListener; 590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.hardware.SensorManager; 600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.net.ConnectivityManager; 610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.net.Uri; 620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.net.WebAddress; 630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.net.http.EventHandler; 640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.net.http.SslCertificate; 650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.net.http.SslError; 660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.AsyncTask; 670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.Bundle; 680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.Debug; 690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.Environment; 700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.Handler; 710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.IBinder; 720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.Message; 730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.PowerManager; 740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.Process; 750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.RemoteException; 760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.ServiceManager; 770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.SystemClock; 780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.provider.Browser; 790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.provider.Contacts; 800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.provider.Downloads; 810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.provider.MediaStore; 820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.provider.Contacts.Intents.Insert; 830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.text.IClipboard; 840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.text.TextUtils; 850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.text.format.DateFormat; 860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.text.util.Regex; 870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.util.Log; 880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.ContextMenu; 890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.Gravity; 900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.KeyEvent; 910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.LayoutInflater; 920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.Menu; 930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.MenuInflater; 940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.MenuItem; 950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.View; 960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.ViewGroup; 970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.Window; 980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.WindowManager; 990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.ContextMenu.ContextMenuInfo; 1000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.MenuItem.OnMenuItemClickListener; 1010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.animation.AlphaAnimation; 1020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.animation.Animation; 1030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.animation.AnimationSet; 1040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.animation.DecelerateInterpolator; 1050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.animation.ScaleAnimation; 1060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.animation.TranslateAnimation; 1070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.CookieManager; 1080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.CookieSyncManager; 1090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.DownloadListener; 1102bc69918d97a767a02132090e58718077381ba1aSteve Blockimport android.webkit.GeolocationPermissions; 1110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.HttpAuthHandler; 112b4da0ad0351996f639b50f9f29b123a9b5c24fd0Grace Klobaimport android.webkit.PluginManager; 1130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.SslErrorHandler; 1140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.URLUtil; 1150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.WebChromeClient; 116c9b5556351b59caec77b4eec1ad30652fec6a4d9Andrei Popescuimport android.webkit.WebChromeClient.CustomViewCallback; 1170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.WebHistoryItem; 1180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.WebIconDatabase; 119092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdochimport android.webkit.WebStorage; 1200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.WebView; 1210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.WebViewClient; 1220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.EditText; 1230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.FrameLayout; 1240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.LinearLayout; 1250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.TextView; 1260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.Toast; 1270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.io.BufferedOutputStream; 129b6b7f9ef3b4ed220063f555d8b7c205210a61a04Leon Scrogginsimport java.io.ByteArrayOutputStream; 1300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.io.File; 1310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.io.FileInputStream; 1320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.io.FileOutputStream; 1330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.io.IOException; 1340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.io.InputStream; 1350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.net.MalformedURLException; 1360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.net.URI; 1379918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackbornimport java.net.URISyntaxException; 1380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.net.URL; 1390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.net.URLEncoder; 1400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.text.ParseException; 1410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.Date; 1420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.Enumeration; 1430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.HashMap; 14437911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scottimport java.util.LinkedList; 1450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.Vector; 1460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.regex.Matcher; 1470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.regex.Pattern; 1480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.zip.ZipEntry; 1490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.zip.ZipFile; 1500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectpublic class BrowserActivity extends Activity 1520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project implements KeyTracker.OnKeyTracker, 1530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project View.OnCreateContextMenuListener, 1540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project DownloadListener { 1550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15631a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort /* Define some aliases to make these debugging flags easier to refer to. 15731a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort * This file imports android.provider.Browser, so we can't just refer to "Browser.DEBUG". 15831a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort */ 15931a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort private final static boolean DEBUG = com.android.browser.Browser.DEBUG; 16031a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort private final static boolean LOGV_ENABLED = com.android.browser.Browser.LOGV_ENABLED; 16131a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort private final static boolean LOGD_ENABLED = com.android.browser.Browser.LOGD_ENABLED; 16231a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort 1630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private IGoogleLoginService mGls = null; 1640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private ServiceConnection mGlsConnection = null; 1650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private SensorManager mSensorManager = null; 1670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 168565505b1a2c1d3099496af5910760087602e994aSatish Sampath // These are single-character shortcuts for searching popular sources. 169565505b1a2c1d3099496af5910760087602e994aSatish Sampath private static final int SHORTCUT_INVALID = 0; 170565505b1a2c1d3099496af5910760087602e994aSatish Sampath private static final int SHORTCUT_GOOGLE_SEARCH = 1; 171565505b1a2c1d3099496af5910760087602e994aSatish Sampath private static final int SHORTCUT_WIKIPEDIA_SEARCH = 2; 172565505b1a2c1d3099496af5910760087602e994aSatish Sampath private static final int SHORTCUT_DICTIONARY_SEARCH = 3; 173565505b1a2c1d3099496af5910760087602e994aSatish Sampath private static final int SHORTCUT_GOOGLE_MOBILE_LOCAL_SEARCH = 4; 174565505b1a2c1d3099496af5910760087602e994aSatish Sampath 1750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* Whitelisted webpages 1760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static HashSet<String> sWhiteList; 1770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project static { 1790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList = new HashSet<String>(); 1800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList.add("cnn.com/"); 1810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList.add("espn.go.com/"); 1820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList.add("nytimes.com/"); 1830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList.add("engadget.com/"); 1840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList.add("yahoo.com/"); 1850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList.add("msn.com/"); 1860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList.add("amazon.com/"); 1870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList.add("consumerist.com/"); 1880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList.add("google.com/m/news"); 1890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 1910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void setupHomePage() { 1930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Runnable getAccount = new Runnable() { 1940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void run() { 1950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Lower priority 1960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); 1970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // get the default home page 1980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String homepage = mSettings.getHomePage(); 1990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 2010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mGls == null) return; 2020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 203f2c5c1b555904400f4092888ae81b8ed74bfe026Grace Kloba if (!homepage.startsWith("http://www.google.")) return; 204f2c5c1b555904400f4092888ae81b8ed74bfe026Grace Kloba if (homepage.indexOf('?') == -1) return; 205f2c5c1b555904400f4092888ae81b8ed74bfe026Grace Kloba 2060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String hostedUser = mGls.getAccount(GoogleLoginServiceConstants.PREFER_HOSTED); 2070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String googleUser = mGls.getAccount(GoogleLoginServiceConstants.REQUIRE_GOOGLE); 2080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // three cases: 2100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // 2110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // hostedUser == googleUser 2120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // The device has only a google account 2130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // 2140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // hostedUser != googleUser 2150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // The device has a hosted account and a google account 2160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // 2170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // hostedUser != null, googleUser == null 2180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // The device has only a hosted account (so far) 2190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // developers might have no accounts at all 2210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (hostedUser == null) return; 2220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (googleUser == null || !hostedUser.equals(googleUser)) { 2240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String domain = hostedUser.substring(hostedUser.lastIndexOf('@')+1); 225f2c5c1b555904400f4092888ae81b8ed74bfe026Grace Kloba homepage = homepage.replace("?", "/a/" + domain + "?"); 2260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (RemoteException ignore) { 2280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Login service died; carry on 2290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (RuntimeException ignore) { 2300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Login service died; carry on 2310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } finally { 2320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project finish(homepage); 2330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void finish(final String homepage) { 2370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.post(new Runnable() { 2380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void run() { 2390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSettings.setHomePage(BrowserActivity.this, homepage); 2400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resumeAfterCredentials(); 2410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // as this is running in a separate thread, 2430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // BrowserActivity's onDestroy() may have been called, 2440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // which also calls unbindService(). 2450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mGlsConnection != null) { 2460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // we no longer need to keep GLS open 2470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project unbindService(mGlsConnection); 2480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mGlsConnection = null; 2490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } }); 2510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } }; 2520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final boolean[] done = { false }; 2540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Open a connection to the Google Login Service. The first 2560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // time the connection is established, set up the homepage depending on 2570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the account in a background thread. 2580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mGlsConnection = new ServiceConnection() { 2590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onServiceConnected(ComponentName className, IBinder service) { 2600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mGls = IGoogleLoginService.Stub.asInterface(service); 2610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (done[0] == false) { 2620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project done[0] = true; 2630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Thread account = new Thread(getAccount); 2640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project account.setName("GLSAccount"); 2650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project account.start(); 2660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onServiceDisconnected(ComponentName className) { 2690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mGls = null; 2700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 2720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project bindService(GoogleLoginServiceConstants.SERVICE_INTENT, 2740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mGlsConnection, Context.BIND_AUTO_CREATE); 2750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 277a977124eb29b195127fd161120ebbc58b255fb48Cary Clark private static class ClearThumbnails extends AsyncTask<File, Void, Void> { 2780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 2790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public Void doInBackground(File... files) { 2800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (files != null) { 2810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project for (File f : files) { 282d6be1758b38d5b066ff10b6af906aa66c63670cdCary Clark if (!f.delete()) { 283d6be1758b38d5b066ff10b6af906aa66c63670cdCary Clark Log.e(LOGTAG, f.getPath() + " was not deleted"); 284d6be1758b38d5b066ff10b6af906aa66c63670cdCary Clark } 2850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return null; 2880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29181db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins // Flag to enable the touchable browser bar with buttons 29281db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins private final boolean CUSTOM_BROWSER_BAR = true; 29381db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins 2940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override public void onCreate(Bundle icicle) { 29531a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 2960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, this + " onStart"); 2970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onCreate(icicle); 29981db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins if (CUSTOM_BROWSER_BAR) { 30081db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins this.requestWindowFeature(Window.FEATURE_NO_TITLE); 30181db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins } else { 30281db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins this.requestWindowFeature(Window.FEATURE_LEFT_ICON); 30381db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins this.requestWindowFeature(Window.FEATURE_RIGHT_ICON); 30481db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins this.requestWindowFeature(Window.FEATURE_PROGRESS); 30581db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins this.requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 30681db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins } 3070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // test the browser in OpenGL 3080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // requestWindowFeature(Window.FEATURE_OPENGL); 3090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL); 3110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mResolver = getContentResolver(); 3130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // 3150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // start MASF proxy service 3160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // 3170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //Intent proxyServiceIntent = new Intent(); 3180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //proxyServiceIntent.setComponent 3190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // (new ComponentName( 3200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "com.android.masfproxyservice", 3210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "com.android.masfproxyservice.MasfProxyService")); 3220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //startService(proxyServiceIntent, null); 3230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSecLockIcon = Resources.getSystem().getDrawable( 3250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project android.R.drawable.ic_secure); 3260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMixLockIcon = Resources.getSystem().getDrawable( 3270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project android.R.drawable.ic_partial_secure); 3280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mGenericFavicon = getResources().getDrawable( 3290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.drawable.app_web_browser_sm); 3300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33181db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins FrameLayout frameLayout = (FrameLayout) getWindow().getDecorView() 33281db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins .findViewById(com.android.internal.R.id.content); 33381db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins if (CUSTOM_BROWSER_BAR) { 334adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu // This FrameLayout will hold the custom FrameLayout and a LinearLayout 335adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu // that contains the title bar and a FrameLayout, which 33681db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins // holds everything else. 337adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu FrameLayout browserFrameLayout = (FrameLayout) LayoutInflater.from(this) 338e4b3bda762ab616b2899c8de084e515f01b99c8aLeon Scroggins .inflate(R.layout.custom_screen, null); 3391f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins mTitleBar = (TitleBarSet) browserFrameLayout.findViewById(R.id.title_bar); 340adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu mContentView = (FrameLayout) browserFrameLayout.findViewById( 341e4b3bda762ab616b2899c8de084e515f01b99c8aLeon Scroggins R.id.main_content); 342bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch mErrorConsoleContainer = (LinearLayout) browserFrameLayout.findViewById( 343bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch R.id.error_console); 344adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu mCustomViewContainer = (FrameLayout) browserFrameLayout 345adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu .findViewById(R.id.fullscreen_custom_content); 346adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu frameLayout.addView(browserFrameLayout, COVER_SCREEN_PARAMS); 34781db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins } else { 348adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu mCustomViewContainer = new FrameLayout(this); 34978f757042015063d016b15893a650c44fdfd4e5cAndrei Popescu mCustomViewContainer.setBackgroundColor(Color.BLACK); 350adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu mContentView = new FrameLayout(this); 351bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 352bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch LinearLayout linearLayout = new LinearLayout(this); 353bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch linearLayout.setOrientation(LinearLayout.VERTICAL); 354bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch mErrorConsoleContainer = new LinearLayout(this); 355bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch linearLayout.addView(mErrorConsoleContainer, new LinearLayout.LayoutParams( 356bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 357bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch linearLayout.addView(mContentView, COVER_SCREEN_PARAMS); 358adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu frameLayout.addView(mCustomViewContainer, COVER_SCREEN_PARAMS); 359bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch frameLayout.addView(linearLayout, COVER_SCREEN_PARAMS); 36081db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins } 3610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Create the tab control and our initial tab 3630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl = new TabControl(this); 3640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Open the icon database and retain all the bookmark urls for favicons 3660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project retainIconsOnStartup(); 3670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Keep a settings instance handy. 3690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSettings = BrowserSettings.getInstance(); 3700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSettings.setTabControl(mTabControl); 3710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSettings.loadFromDb(this); 3720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 3740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Browser"); 3750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 376a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba /* enables registration for changes in network status from 377a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba http stack */ 378a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba mNetworkStateChangedFilter = new IntentFilter(); 379a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba mNetworkStateChangedFilter.addAction( 380a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba ConnectivityManager.CONNECTIVITY_ACTION); 381a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba mNetworkStateIntentReceiver = new BroadcastReceiver() { 382a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba @Override 383a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba public void onReceive(Context context, Intent intent) { 384a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba if (intent.getAction().equals( 385a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba ConnectivityManager.CONNECTIVITY_ACTION)) { 386a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba boolean down = intent.getBooleanExtra( 387a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); 388a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba onNetworkToggle(!down); 389a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba } 390a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba } 391a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba }; 392a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba 393615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED); 394615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba filter.addAction(Intent.ACTION_PACKAGE_REMOVED); 395615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba filter.addDataScheme("package"); 396615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba mPackageInstallationReceiver = new BroadcastReceiver() { 397615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba @Override 398615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba public void onReceive(Context context, Intent intent) { 399615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba final String action = intent.getAction(); 400615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba final String packageName = intent.getData() 401615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba .getSchemeSpecificPart(); 402615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba final boolean replacing = intent.getBooleanExtra( 403615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba Intent.EXTRA_REPLACING, false); 404615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba if (Intent.ACTION_PACKAGE_REMOVED.equals(action) && replacing) { 405615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba // if it is replacing, refreshPlugins() when adding 406615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba return; 407615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba } 408615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba PackageManager pm = BrowserActivity.this.getPackageManager(); 409615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba PackageInfo pkgInfo = null; 410615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba try { 411615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba pkgInfo = pm.getPackageInfo(packageName, 412615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba PackageManager.GET_PERMISSIONS); 413615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba } catch (PackageManager.NameNotFoundException e) { 414615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba return; 415615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba } 416615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba if (pkgInfo != null) { 417615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba String permissions[] = pkgInfo.requestedPermissions; 418615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba if (permissions == null) { 419615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba return; 420615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba } 421615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba boolean permissionOk = false; 422615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba for (String permit : permissions) { 423615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba if (PluginManager.PLUGIN_PERMISSION.equals(permit)) { 424615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba permissionOk = true; 425615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba break; 426615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba } 427615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba } 428615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba if (permissionOk) { 429615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba PluginManager.getInstance(BrowserActivity.this) 430615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba .refreshPlugins( 431615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba Intent.ACTION_PACKAGE_ADDED 432615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba .equals(action)); 433615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba } 434615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba } 435615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba } 436615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba }; 437615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba registerReceiver(mPackageInstallationReceiver, filter); 438615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba 439565505b1a2c1d3099496af5910760087602e994aSatish Sampath // If this was a web search request, pass it on to the default web search provider. 440565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (handleWebSearchIntent(getIntent())) { 441565505b1a2c1d3099496af5910760087602e994aSatish Sampath moveTaskToBack(true); 442565505b1a2c1d3099496af5910760087602e994aSatish Sampath return; 443565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 444565505b1a2c1d3099496af5910760087602e994aSatish Sampath 4450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!mTabControl.restoreState(icicle)) { 4460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // clear up the thumbnail directory if we can't restore the state as 4470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // none of the files in the directory are referenced any more. 4480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new ClearThumbnails().execute( 4490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.getThumbnailDir().listFiles()); 450aab3f09b5c2d39b19067e57635614080b2403a46Grace Kloba // there is no quit on Android. But if we can't restore the state, 451aab3f09b5c2d39b19067e57635614080b2403a46Grace Kloba // we can treat it as a new Browser, remove the old session cookies. 452aab3f09b5c2d39b19067e57635614080b2403a46Grace Kloba CookieManager.getInstance().removeSessionCookie(); 4530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Intent intent = getIntent(); 4540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Bundle extra = intent.getExtras(); 4550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Create an initial tab. 4560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If the intent is ACTION_VIEW and data is not null, the Browser is 4570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // invoked to view the content by another application. In this case, 4580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the tab will be close when exit. 45925ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima UrlData urlData = getUrlDataFromIntent(intent); 46025ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima 4610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final TabControl.Tab t = mTabControl.createNewTab( 4620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent.ACTION_VIEW.equals(intent.getAction()) && 463f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project intent.getData() != null, 46425ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima intent.getStringExtra(Browser.EXTRA_APPLICATION_ID), urlData.mUrl); 4650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.setCurrentTab(t); 4660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project attachTabToContentView(t); 4670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView webView = t.getWebView(); 4680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (extra != null) { 4690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int scale = extra.getInt(Browser.INITIAL_ZOOM_LEVEL, 0); 4700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (scale > 0 && scale <= 1000) { 4710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project webView.setInitialScale(scale); 4720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 4730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 4740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If we are not restoring from an icicle, then there is a high 4750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // likely hood this is the first run. So, check to see if the 4760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // homepage needs to be configured and copy any plugins from our 4770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // asset directory to the data partition. 4780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if ((extra == null || !extra.getBoolean("testing")) 4790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project && !mSettings.isLoginInitialized()) { 4800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setupHomePage(); 4810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 4820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 48325ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima if (urlData.isEmpty()) { 484160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins bookmarksOrHistoryPicker(false, true); 4850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 48681678d9216458266ea70cd62d52f28f744873556Grace Kloba if (extra != null) { 48781678d9216458266ea70cd62d52f28f744873556Grace Kloba urlData.setPostData(extra 48881678d9216458266ea70cd62d52f28f744873556Grace Kloba .getByteArray(Browser.EXTRA_POST_DATA)); 48981678d9216458266ea70cd62d52f28f744873556Grace Kloba } 49025ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima urlData.loadIn(webView); 4910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 4920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 4930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // TabControl.restoreState() will create a new tab even if 4941f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // restoring the state fails. 4950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project attachTabToContentView(mTabControl.getCurrentTab()); 4960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 497615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba 4981f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (CUSTOM_BROWSER_BAR) { 4991f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // Create title bars for all of the tabs that have been created 5001f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins for (int i = 0; i < mTabControl.getTabCount(); i ++) { 5011f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins WebView view = mTabControl.getTab(i).getWebView(); 5021f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins mTitleBar.addTab(view, false); 5031f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 5041f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins 5051f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins mTitleBar.setBrowserActivity(this); 5061f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins mTitleBar.setCurrentTab(mTabControl.getCurrentIndex()); 5071f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 5081f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins 509b3c02da4553b1a629b16377970fdabae28394c94Feng Qian // Read JavaScript flags if it exists. 510b3c02da4553b1a629b16377970fdabae28394c94Feng Qian String jsFlags = mSettings.getJsFlags(); 511b3c02da4553b1a629b16377970fdabae28394c94Feng Qian if (jsFlags.trim().length() != 0) { 512b3c02da4553b1a629b16377970fdabae28394c94Feng Qian mTabControl.getCurrentWebView().setJsFlags(jsFlags); 513b3c02da4553b1a629b16377970fdabae28394c94Feng Qian } 5140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 5160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 5170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project protected void onNewIntent(Intent intent) { 5180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TabControl.Tab current = mTabControl.getCurrentTab(); 5190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // When a tab is closed on exit, the current tab index is set to -1. 5200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Reset before proceed as Browser requires the current tab to be set. 5210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current == null) { 5220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Try to reset the tab in case the index was incorrect. 5230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project current = mTabControl.getTab(0); 5240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current == null) { 5250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // No tabs at all so just ignore this intent. 5260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 5270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.setCurrentTab(current); 5291f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (CUSTOM_BROWSER_BAR) { 5301f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins mTitleBar.setCurrentTab(mTabControl.getTabIndex(current)); 5311f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 5320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project attachTabToContentView(current); 5330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleAndIcon(current.getWebView()); 5340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final String action = intent.getAction(); 5360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final int flags = intent.getFlags(); 5370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (Intent.ACTION_MAIN.equals(action) || 5380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (flags & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0) { 5390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // just resume the browser 5400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 5410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (Intent.ACTION_VIEW.equals(action) 5430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || Intent.ACTION_SEARCH.equals(action) 5440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action) 5450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || Intent.ACTION_WEB_SEARCH.equals(action)) { 546565505b1a2c1d3099496af5910760087602e994aSatish Sampath // If this was a search request (e.g. search query directly typed into the address bar), 547565505b1a2c1d3099496af5910760087602e994aSatish Sampath // pass it on to the default web search provider. 548565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (handleWebSearchIntent(intent)) { 549565505b1a2c1d3099496af5910760087602e994aSatish Sampath return; 550565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 551565505b1a2c1d3099496af5910760087602e994aSatish Sampath 55225ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima UrlData urlData = getUrlDataFromIntent(intent); 55325ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima if (urlData.isEmpty()) { 55425ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima urlData = new UrlData(mSettings.getHomePage()); 5550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 55681678d9216458266ea70cd62d52f28f744873556Grace Kloba urlData.setPostData(intent 55781678d9216458266ea70cd62d52f28f744873556Grace Kloba .getByteArrayExtra(Browser.EXTRA_POST_DATA)); 55825ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima 559cc63403643786905262f505ab5266d8e80b9924cGrace Kloba final String appId = intent 560cc63403643786905262f505ab5266d8e80b9924cGrace Kloba .getStringExtra(Browser.EXTRA_APPLICATION_ID); 561cc63403643786905262f505ab5266d8e80b9924cGrace Kloba if (Intent.ACTION_VIEW.equals(action) 562cc63403643786905262f505ab5266d8e80b9924cGrace Kloba && !getPackageName().equals(appId) 563cc63403643786905262f505ab5266d8e80b9924cGrace Kloba && (flags & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { 564cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott TabControl.Tab appTab = mTabControl.getTabFromId(appId); 565f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project if (appTab != null) { 566f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project Log.i(LOGTAG, "Reusing tab for " + appId); 567f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // Dismiss the subwindow if applicable. 568f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project dismissSubWindow(appTab); 569f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // Since we might kill the WebView, remove it from the 570f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // content view first. 571f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project removeTabFromContentView(appTab); 572f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // Recreate the main WebView after destroying the old one. 573f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // If the WebView has the same original url and is on that 574f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // page, it can be reused. 575f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project boolean needsLoad = 57625ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima mTabControl.recreateWebView(appTab, urlData.mUrl); 577bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 578f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project if (current != appTab) { 5791f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins switchToTab(mTabControl.getTabIndex(appTab)); 5801f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (needsLoad) { 5811f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins urlData.loadIn(appTab.getWebView()); 5821f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 583f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project } else { 5841f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // If the tab was the current tab, we have to attach 5851f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // it to the view system again. 5861f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins attachTabToContentView(appTab); 5871f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (needsLoad) { 5881f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins urlData.loadIn(appTab.getWebView()); 589f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project } 590f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project } 591f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project return; 592cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott } else { 593cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott // No matching application tab, try to find a regular tab 594cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott // with a matching url. 595cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott appTab = mTabControl.findUnusedTabWithUrl(urlData.mUrl); 5961f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (appTab != null && current != appTab) { 5971f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins switchToTab(mTabControl.getTabIndex(appTab)); 598cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott } else { 599cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott // if FLAG_ACTIVITY_BROUGHT_TO_FRONT flag is on, the url 600cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott // will be opened in a new tab unless we have reached 601cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott // MAX_TABS. Then the url will be opened in the current 602cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott // tab. If a new tab is created, it will have "true" for 603cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott // exit on close. 6041f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins openTabAndShow(urlData, true, appId); 605cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott } 606f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project } 6070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 60825ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima if ("about:debug".equals(urlData.mUrl)) { 6090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSettings.toggleDebugSettings(); 6100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 6110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 6121f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // Get rid of the subwindow if it exists 6131f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins dismissSubWindow(current); 6141f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins urlData.loadIn(current.getWebView()); 6150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 6160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 6170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 6180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 619565505b1a2c1d3099496af5910760087602e994aSatish Sampath private int parseUrlShortcut(String url) { 620565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (url == null) return SHORTCUT_INVALID; 621565505b1a2c1d3099496af5910760087602e994aSatish Sampath 622565505b1a2c1d3099496af5910760087602e994aSatish Sampath // FIXME: quick search, need to be customized by setting 623565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (url.length() > 2 && url.charAt(1) == ' ') { 624565505b1a2c1d3099496af5910760087602e994aSatish Sampath switch (url.charAt(0)) { 625565505b1a2c1d3099496af5910760087602e994aSatish Sampath case 'g': return SHORTCUT_GOOGLE_SEARCH; 626565505b1a2c1d3099496af5910760087602e994aSatish Sampath case 'w': return SHORTCUT_WIKIPEDIA_SEARCH; 627565505b1a2c1d3099496af5910760087602e994aSatish Sampath case 'd': return SHORTCUT_DICTIONARY_SEARCH; 628565505b1a2c1d3099496af5910760087602e994aSatish Sampath case 'l': return SHORTCUT_GOOGLE_MOBILE_LOCAL_SEARCH; 629565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 630565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 631565505b1a2c1d3099496af5910760087602e994aSatish Sampath return SHORTCUT_INVALID; 632565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 633565505b1a2c1d3099496af5910760087602e994aSatish Sampath 634565505b1a2c1d3099496af5910760087602e994aSatish Sampath /** 635565505b1a2c1d3099496af5910760087602e994aSatish Sampath * Launches the default web search activity with the query parameters if the given intent's data 636565505b1a2c1d3099496af5910760087602e994aSatish Sampath * are identified as plain search terms and not URLs/shortcuts. 637565505b1a2c1d3099496af5910760087602e994aSatish Sampath * @return true if the intent was handled and web search activity was launched, false if not. 638565505b1a2c1d3099496af5910760087602e994aSatish Sampath */ 639565505b1a2c1d3099496af5910760087602e994aSatish Sampath private boolean handleWebSearchIntent(Intent intent) { 640565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (intent == null) return false; 641565505b1a2c1d3099496af5910760087602e994aSatish Sampath 642565505b1a2c1d3099496af5910760087602e994aSatish Sampath String url = null; 643565505b1a2c1d3099496af5910760087602e994aSatish Sampath final String action = intent.getAction(); 644565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (Intent.ACTION_VIEW.equals(action)) { 645565505b1a2c1d3099496af5910760087602e994aSatish Sampath url = intent.getData().toString(); 646565505b1a2c1d3099496af5910760087602e994aSatish Sampath } else if (Intent.ACTION_SEARCH.equals(action) 647565505b1a2c1d3099496af5910760087602e994aSatish Sampath || MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action) 648565505b1a2c1d3099496af5910760087602e994aSatish Sampath || Intent.ACTION_WEB_SEARCH.equals(action)) { 649565505b1a2c1d3099496af5910760087602e994aSatish Sampath url = intent.getStringExtra(SearchManager.QUERY); 650565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 65115e9f2dc92cf1621f95071b3c740f46079aa0f3bSatish Sampath return handleWebSearchRequest(url, intent.getBundleExtra(SearchManager.APP_DATA)); 652565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 653565505b1a2c1d3099496af5910760087602e994aSatish Sampath 654565505b1a2c1d3099496af5910760087602e994aSatish Sampath /** 655565505b1a2c1d3099496af5910760087602e994aSatish Sampath * Launches the default web search activity with the query parameters if the given url string 656565505b1a2c1d3099496af5910760087602e994aSatish Sampath * was identified as plain search terms and not URL/shortcut. 657565505b1a2c1d3099496af5910760087602e994aSatish Sampath * @return true if the request was handled and web search activity was launched, false if not. 658565505b1a2c1d3099496af5910760087602e994aSatish Sampath */ 65915e9f2dc92cf1621f95071b3c740f46079aa0f3bSatish Sampath private boolean handleWebSearchRequest(String inUrl, Bundle appData) { 660565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (inUrl == null) return false; 661565505b1a2c1d3099496af5910760087602e994aSatish Sampath 662565505b1a2c1d3099496af5910760087602e994aSatish Sampath // In general, we shouldn't modify URL from Intent. 663565505b1a2c1d3099496af5910760087602e994aSatish Sampath // But currently, we get the user-typed URL from search box as well. 664565505b1a2c1d3099496af5910760087602e994aSatish Sampath String url = fixUrl(inUrl).trim(); 665565505b1a2c1d3099496af5910760087602e994aSatish Sampath 666565505b1a2c1d3099496af5910760087602e994aSatish Sampath // URLs and site specific search shortcuts are handled by the regular flow of control, so 667565505b1a2c1d3099496af5910760087602e994aSatish Sampath // return early. 668565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (Regex.WEB_URL_PATTERN.matcher(url).matches() 669bc5b9f358a2b75bf3a104b9f5cd477ad2f6f740fSatish Sampath || ACCEPTED_URI_SCHEMA.matcher(url).matches() 670565505b1a2c1d3099496af5910760087602e994aSatish Sampath || parseUrlShortcut(url) != SHORTCUT_INVALID) { 671565505b1a2c1d3099496af5910760087602e994aSatish Sampath return false; 672565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 673565505b1a2c1d3099496af5910760087602e994aSatish Sampath 674565505b1a2c1d3099496af5910760087602e994aSatish Sampath Browser.updateVisitedHistory(mResolver, url, false); 675565505b1a2c1d3099496af5910760087602e994aSatish Sampath Browser.addSearchUrl(mResolver, url); 676565505b1a2c1d3099496af5910760087602e994aSatish Sampath 677565505b1a2c1d3099496af5910760087602e994aSatish Sampath Intent intent = new Intent(Intent.ACTION_WEB_SEARCH); 678565505b1a2c1d3099496af5910760087602e994aSatish Sampath intent.addCategory(Intent.CATEGORY_DEFAULT); 679565505b1a2c1d3099496af5910760087602e994aSatish Sampath intent.putExtra(SearchManager.QUERY, url); 68015e9f2dc92cf1621f95071b3c740f46079aa0f3bSatish Sampath if (appData != null) { 68115e9f2dc92cf1621f95071b3c740f46079aa0f3bSatish Sampath intent.putExtra(SearchManager.APP_DATA, appData); 68215e9f2dc92cf1621f95071b3c740f46079aa0f3bSatish Sampath } 683cc63403643786905262f505ab5266d8e80b9924cGrace Kloba intent.putExtra(Browser.EXTRA_APPLICATION_ID, getPackageName()); 684565505b1a2c1d3099496af5910760087602e994aSatish Sampath startActivity(intent); 685565505b1a2c1d3099496af5910760087602e994aSatish Sampath 686565505b1a2c1d3099496af5910760087602e994aSatish Sampath return true; 687565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 688565505b1a2c1d3099496af5910760087602e994aSatish Sampath 68925ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima private UrlData getUrlDataFromIntent(Intent intent) { 6900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String url = null; 6910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (intent != null) { 6920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final String action = intent.getAction(); 6930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (Intent.ACTION_VIEW.equals(action)) { 6940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = smartUrlFilter(intent.getData()); 6950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null && url.startsWith("content:")) { 6960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* Append mimetype so webview knows how to display */ 6970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String mimeType = intent.resolveType(getContentResolver()); 6980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mimeType != null) { 6990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url += "?" + mimeType; 7000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 70225ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima if ("inline:".equals(url)) { 70325ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima return new InlinedUrlData( 70425ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima intent.getStringExtra(Browser.EXTRA_INLINE_CONTENT), 70525ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima intent.getType(), 70625ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima intent.getStringExtra(Browser.EXTRA_INLINE_ENCODING), 70725ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima intent.getStringExtra(Browser.EXTRA_INLINE_FAILURL)); 70825ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima } 7090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (Intent.ACTION_SEARCH.equals(action) 7100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action) 7110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || Intent.ACTION_WEB_SEARCH.equals(action)) { 7120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = intent.getStringExtra(SearchManager.QUERY); 7130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null) { 7140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mLastEnteredUrl = url; 7150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Don't add Urls, just search terms. 7160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Urls will get added when the page is loaded. 7170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!Regex.WEB_URL_PATTERN.matcher(url).matches()) { 7180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Browser.updateVisitedHistory(mResolver, url, false); 7190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // In general, we shouldn't modify URL from Intent. 7210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // But currently, we get the user-typed URL from search box as well. 7220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = fixUrl(url); 7230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = smartUrlFilter(url); 7240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String searchSource = "&source=android-" + GOOGLE_SEARCH_SOURCE_SUGGEST + "&"; 7250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url.contains(searchSource)) { 7260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String source = null; 7270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Bundle appData = intent.getBundleExtra(SearchManager.APP_DATA); 7280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (appData != null) { 7290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project source = appData.getString(SearchManager.SOURCE); 7300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (TextUtils.isEmpty(source)) { 7320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project source = GOOGLE_SEARCH_SOURCE_UNKNOWN; 7330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = url.replace(searchSource, "&source=android-"+source+"&"); 7350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 73925ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima return new UrlData(url); 7400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 7420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ static String fixUrl(String inUrl) { 7430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (inUrl.startsWith("http://") || inUrl.startsWith("https://")) 7440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return inUrl; 7450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (inUrl.startsWith("http:") || 7460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inUrl.startsWith("https:")) { 7470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (inUrl.startsWith("http:/") || inUrl.startsWith("https:/")) { 7480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inUrl = inUrl.replaceFirst("/", "//"); 7490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else inUrl = inUrl.replaceFirst(":", "://"); 7500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return inUrl; 7520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 7540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 7550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Looking for the pattern like this 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 * * * 7610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * * * 7620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * * 7630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 7640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final SensorListener mSensorListener = new SensorListener() { 7650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mLastGestureTime; 7660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private float[] mPrev = new float[3]; 7670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private float[] mPrevDiff = new float[3]; 7680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private float[] mDiff = new float[3]; 7690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private float[] mRevertDiff = new float[3]; 7700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 7710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onSensorChanged(int sensor, float[] values) { 7720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean show = false; 7730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project float[] diff = new float[3]; 7740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 7750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project for (int i = 0; i < 3; i++) { 7760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project diff[i] = values[i] - mPrev[i]; 7770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (Math.abs(diff[i]) > 1) { 7780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project show = true; 7790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if ((diff[i] > 1.0 && mDiff[i] < 0.2) 7810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || (diff[i] < -1.0 && mDiff[i] > -0.2)) { 7820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // start track when there is a big move, or revert 7830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mRevertDiff[i] = mDiff[i]; 7840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mDiff[i] = 0; 7850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (diff[i] > -0.2 && diff[i] < 0.2) { 7860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // reset when it is flat 7870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mDiff[i] = mRevertDiff[i] = 0; 7880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mDiff[i] += diff[i]; 7900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPrevDiff[i] = diff[i]; 7910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPrev[i] = values[i]; 7920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 7940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (false) { 7950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // only shows if we think the delta is big enough, in an attempt 7960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // to detect "serious" moves left/right or up/down 7970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.d("BrowserSensorHack", "sensorChanged " + sensor + " (" 7980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + values[0] + ", " + values[1] + ", " + values[2] + ")" 7990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + " diff(" + diff[0] + " " + diff[1] + " " + diff[2] 8000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + ")"); 8010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.d("BrowserSensorHack", " mDiff(" + mDiff[0] + " " 8020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + mDiff[1] + " " + mDiff[2] + ")" + " mRevertDiff(" 8030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + mRevertDiff[0] + " " + mRevertDiff[1] + " " 8040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + mRevertDiff[2] + ")"); 8050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 8070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project long now = android.os.SystemClock.uptimeMillis(); 8080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (now - mLastGestureTime > 1000) { 8090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mLastGestureTime = 0; 8100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 8110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project float y = mDiff[1]; 8120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project float z = mDiff[2]; 8130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project float ay = Math.abs(y); 8140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project float az = Math.abs(z); 8150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project float ry = mRevertDiff[1]; 8160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project float rz = mRevertDiff[2]; 8170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project float ary = Math.abs(ry); 8180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project float arz = Math.abs(rz); 8190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean gestY = ay > 2.5f && ary > 1.0f && ay > ary; 8200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean gestZ = az > 3.5f && arz > 1.0f && az > arz; 8210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 8220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if ((gestY || gestZ) && !(gestY && gestZ)) { 8230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView view = mTabControl.getCurrentWebView(); 8240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 8250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (view != null) { 8260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (gestZ) { 8270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (z < 0) { 8280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project view.zoomOut(); 8290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 8300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project view.zoomIn(); 8310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 8330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project view.flingScroll(0, Math.round(y * 100)); 8340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mLastGestureTime = now; 8370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 8410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onAccuracyChanged(int sensor, int accuracy) { 8420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // TODO Auto-generated method stub 8430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 8440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 8460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 8470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override protected void onResume() { 8480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onResume(); 84931a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 8500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, "BrowserActivity.onResume: this=" + this); 8510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 8530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!mActivityInPause) { 8540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(LOGTAG, "BrowserActivity is already resumed."); 8550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 8560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 8587bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed mTabControl.resumeCurrentTab(); 8590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mActivityInPause = false; 8607bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed resumeWebViewTimers(); 8610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 8620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mWakeLock.isHeld()) { 8630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.removeMessages(RELEASE_WAKELOCK); 8640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWakeLock.release(); 8650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 8670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mCredsDlg != null) { 8680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!mHandler.hasMessages(CANCEL_CREDS_REQUEST)) { 8690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // In case credential request never comes back 8700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.sendEmptyMessageDelayed(CANCEL_CREDS_REQUEST, 6000); 8710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 8740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project registerReceiver(mNetworkStateIntentReceiver, 8750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mNetworkStateChangedFilter); 8760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView.enablePlatformNotifications(); 8770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 8780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mSettings.doFlick()) { 8790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mSensorManager == null) { 8800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSensorManager = (SensorManager) getSystemService( 8810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Context.SENSOR_SERVICE); 8820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSensorManager.registerListener(mSensorListener, 8840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project SensorManager.SENSOR_ACCELEROMETER, 8850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project SensorManager.SENSOR_DELAY_FASTEST); 8860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 8870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSensorManager = null; 8880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 8910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 8920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * onSaveInstanceState(Bundle map) 8930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * onSaveInstanceState is called right before onStop(). The map contains 8940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * the saved state. 8950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 8960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override protected void onSaveInstanceState(Bundle outState) { 89731a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 8980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, "BrowserActivity.onSaveInstanceState: this=" + this); 8990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the default implementation requires each view to have an id. As the 9010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // browser handles the state itself and it doesn't use id for the views, 9020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // don't call the default implementation. Otherwise it will trigger the 9030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // warning like this, "couldn't save which view has focus because the 9040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // focused view XXX has no id". 9050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 9060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Save all the tabs 9070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.saveState(outState); 9080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 9100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override protected void onPause() { 9110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onPause(); 9120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 9130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mActivityInPause) { 9140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(LOGTAG, "BrowserActivity is already paused."); 9150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 9160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 9187bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed mTabControl.pauseCurrentTab(); 9190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mActivityInPause = true; 9207bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed if (mTabControl.getCurrentIndex() >= 0 && !pauseWebViewTimers()) { 9210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWakeLock.acquire(); 9220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.sendMessageDelayed(mHandler 9230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .obtainMessage(RELEASE_WAKELOCK), WAKELOCK_TIMEOUT); 9240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 9260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Clear the credentials toast if it is up 9270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mCredsDlg != null && mCredsDlg.isShowing()) { 9280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCredsDlg.dismiss(); 9290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCredsDlg = null; 9310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 9320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project cancelStopToast(); 9330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 9340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // unregister network state listener 9350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project unregisterReceiver(mNetworkStateIntentReceiver); 9360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView.disablePlatformNotifications(); 9370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 9380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mSensorManager != null) { 9390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSensorManager.unregisterListener(mSensorListener); 9400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 9430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override protected void onDestroy() { 94431a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 9450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, "BrowserActivity.onDestroy: this=" + this); 9460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onDestroy(); 9480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Remove the current tab and sub window 9490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TabControl.Tab t = mTabControl.getCurrentTab(); 950fb5e77fac7b8b311fe72827183f8988f5ee92a5fPatrick Scott if (t != null) { 951fb5e77fac7b8b311fe72827183f8988f5ee92a5fPatrick Scott dismissSubWindow(t); 952fb5e77fac7b8b311fe72827183f8988f5ee92a5fPatrick Scott removeTabFromContentView(t); 953fb5e77fac7b8b311fe72827183f8988f5ee92a5fPatrick Scott } 9540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Destroy all the tabs 9550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.destroy(); 9560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebIconDatabase.getInstance().close(); 9570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mGlsConnection != null) { 9580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project unbindService(mGlsConnection); 9590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mGlsConnection = null; 9600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 9620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // 9630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // stop MASF proxy service 9640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // 9650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //Intent proxyServiceIntent = new Intent(); 9660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //proxyServiceIntent.setComponent 9670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // (new ComponentName( 9680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "com.android.masfproxyservice", 9690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "com.android.masfproxyservice.MasfProxyService")); 9700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //stopService(proxyServiceIntent); 971b4da0ad0351996f639b50f9f29b123a9b5c24fd0Grace Kloba 972b4da0ad0351996f639b50f9f29b123a9b5c24fd0Grace Kloba unregisterReceiver(mPackageInstallationReceiver); 9730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 9750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 9760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onConfigurationChanged(Configuration newConfig) { 9770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onConfigurationChanged(newConfig); 9780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 9790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mPageInfoDialog != null) { 9800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoDialog.dismiss(); 9810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showPageInfo( 9820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoView, 9830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoFromShowSSLCertificateOnError.booleanValue()); 9840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mSSLCertificateDialog != null) { 9860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateDialog.dismiss(); 9870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificate( 9880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateView); 9890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mSSLCertificateOnErrorDialog != null) { 9910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorDialog.dismiss(); 9920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificateOnError( 9930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView, 9940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler, 9950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError); 9960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mHttpAuthenticationDialog != null) { 9980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String title = ((TextView) mHttpAuthenticationDialog 9990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .findViewById(com.android.internal.R.id.alertTitle)).getText() 10000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .toString(); 10010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String name = ((TextView) mHttpAuthenticationDialog 10020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .findViewById(R.id.username_edit)).getText().toString(); 10030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String password = ((TextView) mHttpAuthenticationDialog 10040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .findViewById(R.id.password_edit)).getText().toString(); 10050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int focusId = mHttpAuthenticationDialog.getCurrentFocus() 10060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .getId(); 10070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthenticationDialog.dismiss(); 10080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showHttpAuthentication(mHttpAuthHandler, null, null, title, 10090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project name, password, focusId); 10100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mFindDialog != null && mFindDialog.isShowing()) { 10120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mFindDialog.onConfigurationChanged(newConfig); 10130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override public void onLowMemory() { 10170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onLowMemory(); 10180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.freeMemory(); 10190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10217bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed private boolean resumeWebViewTimers() { 10220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if ((!mActivityInPause && !mPageStarted) || 10230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (mActivityInPause && mPageStarted)) { 10240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project CookieSyncManager.getInstance().startSync(); 10250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = mTabControl.getCurrentWebView(); 10260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 10270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.resumeTimers(); 10280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 10300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 10310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 10320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10357bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed private boolean pauseWebViewTimers() { 10360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mActivityInPause && !mPageStarted) { 10370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project CookieSyncManager.getInstance().stopSync(); 10380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = mTabControl.getCurrentWebView(); 10390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 10400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.pauseTimers(); 10410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 10430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 10440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 10450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10481f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // FIXME: Do we want to call this when loading google for the first time? 10490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* 10500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * This function is called when we are launching for the first time. We 10510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * are waiting for the login credentials before loading Google home 10520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * pages. This way the user will be logged in straight away. 10530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 10540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void waitForCredentials() { 10550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Show a toast 10560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCredsDlg = new ProgressDialog(this); 10570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCredsDlg.setIndeterminate(true); 10580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCredsDlg.setMessage(getText(R.string.retrieving_creds_dlg_msg)); 10590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If the user cancels the operation, then cancel the Google 10600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Credentials request. 10610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCredsDlg.setCancelMessage(mHandler.obtainMessage(CANCEL_CREDS_REQUEST)); 10620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCredsDlg.show(); 10630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // We set a timeout for the retrieval of credentials in onResume() 10650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // as that is when we have freed up some CPU time to get 10660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the login credentials. 10670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* 10700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * If we have received the credentials or we have timed out and we are 10710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * showing the credentials dialog, then it is time to move on. 10720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 10730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void resumeAfterCredentials() { 10740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mCredsDlg == null) { 10750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 10760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Clear the toast 10790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mCredsDlg.isShowing()) { 10800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCredsDlg.dismiss(); 10810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCredsDlg = null; 10830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Clear any pending timeout 10850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.removeMessages(CANCEL_CREDS_REQUEST); 10860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Load the page 10880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = mTabControl.getCurrentWebView(); 10890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 10900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.loadUrl(mSettings.getHomePage()); 10910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Update the settings, need to do this last as it can take a moment 10940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // to persist the settings. In the mean time we could be loading 10950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // content. 10960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSettings.setLoginInitialized(this); 10970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Open the icon database and retain all the icons for visited sites. 11000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void retainIconsOnStartup() { 11010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebIconDatabase db = WebIconDatabase.getInstance(); 11020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project db.open(getDir("icons", 0).getPath()); 11030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 11040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Cursor c = Browser.getAllBookmarks(mResolver); 11050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!c.moveToFirst()) { 11060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project c.deactivate(); 11070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 11080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int urlIndex = c.getColumnIndex(Browser.BookmarkColumns.URL); 11100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project do { 11110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String url = c.getString(urlIndex); 11120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project db.retainIconForPageUrl(url); 11130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } while (c.moveToNext()); 11140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project c.deactivate(); 11150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (IllegalStateException e) { 11160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(LOGTAG, "retainIconsOnStartup", e); 11170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Helper method for getting the top window. 11210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView getTopWindow() { 11220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return mTabControl.getCurrentTopWebView(); 11230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 11260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onCreateOptionsMenu(Menu menu) { 11270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onCreateOptionsMenu(menu); 11280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project MenuInflater inflater = getMenuInflater(); 11300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inflater.inflate(R.menu.browser, menu); 11310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenu = menu; 11320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project updateInLoadMenuItems(); 11330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 11340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 11370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * As the menu can be open when loading state changes 11380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * we must manually update the state of the stop/reload menu 11390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * item 11400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 11410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void updateInLoadMenuItems() { 11420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mMenu == null) { 11430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 11440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project MenuItem src = mInLoad ? 11460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenu.findItem(R.id.stop_menu_id): 11470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenu.findItem(R.id.reload_menu_id); 11480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project MenuItem dest = mMenu.findItem(R.id.stop_reload_menu_id); 11490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dest.setIcon(src.getIcon()); 11500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dest.setTitle(src.getTitle()); 11510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 11540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onContextItemSelected(MenuItem item) { 11550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // chording is not an issue with context menus, but we use the same 11560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // options selector, so set mCanChord to true so we can access them. 11570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCanChord = true; 11580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int id = item.getItemId(); 11590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView webView = getTopWindow(); 11600d7ae0ed82e21d472cde8cf92b5657d8ee8ca0d8Leon Scroggins if (null == webView) { 11610d7ae0ed82e21d472cde8cf92b5657d8ee8ca0d8Leon Scroggins return false; 11620d7ae0ed82e21d472cde8cf92b5657d8ee8ca0d8Leon Scroggins } 11630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final HashMap hrefMap = new HashMap(); 11640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project hrefMap.put("webview", webView); 11650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Message msg = mHandler.obtainMessage( 11660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project FOCUS_NODE_HREF, id, 0, hrefMap); 11670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (id) { 11680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // -- Browser context menu 11690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.open_context_menu_id: 11700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.open_newtab_context_menu_id: 11710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.bookmark_context_menu_id: 11720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.save_link_context_menu_id: 11730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.share_link_context_menu_id: 11740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.copy_link_context_menu_id: 11750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project webView.requestFocusNodeHref(msg); 11760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 11770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project default: 11790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // For other context menus 11800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return onOptionsItemSelected(item); 11810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCanChord = false; 11830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 11840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Bundle createGoogleSearchSourceBundle(String source) { 11870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Bundle bundle = new Bundle(); 11880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project bundle.putString(SearchManager.SOURCE, source); 11890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return bundle; 11900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 11934e5f58704099c37186d4825c3d55ea5b0527867fThe Android Open Source Project * Overriding this to insert a local information bundle 11940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 11950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 11960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onSearchRequested() { 11975bbe98025a2c606a35c91b826760020890daadb1Leon Scroggins String url = (getTopWindow() == null) ? null : getTopWindow().getUrl(); 119883f473462fcd7869031a423c02b957c6e938a2f6Grace Kloba startSearch(mSettings.getHomePage().equals(url) ? null : url, true, 11994e5f58704099c37186d4825c3d55ea5b0527867fThe Android Open Source Project createGoogleSearchSourceBundle(GOOGLE_SEARCH_SOURCE_SEARCHKEY), false); 12000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 12010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 12030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 12040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void startSearch(String initialQuery, boolean selectInitialQuery, 12050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Bundle appSearchData, boolean globalSearch) { 12060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (appSearchData == null) { 12070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project appSearchData = createGoogleSearchSourceBundle(GOOGLE_SEARCH_SOURCE_TYPE); 12080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.startSearch(initialQuery, selectInitialQuery, appSearchData, globalSearch); 12100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 12121f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins /** 12131f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins * Switch tabs. Called by the TitleBarSet when sliding the title bar 12141f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins * results in changing tabs. 1215160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * @param index Index of the tab to change to, as defined by 1216160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * mTabControl.getTabIndex(Tab t). 1217160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * @return boolean True if we successfully switched to a different tab. If 1218160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * the indexth tab is null, or if that tab is the same as 1219160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * the current one, return false. 12201f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins */ 1221160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins /* package */ boolean switchToTab(int index) { 12221f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins TabControl.Tab tab = mTabControl.getTab(index); 12231f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins TabControl.Tab currentTab = mTabControl.getCurrentTab(); 12241f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (tab == null || tab == currentTab) { 1225160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins return false; 12261f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 12271f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (currentTab != null) { 12281f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // currentTab may be null if it was just removed. In that case, 12291f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // we do not need to remove it 12301f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins removeTabFromContentView(currentTab); 12311f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 12321f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins removeTabFromContentView(tab); 12331f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins mTabControl.setCurrentTab(tab); 12341f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins attachTabToContentView(tab); 1235a11b75a4ef9cb8e264e59e3d2aadd56cf62e2afeLeon Scroggins if (CUSTOM_BROWSER_BAR) { 1236a11b75a4ef9cb8e264e59e3d2aadd56cf62e2afeLeon Scroggins mTitleBar.setCurrentTab(index); 1237a11b75a4ef9cb8e264e59e3d2aadd56cf62e2afeLeon Scroggins } 1238160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins return true; 12391f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 12401f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins 12411f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins /* package */ void closeCurrentWindow() { 12421f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins final TabControl.Tab current = mTabControl.getCurrentTab(); 1243160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins if (mTabControl.getTabCount() == 1) { 1244160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins // This is the last tab. Open a new one, as well as the history 1245160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins // picker, and close the current one. 1246160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins TabControl.Tab newTab = openTabAndShow( 1247160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins BrowserActivity.EMPTY_URL_DATA, false, null); 1248160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins bookmarksOrHistoryPicker(false, true); 1249160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins closeTab(current); 1250160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins mTabControl.setCurrentTab(newTab); 1251160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins return; 1252160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins } 12531f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins final TabControl.Tab parent = current.getParentTab(); 12541f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins int indexToShow = -1; 12551f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (parent != null) { 12561f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins indexToShow = mTabControl.getTabIndex(parent); 12571f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } else { 1258160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins final int currentIndex = mTabControl.getCurrentIndex(); 1259160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins // Try to move to the tab to the right 1260160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins indexToShow = currentIndex + 1; 1261160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins if (indexToShow > mTabControl.getTabCount() - 1) { 1262160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins // Try to move to the tab to the left 1263160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins indexToShow = currentIndex - 1; 12641f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 12651f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 1266160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins if (switchToTab(indexToShow)) { 1267160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins // Close window 1268160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins closeTab(current); 1269160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins } 12701f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 12711f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins 12720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 12730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onOptionsItemSelected(MenuItem item) { 12740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!mCanChord) { 12750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // The user has already fired a shortcut with this hold down of the 12760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // menu key. 12770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 12780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12791f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (null == getTopWindow()) { 12800d7ae0ed82e21d472cde8cf92b5657d8ee8ca0d8Leon Scroggins return false; 12810d7ae0ed82e21d472cde8cf92b5657d8ee8ca0d8Leon Scroggins } 12826ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba if (mMenuIsDown) { 12836ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba // The shortcut action consumes the MENU. Even if it is still down, 12846ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba // it won't trigger the next shortcut action. In the case of the 12856ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba // shortcut action triggering a new activity, like Bookmarks, we 12866ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba // won't get onKeyUp for MENU. So it is important to reset it here. 12876ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba mMenuIsDown = false; 12886ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba } 12890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (item.getItemId()) { 12900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // -- Main menu 129164b80f3efd95d7b5192731e995ccde79c4c6c11fLeon Scroggins case R.id.goto_menu_id: 1292160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins bookmarksOrHistoryPicker(false, false); 12930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 12940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 12951f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins case R.id.add_bookmark_menu_id: 12961f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins Intent i = new Intent(BrowserActivity.this, 12971f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins AddBookmarkPage.class); 12981f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins WebView w = getTopWindow(); 12991f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins i.putExtra("url", w.getUrl()); 13001f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins i.putExtra("title", w.getTitle()); 13011f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins startActivity(i); 13020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.stop_reload_menu_id: 13050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mInLoad) { 13060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project stopLoading(); 13070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 13080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().reload(); 13090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 13100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.back_menu_id: 13130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().goBack(); 13140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.forward_menu_id: 13170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().goForward(); 13180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.close_menu_id: 13210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Close the subwindow if it exists. 13220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabControl.getCurrentSubWindow() != null) { 13230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dismissSubWindow(mTabControl.getCurrentTab()); 13240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 13261f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins closeCurrentWindow(); 13270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.homepage_menu_id: 13300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TabControl.Tab current = mTabControl.getCurrentTab(); 13310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current != null) { 13320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dismissSubWindow(current); 13330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project current.getWebView().loadUrl(mSettings.getHomePage()); 13340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 13350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.preferences_menu_id: 13380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent = new Intent(this, 13390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserPreferencesPage.class); 13400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project startActivityForResult(intent, PREFERENCES_PAGE); 13410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.find_menu_id: 13440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (null == mFindDialog) { 13450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mFindDialog = new FindDialog(this); 13460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 13470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mFindDialog.setWebView(getTopWindow()); 13480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mFindDialog.show(); 13490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenuState = EMPTY_MENU; 13500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.select_text_id: 13530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().emulateShiftHeld(); 13540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.page_info_menu_id: 13560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showPageInfo(mTabControl.getCurrentTab(), false); 13570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.classic_history_menu_id: 1360160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins bookmarksOrHistoryPicker(true, false); 13610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.share_page_menu_id: 13640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Browser.sendString(this, getTopWindow().getUrl()); 13650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.dump_nav_menu_id: 13680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().debugDump(); 13690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.zoom_in_menu_id: 13720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().zoomIn(); 13730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.zoom_out_menu_id: 13760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().zoomOut(); 13770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.view_downloads_menu_id: 13800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project viewDownloads(null); 13810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_one_menu_id: 13840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_two_menu_id: 13850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_three_menu_id: 13860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_four_menu_id: 13870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_five_menu_id: 13880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_six_menu_id: 13890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_seven_menu_id: 13900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_eight_menu_id: 13910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project { 13920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int menuid = item.getItemId(); 13930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project for (int id = 0; id < WINDOW_SHORTCUT_ID_ARRAY.length; id++) { 13940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (WINDOW_SHORTCUT_ID_ARRAY[id] == menuid) { 13950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TabControl.Tab desiredTab = mTabControl.getTab(id); 13960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (desiredTab != null && 13970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project desiredTab != mTabControl.getCurrentTab()) { 13981f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins switchToTab(id); 13990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project default: 14070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!super.onOptionsItemSelected(item)) { 14080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 14090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Otherwise fall through. 14110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCanChord = false; 14130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 14140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void closeFind() { 14170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenuState = R.id.MAIN_MENU; 14180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override public boolean onPrepareOptionsMenu(Menu menu) 14210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project { 14220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // This happens when the user begins to hold down the menu key, so 14230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // allow them to chord to get a shortcut. 14240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCanChord = true; 14250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Note: setVisible will decide whether an item is visible; while 14260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // setEnabled() will decide whether an item is enabled, which also means 14270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // whether the matching shortcut key will function. 14280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onPrepareOptionsMenu(menu); 14290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (mMenuState) { 14300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case EMPTY_MENU: 14310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mCurrentMenuState != mMenuState) { 14320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.MAIN_MENU, false); 14330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupEnabled(R.id.MAIN_MENU, false); 14340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupEnabled(R.id.MAIN_SHORTCUT_MENU, false); 14350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project default: 14380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mCurrentMenuState != mMenuState) { 14390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.MAIN_MENU, true); 14400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupEnabled(R.id.MAIN_MENU, true); 14410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupEnabled(R.id.MAIN_SHORTCUT_MENU, true); 14420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView w = getTopWindow(); 14440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean canGoBack = false; 14450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean canGoForward = false; 14460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean isHome = false; 14470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 14480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project canGoBack = w.canGoBack(); 14490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project canGoForward = w.canGoForward(); 14500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project isHome = mSettings.getHomePage().equals(w.getUrl()); 14510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final MenuItem back = menu.findItem(R.id.back_menu_id); 14530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project back.setEnabled(canGoBack); 14540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final MenuItem home = menu.findItem(R.id.homepage_menu_id); 14560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project home.setEnabled(!isHome); 14570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.forward_menu_id) 14590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setEnabled(canGoForward); 14600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // decide whether to show the share link option 14620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project PackageManager pm = getPackageManager(); 14630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent send = new Intent(Intent.ACTION_SEND); 14640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project send.setType("text/plain"); 14650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ResolveInfo ri = pm.resolveActivity(send, PackageManager.MATCH_DEFAULT_ONLY); 14660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.share_page_menu_id).setVisible(ri != null); 14670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean isNavDump = mSettings.isNavDump(); 14690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final MenuItem nav = menu.findItem(R.id.dump_nav_menu_id); 14700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project nav.setVisible(isNavDump); 14710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project nav.setEnabled(isNavDump); 14720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCurrentMenuState = mMenuState; 14750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 14760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 14790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCreateContextMenu(ContextMenu menu, View v, 14800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ContextMenuInfo menuInfo) { 14810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView webview = (WebView) v; 14820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView.HitTestResult result = webview.getHitTestResult(); 14830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (result == null) { 14840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 14850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int type = result.getType(); 14880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (type == WebView.HitTestResult.UNKNOWN_TYPE) { 14890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.w(LOGTAG, 14900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "We should not show context menu when nothing is touched"); 14910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 14920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (type == WebView.HitTestResult.EDIT_TEXT_TYPE) { 14940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // let TextView handles context menu 14950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 14960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Note, http://b/issue?id=1106666 is requesting that 14990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // an inflated menu can be used again. This is not available 15000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // yet, so inflate each time (yuk!) 15010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project MenuInflater inflater = getMenuInflater(); 15020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inflater.inflate(R.menu.browsercontext, menu); 15030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Show the correct menu group 15050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String extra = result.getExtra(); 15060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.PHONE_MENU, 15070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project type == WebView.HitTestResult.PHONE_TYPE); 15080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.EMAIL_MENU, 15090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project type == WebView.HitTestResult.EMAIL_TYPE); 15100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.GEO_MENU, 15110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project type == WebView.HitTestResult.GEO_TYPE); 15120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.IMAGE_MENU, 15130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project type == WebView.HitTestResult.IMAGE_TYPE 15140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE); 15150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.ANCHOR_MENU, 15160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project type == WebView.HitTestResult.SRC_ANCHOR_TYPE 15170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE); 15180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Setup custom handling depending on the type 15200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (type) { 15210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.PHONE_TYPE: 15220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setHeaderTitle(Uri.decode(extra)); 15230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.dial_context_menu_id).setIntent( 15240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Intent(Intent.ACTION_VIEW, Uri 15250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .parse(WebView.SCHEME_TEL + extra))); 15260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent addIntent = new Intent(Intent.ACTION_INSERT_OR_EDIT); 15270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project addIntent.putExtra(Insert.PHONE, Uri.decode(extra)); 15280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project addIntent.setType(Contacts.People.CONTENT_ITEM_TYPE); 15290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.add_contact_context_menu_id).setIntent( 15300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project addIntent); 15310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.copy_phone_context_menu_id).setOnMenuItemClickListener( 15320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Copy(extra)); 15330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.EMAIL_TYPE: 15360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setHeaderTitle(extra); 15370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.email_context_menu_id).setIntent( 15380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Intent(Intent.ACTION_VIEW, Uri 15390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .parse(WebView.SCHEME_MAILTO + extra))); 15400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.copy_mail_context_menu_id).setOnMenuItemClickListener( 15410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Copy(extra)); 15420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.GEO_TYPE: 15450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setHeaderTitle(extra); 15460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.map_context_menu_id).setIntent( 15470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Intent(Intent.ACTION_VIEW, Uri 15480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .parse(WebView.SCHEME_GEO 15490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + URLEncoder.encode(extra)))); 15500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.copy_geo_context_menu_id).setOnMenuItemClickListener( 15510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Copy(extra)); 15520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.SRC_ANCHOR_TYPE: 15550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE: 15560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TextView titleView = (TextView) LayoutInflater.from(this) 15570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(android.R.layout.browser_link_context_header, 15580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project null); 15590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project titleView.setText(extra); 15600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setHeaderView(titleView); 15610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // decide whether to show the open link in new tab option 15620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.open_newtab_context_menu_id).setVisible( 15630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.getTabCount() < TabControl.MAX_TABS); 15640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project PackageManager pm = getPackageManager(); 15650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent send = new Intent(Intent.ACTION_SEND); 15660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project send.setType("text/plain"); 15670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ResolveInfo ri = pm.resolveActivity(send, PackageManager.MATCH_DEFAULT_ONLY); 15680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.share_link_context_menu_id).setVisible(ri != null); 15690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (type == WebView.HitTestResult.SRC_ANCHOR_TYPE) { 15700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // otherwise fall through to handle image part 15730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.IMAGE_TYPE: 15740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (type == WebView.HitTestResult.IMAGE_TYPE) { 15750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setHeaderTitle(extra); 15760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.view_image_context_menu_id).setIntent( 15780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Intent(Intent.ACTION_VIEW, Uri.parse(extra))); 15790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.download_context_menu_id). 15800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setOnMenuItemClickListener(new Download(extra)); 15810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project default: 15840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.w(LOGTAG, "We should not get here."); 15850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Attach the given tab to the content view. 15900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void attachTabToContentView(TabControl.Tab t) { 15912bc69918d97a767a02132090e58718077381ba1aSteve Block // Attach the container that contains the main WebView and any other UI 15922bc69918d97a767a02132090e58718077381ba1aSteve Block // associated with the tab. 15932bc69918d97a767a02132090e58718077381ba1aSteve Block mContentView.addView(t.getContainer(), COVER_SCREEN_PARAMS); 1594bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 1595bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch if (mShouldShowErrorConsole) { 1596bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch ErrorConsoleView errorConsole = mTabControl.getCurrentErrorConsole(true); 1597bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch if (errorConsole.numberOfErrors() == 0) { 1598bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch errorConsole.showConsole(ErrorConsoleView.SHOW_NONE); 1599bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } else { 1600bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch errorConsole.showConsole(ErrorConsoleView.SHOW_MINIMIZED); 1601bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 1602bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 1603bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch mErrorConsoleContainer.addView(errorConsole, 1604bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, 1605bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch ViewGroup.LayoutParams.WRAP_CONTENT)); 1606bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 1607bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 16080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Attach the sub window if necessary 16090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project attachSubWindow(t); 16100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Request focus on the top window. 16110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project t.getTopWindow().requestFocus(); 16120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Attach a sub window to the main WebView of the given tab. 16150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void attachSubWindow(TabControl.Tab t) { 16160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If a sub window exists, attach it to the content view. 16170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView subView = t.getSubWebView(); 16180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (subView != null) { 16190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final View container = t.getSubWebViewContainer(); 16200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mContentView.addView(container, COVER_SCREEN_PARAMS); 16210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project subView.requestFocus(); 16220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Remove the given tab from the content view. 16260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void removeTabFromContentView(TabControl.Tab t) { 16272bc69918d97a767a02132090e58718077381ba1aSteve Block // Remove the container that contains the main WebView. 16282bc69918d97a767a02132090e58718077381ba1aSteve Block mContentView.removeView(t.getContainer()); 1629bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 1630bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch if (mTabControl.getCurrentErrorConsole(false) != null) { 1631bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch mErrorConsoleContainer.removeView(mTabControl.getCurrentErrorConsole(false)); 1632bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 1633bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 16340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Remove the sub window if it exists. 16350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (t.getSubWebView() != null) { 16360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mContentView.removeView(t.getSubWebViewContainer()); 16370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Remove the sub window if it exists. Also called by TabControl when the 16410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // user clicks the 'X' to dismiss a sub window. 16420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ void dismissSubWindow(TabControl.Tab t) { 16430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView mainView = t.getWebView(); 16440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (t.getSubWebView() != null) { 16450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Remove the container view and request focus on the main WebView. 16460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mContentView.removeView(t.getSubWebViewContainer()); 16470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mainView.requestFocus(); 16480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Tell the TabControl to dismiss the subwindow. This will destroy 16490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the WebView. 16500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.dismissSubWindow(t); 16510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16541f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // A wrapper function of {@link #openTabAndShow(UrlData, boolean, String)} 165525ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima // that accepts url as string. 16561f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins private TabControl.Tab openTabAndShow(String url, boolean closeOnExit, 16571f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins String appId) { 16581f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins return openTabAndShow(new UrlData(url), closeOnExit, appId); 16590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // This method does a ton of stuff. It will attempt to create a new tab 16620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we haven't reached MAX_TABS. Otherwise it uses the current tab. If 16631f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // url isn't null, it will load the given url. 16641f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins /* package */ TabControl.Tab openTabAndShow(UrlData urlData, 1665f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project boolean closeOnExit, String appId) { 16660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final boolean newTab = mTabControl.getTabCount() != TabControl.MAX_TABS; 16670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final TabControl.Tab currentTab = mTabControl.getCurrentTab(); 16680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (newTab) { 16691f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins final TabControl.Tab tab = mTabControl.createNewTab( 16701f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins closeOnExit, appId, urlData.mUrl); 16711f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins WebView webview = tab.getWebView(); 16721f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (CUSTOM_BROWSER_BAR) { 16731f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins mTitleBar.addTab(webview, true); 16741f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 16751f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins removeTabFromContentView(currentTab); 16761f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins attachTabToContentView(tab); 16778bbd69f50abd537bfe7eb314b3a3e20241ac22bdPatrick Scott // We must set the new tab as the current tab to reflect the old 16788bbd69f50abd537bfe7eb314b3a3e20241ac22bdPatrick Scott // animation behavior. 16798bbd69f50abd537bfe7eb314b3a3e20241ac22bdPatrick Scott mTabControl.setCurrentTab(tab); 1680160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins if (!urlData.isEmpty()) { 16811f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins urlData.loadIn(webview); 16820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16831f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins return tab; 168464b80f3efd95d7b5192731e995ccde79c4c6c11fLeon Scroggins } else { 16851f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // Get rid of the subwindow if it exists 16861f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins dismissSubWindow(currentTab); 16871f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (!urlData.isEmpty()) { 16881f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // Load the given url. 16891f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins urlData.loadIn(currentTab.getWebView()); 16900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1692c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba return currentTab; 16930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1695c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba private TabControl.Tab openTab(String url) { 16960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mSettings.openInBackground()) { 1697f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project TabControl.Tab t = mTabControl.createNewTab(); 16980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (t != null) { 16991f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins WebView view = t.getWebView(); 17001f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (CUSTOM_BROWSER_BAR) { 17011f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins mTitleBar.addTab(view, false); 17021f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 17031f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins view.loadUrl(url); 17040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1705c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba return t; 17060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 17071f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins return openTabAndShow(url, false, null); 17080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private class Copy implements OnMenuItemClickListener { 17120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private CharSequence mText; 17130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onMenuItemClick(MenuItem item) { 17150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project copy(mText); 17160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 17170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public Copy(CharSequence toCopy) { 17200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mText = toCopy; 17210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private class Download implements OnMenuItemClickListener { 17250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String mText; 17260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onMenuItemClick(MenuItem item) { 17280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project onDownloadStartNoStream(mText, null, null, null, -1); 17290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 17300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public Download(String toDownload) { 17330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mText = toDownload; 17340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void copy(CharSequence text) { 17380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 17390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project IClipboard clip = IClipboard.Stub.asInterface(ServiceManager.getService("clipboard")); 17400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (clip != null) { 17410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project clip.setClipboardText(text); 17420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (android.os.RemoteException e) { 17440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(LOGTAG, "Copy failed", e); 17450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 17490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Resets the browser title-view to whatever it must be (for example, if we 17500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * load a page from history). 17510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 17520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void resetTitle() { 17530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetLockIcon(); 17540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleIconAndProgress(); 17550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 17580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Resets the browser title-view to whatever it must be 17590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * (for example, if we had a loading error) 17600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * When we have a new page, we call resetTitle, when we 17610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * have to reset the titlebar to whatever it used to be 17620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * (for example, if the user chose to stop loading), we 17630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * call resetTitleAndRevertLockIcon. 17640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 17650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ void resetTitleAndRevertLockIcon() { 17660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project revertLockIcon(); 17670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleIconAndProgress(); 17680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 17710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Reset the title, favicon, and progress. 17720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 17730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void resetTitleIconAndProgress() { 17740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView current = mTabControl.getCurrentWebView(); 17750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current == null) { 17760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 17770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleAndIcon(current); 17790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int progress = current.getProgress(); 17800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWebChromeClient.onProgressChanged(current, progress); 17810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Reset the title and the icon based on the given item. 17840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void resetTitleAndIcon(WebView view) { 17850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebHistoryItem item = view.copyBackForwardList().getCurrentItem(); 17860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (item != null) { 17871f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins setUrlTitle(item.getUrl(), item.getTitle(), view); 17880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setFavicon(item.getFavicon()); 17890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 17901f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins setUrlTitle(null, null, view); 17910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setFavicon(null); 17920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 17960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Sets a title composed of the URL and the title string. 17970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param url The URL of the site being loaded. 17980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param title The title of the site being loaded. 17990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 18001f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins private void setUrlTitle(String url, String title, WebView view) { 18010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mUrl = url; 18020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTitle = title; 18030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18041f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (CUSTOM_BROWSER_BAR) { 18051f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins mTitleBar.setTitleAndUrl(title, url, view); 18061f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } else { 18071f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins setTitle(buildUrlTitle(url, title)); 18080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 18120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Builds and returns the page title, which is some 18130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * combination of the page URL and title. 18140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param url The URL of the site being loaded. 18150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param title The title of the site being loaded. 18160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @return The page title. 18170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 18180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String buildUrlTitle(String url, String title) { 18190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String urlTitle = ""; 18200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null) { 18220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String titleUrl = buildTitleUrl(url); 18230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (title != null && 0 < title.length()) { 18250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (titleUrl != null && 0 < titleUrl.length()) { 18260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project urlTitle = titleUrl + ": " + title; 18270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 18280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project urlTitle = title; 18290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 18310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (titleUrl != null) { 18320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project urlTitle = titleUrl; 18330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return urlTitle; 18380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 18410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param url The URL to build a title version of the URL from. 18420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @return The title version of the URL or null if fails. 18430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * The title version of the URL can be either the URL hostname, 18440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * or the hostname with an "https://" prefix (for secure URLs), 18450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * or an empty string if, for example, the URL in question is a 18460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * file:// URL with no hostname. 18470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 184832e14a6deccfa75490b3032bb4ddd5ae90f89de8Leon Scroggins /* package */ static String buildTitleUrl(String url) { 18490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String titleUrl = null; 18500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null) { 18520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 18530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // parse the url string 18540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project URL urlObj = new URL(url); 18550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (urlObj != null) { 18560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project titleUrl = ""; 18570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String protocol = urlObj.getProtocol(); 18590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String host = urlObj.getHost(); 18600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (host != null && 0 < host.length()) { 18620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project titleUrl = host; 18630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (protocol != null) { 18640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if a secure site, add an "https://" prefix! 18650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (protocol.equalsIgnoreCase("https")) { 18660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project titleUrl = protocol + "://" + host; 18670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (MalformedURLException e) {} 18720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return titleUrl; 18750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Set the favicon in the title bar. 18780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void setFavicon(Bitmap icon) { 187981db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins if (CUSTOM_BROWSER_BAR) { 188081db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins Drawable[] array = new Drawable[3]; 188181db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins array[0] = new PaintDrawable(Color.BLACK); 188281db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins PaintDrawable p = new PaintDrawable(Color.WHITE); 188381db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins array[1] = p; 188481db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins if (icon == null) { 188581db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins array[2] = mGenericFavicon; 188681db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins } else { 188781db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins array[2] = new BitmapDrawable(icon); 188881db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins } 188981db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins LayerDrawable d = new LayerDrawable(array); 189081db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins d.setLayerInset(1, 1, 1, 1, 1); 189181db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins d.setLayerInset(2, 2, 2, 2, 2); 18921f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins mTitleBar.setFavicon(d, getTopWindow()); 18930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 189481db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins Drawable[] array = new Drawable[2]; 189581db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins PaintDrawable p = new PaintDrawable(Color.WHITE); 189681db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins p.setCornerRadius(3f); 189781db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins array[0] = p; 189881db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins if (icon == null) { 189981db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins array[1] = mGenericFavicon; 190081db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins } else { 190181db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins array[1] = new BitmapDrawable(icon); 190281db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins } 190381db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins LayerDrawable d = new LayerDrawable(array); 190481db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins d.setLayerInset(1, 2, 2, 2, 2); 190581db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins getWindow().setFeatureDrawable(Window.FEATURE_LEFT_ICON, d); 19060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 19100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Saves the current lock-icon state before resetting 19110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * the lock icon. If we have an error, we may need to 19120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * roll back to the previous state. 19130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 19140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void saveLockIcon() { 19150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPrevLockType = mLockIconType; 19160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 19190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Reverts the lock-icon state to the last saved state, 19200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * for example, if we had an error, and need to cancel 19210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * the load. 19220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 19230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void revertLockIcon() { 19240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mLockIconType = mPrevLockType; 19250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 192631a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 19270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, "BrowserActivity.revertLockIcon:" + 19280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project " revert lock icon to " + mLockIconType); 19290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project updateLockIconImage(mLockIconType); 19320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19341f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins /** 19351f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins * Close the tab after removing its associated title bar. 19361f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins */ 19371f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins private void closeTab(TabControl.Tab t) { 1938a11b75a4ef9cb8e264e59e3d2aadd56cf62e2afeLeon Scroggins if (CUSTOM_BROWSER_BAR) { 1939a11b75a4ef9cb8e264e59e3d2aadd56cf62e2afeLeon Scroggins mTitleBar.removeTab(mTabControl.getTabIndex(t)); 1940a11b75a4ef9cb8e264e59e3d2aadd56cf62e2afeLeon Scroggins } 19411f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins mTabControl.removeTab(t); 19420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void goBackOnePageOrQuit() { 19450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TabControl.Tab current = mTabControl.getCurrentTab(); 19460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current == null) { 19470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* 19480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Instead of finishing the activity, simply push this to the back 19490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * of the stack and let ActivityManager to choose the foreground 19500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * activity. As BrowserActivity is singleTask, it will be always the 19510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * root of the task. So we can use either true or false for 19520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * moveTaskToBack(). 19530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 19540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project moveTaskToBack(true); 19550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = current.getWebView(); 19570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w.canGoBack()) { 19580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.goBack(); 19590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 19600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Check to see if we are closing a window that was created by 19610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // another window. If so, we switch back to that window. 19620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TabControl.Tab parent = current.getParentTab(); 19630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (parent != null) { 19641f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins switchToTab(mTabControl.getTabIndex(parent)); 19651f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // Now we close the other tab 19661f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins closeTab(current); 19670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 19680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current.closeOnExit()) { 19690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabControl.getTabCount() == 1) { 19700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project finish(); 19710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 19720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19737bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed // call pauseWebViewTimers() now, we won't be able to call 19747bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed // it in onPause() as the WebView won't be valid. 19757bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed pauseWebViewTimers(); 19760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project removeTabFromContentView(current); 19770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.removeTab(current); 19780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* 19800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Instead of finishing the activity, simply push this to the back 19810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * of the stack and let ActivityManager to choose the foreground 19820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * activity. As BrowserActivity is singleTask, it will be always the 19830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * root of the task. So we can use either true or false for 19840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * moveTaskToBack(). 19850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 19860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project moveTaskToBack(true); 19870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public KeyTracker.State onKeyTracker(int keyCode, 19920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project KeyEvent event, 19930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project KeyTracker.Stage stage, 19940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int duration) { 19950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if onKeyTracker() is called after activity onStop() 19960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // because of accumulated key events, 19970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // we should ignore it as browser is not active any more. 19980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView topWindow = getTopWindow(); 1999adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu if (topWindow == null && mCustomView == null) 20000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return KeyTracker.State.NOT_TRACKING; 20010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (keyCode == KeyEvent.KEYCODE_BACK) { 2003adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu // Check if a custom view is currently showing and, if it is, hide it. 2004adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu if (mCustomView != null) { 2005adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu mWebChromeClient.onHideCustomView(); 2006adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu return KeyTracker.State.DONE_TRACKING; 2007adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu } 20080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (stage == KeyTracker.Stage.LONG_REPEAT) { 2009160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins bookmarksOrHistoryPicker(true, false); 20100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return KeyTracker.State.DONE_TRACKING; 20110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (stage == KeyTracker.Stage.UP) { 20120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // FIXME: Currently, we do not have a notion of the 20130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // history picker for the subwindow, but maybe we 20140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // should? 20150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView subwindow = mTabControl.getCurrentSubWindow(); 20160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (subwindow != null) { 20170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (subwindow.canGoBack()) { 20180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project subwindow.goBack(); 20190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 20200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dismissSubWindow(mTabControl.getCurrentTab()); 20210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 20230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project goBackOnePageOrQuit(); 20240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return KeyTracker.State.DONE_TRACKING; 20260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return KeyTracker.State.KEEP_TRACKING; 20280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return KeyTracker.State.NOT_TRACKING; 20300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override public boolean onKeyDown(int keyCode, KeyEvent event) { 20330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (keyCode == KeyEvent.KEYCODE_MENU) { 20340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenuIsDown = true; 20356ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba } else if (mMenuIsDown) { 20366ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba // The default key mode is DEFAULT_KEYS_SEARCH_LOCAL. As the MENU is 20376ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba // still down, we don't want to trigger the search. Pretend to 20386ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba // consume the key and do nothing. 20396ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba return true; 20400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean handled = mKeyTracker.doKeyDown(keyCode, event); 20420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!handled) { 20430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (keyCode) { 20440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case KeyEvent.KEYCODE_SPACE: 20450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (event.isShiftPressed()) { 20460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().pageUp(false); 20470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 20480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().pageDown(false); 20490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handled = true; 20510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 20520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project default: 20540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 20550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return handled || super.onKeyDown(keyCode, event); 20580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override public boolean onKeyUp(int keyCode, KeyEvent event) { 20610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (keyCode == KeyEvent.KEYCODE_MENU) { 20620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenuIsDown = false; 20630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return mKeyTracker.doKeyUp(keyCode, event) || super.onKeyUp(keyCode, event); 20650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void stopLoading() { 20680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleAndRevertLockIcon(); 20690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = getTopWindow(); 20700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.stopLoading(); 20710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWebViewClient.onPageFinished(w, w.getUrl()); 20720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project cancelStopToast(); 20740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mStopToast = Toast 20750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .makeText(this, R.string.stopping, Toast.LENGTH_SHORT); 20760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mStopToast.show(); 20770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void cancelStopToast() { 20800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mStopToast != null) { 20810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mStopToast.cancel(); 20820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mStopToast = null; 20830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // called by a non-UI thread to post the message 20870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void postMessage(int what, int arg1, int arg2, Object obj) { 20880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.sendMessage(mHandler.obtainMessage(what, arg1, arg2, obj)); 20890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // public message ids 20920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public final static int LOAD_URL = 1001; 20930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public final static int STOP_LOAD = 1002; 20940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Message Ids 20960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static final int FOCUS_NODE_HREF = 102; 20970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static final int CANCEL_CREDS_REQUEST = 103; 209892c18a52ca7a79c114028b5ba22c3dfe443bd1a4Grace Kloba private static final int RELEASE_WAKELOCK = 107; 20990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 21000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Private handler for handling javascript and saving passwords 21010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Handler mHandler = new Handler() { 21020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 21030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void handleMessage(Message msg) { 21040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (msg.what) { 21050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case FOCUS_NODE_HREF: 21060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String url = (String) msg.getData().get("url"); 21070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url == null || url.length() == 0) { 21080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 21090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project HashMap focusNodeMap = (HashMap) msg.obj; 21110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView view = (WebView) focusNodeMap.get("webview"); 21120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Only apply the action if the top window did not change. 21130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (getTopWindow() != view) { 21140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 21150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (msg.arg1) { 21170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.open_context_menu_id: 21180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.view_image_context_menu_id: 21190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project loadURL(getTopWindow(), url); 21200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 21210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.open_newtab_context_menu_id: 2122c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba final TabControl.Tab parent = mTabControl 2123c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba .getCurrentTab(); 2124c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba final TabControl.Tab newTab = openTab(url); 2125c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba if (newTab != parent) { 2126c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba parent.addChildTab(newTab); 2127c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba } 21280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 21290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.bookmark_context_menu_id: 21300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent = new Intent(BrowserActivity.this, 21310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project AddBookmarkPage.class); 21320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.putExtra("url", url); 21330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project startActivity(intent); 21340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 21350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.share_link_context_menu_id: 21360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Browser.sendString(BrowserActivity.this, url); 21370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 21380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.copy_link_context_menu_id: 21390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project copy(url); 21400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 21410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.save_link_context_menu_id: 21420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.download_context_menu_id: 21430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project onDownloadStartNoStream(url, null, null, null, -1); 21440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 21450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 21470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 21480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case LOAD_URL: 21490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project loadURL(getTopWindow(), (String) msg.obj); 21500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 21510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 21520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case STOP_LOAD: 21530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project stopLoading(); 21540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 21550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 21560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case CANCEL_CREDS_REQUEST: 21570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resumeAfterCredentials(); 21580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 21590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 21600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case RELEASE_WAKELOCK: 21610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mWakeLock.isHeld()) { 21620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWakeLock.release(); 21630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 21650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 21680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 216989c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins private void updateScreenshot(WebView view) { 217089c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins // If this is a bookmarked site, add a screenshot to the database. 217189c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins // FIXME: When should we update? Every time? 217289c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins // FIXME: Would like to make sure there is actually something to 217389c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins // draw, but the API for that (WebViewCore.pictureReady()) is not 217489c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins // currently accessible here. 21753918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott ContentResolver cr = getContentResolver(); 21763918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott final Cursor c = BrowserBookmarksAdapter.queryBookmarksForUrl( 2177a5d669e4c08f0e64387c2c539c41a26ac8c845abLeon Scroggins cr, view.getOriginalUrl(), view.getUrl(), false); 21783918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott if (c != null) { 217989c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins boolean succeed = c.moveToFirst(); 218089c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins ContentValues values = null; 218189c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins while (succeed) { 218289c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins if (values == null) { 218389c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins final ByteArrayOutputStream os 218489c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins = new ByteArrayOutputStream(); 218589c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins Picture thumbnail = view.capturePicture(); 218689c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins // Keep width and height in sync with BrowserBookmarksPage 218789c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins // and bookmark_thumb 218889c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins Bitmap bm = Bitmap.createBitmap(100, 80, 218989c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins Bitmap.Config.ARGB_4444); 219089c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins Canvas canvas = new Canvas(bm); 219189c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins // May need to tweak these values to determine what is the 219289c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins // best scale factor 219389c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins canvas.scale(.5f, .5f); 219489c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins thumbnail.draw(canvas); 219589c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins bm.compress(Bitmap.CompressFormat.PNG, 100, os); 219689c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins values = new ContentValues(); 219789c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins values.put(Browser.BookmarkColumns.THUMBNAIL, 219889c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins os.toByteArray()); 219989c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins } 220089c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins cr.update(ContentUris.withAppendedId(Browser.BOOKMARKS_URI, 220189c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins c.getInt(0)), values, null, null); 220289c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins succeed = c.moveToNext(); 220389c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins } 220489c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins c.close(); 220589c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins } 220689c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins } 220789c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins 22080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // ------------------------------------------------------------------------- 22090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // WebViewClient implementation. 22100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //------------------------------------------------------------------------- 22110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Use in overrideUrlLoading 22130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ final static String SCHEME_WTAI = "wtai://wp/"; 22140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ final static String SCHEME_WTAI_MC = "wtai://wp/mc;"; 22150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ final static String SCHEME_WTAI_SD = "wtai://wp/sd;"; 22160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ final static String SCHEME_WTAI_AP = "wtai://wp/ap;"; 22170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ WebViewClient getWebViewClient() { 22190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return mWebViewClient; 22200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22223918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott private void updateIcon(WebView view, Bitmap icon) { 22230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (icon != null) { 22240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserBookmarksAdapter.updateBookmarkFavicon(mResolver, 22253918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott view, icon); 22260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setFavicon(icon); 22280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final WebViewClient mWebViewClient = new WebViewClient() { 22310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 22320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onPageStarted(WebView view, String url, Bitmap favicon) { 22330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetLockIcon(url); 22341f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins setUrlTitle(url, null, view); 2235bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 2236bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch ErrorConsoleView errorConsole = mTabControl.getCurrentErrorConsole(false); 2237bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch if (errorConsole != null) { 2238bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch errorConsole.clearErrorMessages(); 2239bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch if (mShouldShowErrorConsole) { 2240bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch errorConsole.showConsole(ErrorConsoleView.SHOW_NONE); 2241bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 2242bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 2243bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 22440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Call updateIcon instead of setFavicon so the bookmark 22450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // database can be updated. 22463918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott updateIcon(view, favicon); 22470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22484d7880fe3061ed691d220e64cd9e54a8c7b2d1bfGrace Kloba if (mSettings.isTracing()) { 22490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String host; 22500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 22510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebAddress uri = new WebAddress(url); 22520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project host = uri.mHost; 22530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (android.net.ParseException ex) { 22544d7880fe3061ed691d220e64cd9e54a8c7b2d1bfGrace Kloba host = "browser"; 22550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project host = host.replace('.', '_'); 22574d7880fe3061ed691d220e64cd9e54a8c7b2d1bfGrace Kloba host += ".trace"; 22580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mInTrace = true; 22594d7880fe3061ed691d220e64cd9e54a8c7b2d1bfGrace Kloba Debug.startMethodTracing(host, 20 * 1024 * 1024); 22600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Performance probe 22630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (false) { 22640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mStart = SystemClock.uptimeMillis(); 22650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mProcessStart = Process.getElapsedCpuTime(); 22660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project long[] sysCpu = new long[7]; 22670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (Process.readProcFile("/proc/stat", SYSTEM_CPU_FORMAT, null, 22680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sysCpu, null)) { 22690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mUserStart = sysCpu[0] + sysCpu[1]; 22700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSystemStart = sysCpu[2]; 22710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mIdleStart = sysCpu[3]; 22720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mIrqStart = sysCpu[4] + sysCpu[5] + sysCpu[6]; 22730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mUiStart = SystemClock.currentThreadTimeMillis(); 22750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!mPageStarted) { 22780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageStarted = true; 22797bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed // if onResume() has been called, resumeWebViewTimers() does 22807bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed // nothing. 22817bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed resumeWebViewTimers(); 22820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // reset sync timer to avoid sync starts during loading a page 22850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project CookieSyncManager.getInstance().resetSync(); 22860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mInLoad = true; 22880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project updateInLoadMenuItems(); 22890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!mIsNetworkUp) { 22900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if ( mAlertDialog == null) { 22910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mAlertDialog = new AlertDialog.Builder(BrowserActivity.this) 22920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.loadSuspendedTitle) 22930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setMessage(R.string.loadSuspended) 22940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, null) 22950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 22960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (view != null) { 22980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project view.setNetworkAvailable(false); 22990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 23030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 23040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onPageFinished(WebView view, String url) { 23050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Reset the title and icon in case we stopped a provisional 23060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // load. 23070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleAndIcon(view); 23080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 23090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Update the lock icon image only once we are done loading 23100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project updateLockIconImage(mLockIconType); 231189c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins updateScreenshot(view); 2312b6b7f9ef3b4ed220063f555d8b7c205210a61a04Leon Scroggins 23130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Performance probe 2314cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project if (false) { 23150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project long[] sysCpu = new long[7]; 23160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (Process.readProcFile("/proc/stat", SYSTEM_CPU_FORMAT, null, 23170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sysCpu, null)) { 23180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String uiInfo = "UI thread used " 23190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + (SystemClock.currentThreadTimeMillis() - mUiStart) 23200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + " ms"; 232131a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGD_ENABLED) { 23220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.d(LOGTAG, uiInfo); 23230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //The string that gets written to the log 23250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String performanceString = "It took total " 23260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + (SystemClock.uptimeMillis() - mStart) 23270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + " ms clock time to load the page." 23280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + "\nbrowser process used " 23290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + (Process.getElapsedCpuTime() - mProcessStart) 23300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + " ms, user processes used " 23310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + (sysCpu[0] + sysCpu[1] - mUserStart) * 10 23320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + " ms, kernel used " 23330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + (sysCpu[2] - mSystemStart) * 10 23340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + " ms, idle took " + (sysCpu[3] - mIdleStart) * 10 23350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + " ms and irq took " 23360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + (sysCpu[4] + sysCpu[5] + sysCpu[6] - mIrqStart) 23370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 10 + " ms, " + uiInfo; 233831a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGD_ENABLED) { 23390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.d(LOGTAG, performanceString + "\nWebpage: " + url); 23400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null) { 23420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // strip the url to maintain consistency 23430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String newUrl = new String(url); 23440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (newUrl.startsWith("http://www.")) { 23450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project newUrl = newUrl.substring(11); 23460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (newUrl.startsWith("http://")) { 23470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project newUrl = newUrl.substring(7); 23480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (newUrl.startsWith("https://www.")) { 23490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project newUrl = newUrl.substring(12); 23500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (newUrl.startsWith("https://")) { 23510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project newUrl = newUrl.substring(8); 23520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 235331a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGD_ENABLED) { 23540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.d(LOGTAG, newUrl + " loaded"); 23550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* 23570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (sWhiteList.contains(newUrl)) { 23580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // The string that gets pushed to the statistcs 23590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // service 23600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project performanceString = performanceString 23610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + "\nWebpage: " 23620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + newUrl 23630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + "\nCarrier: " 23640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + android.os.SystemProperties 23650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .get("gsm.sim.operator.alpha"); 23660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mWebView != null 23670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project && mWebView.getContext() != null 23680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project && mWebView.getContext().getSystemService( 23690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Context.CONNECTIVITY_SERVICE) != null) { 23700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ConnectivityManager cManager = 23710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (ConnectivityManager) mWebView 23720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .getContext().getSystemService( 23730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Context.CONNECTIVITY_SERVICE); 23740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project NetworkInfo nInfo = cManager 23750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .getActiveNetworkInfo(); 23760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (nInfo != null) { 23770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project performanceString = performanceString 23780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + "\nNetwork Type: " 23790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + nInfo.getType().toString(); 23800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Checkin.logEvent(mResolver, 23830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Checkin.Events.Tag.WEBPAGE_LOAD, 23840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project performanceString); 23850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.w(LOGTAG, "pushed to the statistics service"); 23860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 23880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 23920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mInTrace) { 23930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mInTrace = false; 23940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Debug.stopMethodTracing(); 23950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 23970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mPageStarted) { 23980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageStarted = false; 23997bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed // pauseWebViewTimers() will do nothing and return false if 24007bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed // onPause() is not called yet. 24017bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed if (pauseWebViewTimers()) { 24020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mWakeLock.isHeld()) { 24030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.removeMessages(RELEASE_WAKELOCK); 24040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWakeLock.release(); 24050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 24100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // return true if want to hijack the url to let another app to handle it 24110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 24120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean shouldOverrideUrlLoading(WebView view, String url) { 24130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url.startsWith(SCHEME_WTAI)) { 24140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // wtai://wp/mc;number 24150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // number=string(phone-number) 24160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url.startsWith(SCHEME_WTAI_MC)) { 24170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent = new Intent(Intent.ACTION_VIEW, 24180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Uri.parse(WebView.SCHEME_TEL + 24190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url.substring(SCHEME_WTAI_MC.length()))); 24200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project startActivity(intent); 24210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 24220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // wtai://wp/sd;dtmf 24240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // dtmf=string(dialstring) 24250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url.startsWith(SCHEME_WTAI_SD)) { 24260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // TODO 24270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // only send when there is active voice connection 24280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 24290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // wtai://wp/ap;number;name 24310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // number=string(phone-number) 24320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // name=string 24330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url.startsWith(SCHEME_WTAI_AP)) { 24340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // TODO 24350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 24360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 24399918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn // The "about:" schemes are internal to the browser; don't 24409918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn // want these to be dispatched to other apps. 24419918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn if (url.startsWith("about:")) { 24429918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn return false; 24439918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn } 2444bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 24459918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn Intent intent; 2446bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 24479918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn // perform generic parsing of the URI to turn it into an Intent. 24480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 24499918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME); 24509918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn } catch (URISyntaxException ex) { 24519918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn Log.w("Browser", "Bad URI " + url + ": " + ex.getMessage()); 24520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 24530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 24555b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba // check whether the intent can be resolved. If not, we will see 24565b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba // whether we can download it from the Market. 24575b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba if (getPackageManager().resolveActivity(intent, 0) == null) { 24585b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba String packagename = intent.getPackage(); 24595b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba if (packagename != null) { 24605b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba intent = new Intent(Intent.ACTION_VIEW, Uri 24615b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba .parse("market://search?q=pname:" + packagename)); 24625b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba intent.addCategory(Intent.CATEGORY_BROWSABLE); 24635b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba startActivity(intent); 24645b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba return true; 24655b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba } else { 24665b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba return false; 24675b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba } 24685b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba } 24695b078b5b8f166a14ab88137e478f868959c5befaGrace Kloba 24709918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn // sanitize the Intent, ensuring web pages can not bypass browser 24719918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn // security (only access to BROWSABLE activities). 24720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.addCategory(Intent.CATEGORY_BROWSABLE); 24739918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn intent.setComponent(null); 24740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 24750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (startActivityIfNeeded(intent, -1)) { 24760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 24770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (ActivityNotFoundException ex) { 24790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // ignore the error. If no application can handle the URL, 24800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // eg about:blank, assume the browser can handle it. 24810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 24830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mMenuIsDown) { 24840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project openTab(url); 24850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project closeOptionsMenu(); 24860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 24870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 24890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 24900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 24920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 24930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Updates the lock icon. This method is called when we discover another 24940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * resource to be loaded for this page (for example, javascript). While 24950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * we update the icon type, we do not update the lock icon itself until 24960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * we are done loading, it is slightly more secure this way. 24970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 24980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 24990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onLoadResource(WebView view, String url) { 25000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null && url.length() > 0) { 25010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // It is only if the page claims to be secure 25020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // that we may have to update the lock: 25030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mLockIconType == LOCK_ICON_SECURE) { 25040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If NOT a 'safe' url, change the lock to mixed content! 25050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!(URLUtil.isHttpsUrl(url) || URLUtil.isDataUrl(url) || URLUtil.isAboutUrl(url))) { 25060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mLockIconType = LOCK_ICON_MIXED; 250731a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 25080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, "BrowserActivity.updateLockIcon:" + 25090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project " updated lock icon to " + mLockIconType + " due to " + url); 25100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 25160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 25170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Show the dialog, asking the user if they would like to continue after 25180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * an excessive number of HTTP redirects. 25190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 25200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 25210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onTooManyRedirects(WebView view, final Message cancelMsg, 25220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Message continueMsg) { 25230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(BrowserActivity.this) 25240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.browserFrameRedirect) 25250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setMessage(R.string.browserFrame307Post) 25260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 25270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, int which) { 25280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project continueMsg.sendToTarget(); 25290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 25300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 25310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, int which) { 25320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project cancelMsg.sendToTarget(); 25330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 25340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setOnCancelListener(new OnCancelListener() { 25350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCancel(DialogInterface dialog) { 25360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project cancelMsg.sendToTarget(); 25370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 25380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 25390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 254137911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott // Container class for the next error dialog that needs to be 254237911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott // displayed. 254337911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott class ErrorDialog { 254437911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott public final int mTitle; 254537911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott public final String mDescription; 254637911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott public final int mError; 254737911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott ErrorDialog(int title, String desc, int error) { 254837911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott mTitle = title; 254937911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott mDescription = desc; 255037911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott mError = error; 255137911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott } 255237911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott }; 255337911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott 255437911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott private void processNextError() { 255537911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott if (mQueuedErrors == null) { 255637911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott return; 255737911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott } 255837911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott // The first one is currently displayed so just remove it. 255937911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott mQueuedErrors.removeFirst(); 256037911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott if (mQueuedErrors.size() == 0) { 256137911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott mQueuedErrors = null; 256237911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott return; 256337911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott } 256437911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott showError(mQueuedErrors.getFirst()); 256537911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott } 256637911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott 256737911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott private DialogInterface.OnDismissListener mDialogListener = 256837911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott new DialogInterface.OnDismissListener() { 256937911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott public void onDismiss(DialogInterface d) { 257037911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott processNextError(); 257137911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott } 257237911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott }; 257337911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott private LinkedList<ErrorDialog> mQueuedErrors; 257437911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott 257537911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott private void queueError(int err, String desc) { 257637911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott if (mQueuedErrors == null) { 257737911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott mQueuedErrors = new LinkedList<ErrorDialog>(); 257837911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott } 257937911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott for (ErrorDialog d : mQueuedErrors) { 258037911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott if (d.mError == err) { 258137911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott // Already saw a similar error, ignore the new one. 258237911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott return; 258337911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott } 258437911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott } 258537911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott ErrorDialog errDialog = new ErrorDialog( 258637911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott err == EventHandler.FILE_NOT_FOUND_ERROR ? 258737911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott R.string.browserFrameFileErrorLabel : 258837911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott R.string.browserFrameNetworkErrorLabel, 258937911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott desc, err); 259037911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott mQueuedErrors.addLast(errDialog); 259137911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott 259237911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott // Show the dialog now if the queue was empty. 259337911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott if (mQueuedErrors.size() == 1) { 259437911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott showError(errDialog); 259537911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott } 259637911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott } 259737911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott 259837911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott private void showError(ErrorDialog errDialog) { 259937911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott AlertDialog d = new AlertDialog.Builder(BrowserActivity.this) 260037911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott .setTitle(errDialog.mTitle) 260137911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott .setMessage(errDialog.mDescription) 260237911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott .setPositiveButton(R.string.ok, null) 260337911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott .create(); 260437911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott d.setOnDismissListener(mDialogListener); 260537911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott d.show(); 260637911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott } 260737911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott 26080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 26090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Show a dialog informing the user of the network error reported by 26100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * WebCore. 26110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 26120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 26130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onReceivedError(WebView view, int errorCode, 26140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String description, String failingUrl) { 26150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (errorCode != EventHandler.ERROR_LOOKUP && 26160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project errorCode != EventHandler.ERROR_CONNECT && 26170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project errorCode != EventHandler.ERROR_BAD_URL && 26180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project errorCode != EventHandler.ERROR_UNSUPPORTED_SCHEME && 26190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project errorCode != EventHandler.FILE_ERROR) { 262037911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott queueError(errorCode, description); 26210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 262237911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott Log.e(LOGTAG, "onReceivedError " + errorCode + " " + failingUrl 262337911c78a0647567fd9fa49125e7de37455b2d5aPatrick Scott + " " + description); 26240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 26250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // We need to reset the title after an error. 26260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleAndRevertLockIcon(); 26270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 26290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 26300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Check with the user if it is ok to resend POST data as the page they 26310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * are trying to navigate to is the result of a POST. 26320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 26330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 26340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onFormResubmission(WebView view, final Message dontResend, 26350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Message resend) { 26360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(BrowserActivity.this) 26370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.browserFrameFormResubmitLabel) 26380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setMessage(R.string.browserFrameFormResubmitMessage) 26390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 26400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, int which) { 26410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resend.sendToTarget(); 26420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 26430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 26440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, int which) { 26450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dontResend.sendToTarget(); 26460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 26470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setOnCancelListener(new OnCancelListener() { 26480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCancel(DialogInterface dialog) { 26490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dontResend.sendToTarget(); 26500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 26510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 26520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 26540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 26550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Insert the url into the visited history database. 26560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param url The url to be inserted. 26570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param isReload True if this url is being reloaded. 26580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * FIXME: Not sure what to do when reloading the page. 26590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 26600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 26610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void doUpdateVisitedHistory(WebView view, String url, 26620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean isReload) { 26630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url.regionMatches(true, 0, "about:", 0, 6)) { 26640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 26650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Browser.updateVisitedHistory(mResolver, url, true); 26670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebIconDatabase.getInstance().retainIconForPageUrl(url); 26680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 26700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 26710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Displays SSL error(s) dialog to the user. 26720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 26730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 26740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onReceivedSslError( 26750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView view, final SslErrorHandler handler, final SslError error) { 26760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 26770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mSettings.showSecurityWarnings()) { 26780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final LayoutInflater factory = 26790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LayoutInflater.from(BrowserActivity.this); 26800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final View warningsView = 26810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project factory.inflate(R.layout.ssl_warnings, null); 26820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final LinearLayout placeholder = 26830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (LinearLayout)warningsView.findViewById(R.id.placeholder); 26840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 26850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_UNTRUSTED)) { 26860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 26870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, null); 26880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 26890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_untrusted); 26900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project placeholder.addView(ll); 26910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 26930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_IDMISMATCH)) { 26940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 26950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, null); 26960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 26970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_mismatch); 26980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project placeholder.addView(ll); 26990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 27010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_EXPIRED)) { 27020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 27030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, null); 27040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 27050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_expired); 27060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project placeholder.addView(ll); 27070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 27090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_NOTYETVALID)) { 27100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 27110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, null); 27120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 27130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_not_yet_valid); 27140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project placeholder.addView(ll); 27150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 27170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(BrowserActivity.this) 27180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.security_warning) 27190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setIcon(android.R.drawable.ic_dialog_alert) 27200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setView(warningsView) 27210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ssl_continue, 27220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 27230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, int whichButton) { 27240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.proceed(); 27250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 27270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setNeutralButton(R.string.view_certificate, 27280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 27290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, int whichButton) { 27300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificateOnError(view, handler, error); 27310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 27330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setNegativeButton(R.string.cancel, 27340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 27350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, int whichButton) { 27360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.cancel(); 27370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserActivity.this.resetTitleAndRevertLockIcon(); 27380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 27400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setOnCancelListener( 27410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnCancelListener() { 27420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCancel(DialogInterface dialog) { 27430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.cancel(); 27440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserActivity.this.resetTitleAndRevertLockIcon(); 27450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 27470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 27480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 27490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.proceed(); 27500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 27530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 27540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Handles an HTTP authentication request. 27550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 27560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param handler The authentication handler 27570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param host The host 27580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param realm The realm 27590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 27600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 27610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onReceivedHttpAuthRequest(WebView view, 27620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final HttpAuthHandler handler, final String host, final String realm) { 27630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String username = null; 27640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String password = null; 27650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 27660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean reuseHttpAuthUsernamePassword = 27670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.useHttpAuthUsernamePassword(); 27680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 27690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (reuseHttpAuthUsernamePassword && 27700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (mTabControl.getCurrentWebView() != null)) { 27710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String[] credentials = 27720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.getCurrentWebView() 27730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .getHttpAuthUsernamePassword(host, realm); 27740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (credentials != null && credentials.length == 2) { 27750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project username = credentials[0]; 27760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project password = credentials[1]; 27770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 27800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (username != null && password != null) { 27810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.proceed(username, password); 27820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 27830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showHttpAuthentication(handler, host, realm, null, null, null, 0); 27840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 27870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 27880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) { 27890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mMenuIsDown) { 27900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // only check shortcut key when MENU is held 27910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return getWindow().isShortcutKey(event.getKeyCode(), event); 27920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 27930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 27940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 27970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 27980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onUnhandledKeyEvent(WebView view, KeyEvent event) { 27990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (view != mTabControl.getCurrentTopWebView()) { 28000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 28010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (event.isDown()) { 28030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserActivity.this.onKeyDown(event.getKeyCode(), event); 28040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 28050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserActivity.this.onKeyUp(event.getKeyCode(), event); 28060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 28090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 28100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //-------------------------------------------------------------------------- 28110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // WebChromeClient implementation 28120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //-------------------------------------------------------------------------- 28130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 28140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ WebChromeClient getWebChromeClient() { 28150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return mWebChromeClient; 28160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 28180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final WebChromeClient mWebChromeClient = new WebChromeClient() { 28190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Helper method to create a new tab or sub window. 28200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void createWindow(final boolean dialog, final Message msg) { 28210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (dialog) { 28220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.createSubWindow(); 28230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final TabControl.Tab t = mTabControl.getCurrentTab(); 28240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project attachSubWindow(t); 28250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView.WebViewTransport transport = 28260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (WebView.WebViewTransport) msg.obj; 28270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project transport.setWebView(t.getSubWebView()); 28280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project msg.sendToTarget(); 28290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 28300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final TabControl.Tab parent = mTabControl.getCurrentTab(); 28311f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins final TabControl.Tab newTab 28321f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins = openTabAndShow(EMPTY_URL_DATA, false, null); 2833c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba if (newTab != parent) { 2834c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba parent.addChildTab(newTab); 2835c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba } 28360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView.WebViewTransport transport = 28370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (WebView.WebViewTransport) msg.obj; 28380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project transport.setWebView(mTabControl.getCurrentWebView()); 28391f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins msg.sendToTarget(); 28400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 28430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 28444943a31bc64286a06b0659636cc13b4b67c30589Leon Scroggins public void onChangeViewingMode(boolean toZoomedOut) { 28454943a31bc64286a06b0659636cc13b4b67c30589Leon Scroggins if (!CUSTOM_BROWSER_BAR) { 28464943a31bc64286a06b0659636cc13b4b67c30589Leon Scroggins return; 28474943a31bc64286a06b0659636cc13b4b67c30589Leon Scroggins } 28484943a31bc64286a06b0659636cc13b4b67c30589Leon Scroggins if (toZoomedOut) { 28494943a31bc64286a06b0659636cc13b4b67c30589Leon Scroggins // FIXME: animate the title bar into view 28504943a31bc64286a06b0659636cc13b4b67c30589Leon Scroggins mTitleBar.setVisibility(View.VISIBLE); 28514943a31bc64286a06b0659636cc13b4b67c30589Leon Scroggins } else { 28524943a31bc64286a06b0659636cc13b4b67c30589Leon Scroggins // FXIME: animate the title bar out of view 28534943a31bc64286a06b0659636cc13b4b67c30589Leon Scroggins mTitleBar.setVisibility(View.GONE); 28544943a31bc64286a06b0659636cc13b4b67c30589Leon Scroggins } 28554943a31bc64286a06b0659636cc13b4b67c30589Leon Scroggins } 28564943a31bc64286a06b0659636cc13b4b67c30589Leon Scroggins 28574943a31bc64286a06b0659636cc13b4b67c30589Leon Scroggins @Override 28580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onCreateWindow(WebView view, final boolean dialog, 28590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final boolean userGesture, final Message resultMsg) { 28600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Short-circuit if we can't create any more tabs or sub windows. 28610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (dialog && mTabControl.getCurrentSubWindow() != null) { 28620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(BrowserActivity.this) 28630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.too_many_subwindows_dialog_title) 28640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setIcon(android.R.drawable.ic_dialog_alert) 28650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setMessage(R.string.too_many_subwindows_dialog_message) 28660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, null) 28670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 28680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 28690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (mTabControl.getTabCount() >= TabControl.MAX_TABS) { 28700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(BrowserActivity.this) 28710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.too_many_windows_dialog_title) 28720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setIcon(android.R.drawable.ic_dialog_alert) 28730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setMessage(R.string.too_many_windows_dialog_message) 28740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, null) 28750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 28760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 28770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 28790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Short-circuit if this was a user gesture. 28800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (userGesture) { 28810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project createWindow(dialog, resultMsg); 28820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 28830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 28850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Allow the popup and create the appropriate window. 28860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final AlertDialog.OnClickListener allowListener = 28870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.OnClickListener() { 28880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface d, 28890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int which) { 28900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project createWindow(dialog, resultMsg); 28910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 28930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 28940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Block the popup by returning a null WebView. 28950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final AlertDialog.OnClickListener blockListener = 28960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.OnClickListener() { 28970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface d, int which) { 28980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resultMsg.sendToTarget(); 28990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 29010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Build a confirmation dialog to display to the user. 29030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final AlertDialog d = 29040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(BrowserActivity.this) 29050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.attention) 29060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setIcon(android.R.drawable.ic_dialog_alert) 29070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setMessage(R.string.popup_window_attempt) 29080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.allow, allowListener) 29090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setNegativeButton(R.string.block, blockListener) 29100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setCancelable(false) 29110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .create(); 29120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Show the confirmation dialog. 29140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project d.show(); 29150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 29160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 29190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCloseWindow(WebView window) { 29201f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins final TabControl.Tab current = mTabControl.getCurrentTab(); 29211f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins final TabControl.Tab parent = current.getParentTab(); 29220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (parent != null) { 29230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // JavaScript can only close popup window. 29241f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins switchToTab(mTabControl.getTabIndex(parent)); 29251f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // Now we need to close the window 29261f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins closeTab(current); 29270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 29310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onProgressChanged(WebView view, int newProgress) { 29321f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (CUSTOM_BROWSER_BAR) { 29331f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins mTitleBar.setProgress(newProgress, view); 29341f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } else { 29351f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins getWindow().setFeatureInt(Window.FEATURE_PROGRESS, 29361f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins newProgress * 100); 29370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (newProgress == 100) { 29400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // onProgressChanged() is called for sub-frame too while 29410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // onPageFinished() is only called for the main frame. sync 29420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // cookie and cache promptly here. 29430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project CookieSyncManager.getInstance().sync(); 2944cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project if (mInLoad) { 2945cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project mInLoad = false; 2946cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project updateInLoadMenuItems(); 2947cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project } 2948cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project } else { 2949cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project // onPageFinished may have already been called but a subframe 2950cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project // is still loading and updating the progress. Reset mInLoad 2951cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project // and update the menu items. 2952cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project if (!mInLoad) { 2953cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project mInLoad = true; 2954cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project updateInLoadMenuItems(); 2955cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project } 29560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 29600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onReceivedTitle(WebView view, String title) { 2961598c9ccf8641e0e4563bba2fd5613bcb4de766ecPatrick Scott String url = view.getUrl(); 29620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // here, if url is null, we want to reset the title 29641f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins setUrlTitle(url, title, view); 29650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url == null || 29670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url.length() >= SQLiteDatabase.SQLITE_MAX_LIKE_PATTERN_LENGTH) { 29680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 29690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2970fce182bff7713a12714018327f6da9500011ab17Leon Scroggins // See if we can find the current url in our history database and 2971fce182bff7713a12714018327f6da9500011ab17Leon Scroggins // add the new title to it. 29720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url.startsWith("http://www.")) { 29730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = url.substring(11); 29740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (url.startsWith("http://")) { 29750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = url.substring(4); 29760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 29780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = "%" + url; 29790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String [] selArgs = new String[] { url }; 29800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String where = Browser.BookmarkColumns.URL + " LIKE ? AND " 29820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + Browser.BookmarkColumns.BOOKMARK + " = 0"; 29830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Cursor c = mResolver.query(Browser.BOOKMARKS_URI, 29840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Browser.HISTORY_PROJECTION, where, selArgs, null); 29850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (c.moveToFirst()) { 29860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Current implementation of database only has one entry per 29870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // url. 2988fce182bff7713a12714018327f6da9500011ab17Leon Scroggins ContentValues map = new ContentValues(); 2989fce182bff7713a12714018327f6da9500011ab17Leon Scroggins map.put(Browser.BookmarkColumns.TITLE, title); 2990fce182bff7713a12714018327f6da9500011ab17Leon Scroggins mResolver.update(Browser.BOOKMARKS_URI, map, 2991fce182bff7713a12714018327f6da9500011ab17Leon Scroggins "_id = " + c.getInt(0), null); 29920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project c.close(); 29940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (IllegalStateException e) { 29950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(LOGTAG, "BrowserActivity onReceived title", e); 29960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (SQLiteException ex) { 29970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(LOGTAG, "onReceivedTitle() caught SQLiteException: ", ex); 29980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 30010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 30020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onReceivedIcon(WebView view, Bitmap icon) { 30033918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott updateIcon(view, icon); 30043918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 30053918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 30063918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott @Override 30073918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott public void onReceivedTouchIconUrl(WebView view, String url) { 30083918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott final ContentResolver cr = getContentResolver(); 30093918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott final Cursor c = 30103918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott BrowserBookmarksAdapter.queryBookmarksForUrl(cr, 3011a5d669e4c08f0e64387c2c539c41a26ac8c845abLeon Scroggins view.getOriginalUrl(), view.getUrl(), true); 30123918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott if (c != null) { 30133918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott if (c.getCount() > 0) { 30143918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott new DownloadTouchIcon(cr, c, view).execute(url); 30153918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } else { 30163918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott c.close(); 30173918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 30183918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 30190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3020092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdoch 3021adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu @Override 3022c9b5556351b59caec77b4eec1ad30652fec6a4d9Andrei Popescu public void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback) { 3023adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu if (mCustomView != null) 3024adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu return; 3025adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu 3026adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu // Add the custom view to its container. 3027adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu mCustomViewContainer.addView(view, COVER_SCREEN_GRAVITY_CENTER); 3028adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu mCustomView = view; 3029c9b5556351b59caec77b4eec1ad30652fec6a4d9Andrei Popescu mCustomViewCallback = callback; 3030adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu // Save the menu state and set it to empty while the custom 3031adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu // view is showing. 3032adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu mOldMenuState = mMenuState; 3033adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu mMenuState = EMPTY_MENU; 3034c9b5556351b59caec77b4eec1ad30652fec6a4d9Andrei Popescu // Hide the content view. 3035c9b5556351b59caec77b4eec1ad30652fec6a4d9Andrei Popescu mContentView.setVisibility(View.GONE); 3036adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu // Finally show the custom view container. 3037c9b5556351b59caec77b4eec1ad30652fec6a4d9Andrei Popescu mCustomViewContainer.setVisibility(View.VISIBLE); 3038c9b5556351b59caec77b4eec1ad30652fec6a4d9Andrei Popescu mCustomViewContainer.bringToFront(); 3039adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu } 3040adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu 3041adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu @Override 3042adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu public void onHideCustomView() { 3043adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu if (mCustomView == null) 3044adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu return; 3045adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu 3046c9b5556351b59caec77b4eec1ad30652fec6a4d9Andrei Popescu // Hide the custom view. 3047c9b5556351b59caec77b4eec1ad30652fec6a4d9Andrei Popescu mCustomView.setVisibility(View.GONE); 3048adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu // Remove the custom view from its container. 3049adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu mCustomViewContainer.removeView(mCustomView); 3050adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu mCustomView = null; 3051adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu // Reset the old menu state. 3052adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu mMenuState = mOldMenuState; 3053adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu mOldMenuState = EMPTY_MENU; 3054adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu mCustomViewContainer.setVisibility(View.GONE); 3055c9b5556351b59caec77b4eec1ad30652fec6a4d9Andrei Popescu mCustomViewCallback.onCustomViewHidden(); 3056c9b5556351b59caec77b4eec1ad30652fec6a4d9Andrei Popescu // Show the content view. 3057c9b5556351b59caec77b4eec1ad30652fec6a4d9Andrei Popescu mContentView.setVisibility(View.VISIBLE); 3058adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu } 3059adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu 3060092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdoch /** 306179e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu * The origin has exceeded its database quota. 3062092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdoch * @param url the URL that exceeded the quota 3063092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdoch * @param databaseIdentifier the identifier of the database on 3064092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdoch * which the transaction that caused the quota overflow was run 3065092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdoch * @param currentQuota the current quota for the origin. 306679e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu * @param totalUsedQuota is the sum of all origins' quota. 3067092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdoch * @param quotaUpdater The callback to run when a decision to allow or 3068092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdoch * deny quota has been made. Don't forget to call this! 3069092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdoch */ 3070092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdoch @Override 3071092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdoch public void onExceededDatabaseQuota(String url, 307279e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu String databaseIdentifier, long currentQuota, long totalUsedQuota, 3073092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdoch WebStorage.QuotaUpdater quotaUpdater) { 307479e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu mSettings.getWebStorageSizeManager().onExceededDatabaseQuota( 307579e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu url, databaseIdentifier, currentQuota, totalUsedQuota, 307679e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu quotaUpdater); 307779e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu } 307879e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu 307979e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu /** 308079e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu * The Application Cache has exceeded its max size. 308179e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu * @param spaceNeeded is the amount of disk space that would be needed 308279e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu * in order for the last appcache operation to succeed. 308379e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu * @param totalUsedQuota is the sum of all origins' quota. 308479e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu * @param quotaUpdater A callback to inform the WebCore thread that a new 308579e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu * app cache size is available. This callback must always be executed at 308679e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu * some point to ensure that the sleeping WebCore thread is woken up. 308779e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu */ 308879e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu @Override 308979e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu public void onReachedMaxAppCacheSize(long spaceNeeded, 309079e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater) { 309179e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu mSettings.getWebStorageSizeManager().onReachedMaxAppCacheSize( 309279e82b7ba72a7278911edf0dd7b03c65c4ec0e9dAndrei Popescu spaceNeeded, totalUsedQuota, quotaUpdater); 3093092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdoch } 30947db26347577132b8c4def47ccd410e7b9d0821bbBen Murdoch 30952bc69918d97a767a02132090e58718077381ba1aSteve Block /** 30962bc69918d97a767a02132090e58718077381ba1aSteve Block * Instructs the browser to show a prompt to ask the user to set the 30972bc69918d97a767a02132090e58718077381ba1aSteve Block * Geolocation permission state for the specified origin. 30982bc69918d97a767a02132090e58718077381ba1aSteve Block * @param origin The origin for which Geolocation permissions are 30992bc69918d97a767a02132090e58718077381ba1aSteve Block * requested. 31002bc69918d97a767a02132090e58718077381ba1aSteve Block * @param callback The callback to call once the user has set the 31012bc69918d97a767a02132090e58718077381ba1aSteve Block * Geolocation permission state. 31022bc69918d97a767a02132090e58718077381ba1aSteve Block */ 31032bc69918d97a767a02132090e58718077381ba1aSteve Block @Override 31042bc69918d97a767a02132090e58718077381ba1aSteve Block public void onGeolocationPermissionsShowPrompt(String origin, 31052bc69918d97a767a02132090e58718077381ba1aSteve Block GeolocationPermissions.Callback callback) { 31062bc69918d97a767a02132090e58718077381ba1aSteve Block mTabControl.getCurrentTab().getGeolocationPermissionsPrompt().show( 31072bc69918d97a767a02132090e58718077381ba1aSteve Block origin, callback); 31082bc69918d97a767a02132090e58718077381ba1aSteve Block } 31092bc69918d97a767a02132090e58718077381ba1aSteve Block 31102bc69918d97a767a02132090e58718077381ba1aSteve Block /** 31112bc69918d97a767a02132090e58718077381ba1aSteve Block * Instructs the browser to hide the Geolocation permissions prompt. 31122bc69918d97a767a02132090e58718077381ba1aSteve Block */ 31132bc69918d97a767a02132090e58718077381ba1aSteve Block @Override 31142bc69918d97a767a02132090e58718077381ba1aSteve Block public void onGeolocationPermissionsHidePrompt() { 31152bc69918d97a767a02132090e58718077381ba1aSteve Block mTabControl.getCurrentTab().getGeolocationPermissionsPrompt().hide(); 31162bc69918d97a767a02132090e58718077381ba1aSteve Block } 31172bc69918d97a767a02132090e58718077381ba1aSteve Block 31187db26347577132b8c4def47ccd410e7b9d0821bbBen Murdoch /* Adds a JavaScript error message to the system log. 31197db26347577132b8c4def47ccd410e7b9d0821bbBen Murdoch * @param message The error message to report. 31207db26347577132b8c4def47ccd410e7b9d0821bbBen Murdoch * @param lineNumber The line number of the error. 31217db26347577132b8c4def47ccd410e7b9d0821bbBen Murdoch * @param sourceID The name of the source file that caused the error. 31227db26347577132b8c4def47ccd410e7b9d0821bbBen Murdoch */ 31237db26347577132b8c4def47ccd410e7b9d0821bbBen Murdoch @Override 31247db26347577132b8c4def47ccd410e7b9d0821bbBen Murdoch public void addMessageToConsole(String message, int lineNumber, String sourceID) { 3125bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch ErrorConsoleView errorConsole = mTabControl.getCurrentErrorConsole(true); 3126bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch errorConsole.addErrorMessage(message, sourceID, lineNumber); 3127bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch if (mShouldShowErrorConsole && 3128bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch errorConsole.getShowState() != ErrorConsoleView.SHOW_MAXIMIZED) { 3129bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch errorConsole.showConsole(ErrorConsoleView.SHOW_MINIMIZED); 3130bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 3131bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch Log.w(LOGTAG, "Console: " + message + " " + sourceID + ":" + lineNumber); 31327db26347577132b8c4def47ccd410e7b9d0821bbBen Murdoch } 31330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 31340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 31360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Notify the host application a download should be done, or that 31370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * the data should be streamed if a streaming viewer is available. 31380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param url The full url to the content that should be downloaded 31390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param contentDisposition Content-disposition http header, if 31400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * present. 31410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param mimetype The mimetype of the content reported by the server 31420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param contentLength The file size reported by the server 31430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 31440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onDownloadStart(String url, String userAgent, 31450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String contentDisposition, String mimetype, long contentLength) { 31460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we're dealing wih A/V content that's not explicitly marked 31470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // for download, check if it's streamable. 31480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (contentDisposition == null 31490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || !contentDisposition.regionMatches(true, 0, "attachment", 0, 10)) { 31500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // query the package manager to see if there's a registered handler 31510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // that matches. 31520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent = new Intent(Intent.ACTION_VIEW); 31530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.setDataAndType(Uri.parse(url), mimetype); 31540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (getPackageManager().resolveActivity(intent, 31550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project PackageManager.MATCH_DEFAULT_ONLY) != null) { 31560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // someone knows how to handle this mime type with this scheme, don't download. 31570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 31580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project startActivity(intent); 31590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 31600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (ActivityNotFoundException ex) { 316131a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGD_ENABLED) { 31620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.d(LOGTAG, "activity not found for " + mimetype 31630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + " over " + Uri.parse(url).getScheme(), ex); 31640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Best behavior is to fall back to a download in this case 31660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project onDownloadStartNoStream(url, userAgent, contentDisposition, mimetype, contentLength); 31700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 31730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Notify the host application a download should be done, even if there 31740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * is a streaming viewer available for thise type. 31750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param url The full url to the content that should be downloaded 31760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param contentDisposition Content-disposition http header, if 31770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * present. 31780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param mimetype The mimetype of the content reported by the server 31790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param contentLength The file size reported by the server 31800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 31810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /*package */ void onDownloadStartNoStream(String url, String userAgent, 31820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String contentDisposition, String mimetype, long contentLength) { 31830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String filename = URLUtil.guessFileName(url, 31850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project contentDisposition, mimetype); 31860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Check to see if we have an SDCard 31880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String status = Environment.getExternalStorageState(); 31890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!status.equals(Environment.MEDIA_MOUNTED)) { 31900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int title; 31910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String msg; 31920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Check to see if the SDCard is busy, same as the music app 31940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (status.equals(Environment.MEDIA_SHARED)) { 31950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project msg = getString(R.string.download_sdcard_busy_dlg_msg); 31960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = R.string.download_sdcard_busy_dlg_title; 31970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 31980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project msg = getString(R.string.download_no_sdcard_dlg_msg, filename); 31990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = R.string.download_no_sdcard_dlg_title; 32000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(this) 32030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(title) 32040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setIcon(android.R.drawable.ic_dialog_alert) 32050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setMessage(msg) 32060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, null) 32070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 32080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 32090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // java.net.URI is a lot stricter than KURL so we have to undo 32120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // KURL's percent-encoding and redo the encoding using java.net.URI. 32130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project URI uri = null; 32140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 32150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Undo the percent-encoding that KURL may have done. 32160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String newUrl = new String(URLUtil.decode(url.getBytes())); 32170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Parse the url into pieces 32180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebAddress w = new WebAddress(newUrl); 32190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String frag = null; 32200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String query = null; 32210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String path = w.mPath; 32220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Break the path into path, query, and fragment 32230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (path.length() > 0) { 32240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Strip the fragment 32250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int idx = path.lastIndexOf('#'); 32260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (idx != -1) { 32270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project frag = path.substring(idx + 1); 32280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project path = path.substring(0, idx); 32290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project idx = path.lastIndexOf('?'); 32310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (idx != -1) { 32320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project query = path.substring(idx + 1); 32330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project path = path.substring(0, idx); 32340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project uri = new URI(w.mScheme, w.mAuthInfo, w.mHost, w.mPort, path, 32370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project query, frag); 32380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (Exception e) { 32390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(LOGTAG, "Could not parse url for download: " + url, e); 32400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 32410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // XXX: Have to use the old url since the cookies were stored using the 32440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // old percent-encoded url. 32450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String cookies = CookieManager.getInstance().getCookie(url); 32460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ContentValues values = new ContentValues(); 32483dc09b269fe4af164371f7a8268a5554b32c1be2Jean-Baptiste Queru values.put(Downloads.COLUMN_URI, uri.toString()); 32493dc09b269fe4af164371f7a8268a5554b32c1be2Jean-Baptiste Queru values.put(Downloads.COLUMN_COOKIE_DATA, cookies); 32503dc09b269fe4af164371f7a8268a5554b32c1be2Jean-Baptiste Queru values.put(Downloads.COLUMN_USER_AGENT, userAgent); 32513dc09b269fe4af164371f7a8268a5554b32c1be2Jean-Baptiste Queru values.put(Downloads.COLUMN_NOTIFICATION_PACKAGE, 32520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getPackageName()); 32533dc09b269fe4af164371f7a8268a5554b32c1be2Jean-Baptiste Queru values.put(Downloads.COLUMN_NOTIFICATION_CLASS, 32540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserDownloadPage.class.getCanonicalName()); 32553dc09b269fe4af164371f7a8268a5554b32c1be2Jean-Baptiste Queru values.put(Downloads.COLUMN_VISIBILITY, Downloads.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 32563dc09b269fe4af164371f7a8268a5554b32c1be2Jean-Baptiste Queru values.put(Downloads.COLUMN_MIME_TYPE, mimetype); 32573dc09b269fe4af164371f7a8268a5554b32c1be2Jean-Baptiste Queru values.put(Downloads.COLUMN_FILE_NAME_HINT, filename); 32583dc09b269fe4af164371f7a8268a5554b32c1be2Jean-Baptiste Queru values.put(Downloads.COLUMN_DESCRIPTION, uri.getHost()); 32590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (contentLength > 0) { 32603dc09b269fe4af164371f7a8268a5554b32c1be2Jean-Baptiste Queru values.put(Downloads.COLUMN_TOTAL_BYTES, contentLength); 32610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mimetype == null) { 32630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // We must have long pressed on a link or image to download it. We 32640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // are not sure of the mimetype in this case, so do a head request 32650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new FetchUrlMimeType(this).execute(values); 32660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 32670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Uri contentUri = 32680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getContentResolver().insert(Downloads.CONTENT_URI, values); 32690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project viewDownloads(contentUri); 32700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 32750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Resets the lock icon. This method is called when we start a new load and 32760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * know the url to be loaded. 32770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 32780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void resetLockIcon(String url) { 32790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Save the lock-icon state (we revert to it if the load gets cancelled) 32800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project saveLockIcon(); 32810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mLockIconType = LOCK_ICON_UNSECURE; 32830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (URLUtil.isHttpsUrl(url)) { 32840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mLockIconType = LOCK_ICON_SECURE; 328531a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 32860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, "BrowserActivity.resetLockIcon:" + 32870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project " reset lock icon to " + mLockIconType); 32880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project updateLockIconImage(LOCK_ICON_UNSECURE); 32920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 32950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Resets the lock icon. This method is called when the icon needs to be 32960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * reset but we do not know whether we are loading a secure or not secure 32970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * page. 32980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 32990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void resetLockIcon() { 33000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Save the lock-icon state (we revert to it if the load gets cancelled) 33010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project saveLockIcon(); 33020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mLockIconType = LOCK_ICON_UNSECURE; 33040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 330531a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 33060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, "BrowserActivity.resetLockIcon:" + 33070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project " reset lock icon to " + mLockIconType); 33080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project updateLockIconImage(LOCK_ICON_UNSECURE); 33110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 33140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Updates the lock-icon image in the title-bar. 33150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 33160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void updateLockIconImage(int lockIconType) { 33170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Drawable d = null; 33180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (lockIconType == LOCK_ICON_SECURE) { 33190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project d = mSecLockIcon; 33200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (lockIconType == LOCK_ICON_MIXED) { 33210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project d = mMixLockIcon; 33220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33231f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (CUSTOM_BROWSER_BAR) { 33241f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins mTitleBar.setLock(d, getTopWindow()); 33251f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } else { 33261f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins getWindow().setFeatureDrawable(Window.FEATURE_RIGHT_ICON, d); 33270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 33310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Displays a page-info dialog. 33320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param tab The tab to show info about 33330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param fromShowSSLCertificateOnError The flag that indicates whether 33340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * this dialog was opened from the SSL-certificate-on-error dialog or 33350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * not. This is important, since we need to know whether to return to 33360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * the parent dialog or simply dismiss. 33370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 33380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void showPageInfo(final TabControl.Tab tab, 33390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final boolean fromShowSSLCertificateOnError) { 33400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final LayoutInflater factory = LayoutInflater 33410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .from(this); 33420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final View pageInfoView = factory.inflate(R.layout.page_info, null); 33440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView view = tab.getWebView(); 33460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String url = null; 33480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String title = null; 33490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (view == null) { 33510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = tab.getUrl(); 33520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = tab.getTitle(); 33530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (view == mTabControl.getCurrentWebView()) { 33540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Use the cached title and url if this is the current WebView 33550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = mUrl; 33560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = mTitle; 33570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 33580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = view.getUrl(); 33590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = view.getTitle(); 33600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url == null) { 33630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = ""; 33640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (title == null) { 33660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = ""; 33670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) pageInfoView.findViewById(R.id.address)).setText(url); 33700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) pageInfoView.findViewById(R.id.title)).setText(title); 33710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoView = tab; 33730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoFromShowSSLCertificateOnError = new Boolean(fromShowSSLCertificateOnError); 33740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project AlertDialog.Builder alertDialogBuilder = 33760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(this) 33770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.page_info).setIcon(android.R.drawable.ic_dialog_info) 33780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setView(pageInfoView) 33790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton( 33800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.string.ok, 33810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 33820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 33830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 33840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoDialog = null; 33850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoView = null; 33860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoFromShowSSLCertificateOnError = null; 33870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we came here from the SSL error dialog 33890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (fromShowSSLCertificateOnError) { 33900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // go back to the SSL error dialog 33910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificateOnError( 33920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView, 33930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler, 33940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError); 33950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 33980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setOnCancelListener( 33990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnCancelListener() { 34000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCancel(DialogInterface dialog) { 34010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoDialog = null; 34020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoView = null; 34030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoFromShowSSLCertificateOnError = null; 34040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we came here from the SSL error dialog 34060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (fromShowSSLCertificateOnError) { 34070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // go back to the SSL error dialog 34080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificateOnError( 34090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView, 34100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler, 34110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError); 34120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }); 34150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we have a main top-level page SSL certificate set or a certificate 34170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // error 34180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (fromShowSSLCertificateOnError || 34190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (view != null && view.getCertificate() != null)) { 34200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // add a 'View Certificate' button 34210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project alertDialogBuilder.setNeutralButton( 34220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.string.view_certificate, 34230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 34240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 34250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 34260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoDialog = null; 34270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoView = null; 34280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoFromShowSSLCertificateOnError = null; 34290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we came here from the SSL error dialog 34310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (fromShowSSLCertificateOnError) { 34320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // go back to the SSL error dialog 34330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificateOnError( 34340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView, 34350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler, 34360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError); 34370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 34380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // otherwise, display the top-most certificate from 34390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the chain 34400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (view.getCertificate() != null) { 34410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificate(tab); 34420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }); 34460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoDialog = alertDialogBuilder.show(); 34490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 34520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Displays the main top-level page SSL certificate dialog 34530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * (accessible from the Page-Info dialog). 34540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param tab The tab to show certificate for. 34550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 34560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void showSSLCertificate(final TabControl.Tab tab) { 34570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final View certificateView = 34580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inflateCertificateView(tab.getWebView().getCertificate()); 34590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (certificateView == null) { 34600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 34610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LayoutInflater factory = LayoutInflater.from(this); 34640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final LinearLayout placeholder = 34660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (LinearLayout)certificateView.findViewById(R.id.placeholder); 34670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout) factory.inflate( 34690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.layout.ssl_success, placeholder); 34700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.success)) 34710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_certificate_is_valid); 34720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateView = tab; 34740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateDialog = 34750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(this) 34760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.ssl_certificate).setIcon( 34770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.drawable.ic_dialog_browser_certificate_secure) 34780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setView(certificateView) 34790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, 34800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 34810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 34820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 34830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateDialog = null; 34840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateView = null; 34850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showPageInfo(tab, false); 34870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 34890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setOnCancelListener( 34900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnCancelListener() { 34910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCancel(DialogInterface dialog) { 34920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateDialog = null; 34930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateView = null; 34940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showPageInfo(tab, false); 34960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 34980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 34990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 35020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Displays the SSL error certificate dialog. 35030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param view The target web-view. 35040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param handler The SSL error handler responsible for cancelling the 35050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * connection that resulted in an SSL error or proceeding per user request. 35060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param error The SSL error object. 35070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 35080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void showSSLCertificateOnError( 35090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView view, final SslErrorHandler handler, final SslError error) { 35100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final View certificateView = 35120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inflateCertificateView(error.getCertificate()); 35130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (certificateView == null) { 35140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 35150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LayoutInflater factory = LayoutInflater.from(this); 35180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final LinearLayout placeholder = 35200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (LinearLayout)certificateView.findViewById(R.id.placeholder); 35210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_UNTRUSTED)) { 35230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 35240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, placeholder); 35250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 35260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_untrusted); 35270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_IDMISMATCH)) { 35300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 35310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, placeholder); 35320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 35330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_mismatch); 35340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_EXPIRED)) { 35370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 35380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, placeholder); 35390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 35400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_expired); 35410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_NOTYETVALID)) { 35440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 35450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, placeholder); 35460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 35470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_not_yet_valid); 35480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler = handler; 35510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView = view; 35520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError = error; 35530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorDialog = 35540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(this) 35550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.ssl_certificate).setIcon( 35560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.drawable.ic_dialog_browser_certificate_partially_secure) 35570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setView(certificateView) 35580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, 35590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 35600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 35610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 35620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorDialog = null; 35630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView = null; 35640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler = null; 35650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError = null; 35660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWebViewClient.onReceivedSslError( 35680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project view, handler, error); 35690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 35710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setNeutralButton(R.string.page_info_view, 35720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 35730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 35740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 35750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorDialog = null; 35760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // do not clear the dialog state: we will 35780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // need to show the dialog again once the 35790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // user is done exploring the page-info details 35800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showPageInfo(mTabControl.getTabFromView(view), 35820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project true); 35830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 35850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setOnCancelListener( 35860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnCancelListener() { 35870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCancel(DialogInterface dialog) { 35880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorDialog = null; 35890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView = null; 35900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler = null; 35910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError = null; 35920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWebViewClient.onReceivedSslError( 35940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project view, handler, error); 35950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 35970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 35980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 36010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Inflates the SSL certificate view (helper method). 36020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param certificate The SSL certificate. 36030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @return The resultant certificate view with issued-to, issued-by, 36040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * issued-on, expires-on, and possibly other fields set. 36050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * If the input certificate is null, returns null. 36060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 36070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private View inflateCertificateView(SslCertificate certificate) { 36080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (certificate == null) { 36090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return null; 36100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LayoutInflater factory = LayoutInflater.from(this); 36130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project View certificateView = factory.inflate( 36150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.layout.ssl_certificate, null); 36160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // issued to: 36180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project SslCertificate.DName issuedTo = certificate.getIssuedTo(); 36190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (issuedTo != null) { 36200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.to_common)) 36210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedTo.getCName()); 36220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.to_org)) 36230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedTo.getOName()); 36240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.to_org_unit)) 36250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedTo.getUName()); 36260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // issued by: 36290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project SslCertificate.DName issuedBy = certificate.getIssuedBy(); 36300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (issuedBy != null) { 36310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.by_common)) 36320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedBy.getCName()); 36330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.by_org)) 36340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedBy.getOName()); 36350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.by_org_unit)) 36360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedBy.getUName()); 36370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // issued on: 36400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String issuedOn = reformatCertificateDate( 36410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project certificate.getValidNotBefore()); 36420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.issued_on)) 36430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedOn); 36440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // expires on: 36460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String expiresOn = reformatCertificateDate( 36470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project certificate.getValidNotAfter()); 36480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.expires_on)) 36490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(expiresOn); 36500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return certificateView; 36520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 36550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Re-formats the certificate date (Date.toString()) string to 36560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * a properly localized date string. 36570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @return Properly localized version of the certificate date string and 36580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * the original certificate date string if fails to localize. 36590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * If the original string is null, returns an empty string "". 36600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 36610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String reformatCertificateDate(String certificateDate) { 36620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String reformattedDate = null; 36630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (certificateDate != null) { 36650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Date date = null; 36660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 36670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project date = java.text.DateFormat.getInstance().parse(certificateDate); 36680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (ParseException e) { 36690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project date = null; 36700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (date != null) { 36730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project reformattedDate = 36740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project DateFormat.getDateFormat(this).format(date); 36750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return reformattedDate != null ? reformattedDate : 36790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (certificateDate != null ? certificateDate : ""); 36800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 36830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Displays an http-authentication dialog. 36840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 36850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void showHttpAuthentication(final HttpAuthHandler handler, 36860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final String host, final String realm, final String title, 36870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final String name, final String password, int focusId) { 36880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LayoutInflater factory = LayoutInflater.from(this); 36890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final View v = factory 36900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.http_authentication, null); 36910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (name != null) { 36920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((EditText) v.findViewById(R.id.username_edit)).setText(name); 36930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (password != null) { 36950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((EditText) v.findViewById(R.id.password_edit)).setText(password); 36960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String titleText = title; 36990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (titleText == null) { 37000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project titleText = getText(R.string.sign_in_to).toString().replace( 37010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "%s1", host).replace("%s2", realm); 37020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 37030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthHandler = handler; 37050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project AlertDialog dialog = new AlertDialog.Builder(this) 37060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(titleText) 37070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setIcon(android.R.drawable.ic_dialog_alert) 37080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setView(v) 37090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.action, 37100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 37110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 37120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 37130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String nm = ((EditText) v 37140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .findViewById(R.id.username_edit)) 37150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .getText().toString(); 37160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String pw = ((EditText) v 37170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .findViewById(R.id.password_edit)) 37180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .getText().toString(); 37190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserActivity.this.setHttpAuthUsernamePassword 37200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (host, realm, nm, pw); 37210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.proceed(nm, pw); 37220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthenticationDialog = null; 37230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthHandler = null; 37240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 37250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setNegativeButton(R.string.cancel, 37260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 37270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 37280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 37290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.cancel(); 37300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserActivity.this.resetTitleAndRevertLockIcon(); 37310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthenticationDialog = null; 37320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthHandler = null; 37330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 37340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setOnCancelListener(new DialogInterface.OnCancelListener() { 37350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCancel(DialogInterface dialog) { 37360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.cancel(); 37370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserActivity.this.resetTitleAndRevertLockIcon(); 37380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthenticationDialog = null; 37390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthHandler = null; 37400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 37410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .create(); 37420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Make the IME appear when the dialog is displayed if applicable. 37430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dialog.getWindow().setSoftInputMode( 37440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); 37450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dialog.show(); 37460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (focusId != 0) { 37470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dialog.findViewById(focusId).requestFocus(); 37480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 37490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project v.findViewById(R.id.username_edit).requestFocus(); 37500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 37510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthenticationDialog = dialog; 37520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 37530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public int getProgress() { 37550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = mTabControl.getCurrentWebView(); 37560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 37570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return w.getProgress(); 37580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 37590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return 100; 37600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 37610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 37620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 37640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Set HTTP authentication password. 37650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 37660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param host The host for the password 37670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param realm The realm for the password 37680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param username The username for the password. If it is null, it means 37690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * password can't be saved. 37700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param password The password 37710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 37720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void setHttpAuthUsernamePassword(String host, String realm, 37730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String username, 37740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String password) { 37750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = mTabControl.getCurrentWebView(); 37760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 37770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.setHttpAuthUsernamePassword(host, realm, username, password); 37780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 37790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 37800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 37820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * connectivity manager says net has come or gone... inform the user 37830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param up true if net has come up, false if net has gone down 37840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 37850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onNetworkToggle(boolean up) { 37860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (up == mIsNetworkUp) { 37870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 37880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (up) { 37890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mIsNetworkUp = true; 37900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mAlertDialog != null) { 37910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mAlertDialog.cancel(); 37920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mAlertDialog = null; 37930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 37940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 37950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mIsNetworkUp = false; 37960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mInLoad && mAlertDialog == null) { 37970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mAlertDialog = new AlertDialog.Builder(this) 37980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.loadSuspendedTitle) 37990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setMessage(R.string.loadSuspended) 38000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, null) 38010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 38020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = mTabControl.getCurrentWebView(); 38050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 38060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.setNetworkAvailable(up); 38070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 38110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project protected void onActivityResult(int requestCode, int resultCode, 38120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent) { 38130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (requestCode) { 38140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case COMBO_PAGE: 38150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (resultCode == RESULT_OK && intent != null) { 38160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String data = intent.getAction(); 38170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Bundle extras = intent.getExtras(); 38180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (extras != null && extras.getBoolean("new_window", false)) { 3819b0e4fc7b8efc66b20cf83a8d5f8dc9110d67da4fPatrick Scott final TabControl.Tab newTab = openTab(data); 3820b0e4fc7b8efc66b20cf83a8d5f8dc9110d67da4fPatrick Scott if (mSettings.openInBackground() && 38211f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins newTab != null) { 3822b0e4fc7b8efc66b20cf83a8d5f8dc9110d67da4fPatrick Scott mTabControl.populatePickerData(newTab); 3823b0e4fc7b8efc66b20cf83a8d5f8dc9110d67da4fPatrick Scott mTabControl.setCurrentTab(newTab); 38241f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins int newIndex = mTabControl.getCurrentIndex(); 38251f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (CUSTOM_BROWSER_BAR) { 38261f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins mTitleBar.setCurrentTab(newIndex); 38271f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 3828b0e4fc7b8efc66b20cf83a8d5f8dc9110d67da4fPatrick Scott } 38290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 38300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final TabControl.Tab currentTab = 38310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.getCurrentTab(); 38321f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins dismissSubWindow(currentTab); 38331f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (data != null && data.length() != 0) { 38341f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins getTopWindow().loadUrl(data); 38350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3837160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins } else if (resultCode == RESULT_CANCELED 3838160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins && mCancelGoPageMeansClose) { 3839160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins if (mTabControl.getTabCount() == 1) { 3840160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins // finish the Browser. When the Browser opens up again, 3841160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins // we will go through onCreate and once again open up 3842160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins // the Go page. 3843160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins finish(); 3844160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins return; 3845160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins } 3846160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins closeCurrentWindow(); 38470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 38490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project default: 38500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 38510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3852160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins mCancelGoPageMeansClose = false; 3853160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins if (getTopWindow() != null) { 3854160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins getTopWindow().requestFocus(); 3855160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins } 38560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* 38590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * This method is called as a result of the user selecting the options 38600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * menu to see the download window, or when a download changes state. It 38610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * shows the download window ontop of the current window. 38620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 38630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ void viewDownloads(Uri downloadRecord) { 38640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent = new Intent(this, 38650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserDownloadPage.class); 38660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.setData(downloadRecord); 38670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project startActivityForResult(intent, this.DOWNLOAD_PAGE); 38680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3871160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins // True if canceling the "Go" screen should result in closing the current 3872160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins // window/browser. 3873160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins private boolean mCancelGoPageMeansClose; 3874160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins 3875160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins /** 3876160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * Open the Go page. 3877160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * @param startWithHistory If true, open starting on the history tab. 3878160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * Otherwise, start with the bookmarks tab. 3879160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * @param cancelGoPageMeansClose Set to true if this came from a new tab, or 3880160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * from the only tab, and canceling means to 3881160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * close the tab (and possibly the browser) 3882160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins */ 3883160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins /* package */ void bookmarksOrHistoryPicker(boolean startWithHistory, 3884160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins boolean cancelGoPageMeansClose) { 38850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView current = mTabControl.getCurrentWebView(); 38860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current == null) { 38870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 38880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent = new Intent(this, 38900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project CombinedBookmarkHistoryActivity.class); 38910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String title = current.getTitle(); 38920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String url = current.getUrl(); 38930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Just in case the user opens bookmarks before a page finishes loading 38940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // so the current history item, and therefore the page, is null. 38950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (null == url) { 38960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = mLastEnteredUrl; 38970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // This can happen. 38980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (null == url) { 38990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = mSettings.getHomePage(); 39000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // In case the web page has not yet received its associated title. 39030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (title == null) { 39040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = url; 39050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.putExtra("title", title); 39070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.putExtra("url", url); 3908190095d42ef36347df265f40df190ec8be190d9eLeon Scroggins // If this is opening in a new window, then disable opening in a 3909190095d42ef36347df265f40df190ec8be190d9eLeon Scroggins // (different) new window. Also disable it if we have maxed out the 3910190095d42ef36347df265f40df190ec8be190d9eLeon Scroggins // windows. 3911190095d42ef36347df265f40df190ec8be190d9eLeon Scroggins intent.putExtra("disable_new_window", cancelGoPageMeansClose 3912190095d42ef36347df265f40df190ec8be190d9eLeon Scroggins || mTabControl.getTabCount() >= TabControl.MAX_TABS); 39133918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott intent.putExtra("touch_icon_url", current.getTouchIconUrl()); 39140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (startWithHistory) { 39150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.putExtra(CombinedBookmarkHistoryActivity.STARTING_TAB, 39160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project CombinedBookmarkHistoryActivity.HISTORY_TAB); 39170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3918160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins mCancelGoPageMeansClose = cancelGoPageMeansClose; 39190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project startActivityForResult(intent, COMBO_PAGE); 39200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Called when loading from context menu or LOAD_URL message 39230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void loadURL(WebView view, String url) { 39240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // In case the user enters nothing. 39250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null && url.length() != 0 && view != null) { 39260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = smartUrlFilter(url); 39270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!mWebViewClient.shouldOverrideUrlLoading(view, url)) { 39280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project view.loadUrl(url); 39290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String smartUrlFilter(Uri inUri) { 39340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (inUri != null) { 39350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return smartUrlFilter(inUri.toString()); 39360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return null; 39380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // get window count 39420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int getWindowCount(){ 39440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if(mTabControl != null){ 39450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return mTabControl.getTabCount(); 39460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return 0; 39480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3950b34f87a2e13af13d697130482af01b537ab7c5fdFeng Qian protected static final Pattern ACCEPTED_URI_SCHEMA = Pattern.compile( 39510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "(?i)" + // switch on case insensitive matching 39520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "(" + // begin group for schema 39530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "(?:http|https|file):\\/\\/" + 395425ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima "|(?:inline|data|about|content|javascript):" + 39550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ")" + 39560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "(.*)" ); 39570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 39590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Attempts to determine whether user input is a URL or search 39600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * terms. Anything with a space is passed to search. 39610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 39620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Converts to lowercase any mistakenly uppercased schema (i.e., 39630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * "Http://" converts to "http://" 39640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 39650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @return Original or modified URL 39660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 39670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 39680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String smartUrlFilter(String url) { 39690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String inUrl = url.trim(); 39710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean hasSpace = inUrl.indexOf(' ') != -1; 39720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Matcher matcher = ACCEPTED_URI_SCHEMA.matcher(inUrl); 39740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (matcher.matches()) { 39750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // force scheme to lowercase 39760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String scheme = matcher.group(1); 39770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String lcScheme = scheme.toLowerCase(); 39780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!lcScheme.equals(scheme)) { 3979123ecfb21e7ca670e3d04efe58780b3bac54a9a1Mitsuru Oshima inUrl = lcScheme + matcher.group(2); 3980123ecfb21e7ca670e3d04efe58780b3bac54a9a1Mitsuru Oshima } 3981123ecfb21e7ca670e3d04efe58780b3bac54a9a1Mitsuru Oshima if (hasSpace) { 3982123ecfb21e7ca670e3d04efe58780b3bac54a9a1Mitsuru Oshima inUrl = inUrl.replace(" ", "%20"); 39830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return inUrl; 39850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (hasSpace) { 3987565505b1a2c1d3099496af5910760087602e994aSatish Sampath // FIXME: Is this the correct place to add to searches? 3988565505b1a2c1d3099496af5910760087602e994aSatish Sampath // what if someone else calls this function? 3989565505b1a2c1d3099496af5910760087602e994aSatish Sampath int shortcut = parseUrlShortcut(inUrl); 3990565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (shortcut != SHORTCUT_INVALID) { 3991565505b1a2c1d3099496af5910760087602e994aSatish Sampath Browser.addSearchUrl(mResolver, inUrl); 3992565505b1a2c1d3099496af5910760087602e994aSatish Sampath String query = inUrl.substring(2); 3993565505b1a2c1d3099496af5910760087602e994aSatish Sampath switch (shortcut) { 3994565505b1a2c1d3099496af5910760087602e994aSatish Sampath case SHORTCUT_GOOGLE_SEARCH: 399547fdfdb989ffb79590a39c40792be995de32e521Grace Kloba return URLUtil.composeSearchUrl(query, QuickSearch_G, QUERY_PLACE_HOLDER); 3996565505b1a2c1d3099496af5910760087602e994aSatish Sampath case SHORTCUT_WIKIPEDIA_SEARCH: 3997565505b1a2c1d3099496af5910760087602e994aSatish Sampath return URLUtil.composeSearchUrl(query, QuickSearch_W, QUERY_PLACE_HOLDER); 3998565505b1a2c1d3099496af5910760087602e994aSatish Sampath case SHORTCUT_DICTIONARY_SEARCH: 3999565505b1a2c1d3099496af5910760087602e994aSatish Sampath return URLUtil.composeSearchUrl(query, QuickSearch_D, QUERY_PLACE_HOLDER); 4000565505b1a2c1d3099496af5910760087602e994aSatish Sampath case SHORTCUT_GOOGLE_MOBILE_LOCAL_SEARCH: 40010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // FIXME: we need location in this case 4002565505b1a2c1d3099496af5910760087602e994aSatish Sampath return URLUtil.composeSearchUrl(query, QuickSearch_L, QUERY_PLACE_HOLDER); 40030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 40060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (Regex.WEB_URL_PATTERN.matcher(inUrl).matches()) { 40070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return URLUtil.guessUrl(inUrl); 40080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Browser.addSearchUrl(mResolver, inUrl); 401247fdfdb989ffb79590a39c40792be995de32e521Grace Kloba return URLUtil.composeSearchUrl(inUrl, QuickSearch_G, QUERY_PLACE_HOLDER); 40130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 4015bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch /* package */ void setShouldShowErrorConsole(boolean flag) { 4016bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch if (flag == mShouldShowErrorConsole) { 4017bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch // Nothing to do. 4018bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch return; 4019bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 4020bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 4021bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch mShouldShowErrorConsole = flag; 4022bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 4023bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch ErrorConsoleView errorConsole = mTabControl.getCurrentErrorConsole(true); 4024bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 4025bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch if (flag) { 4026bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch // Setting the show state of the console will cause it's the layout to be inflated. 4027bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch if (errorConsole.numberOfErrors() > 0) { 4028bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch errorConsole.showConsole(ErrorConsoleView.SHOW_MINIMIZED); 4029bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } else { 4030bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch errorConsole.showConsole(ErrorConsoleView.SHOW_NONE); 4031bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 4032bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 4033bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch // Now we can add it to the main view. 4034bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch mErrorConsoleContainer.addView(errorConsole, 4035bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, 4036bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch ViewGroup.LayoutParams.WRAP_CONTENT)); 4037bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } else { 4038bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch mErrorConsoleContainer.removeView(errorConsole); 4039bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 4040bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 4041bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 4042bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 40430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final static int LOCK_ICON_UNSECURE = 0; 40440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final static int LOCK_ICON_SECURE = 1; 40450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final static int LOCK_ICON_MIXED = 2; 40460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private int mLockIconType = LOCK_ICON_UNSECURE; 40480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private int mPrevLockType = LOCK_ICON_UNSECURE; 40490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private BrowserSettings mSettings; 40510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private TabControl mTabControl; 40520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private ContentResolver mResolver; 40530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private FrameLayout mContentView; 4054adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu private View mCustomView; 4055adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu private FrameLayout mCustomViewContainer; 4056c9b5556351b59caec77b4eec1ad30652fec6a4d9Andrei Popescu private WebChromeClient.CustomViewCallback mCustomViewCallback; 40570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // FIXME, temp address onPrepareMenu performance problem. When we move everything out of 40590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // view, we should rewrite this. 40600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private int mCurrentMenuState = 0; 40610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private int mMenuState = R.id.MAIN_MENU; 4062adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu private int mOldMenuState = EMPTY_MENU; 40630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static final int EMPTY_MENU = -1; 40640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Menu mMenu; 40650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private FindDialog mFindDialog; 40670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Used to prevent chording to result in firing two shortcuts immediately 40680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // one after another. Fixes bug 1211714. 40690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean mCanChord; 40700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private boolean mInLoad; 40720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private boolean mIsNetworkUp; 40730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private boolean mPageStarted; 40750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private boolean mActivityInPause = true; 40760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private boolean mMenuIsDown; 40780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final KeyTracker mKeyTracker = new KeyTracker(this); 40800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // As trackball doesn't send repeat down, we have to track it ourselves 40820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private boolean mTrackTrackball; 40830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static boolean mInTrace; 40850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Performance probe 40870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static final int[] SYSTEM_CPU_FORMAT = new int[] { 40880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_COMBINE, 40890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 1: user time 40900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 2: nice time 40910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 3: sys time 40920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 4: idle time 40930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 5: iowait time 40940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 6: irq time 40950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG // 7: softirq time 40960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 40970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mStart; 40990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mProcessStart; 41000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mUserStart; 41010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mSystemStart; 41020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mIdleStart; 41030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mIrqStart; 41040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 41050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mUiStart; 41060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 41070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Drawable mMixLockIcon; 41080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Drawable mSecLockIcon; 41090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Drawable mGenericFavicon; 41100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 41110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* hold a ref so we can auto-cancel if necessary */ 41120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private AlertDialog mAlertDialog; 41130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 41140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Wait for credentials before loading google.com 41150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private ProgressDialog mCredsDlg; 41160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 41170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // The up-to-date URL and title (these can be different from those stored 41180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // in WebView, since it takes some time for the information in WebView to 41190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // get updated) 41200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String mUrl; 41210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String mTitle; 41220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 41230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // As PageInfo has different style for landscape / portrait, we have 41240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // to re-open it when configuration changed 41250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private AlertDialog mPageInfoDialog; 41260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private TabControl.Tab mPageInfoView; 41270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If the Page-Info dialog is launched from the SSL-certificate-on-error 41280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // dialog, we should not just dismiss it, but should get back to the 41290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // SSL-certificate-on-error dialog. This flag is used to store this state 41300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Boolean mPageInfoFromShowSSLCertificateOnError; 41310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 41320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // as SSLCertificateOnError has different style for landscape / portrait, 41330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // we have to re-open it when configuration changed 41340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private AlertDialog mSSLCertificateOnErrorDialog; 41350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private WebView mSSLCertificateOnErrorView; 41360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private SslErrorHandler mSSLCertificateOnErrorHandler; 41370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private SslError mSSLCertificateOnErrorError; 41380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 41390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // as SSLCertificate has different style for landscape / portrait, we 41400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // have to re-open it when configuration changed 41410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private AlertDialog mSSLCertificateDialog; 41420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private TabControl.Tab mSSLCertificateView; 41430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 41440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // as HttpAuthentication has different style for landscape / portrait, we 41450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // have to re-open it when configuration changed 41460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private AlertDialog mHttpAuthenticationDialog; 41470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private HttpAuthHandler mHttpAuthHandler; 41480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 41490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /*package*/ static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS = 41500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new FrameLayout.LayoutParams( 41510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ViewGroup.LayoutParams.FILL_PARENT, 41520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ViewGroup.LayoutParams.FILL_PARENT); 4153adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu /*package*/ static final FrameLayout.LayoutParams COVER_SCREEN_GRAVITY_CENTER = 4154adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu new FrameLayout.LayoutParams( 4155adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu ViewGroup.LayoutParams.FILL_PARENT, 4156adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu ViewGroup.LayoutParams.FILL_PARENT, 4157adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu Gravity.CENTER); 415847fdfdb989ffb79590a39c40792be995de32e521Grace Kloba // Google search 415947fdfdb989ffb79590a39c40792be995de32e521Grace Kloba final static String QuickSearch_G = "http://www.google.com/m?q=%s"; 41600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Wikipedia search 41610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String QuickSearch_W = "http://en.wikipedia.org/w/index.php?search=%s&go=Go"; 41620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Dictionary search 41630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String QuickSearch_D = "http://dictionary.reference.com/search?q=%s"; 41640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Google Mobile Local search 41650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String QuickSearch_L = "http://www.google.com/m/search?site=local&q=%s&near=mountain+view"; 41660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 41670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String QUERY_PLACE_HOLDER = "%s"; 41680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 41690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "source" parameter for Google search through search key 41700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String GOOGLE_SEARCH_SOURCE_SEARCHKEY = "browser-key"; 41710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "source" parameter for Google search through goto menu 41720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String GOOGLE_SEARCH_SOURCE_GOTO = "browser-goto"; 41730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "source" parameter for Google search through simplily type 41740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String GOOGLE_SEARCH_SOURCE_TYPE = "browser-type"; 41750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "source" parameter for Google search suggested by the browser 41760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String GOOGLE_SEARCH_SOURCE_SUGGEST = "browser-suggest"; 41770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "source" parameter for Google search from unknown source 41780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String GOOGLE_SEARCH_SOURCE_UNKNOWN = "unknown"; 41790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 41800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final static String LOGTAG = "browser"; 41810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 41820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String mLastEnteredUrl; 41830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 41840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private PowerManager.WakeLock mWakeLock; 41850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final static int WAKELOCK_TIMEOUT = 5 * 60 * 1000; // 5 minutes 41860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 41870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Toast mStopToast; 41880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 41891f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins private TitleBarSet mTitleBar; 419081db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins 4191bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch private LinearLayout mErrorConsoleContainer = null; 4192bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch private boolean mShouldShowErrorConsole = false; 4193bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 41940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // As the ids are dynamically created, we can't guarantee that they will 41950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // be in sequence, so this static array maps ids to a window number. 41960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static private int[] WINDOW_SHORTCUT_ID_ARRAY = 41970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project { R.id.window_one_menu_id, R.id.window_two_menu_id, R.id.window_three_menu_id, 41980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.id.window_four_menu_id, R.id.window_five_menu_id, R.id.window_six_menu_id, 41990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.id.window_seven_menu_id, R.id.window_eight_menu_id }; 42000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // monitor platform changes 42020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private IntentFilter mNetworkStateChangedFilter; 42030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private BroadcastReceiver mNetworkStateIntentReceiver; 42040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 4205b4da0ad0351996f639b50f9f29b123a9b5c24fd0Grace Kloba private BroadcastReceiver mPackageInstallationReceiver; 4206b4da0ad0351996f639b50f9f29b123a9b5c24fd0Grace Kloba 42070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // activity requestCode 420878a98e459323f938e97789a6131beddbebb459ceNicolas Roard final static int COMBO_PAGE = 1; 420978a98e459323f938e97789a6131beddbebb459ceNicolas Roard final static int DOWNLOAD_PAGE = 2; 421078a98e459323f938e97789a6131beddbebb459ceNicolas Roard final static int PREFERENCES_PAGE = 3; 42110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 421225ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima /** 421325ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima * A UrlData class to abstract how the content will be set to WebView. 421425ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima * This base class uses loadUrl to show the content. 421525ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima */ 421625ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima private static class UrlData { 421725ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima String mUrl; 421860e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba byte[] mPostData; 421960e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba 422025ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima UrlData(String url) { 422125ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima this.mUrl = url; 422225ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima } 422360e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba 422460e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba void setPostData(byte[] postData) { 422560e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba mPostData = postData; 422660e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba } 422760e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba 422825ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima boolean isEmpty() { 422925ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima return mUrl == null || mUrl.length() == 0; 423025ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima } 423125ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima 42327944b7def8b04c3dc0cb8815a8527aba8c91b219Mitsuru Oshima public void loadIn(WebView webView) { 423360e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba if (mPostData != null) { 423460e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba webView.postUrl(mUrl, mPostData); 423560e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba } else { 423660e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba webView.loadUrl(mUrl); 423760e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba } 423825ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima } 423925ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima }; 424025ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima 424125ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima /** 424225ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima * A subclass of UrlData class that can display inlined content using 424325ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima * {@link WebView#loadDataWithBaseURL(String, String, String, String, String)}. 424425ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima */ 424525ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima private static class InlinedUrlData extends UrlData { 424625ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima InlinedUrlData(String inlined, String mimeType, String encoding, String failUrl) { 424725ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima super(failUrl); 424825ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima mInlined = inlined; 424925ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima mMimeType = mimeType; 425025ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima mEncoding = encoding; 425125ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima } 425225ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima String mMimeType; 425325ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima String mInlined; 425425ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima String mEncoding; 42557944b7def8b04c3dc0cb8815a8527aba8c91b219Mitsuru Oshima @Override 425625ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima boolean isEmpty() { 4257bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch return mInlined == null || mInlined.length() == 0 || super.isEmpty(); 425825ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima } 425925ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima 42607944b7def8b04c3dc0cb8815a8527aba8c91b219Mitsuru Oshima @Override 42617944b7def8b04c3dc0cb8815a8527aba8c91b219Mitsuru Oshima public void loadIn(WebView webView) { 426225ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima webView.loadDataWithBaseURL(null, mInlined, mMimeType, mEncoding, mUrl); 426325ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima } 426425ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima } 426525ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima 42661f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins /* package */ static final UrlData EMPTY_URL_DATA = new UrlData(null); 42670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project} 4268