BrowserActivity.java revision ab168ba86162b4e89e74d0a077b9c618437cbce4
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 android.app.Activity; 200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.app.AlertDialog; 210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.app.ProgressDialog; 220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.app.SearchManager; 230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.ActivityNotFoundException; 240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.BroadcastReceiver; 250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.ComponentName; 2658d56c6b5052faa86083965132cd51b1a9594d0eLeon Scrogginsimport android.content.ContentProvider; 2758d56c6b5052faa86083965132cd51b1a9594d0eLeon Scrogginsimport android.content.ContentProviderClient; 280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.ContentResolver; 29b6b7f9ef3b4ed220063f555d8b7c205210a61a04Leon Scrogginsimport android.content.ContentUris; 300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.ContentValues; 310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.Context; 320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.DialogInterface; 330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.Intent; 340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.IntentFilter; 35b4da0ad0351996f639b50f9f29b123a9b5c24fd0Grace Klobaimport android.content.pm.PackageInfo; 360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.pm.PackageManager; 370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.pm.ResolveInfo; 380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.res.Configuration; 390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.res.Resources; 400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.database.Cursor; 4196afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scrogginsimport android.database.DatabaseUtils; 420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.graphics.Bitmap; 43540035dfd1347c78eeec10ec0847e18fcc50ef36Andrei Popescuimport android.graphics.BitmapFactory; 440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.graphics.Canvas; 450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.graphics.Picture; 463bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scrogginsimport android.graphics.PixelFormat; 473bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scrogginsimport android.graphics.Rect; 480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.graphics.drawable.Drawable; 490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.net.ConnectivityManager; 5056199cc25e7ee0455ec2a8099098b66b8554f677Andrei Popescuimport android.net.NetworkInfo; 510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.net.Uri; 520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.net.WebAddress; 530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.net.http.SslCertificate; 540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.net.http.SslError; 550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.AsyncTask; 560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.Bundle; 570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.Debug; 580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.Environment; 590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.Handler; 600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.Message; 610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.PowerManager; 620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.Process; 630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.ServiceManager; 640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.SystemClock; 650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.provider.Browser; 665e335a381a0cd66e94117b202c1f34f5cb29c9b8Cary Clarkimport android.provider.ContactsContract; 675e335a381a0cd66e94117b202c1f34f5cb29c9b8Cary Clarkimport android.provider.ContactsContract.Intents.Insert; 680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.provider.Downloads; 690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.provider.MediaStore; 70a1cc3fdce19a336c251297c61cd83ac6cf767cd1Leon Scrogginsimport android.speech.RecognizerResultsIntent; 710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.text.IClipboard; 720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.text.TextUtils; 730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.text.format.DateFormat; 74b94bf27370329abb27e5e33b493d6edb5662b36eLeon Scrogginsimport android.util.AttributeSet; 750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.util.Log; 76385effd3192a16b737a7d4fbe4fc71c6cf467627Dianne Hackbornimport android.util.Patterns; 770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.ContextMenu; 780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.Gravity; 790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.KeyEvent; 800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.LayoutInflater; 810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.Menu; 820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.MenuInflater; 830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.MenuItem; 840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.View; 850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.ViewGroup; 860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.Window; 870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.WindowManager; 880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.ContextMenu.ContextMenuInfo; 890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.MenuItem.OnMenuItemClickListener; 900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.CookieManager; 910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.CookieSyncManager; 920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.DownloadListener; 930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.HttpAuthHandler; 94b4da0ad0351996f639b50f9f29b123a9b5c24fd0Grace Klobaimport android.webkit.PluginManager; 950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.SslErrorHandler; 960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.URLUtil; 97cb6cc864e53f7d916622daf3b2cec133b36d6a55Leon Clarkeimport android.webkit.ValueCallback; 980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.WebChromeClient; 990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.WebHistoryItem; 1000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.WebIconDatabase; 1010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.WebView; 1020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.EditText; 1030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.FrameLayout; 1040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.LinearLayout; 1050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.TextView; 1060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.Toast; 107752b656ef16af3804572ee91469b1cd6ff2a4b87Fred Quintanaimport android.accounts.Account; 108752b656ef16af3804572ee91469b1cd6ff2a4b87Fred Quintanaimport android.accounts.AccountManager; 109752b656ef16af3804572ee91469b1cd6ff2a4b87Fred Quintanaimport android.accounts.AccountManagerFuture; 110752b656ef16af3804572ee91469b1cd6ff2a4b87Fred Quintanaimport android.accounts.AuthenticatorException; 111752b656ef16af3804572ee91469b1cd6ff2a4b87Fred Quintanaimport android.accounts.OperationCanceledException; 112752b656ef16af3804572ee91469b1cd6ff2a4b87Fred Quintanaimport android.accounts.AccountManagerCallback; 1130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11410d1cca0c208d1f9db23893a8515685e04cfe224Bjorn Bringertimport com.android.common.Search; 1151fe13a5230e319df42b21939a14d127bd9bf3856Leon Scrogginsimport com.android.common.speech.LoggingEvents; 1165ee906c089567bca705e18561357510d7b55cb5aDan Egnor 117b6b7f9ef3b4ed220063f555d8b7c205210a61a04Leon Scrogginsimport java.io.ByteArrayOutputStream; 1180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.io.File; 1194f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdochimport java.io.IOException; 1204f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdochimport java.io.InputStream; 1210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.net.MalformedURLException; 1220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.net.URI; 1239918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackbornimport java.net.URISyntaxException; 1240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.net.URL; 1250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.net.URLEncoder; 1260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.text.ParseException; 1270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.Date; 1280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.HashMap; 12930995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescuimport java.util.HashSet; 13000f54c589fd38431efd42ea2a551a49e64d595d5Grace Klobaimport java.util.Iterator; 13130995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescuimport java.util.List; 132068e48b469f5abca53ee3da38f933cf2c25c93b8Grace Klobaimport java.util.Map; 13330995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescuimport java.util.Set; 1340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.regex.Matcher; 1350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.regex.Pattern; 1360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectpublic class BrowserActivity extends Activity 13898d5fce7c687cfcc956b10d44946d31f39b6dc15Shimeng (Simon) Wang implements View.OnCreateContextMenuListener, DownloadListener { 1390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14031a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort /* Define some aliases to make these debugging flags easier to refer to. 14131a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort * This file imports android.provider.Browser, so we can't just refer to "Browser.DEBUG". 14231a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort */ 14331a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort private final static boolean DEBUG = com.android.browser.Browser.DEBUG; 14431a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort private final static boolean LOGV_ENABLED = com.android.browser.Browser.LOGV_ENABLED; 14531a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort private final static boolean LOGD_ENABLED = com.android.browser.Browser.LOGD_ENABLED; 14631a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort 147565505b1a2c1d3099496af5910760087602e994aSatish Sampath // These are single-character shortcuts for searching popular sources. 148565505b1a2c1d3099496af5910760087602e994aSatish Sampath private static final int SHORTCUT_INVALID = 0; 149565505b1a2c1d3099496af5910760087602e994aSatish Sampath private static final int SHORTCUT_GOOGLE_SEARCH = 1; 150565505b1a2c1d3099496af5910760087602e994aSatish Sampath private static final int SHORTCUT_WIKIPEDIA_SEARCH = 2; 151565505b1a2c1d3099496af5910760087602e994aSatish Sampath private static final int SHORTCUT_DICTIONARY_SEARCH = 3; 152565505b1a2c1d3099496af5910760087602e994aSatish Sampath private static final int SHORTCUT_GOOGLE_MOBILE_LOCAL_SEARCH = 4; 153565505b1a2c1d3099496af5910760087602e994aSatish Sampath 154a977124eb29b195127fd161120ebbc58b255fb48Cary Clark private static class ClearThumbnails extends AsyncTask<File, Void, Void> { 1550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 1560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public Void doInBackground(File... files) { 1570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (files != null) { 1580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project for (File f : files) { 159d6be1758b38d5b066ff10b6af906aa66c63670cdCary Clark if (!f.delete()) { 160d6be1758b38d5b066ff10b6af906aa66c63670cdCary Clark Log.e(LOGTAG, f.getPath() + " was not deleted"); 161d6be1758b38d5b066ff10b6af906aa66c63670cdCary Clark } 1620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return null; 1650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1683bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins /** 1693bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * This layout holds everything you see below the status bar, including the 1703bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * error console, the custom view container, and the webviews. 1713bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins */ 1723bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins private FrameLayout mBrowserFrameLayout; 17381db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins 17422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba @Override 17522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba public void onCreate(Bundle icicle) { 17631a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 1770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, this + " onStart"); 1780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onCreate(icicle); 1800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // test the browser in OpenGL 1810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // requestWindowFeature(Window.FEATURE_OPENGL); 1820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 183d334bf564b72416e77e707d25f8c55cfe1d85709Mike Reed // enable this to test the browser in 32bit 184d334bf564b72416e77e707d25f8c55cfe1d85709Mike Reed if (false) { 185d334bf564b72416e77e707d25f8c55cfe1d85709Mike Reed getWindow().setFormat(PixelFormat.RGBX_8888); 186d334bf564b72416e77e707d25f8c55cfe1d85709Mike Reed BitmapFactory.setDefaultConfig(Bitmap.Config.ARGB_8888); 187d334bf564b72416e77e707d25f8c55cfe1d85709Mike Reed } 188d334bf564b72416e77e707d25f8c55cfe1d85709Mike Reed 1890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL); 1900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mResolver = getContentResolver(); 1920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1930923d69a8ca45222cabd82a80eaa88da9f132e9aGrace Kloba // If this was a web search request, pass it on to the default web 1940923d69a8ca45222cabd82a80eaa88da9f132e9aGrace Kloba // search provider and finish this activity. 1950923d69a8ca45222cabd82a80eaa88da9f132e9aGrace Kloba if (handleWebSearchIntent(getIntent())) { 1960923d69a8ca45222cabd82a80eaa88da9f132e9aGrace Kloba finish(); 1970923d69a8ca45222cabd82a80eaa88da9f132e9aGrace Kloba return; 1980923d69a8ca45222cabd82a80eaa88da9f132e9aGrace Kloba } 1990923d69a8ca45222cabd82a80eaa88da9f132e9aGrace Kloba 2000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSecLockIcon = Resources.getSystem().getDrawable( 2010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project android.R.drawable.ic_secure); 2020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMixLockIcon = Resources.getSystem().getDrawable( 2030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project android.R.drawable.ic_partial_secure); 2040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20581db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins FrameLayout frameLayout = (FrameLayout) getWindow().getDecorView() 20681db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins .findViewById(com.android.internal.R.id.content); 2073bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mBrowserFrameLayout = (FrameLayout) LayoutInflater.from(this) 2083bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins .inflate(R.layout.custom_screen, null); 2093bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mContentView = (FrameLayout) mBrowserFrameLayout.findViewById( 2103bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins R.id.main_content); 2113bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mErrorConsoleContainer = (LinearLayout) mBrowserFrameLayout 2123bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins .findViewById(R.id.error_console); 2133bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mCustomViewContainer = (FrameLayout) mBrowserFrameLayout 2143bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins .findViewById(R.id.fullscreen_custom_content); 2153bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins frameLayout.addView(mBrowserFrameLayout, COVER_SCREEN_PARAMS); 21668579393973f745fc65a2781061af9bb8f2d7020Leon Scroggins mTitleBar = new TitleBar(this); 2171542f74d866056aac0cc5ffc328940a4b8ba626cGrace Kloba // mTitleBar will be always shown in the fully loaded mode 2181542f74d866056aac0cc5ffc328940a4b8ba626cGrace Kloba mTitleBar.setProgress(100); 219fe87bd3a3897e4bad65bb3d284659ae2f4e57570Leon Scroggins mFakeTitleBar = new TitleBar(this); 2200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Create the tab control and our initial tab 2220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl = new TabControl(this); 2230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Open the icon database and retain all the bookmark urls for favicons 2250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project retainIconsOnStartup(); 2260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Keep a settings instance handy. 2280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSettings = BrowserSettings.getInstance(); 2290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSettings.setTabControl(mTabControl); 2300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 2320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Browser"); 2330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2346adacc90222a3293bc631ef88ee5613e23b2d4c0Patrick Scott // Find out if the network is currently up. 2356adacc90222a3293bc631ef88ee5613e23b2d4c0Patrick Scott ConnectivityManager cm = (ConnectivityManager) getSystemService( 2366adacc90222a3293bc631ef88ee5613e23b2d4c0Patrick Scott Context.CONNECTIVITY_SERVICE); 2376adacc90222a3293bc631ef88ee5613e23b2d4c0Patrick Scott NetworkInfo info = cm.getActiveNetworkInfo(); 2386adacc90222a3293bc631ef88ee5613e23b2d4c0Patrick Scott if (info != null) { 2396adacc90222a3293bc631ef88ee5613e23b2d4c0Patrick Scott mIsNetworkUp = info.isAvailable(); 2406adacc90222a3293bc631ef88ee5613e23b2d4c0Patrick Scott } 2416adacc90222a3293bc631ef88ee5613e23b2d4c0Patrick Scott 242a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba /* enables registration for changes in network status from 243a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba http stack */ 244a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba mNetworkStateChangedFilter = new IntentFilter(); 245a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba mNetworkStateChangedFilter.addAction( 246a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba ConnectivityManager.CONNECTIVITY_ACTION); 247a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba mNetworkStateIntentReceiver = new BroadcastReceiver() { 248a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba @Override 249a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba public void onReceive(Context context, Intent intent) { 250a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba if (intent.getAction().equals( 251a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba ConnectivityManager.CONNECTIVITY_ACTION)) { 252e4c98469644d3fa2689cf6658b1999add13c7e0eAndrei Popescu 253e4c98469644d3fa2689cf6658b1999add13c7e0eAndrei Popescu NetworkInfo info = intent.getParcelableExtra( 254e4c98469644d3fa2689cf6658b1999add13c7e0eAndrei Popescu ConnectivityManager.EXTRA_NETWORK_INFO); 255e4c98469644d3fa2689cf6658b1999add13c7e0eAndrei Popescu String typeName = info.getTypeName(); 256e4c98469644d3fa2689cf6658b1999add13c7e0eAndrei Popescu String subtypeName = info.getSubtypeName(); 257e4c98469644d3fa2689cf6658b1999add13c7e0eAndrei Popescu sendNetworkType(typeName.toLowerCase(), 258e4c98469644d3fa2689cf6658b1999add13c7e0eAndrei Popescu (subtypeName != null ? subtypeName.toLowerCase() : "")); 259e4c98469644d3fa2689cf6658b1999add13c7e0eAndrei Popescu 260e4c98469644d3fa2689cf6658b1999add13c7e0eAndrei Popescu onNetworkToggle(info.isAvailable()); 261a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba } 262a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba } 263a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba }; 264a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba 265615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED); 266615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba filter.addAction(Intent.ACTION_PACKAGE_REMOVED); 267615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba filter.addDataScheme("package"); 268615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba mPackageInstallationReceiver = new BroadcastReceiver() { 269615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba @Override 270615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba public void onReceive(Context context, Intent intent) { 271615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba final String action = intent.getAction(); 272615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba final String packageName = intent.getData() 273615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba .getSchemeSpecificPart(); 274615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba final boolean replacing = intent.getBooleanExtra( 275615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba Intent.EXTRA_REPLACING, false); 276615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba if (Intent.ACTION_PACKAGE_REMOVED.equals(action) && replacing) { 277615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba // if it is replacing, refreshPlugins() when adding 278615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba return; 279615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba } 28030995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu 28130995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu if (sGoogleApps.contains(packageName)) { 28230995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu BrowserActivity.this.packageChanged(packageName, 28330995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu Intent.ACTION_PACKAGE_ADDED.equals(action)); 28430995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu } 28530995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu 286615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba PackageManager pm = BrowserActivity.this.getPackageManager(); 287615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba PackageInfo pkgInfo = null; 288615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba try { 289615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba pkgInfo = pm.getPackageInfo(packageName, 290615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba PackageManager.GET_PERMISSIONS); 291615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba } catch (PackageManager.NameNotFoundException e) { 292615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba return; 293615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba } 294615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba if (pkgInfo != null) { 295615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba String permissions[] = pkgInfo.requestedPermissions; 296615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba if (permissions == null) { 297615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba return; 298615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba } 299615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba boolean permissionOk = false; 300615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba for (String permit : permissions) { 301615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba if (PluginManager.PLUGIN_PERMISSION.equals(permit)) { 302615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba permissionOk = true; 303615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba break; 304615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba } 305615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba } 306615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba if (permissionOk) { 307615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba PluginManager.getInstance(BrowserActivity.this) 308615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba .refreshPlugins( 309615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba Intent.ACTION_PACKAGE_ADDED 310615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba .equals(action)); 311615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba } 312615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba } 313615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba } 314615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba }; 315615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba registerReceiver(mPackageInstallationReceiver, filter); 316615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba 3170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!mTabControl.restoreState(icicle)) { 3180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // clear up the thumbnail directory if we can't restore the state as 3190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // none of the files in the directory are referenced any more. 3200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new ClearThumbnails().execute( 3210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.getThumbnailDir().listFiles()); 322aab3f09b5c2d39b19067e57635614080b2403a46Grace Kloba // there is no quit on Android. But if we can't restore the state, 323aab3f09b5c2d39b19067e57635614080b2403a46Grace Kloba // we can treat it as a new Browser, remove the old session cookies. 324aab3f09b5c2d39b19067e57635614080b2403a46Grace Kloba CookieManager.getInstance().removeSessionCookie(); 3250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Intent intent = getIntent(); 3260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Bundle extra = intent.getExtras(); 3270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Create an initial tab. 3280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If the intent is ACTION_VIEW and data is not null, the Browser is 3290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // invoked to view the content by another application. In this case, 3300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the tab will be close when exit. 33125ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima UrlData urlData = getUrlDataFromIntent(intent); 33225ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima 33358d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins String action = intent.getAction(); 33422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba final Tab t = mTabControl.createNewTab( 33558d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins (Intent.ACTION_VIEW.equals(action) && 33658d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins intent.getData() != null) 337a1cc3fdce19a336c251297c61cd83ac6cf767cd1Leon Scroggins || RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS 338a1cc3fdce19a336c251297c61cd83ac6cf767cd1Leon Scroggins .equals(action), 33925ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima intent.getStringExtra(Browser.EXTRA_APPLICATION_ID), urlData.mUrl); 3400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.setCurrentTab(t); 3410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project attachTabToContentView(t); 3420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView webView = t.getWebView(); 3430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (extra != null) { 3440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int scale = extra.getInt(Browser.INITIAL_ZOOM_LEVEL, 0); 3450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (scale > 0 && scale <= 1000) { 3460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project webView.setInitialScale(scale); 3470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35025ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima if (urlData.isEmpty()) { 35198d5fce7c687cfcc956b10d44946d31f39b6dc15Shimeng (Simon) Wang loadUrl(webView, mSettings.getHomePage()); 3520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 3539d53da05812f959745810a33bb4e06b273393c42Patrick Scott loadUrlDataIn(t, urlData); 3540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 3560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // TabControl.restoreState() will create a new tab even if 3571f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // restoring the state fails. 3580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project attachTabToContentView(mTabControl.getCurrentTab()); 3590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 360615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba 361b3c02da4553b1a629b16377970fdabae28394c94Feng Qian // Read JavaScript flags if it exists. 362b3c02da4553b1a629b16377970fdabae28394c94Feng Qian String jsFlags = mSettings.getJsFlags(); 363b3c02da4553b1a629b16377970fdabae28394c94Feng Qian if (jsFlags.trim().length() != 0) { 364b3c02da4553b1a629b16377970fdabae28394c94Feng Qian mTabControl.getCurrentWebView().setJsFlags(jsFlags); 365b3c02da4553b1a629b16377970fdabae28394c94Feng Qian } 36630995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu // Work out which packages are installed on the system. 36730995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu getInstalledPackages(); 368a7611811e0d744a7220b7bf80c8f795af5ea53edBjorn Bringert 369a7611811e0d744a7220b7bf80c8f795af5ea53edBjorn Bringert // Start watching the default geolocation permissions 370a7611811e0d744a7220b7bf80c8f795af5ea53edBjorn Bringert mSystemAllowGeolocationOrigins 371a7611811e0d744a7220b7bf80c8f795af5ea53edBjorn Bringert = new SystemAllowGeolocationOrigins(getApplicationContext()); 372a7611811e0d744a7220b7bf80c8f795af5ea53edBjorn Bringert mSystemAllowGeolocationOrigins.start(); 3730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37558d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins /** 37658d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins * Feed the previously stored results strings to the BrowserProvider so that 37758d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins * the SearchDialog will show them instead of the standard searches. 37858d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins * @param result String to show on the editable line of the SearchDialog. 37958d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins */ 38058d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins /* package */ void showVoiceSearchResults(String result) { 38158d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins ContentProviderClient client = mResolver.acquireContentProviderClient( 38258d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins Browser.BOOKMARKS_URI); 38358d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins ContentProvider prov = client.getLocalContentProvider(); 38458d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins BrowserProvider bp = (BrowserProvider) prov; 38558d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins bp.setQueryResults(mTabControl.getCurrentTab().getVoiceSearchResults()); 38658d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins client.release(); 38758d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins 388fbb3f15f725e890837431f402b43e802045a4f3fLeon Scroggins Bundle bundle = createGoogleSearchSourceBundle( 389fbb3f15f725e890837431f402b43e802045a4f3fLeon Scroggins GOOGLE_SEARCH_SOURCE_SEARCHKEY); 390fbb3f15f725e890837431f402b43e802045a4f3fLeon Scroggins bundle.putBoolean(SearchManager.CONTEXT_IS_VOICE, true); 391fbb3f15f725e890837431f402b43e802045a4f3fLeon Scroggins startSearch(result, false, bundle, false); 39258d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins } 39358d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins 3940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 3950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project protected void onNewIntent(Intent intent) { 39622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Tab current = mTabControl.getCurrentTab(); 3970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // When a tab is closed on exit, the current tab index is set to -1. 3980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Reset before proceed as Browser requires the current tab to be set. 3990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current == null) { 4000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Try to reset the tab in case the index was incorrect. 4010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project current = mTabControl.getTab(0); 4020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current == null) { 4030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // No tabs at all so just ignore this intent. 4040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 4050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 4060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.setCurrentTab(current); 4070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project attachTabToContentView(current); 4080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleAndIcon(current.getWebView()); 4090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 4100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final String action = intent.getAction(); 4110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final int flags = intent.getFlags(); 4120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (Intent.ACTION_MAIN.equals(action) || 4130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (flags & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0) { 4140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // just resume the browser 4150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 4160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 417b8a844da0049965b3cef5739dbab19c7ac766762Leon Scroggins // In case the SearchDialog is open. 418b8a844da0049965b3cef5739dbab19c7ac766762Leon Scroggins ((SearchManager) getSystemService(Context.SEARCH_SERVICE)) 419b8a844da0049965b3cef5739dbab19c7ac766762Leon Scroggins .stopSearch(); 420a1cc3fdce19a336c251297c61cd83ac6cf767cd1Leon Scroggins boolean activateVoiceSearch = RecognizerResultsIntent 421a1cc3fdce19a336c251297c61cd83ac6cf767cd1Leon Scroggins .ACTION_VOICE_SEARCH_RESULTS.equals(action); 4220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (Intent.ACTION_VIEW.equals(action) 4230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || Intent.ACTION_SEARCH.equals(action) 4240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action) 42558d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins || Intent.ACTION_WEB_SEARCH.equals(action) 42658d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins || activateVoiceSearch) { 4273b18ce37c13fce7212948df90a012d7011924a6eLeon Scroggins if (current.isInVoiceSearchMode()) { 4283b18ce37c13fce7212948df90a012d7011924a6eLeon Scroggins String title = current.getVoiceDisplayTitle(); 4293b18ce37c13fce7212948df90a012d7011924a6eLeon Scroggins if (title != null && title.equals(intent.getStringExtra( 4303b18ce37c13fce7212948df90a012d7011924a6eLeon Scroggins SearchManager.QUERY))) { 4313b18ce37c13fce7212948df90a012d7011924a6eLeon Scroggins // The user submitted the same search as the last voice 4323b18ce37c13fce7212948df90a012d7011924a6eLeon Scroggins // search, so do nothing. 4333b18ce37c13fce7212948df90a012d7011924a6eLeon Scroggins return; 4343b18ce37c13fce7212948df90a012d7011924a6eLeon Scroggins } 4351fe13a5230e319df42b21939a14d127bd9bf3856Leon Scroggins if (Intent.ACTION_SEARCH.equals(action) 4361fe13a5230e319df42b21939a14d127bd9bf3856Leon Scroggins && current.voiceSearchSourceIsGoogle()) { 4371fe13a5230e319df42b21939a14d127bd9bf3856Leon Scroggins Intent logIntent = new Intent( 4381fe13a5230e319df42b21939a14d127bd9bf3856Leon Scroggins LoggingEvents.ACTION_LOG_EVENT); 4391fe13a5230e319df42b21939a14d127bd9bf3856Leon Scroggins logIntent.putExtra(LoggingEvents.EXTRA_EVENT, 4401fe13a5230e319df42b21939a14d127bd9bf3856Leon Scroggins LoggingEvents.VoiceSearch.QUERY_UPDATED); 4411fe13a5230e319df42b21939a14d127bd9bf3856Leon Scroggins logIntent.putExtra( 4421fe13a5230e319df42b21939a14d127bd9bf3856Leon Scroggins LoggingEvents.VoiceSearch.EXTRA_QUERY_UPDATED_VALUE, 4431fe13a5230e319df42b21939a14d127bd9bf3856Leon Scroggins intent.getDataString()); 4441fe13a5230e319df42b21939a14d127bd9bf3856Leon Scroggins sendBroadcast(logIntent); 4451fe13a5230e319df42b21939a14d127bd9bf3856Leon Scroggins // Note, onPageStarted will revert the voice title bar 4461fe13a5230e319df42b21939a14d127bd9bf3856Leon Scroggins // When http://b/issue?id=2379215 is fixed, we should update 4471fe13a5230e319df42b21939a14d127bd9bf3856Leon Scroggins // the title bar here. 4481fe13a5230e319df42b21939a14d127bd9bf3856Leon Scroggins } 4493b18ce37c13fce7212948df90a012d7011924a6eLeon Scroggins } 450565505b1a2c1d3099496af5910760087602e994aSatish Sampath // If this was a search request (e.g. search query directly typed into the address bar), 451565505b1a2c1d3099496af5910760087602e994aSatish Sampath // pass it on to the default web search provider. 452565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (handleWebSearchIntent(intent)) { 453565505b1a2c1d3099496af5910760087602e994aSatish Sampath return; 454565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 455565505b1a2c1d3099496af5910760087602e994aSatish Sampath 45625ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima UrlData urlData = getUrlDataFromIntent(intent); 45725ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima if (urlData.isEmpty()) { 45825ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima urlData = new UrlData(mSettings.getHomePage()); 4590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 46025ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima 461cc63403643786905262f505ab5266d8e80b9924cGrace Kloba final String appId = intent 462cc63403643786905262f505ab5266d8e80b9924cGrace Kloba .getStringExtra(Browser.EXTRA_APPLICATION_ID); 46358d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins if ((Intent.ACTION_VIEW.equals(action) || activateVoiceSearch) 464cc63403643786905262f505ab5266d8e80b9924cGrace Kloba && !getPackageName().equals(appId) 465cc63403643786905262f505ab5266d8e80b9924cGrace Kloba && (flags & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { 46622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Tab appTab = mTabControl.getTabFromId(appId); 467f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project if (appTab != null) { 468f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project Log.i(LOGTAG, "Reusing tab for " + appId); 469f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // Dismiss the subwindow if applicable. 470f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project dismissSubWindow(appTab); 471f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // Since we might kill the WebView, remove it from the 472f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // content view first. 473f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project removeTabFromContentView(appTab); 474f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // Recreate the main WebView after destroying the old one. 475f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // If the WebView has the same original url and is on that 476f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // page, it can be reused. 477f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project boolean needsLoad = 4786eac63e78d43d04e31c4d16830c44c4d9df82639Leon Scroggins mTabControl.recreateWebView(appTab, urlData); 479bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 480f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project if (current != appTab) { 4811f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins switchToTab(mTabControl.getTabIndex(appTab)); 4821f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (needsLoad) { 4839d53da05812f959745810a33bb4e06b273393c42Patrick Scott loadUrlDataIn(appTab, urlData); 4841f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 485f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project } else { 4861f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // If the tab was the current tab, we have to attach 4871f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // it to the view system again. 4881f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins attachTabToContentView(appTab); 4891f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (needsLoad) { 4909d53da05812f959745810a33bb4e06b273393c42Patrick Scott loadUrlDataIn(appTab, urlData); 491f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project } 492f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project } 493f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project return; 494cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott } else { 495cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott // No matching application tab, try to find a regular tab 496cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott // with a matching url. 497cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott appTab = mTabControl.findUnusedTabWithUrl(urlData.mUrl); 49825515f8bd458a2471d13d876cfb0e18d8ff2a00fLeon Scroggins if (appTab != null) { 49925515f8bd458a2471d13d876cfb0e18d8ff2a00fLeon Scroggins if (current != appTab) { 50025515f8bd458a2471d13d876cfb0e18d8ff2a00fLeon Scroggins switchToTab(mTabControl.getTabIndex(appTab)); 50125515f8bd458a2471d13d876cfb0e18d8ff2a00fLeon Scroggins } 50225515f8bd458a2471d13d876cfb0e18d8ff2a00fLeon Scroggins // Otherwise, we are already viewing the correct tab. 503cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott } else { 504cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott // if FLAG_ACTIVITY_BROUGHT_TO_FRONT flag is on, the url 505cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott // will be opened in a new tab unless we have reached 506cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott // MAX_TABS. Then the url will be opened in the current 507cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott // tab. If a new tab is created, it will have "true" for 508cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott // exit on close. 5091f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins openTabAndShow(urlData, true, appId); 510cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott } 511f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project } 5120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 513638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba if (!urlData.isEmpty() 514638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba && urlData.mUrl.startsWith("about:debug")) { 515638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba if ("about:debug.dom".equals(urlData.mUrl)) { 516638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba current.getWebView().dumpDomTree(false); 517638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba } else if ("about:debug.dom.file".equals(urlData.mUrl)) { 518638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba current.getWebView().dumpDomTree(true); 519638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba } else if ("about:debug.render".equals(urlData.mUrl)) { 520638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba current.getWebView().dumpRenderTree(false); 521638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba } else if ("about:debug.render.file".equals(urlData.mUrl)) { 522638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba current.getWebView().dumpRenderTree(true); 523638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba } else if ("about:debug.display".equals(urlData.mUrl)) { 524638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba current.getWebView().dumpDisplayTree(); 5259b78e1d1e0bd819ae03df5594d4a56519e5d87c7Mike Reed } else if (urlData.mUrl.startsWith("about:debug.drag")) { 5269b78e1d1e0bd819ae03df5594d4a56519e5d87c7Mike Reed int index = urlData.mUrl.codePointAt(16) - '0'; 5279b78e1d1e0bd819ae03df5594d4a56519e5d87c7Mike Reed if (index <= 0 || index > 9) { 5289b78e1d1e0bd819ae03df5594d4a56519e5d87c7Mike Reed current.getWebView().setDragTracker(null); 5299b78e1d1e0bd819ae03df5594d4a56519e5d87c7Mike Reed } else { 5309b78e1d1e0bd819ae03df5594d4a56519e5d87c7Mike Reed current.getWebView().setDragTracker(new MeshTracker(index)); 5319b78e1d1e0bd819ae03df5594d4a56519e5d87c7Mike Reed } 532638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba } else { 533638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba mSettings.toggleDebugSettings(); 534638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba } 5350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 5360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5371f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // Get rid of the subwindow if it exists 5381f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins dismissSubWindow(current); 5399d53da05812f959745810a33bb4e06b273393c42Patrick Scott loadUrlDataIn(current, urlData); 5400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 544565505b1a2c1d3099496af5910760087602e994aSatish Sampath private int parseUrlShortcut(String url) { 545565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (url == null) return SHORTCUT_INVALID; 546565505b1a2c1d3099496af5910760087602e994aSatish Sampath 547565505b1a2c1d3099496af5910760087602e994aSatish Sampath // FIXME: quick search, need to be customized by setting 548565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (url.length() > 2 && url.charAt(1) == ' ') { 549565505b1a2c1d3099496af5910760087602e994aSatish Sampath switch (url.charAt(0)) { 550565505b1a2c1d3099496af5910760087602e994aSatish Sampath case 'g': return SHORTCUT_GOOGLE_SEARCH; 551565505b1a2c1d3099496af5910760087602e994aSatish Sampath case 'w': return SHORTCUT_WIKIPEDIA_SEARCH; 552565505b1a2c1d3099496af5910760087602e994aSatish Sampath case 'd': return SHORTCUT_DICTIONARY_SEARCH; 553565505b1a2c1d3099496af5910760087602e994aSatish Sampath case 'l': return SHORTCUT_GOOGLE_MOBILE_LOCAL_SEARCH; 554565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 555565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 556565505b1a2c1d3099496af5910760087602e994aSatish Sampath return SHORTCUT_INVALID; 557565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 558565505b1a2c1d3099496af5910760087602e994aSatish Sampath 559565505b1a2c1d3099496af5910760087602e994aSatish Sampath /** 560565505b1a2c1d3099496af5910760087602e994aSatish Sampath * Launches the default web search activity with the query parameters if the given intent's data 561565505b1a2c1d3099496af5910760087602e994aSatish Sampath * are identified as plain search terms and not URLs/shortcuts. 562565505b1a2c1d3099496af5910760087602e994aSatish Sampath * @return true if the intent was handled and web search activity was launched, false if not. 563565505b1a2c1d3099496af5910760087602e994aSatish Sampath */ 564565505b1a2c1d3099496af5910760087602e994aSatish Sampath private boolean handleWebSearchIntent(Intent intent) { 565565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (intent == null) return false; 566565505b1a2c1d3099496af5910760087602e994aSatish Sampath 567565505b1a2c1d3099496af5910760087602e994aSatish Sampath String url = null; 568565505b1a2c1d3099496af5910760087602e994aSatish Sampath final String action = intent.getAction(); 569a1cc3fdce19a336c251297c61cd83ac6cf767cd1Leon Scroggins if (RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS.equals( 570a1cc3fdce19a336c251297c61cd83ac6cf767cd1Leon Scroggins action)) { 57158d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins return false; 57258d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins } 573565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (Intent.ACTION_VIEW.equals(action)) { 5741e70505659dd9bf0f7e03bce787ba880f9b7a8aaGrace Kloba Uri data = intent.getData(); 5751e70505659dd9bf0f7e03bce787ba880f9b7a8aaGrace Kloba if (data != null) url = data.toString(); 576565505b1a2c1d3099496af5910760087602e994aSatish Sampath } else if (Intent.ACTION_SEARCH.equals(action) 577565505b1a2c1d3099496af5910760087602e994aSatish Sampath || MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action) 578565505b1a2c1d3099496af5910760087602e994aSatish Sampath || Intent.ACTION_WEB_SEARCH.equals(action)) { 579565505b1a2c1d3099496af5910760087602e994aSatish Sampath url = intent.getStringExtra(SearchManager.QUERY); 580565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 5810485170e03e079eb61b9dd52fc2c98da02fa7b2cBjorn Bringert return handleWebSearchRequest(url, intent.getBundleExtra(SearchManager.APP_DATA), 5820485170e03e079eb61b9dd52fc2c98da02fa7b2cBjorn Bringert intent.getStringExtra(SearchManager.EXTRA_DATA_KEY)); 583565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 584565505b1a2c1d3099496af5910760087602e994aSatish Sampath 585565505b1a2c1d3099496af5910760087602e994aSatish Sampath /** 586565505b1a2c1d3099496af5910760087602e994aSatish Sampath * Launches the default web search activity with the query parameters if the given url string 587565505b1a2c1d3099496af5910760087602e994aSatish Sampath * was identified as plain search terms and not URL/shortcut. 588565505b1a2c1d3099496af5910760087602e994aSatish Sampath * @return true if the request was handled and web search activity was launched, false if not. 589565505b1a2c1d3099496af5910760087602e994aSatish Sampath */ 5900485170e03e079eb61b9dd52fc2c98da02fa7b2cBjorn Bringert private boolean handleWebSearchRequest(String inUrl, Bundle appData, String extraData) { 591565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (inUrl == null) return false; 592565505b1a2c1d3099496af5910760087602e994aSatish Sampath 593565505b1a2c1d3099496af5910760087602e994aSatish Sampath // In general, we shouldn't modify URL from Intent. 594565505b1a2c1d3099496af5910760087602e994aSatish Sampath // But currently, we get the user-typed URL from search box as well. 595565505b1a2c1d3099496af5910760087602e994aSatish Sampath String url = fixUrl(inUrl).trim(); 596565505b1a2c1d3099496af5910760087602e994aSatish Sampath 597565505b1a2c1d3099496af5910760087602e994aSatish Sampath // URLs and site specific search shortcuts are handled by the regular flow of control, so 598565505b1a2c1d3099496af5910760087602e994aSatish Sampath // return early. 5995ee906c089567bca705e18561357510d7b55cb5aDan Egnor if (Patterns.WEB_URL.matcher(url).matches() 600bc5b9f358a2b75bf3a104b9f5cd477ad2f6f740fSatish Sampath || ACCEPTED_URI_SCHEMA.matcher(url).matches() 601565505b1a2c1d3099496af5910760087602e994aSatish Sampath || parseUrlShortcut(url) != SHORTCUT_INVALID) { 602565505b1a2c1d3099496af5910760087602e994aSatish Sampath return false; 603565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 604565505b1a2c1d3099496af5910760087602e994aSatish Sampath 6058d06e36fe80f516e04ad33ff8b446720e36cabfdLeon Scroggins final ContentResolver cr = mResolver; 6068d06e36fe80f516e04ad33ff8b446720e36cabfdLeon Scroggins final String newUrl = url; 6078d06e36fe80f516e04ad33ff8b446720e36cabfdLeon Scroggins new AsyncTask<Void, Void, Void>() { 6088d06e36fe80f516e04ad33ff8b446720e36cabfdLeon Scroggins protected Void doInBackground(Void... unused) { 6098d06e36fe80f516e04ad33ff8b446720e36cabfdLeon Scroggins Browser.updateVisitedHistory(cr, newUrl, false); 6108d06e36fe80f516e04ad33ff8b446720e36cabfdLeon Scroggins Browser.addSearchUrl(cr, newUrl); 6118d06e36fe80f516e04ad33ff8b446720e36cabfdLeon Scroggins return null; 6128d06e36fe80f516e04ad33ff8b446720e36cabfdLeon Scroggins } 6138d06e36fe80f516e04ad33ff8b446720e36cabfdLeon Scroggins }.execute(); 614565505b1a2c1d3099496af5910760087602e994aSatish Sampath 615565505b1a2c1d3099496af5910760087602e994aSatish Sampath Intent intent = new Intent(Intent.ACTION_WEB_SEARCH); 616565505b1a2c1d3099496af5910760087602e994aSatish Sampath intent.addCategory(Intent.CATEGORY_DEFAULT); 617565505b1a2c1d3099496af5910760087602e994aSatish Sampath intent.putExtra(SearchManager.QUERY, url); 61815e9f2dc92cf1621f95071b3c740f46079aa0f3bSatish Sampath if (appData != null) { 61915e9f2dc92cf1621f95071b3c740f46079aa0f3bSatish Sampath intent.putExtra(SearchManager.APP_DATA, appData); 62015e9f2dc92cf1621f95071b3c740f46079aa0f3bSatish Sampath } 6210485170e03e079eb61b9dd52fc2c98da02fa7b2cBjorn Bringert if (extraData != null) { 6220485170e03e079eb61b9dd52fc2c98da02fa7b2cBjorn Bringert intent.putExtra(SearchManager.EXTRA_DATA_KEY, extraData); 6230485170e03e079eb61b9dd52fc2c98da02fa7b2cBjorn Bringert } 624cc63403643786905262f505ab5266d8e80b9924cGrace Kloba intent.putExtra(Browser.EXTRA_APPLICATION_ID, getPackageName()); 625565505b1a2c1d3099496af5910760087602e994aSatish Sampath startActivity(intent); 626565505b1a2c1d3099496af5910760087602e994aSatish Sampath 627565505b1a2c1d3099496af5910760087602e994aSatish Sampath return true; 628565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 629565505b1a2c1d3099496af5910760087602e994aSatish Sampath 63025ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima private UrlData getUrlDataFromIntent(Intent intent) { 63158d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins String url = ""; 632068e48b469f5abca53ee3da38f933cf2c25c93b8Grace Kloba Map<String, String> headers = null; 6330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (intent != null) { 6340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final String action = intent.getAction(); 6350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (Intent.ACTION_VIEW.equals(action)) { 6360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = smartUrlFilter(intent.getData()); 6370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null && url.startsWith("content:")) { 6380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* Append mimetype so webview knows how to display */ 6390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String mimeType = intent.resolveType(getContentResolver()); 6400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mimeType != null) { 6410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url += "?" + mimeType; 6420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 6430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 644068e48b469f5abca53ee3da38f933cf2c25c93b8Grace Kloba if (url != null && url.startsWith("http")) { 64500f54c589fd38431efd42ea2a551a49e64d595d5Grace Kloba final Bundle pairs = intent 64600f54c589fd38431efd42ea2a551a49e64d595d5Grace Kloba .getBundleExtra(Browser.EXTRA_HEADERS); 6472d508edbf54ea74cd4e89be8b622b1cbd587464aGrace Kloba if (pairs != null && !pairs.isEmpty()) { 64800f54c589fd38431efd42ea2a551a49e64d595d5Grace Kloba Iterator<String> iter = pairs.keySet().iterator(); 649068e48b469f5abca53ee3da38f933cf2c25c93b8Grace Kloba headers = new HashMap<String, String>(); 65000f54c589fd38431efd42ea2a551a49e64d595d5Grace Kloba while (iter.hasNext()) { 65100f54c589fd38431efd42ea2a551a49e64d595d5Grace Kloba String key = iter.next(); 65200f54c589fd38431efd42ea2a551a49e64d595d5Grace Kloba headers.put(key, pairs.getString(key)); 653068e48b469f5abca53ee3da38f933cf2c25c93b8Grace Kloba } 654068e48b469f5abca53ee3da38f933cf2c25c93b8Grace Kloba } 65525ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima } 6560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (Intent.ACTION_SEARCH.equals(action) 6570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action) 6580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || Intent.ACTION_WEB_SEARCH.equals(action)) { 6590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = intent.getStringExtra(SearchManager.QUERY); 6600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null) { 6610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mLastEnteredUrl = url; 6620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // In general, we shouldn't modify URL from Intent. 6630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // But currently, we get the user-typed URL from search box as well. 6640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = fixUrl(url); 6650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = smartUrlFilter(url); 6668d06e36fe80f516e04ad33ff8b446720e36cabfdLeon Scroggins final ContentResolver cr = mResolver; 6678d06e36fe80f516e04ad33ff8b446720e36cabfdLeon Scroggins final String newUrl = url; 6688d06e36fe80f516e04ad33ff8b446720e36cabfdLeon Scroggins new AsyncTask<Void, Void, Void>() { 6698d06e36fe80f516e04ad33ff8b446720e36cabfdLeon Scroggins protected Void doInBackground(Void... unused) { 6708d06e36fe80f516e04ad33ff8b446720e36cabfdLeon Scroggins Browser.updateVisitedHistory(cr, newUrl, false); 6718d06e36fe80f516e04ad33ff8b446720e36cabfdLeon Scroggins return null; 6728d06e36fe80f516e04ad33ff8b446720e36cabfdLeon Scroggins } 6738d06e36fe80f516e04ad33ff8b446720e36cabfdLeon Scroggins }.execute(); 6740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String searchSource = "&source=android-" + GOOGLE_SEARCH_SOURCE_SUGGEST + "&"; 6750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url.contains(searchSource)) { 6760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String source = null; 6770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Bundle appData = intent.getBundleExtra(SearchManager.APP_DATA); 6780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (appData != null) { 67910d1cca0c208d1f9db23893a8515685e04cfe224Bjorn Bringert source = appData.getString(Search.SOURCE); 6800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 6810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (TextUtils.isEmpty(source)) { 6820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project source = GOOGLE_SEARCH_SOURCE_UNKNOWN; 6830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 6840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = url.replace(searchSource, "&source=android-"+source+"&"); 6850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 6860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 6870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 6880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 68958d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins return new UrlData(url, headers, intent); 6900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 69158d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins /* package */ void showVoiceTitleBar(String title) { 69258d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins mTitleBar.setInVoiceMode(true); 69358d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins mFakeTitleBar.setInVoiceMode(true); 6940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 69558d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins mTitleBar.setDisplayTitle(title); 69658d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins mFakeTitleBar.setDisplayTitle(title); 69758d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins } 69858d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins /* package */ void revertVoiceTitleBar() { 69958d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins mTitleBar.setInVoiceMode(false); 70058d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins mFakeTitleBar.setInVoiceMode(false); 70158d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins 702003a5ddf3a7ff1b30bfd82cddc8da49cb9fedf15Leon Scroggins mTitleBar.setDisplayTitle(mUrl); 703003a5ddf3a7ff1b30bfd82cddc8da49cb9fedf15Leon Scroggins mFakeTitleBar.setDisplayTitle(mUrl); 70458d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins } 7050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ static String fixUrl(String inUrl) { 706652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark // FIXME: Converting the url to lower case 707652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark // duplicates functionality in smartUrlFilter(). 708652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark // However, changing all current callers of fixUrl to 709652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark // call smartUrlFilter in addition may have unwanted 710652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark // consequences, and is deferred for now. 711652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark int colon = inUrl.indexOf(':'); 712652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark boolean allLower = true; 713652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark for (int index = 0; index < colon; index++) { 714652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark char ch = inUrl.charAt(index); 715652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark if (!Character.isLetter(ch)) { 716652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark break; 717652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark } 718652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark allLower &= Character.isLowerCase(ch); 719652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark if (index == colon - 1 && !allLower) { 720652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark inUrl = inUrl.substring(0, colon).toLowerCase() 721652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark + inUrl.substring(colon); 722652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark } 723652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark } 7240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (inUrl.startsWith("http://") || inUrl.startsWith("https://")) 7250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return inUrl; 7260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (inUrl.startsWith("http:") || 7270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inUrl.startsWith("https:")) { 7280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (inUrl.startsWith("http:/") || inUrl.startsWith("https:/")) { 7290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inUrl = inUrl.replaceFirst("/", "//"); 7300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else inUrl = inUrl.replaceFirst(":", "://"); 7310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return inUrl; 7330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 73522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba @Override 73622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba protected void onResume() { 7370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onResume(); 73831a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 7390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, "BrowserActivity.onResume: this=" + this); 7400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 7420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!mActivityInPause) { 7430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(LOGTAG, "BrowserActivity is already resumed."); 7440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 7450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 7477bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed mTabControl.resumeCurrentTab(); 7480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mActivityInPause = false; 7497bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed resumeWebViewTimers(); 7500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 7510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mWakeLock.isHeld()) { 7520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.removeMessages(RELEASE_WAKELOCK); 7530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWakeLock.release(); 7540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 7560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project registerReceiver(mNetworkStateIntentReceiver, 7570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mNetworkStateChangedFilter); 7580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView.enablePlatformNotifications(); 7590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 7613bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins /** 7623bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * Since the actual title bar is embedded in the WebView, and removing it 763fe87bd3a3897e4bad65bb3d284659ae2f4e57570Leon Scroggins * would change its appearance, use a different TitleBar to show overlayed 764fe87bd3a3897e4bad65bb3d284659ae2f4e57570Leon Scroggins * at the top of the screen, when the menu is open or the page is loading. 7653bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins */ 7663bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins private TitleBar mFakeTitleBar; 7673bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins 7683bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins /** 7693bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * Keeps track of whether the options menu is open. This is important in 7703bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * determining whether to show or hide the title bar overlay. 7713bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins */ 7723bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins private boolean mOptionsMenuOpen; 7733bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins 7743bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins /** 7753bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * Only meaningful when mOptionsMenuOpen is true. This variable keeps track 7763bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * of whether the configuration has changed. The first onMenuOpened call 7773bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * after a configuration change is simply a reopening of the same menu 7783bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * (i.e. mIconView did not change). 7793bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins */ 7803bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins private boolean mConfigChanged; 7813bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins 7823bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins /** 7833bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * Whether or not the options menu is in its smaller, icon menu form. When 7843bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * true, we want the title bar overlay to be up. When false, we do not. 7853bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * Only meaningful if mOptionsMenuOpen is true. 7863bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins */ 7873bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins private boolean mIconView; 7883bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins 789a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins @Override 790a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins public boolean onMenuOpened(int featureId, Menu menu) { 7913bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins if (Window.FEATURE_OPTIONS_PANEL == featureId) { 7923bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins if (mOptionsMenuOpen) { 7933bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins if (mConfigChanged) { 7943bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // We do not need to make any changes to the state of the 7953bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // title bar, since the only thing that happened was a 7963bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // change in orientation 7973bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mConfigChanged = false; 7983bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } else { 7993bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins if (mIconView) { 8003bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // Switching the menu to expanded view, so hide the 8013bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // title bar. 8023bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins hideFakeTitleBar(); 8033bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mIconView = false; 8043bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } else { 8053bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // Switching the menu back to icon view, so show the 8063bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // title bar once again. 8073bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins showFakeTitleBar(); 8083bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mIconView = true; 8093bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } 8103bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } 8113bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } else { 8123bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // The options menu is closed, so open it, and show the title 8133bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins showFakeTitleBar(); 8143bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mOptionsMenuOpen = true; 8153bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mConfigChanged = false; 8163bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mIconView = true; 8173bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } 8183bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } 819a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins return true; 820a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins } 821a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins 8223bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins private void showFakeTitleBar() { 823fe87bd3a3897e4bad65bb3d284659ae2f4e57570Leon Scroggins if (mFakeTitleBar.getParent() == null && mActiveTabsPage == null 824847c25b877f1c912fe54ba7d3890df7ed3798e47Grace Kloba && !mActivityInPause) { 825847c25b877f1c912fe54ba7d3890df7ed3798e47Grace Kloba WebView mainView = mTabControl.getCurrentWebView(); 826847c25b877f1c912fe54ba7d3890df7ed3798e47Grace Kloba // if there is no current WebView, don't show the faked title bar; 82765190702c53f2d3ceb8e3c88d707bd6ff874034cGrace Kloba if (mainView == null) { 828a04645545690d9f637ccae4d043a5a1b8478a832Cary Clark return; 829a04645545690d9f637ccae4d043a5a1b8478a832Cary Clark } 8303bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins 8313bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins WindowManager manager 8323bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins = (WindowManager) getSystemService(Context.WINDOW_SERVICE); 8333bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins 8343bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // Add the title bar to the window manager so it can receive touches 8353bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // while the menu is up 8363bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins WindowManager.LayoutParams params 8373bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins = new WindowManager.LayoutParams( 83815b8ec6b226f4d57307716e1f495e10a91f8cbf4Romain Guy ViewGroup.LayoutParams.MATCH_PARENT, 8393bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins ViewGroup.LayoutParams.WRAP_CONTENT, 840847c25b877f1c912fe54ba7d3890df7ed3798e47Grace Kloba WindowManager.LayoutParams.TYPE_APPLICATION, 8413bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 842685498685d8424f48d77d26d8d5790da34645f44Leon Scroggins PixelFormat.TRANSLUCENT); 8433bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins params.gravity = Gravity.TOP; 844847c25b877f1c912fe54ba7d3890df7ed3798e47Grace Kloba boolean atTop = mainView.getScrollY() == 0; 84583932c74ba031eb2f581f1557c1a90f4b5bbb423Leon Scroggins params.windowAnimations = atTop ? 0 : R.style.TitleBar; 84613f9aced9c949d452a5cb44ffc55c82f97871c89Grace Kloba manager.addView(mFakeTitleBar, params); 8473bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } 8483bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } 8493bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins 8503bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins @Override 8513bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins public void onOptionsMenuClosed(Menu menu) { 8523bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mOptionsMenuOpen = false; 853a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins if (!mInLoad) { 854a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins hideFakeTitleBar(); 855a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins } else if (!mIconView) { 856a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins // The page is currently loading, and we are in expanded mode, so 857a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins // we were not showing the menu. Show it once again. It will be 858a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins // removed when the page finishes. 859a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins showFakeTitleBar(); 860a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins } 8613bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } 86222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba 8633bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins private void hideFakeTitleBar() { 864fe87bd3a3897e4bad65bb3d284659ae2f4e57570Leon Scroggins if (mFakeTitleBar.getParent() == null) return; 86520329570ba9409637298da90b83f25801d7a3d55Leon Scroggins WindowManager.LayoutParams params = (WindowManager.LayoutParams) 86613f9aced9c949d452a5cb44ffc55c82f97871c89Grace Kloba mFakeTitleBar.getLayoutParams(); 86720329570ba9409637298da90b83f25801d7a3d55Leon Scroggins WebView mainView = mTabControl.getCurrentWebView(); 86820329570ba9409637298da90b83f25801d7a3d55Leon Scroggins // Although we decided whether or not to animate based on the current 86920329570ba9409637298da90b83f25801d7a3d55Leon Scroggins // scroll position, the scroll position may have changed since the 87020329570ba9409637298da90b83f25801d7a3d55Leon Scroggins // fake title bar was displayed. Make sure it has the appropriate 87120329570ba9409637298da90b83f25801d7a3d55Leon Scroggins // animation/lack thereof before removing. 87220329570ba9409637298da90b83f25801d7a3d55Leon Scroggins params.windowAnimations = mainView != null && mainView.getScrollY() == 0 87383932c74ba031eb2f581f1557c1a90f4b5bbb423Leon Scroggins ? 0 : R.style.TitleBar; 8743bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins WindowManager manager 8753bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins = (WindowManager) getSystemService(Context.WINDOW_SERVICE); 87613f9aced9c949d452a5cb44ffc55c82f97871c89Grace Kloba manager.updateViewLayout(mFakeTitleBar, params); 87713f9aced9c949d452a5cb44ffc55c82f97871c89Grace Kloba manager.removeView(mFakeTitleBar); 8783bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } 8793bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins 8800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 881c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins * Special method for the fake title bar to call when displaying its context 882c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins * menu, since it is in its own Window, and its parent does not show a 883c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins * context menu. 884c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins */ 885c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins /* package */ void showTitleBarContextMenu() { 88665f4a3ce9e5c4a5227bbcbb995e5e15f1f85d3d7Cary Clark if (null == mTitleBar.getParent()) { 88765f4a3ce9e5c4a5227bbcbb995e5e15f1f85d3d7Cary Clark return; 88865f4a3ce9e5c4a5227bbcbb995e5e15f1f85d3d7Cary Clark } 889c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins openContextMenu(mTitleBar); 890c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins } 891c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins 892b2b19f501ee05448ca81bddaaca70e9b2f51cb54Leon Scroggins @Override 893b2b19f501ee05448ca81bddaaca70e9b2f51cb54Leon Scroggins public void onContextMenuClosed(Menu menu) { 894b2b19f501ee05448ca81bddaaca70e9b2f51cb54Leon Scroggins super.onContextMenuClosed(menu); 895b2b19f501ee05448ca81bddaaca70e9b2f51cb54Leon Scroggins if (mInLoad) { 896b2b19f501ee05448ca81bddaaca70e9b2f51cb54Leon Scroggins showFakeTitleBar(); 897b2b19f501ee05448ca81bddaaca70e9b2f51cb54Leon Scroggins } 898b2b19f501ee05448ca81bddaaca70e9b2f51cb54Leon Scroggins } 899b2b19f501ee05448ca81bddaaca70e9b2f51cb54Leon Scroggins 900c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins /** 9010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * onSaveInstanceState(Bundle map) 9020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * onSaveInstanceState is called right before onStop(). The map contains 9030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * the saved state. 9040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 90522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba @Override 90622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba protected void onSaveInstanceState(Bundle outState) { 90731a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 9080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, "BrowserActivity.onSaveInstanceState: this=" + this); 9090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the default implementation requires each view to have an id. As the 9110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // browser handles the state itself and it doesn't use id for the views, 9120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // don't call the default implementation. Otherwise it will trigger the 9130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // warning like this, "couldn't save which view has focus because the 9140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // focused view XXX has no id". 9150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 9160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Save all the tabs 9170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.saveState(outState); 9180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 92022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba @Override 92122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba protected void onPause() { 9220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onPause(); 9230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 9240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mActivityInPause) { 9250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(LOGTAG, "BrowserActivity is already paused."); 9260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 9270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 9297bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed mTabControl.pauseCurrentTab(); 9300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mActivityInPause = true; 9317bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed if (mTabControl.getCurrentIndex() >= 0 && !pauseWebViewTimers()) { 9320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWakeLock.acquire(); 9330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.sendMessageDelayed(mHandler 9340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .obtainMessage(RELEASE_WAKELOCK), WAKELOCK_TIMEOUT); 9350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 937a2ab6a7dc0f7023c1d7ebb1cbad397c5dc3d6453Leon Scroggins // FIXME: This removes the active tabs page and resets the menu to 938a2ab6a7dc0f7023c1d7ebb1cbad397c5dc3d6453Leon Scroggins // MAIN_MENU. A better solution might be to do this work in onNewIntent 939a2ab6a7dc0f7023c1d7ebb1cbad397c5dc3d6453Leon Scroggins // but then we would need to save it in onSaveInstanceState and restore 940a2ab6a7dc0f7023c1d7ebb1cbad397c5dc3d6453Leon Scroggins // it in onCreate/onRestoreInstanceState 941a2ab6a7dc0f7023c1d7ebb1cbad397c5dc3d6453Leon Scroggins if (mActiveTabsPage != null) { 942a2ab6a7dc0f7023c1d7ebb1cbad397c5dc3d6453Leon Scroggins removeActiveTabPage(true); 943a2ab6a7dc0f7023c1d7ebb1cbad397c5dc3d6453Leon Scroggins } 944a2ab6a7dc0f7023c1d7ebb1cbad397c5dc3d6453Leon Scroggins 9450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project cancelStopToast(); 9460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 9470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // unregister network state listener 9480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project unregisterReceiver(mNetworkStateIntentReceiver); 9490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView.disablePlatformNotifications(); 9500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 95222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba @Override 95322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba protected void onDestroy() { 95431a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 9550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, "BrowserActivity.onDestroy: this=" + this); 9560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onDestroy(); 9580923d69a8ca45222cabd82a80eaa88da9f132e9aGrace Kloba 9598d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins if (mUploadMessage != null) { 9608d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins mUploadMessage.onReceiveValue(null); 9618d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins mUploadMessage = null; 9628d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins } 9638d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins 9640923d69a8ca45222cabd82a80eaa88da9f132e9aGrace Kloba if (mTabControl == null) return; 9650923d69a8ca45222cabd82a80eaa88da9f132e9aGrace Kloba 9661fc98a322e9df6b0e797c26de6b2cb23d69ad5d3Grace Kloba // Remove the fake title bar if it is there 9671fc98a322e9df6b0e797c26de6b2cb23d69ad5d3Grace Kloba hideFakeTitleBar(); 9681fc98a322e9df6b0e797c26de6b2cb23d69ad5d3Grace Kloba 9690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Remove the current tab and sub window 97022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Tab t = mTabControl.getCurrentTab(); 971fb5e77fac7b8b311fe72827183f8988f5ee92a5fPatrick Scott if (t != null) { 972fb5e77fac7b8b311fe72827183f8988f5ee92a5fPatrick Scott dismissSubWindow(t); 973fb5e77fac7b8b311fe72827183f8988f5ee92a5fPatrick Scott removeTabFromContentView(t); 974fb5e77fac7b8b311fe72827183f8988f5ee92a5fPatrick Scott } 9750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Destroy all the tabs 9760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.destroy(); 9770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebIconDatabase.getInstance().close(); 9780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 979b4da0ad0351996f639b50f9f29b123a9b5c24fd0Grace Kloba unregisterReceiver(mPackageInstallationReceiver); 980a7611811e0d744a7220b7bf80c8f795af5ea53edBjorn Bringert 981a7611811e0d744a7220b7bf80c8f795af5ea53edBjorn Bringert // Stop watching the default geolocation permissions 982a7611811e0d744a7220b7bf80c8f795af5ea53edBjorn Bringert mSystemAllowGeolocationOrigins.stop(); 983a7611811e0d744a7220b7bf80c8f795af5ea53edBjorn Bringert mSystemAllowGeolocationOrigins = null; 9840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 9860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 9870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onConfigurationChanged(Configuration newConfig) { 9883bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mConfigChanged = true; 9890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onConfigurationChanged(newConfig); 9900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 9910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mPageInfoDialog != null) { 9920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoDialog.dismiss(); 9930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showPageInfo( 9940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoView, 995c7b92f811dfa3572578ddc6714c98a03936d9ce5Leon Scroggins mPageInfoFromShowSSLCertificateOnError); 9960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mSSLCertificateDialog != null) { 9980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateDialog.dismiss(); 9990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificate( 10000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateView); 10010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mSSLCertificateOnErrorDialog != null) { 10030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorDialog.dismiss(); 10040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificateOnError( 10050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView, 10060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler, 10070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError); 10080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mHttpAuthenticationDialog != null) { 10100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String title = ((TextView) mHttpAuthenticationDialog 10110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .findViewById(com.android.internal.R.id.alertTitle)).getText() 10120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .toString(); 10130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String name = ((TextView) mHttpAuthenticationDialog 10140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .findViewById(R.id.username_edit)).getText().toString(); 10150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String password = ((TextView) mHttpAuthenticationDialog 10160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .findViewById(R.id.password_edit)).getText().toString(); 10170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int focusId = mHttpAuthenticationDialog.getCurrentFocus() 10180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .getId(); 10190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthenticationDialog.dismiss(); 10200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showHttpAuthentication(mHttpAuthHandler, null, null, title, 10210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project name, password, focusId); 10220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 102522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba @Override 102622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba public void onLowMemory() { 10270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onLowMemory(); 10280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.freeMemory(); 10290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1031ff4d92ca529f8b77db67d0aea5d9988d5e390211Cary Clark private void resumeWebViewTimers() { 103222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Tab tab = mTabControl.getCurrentTab(); 1033ff4d92ca529f8b77db67d0aea5d9988d5e390211Cary Clark if (tab == null) return; // monkey can trigger this 103422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba boolean inLoad = tab.inLoad(); 103522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if ((!mActivityInPause && !inLoad) || (mActivityInPause && inLoad)) { 10360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project CookieSyncManager.getInstance().startSync(); 103722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba WebView w = tab.getWebView(); 10380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 10390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.resumeTimers(); 10400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10447bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed private boolean pauseWebViewTimers() { 104522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Tab tab = mTabControl.getCurrentTab(); 104622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba boolean inLoad = tab.inLoad(); 104722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (mActivityInPause && !inLoad) { 10480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project CookieSyncManager.getInstance().stopSync(); 10490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = mTabControl.getCurrentWebView(); 10500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 10510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.pauseTimers(); 10520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 10540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 10550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 10560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Open the icon database and retain all the icons for visited sites. 10600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void retainIconsOnStartup() { 10610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebIconDatabase db = WebIconDatabase.getInstance(); 10620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project db.open(getDir("icons", 0).getPath()); 10632c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins Cursor c = null; 10640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 10652c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins c = Browser.getAllBookmarks(mResolver); 10662c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins if (c.moveToFirst()) { 10672c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins int urlIndex = c.getColumnIndex(Browser.BookmarkColumns.URL); 10682c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins do { 10692c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins String url = c.getString(urlIndex); 10702c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins db.retainIconForPageUrl(url); 10712c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins } while (c.moveToNext()); 10720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (IllegalStateException e) { 10740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(LOGTAG, "retainIconsOnStartup", e); 10752c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins } finally { 10762c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins if (c!= null) c.close(); 10770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Helper method for getting the top window. 10810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView getTopWindow() { 10820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return mTabControl.getCurrentTopWebView(); 10830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 108522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba TabControl getTabControl() { 108622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba return mTabControl; 108722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 108822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba 10890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 10900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onCreateOptionsMenu(Menu menu) { 10910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onCreateOptionsMenu(menu); 10920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project MenuInflater inflater = getMenuInflater(); 10940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inflater.inflate(R.menu.browser, menu); 10950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenu = menu; 10960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project updateInLoadMenuItems(); 10970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 10980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 11010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * As the menu can be open when loading state changes 11020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * we must manually update the state of the stop/reload menu 11030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * item 11040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 11050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void updateInLoadMenuItems() { 11060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mMenu == null) { 11070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 11080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project MenuItem src = mInLoad ? 11100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenu.findItem(R.id.stop_menu_id): 11110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenu.findItem(R.id.reload_menu_id); 11120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project MenuItem dest = mMenu.findItem(R.id.stop_reload_menu_id); 11130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dest.setIcon(src.getIcon()); 11140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dest.setTitle(src.getTitle()); 11150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 11180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onContextItemSelected(MenuItem item) { 11190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // chording is not an issue with context menus, but we use the same 11200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // options selector, so set mCanChord to true so we can access them. 11210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCanChord = true; 11220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int id = item.getItemId(); 112396afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins boolean result = true; 11240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (id) { 1125c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins // For the context menu from the title bar 1126c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins case R.id.title_bar_copy_page_url: 112796afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins Tab currentTab = mTabControl.getCurrentTab(); 112896afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins if (null == currentTab) { 112996afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins result = false; 113096afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins break; 1131c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins } 113296afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins WebView mainView = currentTab.getWebView(); 113396afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins if (null == mainView) { 113496afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins result = false; 113596afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins break; 1136c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins } 113796afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins copy(mainView.getUrl()); 1138c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins break; 11390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // -- Browser context menu 11400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.open_context_menu_id: 11410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.open_newtab_context_menu_id: 11420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.bookmark_context_menu_id: 11430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.save_link_context_menu_id: 11440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.share_link_context_menu_id: 11450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.copy_link_context_menu_id: 1146c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins final WebView webView = getTopWindow(); 1147c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins if (null == webView) { 114896afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins result = false; 114996afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins break; 1150c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins } 1151c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins final HashMap hrefMap = new HashMap(); 1152c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins hrefMap.put("webview", webView); 1153c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins final Message msg = mHandler.obtainMessage( 1154c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins FOCUS_NODE_HREF, id, 0, hrefMap); 11550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project webView.requestFocusNodeHref(msg); 11560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 11570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project default: 11590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // For other context menus 116096afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins result = onOptionsItemSelected(item); 11610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCanChord = false; 116396afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins return result; 11640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Bundle createGoogleSearchSourceBundle(String source) { 11670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Bundle bundle = new Bundle(); 116810d1cca0c208d1f9db23893a8515685e04cfe224Bjorn Bringert bundle.putString(Search.SOURCE, source); 11690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return bundle; 11700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11728ad299270a97dfa3f9bcb956096bc152498fb727Leon Scroggins /* package */ void editUrl() { 117368579393973f745fc65a2781061af9bb8f2d7020Leon Scroggins if (mOptionsMenuOpen) closeOptionsMenu(); 11745bbe98025a2c606a35c91b826760020890daadb1Leon Scroggins String url = (getTopWindow() == null) ? null : getTopWindow().getUrl(); 117583f473462fcd7869031a423c02b957c6e938a2f6Grace Kloba startSearch(mSettings.getHomePage().equals(url) ? null : url, true, 11768ad299270a97dfa3f9bcb956096bc152498fb727Leon Scroggins null, false); 11770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11798ad299270a97dfa3f9bcb956096bc152498fb727Leon Scroggins /** 11808ad299270a97dfa3f9bcb956096bc152498fb727Leon Scroggins * Overriding this to insert a local information bundle 11818ad299270a97dfa3f9bcb956096bc152498fb727Leon Scroggins */ 11820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 11830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void startSearch(String initialQuery, boolean selectInitialQuery, 11840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Bundle appSearchData, boolean globalSearch) { 11850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (appSearchData == null) { 11860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project appSearchData = createGoogleSearchSourceBundle(GOOGLE_SEARCH_SOURCE_TYPE); 11870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.startSearch(initialQuery, selectInitialQuery, appSearchData, globalSearch); 11890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11911f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins /** 11921f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins * Switch tabs. Called by the TitleBarSet when sliding the title bar 11931f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins * results in changing tabs. 1194160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * @param index Index of the tab to change to, as defined by 1195160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * mTabControl.getTabIndex(Tab t). 1196160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * @return boolean True if we successfully switched to a different tab. If 1197160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * the indexth tab is null, or if that tab is the same as 1198160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * the current one, return false. 11991f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins */ 1200160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins /* package */ boolean switchToTab(int index) { 120122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Tab tab = mTabControl.getTab(index); 120222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Tab currentTab = mTabControl.getCurrentTab(); 12031f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (tab == null || tab == currentTab) { 1204160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins return false; 12051f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 12061f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (currentTab != null) { 12071f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // currentTab may be null if it was just removed. In that case, 12081f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // we do not need to remove it 12091f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins removeTabFromContentView(currentTab); 12101f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 12111f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins mTabControl.setCurrentTab(tab); 12121f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins attachTabToContentView(tab); 1213eb6eef4c45df2d65c3e70660493a147a2be405e3Grace Kloba resetTitleIconAndProgress(); 1214eb6eef4c45df2d65c3e70660493a147a2be405e3Grace Kloba updateLockIconToLatest(); 1215160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins return true; 12161f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 12171f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins 121822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba /* package */ Tab openTabToHomePage() { 12190a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins return openTabAndShow(mSettings.getHomePage(), false, null); 12200a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins } 12210a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins 12221f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins /* package */ void closeCurrentWindow() { 122322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba final Tab current = mTabControl.getCurrentTab(); 1224160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins if (mTabControl.getTabCount() == 1) { 1225304442375719effd41dbd53ae62de7a8d0cec7d9Leon Scroggins // This is the last tab. Open a new one, with the home 1226304442375719effd41dbd53ae62de7a8d0cec7d9Leon Scroggins // page and close the current one. 122722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba openTabToHomePage(); 1228160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins closeTab(current); 1229160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins return; 1230160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins } 123122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba final Tab parent = current.getParentTab(); 12321f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins int indexToShow = -1; 12331f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (parent != null) { 12341f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins indexToShow = mTabControl.getTabIndex(parent); 12351f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } else { 1236160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins final int currentIndex = mTabControl.getCurrentIndex(); 1237160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins // Try to move to the tab to the right 1238160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins indexToShow = currentIndex + 1; 1239160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins if (indexToShow > mTabControl.getTabCount() - 1) { 1240160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins // Try to move to the tab to the left 1241160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins indexToShow = currentIndex - 1; 12421f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 12431f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 1244160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins if (switchToTab(indexToShow)) { 1245160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins // Close window 1246160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins closeTab(current); 1247160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins } 12481f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 12491f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins 12500a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins private ActiveTabsPage mActiveTabsPage; 12510a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins 12520a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins /** 12530a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins * Remove the active tabs page. 12540a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins * @param needToAttach If true, the active tabs page did not attach a tab 12550a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins * to the content view, so we need to do that here. 12560a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins */ 12570a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins /* package */ void removeActiveTabPage(boolean needToAttach) { 12580a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins mContentView.removeView(mActiveTabsPage); 12590a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins mActiveTabsPage = null; 12600a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins mMenuState = R.id.MAIN_MENU; 12610a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins if (needToAttach) { 12620a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins attachTabToContentView(mTabControl.getCurrentTab()); 12630a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins } 12640a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins getTopWindow().requestFocus(); 12650a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins } 12660a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins 12670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 12680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onOptionsItemSelected(MenuItem item) { 12690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!mCanChord) { 12700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // The user has already fired a shortcut with this hold down of the 12710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // menu key. 12720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 12730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12741f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (null == getTopWindow()) { 12750d7ae0ed82e21d472cde8cf92b5657d8ee8ca0d8Leon Scroggins return false; 12760d7ae0ed82e21d472cde8cf92b5657d8ee8ca0d8Leon Scroggins } 12776ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba if (mMenuIsDown) { 12786ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba // The shortcut action consumes the MENU. Even if it is still down, 12796ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba // it won't trigger the next shortcut action. In the case of the 12806ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba // shortcut action triggering a new activity, like Bookmarks, we 12816ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba // won't get onKeyUp for MENU. So it is important to reset it here. 12826ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba mMenuIsDown = false; 12836ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba } 12840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (item.getItemId()) { 12850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // -- Main menu 1286a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins case R.id.new_tab_menu_id: 12870a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins openTabToHomePage(); 1288a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins break; 1289a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins 129064b80f3efd95d7b5192731e995ccde79c4c6c11fLeon Scroggins case R.id.goto_menu_id: 12918ad299270a97dfa3f9bcb956096bc152498fb727Leon Scroggins editUrl(); 1292b3a5bedeede968b53363a6c517f92bc2484bb42dLeon Scroggins break; 1293b3a5bedeede968b53363a6c517f92bc2484bb42dLeon Scroggins 1294b3a5bedeede968b53363a6c517f92bc2484bb42dLeon Scroggins case R.id.bookmarks_menu_id: 1295304442375719effd41dbd53ae62de7a8d0cec7d9Leon Scroggins bookmarksOrHistoryPicker(false); 12960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 12970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 12980a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins case R.id.active_tabs_menu_id: 12990a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins mActiveTabsPage = new ActiveTabsPage(this, mTabControl); 13000a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins removeTabFromContentView(mTabControl.getCurrentTab()); 130143de61666cfc98a3acc41c7161a1a8b0bdb2b72bLeon Scroggins hideFakeTitleBar(); 13020a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins mContentView.addView(mActiveTabsPage, COVER_SCREEN_PARAMS); 13030a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins mActiveTabsPage.requestFocus(); 13040a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins mMenuState = EMPTY_MENU; 13050a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins break; 13060a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins 13071f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins case R.id.add_bookmark_menu_id: 13081f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins Intent i = new Intent(BrowserActivity.this, 13091f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins AddBookmarkPage.class); 13101f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins WebView w = getTopWindow(); 13111f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins i.putExtra("url", w.getUrl()); 13121f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins i.putExtra("title", w.getTitle()); 131383cdb2c40f2dbcbdf522a2af0ec8224c7195c6c1Grace Kloba i.putExtra("touch_icon_url", w.getTouchIconUrl()); 1314dcc2b6f08dd5677bc6ba761a9ba6f1c655113051Ben Murdoch i.putExtra("thumbnail", createScreenshot(w)); 13151f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins startActivity(i); 13160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.stop_reload_menu_id: 13190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mInLoad) { 13200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project stopLoading(); 13210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 13220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().reload(); 13230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 13240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.back_menu_id: 13270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().goBack(); 13280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.forward_menu_id: 13310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().goForward(); 13320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.close_menu_id: 13350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Close the subwindow if it exists. 13360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabControl.getCurrentSubWindow() != null) { 13370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dismissSubWindow(mTabControl.getCurrentTab()); 13380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 13401f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins closeCurrentWindow(); 13410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.homepage_menu_id: 134422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Tab current = mTabControl.getCurrentTab(); 13450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current != null) { 13460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dismissSubWindow(current); 134792472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins loadUrl(current.getWebView(), mSettings.getHomePage()); 13480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 13490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.preferences_menu_id: 13520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent = new Intent(this, 13530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserPreferencesPage.class); 1354d530494de9c182af4aff97ddd46343b32594da51Leon Scroggins intent.putExtra(BrowserPreferencesPage.CURRENT_PAGE, 1355d530494de9c182af4aff97ddd46343b32594da51Leon Scroggins getTopWindow().getUrl()); 13560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project startActivityForResult(intent, PREFERENCES_PAGE); 13570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.find_menu_id: 13600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (null == mFindDialog) { 13610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mFindDialog = new FindDialog(this); 13620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 13630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mFindDialog.setWebView(getTopWindow()); 13640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mFindDialog.show(); 13657d3ac79a202f0caf588e70270c28f5510ff80821Cary Clark getTopWindow().setFindIsUp(true); 13660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenuState = EMPTY_MENU; 13670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.select_text_id: 13700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().emulateShiftHeld(); 13710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.page_info_menu_id: 13730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showPageInfo(mTabControl.getCurrentTab(), false); 13740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.classic_history_menu_id: 1377304442375719effd41dbd53ae62de7a8d0cec7d9Leon Scroggins bookmarksOrHistoryPicker(true); 13780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 138096afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins case R.id.title_bar_share_page_url: 13810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.share_page_menu_id: 138296afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins Tab currentTab = mTabControl.getCurrentTab(); 138396afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins if (null == currentTab) { 138496afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins mCanChord = false; 138596afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins return false; 138696afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins } 138796afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins currentTab.populatePickerData(); 138896afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins sharePage(this, currentTab.getTitle(), 138996afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins currentTab.getUrl(), currentTab.getFavicon(), 139096afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins createScreenshot(currentTab.getWebView())); 13910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.dump_nav_menu_id: 13940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().debugDump(); 13950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13977a8b88b0e0f20544df5ee34b798398603261b733Andrei Popescu case R.id.dump_counters_menu_id: 13987a8b88b0e0f20544df5ee34b798398603261b733Andrei Popescu getTopWindow().dumpV8Counters(); 13997a8b88b0e0f20544df5ee34b798398603261b733Andrei Popescu break; 14007a8b88b0e0f20544df5ee34b798398603261b733Andrei Popescu 14010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.zoom_in_menu_id: 14020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().zoomIn(); 14030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.zoom_out_menu_id: 14060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().zoomOut(); 14070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.view_downloads_menu_id: 14100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project viewDownloads(null); 14110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_one_menu_id: 14140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_two_menu_id: 14150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_three_menu_id: 14160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_four_menu_id: 14170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_five_menu_id: 14180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_six_menu_id: 14190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_seven_menu_id: 14200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_eight_menu_id: 14210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project { 14220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int menuid = item.getItemId(); 14230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project for (int id = 0; id < WINDOW_SHORTCUT_ID_ARRAY.length; id++) { 14240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (WINDOW_SHORTCUT_ID_ARRAY[id] == menuid) { 142522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Tab desiredTab = mTabControl.getTab(id); 14260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (desiredTab != null && 14270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project desiredTab != mTabControl.getCurrentTab()) { 14281f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins switchToTab(id); 14290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project default: 14370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!super.onOptionsItemSelected(item)) { 14380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 14390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Otherwise fall through. 14410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCanChord = false; 14430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 14440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void closeFind() { 14470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenuState = R.id.MAIN_MENU; 14480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 145022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba @Override 145122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba public boolean onPrepareOptionsMenu(Menu menu) { 14520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // This happens when the user begins to hold down the menu key, so 14530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // allow them to chord to get a shortcut. 14540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCanChord = true; 14550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Note: setVisible will decide whether an item is visible; while 14560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // setEnabled() will decide whether an item is enabled, which also means 14570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // whether the matching shortcut key will function. 14580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onPrepareOptionsMenu(menu); 14590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (mMenuState) { 14600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case EMPTY_MENU: 14610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mCurrentMenuState != mMenuState) { 14620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.MAIN_MENU, false); 14630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupEnabled(R.id.MAIN_MENU, false); 14640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupEnabled(R.id.MAIN_SHORTCUT_MENU, false); 14650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project default: 14680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mCurrentMenuState != mMenuState) { 14690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.MAIN_MENU, true); 14700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupEnabled(R.id.MAIN_MENU, true); 14710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupEnabled(R.id.MAIN_SHORTCUT_MENU, true); 14720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView w = getTopWindow(); 14740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean canGoBack = false; 14750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean canGoForward = false; 14760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean isHome = false; 14770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 14780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project canGoBack = w.canGoBack(); 14790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project canGoForward = w.canGoForward(); 14800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project isHome = mSettings.getHomePage().equals(w.getUrl()); 14810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final MenuItem back = menu.findItem(R.id.back_menu_id); 14830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project back.setEnabled(canGoBack); 14840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final MenuItem home = menu.findItem(R.id.homepage_menu_id); 14860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project home.setEnabled(!isHome); 14870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.forward_menu_id) 14890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setEnabled(canGoForward); 14900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1491a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins menu.findItem(R.id.new_tab_menu_id).setEnabled( 149222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mTabControl.canCreateNewTab()); 1493a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins 14940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // decide whether to show the share link option 14950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project PackageManager pm = getPackageManager(); 14960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent send = new Intent(Intent.ACTION_SEND); 14970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project send.setType("text/plain"); 14980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ResolveInfo ri = pm.resolveActivity(send, PackageManager.MATCH_DEFAULT_ONLY); 14990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.share_page_menu_id).setVisible(ri != null); 15000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean isNavDump = mSettings.isNavDump(); 15020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final MenuItem nav = menu.findItem(R.id.dump_nav_menu_id); 15030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project nav.setVisible(isNavDump); 15040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project nav.setEnabled(isNavDump); 15057a8b88b0e0f20544df5ee34b798398603261b733Andrei Popescu 15067a8b88b0e0f20544df5ee34b798398603261b733Andrei Popescu boolean showDebugSettings = mSettings.showDebugSettings(); 15077a8b88b0e0f20544df5ee34b798398603261b733Andrei Popescu final MenuItem counter = menu.findItem(R.id.dump_counters_menu_id); 15087a8b88b0e0f20544df5ee34b798398603261b733Andrei Popescu counter.setVisible(showDebugSettings); 15097a8b88b0e0f20544df5ee34b798398603261b733Andrei Popescu counter.setEnabled(showDebugSettings); 15107a8b88b0e0f20544df5ee34b798398603261b733Andrei Popescu 15110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCurrentMenuState = mMenuState; 15140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 15150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 15180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCreateContextMenu(ContextMenu menu, View v, 15190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ContextMenuInfo menuInfo) { 15204e9f89b0a64395133b9160dcb4533d2dc62a424fLeon Scroggins if (v instanceof TitleBar) { 15214e9f89b0a64395133b9160dcb4533d2dc62a424fLeon Scroggins return; 15224e9f89b0a64395133b9160dcb4533d2dc62a424fLeon Scroggins } 15230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView webview = (WebView) v; 15240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView.HitTestResult result = webview.getHitTestResult(); 15250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (result == null) { 15260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 15270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int type = result.getType(); 15300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (type == WebView.HitTestResult.UNKNOWN_TYPE) { 15310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.w(LOGTAG, 15320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "We should not show context menu when nothing is touched"); 15330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 15340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (type == WebView.HitTestResult.EDIT_TEXT_TYPE) { 15360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // let TextView handles context menu 15370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 15380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Note, http://b/issue?id=1106666 is requesting that 15410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // an inflated menu can be used again. This is not available 15420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // yet, so inflate each time (yuk!) 15430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project MenuInflater inflater = getMenuInflater(); 15440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inflater.inflate(R.menu.browsercontext, menu); 15450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Show the correct menu group 15470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String extra = result.getExtra(); 15480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.PHONE_MENU, 15490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project type == WebView.HitTestResult.PHONE_TYPE); 15500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.EMAIL_MENU, 15510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project type == WebView.HitTestResult.EMAIL_TYPE); 15520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.GEO_MENU, 15530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project type == WebView.HitTestResult.GEO_TYPE); 15540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.IMAGE_MENU, 15550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project type == WebView.HitTestResult.IMAGE_TYPE 15560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE); 15570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.ANCHOR_MENU, 15580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project type == WebView.HitTestResult.SRC_ANCHOR_TYPE 15590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE); 15600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Setup custom handling depending on the type 15620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (type) { 15630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.PHONE_TYPE: 15640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setHeaderTitle(Uri.decode(extra)); 15650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.dial_context_menu_id).setIntent( 15660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Intent(Intent.ACTION_VIEW, Uri 15670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .parse(WebView.SCHEME_TEL + extra))); 15680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent addIntent = new Intent(Intent.ACTION_INSERT_OR_EDIT); 15690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project addIntent.putExtra(Insert.PHONE, Uri.decode(extra)); 15705e335a381a0cd66e94117b202c1f34f5cb29c9b8Cary Clark addIntent.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE); 15710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.add_contact_context_menu_id).setIntent( 15720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project addIntent); 15730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.copy_phone_context_menu_id).setOnMenuItemClickListener( 15740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Copy(extra)); 15750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.EMAIL_TYPE: 15780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setHeaderTitle(extra); 15790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.email_context_menu_id).setIntent( 15800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Intent(Intent.ACTION_VIEW, Uri 15810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .parse(WebView.SCHEME_MAILTO + extra))); 15820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.copy_mail_context_menu_id).setOnMenuItemClickListener( 15830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Copy(extra)); 15840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.GEO_TYPE: 15870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setHeaderTitle(extra); 15880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.map_context_menu_id).setIntent( 15890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Intent(Intent.ACTION_VIEW, Uri 15900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .parse(WebView.SCHEME_GEO 15910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + URLEncoder.encode(extra)))); 15920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.copy_geo_context_menu_id).setOnMenuItemClickListener( 15930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Copy(extra)); 15940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.SRC_ANCHOR_TYPE: 15970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE: 15980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TextView titleView = (TextView) LayoutInflater.from(this) 15990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(android.R.layout.browser_link_context_header, 16000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project null); 16010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project titleView.setText(extra); 16020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setHeaderView(titleView); 16030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // decide whether to show the open link in new tab option 16040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.open_newtab_context_menu_id).setVisible( 160522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mTabControl.canCreateNewTab()); 1606de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch menu.findItem(R.id.bookmark_context_menu_id).setVisible( 1607de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch Bookmarks.urlHasAcceptableScheme(extra)); 16080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project PackageManager pm = getPackageManager(); 16090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent send = new Intent(Intent.ACTION_SEND); 16100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project send.setType("text/plain"); 16110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ResolveInfo ri = pm.resolveActivity(send, PackageManager.MATCH_DEFAULT_ONLY); 16120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.share_link_context_menu_id).setVisible(ri != null); 16130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (type == WebView.HitTestResult.SRC_ANCHOR_TYPE) { 16140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 16150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // otherwise fall through to handle image part 16170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.IMAGE_TYPE: 16180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (type == WebView.HitTestResult.IMAGE_TYPE) { 16190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setHeaderTitle(extra); 16200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.view_image_context_menu_id).setIntent( 16220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Intent(Intent.ACTION_VIEW, Uri.parse(extra))); 16230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.download_context_menu_id). 16240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setOnMenuItemClickListener(new Download(extra)); 16254f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch menu.findItem(R.id.set_wallpaper_context_menu_id). 16264f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch setOnMenuItemClickListener(new SetAsWallpaper(extra)); 16270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 16280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project default: 16300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.w(LOGTAG, "We should not get here."); 16310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 16320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1633b2b19f501ee05448ca81bddaaca70e9b2f51cb54Leon Scroggins hideFakeTitleBar(); 16340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Attach the given tab to the content view. 1637c928c30a51eee84b40cb7045842c288c1cfafff0Grace Kloba // this should only be called for the current tab. 163822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba private void attachTabToContentView(Tab t) { 16392bc69918d97a767a02132090e58718077381ba1aSteve Block // Attach the container that contains the main WebView and any other UI 16402bc69918d97a767a02132090e58718077381ba1aSteve Block // associated with the tab. 1641d0119535d0c490e087be114ae8fd1639bb1945dcPatrick Scott t.attachTabToContentView(mContentView); 1642bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 1643bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch if (mShouldShowErrorConsole) { 164422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba ErrorConsoleView errorConsole = t.getErrorConsole(true); 1645bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch if (errorConsole.numberOfErrors() == 0) { 1646bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch errorConsole.showConsole(ErrorConsoleView.SHOW_NONE); 1647bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } else { 1648bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch errorConsole.showConsole(ErrorConsoleView.SHOW_MINIMIZED); 1649bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 1650bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 1651bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch mErrorConsoleContainer.addView(errorConsole, 165215b8ec6b226f4d57307716e1f495e10a91f8cbf4Romain Guy new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 1653bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch ViewGroup.LayoutParams.WRAP_CONTENT)); 1654bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 1655bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 165639ab28eba0c8c837ac80851ec0dd2af336aa3f85Leon Scroggins WebView view = t.getWebView(); 165755a5bc2a8f3c9a0721eeaa5a45241e00d5da95efLeon Scroggins view.setEmbeddedTitleBar(mTitleBar); 165858d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins if (t.isInVoiceSearchMode()) { 165958d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins showVoiceTitleBar(t.getVoiceDisplayTitle()); 166058d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins } else { 166158d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins revertVoiceTitleBar(); 166258d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins } 16630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Request focus on the top window. 16640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project t.getTopWindow().requestFocus(); 16650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Attach a sub window to the main WebView of the given tab. 166822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba void attachSubWindow(Tab t) { 1669d0119535d0c490e087be114ae8fd1639bb1945dcPatrick Scott t.attachSubWindow(mContentView); 1670d0119535d0c490e087be114ae8fd1639bb1945dcPatrick Scott getTopWindow().requestFocus(); 16710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Remove the given tab from the content view. 167422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba private void removeTabFromContentView(Tab t) { 16752bc69918d97a767a02132090e58718077381ba1aSteve Block // Remove the container that contains the main WebView. 1676d0119535d0c490e087be114ae8fd1639bb1945dcPatrick Scott t.removeTabFromContentView(mContentView); 1677bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 167822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba ErrorConsoleView errorConsole = t.getErrorConsole(false); 167922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (errorConsole != null) { 168022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mErrorConsoleContainer.removeView(errorConsole); 1681bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 1682bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 168339ab28eba0c8c837ac80851ec0dd2af336aa3f85Leon Scroggins WebView view = t.getWebView(); 1684bb85b9016201d45ea939d7cb7edd0ba6616a111cLeon Scroggins if (view != null) { 1685bb85b9016201d45ea939d7cb7edd0ba6616a111cLeon Scroggins view.setEmbeddedTitleBar(null); 1686bb85b9016201d45ea939d7cb7edd0ba6616a111cLeon Scroggins } 16870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Remove the sub window if it exists. Also called by TabControl when the 16900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // user clicks the 'X' to dismiss a sub window. 169122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba /* package */ void dismissSubWindow(Tab t) { 1692d0119535d0c490e087be114ae8fd1639bb1945dcPatrick Scott t.removeSubWindow(mContentView); 169322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // dismiss the subwindow. This will destroy the WebView. 169422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba t.dismissSubWindow(); 1695d0119535d0c490e087be114ae8fd1639bb1945dcPatrick Scott getTopWindow().requestFocus(); 16960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16981f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // A wrapper function of {@link #openTabAndShow(UrlData, boolean, String)} 169925ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima // that accepts url as string. 170022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba private Tab openTabAndShow(String url, boolean closeOnExit, String appId) { 17011f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins return openTabAndShow(new UrlData(url), closeOnExit, appId); 17020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // This method does a ton of stuff. It will attempt to create a new tab 17050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we haven't reached MAX_TABS. Otherwise it uses the current tab. If 17061f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // url isn't null, it will load the given url. 170722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba /* package */Tab openTabAndShow(UrlData urlData, boolean closeOnExit, 170822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba String appId) { 170922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba final Tab currentTab = mTabControl.getCurrentTab(); 171022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (mTabControl.canCreateNewTab()) { 171122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba final Tab tab = mTabControl.createNewTab(closeOnExit, appId, 171222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba urlData.mUrl); 17131f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins WebView webview = tab.getWebView(); 17140a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins // If the last tab was removed from the active tabs page, currentTab 17150a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins // will be null. 17160a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins if (currentTab != null) { 17170a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins removeTabFromContentView(currentTab); 17180a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins } 17198bbd69f50abd537bfe7eb314b3a3e20241ac22bdPatrick Scott // We must set the new tab as the current tab to reflect the old 17208bbd69f50abd537bfe7eb314b3a3e20241ac22bdPatrick Scott // animation behavior. 17218bbd69f50abd537bfe7eb314b3a3e20241ac22bdPatrick Scott mTabControl.setCurrentTab(tab); 1722eb6eef4c45df2d65c3e70660493a147a2be405e3Grace Kloba attachTabToContentView(tab); 1723160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins if (!urlData.isEmpty()) { 17249d53da05812f959745810a33bb4e06b273393c42Patrick Scott loadUrlDataIn(tab, urlData); 17250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17261f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins return tab; 172764b80f3efd95d7b5192731e995ccde79c4c6c11fLeon Scroggins } else { 17281f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // Get rid of the subwindow if it exists 17291f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins dismissSubWindow(currentTab); 17301f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (!urlData.isEmpty()) { 17311f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // Load the given url. 17329d53da05812f959745810a33bb4e06b273393c42Patrick Scott loadUrlDataIn(currentTab, urlData); 17330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 173458d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins return currentTab; 17350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 173822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba private Tab openTab(String url) { 17390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mSettings.openInBackground()) { 174022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Tab t = mTabControl.createNewTab(); 17410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (t != null) { 17421f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins WebView view = t.getWebView(); 174392472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins loadUrl(view, url); 17440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1745c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba return t; 17460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 17471f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins return openTabAndShow(url, false, null); 17480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private class Copy implements OnMenuItemClickListener { 17520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private CharSequence mText; 17530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onMenuItemClick(MenuItem item) { 17550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project copy(mText); 17560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 17570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public Copy(CharSequence toCopy) { 17600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mText = toCopy; 17610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private class Download implements OnMenuItemClickListener { 17650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String mText; 17660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onMenuItemClick(MenuItem item) { 17680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project onDownloadStartNoStream(mText, null, null, null, -1); 17690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 17700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public Download(String toDownload) { 17730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mText = toDownload; 17740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17774f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch private class SetAsWallpaper extends Thread implements 17784f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch OnMenuItemClickListener, DialogInterface.OnCancelListener { 17794f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch private URL mUrl; 17804f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch private ProgressDialog mWallpaperProgress; 17814f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch private boolean mCanceled = false; 17824f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch 17834f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch public SetAsWallpaper(String url) { 17844f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch try { 17854f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch mUrl = new URL(url); 17864f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } catch (MalformedURLException e) { 17874f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch mUrl = null; 17884f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } 17894f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } 17904f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch 17914f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch public void onCancel(DialogInterface dialog) { 17924f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch mCanceled = true; 17934f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } 17944f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch 17954f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch public boolean onMenuItemClick(MenuItem item) { 17964f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch if (mUrl != null) { 17974f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch // The user may have tried to set a image with a large file size as their 17984f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch // background so it may take a few moments to perform the operation. Display 17994f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch // a progress spinner while it is working. 18004f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch mWallpaperProgress = new ProgressDialog(BrowserActivity.this); 18014f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch mWallpaperProgress.setIndeterminate(true); 18024f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch mWallpaperProgress.setMessage(getText(R.string.progress_dialog_setting_wallpaper)); 18034f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch mWallpaperProgress.setCancelable(true); 18044f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch mWallpaperProgress.setOnCancelListener(this); 18054f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch mWallpaperProgress.show(); 18064f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch start(); 18074f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } 18084f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch return true; 18094f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } 18104f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch 18114f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch public void run() { 18124f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch Drawable oldWallpaper = BrowserActivity.this.getWallpaper(); 18134f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch try { 18144f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch // TODO: This will cause the resource to be downloaded again, when we 18154f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch // should in most cases be able to grab it from the cache. To fix this 18164f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch // we should query WebCore to see if we can access a cached version and 18174f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch // instead open an input stream on that. This pattern could also be used 18184f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch // in the download manager where the same problem exists. 18194f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch InputStream inputstream = mUrl.openStream(); 18204f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch if (inputstream != null) { 18214f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch setWallpaper(inputstream); 18224f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } 18234f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } catch (IOException e) { 18244f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch Log.e(LOGTAG, "Unable to set new wallpaper"); 18254f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch // Act as though the user canceled the operation so we try to 18264f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch // restore the old wallpaper. 18274f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch mCanceled = true; 18284f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } 18294f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch 18304f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch if (mCanceled) { 18314f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch // Restore the old wallpaper if the user cancelled whilst we were setting 18324f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch // the new wallpaper. 18334f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch int width = oldWallpaper.getIntrinsicWidth(); 18344f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch int height = oldWallpaper.getIntrinsicHeight(); 18354f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); 18364f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch Canvas canvas = new Canvas(bm); 18374f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch oldWallpaper.setBounds(0, 0, width, height); 18384f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch oldWallpaper.draw(canvas); 18394f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch try { 18404f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch setWallpaper(bm); 18414f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } catch (IOException e) { 18424f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch Log.e(LOGTAG, "Unable to restore old wallpaper."); 18434f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } 18444f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch mCanceled = false; 18454f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } 18464f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch 18474f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch if (mWallpaperProgress.isShowing()) { 18484f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch mWallpaperProgress.dismiss(); 18494f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } 18504f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } 18514f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } 18524f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch 18530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void copy(CharSequence text) { 18540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 18550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project IClipboard clip = IClipboard.Stub.asInterface(ServiceManager.getService("clipboard")); 18560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (clip != null) { 18570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project clip.setClipboardText(text); 18580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (android.os.RemoteException e) { 18600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(LOGTAG, "Copy failed", e); 18610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 18650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Resets the browser title-view to whatever it must be 18660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * (for example, if we had a loading error) 18670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * When we have a new page, we call resetTitle, when we 18680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * have to reset the titlebar to whatever it used to be 18690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * (for example, if the user chose to stop loading), we 18700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * call resetTitleAndRevertLockIcon. 18710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 18720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ void resetTitleAndRevertLockIcon() { 187322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mTabControl.getCurrentTab().revertLockIcon(); 187422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba updateLockIconToLatest(); 18750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleIconAndProgress(); 18760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 18790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Reset the title, favicon, and progress. 18800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 18810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void resetTitleIconAndProgress() { 18820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView current = mTabControl.getCurrentWebView(); 18830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current == null) { 18840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 18850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleAndIcon(current); 18870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int progress = current.getProgress(); 188822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba current.getWebChromeClient().onProgressChanged(current, progress); 18890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Reset the title and the icon based on the given item. 18920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void resetTitleAndIcon(WebView view) { 18930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebHistoryItem item = view.copyBackForwardList().getCurrentItem(); 18940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (item != null) { 189568579393973f745fc65a2781061af9bb8f2d7020Leon Scroggins setUrlTitle(item.getUrl(), item.getTitle()); 18960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setFavicon(item.getFavicon()); 18970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 189868579393973f745fc65a2781061af9bb8f2d7020Leon Scroggins setUrlTitle(null, null); 18990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setFavicon(null); 19000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 19040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Sets a title composed of the URL and the title string. 19050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param url The URL of the site being loaded. 19060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param title The title of the site being loaded. 19070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 190822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba void setUrlTitle(String url, String title) { 19090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mUrl = url; 19100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTitle = title; 19110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 191258d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins // If we are in voice search mode, the title has already been set. 191358d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins if (mTabControl.getCurrentTab().isInVoiceSearchMode()) return; 191458d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins mTitleBar.setDisplayTitle(url); 191558d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins mFakeTitleBar.setDisplayTitle(url); 19160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 19190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param url The URL to build a title version of the URL from. 19200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @return The title version of the URL or null if fails. 19210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * The title version of the URL can be either the URL hostname, 19220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * or the hostname with an "https://" prefix (for secure URLs), 19230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * or an empty string if, for example, the URL in question is a 19240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * file:// URL with no hostname. 19250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 192632e14a6deccfa75490b3032bb4ddd5ae90f89de8Leon Scroggins /* package */ static String buildTitleUrl(String url) { 19270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String titleUrl = null; 19280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null) { 19300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 19310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // parse the url string 19320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project URL urlObj = new URL(url); 19330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (urlObj != null) { 19340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project titleUrl = ""; 19350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String protocol = urlObj.getProtocol(); 19370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String host = urlObj.getHost(); 19380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (host != null && 0 < host.length()) { 19400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project titleUrl = host; 19410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (protocol != null) { 19420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if a secure site, add an "https://" prefix! 19430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (protocol.equalsIgnoreCase("https")) { 19440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project titleUrl = protocol + "://" + host; 19450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (MalformedURLException e) {} 19500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return titleUrl; 19530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Set the favicon in the title bar. 195622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba void setFavicon(Bitmap icon) { 195768579393973f745fc65a2781061af9bb8f2d7020Leon Scroggins mTitleBar.setFavicon(icon); 1958fe87bd3a3897e4bad65bb3d284659ae2f4e57570Leon Scroggins mFakeTitleBar.setFavicon(icon); 19590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 19620a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins * Close the tab, remove its associated title bar, and adjust mTabControl's 19630a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins * current tab to a valid value. 19641f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins */ 196522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba /* package */ void closeTab(Tab t) { 19660a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins int currentIndex = mTabControl.getCurrentIndex(); 19670a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins int removeIndex = mTabControl.getTabIndex(t); 19681f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins mTabControl.removeTab(t); 19690a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins if (currentIndex >= removeIndex && currentIndex != 0) { 19700a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins currentIndex--; 19710a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins } 19720a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins mTabControl.setCurrentTab(mTabControl.getTab(currentIndex)); 1973a5bf1deca120315a2643ea5b010f94d853461b15Andrei Popescu resetTitleIconAndProgress(); 19740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1976dcc5eeb63eadd597587a0b2b49998c267b0bcc11Leon Scroggins /* package */ void goBackOnePageOrQuit() { 197722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Tab current = mTabControl.getCurrentTab(); 19780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current == null) { 19790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* 19800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Instead of finishing the activity, simply push this to the back 19810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * of the stack and let ActivityManager to choose the foreground 19820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * activity. As BrowserActivity is singleTask, it will be always the 19830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * root of the task. So we can use either true or false for 19840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * moveTaskToBack(). 19850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 19860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project moveTaskToBack(true); 198700d85e74921459b34e70eb93368245b4c0a9bf5fGrace Kloba return; 19880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = current.getWebView(); 19900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w.canGoBack()) { 19910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.goBack(); 19920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 19930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Check to see if we are closing a window that was created by 19940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // another window. If so, we switch back to that window. 199522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Tab parent = current.getParentTab(); 19960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (parent != null) { 19971f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins switchToTab(mTabControl.getTabIndex(parent)); 19981f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // Now we close the other tab 19991f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins closeTab(current); 20000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 20010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current.closeOnExit()) { 200222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // force the tab's inLoad() to be false as we are going to 200322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // either finish the activity or remove the tab. This will 200422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // ensure pauseWebViewTimers() taking action. 200522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mTabControl.getCurrentTab().clearInLoad(); 20060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabControl.getTabCount() == 1) { 20070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project finish(); 20080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 20090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20107bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed // call pauseWebViewTimers() now, we won't be able to call 20117bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed // it in onPause() as the WebView won't be valid. 2012ec1b5ad8d8283b1fbbc5d7fa1cd50ef95b9e594dGrace Kloba // Temporarily change mActivityInPause to be true as 2013ec1b5ad8d8283b1fbbc5d7fa1cd50ef95b9e594dGrace Kloba // pauseWebViewTimers() will do nothing if mActivityInPause 2014ec1b5ad8d8283b1fbbc5d7fa1cd50ef95b9e594dGrace Kloba // is false. 2015918e1d78b2db6ef21c71a07868572d9cda498476Grace Kloba boolean savedState = mActivityInPause; 2016918e1d78b2db6ef21c71a07868572d9cda498476Grace Kloba if (savedState) { 2017ec1b5ad8d8283b1fbbc5d7fa1cd50ef95b9e594dGrace Kloba Log.e(LOGTAG, "BrowserActivity is already paused " 2018ec1b5ad8d8283b1fbbc5d7fa1cd50ef95b9e594dGrace Kloba + "while handing goBackOnePageOrQuit."); 2019918e1d78b2db6ef21c71a07868572d9cda498476Grace Kloba } 2020918e1d78b2db6ef21c71a07868572d9cda498476Grace Kloba mActivityInPause = true; 20217bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed pauseWebViewTimers(); 2022918e1d78b2db6ef21c71a07868572d9cda498476Grace Kloba mActivityInPause = savedState; 20230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project removeTabFromContentView(current); 20240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.removeTab(current); 20250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* 20270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Instead of finishing the activity, simply push this to the back 20280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * of the stack and let ActivityManager to choose the foreground 20290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * activity. As BrowserActivity is singleTask, it will be always the 20300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * root of the task. So we can use either true or false for 20310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * moveTaskToBack(). 20320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 20330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project moveTaskToBack(true); 20340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 203822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba boolean isMenuDown() { 203922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba return mMenuIsDown; 204022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 204122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba 20425942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba @Override 20435942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba public boolean onKeyDown(int keyCode, KeyEvent event) { 2044f65b50ddd2f7ed1205002d74082fff1ac2336d5cLeon Scroggins // Even if MENU is already held down, we need to call to super to open 2045f65b50ddd2f7ed1205002d74082fff1ac2336d5cLeon Scroggins // the IME on long press. 2046f65b50ddd2f7ed1205002d74082fff1ac2336d5cLeon Scroggins if (KeyEvent.KEYCODE_MENU == keyCode) { 2047f65b50ddd2f7ed1205002d74082fff1ac2336d5cLeon Scroggins mMenuIsDown = true; 2048f65b50ddd2f7ed1205002d74082fff1ac2336d5cLeon Scroggins return super.onKeyDown(keyCode, event); 2049f65b50ddd2f7ed1205002d74082fff1ac2336d5cLeon Scroggins } 20505942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba // The default key mode is DEFAULT_KEYS_SEARCH_LOCAL. As the MENU is 20515942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba // still down, we don't want to trigger the search. Pretend to consume 20525942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba // the key and do nothing. 20535942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba if (mMenuIsDown) return true; 20545942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba 20555942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba switch(keyCode) { 20565942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba case KeyEvent.KEYCODE_SPACE: 2057da0fe556a00773ce2af25eb6dcc5442bd08c7addGrace Kloba // WebView/WebTextView handle the keys in the KeyDown. As 2058da0fe556a00773ce2af25eb6dcc5442bd08c7addGrace Kloba // the Activity's shortcut keys are only handled when WebView 2059da0fe556a00773ce2af25eb6dcc5442bd08c7addGrace Kloba // doesn't, have to do it in onKeyDown instead of onKeyUp. 2060da0fe556a00773ce2af25eb6dcc5442bd08c7addGrace Kloba if (event.isShiftPressed()) { 2061da0fe556a00773ce2af25eb6dcc5442bd08c7addGrace Kloba getTopWindow().pageUp(false); 2062da0fe556a00773ce2af25eb6dcc5442bd08c7addGrace Kloba } else { 2063da0fe556a00773ce2af25eb6dcc5442bd08c7addGrace Kloba getTopWindow().pageDown(false); 2064da0fe556a00773ce2af25eb6dcc5442bd08c7addGrace Kloba } 20655942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba return true; 20665942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba case KeyEvent.KEYCODE_BACK: 20675942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba if (event.getRepeatCount() == 0) { 20685942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba event.startTracking(); 20695942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba return true; 20705942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba } else if (mCustomView == null && mActiveTabsPage == null 20715942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba && event.isLongPress()) { 20725942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba bookmarksOrHistoryPicker(true); 20735942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba return true; 20740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20755942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba break; 20760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20775942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba return super.onKeyDown(keyCode, event); 20780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20805942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba @Override 20815942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba public boolean onKeyUp(int keyCode, KeyEvent event) { 20825942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba switch(keyCode) { 20835942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba case KeyEvent.KEYCODE_MENU: 20845942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba mMenuIsDown = false; 20855942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba break; 20865942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba case KeyEvent.KEYCODE_BACK: 20875942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba if (event.isTracking() && !event.isCanceled()) { 20885942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba if (mCustomView != null) { 20895942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba // if a custom view is showing, hide it 209022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mTabControl.getCurrentWebView().getWebChromeClient() 209122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba .onHideCustomView(); 20925942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba } else if (mActiveTabsPage != null) { 20935942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba // if tab page is showing, hide it 20945942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba removeActiveTabPage(true); 20950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 20965942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba WebView subwindow = mTabControl.getCurrentSubWindow(); 20975942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba if (subwindow != null) { 20985942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba if (subwindow.canGoBack()) { 20995942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba subwindow.goBack(); 21005942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba } else { 21015942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba dismissSubWindow(mTabControl.getCurrentTab()); 21025942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba } 21035942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba } else { 21045942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba goBackOnePageOrQuit(); 21055942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba } 21060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21075942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba return true; 21085942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba } 21095942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba break; 21100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21115942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba return super.onKeyUp(keyCode, event); 21120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 211468579393973f745fc65a2781061af9bb8f2d7020Leon Scroggins /* package */ void stopLoading() { 2115b7cc8b439dc595dc48e1c2183b35d23ad72dfbe5Ben Murdoch mDidStopLoad = true; 21160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleAndRevertLockIcon(); 21170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = getTopWindow(); 21180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.stopLoading(); 211922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // FIXME: before refactor, it is using mWebViewClient. So I keep the 212022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // same logic here. But for subwindow case, should we call into the main 212122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // WebView's onPageFinished as we never call its onPageStarted and if 212222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // the page finishes itself, we don't call onPageFinished. 212322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mTabControl.getCurrentWebView().getWebViewClient().onPageFinished(w, 212422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba w.getUrl()); 21250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 21260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project cancelStopToast(); 21270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mStopToast = Toast 21280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .makeText(this, R.string.stopping, Toast.LENGTH_SHORT); 21290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mStopToast.show(); 21300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 213222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba boolean didUserStopLoading() { 213322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba return mDidStopLoad; 213422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 213522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba 21360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void cancelStopToast() { 21370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mStopToast != null) { 21380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mStopToast.cancel(); 21390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mStopToast = null; 21400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 214322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // called by a UI or non-UI thread to post the message 214422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba public void postMessage(int what, int arg1, int arg2, Object obj, 214522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba long delayMillis) { 214622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mHandler.sendMessageDelayed(mHandler.obtainMessage(what, arg1, arg2, 214722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba obj), delayMillis); 214822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 214922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba 215022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // called by a UI or non-UI thread to remove the message 215122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba void removeMessages(int what, Object object) { 215222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mHandler.removeMessages(what, object); 21530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 21550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // public message ids 21560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public final static int LOAD_URL = 1001; 21570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public final static int STOP_LOAD = 1002; 21580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 21590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Message Ids 21600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static final int FOCUS_NODE_HREF = 102; 216192c18a52ca7a79c114028b5ba22c3dfe443bd1a4Grace Kloba private static final int RELEASE_WAKELOCK = 107; 21620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 216322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba static final int UPDATE_BOOKMARK_THUMBNAIL = 108; 21642694e23a55d5ca526fc29534a80a200e2c58698bBen Murdoch 21650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Private handler for handling javascript and saving passwords 21660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Handler mHandler = new Handler() { 21670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 21680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void handleMessage(Message msg) { 21690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (msg.what) { 21700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case FOCUS_NODE_HREF: 21712694e23a55d5ca526fc29534a80a200e2c58698bBen Murdoch { 21720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String url = (String) msg.getData().get("url"); 217390d088caeee718f89755ee9c25249ba6da15ab97Ben Murdoch String title = (String) msg.getData().get("title"); 21740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url == null || url.length() == 0) { 21750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 21760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project HashMap focusNodeMap = (HashMap) msg.obj; 21780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView view = (WebView) focusNodeMap.get("webview"); 21790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Only apply the action if the top window did not change. 21800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (getTopWindow() != view) { 21810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 21820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (msg.arg1) { 21840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.open_context_menu_id: 21850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.view_image_context_menu_id: 218692472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins loadUrlFromContext(getTopWindow(), url); 21870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 21880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.open_newtab_context_menu_id: 218922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba final Tab parent = mTabControl.getCurrentTab(); 219022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba final Tab newTab = openTab(url); 2191c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba if (newTab != parent) { 2192c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba parent.addChildTab(newTab); 2193c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba } 21940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 21950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.bookmark_context_menu_id: 21960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent = new Intent(BrowserActivity.this, 21970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project AddBookmarkPage.class); 21980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.putExtra("url", url); 219990d088caeee718f89755ee9c25249ba6da15ab97Ben Murdoch intent.putExtra("title", title); 22000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project startActivity(intent); 22010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 22020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.share_link_context_menu_id: 220396afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins // See if this site has been visited before 220496afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins StringBuilder sb = new StringBuilder( 220596afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins Browser.BookmarkColumns.URL + " = "); 220696afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins DatabaseUtils.appendEscapedSQLString(sb, url); 220796afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins Cursor c = mResolver.query(Browser.BOOKMARKS_URI, 220896afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins Browser.HISTORY_PROJECTION, 220996afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins sb.toString(), 221096afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins null, 221196afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins null); 221296afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins if (c.moveToFirst()) { 221396afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins // The site has been visited before, so grab the 221496afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins // info from the database. 221596afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins Bitmap favicon = null; 221696afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins Bitmap thumbnail = null; 221796afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins String linkTitle = c.getString(Browser. 221896afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins HISTORY_PROJECTION_TITLE_INDEX); 221996afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins byte[] data = c.getBlob(Browser. 222096afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins HISTORY_PROJECTION_FAVICON_INDEX); 222196afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins if (data != null) { 222296afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins favicon = BitmapFactory.decodeByteArray( 222396afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins data, 0, data.length); 222496afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins } 222596afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins data = c.getBlob(Browser. 222696afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins HISTORY_PROJECTION_THUMBNAIL_INDEX); 222796afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins if (data != null) { 222896afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins thumbnail = BitmapFactory.decodeByteArray( 222996afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins data, 0, data.length); 223096afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins } 223196afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins sharePage(BrowserActivity.this, 223296afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins linkTitle, url, favicon, thumbnail); 223396afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins } else { 223496afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins Browser.sendString(BrowserActivity.this, url, 223596afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins getString( 223696afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins R.string.choosertitle_sharevia)); 223796afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins } 22380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 22390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.copy_link_context_menu_id: 22400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project copy(url); 22410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 22420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.save_link_context_menu_id: 22430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.download_context_menu_id: 22440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project onDownloadStartNoStream(url, null, null, null, -1); 22450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 22460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 22482694e23a55d5ca526fc29534a80a200e2c58698bBen Murdoch } 22490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case LOAD_URL: 225192472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins loadUrlFromContext(getTopWindow(), (String) msg.obj); 22520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 22530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case STOP_LOAD: 22550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project stopLoading(); 22560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 22570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case RELEASE_WAKELOCK: 22590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mWakeLock.isHeld()) { 22600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWakeLock.release(); 22615d0e02e646e46b14289168f75c2a8f6ed43cac54Grace Kloba // if we reach here, Browser should be still in the 22625d0e02e646e46b14289168f75c2a8f6ed43cac54Grace Kloba // background loading after WAKELOCK_TIMEOUT (5-min). 22635d0e02e646e46b14289168f75c2a8f6ed43cac54Grace Kloba // To avoid burning the battery, stop loading. 22645d0e02e646e46b14289168f75c2a8f6ed43cac54Grace Kloba mTabControl.stopAllLoading(); 22650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 22672694e23a55d5ca526fc29534a80a200e2c58698bBen Murdoch 22682694e23a55d5ca526fc29534a80a200e2c58698bBen Murdoch case UPDATE_BOOKMARK_THUMBNAIL: 22692694e23a55d5ca526fc29534a80a200e2c58698bBen Murdoch WebView view = (WebView) msg.obj; 22702694e23a55d5ca526fc29534a80a200e2c58698bBen Murdoch if (view != null) { 22712694e23a55d5ca526fc29534a80a200e2c58698bBen Murdoch updateScreenshot(view); 22722694e23a55d5ca526fc29534a80a200e2c58698bBen Murdoch } 22732694e23a55d5ca526fc29534a80a200e2c58698bBen Murdoch break; 22740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 22770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 227896afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins /** 227996afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins * Share a page, providing the title, url, favicon, and a screenshot. Uses 228096afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins * an {@link Intent} to launch the Activity chooser. 228196afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins * @param c Context used to launch a new Activity. 228296afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins * @param title Title of the page. Stored in the Intent with 228303e6d39560d7de359782485d4c863d600b34fb51Paul Westbrook * {@link Intent#EXTRA_SUBJECT} 228496afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins * @param url URL of the page. Stored in the Intent with 228596afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins * {@link Intent#EXTRA_TEXT} 228696afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins * @param favicon Bitmap of the favicon for the page. Stored in the Intent 228796afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins * with {@link Browser#EXTRA_SHARE_FAVICON} 228896afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins * @param screenshot Bitmap of a screenshot of the page. Stored in the 228996afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins * Intent with {@link Browser#EXTRA_SHARE_SCREENSHOT} 229096afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins */ 229196afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins public static final void sharePage(Context c, String title, String url, 229296afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins Bitmap favicon, Bitmap screenshot) { 229396afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins Intent send = new Intent(Intent.ACTION_SEND); 229496afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins send.setType("text/plain"); 229596afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins send.putExtra(Intent.EXTRA_TEXT, url); 229603e6d39560d7de359782485d4c863d600b34fb51Paul Westbrook send.putExtra(Intent.EXTRA_SUBJECT, title); 229796afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins send.putExtra(Browser.EXTRA_SHARE_FAVICON, favicon); 229896afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins send.putExtra(Browser.EXTRA_SHARE_SCREENSHOT, screenshot); 229996afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins try { 230096afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins c.startActivity(Intent.createChooser(send, c.getString( 230196afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins R.string.choosertitle_sharevia))); 230296afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins } catch(android.content.ActivityNotFoundException ex) { 230396afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins // if no app handles it, do nothing 230496afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins } 230596afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins } 230696afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins 230789c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins private void updateScreenshot(WebView view) { 230889c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins // If this is a bookmarked site, add a screenshot to the database. 230989c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins // FIXME: When should we update? Every time? 231089c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins // FIXME: Would like to make sure there is actually something to 231189c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins // draw, but the API for that (WebViewCore.pictureReady()) is not 231289c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins // currently accessible here. 2313aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch 23143918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott ContentResolver cr = getContentResolver(); 23153918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott final Cursor c = BrowserBookmarksAdapter.queryBookmarksForUrl( 2316aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch cr, view.getOriginalUrl(), view.getUrl(), true); 23173918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott if (c != null) { 231889c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins boolean succeed = c.moveToFirst(); 231989c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins ContentValues values = null; 232089c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins while (succeed) { 232189c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins if (values == null) { 232289c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins final ByteArrayOutputStream os 232389c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins = new ByteArrayOutputStream(); 2324dcc2b6f08dd5677bc6ba761a9ba6f1c655113051Ben Murdoch Bitmap bm = createScreenshot(view); 23254580057e772b60433272af5cd691825748892693Leon Scroggins if (bm == null) { 23264580057e772b60433272af5cd691825748892693Leon Scroggins c.close(); 23274580057e772b60433272af5cd691825748892693Leon Scroggins return; 23284580057e772b60433272af5cd691825748892693Leon Scroggins } 232989c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins bm.compress(Bitmap.CompressFormat.PNG, 100, os); 233089c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins values = new ContentValues(); 233189c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins values.put(Browser.BookmarkColumns.THUMBNAIL, 233289c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins os.toByteArray()); 233389c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins } 233489c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins cr.update(ContentUris.withAppendedId(Browser.BOOKMARKS_URI, 233589c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins c.getInt(0)), values, null, null); 233689c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins succeed = c.moveToNext(); 233789c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins } 233889c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins c.close(); 233989c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins } 234089c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins } 234189c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins 234206ec5f2d8735d1ba17b779deb0f8da032e0a62eaLeon Scroggins /** 2343f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins * Values for the size of the thumbnail created when taking a screenshot. 2344f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins * Lazily initialized. Instead of using these directly, use 2345f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins * getDesiredThumbnailWidth() or getDesiredThumbnailHeight(). 234606ec5f2d8735d1ba17b779deb0f8da032e0a62eaLeon Scroggins */ 2347f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins private static int THUMBNAIL_WIDTH = 0; 2348f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins private static int THUMBNAIL_HEIGHT = 0; 2349f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins 2350f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins /** 2351f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins * Return the desired width for thumbnail screenshots, which are stored in 2352f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins * the database, and used on the bookmarks screen. 2353f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins * @param context Context for finding out the density of the screen. 2354f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins * @return int desired width for thumbnail screenshot. 2355f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins */ 2356f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins /* package */ static int getDesiredThumbnailWidth(Context context) { 2357f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins if (THUMBNAIL_WIDTH == 0) { 2358f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins float density = context.getResources().getDisplayMetrics().density; 2359f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins THUMBNAIL_WIDTH = (int) (90 * density); 2360f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins THUMBNAIL_HEIGHT = (int) (80 * density); 2361f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins } 2362f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins return THUMBNAIL_WIDTH; 2363f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins } 2364f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins 2365f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins /** 2366f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins * Return the desired height for thumbnail screenshots, which are stored in 2367f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins * the database, and used on the bookmarks screen. 2368f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins * @param context Context for finding out the density of the screen. 2369f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins * @return int desired height for thumbnail screenshot. 2370f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins */ 2371f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins /* package */ static int getDesiredThumbnailHeight(Context context) { 2372f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins // To ensure that they are both initialized. 2373f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins getDesiredThumbnailWidth(context); 2374f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins return THUMBNAIL_HEIGHT; 2375f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins } 237606ec5f2d8735d1ba17b779deb0f8da032e0a62eaLeon Scroggins 2377dcc2b6f08dd5677bc6ba761a9ba6f1c655113051Ben Murdoch private Bitmap createScreenshot(WebView view) { 2378dcc2b6f08dd5677bc6ba761a9ba6f1c655113051Ben Murdoch Picture thumbnail = view.capturePicture(); 23794580057e772b60433272af5cd691825748892693Leon Scroggins if (thumbnail == null) { 23804580057e772b60433272af5cd691825748892693Leon Scroggins return null; 23814580057e772b60433272af5cd691825748892693Leon Scroggins } 2382f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins Bitmap bm = Bitmap.createBitmap(getDesiredThumbnailWidth(this), 2383ab168ba86162b4e89e74d0a077b9c618437cbce4Cary Clark getDesiredThumbnailHeight(this), Bitmap.Config.RGB_565); 2384dcc2b6f08dd5677bc6ba761a9ba6f1c655113051Ben Murdoch Canvas canvas = new Canvas(bm); 2385dcc2b6f08dd5677bc6ba761a9ba6f1c655113051Ben Murdoch // May need to tweak these values to determine what is the 2386dcc2b6f08dd5677bc6ba761a9ba6f1c655113051Ben Murdoch // best scale factor 23872694e23a55d5ca526fc29534a80a200e2c58698bBen Murdoch int thumbnailWidth = thumbnail.getWidth(); 2388ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch int thumbnailHeight = thumbnail.getHeight(); 2389ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch float scaleFactorX = 1.0f; 2390ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch float scaleFactorY = 1.0f; 23912694e23a55d5ca526fc29534a80a200e2c58698bBen Murdoch if (thumbnailWidth > 0) { 2392ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch scaleFactorX = (float) getDesiredThumbnailWidth(this) / 23932694e23a55d5ca526fc29534a80a200e2c58698bBen Murdoch (float)thumbnailWidth; 2394ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch } else { 2395ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch return null; 239606ec5f2d8735d1ba17b779deb0f8da032e0a62eaLeon Scroggins } 2397ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch 2398ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch if (view.getWidth() > view.getHeight() && 2399ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch thumbnailHeight < view.getHeight() && thumbnailHeight > 0) { 2400ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch // If the device is in landscape and the page is shorter 2401ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch // than the height of the view, stretch the thumbnail to fill the 2402ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch // space. 2403ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch scaleFactorY = (float) getDesiredThumbnailHeight(this) / 2404ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch (float)thumbnailHeight; 2405ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch } else { 2406ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch // In the portrait case, this looks nice. 2407ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch scaleFactorY = scaleFactorX; 2408ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch } 2409ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch 2410ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch canvas.scale(scaleFactorX, scaleFactorY); 2411ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch 2412dcc2b6f08dd5677bc6ba761a9ba6f1c655113051Ben Murdoch thumbnail.draw(canvas); 2413dcc2b6f08dd5677bc6ba761a9ba6f1c655113051Ben Murdoch return bm; 2414dcc2b6f08dd5677bc6ba761a9ba6f1c655113051Ben Murdoch } 2415dcc2b6f08dd5677bc6ba761a9ba6f1c655113051Ben Murdoch 24160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // ------------------------------------------------------------------------- 241722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Helper function for WebViewClient. 24180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //------------------------------------------------------------------------- 24190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 24200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Use in overrideUrlLoading 24210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ final static String SCHEME_WTAI = "wtai://wp/"; 24220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ final static String SCHEME_WTAI_MC = "wtai://wp/mc;"; 24230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ final static String SCHEME_WTAI_SD = "wtai://wp/sd;"; 24240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ final static String SCHEME_WTAI_AP = "wtai://wp/ap;"; 24250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 242692472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins // Keep this initial progress in sync with initialProgressValue (* 100) 242792472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins // in ProgressTracker.cpp 242892472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins private final static int INITIAL_PROGRESS = 10; 242992472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins 243022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba void onPageStarted(WebView view, String url, Bitmap favicon) { 243122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // when BrowserActivity just starts, onPageStarted may be called before 243222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // onResume as it is triggered from onCreate. Call resumeWebViewTimers 243322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // to start the timer. As we won't switch tabs while an activity is in 243422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // pause state, we can ensure calling resume and pause in pair. 243522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (mActivityInPause) resumeWebViewTimers(); 243622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba 243722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba resetLockIcon(url); 243822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba setUrlTitle(url, null); 243922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba setFavicon(favicon); 24408cf8f682e90f004d4b8028d2f5b74f72c0cf4e19Leon Scroggins // Show some progress so that the user knows the page is beginning to 24418cf8f682e90f004d4b8028d2f5b74f72c0cf4e19Leon Scroggins // load 244292472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins onProgressChanged(view, INITIAL_PROGRESS); 244322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mDidStopLoad = false; 244422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (!mIsNetworkUp) createAndShowNetworkDialog(); 24450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 244622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (mSettings.isTracing()) { 244722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba String host; 244822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba try { 244922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba WebAddress uri = new WebAddress(url); 245022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba host = uri.mHost; 245122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } catch (android.net.ParseException ex) { 245222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba host = "browser"; 245322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 245422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba host = host.replace('.', '_'); 245522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba host += ".trace"; 245622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mInTrace = true; 245722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Debug.startMethodTracing(host, 20 * 1024 * 1024); 245815525d48024d325c8a52766d8ca727191251a8d4Patrick Scott } 245915525d48024d325c8a52766d8ca727191251a8d4Patrick Scott 246022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Performance probe 246122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (false) { 246222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mStart = SystemClock.uptimeMillis(); 246322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mProcessStart = Process.getElapsedCpuTime(); 246422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba long[] sysCpu = new long[7]; 246522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (Process.readProcFile("/proc/stat", SYSTEM_CPU_FORMAT, null, 246622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba sysCpu, null)) { 246722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mUserStart = sysCpu[0] + sysCpu[1]; 246822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mSystemStart = sysCpu[2]; 246922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mIdleStart = sysCpu[3]; 247022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mIrqStart = sysCpu[4] + sysCpu[5] + sysCpu[6]; 247122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 247222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mUiStart = SystemClock.currentThreadTimeMillis(); 24730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 24750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 247622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba void onPageFinished(WebView view, String url) { 247722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Reset the title and icon in case we stopped a provisional load. 247822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba resetTitleAndIcon(view); 247922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Update the lock icon image only once we are done loading 248022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba updateLockIconToLatest(); 248122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // pause the WebView timer and release the wake lock if it is finished 248222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // while BrowserActivity is in pause state. 248322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (mActivityInPause && pauseWebViewTimers()) { 248422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (mWakeLock.isHeld()) { 248522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mHandler.removeMessages(RELEASE_WAKELOCK); 248622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mWakeLock.release(); 248722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 248822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 248922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba 249022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Performance probe 249122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (false) { 249222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba long[] sysCpu = new long[7]; 249322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (Process.readProcFile("/proc/stat", SYSTEM_CPU_FORMAT, null, 249422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba sysCpu, null)) { 249522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba String uiInfo = "UI thread used " 249622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba + (SystemClock.currentThreadTimeMillis() - mUiStart) 249722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba + " ms"; 249822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (LOGD_ENABLED) { 249922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Log.d(LOGTAG, uiInfo); 250022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 250122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba //The string that gets written to the log 250222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba String performanceString = "It took total " 250322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba + (SystemClock.uptimeMillis() - mStart) 250422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba + " ms clock time to load the page." 250522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba + "\nbrowser process used " 250622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba + (Process.getElapsedCpuTime() - mProcessStart) 250722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba + " ms, user processes used " 250822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba + (sysCpu[0] + sysCpu[1] - mUserStart) * 10 250922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba + " ms, kernel used " 251022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba + (sysCpu[2] - mSystemStart) * 10 251122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba + " ms, idle took " + (sysCpu[3] - mIdleStart) * 10 251222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba + " ms and irq took " 251322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba + (sysCpu[4] + sysCpu[5] + sysCpu[6] - mIrqStart) 251422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba * 10 + " ms, " + uiInfo; 251522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (LOGD_ENABLED) { 251622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Log.d(LOGTAG, performanceString + "\nWebpage: " + url); 25170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 251822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (url != null) { 251922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // strip the url to maintain consistency 252022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba String newUrl = new String(url); 252122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (newUrl.startsWith("http://www.")) { 252222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba newUrl = newUrl.substring(11); 252322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } else if (newUrl.startsWith("http://")) { 252422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba newUrl = newUrl.substring(7); 252522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } else if (newUrl.startsWith("https://www.")) { 252622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba newUrl = newUrl.substring(12); 252722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } else if (newUrl.startsWith("https://")) { 252822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba newUrl = newUrl.substring(8); 25290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 253031a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGD_ENABLED) { 253122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Log.d(LOGTAG, newUrl + " loaded"); 25320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 253522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 25360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 253722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (mInTrace) { 253822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mInTrace = false; 253922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Debug.stopMethodTracing(); 25400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 254122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 25420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 254322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba boolean shouldOverrideUrlLoading(WebView view, String url) { 254422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (url.startsWith(SCHEME_WTAI)) { 254522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // wtai://wp/mc;number 254622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // number=string(phone-number) 254722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (url.startsWith(SCHEME_WTAI_MC)) { 254822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Intent intent = new Intent(Intent.ACTION_VIEW, 254922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Uri.parse(WebView.SCHEME_TEL + 255022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba url.substring(SCHEME_WTAI_MC.length()))); 255122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba startActivity(intent); 255222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba return true; 25530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 255422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // wtai://wp/sd;dtmf 255522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // dtmf=string(dialstring) 255622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (url.startsWith(SCHEME_WTAI_SD)) { 255722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // TODO: only send when there is active voice connection 25589918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn return false; 25599918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn } 256022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // wtai://wp/ap;number;name 256122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // number=string(phone-number) 256222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // name=string 256322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (url.startsWith(SCHEME_WTAI_AP)) { 256422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // TODO 25650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 25660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 256922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // The "about:" schemes are internal to the browser; don't want these to 257022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // be dispatched to other apps. 257122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (url.startsWith("about:")) { 257222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba return false; 25730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 257522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Intent intent; 257622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // perform generic parsing of the URI to turn it into an Intent. 257722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba try { 257822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME); 257922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } catch (URISyntaxException ex) { 258022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Log.w("Browser", "Bad URI " + url + ": " + ex.getMessage()); 258122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba return false; 25820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 258422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // check whether the intent can be resolved. If not, we will see 258522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // whether we can download it from the Market. 258622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (getPackageManager().resolveActivity(intent, 0) == null) { 258722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba String packagename = intent.getPackage(); 258822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (packagename != null) { 258922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba intent = new Intent(Intent.ACTION_VIEW, Uri 259022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba .parse("market://search?q=pname:" + packagename)); 259122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba intent.addCategory(Intent.CATEGORY_BROWSABLE); 259222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba startActivity(intent); 259322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba return true; 25940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 25950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 25960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 259922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // sanitize the Intent, ensuring web pages can not bypass browser 260022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // security (only access to BROWSABLE activities). 260122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba intent.addCategory(Intent.CATEGORY_BROWSABLE); 260222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba intent.setComponent(null); 260322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba try { 260422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (startActivityIfNeeded(intent, -1)) { 26050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 26060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 260722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } catch (ActivityNotFoundException ex) { 260822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // ignore the error. If no application can handle the URL, 260922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // eg about:blank, assume the browser can handle it. 261022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 26110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 261222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (mMenuIsDown) { 261322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba openTab(url); 261422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba closeOptionsMenu(); 26150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 26160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 261722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba return false; 261822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 26190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 262022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // ------------------------------------------------------------------------- 262122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Helper function for WebChromeClient 262222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // ------------------------------------------------------------------------- 26230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 262422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba void onProgressChanged(WebView view, int newProgress) { 262522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mFakeTitleBar.setProgress(newProgress); 262622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba 262722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (newProgress == 100) { 262822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // onProgressChanged() may continue to be called after the main 262922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // frame has finished loading, as any remaining sub frames continue 263022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // to load. We'll only get called once though with newProgress as 263122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // 100 when everything is loaded. (onPageFinished is called once 263222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // when the main frame completes loading regardless of the state of 263322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // any sub frames so calls to onProgressChanges may continue after 263422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // onPageFinished has executed) 263522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (mInLoad) { 263622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mInLoad = false; 2637a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins updateInLoadMenuItems(); 263822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // If the options menu is open, leave the title bar 263922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (!mOptionsMenuOpen || !mIconView) { 264022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba hideFakeTitleBar(); 26410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2643aa37e7fdb52d0180b8eea25d53950c5c0791f968Leon Scroggins } else { 2644aa37e7fdb52d0180b8eea25d53950c5c0791f968Leon Scroggins if (!mInLoad) { 2645aa37e7fdb52d0180b8eea25d53950c5c0791f968Leon Scroggins // onPageFinished may have already been called but a subframe is 2646aa37e7fdb52d0180b8eea25d53950c5c0791f968Leon Scroggins // still loading and updating the progress. Reset mInLoad and 2647aa37e7fdb52d0180b8eea25d53950c5c0791f968Leon Scroggins // update the menu items. 2648aa37e7fdb52d0180b8eea25d53950c5c0791f968Leon Scroggins mInLoad = true; 2649aa37e7fdb52d0180b8eea25d53950c5c0791f968Leon Scroggins updateInLoadMenuItems(); 2650aa37e7fdb52d0180b8eea25d53950c5c0791f968Leon Scroggins } 2651aa37e7fdb52d0180b8eea25d53950c5c0791f968Leon Scroggins // When the page first begins to load, the Activity may still be 2652aa37e7fdb52d0180b8eea25d53950c5c0791f968Leon Scroggins // paused, in which case showFakeTitleBar will do nothing. Call 2653aa37e7fdb52d0180b8eea25d53950c5c0791f968Leon Scroggins // again as the page continues to load so that it will be shown. 2654aa37e7fdb52d0180b8eea25d53950c5c0791f968Leon Scroggins // (Calling it will the fake title bar is already showing will also 2655aa37e7fdb52d0180b8eea25d53950c5c0791f968Leon Scroggins // do nothing. 265622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (!mOptionsMenuOpen || mIconView) { 265722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // This page has begun to load, so show the title bar 265822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba showFakeTitleBar(); 26593918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 26600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 266122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 2662092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdoch 266322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback) { 26648ff57db0a8dc8eb659fbcdcd4a856208609e6070Derek Sollenberger // if a view already exists then immediately terminate the new one 26658ff57db0a8dc8eb659fbcdcd4a856208609e6070Derek Sollenberger if (mCustomView != null) { 26668ff57db0a8dc8eb659fbcdcd4a856208609e6070Derek Sollenberger callback.onCustomViewHidden(); 266722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba return; 26688ff57db0a8dc8eb659fbcdcd4a856208609e6070Derek Sollenberger } 26692bc69918d97a767a02132090e58718077381ba1aSteve Block 267022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Add the custom view to its container. 267122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mCustomViewContainer.addView(view, COVER_SCREEN_GRAVITY_CENTER); 267222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mCustomView = view; 267322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mCustomViewCallback = callback; 267422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Save the menu state and set it to empty while the custom 267522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // view is showing. 267622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mOldMenuState = mMenuState; 267722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mMenuState = EMPTY_MENU; 267822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Hide the content view. 267922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mContentView.setVisibility(View.GONE); 268022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Finally show the custom view container. 2681163ab74e2f85b53a1a374c49677073fb64d35f28Andrei Popescu setStatusBarVisibility(false); 268222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mCustomViewContainer.setVisibility(View.VISIBLE); 268322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mCustomViewContainer.bringToFront(); 268422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 268522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba 268622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba void onHideCustomView() { 268722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (mCustomView == null) 268822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba return; 26892bc69918d97a767a02132090e58718077381ba1aSteve Block 269022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Hide the custom view. 269122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mCustomView.setVisibility(View.GONE); 269222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Remove the custom view from its container. 269322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mCustomViewContainer.removeView(mCustomView); 269422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mCustomView = null; 269522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Reset the old menu state. 269622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mMenuState = mOldMenuState; 269722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mOldMenuState = EMPTY_MENU; 269822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mCustomViewContainer.setVisibility(View.GONE); 269922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mCustomViewCallback.onCustomViewHidden(); 270022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Show the content view. 2701163ab74e2f85b53a1a374c49677073fb64d35f28Andrei Popescu setStatusBarVisibility(true); 270222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mContentView.setVisibility(View.VISIBLE); 270322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 2704540035dfd1347c78eeec10ec0847e18fcc50ef36Andrei Popescu 270522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Bitmap getDefaultVideoPoster() { 270622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (mDefaultVideoPoster == null) { 270722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mDefaultVideoPoster = BitmapFactory.decodeResource( 270822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba getResources(), R.drawable.default_video_poster); 2709540035dfd1347c78eeec10ec0847e18fcc50ef36Andrei Popescu } 271022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba return mDefaultVideoPoster; 271122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 2712540035dfd1347c78eeec10ec0847e18fcc50ef36Andrei Popescu 271322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba View getVideoLoadingProgressView() { 271422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (mVideoProgressView == null) { 271522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba LayoutInflater inflater = LayoutInflater.from(BrowserActivity.this); 271622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mVideoProgressView = inflater.inflate( 271722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba R.layout.video_loading_progress, null); 2718540035dfd1347c78eeec10ec0847e18fcc50ef36Andrei Popescu } 271922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba return mVideoProgressView; 272022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 27210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 27228d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins /* 27238d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins * The Object used to inform the WebView of the file to upload. 27248d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins */ 27258d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins private ValueCallback<Uri> mUploadMessage; 27268d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins 272722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba void openFileChooser(ValueCallback<Uri> uploadMsg) { 272822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (mUploadMessage != null) return; 272922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mUploadMessage = uploadMsg; 273022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Intent i = new Intent(Intent.ACTION_GET_CONTENT); 273122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba i.addCategory(Intent.CATEGORY_OPENABLE); 273222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba i.setType("*/*"); 273322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba BrowserActivity.this.startActivityForResult(Intent.createChooser(i, 273422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba getString(R.string.choose_upload)), FILE_SELECTED); 273522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 273622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba 273722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // ------------------------------------------------------------------------- 273822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Implement functions for DownloadListener 273922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // ------------------------------------------------------------------------- 274022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba 27410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 27420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Notify the host application a download should be done, or that 27430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * the data should be streamed if a streaming viewer is available. 27440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param url The full url to the content that should be downloaded 27450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param contentDisposition Content-disposition http header, if 27460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * present. 27470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param mimetype The mimetype of the content reported by the server 27480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param contentLength The file size reported by the server 27490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 27500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onDownloadStart(String url, String userAgent, 27510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String contentDisposition, String mimetype, long contentLength) { 27520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we're dealing wih A/V content that's not explicitly marked 27530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // for download, check if it's streamable. 27540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (contentDisposition == null 2755e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott || !contentDisposition.regionMatches( 2756e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott true, 0, "attachment", 0, 10)) { 27570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // query the package manager to see if there's a registered handler 27580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // that matches. 27590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent = new Intent(Intent.ACTION_VIEW); 27600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.setDataAndType(Uri.parse(url), mimetype); 2761e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott ResolveInfo info = getPackageManager().resolveActivity(intent, 2762e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott PackageManager.MATCH_DEFAULT_ONLY); 2763e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott if (info != null) { 2764e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott ComponentName myName = getComponentName(); 2765e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott // If we resolved to ourselves, we don't want to attempt to 2766e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott // load the url only to try and download it again. 2767e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott if (!myName.getPackageName().equals( 2768e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott info.activityInfo.packageName) 2769e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott || !myName.getClassName().equals( 2770e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott info.activityInfo.name)) { 2771e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott // someone (other than us) knows how to handle this mime 2772e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott // type with this scheme, don't download. 2773e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott try { 2774e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott startActivity(intent); 2775e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott return; 2776e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott } catch (ActivityNotFoundException ex) { 2777e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott if (LOGD_ENABLED) { 2778e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott Log.d(LOGTAG, "activity not found for " + mimetype 2779e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott + " over " + Uri.parse(url).getScheme(), 2780e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott ex); 2781e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott } 2782e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott // Best behavior is to fall back to a download in this 2783e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott // case 27840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project onDownloadStartNoStream(url, userAgent, contentDisposition, mimetype, contentLength); 27890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2791fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen // This is to work around the fact that java.net.URI throws Exceptions 2792fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen // instead of just encoding URL's properly 2793fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen // Helper method for onDownloadStartNoStream 2794fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen private static String encodePath(String path) { 2795fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen char[] chars = path.toCharArray(); 2796fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen 2797fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen boolean needed = false; 2798fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen for (char c : chars) { 2799fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen if (c == '[' || c == ']') { 2800fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen needed = true; 2801fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen break; 2802fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen } 2803fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen } 2804fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen if (needed == false) { 2805fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen return path; 2806fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen } 2807fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen 2808fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen StringBuilder sb = new StringBuilder(""); 2809fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen for (char c : chars) { 2810fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen if (c == '[' || c == ']') { 2811fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen sb.append('%'); 2812fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen sb.append(Integer.toHexString(c)); 2813fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen } else { 2814fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen sb.append(c); 2815fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen } 2816fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen } 2817fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen 2818fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen return sb.toString(); 2819fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen } 2820fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen 28210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 28220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Notify the host application a download should be done, even if there 28230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * is a streaming viewer available for thise type. 28240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param url The full url to the content that should be downloaded 28250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param contentDisposition Content-disposition http header, if 28260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * present. 28270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param mimetype The mimetype of the content reported by the server 28280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param contentLength The file size reported by the server 28290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 28300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /*package */ void onDownloadStartNoStream(String url, String userAgent, 28310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String contentDisposition, String mimetype, long contentLength) { 28320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 28330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String filename = URLUtil.guessFileName(url, 28340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project contentDisposition, mimetype); 28350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 28360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Check to see if we have an SDCard 28370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String status = Environment.getExternalStorageState(); 28380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!status.equals(Environment.MEDIA_MOUNTED)) { 28390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int title; 28400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String msg; 28410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 28420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Check to see if the SDCard is busy, same as the music app 28430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (status.equals(Environment.MEDIA_SHARED)) { 28440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project msg = getString(R.string.download_sdcard_busy_dlg_msg); 28450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = R.string.download_sdcard_busy_dlg_title; 28460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 28470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project msg = getString(R.string.download_no_sdcard_dlg_msg, filename); 28480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = R.string.download_no_sdcard_dlg_title; 28490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 28510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(this) 28520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(title) 28530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setIcon(android.R.drawable.ic_dialog_alert) 28540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setMessage(msg) 28550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, null) 28560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 28570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 28580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2860fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen // java.net.URI is a lot stricter than KURL so we have to encode some 2861fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen // extra characters. Fix for b 2538060 and b 1634719 2862fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen WebAddress webAddress; 28630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 2864fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen webAddress = new WebAddress(url); 2865fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen webAddress.mPath = encodePath(webAddress.mPath); 28660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (Exception e) { 2867fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen // This only happens for very bad urls, we want to chatch the 2868fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen // exception here 2869fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen Log.e(LOGTAG, "Exception trying to parse url:" + url); 28700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 28710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 28730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // XXX: Have to use the old url since the cookies were stored using the 28740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // old percent-encoded url. 28750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String cookies = CookieManager.getInstance().getCookie(url); 28760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 28770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ContentValues values = new ContentValues(); 2878fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen values.put(Downloads.Impl.COLUMN_URI, webAddress.toString()); 28791e5bad97ca8fb9b12501f4f747941d02f03e1362Jean-Baptiste Queru values.put(Downloads.Impl.COLUMN_COOKIE_DATA, cookies); 28801e5bad97ca8fb9b12501f4f747941d02f03e1362Jean-Baptiste Queru values.put(Downloads.Impl.COLUMN_USER_AGENT, userAgent); 28811e5bad97ca8fb9b12501f4f747941d02f03e1362Jean-Baptiste Queru values.put(Downloads.Impl.COLUMN_NOTIFICATION_PACKAGE, 28820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getPackageName()); 28831e5bad97ca8fb9b12501f4f747941d02f03e1362Jean-Baptiste Queru values.put(Downloads.Impl.COLUMN_NOTIFICATION_CLASS, 28840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserDownloadPage.class.getCanonicalName()); 28851e5bad97ca8fb9b12501f4f747941d02f03e1362Jean-Baptiste Queru values.put(Downloads.Impl.COLUMN_VISIBILITY, 28861e5bad97ca8fb9b12501f4f747941d02f03e1362Jean-Baptiste Queru Downloads.Impl.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 28871e5bad97ca8fb9b12501f4f747941d02f03e1362Jean-Baptiste Queru values.put(Downloads.Impl.COLUMN_MIME_TYPE, mimetype); 28881e5bad97ca8fb9b12501f4f747941d02f03e1362Jean-Baptiste Queru values.put(Downloads.Impl.COLUMN_FILE_NAME_HINT, filename); 2889fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen values.put(Downloads.Impl.COLUMN_DESCRIPTION, webAddress.mHost); 28900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (contentLength > 0) { 28911e5bad97ca8fb9b12501f4f747941d02f03e1362Jean-Baptiste Queru values.put(Downloads.Impl.COLUMN_TOTAL_BYTES, contentLength); 28920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mimetype == null) { 28940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // We must have long pressed on a link or image to download it. We 28950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // are not sure of the mimetype in this case, so do a head request 28960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new FetchUrlMimeType(this).execute(values); 28970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 28980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Uri contentUri = 28991e5bad97ca8fb9b12501f4f747941d02f03e1362Jean-Baptiste Queru getContentResolver().insert(Downloads.Impl.CONTENT_URI, values); 29000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29019191a7f745c965cf57df94d0628890b413c710c9Leon Scroggins Toast.makeText(this, R.string.download_pending, Toast.LENGTH_SHORT) 29029191a7f745c965cf57df94d0628890b413c710c9Leon Scroggins .show(); 29030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 290522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // ------------------------------------------------------------------------- 290622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba 29070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 29080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Resets the lock icon. This method is called when we start a new load and 29090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * know the url to be loaded. 29100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 29110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void resetLockIcon(String url) { 29120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Save the lock-icon state (we revert to it if the load gets cancelled) 291322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mTabControl.getCurrentTab().resetLockIcon(url); 29140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project updateLockIconImage(LOCK_ICON_UNSECURE); 29150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 29183bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * Update the lock icon to correspond to our latest state. 29193bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins */ 292022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba private void updateLockIconToLatest() { 292122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba updateLockIconImage(mTabControl.getCurrentTab().getLockIconType()); 29223bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } 29233bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins 29243bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins /** 29250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Updates the lock-icon image in the title-bar. 29260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 29270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void updateLockIconImage(int lockIconType) { 29280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Drawable d = null; 29290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (lockIconType == LOCK_ICON_SECURE) { 29300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project d = mSecLockIcon; 29310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (lockIconType == LOCK_ICON_MIXED) { 29320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project d = mMixLockIcon; 29330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 293468579393973f745fc65a2781061af9bb8f2d7020Leon Scroggins mTitleBar.setLock(d); 2935fe87bd3a3897e4bad65bb3d284659ae2f4e57570Leon Scroggins mFakeTitleBar.setLock(d); 29360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 29390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Displays a page-info dialog. 29400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param tab The tab to show info about 29410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param fromShowSSLCertificateOnError The flag that indicates whether 29420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * this dialog was opened from the SSL-certificate-on-error dialog or 29430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * not. This is important, since we need to know whether to return to 29440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * the parent dialog or simply dismiss. 29450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 294622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba private void showPageInfo(final Tab tab, 29470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final boolean fromShowSSLCertificateOnError) { 29480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final LayoutInflater factory = LayoutInflater 29490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .from(this); 29500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final View pageInfoView = factory.inflate(R.layout.page_info, null); 29520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView view = tab.getWebView(); 29540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String url = null; 29560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String title = null; 29570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (view == null) { 29590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = tab.getUrl(); 29600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = tab.getTitle(); 29610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (view == mTabControl.getCurrentWebView()) { 29620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Use the cached title and url if this is the current WebView 29630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = mUrl; 29640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = mTitle; 29650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 29660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = view.getUrl(); 29670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = view.getTitle(); 29680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url == null) { 29710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = ""; 29720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (title == null) { 29740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = ""; 29750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 29760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) pageInfoView.findViewById(R.id.address)).setText(url); 29780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) pageInfoView.findViewById(R.id.title)).setText(title); 29790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoView = tab; 2981c7b92f811dfa3572578ddc6714c98a03936d9ce5Leon Scroggins mPageInfoFromShowSSLCertificateOnError = fromShowSSLCertificateOnError; 29820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project AlertDialog.Builder alertDialogBuilder = 29840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(this) 29850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.page_info).setIcon(android.R.drawable.ic_dialog_info) 29860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setView(pageInfoView) 29870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton( 29880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.string.ok, 29890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 29900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 29910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 29920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoDialog = null; 29930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoView = null; 29940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we came here from the SSL error dialog 29960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (fromShowSSLCertificateOnError) { 29970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // go back to the SSL error dialog 29980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificateOnError( 29990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView, 30000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler, 30010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError); 30020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 30050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setOnCancelListener( 30060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnCancelListener() { 30070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCancel(DialogInterface dialog) { 30080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoDialog = null; 30090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoView = null; 30100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 30110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we came here from the SSL error dialog 30120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (fromShowSSLCertificateOnError) { 30130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // go back to the SSL error dialog 30140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificateOnError( 30150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView, 30160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler, 30170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError); 30180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }); 30210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 30220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we have a main top-level page SSL certificate set or a certificate 30230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // error 30240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (fromShowSSLCertificateOnError || 30250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (view != null && view.getCertificate() != null)) { 30260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // add a 'View Certificate' button 30270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project alertDialogBuilder.setNeutralButton( 30280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.string.view_certificate, 30290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 30300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 30310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 30320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoDialog = null; 30330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoView = null; 30340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 30350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we came here from the SSL error dialog 30360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (fromShowSSLCertificateOnError) { 30370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // go back to the SSL error dialog 30380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificateOnError( 30390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView, 30400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler, 30410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError); 30420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 30430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // otherwise, display the top-most certificate from 30440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the chain 30450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (view.getCertificate() != null) { 30460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificate(tab); 30470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }); 30510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 30530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoDialog = alertDialogBuilder.show(); 30540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 30560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 30570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Displays the main top-level page SSL certificate dialog 30580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * (accessible from the Page-Info dialog). 30590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param tab The tab to show certificate for. 30600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 306122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba private void showSSLCertificate(final Tab tab) { 30620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final View certificateView = 30630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inflateCertificateView(tab.getWebView().getCertificate()); 30640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (certificateView == null) { 30650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 30660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 30680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LayoutInflater factory = LayoutInflater.from(this); 30690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 30700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final LinearLayout placeholder = 30710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (LinearLayout)certificateView.findViewById(R.id.placeholder); 30720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 30730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout) factory.inflate( 30740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.layout.ssl_success, placeholder); 30750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.success)) 30760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_certificate_is_valid); 30770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 30780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateView = tab; 30790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateDialog = 30800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(this) 30810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.ssl_certificate).setIcon( 30820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.drawable.ic_dialog_browser_certificate_secure) 30830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setView(certificateView) 30840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, 30850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 30860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 30870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 30880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateDialog = null; 30890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateView = null; 30900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 30910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showPageInfo(tab, false); 30920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 30940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setOnCancelListener( 30950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnCancelListener() { 30960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCancel(DialogInterface dialog) { 30970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateDialog = null; 30980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateView = null; 30990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showPageInfo(tab, false); 31010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 31030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 31040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 31070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Displays the SSL error certificate dialog. 31080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param view The target web-view. 31090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param handler The SSL error handler responsible for cancelling the 31100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * connection that resulted in an SSL error or proceeding per user request. 31110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param error The SSL error object. 31120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 311322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba void showSSLCertificateOnError( 31140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView view, final SslErrorHandler handler, final SslError error) { 31150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final View certificateView = 31170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inflateCertificateView(error.getCertificate()); 31180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (certificateView == null) { 31190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 31200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LayoutInflater factory = LayoutInflater.from(this); 31230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final LinearLayout placeholder = 31250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (LinearLayout)certificateView.findViewById(R.id.placeholder); 31260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_UNTRUSTED)) { 31280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 31290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, placeholder); 31300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 31310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_untrusted); 31320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_IDMISMATCH)) { 31350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 31360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, placeholder); 31370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 31380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_mismatch); 31390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_EXPIRED)) { 31420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 31430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, placeholder); 31440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 31450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_expired); 31460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_NOTYETVALID)) { 31490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 31500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, placeholder); 31510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 31520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_not_yet_valid); 31530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler = handler; 31560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView = view; 31570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError = error; 31580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorDialog = 31590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(this) 31600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.ssl_certificate).setIcon( 31610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.drawable.ic_dialog_browser_certificate_partially_secure) 31620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setView(certificateView) 31630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, 31640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 31650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 31660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 31670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorDialog = null; 31680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView = null; 31690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler = null; 31700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError = null; 31710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 317222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba view.getWebViewClient().onReceivedSslError( 317322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba view, handler, error); 31740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 31760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setNeutralButton(R.string.page_info_view, 31770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 31780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 31790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 31800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorDialog = null; 31810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // do not clear the dialog state: we will 31830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // need to show the dialog again once the 31840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // user is done exploring the page-info details 31850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showPageInfo(mTabControl.getTabFromView(view), 31870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project true); 31880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 31900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setOnCancelListener( 31910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnCancelListener() { 31920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCancel(DialogInterface dialog) { 31930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorDialog = null; 31940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView = null; 31950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler = null; 31960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError = null; 31970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 319822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba view.getWebViewClient().onReceivedSslError( 319922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba view, handler, error); 32000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 32020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 32030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 32060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Inflates the SSL certificate view (helper method). 32070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param certificate The SSL certificate. 32080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @return The resultant certificate view with issued-to, issued-by, 32090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * issued-on, expires-on, and possibly other fields set. 32100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * If the input certificate is null, returns null. 32110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 32120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private View inflateCertificateView(SslCertificate certificate) { 32130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (certificate == null) { 32140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return null; 32150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LayoutInflater factory = LayoutInflater.from(this); 32180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project View certificateView = factory.inflate( 32200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.layout.ssl_certificate, null); 32210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // issued to: 32230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project SslCertificate.DName issuedTo = certificate.getIssuedTo(); 32240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (issuedTo != null) { 32250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.to_common)) 32260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedTo.getCName()); 32270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.to_org)) 32280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedTo.getOName()); 32290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.to_org_unit)) 32300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedTo.getUName()); 32310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // issued by: 32340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project SslCertificate.DName issuedBy = certificate.getIssuedBy(); 32350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (issuedBy != null) { 32360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.by_common)) 32370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedBy.getCName()); 32380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.by_org)) 32390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedBy.getOName()); 32400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.by_org_unit)) 32410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedBy.getUName()); 32420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // issued on: 324595a2e4ab94514e4e41033b0d27a0e66855cff8ebBrian Carlstrom String issuedOn = formatCertificateDate( 324695a2e4ab94514e4e41033b0d27a0e66855cff8ebBrian Carlstrom certificate.getValidNotBeforeDate()); 32470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.issued_on)) 32480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedOn); 32490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // expires on: 325195a2e4ab94514e4e41033b0d27a0e66855cff8ebBrian Carlstrom String expiresOn = formatCertificateDate( 325295a2e4ab94514e4e41033b0d27a0e66855cff8ebBrian Carlstrom certificate.getValidNotAfterDate()); 32530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.expires_on)) 32540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(expiresOn); 32550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return certificateView; 32570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 326095a2e4ab94514e4e41033b0d27a0e66855cff8ebBrian Carlstrom * Formats the certificate date to a properly localized date string. 32610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @return Properly localized version of the certificate date string and 326295a2e4ab94514e4e41033b0d27a0e66855cff8ebBrian Carlstrom * the "" if it fails to localize. 32630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 326495a2e4ab94514e4e41033b0d27a0e66855cff8ebBrian Carlstrom private String formatCertificateDate(Date certificateDate) { 326595a2e4ab94514e4e41033b0d27a0e66855cff8ebBrian Carlstrom if (certificateDate == null) { 326695a2e4ab94514e4e41033b0d27a0e66855cff8ebBrian Carlstrom return ""; 32670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 326895a2e4ab94514e4e41033b0d27a0e66855cff8ebBrian Carlstrom String formattedDate = DateFormat.getDateFormat(this).format(certificateDate); 326995a2e4ab94514e4e41033b0d27a0e66855cff8ebBrian Carlstrom if (formattedDate == null) { 327095a2e4ab94514e4e41033b0d27a0e66855cff8ebBrian Carlstrom return ""; 327195a2e4ab94514e4e41033b0d27a0e66855cff8ebBrian Carlstrom } 327295a2e4ab94514e4e41033b0d27a0e66855cff8ebBrian Carlstrom return formattedDate; 32730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 32760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Displays an http-authentication dialog. 32770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 327822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba void showHttpAuthentication(final HttpAuthHandler handler, 32790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final String host, final String realm, final String title, 32800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final String name, final String password, int focusId) { 32810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LayoutInflater factory = LayoutInflater.from(this); 32820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final View v = factory 32830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.http_authentication, null); 32840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (name != null) { 32850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((EditText) v.findViewById(R.id.username_edit)).setText(name); 32860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (password != null) { 32880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((EditText) v.findViewById(R.id.password_edit)).setText(password); 32890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String titleText = title; 32920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (titleText == null) { 32930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project titleText = getText(R.string.sign_in_to).toString().replace( 32940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "%s1", host).replace("%s2", realm); 32950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthHandler = handler; 32980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project AlertDialog dialog = new AlertDialog.Builder(this) 32990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(titleText) 33000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setIcon(android.R.drawable.ic_dialog_alert) 33010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setView(v) 33020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.action, 33030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 33040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 33050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 33060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String nm = ((EditText) v 33070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .findViewById(R.id.username_edit)) 33080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .getText().toString(); 33090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String pw = ((EditText) v 33100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .findViewById(R.id.password_edit)) 33110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .getText().toString(); 33120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserActivity.this.setHttpAuthUsernamePassword 33130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (host, realm, nm, pw); 33140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.proceed(nm, pw); 33150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthenticationDialog = null; 33160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthHandler = null; 33170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 33180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setNegativeButton(R.string.cancel, 33190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 33200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 33210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 33220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.cancel(); 33230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserActivity.this.resetTitleAndRevertLockIcon(); 33240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthenticationDialog = null; 33250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthHandler = null; 33260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 33270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setOnCancelListener(new DialogInterface.OnCancelListener() { 33280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCancel(DialogInterface dialog) { 33290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project handler.cancel(); 33300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserActivity.this.resetTitleAndRevertLockIcon(); 33310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthenticationDialog = null; 33320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthHandler = null; 33330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }}) 33340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .create(); 33350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Make the IME appear when the dialog is displayed if applicable. 33360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dialog.getWindow().setSoftInputMode( 33370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); 33380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dialog.show(); 33390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (focusId != 0) { 33400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dialog.findViewById(focusId).requestFocus(); 33410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 33420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project v.findViewById(R.id.username_edit).requestFocus(); 33430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHttpAuthenticationDialog = dialog; 33450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public int getProgress() { 33480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = mTabControl.getCurrentWebView(); 33490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 33500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return w.getProgress(); 33510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 33520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return 100; 33530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 33570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Set HTTP authentication password. 33580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 33590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param host The host for the password 33600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param realm The realm for the password 33610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param username The username for the password. If it is null, it means 33620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * password can't be saved. 33630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param password The password 33640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 33650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void setHttpAuthUsernamePassword(String host, String realm, 33660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String username, 33670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String password) { 336895a53b25504f12c3a5f8ecbbfcff7ac1dc047e4fSteve Block WebView w = getTopWindow(); 33690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 33700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.setHttpAuthUsernamePassword(host, realm, username, password); 33710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 33750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * connectivity manager says net has come or gone... inform the user 33760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param up true if net has come up, false if net has gone down 33770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 33780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onNetworkToggle(boolean up) { 33790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (up == mIsNetworkUp) { 33800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 33810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (up) { 33820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mIsNetworkUp = true; 33830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mAlertDialog != null) { 33840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mAlertDialog.cancel(); 33850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mAlertDialog = null; 33860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 33880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mIsNetworkUp = false; 3389eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott if (mInLoad) { 3390eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott createAndShowNetworkDialog(); 3391eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott } 33920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = mTabControl.getCurrentWebView(); 33940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 33950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.setNetworkAvailable(up); 33960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 339922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba boolean isNetworkUp() { 340022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba return mIsNetworkUp; 340122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 340222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba 3403eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott // This method shows the network dialog alerting the user that the net is 3404eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott // down. It will only show the dialog if mAlertDialog is null. 3405eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott private void createAndShowNetworkDialog() { 3406eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott if (mAlertDialog == null) { 3407eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott mAlertDialog = new AlertDialog.Builder(this) 3408eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott .setTitle(R.string.loadSuspendedTitle) 3409eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott .setMessage(R.string.loadSuspended) 3410eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott .setPositiveButton(R.string.ok, null) 3411eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott .show(); 3412eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott } 3413eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott } 3414eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott 34150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 34160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project protected void onActivityResult(int requestCode, int resultCode, 34170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent) { 3418bb394f3e134b6e5898ef7ae861b75e95e618688fGrace Kloba if (getTopWindow() == null) return; 3419bb394f3e134b6e5898ef7ae861b75e95e618688fGrace Kloba 34200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (requestCode) { 34210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case COMBO_PAGE: 34220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (resultCode == RESULT_OK && intent != null) { 34230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String data = intent.getAction(); 34240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Bundle extras = intent.getExtras(); 34250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (extras != null && extras.getBoolean("new_window", false)) { 342625d3547e0df084f963e38c6a93c99b02bd619de3Leon Scroggins openTab(data); 34270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 342822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba final Tab currentTab = 34290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.getCurrentTab(); 34301f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins dismissSubWindow(currentTab); 34311f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (data != null && data.length() != 0) { 343292472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins loadUrl(getTopWindow(), data); 34330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3436fde9746ac3055848e110c35f19ec5893c621f766Leon Scroggins // Deliberately fall through to PREFERENCES_PAGE, since the 3437fde9746ac3055848e110c35f19ec5893c621f766Leon Scroggins // same extra may be attached to the COMBO_PAGE 3438fde9746ac3055848e110c35f19ec5893c621f766Leon Scroggins case PREFERENCES_PAGE: 3439fde9746ac3055848e110c35f19ec5893c621f766Leon Scroggins if (resultCode == RESULT_OK && intent != null) { 3440fde9746ac3055848e110c35f19ec5893c621f766Leon Scroggins String action = intent.getStringExtra(Intent.EXTRA_TEXT); 3441fde9746ac3055848e110c35f19ec5893c621f766Leon Scroggins if (BrowserSettings.PREF_CLEAR_HISTORY.equals(action)) { 3442fde9746ac3055848e110c35f19ec5893c621f766Leon Scroggins mTabControl.removeParentChildRelationShips(); 3443fde9746ac3055848e110c35f19ec5893c621f766Leon Scroggins } 3444fde9746ac3055848e110c35f19ec5893c621f766Leon Scroggins } 34450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 34468d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins // Choose a file from the file picker. 34478d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins case FILE_SELECTED: 34488d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins if (null == mUploadMessage) break; 34498d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins Uri result = intent == null || resultCode != RESULT_OK ? null 34508d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins : intent.getData(); 34518d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins mUploadMessage.onReceiveValue(result); 34528d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins mUploadMessage = null; 34538d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins break; 34540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project default: 34550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 34560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3457304442375719effd41dbd53ae62de7a8d0cec7d9Leon Scroggins getTopWindow().requestFocus(); 34580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* 34610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * This method is called as a result of the user selecting the options 3462f08809b2cf7e502fef5965691a7fb6d7cf0322afLeon Scroggins * menu to see the download window. It shows the download window on top of 3463f08809b2cf7e502fef5965691a7fb6d7cf0322afLeon Scroggins * the current window. 34640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 3465f08809b2cf7e502fef5965691a7fb6d7cf0322afLeon Scroggins private void viewDownloads(Uri downloadRecord) { 34660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent = new Intent(this, 34670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserDownloadPage.class); 34680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.setData(downloadRecord); 346922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba startActivityForResult(intent, BrowserActivity.DOWNLOAD_PAGE); 34700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3473160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins /** 3474160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * Open the Go page. 3475160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * @param startWithHistory If true, open starting on the history tab. 3476160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * Otherwise, start with the bookmarks tab. 3477160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins */ 3478304442375719effd41dbd53ae62de7a8d0cec7d9Leon Scroggins /* package */ void bookmarksOrHistoryPicker(boolean startWithHistory) { 34790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView current = mTabControl.getCurrentWebView(); 34800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current == null) { 34810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 34820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent = new Intent(this, 34840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project CombinedBookmarkHistoryActivity.class); 34850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String title = current.getTitle(); 34860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String url = current.getUrl(); 3487dcc2b6f08dd5677bc6ba761a9ba6f1c655113051Ben Murdoch Bitmap thumbnail = createScreenshot(current); 3488dcc2b6f08dd5677bc6ba761a9ba6f1c655113051Ben Murdoch 34890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Just in case the user opens bookmarks before a page finishes loading 34900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // so the current history item, and therefore the page, is null. 34910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (null == url) { 34920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = mLastEnteredUrl; 34930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // This can happen. 34940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (null == url) { 34950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = mSettings.getHomePage(); 34960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // In case the web page has not yet received its associated title. 34990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (title == null) { 35000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = url; 35010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.putExtra("title", title); 35030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.putExtra("url", url); 3504dcc2b6f08dd5677bc6ba761a9ba6f1c655113051Ben Murdoch intent.putExtra("thumbnail", thumbnail); 3505304442375719effd41dbd53ae62de7a8d0cec7d9Leon Scroggins // Disable opening in a new window if we have maxed out the windows 350622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba intent.putExtra("disable_new_window", !mTabControl.canCreateNewTab()); 35073918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott intent.putExtra("touch_icon_url", current.getTouchIconUrl()); 35080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (startWithHistory) { 35090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.putExtra(CombinedBookmarkHistoryActivity.STARTING_TAB, 35100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project CombinedBookmarkHistoryActivity.HISTORY_TAB); 35110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project startActivityForResult(intent, COMBO_PAGE); 35130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Called when loading from context menu or LOAD_URL message 351692472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins private void loadUrlFromContext(WebView view, String url) { 35170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // In case the user enters nothing. 35180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null && url.length() != 0 && view != null) { 35190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = smartUrlFilter(url); 352022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (!view.getWebViewClient().shouldOverrideUrlLoading(view, url)) { 352192472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins loadUrl(view, url); 35220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 352692472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins /** 352792472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * Load the URL into the given WebView and update the title bar 352892472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * to reflect the new load. Call this instead of WebView.loadUrl 352992472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * directly. 353092472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * @param view The WebView used to load url. 353192472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * @param url The URL to load. 353292472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins */ 353392472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins private void loadUrl(WebView view, String url) { 353492472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins updateTitleBarForNewLoad(view, url); 353592472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins view.loadUrl(url); 353692472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins } 353792472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins 353892472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins /** 353992472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * Load UrlData into a Tab and update the title bar to reflect the new 354092472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * load. Call this instead of UrlData.loadIn directly. 354192472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * @param t The Tab used to load. 354292472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * @param data The UrlData being loaded. 354392472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins */ 354492472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins private void loadUrlDataIn(Tab t, UrlData data) { 354592472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins updateTitleBarForNewLoad(t.getWebView(), data.mUrl); 354692472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins data.loadIn(t); 354792472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins } 354892472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins 354992472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins /** 355092472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * If the WebView is the top window, update the title bar to reflect 355192472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * loading the new URL. i.e. set its text, clear the favicon (which 355292472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * will be set once the page begins loading), and set the progress to 355392472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * INITIAL_PROGRESS to show that the page has begun to load. Called 355492472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * by loadUrl and loadUrlDataIn. 355592472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * @param view The WebView that is starting a load. 355692472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * @param url The URL that is being loaded. 355792472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins */ 355892472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins private void updateTitleBarForNewLoad(WebView view, String url) { 355992472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins if (view == getTopWindow()) { 356092472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins setUrlTitle(url, null); 356192472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins setFavicon(null); 356292472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins onProgressChanged(view, INITIAL_PROGRESS); 356392472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins } 356492472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins } 356592472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins 35660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String smartUrlFilter(Uri inUri) { 35670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (inUri != null) { 35680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return smartUrlFilter(inUri.toString()); 35690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return null; 35710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3573b34f87a2e13af13d697130482af01b537ab7c5fdFeng Qian protected static final Pattern ACCEPTED_URI_SCHEMA = Pattern.compile( 35740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "(?i)" + // switch on case insensitive matching 35750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "(" + // begin group for schema 35760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "(?:http|https|file):\\/\\/" + 357725ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima "|(?:inline|data|about|content|javascript):" + 35780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ")" + 35790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "(.*)" ); 35800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 35820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Attempts to determine whether user input is a URL or search 35830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * terms. Anything with a space is passed to search. 35840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 35850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Converts to lowercase any mistakenly uppercased schema (i.e., 35860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * "Http://" converts to "http://" 35870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 35880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @return Original or modified URL 35890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 35900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 35910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String smartUrlFilter(String url) { 35920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String inUrl = url.trim(); 35940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean hasSpace = inUrl.indexOf(' ') != -1; 35950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Matcher matcher = ACCEPTED_URI_SCHEMA.matcher(inUrl); 35970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (matcher.matches()) { 35980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // force scheme to lowercase 35990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String scheme = matcher.group(1); 36000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String lcScheme = scheme.toLowerCase(); 36010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!lcScheme.equals(scheme)) { 3602123ecfb21e7ca670e3d04efe58780b3bac54a9a1Mitsuru Oshima inUrl = lcScheme + matcher.group(2); 3603123ecfb21e7ca670e3d04efe58780b3bac54a9a1Mitsuru Oshima } 3604123ecfb21e7ca670e3d04efe58780b3bac54a9a1Mitsuru Oshima if (hasSpace) { 3605123ecfb21e7ca670e3d04efe58780b3bac54a9a1Mitsuru Oshima inUrl = inUrl.replace(" ", "%20"); 36060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return inUrl; 36080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (hasSpace) { 3610565505b1a2c1d3099496af5910760087602e994aSatish Sampath // FIXME: Is this the correct place to add to searches? 3611565505b1a2c1d3099496af5910760087602e994aSatish Sampath // what if someone else calls this function? 3612565505b1a2c1d3099496af5910760087602e994aSatish Sampath int shortcut = parseUrlShortcut(inUrl); 3613565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (shortcut != SHORTCUT_INVALID) { 3614565505b1a2c1d3099496af5910760087602e994aSatish Sampath Browser.addSearchUrl(mResolver, inUrl); 3615565505b1a2c1d3099496af5910760087602e994aSatish Sampath String query = inUrl.substring(2); 3616565505b1a2c1d3099496af5910760087602e994aSatish Sampath switch (shortcut) { 3617565505b1a2c1d3099496af5910760087602e994aSatish Sampath case SHORTCUT_GOOGLE_SEARCH: 361847fdfdb989ffb79590a39c40792be995de32e521Grace Kloba return URLUtil.composeSearchUrl(query, QuickSearch_G, QUERY_PLACE_HOLDER); 3619565505b1a2c1d3099496af5910760087602e994aSatish Sampath case SHORTCUT_WIKIPEDIA_SEARCH: 3620565505b1a2c1d3099496af5910760087602e994aSatish Sampath return URLUtil.composeSearchUrl(query, QuickSearch_W, QUERY_PLACE_HOLDER); 3621565505b1a2c1d3099496af5910760087602e994aSatish Sampath case SHORTCUT_DICTIONARY_SEARCH: 3622565505b1a2c1d3099496af5910760087602e994aSatish Sampath return URLUtil.composeSearchUrl(query, QuickSearch_D, QUERY_PLACE_HOLDER); 3623565505b1a2c1d3099496af5910760087602e994aSatish Sampath case SHORTCUT_GOOGLE_MOBILE_LOCAL_SEARCH: 36240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // FIXME: we need location in this case 3625565505b1a2c1d3099496af5910760087602e994aSatish Sampath return URLUtil.composeSearchUrl(query, QuickSearch_L, QUERY_PLACE_HOLDER); 36260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 36295ee906c089567bca705e18561357510d7b55cb5aDan Egnor if (Patterns.WEB_URL.matcher(inUrl).matches()) { 36300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return URLUtil.guessUrl(inUrl); 36310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Browser.addSearchUrl(mResolver, inUrl); 363547fdfdb989ffb79590a39c40792be995de32e521Grace Kloba return URLUtil.composeSearchUrl(inUrl, QuickSearch_G, QUERY_PLACE_HOLDER); 36360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3638bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch /* package */ void setShouldShowErrorConsole(boolean flag) { 3639bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch if (flag == mShouldShowErrorConsole) { 3640bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch // Nothing to do. 3641bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch return; 3642bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 3643bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 3644bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch mShouldShowErrorConsole = flag; 3645bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 364622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba ErrorConsoleView errorConsole = mTabControl.getCurrentTab() 364722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba .getErrorConsole(true); 3648bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 3649bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch if (flag) { 3650bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch // Setting the show state of the console will cause it's the layout to be inflated. 3651bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch if (errorConsole.numberOfErrors() > 0) { 3652bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch errorConsole.showConsole(ErrorConsoleView.SHOW_MINIMIZED); 3653bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } else { 3654bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch errorConsole.showConsole(ErrorConsoleView.SHOW_NONE); 3655bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 3656bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 3657bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch // Now we can add it to the main view. 3658bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch mErrorConsoleContainer.addView(errorConsole, 365915b8ec6b226f4d57307716e1f495e10a91f8cbf4Romain Guy new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 3660bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch ViewGroup.LayoutParams.WRAP_CONTENT)); 3661bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } else { 3662bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch mErrorConsoleContainer.removeView(errorConsole); 3663bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 3664bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 3665bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 3666bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 366722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba boolean shouldShowErrorConsole() { 366822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba return mShouldShowErrorConsole; 366922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 367022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba 3671163ab74e2f85b53a1a374c49677073fb64d35f28Andrei Popescu private void setStatusBarVisibility(boolean visible) { 3672163ab74e2f85b53a1a374c49677073fb64d35f28Andrei Popescu int flag = visible ? 0 : WindowManager.LayoutParams.FLAG_FULLSCREEN; 3673163ab74e2f85b53a1a374c49677073fb64d35f28Andrei Popescu getWindow().setFlags(flag, WindowManager.LayoutParams.FLAG_FULLSCREEN); 3674163ab74e2f85b53a1a374c49677073fb64d35f28Andrei Popescu } 3675163ab74e2f85b53a1a374c49677073fb64d35f28Andrei Popescu 367656199cc25e7ee0455ec2a8099098b66b8554f677Andrei Popescu 367756199cc25e7ee0455ec2a8099098b66b8554f677Andrei Popescu private void sendNetworkType(String type, String subtype) { 367856199cc25e7ee0455ec2a8099098b66b8554f677Andrei Popescu WebView w = mTabControl.getCurrentWebView(); 367956199cc25e7ee0455ec2a8099098b66b8554f677Andrei Popescu if (w != null) { 368056199cc25e7ee0455ec2a8099098b66b8554f677Andrei Popescu w.setNetworkType(type, subtype); 368156199cc25e7ee0455ec2a8099098b66b8554f677Andrei Popescu } 368256199cc25e7ee0455ec2a8099098b66b8554f677Andrei Popescu } 368356199cc25e7ee0455ec2a8099098b66b8554f677Andrei Popescu 368430995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu private void packageChanged(String packageName, boolean wasAdded) { 368530995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu WebView w = mTabControl.getCurrentWebView(); 368630995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu if (w == null) { 368730995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu return; 368830995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu } 368930995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu 369030995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu if (wasAdded) { 369130995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu w.addPackageName(packageName); 369230995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu } else { 369330995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu w.removePackageName(packageName); 369430995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu } 369530995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu } 369630995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu 369730995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu private void addPackageNames(Set<String> packageNames) { 369830995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu WebView w = mTabControl.getCurrentWebView(); 369930995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu if (w == null) { 370030995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu return; 370130995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu } 370230995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu 370330995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu w.addPackageNames(packageNames); 370430995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu } 370530995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu 370630995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu private void getInstalledPackages() { 370730995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu AsyncTask<Void, Void, Set<String> > task = 370830995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu new AsyncTask<Void, Void, Set<String> >() { 370930995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu protected Set<String> doInBackground(Void... unused) { 371030995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu Set<String> installedPackages = new HashSet<String>(); 371130995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu PackageManager pm = BrowserActivity.this.getPackageManager(); 371230995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu if (pm != null) { 371330995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu List<PackageInfo> packages = pm.getInstalledPackages(0); 371430995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu for (PackageInfo p : packages) { 371530995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu if (BrowserActivity.this.sGoogleApps.contains(p.packageName)) { 371630995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu installedPackages.add(p.packageName); 371730995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu } 371830995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu } 371930995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu } 372030995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu 372130995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu return installedPackages; 372230995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu } 372330995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu 372430995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu // Executes on the UI thread 372530995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu protected void onPostExecute(Set<String> installedPackages) { 372630995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu addPackageNames(installedPackages); 372730995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu } 372830995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu }; 372930995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu task.execute(); 373030995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu } 373130995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu 3732eb6eef4c45df2d65c3e70660493a147a2be405e3Grace Kloba final static int LOCK_ICON_UNSECURE = 0; 3733eb6eef4c45df2d65c3e70660493a147a2be405e3Grace Kloba final static int LOCK_ICON_SECURE = 1; 3734eb6eef4c45df2d65c3e70660493a147a2be405e3Grace Kloba final static int LOCK_ICON_MIXED = 2; 37350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private BrowserSettings mSettings; 37370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private TabControl mTabControl; 37380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private ContentResolver mResolver; 37390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private FrameLayout mContentView; 3740adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu private View mCustomView; 3741adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu private FrameLayout mCustomViewContainer; 3742c9b5556351b59caec77b4eec1ad30652fec6a4d9Andrei Popescu private WebChromeClient.CustomViewCallback mCustomViewCallback; 37430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // FIXME, temp address onPrepareMenu performance problem. When we move everything out of 37450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // view, we should rewrite this. 37460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private int mCurrentMenuState = 0; 37470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private int mMenuState = R.id.MAIN_MENU; 3748adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu private int mOldMenuState = EMPTY_MENU; 37490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static final int EMPTY_MENU = -1; 37500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Menu mMenu; 37510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private FindDialog mFindDialog; 37530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Used to prevent chording to result in firing two shortcuts immediately 37540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // one after another. Fixes bug 1211714. 37550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean mCanChord; 37560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private boolean mInLoad; 37580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private boolean mIsNetworkUp; 3759b7cc8b439dc595dc48e1c2183b35d23ad72dfbe5Ben Murdoch private boolean mDidStopLoad; 37600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37611f10cbfca5bf96e1466e0ed3ce1dbcd6fcfd0608Cary Clark /* package */ boolean mActivityInPause = true; 37620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private boolean mMenuIsDown; 37640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static boolean mInTrace; 37660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Performance probe 37680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static final int[] SYSTEM_CPU_FORMAT = new int[] { 37690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_COMBINE, 37700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 1: user time 37710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 2: nice time 37720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 3: sys time 37730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 4: idle time 37740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 5: iowait time 37750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 6: irq time 37760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG // 7: softirq time 37770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 37780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mStart; 37800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mProcessStart; 37810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mUserStart; 37820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mSystemStart; 37830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mIdleStart; 37840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mIrqStart; 37850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mUiStart; 37870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Drawable mMixLockIcon; 37890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Drawable mSecLockIcon; 37900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* hold a ref so we can auto-cancel if necessary */ 37920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private AlertDialog mAlertDialog; 37930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // The up-to-date URL and title (these can be different from those stored 37950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // in WebView, since it takes some time for the information in WebView to 37960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // get updated) 37970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String mUrl; 37980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String mTitle; 37990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // As PageInfo has different style for landscape / portrait, we have 38010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // to re-open it when configuration changed 38020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private AlertDialog mPageInfoDialog; 380322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba private Tab mPageInfoView; 38040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If the Page-Info dialog is launched from the SSL-certificate-on-error 38050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // dialog, we should not just dismiss it, but should get back to the 38060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // SSL-certificate-on-error dialog. This flag is used to store this state 3807c7b92f811dfa3572578ddc6714c98a03936d9ce5Leon Scroggins private boolean mPageInfoFromShowSSLCertificateOnError; 38080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // as SSLCertificateOnError has different style for landscape / portrait, 38100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // we have to re-open it when configuration changed 38110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private AlertDialog mSSLCertificateOnErrorDialog; 38120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private WebView mSSLCertificateOnErrorView; 38130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private SslErrorHandler mSSLCertificateOnErrorHandler; 38140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private SslError mSSLCertificateOnErrorError; 38150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // as SSLCertificate has different style for landscape / portrait, we 38170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // have to re-open it when configuration changed 38180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private AlertDialog mSSLCertificateDialog; 381922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba private Tab mSSLCertificateView; 38200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // as HttpAuthentication has different style for landscape / portrait, we 38220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // have to re-open it when configuration changed 38230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private AlertDialog mHttpAuthenticationDialog; 38240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private HttpAuthHandler mHttpAuthHandler; 38250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /*package*/ static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS = 38270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new FrameLayout.LayoutParams( 382815b8ec6b226f4d57307716e1f495e10a91f8cbf4Romain Guy ViewGroup.LayoutParams.MATCH_PARENT, 382915b8ec6b226f4d57307716e1f495e10a91f8cbf4Romain Guy ViewGroup.LayoutParams.MATCH_PARENT); 3830adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu /*package*/ static final FrameLayout.LayoutParams COVER_SCREEN_GRAVITY_CENTER = 3831adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu new FrameLayout.LayoutParams( 383215b8ec6b226f4d57307716e1f495e10a91f8cbf4Romain Guy ViewGroup.LayoutParams.MATCH_PARENT, 383315b8ec6b226f4d57307716e1f495e10a91f8cbf4Romain Guy ViewGroup.LayoutParams.MATCH_PARENT, 3834adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu Gravity.CENTER); 383547fdfdb989ffb79590a39c40792be995de32e521Grace Kloba // Google search 383647fdfdb989ffb79590a39c40792be995de32e521Grace Kloba final static String QuickSearch_G = "http://www.google.com/m?q=%s"; 38370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Wikipedia search 38380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String QuickSearch_W = "http://en.wikipedia.org/w/index.php?search=%s&go=Go"; 38390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Dictionary search 38400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String QuickSearch_D = "http://dictionary.reference.com/search?q=%s"; 38410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Google Mobile Local search 38420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String QuickSearch_L = "http://www.google.com/m/search?site=local&q=%s&near=mountain+view"; 38430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String QUERY_PLACE_HOLDER = "%s"; 38450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "source" parameter for Google search through search key 38470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String GOOGLE_SEARCH_SOURCE_SEARCHKEY = "browser-key"; 38480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "source" parameter for Google search through goto menu 38490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String GOOGLE_SEARCH_SOURCE_GOTO = "browser-goto"; 38500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "source" parameter for Google search through simplily type 38510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String GOOGLE_SEARCH_SOURCE_TYPE = "browser-type"; 38520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "source" parameter for Google search suggested by the browser 38530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String GOOGLE_SEARCH_SOURCE_SUGGEST = "browser-suggest"; 38540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "source" parameter for Google search from unknown source 38550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String GOOGLE_SEARCH_SOURCE_UNKNOWN = "unknown"; 38560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final static String LOGTAG = "browser"; 38580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String mLastEnteredUrl; 38600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private PowerManager.WakeLock mWakeLock; 38620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final static int WAKELOCK_TIMEOUT = 5 * 60 * 1000; // 5 minutes 38630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Toast mStopToast; 38650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 386668579393973f745fc65a2781061af9bb8f2d7020Leon Scroggins private TitleBar mTitleBar; 386781db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins 3868bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch private LinearLayout mErrorConsoleContainer = null; 3869bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch private boolean mShouldShowErrorConsole = false; 3870bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 38710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // As the ids are dynamically created, we can't guarantee that they will 38720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // be in sequence, so this static array maps ids to a window number. 38730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static private int[] WINDOW_SHORTCUT_ID_ARRAY = 38740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project { R.id.window_one_menu_id, R.id.window_two_menu_id, R.id.window_three_menu_id, 38750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.id.window_four_menu_id, R.id.window_five_menu_id, R.id.window_six_menu_id, 38760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.id.window_seven_menu_id, R.id.window_eight_menu_id }; 38770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // monitor platform changes 38790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private IntentFilter mNetworkStateChangedFilter; 38800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private BroadcastReceiver mNetworkStateIntentReceiver; 38810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3882b4da0ad0351996f639b50f9f29b123a9b5c24fd0Grace Kloba private BroadcastReceiver mPackageInstallationReceiver; 3883b4da0ad0351996f639b50f9f29b123a9b5c24fd0Grace Kloba 3884a7611811e0d744a7220b7bf80c8f795af5ea53edBjorn Bringert private SystemAllowGeolocationOrigins mSystemAllowGeolocationOrigins; 3885a7611811e0d744a7220b7bf80c8f795af5ea53edBjorn Bringert 38860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // activity requestCode 388778a98e459323f938e97789a6131beddbebb459ceNicolas Roard final static int COMBO_PAGE = 1; 388878a98e459323f938e97789a6131beddbebb459ceNicolas Roard final static int DOWNLOAD_PAGE = 2; 388978a98e459323f938e97789a6131beddbebb459ceNicolas Roard final static int PREFERENCES_PAGE = 3; 38908d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins final static int FILE_SELECTED = 4; 38910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3892540035dfd1347c78eeec10ec0847e18fcc50ef36Andrei Popescu // the default <video> poster 3893540035dfd1347c78eeec10ec0847e18fcc50ef36Andrei Popescu private Bitmap mDefaultVideoPoster; 3894540035dfd1347c78eeec10ec0847e18fcc50ef36Andrei Popescu // the video progress view 3895540035dfd1347c78eeec10ec0847e18fcc50ef36Andrei Popescu private View mVideoProgressView; 3896540035dfd1347c78eeec10ec0847e18fcc50ef36Andrei Popescu 389730995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu // The Google packages we monitor for the navigator.isApplicationInstalled() 389830995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu // API. Add as needed. 389930995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu private static Set<String> sGoogleApps; 390030995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu static { 390130995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu sGoogleApps = new HashSet<String>(); 390230995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu sGoogleApps.add("com.google.android.youtube"); 390330995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu } 390430995e7cef0a0d5f9c7228d504076e0c158fa8b7Andrei Popescu 390525ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima /** 390625ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima * A UrlData class to abstract how the content will be set to WebView. 390725ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima * This base class uses loadUrl to show the content. 390825ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima */ 39096eac63e78d43d04e31c4d16830c44c4d9df82639Leon Scroggins /* package */ static class UrlData { 3910068e48b469f5abca53ee3da38f933cf2c25c93b8Grace Kloba final String mUrl; 3911068e48b469f5abca53ee3da38f933cf2c25c93b8Grace Kloba final Map<String, String> mHeaders; 391258d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins final Intent mVoiceIntent; 391360e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba 391425ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima UrlData(String url) { 391525ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima this.mUrl = url; 3916068e48b469f5abca53ee3da38f933cf2c25c93b8Grace Kloba this.mHeaders = null; 391758d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins this.mVoiceIntent = null; 391825ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima } 391960e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba 392058d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins UrlData(String url, Map<String, String> headers, Intent intent) { 3921068e48b469f5abca53ee3da38f933cf2c25c93b8Grace Kloba this.mUrl = url; 3922068e48b469f5abca53ee3da38f933cf2c25c93b8Grace Kloba this.mHeaders = headers; 3923a1cc3fdce19a336c251297c61cd83ac6cf767cd1Leon Scroggins if (RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS 3924a1cc3fdce19a336c251297c61cd83ac6cf767cd1Leon Scroggins .equals(intent.getAction())) { 392558d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins this.mVoiceIntent = intent; 392658d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins } else { 392758d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins this.mVoiceIntent = null; 392858d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins } 392960e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba } 393060e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba 393125ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima boolean isEmpty() { 393258d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins return mVoiceIntent == null && (mUrl == null || mUrl.length() == 0); 393325ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima } 393425ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima 393592472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins /** 393692472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * Load this UrlData into the given Tab. Use loadUrlDataIn to update 393792472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * the title bar as well. 393892472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins */ 393958d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins public void loadIn(Tab t) { 394058d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins if (mVoiceIntent != null) { 394158d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins t.activateVoiceSearchMode(mVoiceIntent); 394258d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins } else { 394358d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins t.getWebView().loadUrl(mUrl, mHeaders); 394458d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins } 394525ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima } 394625ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima }; 394725ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima 39481f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins /* package */ static final UrlData EMPTY_URL_DATA = new UrlData(null); 39490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project} 3950