BrowserActivity.java revision bc5b9f358a2b75bf3a104b9f5cd477ad2f6f740f
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; 21f447f26579a10515272f5b9824c918a56a9b104bRamanan Rajeswaranimport com.google.android.providers.GoogleSettings.Partner; 220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.app.Activity; 240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.app.ActivityManager; 250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.app.AlertDialog; 260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.app.ProgressDialog; 270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.app.SearchManager; 280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.ActivityNotFoundException; 290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.BroadcastReceiver; 300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.ComponentName; 310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.ContentResolver; 320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.ContentValues; 330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.Context; 340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.DialogInterface; 350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.Intent; 360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.IntentFilter; 370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.ServiceConnection; 380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.DialogInterface.OnCancelListener; 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.os.SystemProperties; 790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.preference.PreferenceManager; 800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.provider.Browser; 810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.provider.Contacts; 820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.provider.Downloads; 830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.provider.MediaStore; 840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.provider.Contacts.Intents.Insert; 850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.text.IClipboard; 860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.text.TextUtils; 870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.text.format.DateFormat; 880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.text.util.Regex; 890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.util.Log; 900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.ContextMenu; 910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.Gravity; 920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.KeyEvent; 930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.LayoutInflater; 940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.Menu; 950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.MenuInflater; 960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.MenuItem; 970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.View; 980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.ViewGroup; 990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.Window; 1000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.WindowManager; 1010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.ContextMenu.ContextMenuInfo; 1020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.MenuItem.OnMenuItemClickListener; 1030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.animation.AlphaAnimation; 1040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.animation.Animation; 1050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.animation.AnimationSet; 1060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.animation.DecelerateInterpolator; 1070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.animation.ScaleAnimation; 1080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.animation.TranslateAnimation; 1090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.CookieManager; 1100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.CookieSyncManager; 1110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.DownloadListener; 1120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.HttpAuthHandler; 1130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.SslErrorHandler; 1140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.URLUtil; 1150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.WebChromeClient; 1160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.WebHistoryItem; 1170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.WebIconDatabase; 1180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.WebView; 1190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.WebViewClient; 1200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.EditText; 1210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.FrameLayout; 1220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.LinearLayout; 1230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.TextView; 1240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.Toast; 1250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.io.BufferedOutputStream; 1270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.io.File; 1280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.io.FileInputStream; 1290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.io.FileOutputStream; 1300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.io.IOException; 1310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.io.InputStream; 1320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.net.MalformedURLException; 1330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.net.URI; 1340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.net.URL; 1350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.net.URLEncoder; 1360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.text.ParseException; 1370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.Date; 1380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.Enumeration; 1390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.HashMap; 140a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scottimport java.util.LinkedList; 1410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.Locale; 1420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.Vector; 1430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.regex.Matcher; 1440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.regex.Pattern; 1450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.zip.ZipEntry; 1460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.zip.ZipFile; 1470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectpublic class BrowserActivity extends Activity 1490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project implements KeyTracker.OnKeyTracker, 1500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project View.OnCreateContextMenuListener, 1510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project DownloadListener { 1520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15331a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort /* Define some aliases to make these debugging flags easier to refer to. 15431a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort * This file imports android.provider.Browser, so we can't just refer to "Browser.DEBUG". 15531a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort */ 15631a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort private final static boolean DEBUG = com.android.browser.Browser.DEBUG; 15731a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort private final static boolean LOGV_ENABLED = com.android.browser.Browser.LOGV_ENABLED; 15831a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort private final static boolean LOGD_ENABLED = com.android.browser.Browser.LOGD_ENABLED; 15931a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort 1600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private IGoogleLoginService mGls = null; 1610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private ServiceConnection mGlsConnection = null; 1620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private SensorManager mSensorManager = null; 1640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 165565505b1a2c1d3099496af5910760087602e994aSatish Sampath // These are single-character shortcuts for searching popular sources. 166565505b1a2c1d3099496af5910760087602e994aSatish Sampath private static final int SHORTCUT_INVALID = 0; 167565505b1a2c1d3099496af5910760087602e994aSatish Sampath private static final int SHORTCUT_GOOGLE_SEARCH = 1; 168565505b1a2c1d3099496af5910760087602e994aSatish Sampath private static final int SHORTCUT_WIKIPEDIA_SEARCH = 2; 169565505b1a2c1d3099496af5910760087602e994aSatish Sampath private static final int SHORTCUT_DICTIONARY_SEARCH = 3; 170565505b1a2c1d3099496af5910760087602e994aSatish Sampath private static final int SHORTCUT_GOOGLE_MOBILE_LOCAL_SEARCH = 4; 171565505b1a2c1d3099496af5910760087602e994aSatish Sampath 1720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* Whitelisted webpages 1730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static HashSet<String> sWhiteList; 1740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project static { 1760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList = new HashSet<String>(); 1770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList.add("cnn.com/"); 1780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList.add("espn.go.com/"); 1790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList.add("nytimes.com/"); 1800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList.add("engadget.com/"); 1810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList.add("yahoo.com/"); 1820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList.add("msn.com/"); 1830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList.add("amazon.com/"); 1840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList.add("consumerist.com/"); 1850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sWhiteList.add("google.com/m/news"); 1860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 1880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void setupHomePage() { 1900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Runnable getAccount = new Runnable() { 1910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void run() { 1920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Lower priority 1930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); 1940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // get the default home page 1950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String homepage = mSettings.getHomePage(); 1960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 1980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mGls == null) return; 1990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 200f2c5c1b555904400f4092888ae81b8ed74bfe026Grace Kloba if (!homepage.startsWith("http://www.google.")) return; 201f2c5c1b555904400f4092888ae81b8ed74bfe026Grace Kloba if (homepage.indexOf('?') == -1) return; 202f2c5c1b555904400f4092888ae81b8ed74bfe026Grace Kloba 2030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String hostedUser = mGls.getAccount(GoogleLoginServiceConstants.PREFER_HOSTED); 2040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String googleUser = mGls.getAccount(GoogleLoginServiceConstants.REQUIRE_GOOGLE); 2050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // three cases: 2070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // 2080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // hostedUser == googleUser 2090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // The device has only a google account 2100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // 2110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // hostedUser != googleUser 2120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // The device has a hosted account and a google account 2130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // 2140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // hostedUser != null, googleUser == null 2150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // The device has only a hosted account (so far) 2160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // developers might have no accounts at all 2180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (hostedUser == null) return; 2190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (googleUser == null || !hostedUser.equals(googleUser)) { 2210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String domain = hostedUser.substring(hostedUser.lastIndexOf('@')+1); 222f2c5c1b555904400f4092888ae81b8ed74bfe026Grace Kloba homepage = homepage.replace("?", "/a/" + domain + "?"); 2230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (RemoteException ignore) { 2250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Login service died; carry on 2260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (RuntimeException ignore) { 2270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Login service died; carry on 2280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } finally { 2290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project finish(homepage); 2300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void finish(final String homepage) { 2340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.post(new Runnable() { 2350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void run() { 2360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSettings.setHomePage(BrowserActivity.this, homepage); 2370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resumeAfterCredentials(); 2380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // as this is running in a separate thread, 2400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // BrowserActivity's onDestroy() may have been called, 2410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // which also calls unbindService(). 2420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mGlsConnection != null) { 2430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // we no longer need to keep GLS open 2440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project unbindService(mGlsConnection); 2450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mGlsConnection = null; 2460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } }); 2480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } }; 2490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final boolean[] done = { false }; 2510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Open a connection to the Google Login Service. The first 2530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // time the connection is established, set up the homepage depending on 2540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the account in a background thread. 2550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mGlsConnection = new ServiceConnection() { 2560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onServiceConnected(ComponentName className, IBinder service) { 2570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mGls = IGoogleLoginService.Stub.asInterface(service); 2580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (done[0] == false) { 2590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project done[0] = true; 2600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Thread account = new Thread(getAccount); 2610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project account.setName("GLSAccount"); 2620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project account.start(); 2630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onServiceDisconnected(ComponentName className) { 2660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mGls = null; 2670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 2690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project bindService(GoogleLoginServiceConstants.SERVICE_INTENT, 2710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mGlsConnection, Context.BIND_AUTO_CREATE); 2720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 2750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * This class is in charge of installing pre-packaged plugins 2760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * from the Browser assets directory to the user's data partition. 2770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Plugins are loaded from the "plugins" directory in the assets; 2780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Anything that is in this directory will be copied over to the 2790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * user data partition in app_plugins. 2800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 2810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private class CopyPlugins implements Runnable { 2820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String TAG = "PluginsInstaller"; 2830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String ZIP_FILTER = "assets/plugins/"; 2840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String APK_PATH = "/system/app/Browser.apk"; 2850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String PLUGIN_EXTENSION = ".so"; 2860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String TEMPORARY_EXTENSION = "_temp"; 2870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String BUILD_INFOS_FILE = "build.prop"; 2880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String SYSTEM_BUILD_INFOS_FILE = "/system/" 2890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + BUILD_INFOS_FILE; 2900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final int BUFSIZE = 4096; 2910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean mDoOverwrite = false; 2920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String pluginsPath; 2930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Context mContext; 2940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project File pluginsDir; 2950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project AssetManager manager; 2960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public CopyPlugins (boolean overwrite, Context context) { 2980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mDoOverwrite = overwrite; 2990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mContext = context; 3000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 3030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Returned a filtered list of ZipEntry. 3040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * We list all the files contained in the zip and 3050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * only returns the ones starting with the ZIP_FILTER 3060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * path. 3070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 3080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param zip the zip file used. 3090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 3100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public Vector<ZipEntry> pluginsFilesFromZip(ZipFile zip) { 3110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Vector<ZipEntry> list = new Vector<ZipEntry>(); 3120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Enumeration entries = zip.entries(); 3130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project while (entries.hasMoreElements()) { 3140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ZipEntry entry = (ZipEntry) entries.nextElement(); 3150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (entry.getName().startsWith(ZIP_FILTER)) { 3160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project list.add(entry); 3170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return list; 3200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 3230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Utility method to copy the content from an inputstream 3240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * to a file output stream. 3250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 3260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void copyStreams(InputStream is, FileOutputStream fos) { 3270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BufferedOutputStream os = null; 3280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 3290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project byte data[] = new byte[BUFSIZE]; 3300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int count; 3310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project os = new BufferedOutputStream(fos, BUFSIZE); 3320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project while ((count = is.read(data, 0, BUFSIZE)) != -1) { 3330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project os.write(data, 0, count); 3340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project os.flush(); 3360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (IOException e) { 3370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(TAG, "Exception while copying: " + e); 3380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } finally { 3390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 3400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (os != null) { 3410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project os.close(); 3420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (IOException e2) { 3440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(TAG, "Exception while closing the stream: " + e2); 3450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 3500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Returns a string containing the contents of a file 3510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 3520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param file the target file 3530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 3540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String contentsOfFile(File file) { 3550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String ret = null; 3560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project FileInputStream is = null; 3570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 3580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project byte[] buffer = new byte[BUFSIZE]; 3590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int count; 3600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project is = new FileInputStream(file); 3610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project StringBuffer out = new StringBuffer(); 3620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project while ((count = is.read(buffer, 0, BUFSIZE)) != -1) { 3640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project out.append(new String(buffer, 0, count)); 3650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ret = out.toString(); 3670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (IOException e) { 3680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(TAG, "Exception getting contents of file " + e); 3690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } finally { 3700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (is != null) { 3710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 3720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project is.close(); 3730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (IOException e2) { 3740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(TAG, "Exception while closing the file: " + e2); 3750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return ret; 3790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 3820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Utility method to initialize the user data plugins path. 3830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 3840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void initPluginsPath() { 3850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserSettings s = BrowserSettings.getInstance(); 3860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project pluginsPath = s.getPluginsPath(); 3870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (pluginsPath == null) { 3880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project s.loadFromDb(mContext); 3890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project pluginsPath = s.getPluginsPath(); 3900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39131a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 3920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(TAG, "Plugin path: " + pluginsPath); 3930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 3970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Utility method to delete a file or a directory 3980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 3990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param file the File to delete 4000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 4010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void deleteFile(File file) { 4020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project File[] files = file.listFiles(); 4030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if ((files != null) && files.length > 0) { 4040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project for (int i=0; i< files.length; i++) { 4050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project deleteFile(files[i]); 4060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 4070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 4080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!file.delete()) { 4090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(TAG, file.getPath() + " could not get deleted"); 4100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 4110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 4120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 4130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 4140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Clean the content of the plugins directory. 4150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * We delete the directory, then recreate it. 4160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 4170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void cleanPluginsDirectory() { 41831a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 4190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(TAG, "delete plugins directory: " + pluginsPath); 4200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 4210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project File pluginsDirectory = new File(pluginsPath); 4220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project deleteFile(pluginsDirectory); 4230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project pluginsDirectory.mkdir(); 4240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 4250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 4260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 4270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 4280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Copy the SYSTEM_BUILD_INFOS_FILE file containing the 4290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * informations about the system build to the 4300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * BUILD_INFOS_FILE in the plugins directory. 4310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 4320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void copyBuildInfos() { 4330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 43431a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 4350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(TAG, "Copy build infos to the plugins directory"); 4360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 4370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project File buildInfoFile = new File(SYSTEM_BUILD_INFOS_FILE); 4380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project File buildInfoPlugins = new File(pluginsPath, BUILD_INFOS_FILE); 4390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project copyStreams(new FileInputStream(buildInfoFile), 4400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new FileOutputStream(buildInfoPlugins)); 4410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (IOException e) { 4420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(TAG, "Exception while copying the build infos: " + e); 4430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 4440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 4450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 4460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 4470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Returns true if the current system is newer than the 4480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * system that installed the plugins. 4490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * We determinate this by checking the build number of the system. 4500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 4510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * At the end of the plugins copy operation, we copy the 4520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * SYSTEM_BUILD_INFOS_FILE to the BUILD_INFOS_FILE. 4530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * We then just have to load both and compare them -- if they 4540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * are different the current system is newer. 4550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 4560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Loading and comparing the strings should be faster than 4570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * creating a hash, the files being rather small. Extracting the 4580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * version number would require some parsing which may be more 4590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * brittle. 4600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 4610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean newSystemImage() { 4620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 4630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project File buildInfoFile = new File(SYSTEM_BUILD_INFOS_FILE); 4640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project File buildInfoPlugins = new File(pluginsPath, BUILD_INFOS_FILE); 4650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!buildInfoPlugins.exists()) { 46631a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 4670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(TAG, "build.prop in plugins directory " + pluginsPath 4680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + " does not exist, therefore it's a new system image"); 4690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 4700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 4710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 4720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String buildInfo = contentsOfFile(buildInfoFile); 4730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String buildInfoPlugin = contentsOfFile(buildInfoPlugins); 4740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (buildInfo == null || buildInfoPlugin == null 4750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || buildInfo.compareTo(buildInfoPlugin) != 0) { 47631a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 4770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(TAG, "build.prop are different, " 4780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + " therefore it's a new system image"); 4790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 4800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 4810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 4820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 4830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (Exception e) { 4840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(TAG, "Exc in newSystemImage(): " + e); 4850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 4860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 4870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 4880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 4890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 4900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Check if the version of the plugins contained in the 4910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Browser assets is the same as the version of the plugins 4920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * in the plugins directory. 4930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * We simply iterate on every file in the assets/plugins 4940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * and return false if a file listed in the assets does 4950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * not exist in the plugins directory. 4960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 4970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private boolean checkIsDifferentVersions() { 4980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 4990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ZipFile zip = new ZipFile(APK_PATH); 5000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Vector<ZipEntry> files = pluginsFilesFromZip(zip); 5010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int zipFilterLength = ZIP_FILTER.length(); 5020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 5030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Enumeration entries = files.elements(); 5040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project while (entries.hasMoreElements()) { 5050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ZipEntry entry = (ZipEntry) entries.nextElement(); 5060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String path = entry.getName().substring(zipFilterLength); 5070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project File outputFile = new File(pluginsPath, path); 5080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!outputFile.exists()) { 50931a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 5100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(TAG, "checkIsDifferentVersions(): extracted file " 5110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + path + " does not exist, we have a different version"); 5120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 5140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (IOException e) { 5170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(TAG, "Exception in checkDifferentVersions(): " + e); 5180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 5200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 5220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 5230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Copy every files from the assets/plugins directory 5240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * to the app_plugins directory in the data partition. 5250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Once copied, we copy over the SYSTEM_BUILD_INFOS file 5260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * in the plugins directory. 5270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 5280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * NOTE: we directly access the content from the Browser 5290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * package (it's a zip file) and do not use AssetManager 5300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * as there is a limit of 1Mb (see Asset.h) 5310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 5320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void run() { 5330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Lower the priority 5340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); 5350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 5360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (pluginsPath == null) { 5370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(TAG, "No plugins path found!"); 5380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 5390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 5410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ZipFile zip = new ZipFile(APK_PATH); 5420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Vector<ZipEntry> files = pluginsFilesFromZip(zip); 5430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Vector<File> plugins = new Vector<File>(); 5440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int zipFilterLength = ZIP_FILTER.length(); 5450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 5460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Enumeration entries = files.elements(); 5470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project while (entries.hasMoreElements()) { 5480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ZipEntry entry = (ZipEntry) entries.nextElement(); 5490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String path = entry.getName().substring(zipFilterLength); 5500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project File outputFile = new File(pluginsPath, path); 5510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project outputFile.getParentFile().mkdirs(); 5520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 5530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (outputFile.exists() && !mDoOverwrite) { 55431a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 5550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(TAG, path + " already extracted."); 5560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 5580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (path.endsWith(PLUGIN_EXTENSION)) { 5590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // We rename plugins to be sure a half-copied 5600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // plugin is not loaded by the browser. 5610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project plugins.add(outputFile); 5620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project outputFile = new File(pluginsPath, 5630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project path + TEMPORARY_EXTENSION); 5640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project FileOutputStream fos = new FileOutputStream(outputFile); 56631a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 5670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(TAG, "copy " + entry + " to " 5680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + pluginsPath + "/" + path); 5690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project copyStreams(zip.getInputStream(entry), fos); 5710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 5740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // We now rename the .so we copied, once all their resources 5750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // are safely copied over to the user data partition. 5760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Enumeration elems = plugins.elements(); 5770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project while (elems.hasMoreElements()) { 5780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project File renamedFile = (File) elems.nextElement(); 5790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project File sourceFile = new File(renamedFile.getPath() 5800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + TEMPORARY_EXTENSION); 58131a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 5820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(TAG, "rename " + sourceFile.getPath() 5830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + " to " + renamedFile.getPath()); 5840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sourceFile.renameTo(renamedFile); 5860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 5880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project copyBuildInfos(); 5890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 5900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Refresh the plugin list. 5910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabControl.getCurrentWebView() != null) { 5920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.getCurrentWebView().refreshPlugins(false); 5930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (IOException e) { 5950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(TAG, "IO Exception: " + e); 5960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 5990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 6000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 6010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Copy the content of assets/plugins/ to the app_plugins directory 6020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * in the data partition. 6030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 6040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * This function is called every time the browser is started. 6050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * We first check if the system image is newer than the one that 6060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * copied the plugins (if there's plugins in the data partition). 6070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * If this is the case, we then check if the versions are different. 6080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * If they are different, we clean the plugins directory in the 6090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * data partition, then start a thread to copy the plugins while 6100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * the browser continue to load. 6110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 6120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param overwrite if true overwrite the files even if they are 6130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * already present (to let the user "reset" the plugins if needed). 6140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 6150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void copyPlugins(boolean overwrite) { 6160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project CopyPlugins copyPluginsFromAssets = new CopyPlugins(overwrite, this); 6170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project copyPluginsFromAssets.initPluginsPath(); 6180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (copyPluginsFromAssets.newSystemImage()) { 6190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (copyPluginsFromAssets.checkIsDifferentVersions()) { 6200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project copyPluginsFromAssets.cleanPluginsDirectory(); 6210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Thread copyplugins = new Thread(copyPluginsFromAssets); 6220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project copyplugins.setName("CopyPlugins"); 6230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project copyplugins.start(); 6240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 6250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 6260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 6270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 6280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private class ClearThumbnails extends AsyncTask<File, Void, Void> { 6290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 6300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public Void doInBackground(File... files) { 6310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (files != null) { 6320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project for (File f : files) { 6330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project f.delete(); 6340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 6350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 6360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return null; 6370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 6380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 6390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 6400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override public void onCreate(Bundle icicle) { 64131a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 6420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, this + " onStart"); 6430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 6440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onCreate(icicle); 6450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project this.requestWindowFeature(Window.FEATURE_LEFT_ICON); 6460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project this.requestWindowFeature(Window.FEATURE_RIGHT_ICON); 6470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project this.requestWindowFeature(Window.FEATURE_PROGRESS); 6480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project this.requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 6490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 6500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // test the browser in OpenGL 6510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // requestWindowFeature(Window.FEATURE_OPENGL); 6520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 6530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL); 6540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 6550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mResolver = getContentResolver(); 6560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 6570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setBaseSearchUrl(PreferenceManager.getDefaultSharedPreferences(this) 6580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .getString("search_url", "")); 6590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 6600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // 6610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // start MASF proxy service 6620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // 6630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //Intent proxyServiceIntent = new Intent(); 6640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //proxyServiceIntent.setComponent 6650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // (new ComponentName( 6660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "com.android.masfproxyservice", 6670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "com.android.masfproxyservice.MasfProxyService")); 6680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //startService(proxyServiceIntent, null); 6690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 6700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSecLockIcon = Resources.getSystem().getDrawable( 6710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project android.R.drawable.ic_secure); 6720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMixLockIcon = Resources.getSystem().getDrawable( 6730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project android.R.drawable.ic_partial_secure); 6740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mGenericFavicon = getResources().getDrawable( 6750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.drawable.app_web_browser_sm); 6760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 6770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mContentView = (FrameLayout) getWindow().getDecorView().findViewById( 6780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project com.android.internal.R.id.content); 6790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 6800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Create the tab control and our initial tab 6810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl = new TabControl(this); 6820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 6830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Open the icon database and retain all the bookmark urls for favicons 6840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project retainIconsOnStartup(); 6850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 6860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Keep a settings instance handy. 6870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSettings = BrowserSettings.getInstance(); 6880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSettings.setTabControl(mTabControl); 6890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSettings.loadFromDb(this); 6900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 6910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 6920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Browser"); 6930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 694565505b1a2c1d3099496af5910760087602e994aSatish Sampath // If this was a web search request, pass it on to the default web search provider. 695565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (handleWebSearchIntent(getIntent())) { 696565505b1a2c1d3099496af5910760087602e994aSatish Sampath moveTaskToBack(true); 697565505b1a2c1d3099496af5910760087602e994aSatish Sampath return; 698565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 699565505b1a2c1d3099496af5910760087602e994aSatish Sampath 7000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!mTabControl.restoreState(icicle)) { 7010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // clear up the thumbnail directory if we can't restore the state as 7020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // none of the files in the directory are referenced any more. 7030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new ClearThumbnails().execute( 7040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.getThumbnailDir().listFiles()); 7050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Intent intent = getIntent(); 7060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Bundle extra = intent.getExtras(); 7070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Create an initial tab. 7080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If the intent is ACTION_VIEW and data is not null, the Browser is 7090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // invoked to view the content by another application. In this case, 7100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the tab will be close when exit. 711f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project String url = getUrlFromIntent(intent); 7120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final TabControl.Tab t = mTabControl.createNewTab( 7130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent.ACTION_VIEW.equals(intent.getAction()) && 714f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project intent.getData() != null, 715f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project intent.getStringExtra(Browser.EXTRA_APPLICATION_ID), url); 7160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.setCurrentTab(t); 7170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // This is one of the only places we call attachTabToContentView 7180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // without animating from the tab picker. 7190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project attachTabToContentView(t); 7200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView webView = t.getWebView(); 7210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (extra != null) { 7220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int scale = extra.getInt(Browser.INITIAL_ZOOM_LEVEL, 0); 7230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (scale > 0 && scale <= 1000) { 7240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project webView.setInitialScale(scale); 7250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If we are not restoring from an icicle, then there is a high 7280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // likely hood this is the first run. So, check to see if the 7290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // homepage needs to be configured and copy any plugins from our 7300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // asset directory to the data partition. 7310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if ((extra == null || !extra.getBoolean("testing")) 7320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project && !mSettings.isLoginInitialized()) { 7330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setupHomePage(); 7340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project copyPlugins(true); 7360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 7370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url == null || url.length() == 0) { 7380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mSettings.isLoginInitialized()) { 7390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project webView.loadUrl(mSettings.getHomePage()); 7400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 7410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project waitForCredentials(); 7420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 7440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project webView.loadUrl(url); 7450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 7470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // TabControl.restoreState() will create a new tab even if 7480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // restoring the state fails. Attach it to the view here since we 7490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // are not animating from the tab picker. 7500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project attachTabToContentView(mTabControl.getCurrentTab()); 7510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 7530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* enables registration for changes in network status from 7540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project http stack */ 7550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mNetworkStateChangedFilter = new IntentFilter(); 7560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mNetworkStateChangedFilter.addAction( 7570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ConnectivityManager.CONNECTIVITY_ACTION); 7580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mNetworkStateIntentReceiver = new BroadcastReceiver() { 7590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 7600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onReceive(Context context, Intent intent) { 7610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (intent.getAction().equals( 7620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ConnectivityManager.CONNECTIVITY_ACTION)) { 7630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean down = intent.getBooleanExtra( 7640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); 7650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project onNetworkToggle(!down); 7660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 7690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 7710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 7720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project protected void onNewIntent(Intent intent) { 7730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TabControl.Tab current = mTabControl.getCurrentTab(); 7740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // When a tab is closed on exit, the current tab index is set to -1. 7750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Reset before proceed as Browser requires the current tab to be set. 7760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current == null) { 7770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Try to reset the tab in case the index was incorrect. 7780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project current = mTabControl.getTab(0); 7790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current == null) { 7800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // No tabs at all so just ignore this intent. 7810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 7820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.setCurrentTab(current); 7840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project attachTabToContentView(current); 7850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleAndIcon(current.getWebView()); 7860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final String action = intent.getAction(); 7880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final int flags = intent.getFlags(); 7890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (Intent.ACTION_MAIN.equals(action) || 7900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (flags & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0) { 7910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // just resume the browser 7920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 7930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (Intent.ACTION_VIEW.equals(action) 7950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || Intent.ACTION_SEARCH.equals(action) 7960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action) 7970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || Intent.ACTION_WEB_SEARCH.equals(action)) { 798565505b1a2c1d3099496af5910760087602e994aSatish Sampath // If this was a search request (e.g. search query directly typed into the address bar), 799565505b1a2c1d3099496af5910760087602e994aSatish Sampath // pass it on to the default web search provider. 800565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (handleWebSearchIntent(intent)) { 801565505b1a2c1d3099496af5910760087602e994aSatish Sampath return; 802565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 803565505b1a2c1d3099496af5910760087602e994aSatish Sampath 8040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String url = getUrlFromIntent(intent); 8050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url == null || url.length() == 0) { 8060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = mSettings.getHomePage(); 8070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (Intent.ACTION_VIEW.equals(action) && 8090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (flags & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { 810f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project final String appId = 811f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project intent.getStringExtra(Browser.EXTRA_APPLICATION_ID); 812f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project final TabControl.Tab appTab = mTabControl.getTabFromId(appId); 813f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project if (appTab != null) { 814f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project Log.i(LOGTAG, "Reusing tab for " + appId); 815f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // Dismiss the subwindow if applicable. 816f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project dismissSubWindow(appTab); 817f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // Since we might kill the WebView, remove it from the 818f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // content view first. 819f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project removeTabFromContentView(appTab); 820f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // Recreate the main WebView after destroying the old one. 821f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // If the WebView has the same original url and is on that 822f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // page, it can be reused. 823f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project boolean needsLoad = 824f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project mTabControl.recreateWebView(appTab, url); 825f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project if (current != appTab) { 826f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project showTab(appTab, needsLoad ? url : null); 827f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project } else { 828f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project if (mTabOverview != null && mAnimationCount == 0) { 829f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project sendAnimateFromOverview(appTab, false, 830f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project needsLoad ? url : null, TAB_OVERVIEW_DELAY, 831f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project null); 832f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project } else { 833f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // If the tab was the current tab, we have to attach 834f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // it to the view system again. 835f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project attachTabToContentView(appTab); 836f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project if (needsLoad) { 837f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project appTab.getWebView().loadUrl(url); 838f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project } 839f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project } 840f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project } 841f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project return; 842f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project } 8430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if FLAG_ACTIVITY_BROUGHT_TO_FRONT flag is on, the url will be 8440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // opened in a new tab unless we have reached MAX_TABS. Then the 8450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // url will be opened in the current tab. If a new tab is 8460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // created, it will have "true" for exit on close. 847f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project openTabAndShow(url, null, true, appId); 8480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 8490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if ("about:debug".equals(url)) { 8500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSettings.toggleDebugSettings(); 8510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 8520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If the Window overview is up and we are not in the midst of 8540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // an animation, animate away from the Window overview. 8550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabOverview != null && mAnimationCount == 0) { 8560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sendAnimateFromOverview(current, false, url, 8570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TAB_OVERVIEW_DELAY, null); 8580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 8590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Get rid of the subwindow if it exists 8600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dismissSubWindow(current); 8610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project current.getWebView().loadUrl(url); 8620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 8660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 867565505b1a2c1d3099496af5910760087602e994aSatish Sampath private int parseUrlShortcut(String url) { 868565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (url == null) return SHORTCUT_INVALID; 869565505b1a2c1d3099496af5910760087602e994aSatish Sampath 870565505b1a2c1d3099496af5910760087602e994aSatish Sampath // FIXME: quick search, need to be customized by setting 871565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (url.length() > 2 && url.charAt(1) == ' ') { 872565505b1a2c1d3099496af5910760087602e994aSatish Sampath switch (url.charAt(0)) { 873565505b1a2c1d3099496af5910760087602e994aSatish Sampath case 'g': return SHORTCUT_GOOGLE_SEARCH; 874565505b1a2c1d3099496af5910760087602e994aSatish Sampath case 'w': return SHORTCUT_WIKIPEDIA_SEARCH; 875565505b1a2c1d3099496af5910760087602e994aSatish Sampath case 'd': return SHORTCUT_DICTIONARY_SEARCH; 876565505b1a2c1d3099496af5910760087602e994aSatish Sampath case 'l': return SHORTCUT_GOOGLE_MOBILE_LOCAL_SEARCH; 877565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 878565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 879565505b1a2c1d3099496af5910760087602e994aSatish Sampath return SHORTCUT_INVALID; 880565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 881565505b1a2c1d3099496af5910760087602e994aSatish Sampath 882565505b1a2c1d3099496af5910760087602e994aSatish Sampath /** 883565505b1a2c1d3099496af5910760087602e994aSatish Sampath * Launches the default web search activity with the query parameters if the given intent's data 884565505b1a2c1d3099496af5910760087602e994aSatish Sampath * are identified as plain search terms and not URLs/shortcuts. 885565505b1a2c1d3099496af5910760087602e994aSatish Sampath * @return true if the intent was handled and web search activity was launched, false if not. 886565505b1a2c1d3099496af5910760087602e994aSatish Sampath */ 887565505b1a2c1d3099496af5910760087602e994aSatish Sampath private boolean handleWebSearchIntent(Intent intent) { 888565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (intent == null) return false; 889565505b1a2c1d3099496af5910760087602e994aSatish Sampath 890565505b1a2c1d3099496af5910760087602e994aSatish Sampath String url = null; 891565505b1a2c1d3099496af5910760087602e994aSatish Sampath final String action = intent.getAction(); 892565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (Intent.ACTION_VIEW.equals(action)) { 893565505b1a2c1d3099496af5910760087602e994aSatish Sampath url = intent.getData().toString(); 894565505b1a2c1d3099496af5910760087602e994aSatish Sampath } else if (Intent.ACTION_SEARCH.equals(action) 895565505b1a2c1d3099496af5910760087602e994aSatish Sampath || MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action) 896565505b1a2c1d3099496af5910760087602e994aSatish Sampath || Intent.ACTION_WEB_SEARCH.equals(action)) { 897565505b1a2c1d3099496af5910760087602e994aSatish Sampath url = intent.getStringExtra(SearchManager.QUERY); 898565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 899565505b1a2c1d3099496af5910760087602e994aSatish Sampath return handleWebSearchRequest(url); 900565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 901565505b1a2c1d3099496af5910760087602e994aSatish Sampath 902565505b1a2c1d3099496af5910760087602e994aSatish Sampath /** 903565505b1a2c1d3099496af5910760087602e994aSatish Sampath * Launches the default web search activity with the query parameters if the given url string 904565505b1a2c1d3099496af5910760087602e994aSatish Sampath * was identified as plain search terms and not URL/shortcut. 905565505b1a2c1d3099496af5910760087602e994aSatish Sampath * @return true if the request was handled and web search activity was launched, false if not. 906565505b1a2c1d3099496af5910760087602e994aSatish Sampath */ 907565505b1a2c1d3099496af5910760087602e994aSatish Sampath private boolean handleWebSearchRequest(String inUrl) { 908565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (inUrl == null) return false; 909565505b1a2c1d3099496af5910760087602e994aSatish Sampath 910565505b1a2c1d3099496af5910760087602e994aSatish Sampath // In general, we shouldn't modify URL from Intent. 911565505b1a2c1d3099496af5910760087602e994aSatish Sampath // But currently, we get the user-typed URL from search box as well. 912565505b1a2c1d3099496af5910760087602e994aSatish Sampath String url = fixUrl(inUrl).trim(); 913565505b1a2c1d3099496af5910760087602e994aSatish Sampath 914565505b1a2c1d3099496af5910760087602e994aSatish Sampath // URLs and site specific search shortcuts are handled by the regular flow of control, so 915565505b1a2c1d3099496af5910760087602e994aSatish Sampath // return early. 916565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (Regex.WEB_URL_PATTERN.matcher(url).matches() 917bc5b9f358a2b75bf3a104b9f5cd477ad2f6f740fSatish Sampath || ACCEPTED_URI_SCHEMA.matcher(url).matches() 918565505b1a2c1d3099496af5910760087602e994aSatish Sampath || parseUrlShortcut(url) != SHORTCUT_INVALID) { 919565505b1a2c1d3099496af5910760087602e994aSatish Sampath return false; 920565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 921565505b1a2c1d3099496af5910760087602e994aSatish Sampath 922565505b1a2c1d3099496af5910760087602e994aSatish Sampath Browser.updateVisitedHistory(mResolver, url, false); 923565505b1a2c1d3099496af5910760087602e994aSatish Sampath Browser.addSearchUrl(mResolver, url); 924565505b1a2c1d3099496af5910760087602e994aSatish Sampath 925565505b1a2c1d3099496af5910760087602e994aSatish Sampath Intent intent = new Intent(Intent.ACTION_WEB_SEARCH); 926565505b1a2c1d3099496af5910760087602e994aSatish Sampath intent.addCategory(Intent.CATEGORY_DEFAULT); 927565505b1a2c1d3099496af5910760087602e994aSatish Sampath intent.putExtra(SearchManager.QUERY, url); 928565505b1a2c1d3099496af5910760087602e994aSatish Sampath startActivity(intent); 929565505b1a2c1d3099496af5910760087602e994aSatish Sampath 930565505b1a2c1d3099496af5910760087602e994aSatish Sampath return true; 931565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 932565505b1a2c1d3099496af5910760087602e994aSatish Sampath 9330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String getUrlFromIntent(Intent intent) { 9340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String url = null; 9350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (intent != null) { 9360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final String action = intent.getAction(); 9370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (Intent.ACTION_VIEW.equals(action)) { 9380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = smartUrlFilter(intent.getData()); 9390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null && url.startsWith("content:")) { 9400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* Append mimetype so webview knows how to display */ 9410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String mimeType = intent.resolveType(getContentResolver()); 9420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mimeType != null) { 9430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url += "?" + mimeType; 9440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (Intent.ACTION_SEARCH.equals(action) 9470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action) 9480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || Intent.ACTION_WEB_SEARCH.equals(action)) { 9490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = intent.getStringExtra(SearchManager.QUERY); 9500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null) { 9510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mLastEnteredUrl = url; 9520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Don't add Urls, just search terms. 9530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Urls will get added when the page is loaded. 9540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!Regex.WEB_URL_PATTERN.matcher(url).matches()) { 9550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Browser.updateVisitedHistory(mResolver, url, false); 9560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // In general, we shouldn't modify URL from Intent. 9580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // But currently, we get the user-typed URL from search box as well. 9590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = fixUrl(url); 9600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = smartUrlFilter(url); 9610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String searchSource = "&source=android-" + GOOGLE_SEARCH_SOURCE_SUGGEST + "&"; 9620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url.contains(searchSource)) { 9630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String source = null; 9640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Bundle appData = intent.getBundleExtra(SearchManager.APP_DATA); 9650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (appData != null) { 9660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project source = appData.getString(SearchManager.SOURCE); 9670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (TextUtils.isEmpty(source)) { 9690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project source = GOOGLE_SEARCH_SOURCE_UNKNOWN; 9700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = url.replace(searchSource, "&source=android-"+source+"&"); 9720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return url; 9770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 9790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ static String fixUrl(String inUrl) { 9800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (inUrl.startsWith("http://") || inUrl.startsWith("https://")) 9810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return inUrl; 9820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (inUrl.startsWith("http:") || 9830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inUrl.startsWith("https:")) { 9840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (inUrl.startsWith("http:/") || inUrl.startsWith("https:/")) { 9850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inUrl = inUrl.replaceFirst("/", "//"); 9860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else inUrl = inUrl.replaceFirst(":", "://"); 9870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return inUrl; 9890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 9910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 9920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Looking for the pattern like this 9930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 9940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * * 9950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * * * 9960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * *** * ******* 9970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * * * 9980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * * * 9990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * * 10000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 10010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final SensorListener mSensorListener = new SensorListener() { 10020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mLastGestureTime; 10030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private float[] mPrev = new float[3]; 10040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private float[] mPrevDiff = new float[3]; 10050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private float[] mDiff = new float[3]; 10060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private float[] mRevertDiff = new float[3]; 10070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onSensorChanged(int sensor, float[] values) { 10090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean show = false; 10100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project float[] diff = new float[3]; 10110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project for (int i = 0; i < 3; i++) { 10130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project diff[i] = values[i] - mPrev[i]; 10140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (Math.abs(diff[i]) > 1) { 10150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project show = true; 10160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if ((diff[i] > 1.0 && mDiff[i] < 0.2) 10180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || (diff[i] < -1.0 && mDiff[i] > -0.2)) { 10190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // start track when there is a big move, or revert 10200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mRevertDiff[i] = mDiff[i]; 10210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mDiff[i] = 0; 10220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (diff[i] > -0.2 && diff[i] < 0.2) { 10230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // reset when it is flat 10240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mDiff[i] = mRevertDiff[i] = 0; 10250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mDiff[i] += diff[i]; 10270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPrevDiff[i] = diff[i]; 10280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPrev[i] = values[i]; 10290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (false) { 10320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // only shows if we think the delta is big enough, in an attempt 10330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // to detect "serious" moves left/right or up/down 10340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.d("BrowserSensorHack", "sensorChanged " + sensor + " (" 10350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + values[0] + ", " + values[1] + ", " + values[2] + ")" 10360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + " diff(" + diff[0] + " " + diff[1] + " " + diff[2] 10370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + ")"); 10380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.d("BrowserSensorHack", " mDiff(" + mDiff[0] + " " 10390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + mDiff[1] + " " + mDiff[2] + ")" + " mRevertDiff(" 10400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + mRevertDiff[0] + " " + mRevertDiff[1] + " " 10410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + mRevertDiff[2] + ")"); 10420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project long now = android.os.SystemClock.uptimeMillis(); 10450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (now - mLastGestureTime > 1000) { 10460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mLastGestureTime = 0; 10470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project float y = mDiff[1]; 10490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project float z = mDiff[2]; 10500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project float ay = Math.abs(y); 10510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project float az = Math.abs(z); 10520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project float ry = mRevertDiff[1]; 10530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project float rz = mRevertDiff[2]; 10540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project float ary = Math.abs(ry); 10550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project float arz = Math.abs(rz); 10560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean gestY = ay > 2.5f && ary > 1.0f && ay > ary; 10570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean gestZ = az > 3.5f && arz > 1.0f && az > arz; 10580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if ((gestY || gestZ) && !(gestY && gestZ)) { 10600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView view = mTabControl.getCurrentWebView(); 10610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (view != null) { 10630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (gestZ) { 10640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (z < 0) { 10650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project view.zoomOut(); 10660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 10670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project view.zoomIn(); 10680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 10700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project view.flingScroll(0, Math.round(y * 100)); 10710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mLastGestureTime = now; 10740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onAccuracyChanged(int sensor, int accuracy) { 10790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // TODO Auto-generated method stub 10800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 10830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override protected void onResume() { 10850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onResume(); 108631a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 10870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, "BrowserActivity.onResume: this=" + this); 10880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!mActivityInPause) { 10910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(LOGTAG, "BrowserActivity is already resumed."); 10920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 10930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mActivityInPause = false; 10960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resumeWebView(); 10970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mWakeLock.isHeld()) { 10990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.removeMessages(RELEASE_WAKELOCK); 11000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWakeLock.release(); 11010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mCredsDlg != null) { 11040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!mHandler.hasMessages(CANCEL_CREDS_REQUEST)) { 11050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // In case credential request never comes back 11060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.sendEmptyMessageDelayed(CANCEL_CREDS_REQUEST, 6000); 11070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project registerReceiver(mNetworkStateIntentReceiver, 11110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mNetworkStateChangedFilter); 11120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView.enablePlatformNotifications(); 11130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mSettings.doFlick()) { 11150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mSensorManager == null) { 11160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSensorManager = (SensorManager) getSystemService( 11170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Context.SENSOR_SERVICE); 11180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSensorManager.registerListener(mSensorListener, 11200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project SensorManager.SENSOR_ACCELEROMETER, 11210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project SensorManager.SENSOR_DELAY_FASTEST); 11220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 11230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSensorManager = null; 11240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 11280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * onSaveInstanceState(Bundle map) 11290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * onSaveInstanceState is called right before onStop(). The map contains 11300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * the saved state. 11310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 11320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override protected void onSaveInstanceState(Bundle outState) { 113331a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 11340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, "BrowserActivity.onSaveInstanceState: this=" + this); 11350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the default implementation requires each view to have an id. As the 11370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // browser handles the state itself and it doesn't use id for the views, 11380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // don't call the default implementation. Otherwise it will trigger the 11390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // warning like this, "couldn't save which view has focus because the 11400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // focused view XXX has no id". 11410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Save all the tabs 11430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.saveState(outState); 11440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override protected void onPause() { 11470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onPause(); 11480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mActivityInPause) { 11500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(LOGTAG, "BrowserActivity is already paused."); 11510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 11520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mActivityInPause = true; 11550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabControl.getCurrentIndex() >= 0 && !pauseWebView()) { 11560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWakeLock.acquire(); 11570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.sendMessageDelayed(mHandler 11580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .obtainMessage(RELEASE_WAKELOCK), WAKELOCK_TIMEOUT); 11590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Clear the credentials toast if it is up 11620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mCredsDlg != null && mCredsDlg.isShowing()) { 11630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCredsDlg.dismiss(); 11640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCredsDlg = null; 11660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project cancelStopToast(); 11680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // unregister network state listener 11700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project unregisterReceiver(mNetworkStateIntentReceiver); 11710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView.disablePlatformNotifications(); 11720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mSensorManager != null) { 11740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSensorManager.unregisterListener(mSensorListener); 11750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override protected void onDestroy() { 117931a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 11800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, "BrowserActivity.onDestroy: this=" + this); 11810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onDestroy(); 11830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Remove the current tab and sub window 11840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TabControl.Tab t = mTabControl.getCurrentTab(); 11850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dismissSubWindow(t); 11860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project removeTabFromContentView(t); 11870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Destroy all the tabs 11880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.destroy(); 11890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebIconDatabase.getInstance().close(); 11900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mGlsConnection != null) { 11910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project unbindService(mGlsConnection); 11920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mGlsConnection = null; 11930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // 11960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // stop MASF proxy service 11970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // 11980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //Intent proxyServiceIntent = new Intent(); 11990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //proxyServiceIntent.setComponent 12000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // (new ComponentName( 12010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "com.android.masfproxyservice", 12020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "com.android.masfproxyservice.MasfProxyService")); 12030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //stopService(proxyServiceIntent); 12040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 12060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 12070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onConfigurationChanged(Configuration newConfig) { 12080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onConfigurationChanged(newConfig); 12090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 12100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mPageInfoDialog != null) { 12110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoDialog.dismiss(); 12120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showPageInfo( 12130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoView, 12140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoFromShowSSLCertificateOnError.booleanValue()); 12150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mSSLCertificateDialog != null) { 12170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateDialog.dismiss(); 12180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificate( 12190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateView); 12200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mSSLCertificateOnErrorDialog != null) { 12220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorDialog.dismiss(); 12230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificateOnError( 12240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView, 12250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler, 12260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError); 12270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mHttpAuthenticationDialog != null) { 12290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String title = ((TextView) mHttpAuthenticationDialog 12300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .findViewById(com.android.internal.R.id.alertTitle)).getText() 12310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .toString(); 12320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String name = ((TextView) mHttpAuthenticationDialog 12330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .findViewById(R.id.username_edit)).getText().toString(); 12340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String password = ((TextView) mHttpAuthenticationDialog 12350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .findViewById(R.id.password_edit)).getText().toString(); 12360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int focusId = mHttpAuthenticationDialog.getCurrentFocus() 12370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .getId(); 12380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthenticationDialog.dismiss(); 12390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showHttpAuthentication(mHttpAuthHandler, null, null, title, 12400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project name, password, focusId); 12410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mFindDialog != null && mFindDialog.isShowing()) { 12430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mFindDialog.onConfigurationChanged(newConfig); 12440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 12470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override public void onLowMemory() { 12480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onLowMemory(); 12490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.freeMemory(); 12500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 12520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private boolean resumeWebView() { 12530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if ((!mActivityInPause && !mPageStarted) || 12540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (mActivityInPause && mPageStarted)) { 12550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project CookieSyncManager.getInstance().startSync(); 12560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = mTabControl.getCurrentWebView(); 12570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 12580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.resumeTimers(); 12590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 12610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 12620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 12630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 12660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private boolean pauseWebView() { 12670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mActivityInPause && !mPageStarted) { 12680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project CookieSyncManager.getInstance().stopSync(); 12690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = mTabControl.getCurrentWebView(); 12700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 12710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.pauseTimers(); 12720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 12740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 12750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 12760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 12790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* 12800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * This function is called when we are launching for the first time. We 12810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * are waiting for the login credentials before loading Google home 12820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * pages. This way the user will be logged in straight away. 12830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 12840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void waitForCredentials() { 12850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Show a toast 12860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCredsDlg = new ProgressDialog(this); 12870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCredsDlg.setIndeterminate(true); 12880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCredsDlg.setMessage(getText(R.string.retrieving_creds_dlg_msg)); 12890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If the user cancels the operation, then cancel the Google 12900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Credentials request. 12910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCredsDlg.setCancelMessage(mHandler.obtainMessage(CANCEL_CREDS_REQUEST)); 12920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCredsDlg.show(); 12930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 12940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // We set a timeout for the retrieval of credentials in onResume() 12950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // as that is when we have freed up some CPU time to get 12960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the login credentials. 12970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 12990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* 13000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * If we have received the credentials or we have timed out and we are 13010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * showing the credentials dialog, then it is time to move on. 13020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 13030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void resumeAfterCredentials() { 13040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mCredsDlg == null) { 13050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 13060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 13070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Clear the toast 13090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mCredsDlg.isShowing()) { 13100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCredsDlg.dismiss(); 13110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 13120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCredsDlg = null; 13130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Clear any pending timeout 13150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.removeMessages(CANCEL_CREDS_REQUEST); 13160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Load the page 13180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = mTabControl.getCurrentWebView(); 13190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 13200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.loadUrl(mSettings.getHomePage()); 13210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 13220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Update the settings, need to do this last as it can take a moment 13240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // to persist the settings. In the mean time we could be loading 13250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // content. 13260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSettings.setLoginInitialized(this); 13270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 13280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Open the icon database and retain all the icons for visited sites. 13300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void retainIconsOnStartup() { 13310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebIconDatabase db = WebIconDatabase.getInstance(); 13320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project db.open(getDir("icons", 0).getPath()); 13330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 13340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Cursor c = Browser.getAllBookmarks(mResolver); 13350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!c.moveToFirst()) { 13360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project c.deactivate(); 13370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 13380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 13390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int urlIndex = c.getColumnIndex(Browser.BookmarkColumns.URL); 13400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project do { 13410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String url = c.getString(urlIndex); 13420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project db.retainIconForPageUrl(url); 13430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } while (c.moveToNext()); 13440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project c.deactivate(); 13450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (IllegalStateException e) { 13460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(LOGTAG, "retainIconsOnStartup", e); 13470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 13480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 13490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Helper method for getting the top window. 13510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView getTopWindow() { 13520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return mTabControl.getCurrentTopWebView(); 13530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 13540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 13560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onCreateOptionsMenu(Menu menu) { 13570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onCreateOptionsMenu(menu); 13580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project MenuInflater inflater = getMenuInflater(); 13600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inflater.inflate(R.menu.browser, menu); 13610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenu = menu; 13620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project updateInLoadMenuItems(); 13630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 13640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 13650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 13670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * As the menu can be open when loading state changes 13680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * we must manually update the state of the stop/reload menu 13690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * item 13700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 13710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void updateInLoadMenuItems() { 13720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mMenu == null) { 13730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 13740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 13750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project MenuItem src = mInLoad ? 13760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenu.findItem(R.id.stop_menu_id): 13770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenu.findItem(R.id.reload_menu_id); 13780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project MenuItem dest = mMenu.findItem(R.id.stop_reload_menu_id); 13790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dest.setIcon(src.getIcon()); 13800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dest.setTitle(src.getTitle()); 13810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 13820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 13840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onContextItemSelected(MenuItem item) { 13850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // chording is not an issue with context menus, but we use the same 13860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // options selector, so set mCanChord to true so we can access them. 13870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCanChord = true; 13880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int id = item.getItemId(); 13890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView webView = getTopWindow(); 13900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final HashMap hrefMap = new HashMap(); 13910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project hrefMap.put("webview", webView); 13920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Message msg = mHandler.obtainMessage( 13930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project FOCUS_NODE_HREF, id, 0, hrefMap); 13940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (id) { 13950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // -- Browser context menu 13960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.open_context_menu_id: 13970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.open_newtab_context_menu_id: 13980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.bookmark_context_menu_id: 13990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.save_link_context_menu_id: 14000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.share_link_context_menu_id: 14010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.copy_link_context_menu_id: 14020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project webView.requestFocusNodeHref(msg); 14030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project default: 14060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // For other context menus 14070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return onOptionsItemSelected(item); 14080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCanChord = false; 14100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 14110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Bundle createGoogleSearchSourceBundle(String source) { 14140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Bundle bundle = new Bundle(); 14150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project bundle.putString(SearchManager.SOURCE, source); 14160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return bundle; 14170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 14204e5f58704099c37186d4825c3d55ea5b0527867fThe Android Open Source Project * Overriding this to insert a local information bundle 14210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 14220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 14230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onSearchRequested() { 14240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project startSearch(null, false, 14254e5f58704099c37186d4825c3d55ea5b0527867fThe Android Open Source Project createGoogleSearchSourceBundle(GOOGLE_SEARCH_SOURCE_SEARCHKEY), false); 14260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 14270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 14300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void startSearch(String initialQuery, boolean selectInitialQuery, 14310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Bundle appSearchData, boolean globalSearch) { 14320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (appSearchData == null) { 14330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project appSearchData = createGoogleSearchSourceBundle(GOOGLE_SEARCH_SOURCE_TYPE); 14340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.startSearch(initialQuery, selectInitialQuery, appSearchData, globalSearch); 14360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 14390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onOptionsItemSelected(MenuItem item) { 14400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!mCanChord) { 14410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // The user has already fired a shortcut with this hold down of the 14420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // menu key. 14430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 14440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (item.getItemId()) { 14460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // -- Main menu 14470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.goto_menu_id: { 14480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String url = getTopWindow().getUrl(); 14490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project startSearch(mSettings.getHomePage().equals(url) ? null : url, true, 14500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project createGoogleSearchSourceBundle(GOOGLE_SEARCH_SOURCE_GOTO), false); 14510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.bookmarks_menu_id: 14550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project bookmarksOrHistoryPicker(false); 14560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.windows_menu_id: 14590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabControl.getTabCount() == 1) { 1460f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project openTabAndShow(mSettings.getHomePage(), null, false, null); 14610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 14620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project tabPicker(true, mTabControl.getCurrentIndex(), false); 14630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.stop_reload_menu_id: 14670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mInLoad) { 14680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project stopLoading(); 14690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 14700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().reload(); 14710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.back_menu_id: 14750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().goBack(); 14760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.forward_menu_id: 14790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().goForward(); 14800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.close_menu_id: 14830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Close the subwindow if it exists. 14840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabControl.getCurrentSubWindow() != null) { 14850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dismissSubWindow(mTabControl.getCurrentTab()); 14860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final int currentIndex = mTabControl.getCurrentIndex(); 14890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final TabControl.Tab parent = 14900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.getCurrentTab().getParentTab(); 14910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int indexToShow = -1; 14920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (parent != null) { 14930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project indexToShow = mTabControl.getTabIndex(parent); 14940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 14950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Get the last tab in the list. If it is the current tab, 14960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // subtract 1 more. 14970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project indexToShow = mTabControl.getTabCount() - 1; 14980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (currentIndex == indexToShow) { 14990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project indexToShow--; 15000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switchTabs(currentIndex, indexToShow, true); 15030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.homepage_menu_id: 15060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TabControl.Tab current = mTabControl.getCurrentTab(); 15070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current != null) { 15080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dismissSubWindow(current); 15090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project current.getWebView().loadUrl(mSettings.getHomePage()); 15100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.preferences_menu_id: 15140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent = new Intent(this, 15150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserPreferencesPage.class); 15160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project startActivityForResult(intent, PREFERENCES_PAGE); 15170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.find_menu_id: 15200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (null == mFindDialog) { 15210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mFindDialog = new FindDialog(this); 15220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mFindDialog.setWebView(getTopWindow()); 15240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mFindDialog.show(); 15250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenuState = EMPTY_MENU; 15260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.select_text_id: 15290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().emulateShiftHeld(); 15300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.page_info_menu_id: 15320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showPageInfo(mTabControl.getCurrentTab(), false); 15330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.classic_history_menu_id: 15360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project bookmarksOrHistoryPicker(true); 15370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.share_page_menu_id: 15400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Browser.sendString(this, getTopWindow().getUrl()); 15410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.dump_nav_menu_id: 15440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().debugDump(); 15450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.zoom_in_menu_id: 15480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().zoomIn(); 15490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.zoom_out_menu_id: 15520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().zoomOut(); 15530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.view_downloads_menu_id: 15560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project viewDownloads(null); 15570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // -- Tab menu 15600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.view_tab_menu_id: 15610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabListener != null && mTabOverview != null) { 15620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int pos = mTabOverview.getContextMenuPosition(item); 15630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabOverview.setCurrentIndex(pos); 15640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabListener.onClick(pos); 15650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.remove_tab_menu_id: 15690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabListener != null && mTabOverview != null) { 15700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int pos = mTabOverview.getContextMenuPosition(item); 15710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabListener.remove(pos); 15720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.new_tab_menu_id: 15760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // No need to check for mTabOverview here since we are not 15770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // dependent on it for a position. 15780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabListener != null) { 15790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If the overview happens to be non-null, make the "New 15800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Tab" cell visible. 15810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabOverview != null) { 15820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabOverview.setCurrentIndex(ImageGrid.NEW_TAB); 15830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabListener.onClick(ImageGrid.NEW_TAB); 15850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.bookmark_tab_menu_id: 15890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabListener != null && mTabOverview != null) { 15900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int pos = mTabOverview.getContextMenuPosition(item); 15910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TabControl.Tab t = mTabControl.getTab(pos); 15920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Since we called populatePickerData for all of the 15930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // tabs, getTitle and getUrl will return appropriate 15940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // values. 15950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Browser.saveBookmark(BrowserActivity.this, t.getTitle(), 15960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project t.getUrl()); 15970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.history_tab_menu_id: 16010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project bookmarksOrHistoryPicker(true); 16020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 16030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.bookmarks_tab_menu_id: 16050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project bookmarksOrHistoryPicker(false); 16060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 16070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.properties_tab_menu_id: 16090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabListener != null && mTabOverview != null) { 16100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int pos = mTabOverview.getContextMenuPosition(item); 16110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showPageInfo(mTabControl.getTab(pos), false); 16120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 16140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_one_menu_id: 16160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_two_menu_id: 16170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_three_menu_id: 16180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_four_menu_id: 16190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_five_menu_id: 16200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_six_menu_id: 16210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_seven_menu_id: 16220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_eight_menu_id: 16230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project { 16240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int menuid = item.getItemId(); 16250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project for (int id = 0; id < WINDOW_SHORTCUT_ID_ARRAY.length; id++) { 16260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (WINDOW_SHORTCUT_ID_ARRAY[id] == menuid) { 16270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TabControl.Tab desiredTab = mTabControl.getTab(id); 16280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (desiredTab != null && 16290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project desiredTab != mTabControl.getCurrentTab()) { 16300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switchTabs(mTabControl.getCurrentIndex(), id, false); 16310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 16330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 16370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project default: 16390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!super.onOptionsItemSelected(item)) { 16400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 16410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Otherwise fall through. 16430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCanChord = false; 16450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 16460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void closeFind() { 16490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenuState = R.id.MAIN_MENU; 16500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override public boolean onPrepareOptionsMenu(Menu menu) 16530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project { 16540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // This happens when the user begins to hold down the menu key, so 16550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // allow them to chord to get a shortcut. 16560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCanChord = true; 16570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Note: setVisible will decide whether an item is visible; while 16580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // setEnabled() will decide whether an item is enabled, which also means 16590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // whether the matching shortcut key will function. 16600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onPrepareOptionsMenu(menu); 16610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (mMenuState) { 16620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.TAB_MENU: 16630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mCurrentMenuState != mMenuState) { 16640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.MAIN_MENU, false); 16650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupEnabled(R.id.MAIN_MENU, false); 16660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupEnabled(R.id.MAIN_SHORTCUT_MENU, false); 16670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.TAB_MENU, true); 16680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupEnabled(R.id.TAB_MENU, true); 16690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean newT = mTabControl.getTabCount() < TabControl.MAX_TABS; 16710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final MenuItem tab = menu.findItem(R.id.new_tab_menu_id); 16720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project tab.setVisible(newT); 16730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project tab.setEnabled(newT); 16740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 16750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case EMPTY_MENU: 16760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mCurrentMenuState != mMenuState) { 16770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.MAIN_MENU, false); 16780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupEnabled(R.id.MAIN_MENU, false); 16790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupEnabled(R.id.MAIN_SHORTCUT_MENU, false); 16800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.TAB_MENU, false); 16810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupEnabled(R.id.TAB_MENU, false); 16820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 16840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project default: 16850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mCurrentMenuState != mMenuState) { 16860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.MAIN_MENU, true); 16870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupEnabled(R.id.MAIN_MENU, true); 16880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupEnabled(R.id.MAIN_SHORTCUT_MENU, true); 16890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.TAB_MENU, false); 16900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupEnabled(R.id.TAB_MENU, false); 16910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView w = getTopWindow(); 16930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean canGoBack = false; 16940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean canGoForward = false; 16950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean isHome = false; 16960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 16970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project canGoBack = w.canGoBack(); 16980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project canGoForward = w.canGoForward(); 16990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project isHome = mSettings.getHomePage().equals(w.getUrl()); 17000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final MenuItem back = menu.findItem(R.id.back_menu_id); 17020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project back.setEnabled(canGoBack); 17030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final MenuItem home = menu.findItem(R.id.homepage_menu_id); 17050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project home.setEnabled(!isHome); 17060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.forward_menu_id) 17080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setEnabled(canGoForward); 17090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // decide whether to show the share link option 17110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project PackageManager pm = getPackageManager(); 17120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent send = new Intent(Intent.ACTION_SEND); 17130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project send.setType("text/plain"); 17140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ResolveInfo ri = pm.resolveActivity(send, PackageManager.MATCH_DEFAULT_ONLY); 17150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.share_page_menu_id).setVisible(ri != null); 17160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If there is only 1 window, the text will be "New window" 17180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final MenuItem windows = menu.findItem(R.id.windows_menu_id); 17190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project windows.setTitleCondensed(mTabControl.getTabCount() > 1 ? 17200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getString(R.string.view_tabs_condensed) : 17210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getString(R.string.tab_picker_new_tab)); 17220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean isNavDump = mSettings.isNavDump(); 17240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final MenuItem nav = menu.findItem(R.id.dump_nav_menu_id); 17250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project nav.setVisible(isNavDump); 17260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project nav.setEnabled(isNavDump); 17270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 17280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCurrentMenuState = mMenuState; 17300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 17310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 17340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCreateContextMenu(ContextMenu menu, View v, 17350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ContextMenuInfo menuInfo) { 17360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView webview = (WebView) v; 17370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView.HitTestResult result = webview.getHitTestResult(); 17380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (result == null) { 17390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 17400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int type = result.getType(); 17430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (type == WebView.HitTestResult.UNKNOWN_TYPE) { 17440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.w(LOGTAG, 17450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "We should not show context menu when nothing is touched"); 17460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 17470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (type == WebView.HitTestResult.EDIT_TEXT_TYPE) { 17490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // let TextView handles context menu 17500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 17510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Note, http://b/issue?id=1106666 is requesting that 17540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // an inflated menu can be used again. This is not available 17550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // yet, so inflate each time (yuk!) 17560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project MenuInflater inflater = getMenuInflater(); 17570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inflater.inflate(R.menu.browsercontext, menu); 17580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Show the correct menu group 17600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String extra = result.getExtra(); 17610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.PHONE_MENU, 17620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project type == WebView.HitTestResult.PHONE_TYPE); 17630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.EMAIL_MENU, 17640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project type == WebView.HitTestResult.EMAIL_TYPE); 17650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.GEO_MENU, 17660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project type == WebView.HitTestResult.GEO_TYPE); 17670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.IMAGE_MENU, 17680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project type == WebView.HitTestResult.IMAGE_TYPE 17690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE); 17700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.ANCHOR_MENU, 17710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project type == WebView.HitTestResult.SRC_ANCHOR_TYPE 17720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE); 17730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Setup custom handling depending on the type 17750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (type) { 17760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.PHONE_TYPE: 17770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setHeaderTitle(Uri.decode(extra)); 17780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.dial_context_menu_id).setIntent( 17790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Intent(Intent.ACTION_VIEW, Uri 17800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .parse(WebView.SCHEME_TEL + extra))); 17810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent addIntent = new Intent(Intent.ACTION_INSERT_OR_EDIT); 17820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project addIntent.putExtra(Insert.PHONE, Uri.decode(extra)); 17830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project addIntent.setType(Contacts.People.CONTENT_ITEM_TYPE); 17840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.add_contact_context_menu_id).setIntent( 17850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project addIntent); 17860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.copy_phone_context_menu_id).setOnMenuItemClickListener( 17870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Copy(extra)); 17880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 17890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.EMAIL_TYPE: 17910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setHeaderTitle(extra); 17920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.email_context_menu_id).setIntent( 17930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Intent(Intent.ACTION_VIEW, Uri 17940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .parse(WebView.SCHEME_MAILTO + extra))); 17950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.copy_mail_context_menu_id).setOnMenuItemClickListener( 17960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Copy(extra)); 17970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 17980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.GEO_TYPE: 18000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setHeaderTitle(extra); 18010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.map_context_menu_id).setIntent( 18020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Intent(Intent.ACTION_VIEW, Uri 18030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .parse(WebView.SCHEME_GEO 18040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + URLEncoder.encode(extra)))); 18050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.copy_geo_context_menu_id).setOnMenuItemClickListener( 18060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Copy(extra)); 18070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 18080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.SRC_ANCHOR_TYPE: 18100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE: 18110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TextView titleView = (TextView) LayoutInflater.from(this) 18120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(android.R.layout.browser_link_context_header, 18130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project null); 18140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project titleView.setText(extra); 18150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setHeaderView(titleView); 18160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // decide whether to show the open link in new tab option 18170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.open_newtab_context_menu_id).setVisible( 18180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.getTabCount() < TabControl.MAX_TABS); 18190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project PackageManager pm = getPackageManager(); 18200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent send = new Intent(Intent.ACTION_SEND); 18210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project send.setType("text/plain"); 18220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ResolveInfo ri = pm.resolveActivity(send, PackageManager.MATCH_DEFAULT_ONLY); 18230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.share_link_context_menu_id).setVisible(ri != null); 18240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (type == WebView.HitTestResult.SRC_ANCHOR_TYPE) { 18250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 18260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // otherwise fall through to handle image part 18280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.IMAGE_TYPE: 18290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (type == WebView.HitTestResult.IMAGE_TYPE) { 18300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setHeaderTitle(extra); 18310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.view_image_context_menu_id).setIntent( 18330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Intent(Intent.ACTION_VIEW, Uri.parse(extra))); 18340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.download_context_menu_id). 18350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setOnMenuItemClickListener(new Download(extra)); 18360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 18370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project default: 18390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.w(LOGTAG, "We should not get here."); 18400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 18410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Attach the given tab to the content view. 18450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void attachTabToContentView(TabControl.Tab t) { 18460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView main = t.getWebView(); 18470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Attach the main WebView. 18480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mContentView.addView(main, COVER_SCREEN_PARAMS); 18490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Attach the sub window if necessary 18500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project attachSubWindow(t); 18510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Request focus on the top window. 18520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project t.getTopWindow().requestFocus(); 18530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Attach a sub window to the main WebView of the given tab. 18560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void attachSubWindow(TabControl.Tab t) { 18570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If a sub window exists, attach it to the content view. 18580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView subView = t.getSubWebView(); 18590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (subView != null) { 18600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final View container = t.getSubWebViewContainer(); 18610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mContentView.addView(container, COVER_SCREEN_PARAMS); 18620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project subView.requestFocus(); 18630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Remove the given tab from the content view. 18670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void removeTabFromContentView(TabControl.Tab t) { 1868cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project // Remove the main WebView. 18690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mContentView.removeView(t.getWebView()); 18700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Remove the sub window if it exists. 18710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (t.getSubWebView() != null) { 18720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mContentView.removeView(t.getSubWebViewContainer()); 18730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Remove the sub window if it exists. Also called by TabControl when the 18770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // user clicks the 'X' to dismiss a sub window. 18780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ void dismissSubWindow(TabControl.Tab t) { 18790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView mainView = t.getWebView(); 18800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (t.getSubWebView() != null) { 18810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Remove the container view and request focus on the main WebView. 18820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mContentView.removeView(t.getSubWebViewContainer()); 18830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mainView.requestFocus(); 18840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Tell the TabControl to dismiss the subwindow. This will destroy 18850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the WebView. 18860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.dismissSubWindow(t); 18870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Send the ANIMTE_FROM_OVERVIEW message after changing the current tab. 18910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void sendAnimateFromOverview(final TabControl.Tab tab, 18920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final boolean newTab, final String url, final int delay, 18930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Message msg) { 18940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Set the current tab. 18950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.setCurrentTab(tab); 18960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Attach the WebView so it will layout. 18970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project attachTabToContentView(tab); 18980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Set the view to invisibile for now. 18990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project tab.getWebView().setVisibility(View.INVISIBLE); 19000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If there is a sub window, make it invisible too. 19010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (tab.getSubWebView() != null) { 19020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project tab.getSubWebViewContainer().setVisibility(View.INVISIBLE); 19030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Create our fake animating view. 19050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final AnimatingView view = new AnimatingView(this, tab); 19060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Attach it to the view system and make in invisible so it will 19070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // layout but not flash white on the screen. 19080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mContentView.addView(view, COVER_SCREEN_PARAMS); 19090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project view.setVisibility(View.INVISIBLE); 19100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Send the animate message. 19110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final HashMap map = new HashMap(); 19120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project map.put("view", view); 19130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Load the url after the AnimatingView has captured the picture. This 19140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // prevents any bad layout or bad scale from being used during 19150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // animation. 19160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null) { 19170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dismissSubWindow(tab); 19180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project tab.getWebView().loadUrl(url); 19190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project map.put("msg", msg); 19210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.sendMessageDelayed(mHandler.obtainMessage( 19220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ANIMATE_FROM_OVERVIEW, newTab ? 1 : 0, 0, map), delay); 19230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Increment the count to indicate that we are in an animation. 19240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mAnimationCount++; 19250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Remove the listener so we don't get any more tab changes. 19260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabOverview.setListener(null); 19270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabListener = null; 19280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Make the menu empty until the animation completes. 19290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenuState = EMPTY_MENU; 19300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // 500ms animation with 800ms delay 19340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static final int TAB_ANIMATION_DURATION = 500; 19350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static final int TAB_OVERVIEW_DELAY = 800; 19360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Called by TabControl when a tab is requesting focus 19380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ void showTab(TabControl.Tab t) { 1939f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project showTab(t, null); 1940f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project } 1941f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project 1942f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project private void showTab(TabControl.Tab t, String url) { 19430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Disallow focus change during a tab animation. 19440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mAnimationCount > 0) { 19450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 19460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int delay = 0; 19480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabOverview == null) { 19490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Add a delay so the tab overview can be shown before the second 19500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // animation begins. 19510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project delay = TAB_ANIMATION_DURATION + TAB_OVERVIEW_DELAY; 19520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project tabPicker(false, mTabControl.getTabIndex(t), false); 19530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1954f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project sendAnimateFromOverview(t, false, url, delay, null); 19550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // This method does a ton of stuff. It will attempt to create a new tab 19580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we haven't reached MAX_TABS. Otherwise it uses the current tab. If 19590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // url isn't null, it will load the given url. If the tab overview is not 19600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // showing, it will animate to the tab overview, create a new tab and 19610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // animate away from it. After the animation completes, it will dispatch 19620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the given Message. If the tab overview is already showing (i.e. this 19630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // method is called from TabListener.onClick(), the method will animate 19640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // away from the tab overview. 19650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void openTabAndShow(String url, final Message msg, 1966f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project boolean closeOnExit, String appId) { 19670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final boolean newTab = mTabControl.getTabCount() != TabControl.MAX_TABS; 19680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final TabControl.Tab currentTab = mTabControl.getCurrentTab(); 19690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (newTab) { 19700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int delay = 0; 19710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If the tab overview is up and there are animations, just load 19720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the url. 19730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabOverview != null && mAnimationCount > 0) { 19740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null) { 19750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // We should not have a msg here since onCreateWindow 19760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // checks the animation count and every other caller passes 19770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // null. 19780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project assert msg == null; 19790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // just dismiss the subwindow and load the given url. 19800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dismissSubWindow(currentTab); 19810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project currentTab.getWebView().loadUrl(url); 19820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 19840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // show mTabOverview if it is not there. 19850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabOverview == null) { 19860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // We have to delay the animation from the tab picker by the 19870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // length of the tab animation. Add a delay so the tab 19880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // overview can be shown before the second animation begins. 19890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project delay = TAB_ANIMATION_DURATION + TAB_OVERVIEW_DELAY; 19900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project tabPicker(false, ImageGrid.NEW_TAB, false); 19910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Animate from the Tab overview after any animations have 19930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // finished. 1994f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project sendAnimateFromOverview( 1995f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project mTabControl.createNewTab(closeOnExit, appId, url), true, 1996f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project url, delay, msg); 19970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (url != null) { 19990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // We should not have a msg here. 20000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project assert msg == null; 20010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabOverview != null && mAnimationCount == 0) { 20020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sendAnimateFromOverview(currentTab, false, url, 20030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TAB_OVERVIEW_DELAY, null); 20040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 20050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Get rid of the subwindow if it exists 20060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dismissSubWindow(currentTab); 20070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Load the given url. 20080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project currentTab.getWebView().loadUrl(url); 20090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Animation createTabAnimation(final AnimatingView view, 20140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final View cell, boolean scaleDown) { 20150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final AnimationSet set = new AnimationSet(true); 20160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final float scaleX = (float) cell.getWidth() / view.getWidth(); 20170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final float scaleY = (float) cell.getHeight() / view.getHeight(); 20180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (scaleDown) { 20190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project set.addAnimation(new ScaleAnimation(1.0f, scaleX, 1.0f, scaleY)); 20200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project set.addAnimation(new TranslateAnimation(0, cell.getLeft(), 0, 20210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project cell.getTop())); 20220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 20230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project set.addAnimation(new ScaleAnimation(scaleX, 1.0f, scaleY, 1.0f)); 20240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project set.addAnimation(new TranslateAnimation(cell.getLeft(), 0, 20250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project cell.getTop(), 0)); 20260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project set.setDuration(TAB_ANIMATION_DURATION); 20280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project set.setInterpolator(new DecelerateInterpolator()); 20290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return set; 20300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Animate to the tab overview. currentIndex tells us which position to 20330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // animate to and newIndex is the position that should be selected after 20340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the animation completes. 20350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If remove is true, after the animation stops, a confirmation dialog will 20360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // be displayed to the user. 20370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void animateToTabOverview(final int newIndex, final boolean remove, 20380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final AnimatingView view) { 20390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Find the view in the ImageGrid allowing for the "New Tab" cell. 20400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int position = mTabControl.getTabIndex(view.mTab); 20410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!((ImageAdapter) mTabOverview.getAdapter()).maxedOut()) { 20420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project position++; 20430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Offset the tab position with the first visible position to get a 20460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // number between 0 and 3. 20470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project position -= mTabOverview.getFirstVisiblePosition(); 20480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Grab the view that we are going to animate to. 20500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final View v = mTabOverview.getChildAt(position); 20510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Animation.AnimationListener l = 20530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Animation.AnimationListener() { 20540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onAnimationStart(Animation a) { 20550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabOverview.requestFocus(); 20560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Clear the listener so we don't trigger a tab 20570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // selection. 20580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabOverview.setListener(null); 20590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onAnimationRepeat(Animation a) {} 20610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onAnimationEnd(Animation a) { 20620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // We are no longer animating so decrement the count. 20630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mAnimationCount--; 20640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Make the view GONE so that it will not draw between 20650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // now and when the Runnable is handled. 20660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project view.setVisibility(View.GONE); 20670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Post a runnable since we can't modify the view 20680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // hierarchy during this callback. 20690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.post(new Runnable() { 20700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void run() { 20710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Remove the AnimatingView. 20720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mContentView.removeView(view); 20730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabOverview != null) { 20740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Make newIndex visible. 20750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabOverview.setCurrentIndex(newIndex); 20760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Restore the listener. 20770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabOverview.setListener(mTabListener); 20780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Change the menu to TAB_MENU if the 20790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // ImageGrid is interactive. 20800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabOverview.isLive()) { 20810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenuState = R.id.TAB_MENU; 20820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabOverview.requestFocus(); 20830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If a remove was requested, remove the tab. 20860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (remove) { 20870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // During a remove, the current tab has 20880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // already changed. Remember the current one 20890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // here. 20900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final TabControl.Tab currentTab = 20910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.getCurrentTab(); 20920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Remove the tab at newIndex from 20930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // TabControl and the tab overview. 20940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final TabControl.Tab tab = 20950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.getTab(newIndex); 20960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.removeTab(tab); 20970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Restore the current tab. 20980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (currentTab != tab) { 20990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.setCurrentTab(currentTab); 21000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabOverview != null) { 21020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabOverview.remove(newIndex); 21030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Make the current tab visible. 21040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabOverview.setCurrentIndex( 21050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.getCurrentIndex()); 21060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }); 21100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 21120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 21130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Do an animation if there is a view to animate to. 21140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (v != null) { 21150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Create our animation 21160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Animation anim = createTabAnimation(view, v, true); 21170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project anim.setAnimationListener(l); 21180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Start animating 21190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project view.startAnimation(anim); 21200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 21210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If something goes wrong and we didn't find a view to animate to, 21220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // just do everything here. 21230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project l.onAnimationStart(null); 21240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project l.onAnimationEnd(null); 21250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 21280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Animate from the tab picker. The index supplied is the index to animate 21290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // from. 21300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void animateFromTabOverview(final AnimatingView view, 21310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final boolean newTab, final Message msg) { 21320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // firstVisible is the first visible tab on the screen. This helps 21330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // to know which corner of the screen the selected tab is. 21340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int firstVisible = mTabOverview.getFirstVisiblePosition(); 21350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // tabPosition is the 0-based index of of the tab being opened 21360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int tabPosition = mTabControl.getTabIndex(view.mTab); 21370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!((ImageAdapter) mTabOverview.getAdapter()).maxedOut()) { 21380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Add one to make room for the "New Tab" cell. 21390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project tabPosition++; 21400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If this is a new tab, animate from the "New Tab" cell. 21420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (newTab) { 21430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project tabPosition = 0; 21440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Location corresponds to the four corners of the screen. 21460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // A new tab or 0 is upper left, 0 for an old tab is upper 21470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // right, 1 is lower left, and 2 is lower right 21480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int location = tabPosition - firstVisible; 21490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 21500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Find the view at this location. 21510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final View v = mTabOverview.getChildAt(location); 21520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 21530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Wait until the animation completes to replace the AnimatingView. 21540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Animation.AnimationListener l = 21550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Animation.AnimationListener() { 21560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onAnimationStart(Animation a) {} 21570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onAnimationRepeat(Animation a) {} 21580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onAnimationEnd(Animation a) { 21590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.post(new Runnable() { 21600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void run() { 21610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mContentView.removeView(view); 21620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Dismiss the tab overview. If the cell at the 21630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // given location is null, set the fade 21640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // parameter to true. 21650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dismissTabOverview(v == null); 21660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TabControl.Tab t = 21670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.getCurrentTab(); 21680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenuState = R.id.MAIN_MENU; 21690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Resume regular updates. 21700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project t.getWebView().resumeTimers(); 21710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Dispatch the message after the animation 21720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // completes. 21730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (msg != null) { 21740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project msg.sendToTarget(); 21750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // The animation is done and the tab overview is 21770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // gone so allow key events and other animations 21780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // to begin. 21790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mAnimationCount--; 21800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Reset all the title bar info. 21810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitle(); 21820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }); 21840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 21860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 21870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (v != null) { 21880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Animation anim = createTabAnimation(view, v, false); 21890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Set the listener and start animating 21900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project anim.setAnimationListener(l); 21910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project view.startAnimation(anim); 21920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Make the view VISIBLE during the animation. 21930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project view.setVisibility(View.VISIBLE); 21940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 21950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Go ahead and do all the cleanup. 21960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project l.onAnimationEnd(null); 21970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Dismiss the tab overview applying a fade if needed. 22010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void dismissTabOverview(final boolean fade) { 22020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (fade) { 22030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project AlphaAnimation anim = new AlphaAnimation(1.0f, 0.0f); 22040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project anim.setDuration(500); 22050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project anim.startNow(); 22060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabOverview.startAnimation(anim); 22070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Just in case there was a problem with animating away from the tab 22090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // overview 22100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView current = mTabControl.getCurrentWebView(); 22110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current != null) { 22120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project current.setVisibility(View.VISIBLE); 22130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 22140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(LOGTAG, "No current WebView in dismissTabOverview"); 22150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Make the sub window container visible. 22170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabControl.getCurrentSubWindow() != null) { 22180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.getCurrentTab().getSubWebViewContainer() 22190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setVisibility(View.VISIBLE); 22200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mContentView.removeView(mTabOverview); 22222ed6edb70dae14691de2109e97fd54feedd84464Patrick Scott // Clear all the data for tab picker so next time it will be 22232ed6edb70dae14691de2109e97fd54feedd84464Patrick Scott // recreated. 22242ed6edb70dae14691de2109e97fd54feedd84464Patrick Scott mTabControl.wipeAllPickerData(); 22250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabOverview.clear(); 22260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabOverview = null; 22270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabListener = null; 22280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void openTab(String url) { 22310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mSettings.openInBackground()) { 2232f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project TabControl.Tab t = mTabControl.createNewTab(); 22330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (t != null) { 22340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project t.getWebView().loadUrl(url); 22350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 2237f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project openTabAndShow(url, null, false, null); 22380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private class Copy implements OnMenuItemClickListener { 22420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private CharSequence mText; 22430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onMenuItemClick(MenuItem item) { 22450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project copy(mText); 22460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 22470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public Copy(CharSequence toCopy) { 22500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mText = toCopy; 22510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private class Download implements OnMenuItemClickListener { 22550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String mText; 22560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onMenuItemClick(MenuItem item) { 22580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project onDownloadStartNoStream(mText, null, null, null, -1); 22590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 22600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public Download(String toDownload) { 22630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mText = toDownload; 22640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void copy(CharSequence text) { 22680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 22690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project IClipboard clip = IClipboard.Stub.asInterface(ServiceManager.getService("clipboard")); 22700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (clip != null) { 22710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project clip.setClipboardText(text); 22720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (android.os.RemoteException e) { 22740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(LOGTAG, "Copy failed", e); 22750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 22790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Resets the browser title-view to whatever it must be (for example, if we 22800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * load a page from history). 22810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 22820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void resetTitle() { 22830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetLockIcon(); 22840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleIconAndProgress(); 22850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 22880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Resets the browser title-view to whatever it must be 22890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * (for example, if we had a loading error) 22900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * When we have a new page, we call resetTitle, when we 22910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * have to reset the titlebar to whatever it used to be 22920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * (for example, if the user chose to stop loading), we 22930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * call resetTitleAndRevertLockIcon. 22940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 22950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ void resetTitleAndRevertLockIcon() { 22960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project revertLockIcon(); 22970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleIconAndProgress(); 22980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 23000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 23010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Reset the title, favicon, and progress. 23020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 23030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void resetTitleIconAndProgress() { 23040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView current = mTabControl.getCurrentWebView(); 23050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current == null) { 23060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 23070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleAndIcon(current); 23090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int progress = current.getProgress(); 23100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWebChromeClient.onProgressChanged(current, progress); 23110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 23130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Reset the title and the icon based on the given item. 23140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void resetTitleAndIcon(WebView view) { 23150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebHistoryItem item = view.copyBackForwardList().getCurrentItem(); 23160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (item != null) { 23170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setUrlTitle(item.getUrl(), item.getTitle()); 23180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setFavicon(item.getFavicon()); 23190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 23200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setUrlTitle(null, null); 23210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setFavicon(null); 23220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 23250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 23260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Sets a title composed of the URL and the title string. 23270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param url The URL of the site being loaded. 23280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param title The title of the site being loaded. 23290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 23300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void setUrlTitle(String url, String title) { 23310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mUrl = url; 23320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTitle = title; 23330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 23340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // While the tab overview is animating or being shown, block changes 23350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // to the title. 23360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mAnimationCount == 0 && mTabOverview == null) { 23370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setTitle(buildUrlTitle(url, title)); 23380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 23410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 23420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Builds and returns the page title, which is some 23430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * combination of the page URL and title. 23440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param url The URL of the site being loaded. 23450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param title The title of the site being loaded. 23460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @return The page title. 23470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 23480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String buildUrlTitle(String url, String title) { 23490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String urlTitle = ""; 23500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 23510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null) { 23520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String titleUrl = buildTitleUrl(url); 23530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 23540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (title != null && 0 < title.length()) { 23550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (titleUrl != null && 0 < titleUrl.length()) { 23560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project urlTitle = titleUrl + ": " + title; 23570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 23580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project urlTitle = title; 23590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 23610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (titleUrl != null) { 23620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project urlTitle = titleUrl; 23630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 23670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return urlTitle; 23680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 23700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 23710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param url The URL to build a title version of the URL from. 23720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @return The title version of the URL or null if fails. 23730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * The title version of the URL can be either the URL hostname, 23740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * or the hostname with an "https://" prefix (for secure URLs), 23750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * or an empty string if, for example, the URL in question is a 23760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * file:// URL with no hostname. 23770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 23780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static String buildTitleUrl(String url) { 23790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String titleUrl = null; 23800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 23810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null) { 23820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 23830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // parse the url string 23840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project URL urlObj = new URL(url); 23850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (urlObj != null) { 23860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project titleUrl = ""; 23870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 23880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String protocol = urlObj.getProtocol(); 23890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String host = urlObj.getHost(); 23900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 23910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (host != null && 0 < host.length()) { 23920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project titleUrl = host; 23930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (protocol != null) { 23940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if a secure site, add an "https://" prefix! 23950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (protocol.equalsIgnoreCase("https")) { 23960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project titleUrl = protocol + "://" + host; 23970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (MalformedURLException e) {} 24020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 24040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return titleUrl; 24050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 24070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Set the favicon in the title bar. 24080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void setFavicon(Bitmap icon) { 24090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // While the tab overview is animating or being shown, block changes to 24100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the favicon. 24110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mAnimationCount > 0 || mTabOverview != null) { 24120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 24130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Drawable[] array = new Drawable[2]; 24150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project PaintDrawable p = new PaintDrawable(Color.WHITE); 24160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project p.setCornerRadius(3f); 24170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project array[0] = p; 24180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (icon == null) { 24190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project array[1] = mGenericFavicon; 24200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 24210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project array[1] = new BitmapDrawable(icon); 24220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LayerDrawable d = new LayerDrawable(array); 24240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project d.setLayerInset(1, 2, 2, 2, 2); 24250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getWindow().setFeatureDrawable(Window.FEATURE_LEFT_ICON, d); 24260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 24280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 24290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Saves the current lock-icon state before resetting 24300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * the lock icon. If we have an error, we may need to 24310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * roll back to the previous state. 24320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 24330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void saveLockIcon() { 24340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPrevLockType = mLockIconType; 24350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 24370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 24380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Reverts the lock-icon state to the last saved state, 24390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * for example, if we had an error, and need to cancel 24400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * the load. 24410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 24420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void revertLockIcon() { 24430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mLockIconType = mPrevLockType; 24440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 244531a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 24460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, "BrowserActivity.revertLockIcon:" + 24470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project " revert lock icon to " + mLockIconType); 24480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 24500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project updateLockIconImage(mLockIconType); 24510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 24530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void switchTabs(int indexFrom, int indexToShow, boolean remove) { 24540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int delay = TAB_ANIMATION_DURATION + TAB_OVERVIEW_DELAY; 24550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Animate to the tab picker, remove the current tab, then 24560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // animate away from the tab picker to the parent WebView. 24570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project tabPicker(false, indexFrom, remove); 24580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Change to the parent tab 24590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final TabControl.Tab tab = mTabControl.getTab(indexToShow); 24600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (tab != null) { 24610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sendAnimateFromOverview(tab, false, null, delay, null); 24620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 24630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Increment this here so that no other animations can happen in 24640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // between the end of the tab picker transition and the beginning 24650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // of openTabAndShow. This has a matching decrement in the handler 24660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // of OPEN_TAB_AND_SHOW. 24670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mAnimationCount++; 24680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Send a message to open a new tab. 24690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.sendMessageDelayed( 24700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.obtainMessage(OPEN_TAB_AND_SHOW, 24710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSettings.getHomePage()), delay); 24720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 24750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void goBackOnePageOrQuit() { 24760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TabControl.Tab current = mTabControl.getCurrentTab(); 24770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current == null) { 24780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* 24790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Instead of finishing the activity, simply push this to the back 24800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * of the stack and let ActivityManager to choose the foreground 24810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * activity. As BrowserActivity is singleTask, it will be always the 24820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * root of the task. So we can use either true or false for 24830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * moveTaskToBack(). 24840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 24850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project moveTaskToBack(true); 24860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = current.getWebView(); 24880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w.canGoBack()) { 24890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.goBack(); 24900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 24910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Check to see if we are closing a window that was created by 24920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // another window. If so, we switch back to that window. 24930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TabControl.Tab parent = current.getParentTab(); 24940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (parent != null) { 24950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switchTabs(mTabControl.getCurrentIndex(), 24960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.getTabIndex(parent), true); 24970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 24980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current.closeOnExit()) { 24990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabControl.getTabCount() == 1) { 25000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project finish(); 25010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 25020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // call pauseWebView() now, we won't be able to call it in 25040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // onPause() as the WebView won't be valid. 25050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project pauseWebView(); 25060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project removeTabFromContentView(current); 25070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.removeTab(current); 25080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* 25100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Instead of finishing the activity, simply push this to the back 25110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * of the stack and let ActivityManager to choose the foreground 25120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * activity. As BrowserActivity is singleTask, it will be always the 25130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * root of the task. So we can use either true or false for 25140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * moveTaskToBack(). 25150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 25160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project moveTaskToBack(true); 25170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 25210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public KeyTracker.State onKeyTracker(int keyCode, 25220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project KeyEvent event, 25230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project KeyTracker.Stage stage, 25240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int duration) { 25250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if onKeyTracker() is called after activity onStop() 25260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // because of accumulated key events, 25270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // we should ignore it as browser is not active any more. 25280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView topWindow = getTopWindow(); 25290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (topWindow == null) 25300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return KeyTracker.State.NOT_TRACKING; 25310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 25320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (keyCode == KeyEvent.KEYCODE_BACK) { 25330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // During animations, block the back key so that other animations 25340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // are not triggered and so that we don't end up destroying all the 25350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // WebViews before finishing the animation. 25360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mAnimationCount > 0) { 25370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return KeyTracker.State.DONE_TRACKING; 25380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (stage == KeyTracker.Stage.LONG_REPEAT) { 25400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project bookmarksOrHistoryPicker(true); 25410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return KeyTracker.State.DONE_TRACKING; 25420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (stage == KeyTracker.Stage.UP) { 25430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // FIXME: Currently, we do not have a notion of the 25440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // history picker for the subwindow, but maybe we 25450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // should? 25460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView subwindow = mTabControl.getCurrentSubWindow(); 25470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (subwindow != null) { 25480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (subwindow.canGoBack()) { 25490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project subwindow.goBack(); 25500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 25510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dismissSubWindow(mTabControl.getCurrentTab()); 25520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 25540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project goBackOnePageOrQuit(); 25550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return KeyTracker.State.DONE_TRACKING; 25570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return KeyTracker.State.KEEP_TRACKING; 25590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return KeyTracker.State.NOT_TRACKING; 25610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 25630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override public boolean onKeyDown(int keyCode, KeyEvent event) { 25640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (keyCode == KeyEvent.KEYCODE_MENU) { 25650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenuIsDown = true; 25660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean handled = mKeyTracker.doKeyDown(keyCode, event); 25680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!handled) { 25690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (keyCode) { 25700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case KeyEvent.KEYCODE_SPACE: 25710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (event.isShiftPressed()) { 25720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().pageUp(false); 25730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 25740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().pageDown(false); 25750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handled = true; 25770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 25780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 25790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project default: 25800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 25810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return handled || super.onKeyDown(keyCode, event); 25840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 25860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override public boolean onKeyUp(int keyCode, KeyEvent event) { 25870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (keyCode == KeyEvent.KEYCODE_MENU) { 25880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenuIsDown = false; 25890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return mKeyTracker.doKeyUp(keyCode, event) || super.onKeyUp(keyCode, event); 25910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 25930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void stopLoading() { 25940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleAndRevertLockIcon(); 25950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = getTopWindow(); 25960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.stopLoading(); 25970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWebViewClient.onPageFinished(w, w.getUrl()); 25980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 25990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project cancelStopToast(); 26000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mStopToast = Toast 26010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .makeText(this, R.string.stopping, Toast.LENGTH_SHORT); 26020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mStopToast.show(); 26030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 26050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void cancelStopToast() { 26060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mStopToast != null) { 26070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mStopToast.cancel(); 26080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mStopToast = null; 26090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 26120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // called by a non-UI thread to post the message 26130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void postMessage(int what, int arg1, int arg2, Object obj) { 26140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.sendMessage(mHandler.obtainMessage(what, arg1, arg2, obj)); 26150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 26170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // public message ids 26180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public final static int LOAD_URL = 1001; 26190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public final static int STOP_LOAD = 1002; 26200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 26210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Message Ids 26220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static final int FOCUS_NODE_HREF = 102; 26230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static final int CANCEL_CREDS_REQUEST = 103; 26240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static final int ANIMATE_FROM_OVERVIEW = 104; 26250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static final int ANIMATE_TO_OVERVIEW = 105; 26260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static final int OPEN_TAB_AND_SHOW = 106; 26270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static final int CHECK_MEMORY = 107; 26280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static final int RELEASE_WAKELOCK = 108; 26290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 26300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Private handler for handling javascript and saving passwords 26310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Handler mHandler = new Handler() { 26320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 26330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void handleMessage(Message msg) { 26340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (msg.what) { 26350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case ANIMATE_FROM_OVERVIEW: 26360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final HashMap map = (HashMap) msg.obj; 26370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project animateFromTabOverview((AnimatingView) map.get("view"), 26380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project msg.arg1 == 1, (Message) map.get("msg")); 26390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 26400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 26410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case ANIMATE_TO_OVERVIEW: 26420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project animateToTabOverview(msg.arg1, msg.arg2 == 1, 26430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (AnimatingView) msg.obj); 26440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 26450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 26460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case OPEN_TAB_AND_SHOW: 26470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Decrement mAnimationCount before openTabAndShow because 26480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the method relies on the value being 0 to start the next 26490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // animation. 26500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mAnimationCount--; 2651f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project openTabAndShow((String) msg.obj, null, false, null); 26520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 26530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 26540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case FOCUS_NODE_HREF: 26550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String url = (String) msg.getData().get("url"); 26560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url == null || url.length() == 0) { 26570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 26580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project HashMap focusNodeMap = (HashMap) msg.obj; 26600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView view = (WebView) focusNodeMap.get("webview"); 26610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Only apply the action if the top window did not change. 26620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (getTopWindow() != view) { 26630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 26640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (msg.arg1) { 26660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.open_context_menu_id: 26670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.view_image_context_menu_id: 26680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project loadURL(getTopWindow(), url); 26690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 26700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.open_newtab_context_menu_id: 26710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project openTab(url); 26720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 26730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.bookmark_context_menu_id: 26740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent = new Intent(BrowserActivity.this, 26750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project AddBookmarkPage.class); 26760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.putExtra("url", url); 26770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project startActivity(intent); 26780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 26790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.share_link_context_menu_id: 26800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Browser.sendString(BrowserActivity.this, url); 26810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 26820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.copy_link_context_menu_id: 26830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project copy(url); 26840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 26850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.save_link_context_menu_id: 26860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.download_context_menu_id: 26870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project onDownloadStartNoStream(url, null, null, null, -1); 26880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 26890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 26910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 26920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case LOAD_URL: 26930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project loadURL(getTopWindow(), (String) msg.obj); 26940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 26950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 26960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case STOP_LOAD: 26970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project stopLoading(); 26980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 26990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 27000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case CANCEL_CREDS_REQUEST: 27010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resumeAfterCredentials(); 27020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 27030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 27040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case CHECK_MEMORY: 27050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // reschedule to check memory condition 27060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.removeMessages(CHECK_MEMORY); 27070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.sendMessageDelayed(mHandler.obtainMessage 27080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (CHECK_MEMORY), CHECK_MEMORY_INTERVAL); 27090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project checkMemory(); 27100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 27110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 27120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case RELEASE_WAKELOCK: 27130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mWakeLock.isHeld()) { 27140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWakeLock.release(); 27150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 27170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 27200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 27210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // ------------------------------------------------------------------------- 27220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // WebViewClient implementation. 27230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //------------------------------------------------------------------------- 27240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 27250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Use in overrideUrlLoading 27260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ final static String SCHEME_WTAI = "wtai://wp/"; 27270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ final static String SCHEME_WTAI_MC = "wtai://wp/mc;"; 27280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ final static String SCHEME_WTAI_SD = "wtai://wp/sd;"; 27290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ final static String SCHEME_WTAI_AP = "wtai://wp/ap;"; 27300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 27310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ WebViewClient getWebViewClient() { 27320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return mWebViewClient; 27330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 27350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void updateIcon(String url, Bitmap icon) { 27360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (icon != null) { 27370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserBookmarksAdapter.updateBookmarkFavicon(mResolver, 27380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url, icon); 27390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setFavicon(icon); 27410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 27430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final WebViewClient mWebViewClient = new WebViewClient() { 27440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 27450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onPageStarted(WebView view, String url, Bitmap favicon) { 27460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetLockIcon(url); 27470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setUrlTitle(url, null); 27480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Call updateIcon instead of setFavicon so the bookmark 27490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // database can be updated. 27500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project updateIcon(url, favicon); 27510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 27520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mSettings.isTracing() == true) { 27530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // FIXME: we should save the trace file somewhere other than data. 27540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // I can't use "/tmp" as it competes for system memory. 27550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project File file = getDir("browserTrace", 0); 27560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String baseDir = file.getPath(); 27570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!baseDir.endsWith(File.separator)) baseDir += File.separator; 27580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String host; 27590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 27600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebAddress uri = new WebAddress(url); 27610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project host = uri.mHost; 27620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (android.net.ParseException ex) { 27630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project host = "unknown_host"; 27640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project host = host.replace('.', '_'); 27660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project baseDir = baseDir + host; 27670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project file = new File(baseDir+".data"); 27680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (file.exists() == true) { 27690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project file.delete(); 27700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project file = new File(baseDir+".key"); 27720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (file.exists() == true) { 27730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project file.delete(); 27740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mInTrace = true; 27760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Debug.startMethodTracing(baseDir, 8 * 1024 * 1024); 27770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 27790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Performance probe 27800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (false) { 27810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mStart = SystemClock.uptimeMillis(); 27820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mProcessStart = Process.getElapsedCpuTime(); 27830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project long[] sysCpu = new long[7]; 27840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (Process.readProcFile("/proc/stat", SYSTEM_CPU_FORMAT, null, 27850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sysCpu, null)) { 27860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mUserStart = sysCpu[0] + sysCpu[1]; 27870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSystemStart = sysCpu[2]; 27880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mIdleStart = sysCpu[3]; 27890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mIrqStart = sysCpu[4] + sysCpu[5] + sysCpu[6]; 27900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mUiStart = SystemClock.currentThreadTimeMillis(); 27920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 27940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!mPageStarted) { 27950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageStarted = true; 27960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if onResume() has been called, resumeWebView() does nothing. 27970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resumeWebView(); 27980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 28000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // reset sync timer to avoid sync starts during loading a page 28010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project CookieSyncManager.getInstance().resetSync(); 28020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 28030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mInLoad = true; 28040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project updateInLoadMenuItems(); 28050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!mIsNetworkUp) { 28060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if ( mAlertDialog == null) { 28070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mAlertDialog = new AlertDialog.Builder(BrowserActivity.this) 28080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.loadSuspendedTitle) 28090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setMessage(R.string.loadSuspended) 28100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, null) 28110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 28120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (view != null) { 28140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project view.setNetworkAvailable(false); 28150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 28180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // schedule to check memory condition 28190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.sendMessageDelayed(mHandler.obtainMessage(CHECK_MEMORY), 28200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project CHECK_MEMORY_INTERVAL); 28210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 28230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 28240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onPageFinished(WebView view, String url) { 28250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Reset the title and icon in case we stopped a provisional 28260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // load. 28270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleAndIcon(view); 28280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 28290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Update the lock icon image only once we are done loading 28300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project updateLockIconImage(mLockIconType); 28310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 28320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Performance probe 2833cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project if (false) { 28340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project long[] sysCpu = new long[7]; 28350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (Process.readProcFile("/proc/stat", SYSTEM_CPU_FORMAT, null, 28360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sysCpu, null)) { 28370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String uiInfo = "UI thread used " 28380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + (SystemClock.currentThreadTimeMillis() - mUiStart) 28390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + " ms"; 284031a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGD_ENABLED) { 28410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.d(LOGTAG, uiInfo); 28420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //The string that gets written to the log 28440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String performanceString = "It took total " 28450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + (SystemClock.uptimeMillis() - mStart) 28460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + " ms clock time to load the page." 28470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + "\nbrowser process used " 28480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + (Process.getElapsedCpuTime() - mProcessStart) 28490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + " ms, user processes used " 28500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + (sysCpu[0] + sysCpu[1] - mUserStart) * 10 28510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + " ms, kernel used " 28520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + (sysCpu[2] - mSystemStart) * 10 28530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + " ms, idle took " + (sysCpu[3] - mIdleStart) * 10 28540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + " ms and irq took " 28550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + (sysCpu[4] + sysCpu[5] + sysCpu[6] - mIrqStart) 28560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 10 + " ms, " + uiInfo; 285731a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGD_ENABLED) { 28580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.d(LOGTAG, performanceString + "\nWebpage: " + url); 28590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null) { 28610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // strip the url to maintain consistency 28620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String newUrl = new String(url); 28630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (newUrl.startsWith("http://www.")) { 28640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project newUrl = newUrl.substring(11); 28650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (newUrl.startsWith("http://")) { 28660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project newUrl = newUrl.substring(7); 28670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (newUrl.startsWith("https://www.")) { 28680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project newUrl = newUrl.substring(12); 28690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (newUrl.startsWith("https://")) { 28700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project newUrl = newUrl.substring(8); 28710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 287231a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGD_ENABLED) { 28730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.d(LOGTAG, newUrl + " loaded"); 28740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* 28760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (sWhiteList.contains(newUrl)) { 28770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // The string that gets pushed to the statistcs 28780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // service 28790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project performanceString = performanceString 28800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + "\nWebpage: " 28810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + newUrl 28820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + "\nCarrier: " 28830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + android.os.SystemProperties 28840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .get("gsm.sim.operator.alpha"); 28850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mWebView != null 28860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project && mWebView.getContext() != null 28870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project && mWebView.getContext().getSystemService( 28880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Context.CONNECTIVITY_SERVICE) != null) { 28890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ConnectivityManager cManager = 28900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (ConnectivityManager) mWebView 28910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .getContext().getSystemService( 28920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Context.CONNECTIVITY_SERVICE); 28930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project NetworkInfo nInfo = cManager 28940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .getActiveNetworkInfo(); 28950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (nInfo != null) { 28960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project performanceString = performanceString 28970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + "\nNetwork Type: " 28980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + nInfo.getType().toString(); 28990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Checkin.logEvent(mResolver, 29020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Checkin.Events.Tag.WEBPAGE_LOAD, 29030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project performanceString); 29040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.w(LOGTAG, "pushed to the statistics service"); 29050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 29070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mInTrace) { 29120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mInTrace = false; 29130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Debug.stopMethodTracing(); 29140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mPageStarted) { 29170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageStarted = false; 29180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // pauseWebView() will do nothing and return false if onPause() 29190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // is not called yet. 29200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (pauseWebView()) { 29210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mWakeLock.isHeld()) { 29220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.removeMessages(RELEASE_WAKELOCK); 29230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWakeLock.release(); 29240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.removeMessages(CHECK_MEMORY); 29290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project checkMemory(); 29300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // return true if want to hijack the url to let another app to handle it 29330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 29340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean shouldOverrideUrlLoading(WebView view, String url) { 29350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url.startsWith(SCHEME_WTAI)) { 29360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // wtai://wp/mc;number 29370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // number=string(phone-number) 29380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url.startsWith(SCHEME_WTAI_MC)) { 29390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent = new Intent(Intent.ACTION_VIEW, 29400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Uri.parse(WebView.SCHEME_TEL + 29410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url.substring(SCHEME_WTAI_MC.length()))); 29420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project startActivity(intent); 29430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 29440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // wtai://wp/sd;dtmf 29460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // dtmf=string(dialstring) 29470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url.startsWith(SCHEME_WTAI_SD)) { 29480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // TODO 29490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // only send when there is active voice connection 29500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 29510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // wtai://wp/ap;number;name 29530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // number=string(phone-number) 29540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // name=string 29550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url.startsWith(SCHEME_WTAI_AP)) { 29560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // TODO 29570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 29580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Uri uri; 29620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 29630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project uri = Uri.parse(url); 29640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (IllegalArgumentException ex) { 29650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 29660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // check whether other activities want to handle this url 29690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent = new Intent(Intent.ACTION_VIEW, uri); 29700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.addCategory(Intent.CATEGORY_BROWSABLE); 29710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 29720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (startActivityIfNeeded(intent, -1)) { 29730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 29740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (ActivityNotFoundException ex) { 29760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // ignore the error. If no application can handle the URL, 29770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // eg about:blank, assume the browser can handle it. 29780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mMenuIsDown) { 29810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project openTab(url); 29820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project closeOptionsMenu(); 29830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 29840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 29870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 29900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Updates the lock icon. This method is called when we discover another 29910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * resource to be loaded for this page (for example, javascript). While 29920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * we update the icon type, we do not update the lock icon itself until 29930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * we are done loading, it is slightly more secure this way. 29940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 29950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 29960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onLoadResource(WebView view, String url) { 29970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null && url.length() > 0) { 29980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // It is only if the page claims to be secure 29990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // that we may have to update the lock: 30000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mLockIconType == LOCK_ICON_SECURE) { 30010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If NOT a 'safe' url, change the lock to mixed content! 30020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!(URLUtil.isHttpsUrl(url) || URLUtil.isDataUrl(url) || URLUtil.isAboutUrl(url))) { 30030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mLockIconType = LOCK_ICON_MIXED; 300431a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 30050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, "BrowserActivity.updateLockIcon:" + 30060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project " updated lock icon to " + mLockIconType + " due to " + url); 30070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 30130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 30140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Show the dialog, asking the user if they would like to continue after 30150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * an excessive number of HTTP redirects. 30160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 30170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 30180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onTooManyRedirects(WebView view, final Message cancelMsg, 30190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Message continueMsg) { 30200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(BrowserActivity.this) 30210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.browserFrameRedirect) 30220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setMessage(R.string.browserFrame307Post) 30230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 30240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, int which) { 30250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project continueMsg.sendToTarget(); 30260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 30270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 30280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, int which) { 30290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project cancelMsg.sendToTarget(); 30300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 30310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setOnCancelListener(new OnCancelListener() { 30320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCancel(DialogInterface dialog) { 30330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project cancelMsg.sendToTarget(); 30340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 30350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 30360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3038a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott // Container class for the next error dialog that needs to be 3039a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott // displayed. 3040a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott class ErrorDialog { 3041a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott public final int mTitle; 3042a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott public final String mDescription; 3043a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott public final int mError; 3044a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott ErrorDialog(int title, String desc, int error) { 3045a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott mTitle = title; 3046a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott mDescription = desc; 3047a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott mError = error; 3048a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott } 3049a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott }; 3050a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott 3051a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott private void processNextError() { 3052a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott if (mQueuedErrors == null) { 3053a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott return; 3054a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott } 3055a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott // The first one is currently displayed so just remove it. 3056a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott mQueuedErrors.removeFirst(); 3057a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott if (mQueuedErrors.size() == 0) { 3058a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott mQueuedErrors = null; 3059a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott return; 3060a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott } 3061a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott showError(mQueuedErrors.getFirst()); 3062a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott } 3063a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott 3064a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott private DialogInterface.OnDismissListener mDialogListener = 3065a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott new DialogInterface.OnDismissListener() { 3066a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott public void onDismiss(DialogInterface d) { 3067a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott processNextError(); 3068a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott } 3069a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott }; 3070a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott private LinkedList<ErrorDialog> mQueuedErrors; 3071a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott 3072a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott private void queueError(int err, String desc) { 3073a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott if (mQueuedErrors == null) { 3074a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott mQueuedErrors = new LinkedList<ErrorDialog>(); 3075a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott } 3076a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott for (ErrorDialog d : mQueuedErrors) { 3077a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott if (d.mError == err) { 3078a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott // Already saw a similar error, ignore the new one. 3079a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott return; 3080a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott } 3081a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott } 3082a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott ErrorDialog errDialog = new ErrorDialog( 3083a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott err == EventHandler.FILE_NOT_FOUND_ERROR ? 3084a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott R.string.browserFrameFileErrorLabel : 3085a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott R.string.browserFrameNetworkErrorLabel, 3086a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott desc, err); 3087a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott mQueuedErrors.addLast(errDialog); 3088a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott 3089a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott // Show the dialog now if the queue was empty. 3090a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott if (mQueuedErrors.size() == 1) { 3091a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott showError(errDialog); 3092a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott } 3093a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott } 3094a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott 3095a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott private void showError(ErrorDialog errDialog) { 3096a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott AlertDialog d = new AlertDialog.Builder(BrowserActivity.this) 3097a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott .setTitle(errDialog.mTitle) 3098a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott .setMessage(errDialog.mDescription) 3099a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott .setPositiveButton(R.string.ok, null) 3100a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott .create(); 3101a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott d.setOnDismissListener(mDialogListener); 3102a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott d.show(); 3103a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott } 3104a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott 31050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 31060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Show a dialog informing the user of the network error reported by 31070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * WebCore. 31080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 31090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 31100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onReceivedError(WebView view, int errorCode, 31110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String description, String failingUrl) { 31120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (errorCode != EventHandler.ERROR_LOOKUP && 31130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project errorCode != EventHandler.ERROR_CONNECT && 31140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project errorCode != EventHandler.ERROR_BAD_URL && 31150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project errorCode != EventHandler.ERROR_UNSUPPORTED_SCHEME && 31160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project errorCode != EventHandler.FILE_ERROR) { 3117a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott queueError(errorCode, description); 31180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3119a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott Log.e(LOGTAG, "onReceivedError " + errorCode + " " + failingUrl 3120a6555249850bdc364de11e3ad54b571b91b1a2a0Patrick Scott + " " + description); 31210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // We need to reset the title after an error. 31230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleAndRevertLockIcon(); 31240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 31270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Check with the user if it is ok to resend POST data as the page they 31280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * are trying to navigate to is the result of a POST. 31290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 31300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 31310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onFormResubmission(WebView view, final Message dontResend, 31320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Message resend) { 31330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(BrowserActivity.this) 31340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.browserFrameFormResubmitLabel) 31350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setMessage(R.string.browserFrameFormResubmitMessage) 31360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 31370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, int which) { 31380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resend.sendToTarget(); 31390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 31400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 31410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, int which) { 31420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dontResend.sendToTarget(); 31430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 31440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setOnCancelListener(new OnCancelListener() { 31450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCancel(DialogInterface dialog) { 31460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dontResend.sendToTarget(); 31470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 31480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 31490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 31520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Insert the url into the visited history database. 31530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param url The url to be inserted. 31540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param isReload True if this url is being reloaded. 31550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * FIXME: Not sure what to do when reloading the page. 31560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 31570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 31580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void doUpdateVisitedHistory(WebView view, String url, 31590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean isReload) { 31600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url.regionMatches(true, 0, "about:", 0, 6)) { 31610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 31620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Browser.updateVisitedHistory(mResolver, url, true); 31640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebIconDatabase.getInstance().retainIconForPageUrl(url); 31650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 31680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Displays SSL error(s) dialog to the user. 31690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 31700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 31710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onReceivedSslError( 31720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView view, final SslErrorHandler handler, final SslError error) { 31730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mSettings.showSecurityWarnings()) { 31750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final LayoutInflater factory = 31760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LayoutInflater.from(BrowserActivity.this); 31770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final View warningsView = 31780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project factory.inflate(R.layout.ssl_warnings, null); 31790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final LinearLayout placeholder = 31800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (LinearLayout)warningsView.findViewById(R.id.placeholder); 31810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_UNTRUSTED)) { 31830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 31840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, null); 31850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 31860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_untrusted); 31870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project placeholder.addView(ll); 31880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_IDMISMATCH)) { 31910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 31920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, null); 31930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 31940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_mismatch); 31950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project placeholder.addView(ll); 31960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_EXPIRED)) { 31990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 32000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, null); 32010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 32020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_expired); 32030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project placeholder.addView(ll); 32040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_NOTYETVALID)) { 32070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 32080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, null); 32090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 32100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_not_yet_valid); 32110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project placeholder.addView(ll); 32120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(BrowserActivity.this) 32150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.security_warning) 32160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setIcon(android.R.drawable.ic_dialog_alert) 32170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setView(warningsView) 32180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ssl_continue, 32190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 32200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, int whichButton) { 32210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.proceed(); 32220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 32240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setNeutralButton(R.string.view_certificate, 32250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 32260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, int whichButton) { 32270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificateOnError(view, handler, error); 32280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 32300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setNegativeButton(R.string.cancel, 32310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 32320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, int whichButton) { 32330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.cancel(); 32340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserActivity.this.resetTitleAndRevertLockIcon(); 32350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 32370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setOnCancelListener( 32380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnCancelListener() { 32390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCancel(DialogInterface dialog) { 32400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.cancel(); 32410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserActivity.this.resetTitleAndRevertLockIcon(); 32420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 32440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 32450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 32460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.proceed(); 32470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 32510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Handles an HTTP authentication request. 32520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 32530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param handler The authentication handler 32540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param host The host 32550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param realm The realm 32560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 32570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 32580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onReceivedHttpAuthRequest(WebView view, 32590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final HttpAuthHandler handler, final String host, final String realm) { 32600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String username = null; 32610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String password = null; 32620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean reuseHttpAuthUsernamePassword = 32640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.useHttpAuthUsernamePassword(); 32650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (reuseHttpAuthUsernamePassword && 32670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (mTabControl.getCurrentWebView() != null)) { 32680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String[] credentials = 32690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.getCurrentWebView() 32700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .getHttpAuthUsernamePassword(host, realm); 32710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (credentials != null && credentials.length == 2) { 32720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project username = credentials[0]; 32730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project password = credentials[1]; 32740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (username != null && password != null) { 32780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.proceed(username, password); 32790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 32800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showHttpAuthentication(handler, host, realm, null, null, null, 0); 32810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 32850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) { 32860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mMenuIsDown) { 32870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // only check shortcut key when MENU is held 32880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return getWindow().isShortcutKey(event.getKeyCode(), event); 32890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 32900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 32910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 32950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onUnhandledKeyEvent(WebView view, KeyEvent event) { 32960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (view != mTabControl.getCurrentTopWebView()) { 32970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 32980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (event.isDown()) { 33000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserActivity.this.onKeyDown(event.getKeyCode(), event); 33010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 33020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserActivity.this.onKeyUp(event.getKeyCode(), event); 33030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 33060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //-------------------------------------------------------------------------- 33080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // WebChromeClient implementation 33090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //-------------------------------------------------------------------------- 33100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ WebChromeClient getWebChromeClient() { 33120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return mWebChromeClient; 33130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final WebChromeClient mWebChromeClient = new WebChromeClient() { 33160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Helper method to create a new tab or sub window. 33170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void createWindow(final boolean dialog, final Message msg) { 33180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (dialog) { 33190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.createSubWindow(); 33200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final TabControl.Tab t = mTabControl.getCurrentTab(); 33210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project attachSubWindow(t); 33220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView.WebViewTransport transport = 33230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (WebView.WebViewTransport) msg.obj; 33240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project transport.setWebView(t.getSubWebView()); 33250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project msg.sendToTarget(); 33260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 33270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final TabControl.Tab parent = mTabControl.getCurrentTab(); 33280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // openTabAndShow will dispatch the message after creating the 33290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // new WebView. This will prevent another request from coming 33300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // in during the animation. 3331f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project openTabAndShow(null, msg, false, null); 33320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project parent.addChildTab(mTabControl.getCurrentTab()); 33330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView.WebViewTransport transport = 33340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (WebView.WebViewTransport) msg.obj; 33350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project transport.setWebView(mTabControl.getCurrentWebView()); 33360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 33400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onCreateWindow(WebView view, final boolean dialog, 33410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final boolean userGesture, final Message resultMsg) { 33420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Ignore these requests during tab animations or if the tab 33430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // overview is showing. 33440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mAnimationCount > 0 || mTabOverview != null) { 33450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 33460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Short-circuit if we can't create any more tabs or sub windows. 33480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (dialog && mTabControl.getCurrentSubWindow() != null) { 33490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(BrowserActivity.this) 33500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.too_many_subwindows_dialog_title) 33510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setIcon(android.R.drawable.ic_dialog_alert) 33520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setMessage(R.string.too_many_subwindows_dialog_message) 33530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, null) 33540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 33550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 33560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (mTabControl.getTabCount() >= TabControl.MAX_TABS) { 33570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(BrowserActivity.this) 33580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.too_many_windows_dialog_title) 33590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setIcon(android.R.drawable.ic_dialog_alert) 33600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setMessage(R.string.too_many_windows_dialog_message) 33610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, null) 33620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 33630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 33640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Short-circuit if this was a user gesture. 33670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (userGesture) { 33680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // createWindow will call openTabAndShow for new Windows and 33690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // that will call tabPicker which will increment 33700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // mAnimationCount. 33710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project createWindow(dialog, resultMsg); 33720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 33730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Allow the popup and create the appropriate window. 33760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final AlertDialog.OnClickListener allowListener = 33770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.OnClickListener() { 33780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface d, 33790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int which) { 33800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Same comment as above for setting 33810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // mAnimationCount. 33820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project createWindow(dialog, resultMsg); 33830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Since we incremented mAnimationCount while the 33840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // dialog was up, we have to decrement it here. 33850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mAnimationCount--; 33860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 33880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Block the popup by returning a null WebView. 33900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final AlertDialog.OnClickListener blockListener = 33910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.OnClickListener() { 33920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface d, int which) { 33930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resultMsg.sendToTarget(); 33940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // We are not going to trigger an animation so 33950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // unblock keys and animation requests. 33960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mAnimationCount--; 33970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 33990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Build a confirmation dialog to display to the user. 34010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final AlertDialog d = 34020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(BrowserActivity.this) 34030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.attention) 34040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setIcon(android.R.drawable.ic_dialog_alert) 34050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setMessage(R.string.popup_window_attempt) 34060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.allow, allowListener) 34070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setNegativeButton(R.string.block, blockListener) 34080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setCancelable(false) 34090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .create(); 34100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Show the confirmation dialog. 34120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project d.show(); 34130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // We want to increment mAnimationCount here to prevent a 34140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // potential race condition. If the user allows a pop-up from a 34150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // site and that pop-up then triggers another pop-up, it is 34160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // possible to get the BACK key between here and when the dialog 34170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // appears. 34180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mAnimationCount++; 34190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 34200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 34230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCloseWindow(WebView window) { 34240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final int currentIndex = mTabControl.getCurrentIndex(); 34250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final TabControl.Tab parent = 34260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.getCurrentTab().getParentTab(); 34270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (parent != null) { 34280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // JavaScript can only close popup window. 34290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switchTabs(currentIndex, mTabControl.getTabIndex(parent), true); 34300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 34340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onProgressChanged(WebView view, int newProgress) { 34350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Block progress updates to the title bar while the tab overview 34360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // is animating or being displayed. 34370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mAnimationCount == 0 && mTabOverview == null) { 34380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getWindow().setFeatureInt(Window.FEATURE_PROGRESS, 34390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project newProgress * 100); 34400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (newProgress == 100) { 34430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // onProgressChanged() is called for sub-frame too while 34440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // onPageFinished() is only called for the main frame. sync 34450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // cookie and cache promptly here. 34460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project CookieSyncManager.getInstance().sync(); 3447cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project if (mInLoad) { 3448cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project mInLoad = false; 3449cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project updateInLoadMenuItems(); 3450cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project } 3451cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project } else { 3452cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project // onPageFinished may have already been called but a subframe 3453cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project // is still loading and updating the progress. Reset mInLoad 3454cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project // and update the menu items. 3455cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project if (!mInLoad) { 3456cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project mInLoad = true; 3457cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project updateInLoadMenuItems(); 3458cb9a0bbc3a00a044fbfdabda920d3be80b0747f0The Android Open Source Project } 34590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 34630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onReceivedTitle(WebView view, String title) { 3464598c9ccf8641e0e4563bba2fd5613bcb4de766ecPatrick Scott String url = view.getUrl(); 34650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // here, if url is null, we want to reset the title 34670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setUrlTitle(url, title); 34680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url == null || 34700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url.length() >= SQLiteDatabase.SQLITE_MAX_LIKE_PATTERN_LENGTH) { 34710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 34720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url.startsWith("http://www.")) { 34740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = url.substring(11); 34750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (url.startsWith("http://")) { 34760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = url.substring(4); 34770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 34790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = "%" + url; 34800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String [] selArgs = new String[] { url }; 34810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String where = Browser.BookmarkColumns.URL + " LIKE ? AND " 34830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + Browser.BookmarkColumns.BOOKMARK + " = 0"; 34840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Cursor c = mResolver.query(Browser.BOOKMARKS_URI, 34850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Browser.HISTORY_PROJECTION, where, selArgs, null); 34860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (c.moveToFirst()) { 348731a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 34880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, "updating cursor"); 34890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Current implementation of database only has one entry per 34910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // url. 34920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int titleIndex = 34930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project c.getColumnIndex(Browser.BookmarkColumns.TITLE); 34940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project c.updateString(titleIndex, title); 34950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project c.commitUpdates(); 34960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project c.close(); 34980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (IllegalStateException e) { 34990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(LOGTAG, "BrowserActivity onReceived title", e); 35000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (SQLiteException ex) { 35010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(LOGTAG, "onReceivedTitle() caught SQLiteException: ", ex); 35020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 35060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onReceivedIcon(WebView view, Bitmap icon) { 35070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project updateIcon(view.getUrl(), icon); 35080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 35100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 35120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Notify the host application a download should be done, or that 35130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * the data should be streamed if a streaming viewer is available. 35140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param url The full url to the content that should be downloaded 35150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param contentDisposition Content-disposition http header, if 35160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * present. 35170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param mimetype The mimetype of the content reported by the server 35180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param contentLength The file size reported by the server 35190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 35200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onDownloadStart(String url, String userAgent, 35210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String contentDisposition, String mimetype, long contentLength) { 35220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we're dealing wih A/V content that's not explicitly marked 35230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // for download, check if it's streamable. 35240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (contentDisposition == null 35250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || !contentDisposition.regionMatches(true, 0, "attachment", 0, 10)) { 35260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // query the package manager to see if there's a registered handler 35270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // that matches. 35280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent = new Intent(Intent.ACTION_VIEW); 35290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.setDataAndType(Uri.parse(url), mimetype); 35300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (getPackageManager().resolveActivity(intent, 35310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project PackageManager.MATCH_DEFAULT_ONLY) != null) { 35320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // someone knows how to handle this mime type with this scheme, don't download. 35330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 35340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project startActivity(intent); 35350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 35360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (ActivityNotFoundException ex) { 353731a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGD_ENABLED) { 35380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.d(LOGTAG, "activity not found for " + mimetype 35390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + " over " + Uri.parse(url).getScheme(), ex); 35400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Best behavior is to fall back to a download in this case 35420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project onDownloadStartNoStream(url, userAgent, contentDisposition, mimetype, contentLength); 35460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 35490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Notify the host application a download should be done, even if there 35500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * is a streaming viewer available for thise type. 35510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param url The full url to the content that should be downloaded 35520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param contentDisposition Content-disposition http header, if 35530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * present. 35540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param mimetype The mimetype of the content reported by the server 35550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param contentLength The file size reported by the server 35560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 35570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /*package */ void onDownloadStartNoStream(String url, String userAgent, 35580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String contentDisposition, String mimetype, long contentLength) { 35590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String filename = URLUtil.guessFileName(url, 35610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project contentDisposition, mimetype); 35620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Check to see if we have an SDCard 35640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String status = Environment.getExternalStorageState(); 35650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!status.equals(Environment.MEDIA_MOUNTED)) { 35660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int title; 35670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String msg; 35680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Check to see if the SDCard is busy, same as the music app 35700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (status.equals(Environment.MEDIA_SHARED)) { 35710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project msg = getString(R.string.download_sdcard_busy_dlg_msg); 35720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = R.string.download_sdcard_busy_dlg_title; 35730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 35740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project msg = getString(R.string.download_no_sdcard_dlg_msg, filename); 35750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = R.string.download_no_sdcard_dlg_title; 35760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(this) 35790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(title) 35800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setIcon(android.R.drawable.ic_dialog_alert) 35810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setMessage(msg) 35820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, null) 35830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 35840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 35850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // java.net.URI is a lot stricter than KURL so we have to undo 35880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // KURL's percent-encoding and redo the encoding using java.net.URI. 35890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project URI uri = null; 35900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 35910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Undo the percent-encoding that KURL may have done. 35920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String newUrl = new String(URLUtil.decode(url.getBytes())); 35930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Parse the url into pieces 35940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebAddress w = new WebAddress(newUrl); 35950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String frag = null; 35960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String query = null; 35970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String path = w.mPath; 35980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Break the path into path, query, and fragment 35990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (path.length() > 0) { 36000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Strip the fragment 36010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int idx = path.lastIndexOf('#'); 36020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (idx != -1) { 36030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project frag = path.substring(idx + 1); 36040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project path = path.substring(0, idx); 36050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project idx = path.lastIndexOf('?'); 36070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (idx != -1) { 36080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project query = path.substring(idx + 1); 36090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project path = path.substring(0, idx); 36100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project uri = new URI(w.mScheme, w.mAuthInfo, w.mHost, w.mPort, path, 36130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project query, frag); 36140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (Exception e) { 36150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(LOGTAG, "Could not parse url for download: " + url, e); 36160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 36170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // XXX: Have to use the old url since the cookies were stored using the 36200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // old percent-encoded url. 36210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String cookies = CookieManager.getInstance().getCookie(url); 36220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ContentValues values = new ContentValues(); 36240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project values.put(Downloads.URI, uri.toString()); 36250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project values.put(Downloads.COOKIE_DATA, cookies); 36260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project values.put(Downloads.USER_AGENT, userAgent); 36270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project values.put(Downloads.NOTIFICATION_PACKAGE, 36280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getPackageName()); 36290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project values.put(Downloads.NOTIFICATION_CLASS, 36300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserDownloadPage.class.getCanonicalName()); 36310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project values.put(Downloads.VISIBILITY, Downloads.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 36320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project values.put(Downloads.MIMETYPE, mimetype); 36330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project values.put(Downloads.FILENAME_HINT, filename); 36340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project values.put(Downloads.DESCRIPTION, uri.getHost()); 36350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (contentLength > 0) { 36360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project values.put(Downloads.TOTAL_BYTES, contentLength); 36370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mimetype == null) { 36390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // We must have long pressed on a link or image to download it. We 36400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // are not sure of the mimetype in this case, so do a head request 36410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new FetchUrlMimeType(this).execute(values); 36420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 36430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Uri contentUri = 36440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getContentResolver().insert(Downloads.CONTENT_URI, values); 36450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project viewDownloads(contentUri); 36460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 36510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Resets the lock icon. This method is called when we start a new load and 36520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * know the url to be loaded. 36530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 36540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void resetLockIcon(String url) { 36550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Save the lock-icon state (we revert to it if the load gets cancelled) 36560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project saveLockIcon(); 36570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mLockIconType = LOCK_ICON_UNSECURE; 36590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (URLUtil.isHttpsUrl(url)) { 36600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mLockIconType = LOCK_ICON_SECURE; 366131a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 36620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, "BrowserActivity.resetLockIcon:" + 36630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project " reset lock icon to " + mLockIconType); 36640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project updateLockIconImage(LOCK_ICON_UNSECURE); 36680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 36710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Resets the lock icon. This method is called when the icon needs to be 36720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * reset but we do not know whether we are loading a secure or not secure 36730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * page. 36740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 36750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void resetLockIcon() { 36760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Save the lock-icon state (we revert to it if the load gets cancelled) 36770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project saveLockIcon(); 36780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mLockIconType = LOCK_ICON_UNSECURE; 36800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 368131a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 36820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, "BrowserActivity.resetLockIcon:" + 36830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project " reset lock icon to " + mLockIconType); 36840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project updateLockIconImage(LOCK_ICON_UNSECURE); 36870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 36900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Updates the lock-icon image in the title-bar. 36910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 36920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void updateLockIconImage(int lockIconType) { 36930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Drawable d = null; 36940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (lockIconType == LOCK_ICON_SECURE) { 36950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project d = mSecLockIcon; 36960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (lockIconType == LOCK_ICON_MIXED) { 36970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project d = mMixLockIcon; 36980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If the tab overview is animating or being shown, do not update the 37000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // lock icon. 37010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mAnimationCount == 0 && mTabOverview == null) { 37020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getWindow().setFeatureDrawable(Window.FEATURE_RIGHT_ICON, d); 37030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 37040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 37050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 37070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Displays a page-info dialog. 37080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param tab The tab to show info about 37090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param fromShowSSLCertificateOnError The flag that indicates whether 37100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * this dialog was opened from the SSL-certificate-on-error dialog or 37110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * not. This is important, since we need to know whether to return to 37120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * the parent dialog or simply dismiss. 37130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 37140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void showPageInfo(final TabControl.Tab tab, 37150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final boolean fromShowSSLCertificateOnError) { 37160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final LayoutInflater factory = LayoutInflater 37170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .from(this); 37180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final View pageInfoView = factory.inflate(R.layout.page_info, null); 37200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView view = tab.getWebView(); 37220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String url = null; 37240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String title = null; 37250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (view == null) { 37270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = tab.getUrl(); 37280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = tab.getTitle(); 37290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (view == mTabControl.getCurrentWebView()) { 37300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Use the cached title and url if this is the current WebView 37310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = mUrl; 37320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = mTitle; 37330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 37340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = view.getUrl(); 37350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = view.getTitle(); 37360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 37370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url == null) { 37390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = ""; 37400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 37410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (title == null) { 37420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = ""; 37430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 37440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) pageInfoView.findViewById(R.id.address)).setText(url); 37460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) pageInfoView.findViewById(R.id.title)).setText(title); 37470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoView = tab; 37490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoFromShowSSLCertificateOnError = new Boolean(fromShowSSLCertificateOnError); 37500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project AlertDialog.Builder alertDialogBuilder = 37520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(this) 37530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.page_info).setIcon(android.R.drawable.ic_dialog_info) 37540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setView(pageInfoView) 37550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton( 37560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.string.ok, 37570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 37580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 37590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 37600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoDialog = null; 37610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoView = null; 37620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoFromShowSSLCertificateOnError = null; 37630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we came here from the SSL error dialog 37650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (fromShowSSLCertificateOnError) { 37660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // go back to the SSL error dialog 37670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificateOnError( 37680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView, 37690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler, 37700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError); 37710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 37720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 37730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 37740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setOnCancelListener( 37750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnCancelListener() { 37760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCancel(DialogInterface dialog) { 37770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoDialog = null; 37780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoView = null; 37790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoFromShowSSLCertificateOnError = null; 37800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we came here from the SSL error dialog 37820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (fromShowSSLCertificateOnError) { 37830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // go back to the SSL error dialog 37840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificateOnError( 37850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView, 37860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler, 37870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError); 37880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 37890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 37900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }); 37910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we have a main top-level page SSL certificate set or a certificate 37930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // error 37940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (fromShowSSLCertificateOnError || 37950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (view != null && view.getCertificate() != null)) { 37960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // add a 'View Certificate' button 37970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project alertDialogBuilder.setNeutralButton( 37980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.string.view_certificate, 37990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 38000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 38010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 38020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoDialog = null; 38030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoView = null; 38040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoFromShowSSLCertificateOnError = null; 38050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we came here from the SSL error dialog 38070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (fromShowSSLCertificateOnError) { 38080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // go back to the SSL error dialog 38090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificateOnError( 38100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView, 38110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler, 38120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError); 38130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 38140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // otherwise, display the top-most certificate from 38150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the chain 38160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (view.getCertificate() != null) { 38170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificate(tab); 38180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }); 38220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoDialog = alertDialogBuilder.show(); 38250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 38280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Displays the main top-level page SSL certificate dialog 38290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * (accessible from the Page-Info dialog). 38300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param tab The tab to show certificate for. 38310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 38320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void showSSLCertificate(final TabControl.Tab tab) { 38330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final View certificateView = 38340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inflateCertificateView(tab.getWebView().getCertificate()); 38350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (certificateView == null) { 38360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 38370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LayoutInflater factory = LayoutInflater.from(this); 38400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final LinearLayout placeholder = 38420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (LinearLayout)certificateView.findViewById(R.id.placeholder); 38430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout) factory.inflate( 38450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.layout.ssl_success, placeholder); 38460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.success)) 38470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_certificate_is_valid); 38480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateView = tab; 38500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateDialog = 38510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(this) 38520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.ssl_certificate).setIcon( 38530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.drawable.ic_dialog_browser_certificate_secure) 38540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setView(certificateView) 38550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, 38560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 38570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 38580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 38590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateDialog = null; 38600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateView = null; 38610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showPageInfo(tab, false); 38630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 38650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setOnCancelListener( 38660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnCancelListener() { 38670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCancel(DialogInterface dialog) { 38680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateDialog = null; 38690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateView = null; 38700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showPageInfo(tab, false); 38720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 38740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 38750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 38780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Displays the SSL error certificate dialog. 38790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param view The target web-view. 38800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param handler The SSL error handler responsible for cancelling the 38810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * connection that resulted in an SSL error or proceeding per user request. 38820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param error The SSL error object. 38830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 38840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void showSSLCertificateOnError( 38850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView view, final SslErrorHandler handler, final SslError error) { 38860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final View certificateView = 38880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inflateCertificateView(error.getCertificate()); 38890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (certificateView == null) { 38900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 38910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LayoutInflater factory = LayoutInflater.from(this); 38940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final LinearLayout placeholder = 38960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (LinearLayout)certificateView.findViewById(R.id.placeholder); 38970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_UNTRUSTED)) { 38990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 39000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, placeholder); 39010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 39020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_untrusted); 39030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_IDMISMATCH)) { 39060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 39070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, placeholder); 39080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 39090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_mismatch); 39100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_EXPIRED)) { 39130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 39140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, placeholder); 39150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 39160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_expired); 39170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_NOTYETVALID)) { 39200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 39210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, placeholder); 39220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 39230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_not_yet_valid); 39240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler = handler; 39270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView = view; 39280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError = error; 39290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorDialog = 39300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(this) 39310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.ssl_certificate).setIcon( 39320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.drawable.ic_dialog_browser_certificate_partially_secure) 39330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setView(certificateView) 39340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, 39350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 39360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 39370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 39380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorDialog = null; 39390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView = null; 39400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler = null; 39410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError = null; 39420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWebViewClient.onReceivedSslError( 39440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project view, handler, error); 39450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 39470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setNeutralButton(R.string.page_info_view, 39480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 39490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 39500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 39510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorDialog = null; 39520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // do not clear the dialog state: we will 39540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // need to show the dialog again once the 39550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // user is done exploring the page-info details 39560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showPageInfo(mTabControl.getTabFromView(view), 39580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project true); 39590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 39610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setOnCancelListener( 39620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnCancelListener() { 39630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCancel(DialogInterface dialog) { 39640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorDialog = null; 39650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView = null; 39660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler = null; 39670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError = null; 39680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWebViewClient.onReceivedSslError( 39700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project view, handler, error); 39710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 39730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 39740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 39770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Inflates the SSL certificate view (helper method). 39780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param certificate The SSL certificate. 39790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @return The resultant certificate view with issued-to, issued-by, 39800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * issued-on, expires-on, and possibly other fields set. 39810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * If the input certificate is null, returns null. 39820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 39830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private View inflateCertificateView(SslCertificate certificate) { 39840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (certificate == null) { 39850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return null; 39860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LayoutInflater factory = LayoutInflater.from(this); 39890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project View certificateView = factory.inflate( 39910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.layout.ssl_certificate, null); 39920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // issued to: 39940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project SslCertificate.DName issuedTo = certificate.getIssuedTo(); 39950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (issuedTo != null) { 39960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.to_common)) 39970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedTo.getCName()); 39980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.to_org)) 39990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedTo.getOName()); 40000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.to_org_unit)) 40010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedTo.getUName()); 40020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // issued by: 40050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project SslCertificate.DName issuedBy = certificate.getIssuedBy(); 40060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (issuedBy != null) { 40070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.by_common)) 40080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedBy.getCName()); 40090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.by_org)) 40100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedBy.getOName()); 40110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.by_org_unit)) 40120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedBy.getUName()); 40130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // issued on: 40160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String issuedOn = reformatCertificateDate( 40170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project certificate.getValidNotBefore()); 40180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.issued_on)) 40190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedOn); 40200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // expires on: 40220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String expiresOn = reformatCertificateDate( 40230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project certificate.getValidNotAfter()); 40240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.expires_on)) 40250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(expiresOn); 40260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return certificateView; 40280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 40310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Re-formats the certificate date (Date.toString()) string to 40320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * a properly localized date string. 40330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @return Properly localized version of the certificate date string and 40340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * the original certificate date string if fails to localize. 40350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * If the original string is null, returns an empty string "". 40360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 40370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String reformatCertificateDate(String certificateDate) { 40380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String reformattedDate = null; 40390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (certificateDate != null) { 40410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Date date = null; 40420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 40430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project date = java.text.DateFormat.getInstance().parse(certificateDate); 40440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (ParseException e) { 40450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project date = null; 40460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (date != null) { 40490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project reformattedDate = 40500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project DateFormat.getDateFormat(this).format(date); 40510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return reformattedDate != null ? reformattedDate : 40550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (certificateDate != null ? certificateDate : ""); 40560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 40590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Displays an http-authentication dialog. 40600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 40610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void showHttpAuthentication(final HttpAuthHandler handler, 40620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final String host, final String realm, final String title, 40630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final String name, final String password, int focusId) { 40640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LayoutInflater factory = LayoutInflater.from(this); 40650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final View v = factory 40660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.http_authentication, null); 40670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (name != null) { 40680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((EditText) v.findViewById(R.id.username_edit)).setText(name); 40690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (password != null) { 40710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((EditText) v.findViewById(R.id.password_edit)).setText(password); 40720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String titleText = title; 40750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (titleText == null) { 40760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project titleText = getText(R.string.sign_in_to).toString().replace( 40770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "%s1", host).replace("%s2", realm); 40780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 40790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthHandler = handler; 40810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project AlertDialog dialog = new AlertDialog.Builder(this) 40820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(titleText) 40830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setIcon(android.R.drawable.ic_dialog_alert) 40840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setView(v) 40850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.action, 40860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 40870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 40880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 40890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String nm = ((EditText) v 40900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .findViewById(R.id.username_edit)) 40910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .getText().toString(); 40920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String pw = ((EditText) v 40930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .findViewById(R.id.password_edit)) 40940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .getText().toString(); 40950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserActivity.this.setHttpAuthUsernamePassword 40960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (host, realm, nm, pw); 40970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.proceed(nm, pw); 40980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthenticationDialog = null; 40990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthHandler = null; 41000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 41010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setNegativeButton(R.string.cancel, 41020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 41030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 41040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 41050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.cancel(); 41060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserActivity.this.resetTitleAndRevertLockIcon(); 41070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthenticationDialog = null; 41080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthHandler = null; 41090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 41100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setOnCancelListener(new DialogInterface.OnCancelListener() { 41110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCancel(DialogInterface dialog) { 41120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.cancel(); 41130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserActivity.this.resetTitleAndRevertLockIcon(); 41140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthenticationDialog = null; 41150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthHandler = null; 41160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 41170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .create(); 41180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Make the IME appear when the dialog is displayed if applicable. 41190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dialog.getWindow().setSoftInputMode( 41200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); 41210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dialog.show(); 41220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (focusId != 0) { 41230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dialog.findViewById(focusId).requestFocus(); 41240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 41250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project v.findViewById(R.id.username_edit).requestFocus(); 41260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 41270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthenticationDialog = dialog; 41280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 41290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 41300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public int getProgress() { 41310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = mTabControl.getCurrentWebView(); 41320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 41330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return w.getProgress(); 41340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 41350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return 100; 41360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 41370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 41380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 41390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 41400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Set HTTP authentication password. 41410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 41420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param host The host for the password 41430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param realm The realm for the password 41440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param username The username for the password. If it is null, it means 41450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * password can't be saved. 41460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param password The password 41470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 41480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void setHttpAuthUsernamePassword(String host, String realm, 41490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String username, 41500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String password) { 41510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = mTabControl.getCurrentWebView(); 41520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 41530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.setHttpAuthUsernamePassword(host, realm, username, password); 41540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 41550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 41560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 41570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 41580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * connectivity manager says net has come or gone... inform the user 41590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param up true if net has come up, false if net has gone down 41600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 41610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onNetworkToggle(boolean up) { 41620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (up == mIsNetworkUp) { 41630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 41640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (up) { 41650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mIsNetworkUp = true; 41660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mAlertDialog != null) { 41670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mAlertDialog.cancel(); 41680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mAlertDialog = null; 41690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 41700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 41710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mIsNetworkUp = false; 41720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mInLoad && mAlertDialog == null) { 41730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mAlertDialog = new AlertDialog.Builder(this) 41740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.loadSuspendedTitle) 41750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setMessage(R.string.loadSuspended) 41760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, null) 41770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 41780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 41790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 41800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = mTabControl.getCurrentWebView(); 41810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 41820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.setNetworkAvailable(up); 41830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 41840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 41850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 41860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 41870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project protected void onActivityResult(int requestCode, int resultCode, 41880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent) { 41890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (requestCode) { 41900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case COMBO_PAGE: 41910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (resultCode == RESULT_OK && intent != null) { 41920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String data = intent.getAction(); 41930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Bundle extras = intent.getExtras(); 41940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (extras != null && extras.getBoolean("new_window", false)) { 41950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project openTab(data); 41960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 41970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final TabControl.Tab currentTab = 41980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.getCurrentTab(); 41990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If the Window overview is up and we are not in the 42000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // middle of an animation, animate away from it to the 42010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // current tab. 42020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabOverview != null && mAnimationCount == 0) { 42030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sendAnimateFromOverview(currentTab, false, data, 42040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TAB_OVERVIEW_DELAY, null); 42050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 42060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dismissSubWindow(currentTab); 42070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (data != null && data.length() != 0) { 42080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().loadUrl(data); 42090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 42100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 42110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 42120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 42130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 42140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project default: 42150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 42160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 42170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().requestFocus(); 42180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 42190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* 42210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * This method is called as a result of the user selecting the options 42220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * menu to see the download window, or when a download changes state. It 42230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * shows the download window ontop of the current window. 42240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 42250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ void viewDownloads(Uri downloadRecord) { 42260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent = new Intent(this, 42270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserDownloadPage.class); 42280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.setData(downloadRecord); 42290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project startActivityForResult(intent, this.DOWNLOAD_PAGE); 42300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 42320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 42340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Handle results from Tab Switcher mTabOverview tool 42350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 42360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private class TabListener implements ImageGrid.Listener { 42370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void remove(int position) { 42380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Note: Remove is not enabled if we have only one tab. 423931a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (DEBUG && mTabControl.getTabCount() == 1) { 42400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project throw new AssertionError(); 42410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 42420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Remember the current tab. 42440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TabControl.Tab current = mTabControl.getCurrentTab(); 42450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final TabControl.Tab remove = mTabControl.getTab(position); 42460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.removeTab(remove); 42470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If we removed the current tab, use the tab at position - 1 if 42480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // possible. 42490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current == remove) { 42500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If the user removes the last tab, act like the New Tab item 42510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // was clicked on. 42520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabControl.getTabCount() == 0) { 4253f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project current = mTabControl.createNewTab(); 42540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sendAnimateFromOverview(current, true, 42550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSettings.getHomePage(), TAB_OVERVIEW_DELAY, null); 42560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 42570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final int index = position > 0 ? (position - 1) : 0; 42580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project current = mTabControl.getTab(index); 42590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 42600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 42610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // The tab overview could have been dismissed before this method is 42630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // called. 42640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabOverview != null) { 42650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Remove the tab and change the index. 42660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabOverview.remove(position); 42670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabOverview.setCurrentIndex(mTabControl.getTabIndex(current)); 42680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 42690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Only the current tab ensures its WebView is non-null. This 42710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // implies that we are reloading the freed tab. 42720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.setCurrentTab(current); 42730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 42740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(int index) { 42750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Change the tab if necessary. 42760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Index equals ImageGrid.CANCEL when pressing back from the tab 42770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // overview. 42780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (index == ImageGrid.CANCEL) { 42790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project index = mTabControl.getCurrentIndex(); 42800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // The current index is -1 if the current tab was removed. 42810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (index == -1) { 42820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Take the last tab as a fallback. 42830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project index = mTabControl.getTabCount() - 1; 42840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 42850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 42860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // NEW_TAB means that the "New Tab" cell was clicked on. 42880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (index == ImageGrid.NEW_TAB) { 4289f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project openTabAndShow(mSettings.getHomePage(), null, false, null); 42900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 42910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project sendAnimateFromOverview(mTabControl.getTab(index), 42920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project false, null, 0, null); 42930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 42940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 42950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 42960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 42970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // A fake View that draws the WebView's picture with a fast zoom filter. 42980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // The View is used in case the tab is freed during the animation because 42990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // of low memory. 43000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static class AnimatingView extends View { 43010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static final int ZOOM_BITS = Paint.FILTER_BITMAP_FLAG | 43020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Paint.DITHER_FLAG | Paint.SUBPIXEL_TEXT_FLAG; 43030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static final DrawFilter sZoomFilter = 43040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new PaintFlagsDrawFilter(ZOOM_BITS, Paint.LINEAR_TEXT_FLAG); 43050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final Picture mPicture; 43060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final float mScale; 43070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final int mScrollX; 43080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final int mScrollY; 43090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final TabControl.Tab mTab; 43100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 43110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project AnimatingView(Context ctxt, TabControl.Tab t) { 43120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super(ctxt); 43130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTab = t; 43140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Use the top window in the animation since the tab overview will 43150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // display the top window in each cell. 43160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView w = t.getTopWindow(); 43170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPicture = w.capturePicture(); 43180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mScale = w.getScale() / w.getWidth(); 43190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mScrollX = w.getScrollX(); 43200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mScrollY = w.getScrollY(); 43210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 43220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 43230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 43240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project protected void onDraw(Canvas canvas) { 43250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project canvas.save(); 43260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project canvas.drawColor(Color.WHITE); 43270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mPicture != null) { 43280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project canvas.setDrawFilter(sZoomFilter); 43290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project float scale = getWidth() * mScale; 43300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project canvas.scale(scale, scale); 43310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project canvas.translate(-mScrollX, -mScrollY); 43320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project canvas.drawPicture(mPicture); 43330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 43340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project canvas.restore(); 43350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 43360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 43370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 43380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 43390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Open the tab picker. This function will always use the current tab in 43400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * its animation. 43410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param stay boolean stating whether the tab picker is to remain open 43420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * (in which case it needs a listener and its menu) or not. 43430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param index The index of the tab to show as the selection in the tab 43440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * overview. 43450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param remove If true, the tab at index will be removed after the 43460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * animation completes. 43470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 43480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void tabPicker(final boolean stay, final int index, 43490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final boolean remove) { 43500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabOverview != null) { 43510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 43520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 43530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 43540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int size = mTabControl.getTabCount(); 43550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 43560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TabListener l = null; 43570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (stay) { 43580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project l = mTabListener = new TabListener(); 43590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 43600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabOverview = new ImageGrid(this, stay, l); 43610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 43620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project for (int i = 0; i < size; i++) { 43630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final TabControl.Tab t = mTabControl.getTab(i); 43640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.populatePickerData(t); 43650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabOverview.add(t); 43660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 43670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 43680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Tell the tab overview to show the current tab, the tab overview will 43690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // handle the "New Tab" case. 43700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int currentIndex = mTabControl.getCurrentIndex(); 43710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabOverview.setCurrentIndex(currentIndex); 43720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 43730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Attach the tab overview. 43740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mContentView.addView(mTabOverview, COVER_SCREEN_PARAMS); 43750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 43760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Create a fake AnimatingView to animate the WebView's picture. 43770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final TabControl.Tab current = mTabControl.getCurrentTab(); 43780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final AnimatingView v = new AnimatingView(this, current); 43790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mContentView.addView(v, COVER_SCREEN_PARAMS); 43800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project removeTabFromContentView(current); 43810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Pause timers to get the animation smoother. 43820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project current.getWebView().pauseTimers(); 43830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 43840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Send a message so the tab picker has a chance to layout and get 43850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // positions for all the cells. 43860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.sendMessage(mHandler.obtainMessage(ANIMATE_TO_OVERVIEW, 43870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project index, remove ? 1 : 0, v)); 43880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Setting this will indicate that we are animating to the overview. We 43890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // set it here to prevent another request to animate from coming in 43900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // between now and when ANIMATE_TO_OVERVIEW is handled. 43910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mAnimationCount++; 43920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Always change the title bar to the window overview title while 43930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // animating. 43940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getWindow().setFeatureDrawable(Window.FEATURE_LEFT_ICON, null); 43950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getWindow().setFeatureDrawable(Window.FEATURE_RIGHT_ICON, null); 43960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getWindow().setFeatureInt(Window.FEATURE_PROGRESS, 43970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Window.PROGRESS_VISIBILITY_OFF); 43980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setTitle(R.string.tab_picker_title); 43990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Make the menu empty until the animation completes. 44000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenuState = EMPTY_MENU; 44010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 44020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 44030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void bookmarksOrHistoryPicker(boolean startWithHistory) { 44040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView current = mTabControl.getCurrentWebView(); 44050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current == null) { 44060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 44070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 44080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent = new Intent(this, 44090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project CombinedBookmarkHistoryActivity.class); 44100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String title = current.getTitle(); 44110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String url = current.getUrl(); 44120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Just in case the user opens bookmarks before a page finishes loading 44130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // so the current history item, and therefore the page, is null. 44140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (null == url) { 44150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = mLastEnteredUrl; 44160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // This can happen. 44170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (null == url) { 44180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = mSettings.getHomePage(); 44190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 44200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 44210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // In case the web page has not yet received its associated title. 44220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (title == null) { 44230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = url; 44240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 44250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.putExtra("title", title); 44260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.putExtra("url", url); 44270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.putExtra("maxTabsOpen", 44280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.getTabCount() >= TabControl.MAX_TABS); 44290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (startWithHistory) { 44300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.putExtra(CombinedBookmarkHistoryActivity.STARTING_TAB, 44310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project CombinedBookmarkHistoryActivity.HISTORY_TAB); 44320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 44330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project startActivityForResult(intent, COMBO_PAGE); 44340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 44350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 44360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Called when loading from context menu or LOAD_URL message 44370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void loadURL(WebView view, String url) { 44380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // In case the user enters nothing. 44390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null && url.length() != 0 && view != null) { 44400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = smartUrlFilter(url); 44410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!mWebViewClient.shouldOverrideUrlLoading(view, url)) { 44420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project view.loadUrl(url); 44430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 44440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 44450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 44460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 44470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void checkMemory() { 44480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo(); 44490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((ActivityManager) getSystemService(ACTIVITY_SERVICE)) 44500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .getMemoryInfo(mi); 44510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // FIXME: mi.lowMemory is too aggressive, use (mi.availMem < 44520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // mi.threshold) for now 44530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if (mi.lowMemory) { 44540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mi.availMem < mi.threshold) { 44550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.w(LOGTAG, "Browser is freeing memory now because: available=" 44560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + (mi.availMem / 1024) + "K threshold=" 44570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + (mi.threshold / 1024) + "K"); 44580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.freeMemory(); 44590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 44600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 44610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 44620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String smartUrlFilter(Uri inUri) { 44630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (inUri != null) { 44640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return smartUrlFilter(inUri.toString()); 44650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 44660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return null; 44670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 44680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 44690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 44700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // get window count 44710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 44720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int getWindowCount(){ 44730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if(mTabControl != null){ 44740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return mTabControl.getTabCount(); 44750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 44760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return 0; 44770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 44780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 44790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project static final Pattern ACCEPTED_URI_SCHEMA = Pattern.compile( 44800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "(?i)" + // switch on case insensitive matching 44810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "(" + // begin group for schema 44820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "(?:http|https|file):\\/\\/" + 44830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "|(?:data|about|content|javascript):" + 44840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ")" + 44850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "(.*)" ); 44860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 44870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 44880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Attempts to determine whether user input is a URL or search 44890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * terms. Anything with a space is passed to search. 44900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 44910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Converts to lowercase any mistakenly uppercased schema (i.e., 44920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * "Http://" converts to "http://" 44930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 44940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @return Original or modified URL 44950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 44960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 44970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String smartUrlFilter(String url) { 44980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 44990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String inUrl = url.trim(); 45000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean hasSpace = inUrl.indexOf(' ') != -1; 45010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 45020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Matcher matcher = ACCEPTED_URI_SCHEMA.matcher(inUrl); 45030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (matcher.matches()) { 45040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // force scheme to lowercase 45050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String scheme = matcher.group(1); 45060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String lcScheme = scheme.toLowerCase(); 45070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!lcScheme.equals(scheme)) { 4508123ecfb21e7ca670e3d04efe58780b3bac54a9a1Mitsuru Oshima inUrl = lcScheme + matcher.group(2); 4509123ecfb21e7ca670e3d04efe58780b3bac54a9a1Mitsuru Oshima } 4510123ecfb21e7ca670e3d04efe58780b3bac54a9a1Mitsuru Oshima if (hasSpace) { 4511123ecfb21e7ca670e3d04efe58780b3bac54a9a1Mitsuru Oshima inUrl = inUrl.replace(" ", "%20"); 45120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 45130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return inUrl; 45140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 45150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (hasSpace) { 4516565505b1a2c1d3099496af5910760087602e994aSatish Sampath // FIXME: Is this the correct place to add to searches? 4517565505b1a2c1d3099496af5910760087602e994aSatish Sampath // what if someone else calls this function? 4518565505b1a2c1d3099496af5910760087602e994aSatish Sampath int shortcut = parseUrlShortcut(inUrl); 4519565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (shortcut != SHORTCUT_INVALID) { 4520565505b1a2c1d3099496af5910760087602e994aSatish Sampath Browser.addSearchUrl(mResolver, inUrl); 4521565505b1a2c1d3099496af5910760087602e994aSatish Sampath String query = inUrl.substring(2); 4522565505b1a2c1d3099496af5910760087602e994aSatish Sampath switch (shortcut) { 4523565505b1a2c1d3099496af5910760087602e994aSatish Sampath case SHORTCUT_GOOGLE_SEARCH: 4524565505b1a2c1d3099496af5910760087602e994aSatish Sampath return composeSearchUrl(query); 4525565505b1a2c1d3099496af5910760087602e994aSatish Sampath case SHORTCUT_WIKIPEDIA_SEARCH: 4526565505b1a2c1d3099496af5910760087602e994aSatish Sampath return URLUtil.composeSearchUrl(query, QuickSearch_W, QUERY_PLACE_HOLDER); 4527565505b1a2c1d3099496af5910760087602e994aSatish Sampath case SHORTCUT_DICTIONARY_SEARCH: 4528565505b1a2c1d3099496af5910760087602e994aSatish Sampath return URLUtil.composeSearchUrl(query, QuickSearch_D, QUERY_PLACE_HOLDER); 4529565505b1a2c1d3099496af5910760087602e994aSatish Sampath case SHORTCUT_GOOGLE_MOBILE_LOCAL_SEARCH: 45300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // FIXME: we need location in this case 4531565505b1a2c1d3099496af5910760087602e994aSatish Sampath return URLUtil.composeSearchUrl(query, QuickSearch_L, QUERY_PLACE_HOLDER); 45320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 45330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 45340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 45350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (Regex.WEB_URL_PATTERN.matcher(inUrl).matches()) { 45360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return URLUtil.guessUrl(inUrl); 45370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 45380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 45390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 45400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Browser.addSearchUrl(mResolver, inUrl); 45410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return composeSearchUrl(inUrl); 45420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 45430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 45440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ String composeSearchUrl(String search) { 45450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return URLUtil.composeSearchUrl(search, QuickSearch_G, 45460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project QUERY_PLACE_HOLDER); 45470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 45480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 45490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */void setBaseSearchUrl(String url) { 45500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url == null || url.length() == 0) { 45510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* 45520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * get the google search url based on the SIM. Default is US. NOTE: 45530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * This code uses resources to optionally select the search Uri, 45540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * based on the MCC value from the SIM. The default string will most 45550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * likely be fine. It is parameterized to accept info from the 45560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Locale, the language code is the first parameter (%1$s) and the 45570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * country code is the second (%2$s). This code must function in the 45580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * same way as a similar lookup in 45590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * com.android.googlesearch.SuggestionProvider#onCreate(). If you 45600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * change either of these functions, change them both. (The same is 45610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * true for the underlying resource strings, which are stored in 45620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * mcc-specific xml files.) 45630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 45640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Locale l = Locale.getDefault(); 4565e9651c3366520fcbc1fba6b3ee662cae95fcea7bBill Napier String language = l.getLanguage(); 4566e9651c3366520fcbc1fba6b3ee662cae95fcea7bBill Napier String country = l.getCountry().toLowerCase(); 4567e9651c3366520fcbc1fba6b3ee662cae95fcea7bBill Napier // Chinese and Portuguese have two langauge variants. 4568e9651c3366520fcbc1fba6b3ee662cae95fcea7bBill Napier if ("zh".equals(language)) { 4569e9651c3366520fcbc1fba6b3ee662cae95fcea7bBill Napier if ("cn".equals(country)) { 4570e9651c3366520fcbc1fba6b3ee662cae95fcea7bBill Napier language = "zh-CN"; 4571e9651c3366520fcbc1fba6b3ee662cae95fcea7bBill Napier } else if ("tw".equals(country)) { 4572e9651c3366520fcbc1fba6b3ee662cae95fcea7bBill Napier language = "zh-TW"; 4573e9651c3366520fcbc1fba6b3ee662cae95fcea7bBill Napier } 4574e9651c3366520fcbc1fba6b3ee662cae95fcea7bBill Napier } else if ("pt".equals(language)) { 4575e9651c3366520fcbc1fba6b3ee662cae95fcea7bBill Napier if ("br".equals(country)) { 4576e9651c3366520fcbc1fba6b3ee662cae95fcea7bBill Napier language = "pt-BR"; 4577e9651c3366520fcbc1fba6b3ee662cae95fcea7bBill Napier } else if ("pt".equals(country)) { 4578e9651c3366520fcbc1fba6b3ee662cae95fcea7bBill Napier language = "pt-PT"; 4579e9651c3366520fcbc1fba6b3ee662cae95fcea7bBill Napier } 4580e9651c3366520fcbc1fba6b3ee662cae95fcea7bBill Napier } 45810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project QuickSearch_G = getResources().getString( 4582e9651c3366520fcbc1fba6b3ee662cae95fcea7bBill Napier R.string.google_search_base, 4583e9651c3366520fcbc1fba6b3ee662cae95fcea7bBill Napier language, 4584e9651c3366520fcbc1fba6b3ee662cae95fcea7bBill Napier country) 45850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + "client=ms-" 4586f447f26579a10515272f5b9824c918a56a9b104bRamanan Rajeswaran + Partner.getString(this.getContentResolver(), Partner.CLIENT_ID) 45870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + "&source=android-" + GOOGLE_SEARCH_SOURCE_SUGGEST + "&q=%s"; 45880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 45890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project QuickSearch_G = url; 45900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 45910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 45920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 45930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final static int LOCK_ICON_UNSECURE = 0; 45940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final static int LOCK_ICON_SECURE = 1; 45950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final static int LOCK_ICON_MIXED = 2; 45960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 45970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private int mLockIconType = LOCK_ICON_UNSECURE; 45980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private int mPrevLockType = LOCK_ICON_UNSECURE; 45990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 46000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private BrowserSettings mSettings; 46010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private TabControl mTabControl; 46020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private ContentResolver mResolver; 46030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private FrameLayout mContentView; 46040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private ImageGrid mTabOverview; 46050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 46060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // FIXME, temp address onPrepareMenu performance problem. When we move everything out of 46070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // view, we should rewrite this. 46080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private int mCurrentMenuState = 0; 46090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private int mMenuState = R.id.MAIN_MENU; 46100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static final int EMPTY_MENU = -1; 46110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Menu mMenu; 46120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 46130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private FindDialog mFindDialog; 46140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Used to prevent chording to result in firing two shortcuts immediately 46150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // one after another. Fixes bug 1211714. 46160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean mCanChord; 46170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 46180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private boolean mInLoad; 46190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private boolean mIsNetworkUp; 46200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 46210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private boolean mPageStarted; 46220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private boolean mActivityInPause = true; 46230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 46240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private boolean mMenuIsDown; 46250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 46260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final KeyTracker mKeyTracker = new KeyTracker(this); 46270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 46280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // As trackball doesn't send repeat down, we have to track it ourselves 46290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private boolean mTrackTrackball; 46300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 46310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static boolean mInTrace; 46320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 46330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Performance probe 46340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static final int[] SYSTEM_CPU_FORMAT = new int[] { 46350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_COMBINE, 46360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 1: user time 46370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 2: nice time 46380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 3: sys time 46390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 4: idle time 46400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 5: iowait time 46410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 6: irq time 46420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG // 7: softirq time 46430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 46440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 46450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mStart; 46460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mProcessStart; 46470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mUserStart; 46480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mSystemStart; 46490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mIdleStart; 46500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mIrqStart; 46510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 46520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mUiStart; 46530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 46540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Drawable mMixLockIcon; 46550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Drawable mSecLockIcon; 46560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Drawable mGenericFavicon; 46570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 46580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* hold a ref so we can auto-cancel if necessary */ 46590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private AlertDialog mAlertDialog; 46600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 46610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Wait for credentials before loading google.com 46620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private ProgressDialog mCredsDlg; 46630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 46640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // The up-to-date URL and title (these can be different from those stored 46650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // in WebView, since it takes some time for the information in WebView to 46660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // get updated) 46670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String mUrl; 46680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String mTitle; 46690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 46700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // As PageInfo has different style for landscape / portrait, we have 46710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // to re-open it when configuration changed 46720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private AlertDialog mPageInfoDialog; 46730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private TabControl.Tab mPageInfoView; 46740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If the Page-Info dialog is launched from the SSL-certificate-on-error 46750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // dialog, we should not just dismiss it, but should get back to the 46760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // SSL-certificate-on-error dialog. This flag is used to store this state 46770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Boolean mPageInfoFromShowSSLCertificateOnError; 46780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 46790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // as SSLCertificateOnError has different style for landscape / portrait, 46800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // we have to re-open it when configuration changed 46810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private AlertDialog mSSLCertificateOnErrorDialog; 46820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private WebView mSSLCertificateOnErrorView; 46830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private SslErrorHandler mSSLCertificateOnErrorHandler; 46840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private SslError mSSLCertificateOnErrorError; 46850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 46860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // as SSLCertificate has different style for landscape / portrait, we 46870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // have to re-open it when configuration changed 46880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private AlertDialog mSSLCertificateDialog; 46890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private TabControl.Tab mSSLCertificateView; 46900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 46910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // as HttpAuthentication has different style for landscape / portrait, we 46920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // have to re-open it when configuration changed 46930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private AlertDialog mHttpAuthenticationDialog; 46940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private HttpAuthHandler mHttpAuthHandler; 46950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 46960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /*package*/ static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS = 46970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new FrameLayout.LayoutParams( 46980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ViewGroup.LayoutParams.FILL_PARENT, 46990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ViewGroup.LayoutParams.FILL_PARENT); 47000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // We may provide UI to customize these 47010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Google search from the browser 47020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project static String QuickSearch_G; 47030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Wikipedia search 47040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String QuickSearch_W = "http://en.wikipedia.org/w/index.php?search=%s&go=Go"; 47050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Dictionary search 47060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String QuickSearch_D = "http://dictionary.reference.com/search?q=%s"; 47070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Google Mobile Local search 47080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String QuickSearch_L = "http://www.google.com/m/search?site=local&q=%s&near=mountain+view"; 47090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 47100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String QUERY_PLACE_HOLDER = "%s"; 47110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 47120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "source" parameter for Google search through search key 47130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String GOOGLE_SEARCH_SOURCE_SEARCHKEY = "browser-key"; 47140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "source" parameter for Google search through goto menu 47150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String GOOGLE_SEARCH_SOURCE_GOTO = "browser-goto"; 47160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "source" parameter for Google search through simplily type 47170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String GOOGLE_SEARCH_SOURCE_TYPE = "browser-type"; 47180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "source" parameter for Google search suggested by the browser 47190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String GOOGLE_SEARCH_SOURCE_SUGGEST = "browser-suggest"; 47200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "source" parameter for Google search from unknown source 47210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String GOOGLE_SEARCH_SOURCE_UNKNOWN = "unknown"; 47220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 47230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final static String LOGTAG = "browser"; 47240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 47250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private TabListener mTabListener; 47260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 47270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String mLastEnteredUrl; 47280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 47290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private PowerManager.WakeLock mWakeLock; 47300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final static int WAKELOCK_TIMEOUT = 5 * 60 * 1000; // 5 minutes 47310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 47320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Toast mStopToast; 47330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 47340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Used during animations to prevent other animations from being triggered. 47350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // A count is used since the animation to and from the Window overview can 47360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // overlap. A count of 0 means no animation where a count of > 0 means 47370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // there are animations in progress. 47380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private int mAnimationCount; 47390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 47400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // As the ids are dynamically created, we can't guarantee that they will 47410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // be in sequence, so this static array maps ids to a window number. 47420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static private int[] WINDOW_SHORTCUT_ID_ARRAY = 47430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project { R.id.window_one_menu_id, R.id.window_two_menu_id, R.id.window_three_menu_id, 47440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.id.window_four_menu_id, R.id.window_five_menu_id, R.id.window_six_menu_id, 47450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.id.window_seven_menu_id, R.id.window_eight_menu_id }; 47460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 47470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // monitor platform changes 47480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private IntentFilter mNetworkStateChangedFilter; 47490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private BroadcastReceiver mNetworkStateIntentReceiver; 47500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 47510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // activity requestCode 47520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static int COMBO_PAGE = 1; 47530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static int DOWNLOAD_PAGE = 2; 47540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static int PREFERENCES_PAGE = 3; 47550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 47560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the frenquency of checking whether system memory is low 47570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static int CHECK_MEMORY_INTERVAL = 30000; // 30 seconds 47580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project} 4759