BrowserActivity.java revision d7973056703d47fe37b0ee57c36350834aeda827
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 193f65c3831ff82a20f6f0edb08df2d7edae540044Michael Kolbimport com.android.browser.ScrollWebView.ScrollListener; 20d69f51ddd5b6c28c9d16725e65facaf830d650e1Bjorn Bringertimport com.android.browser.search.SearchEngine; 213f65c3831ff82a20f6f0edb08df2d7edae540044Michael Kolbimport com.android.common.Search; 223f65c3831ff82a20f6f0edb08df2d7edae540044Michael Kolbimport com.android.common.speech.LoggingEvents; 233f65c3831ff82a20f6f0edb08df2d7edae540044Michael Kolb 24ed217745066c160f785626e9a15ebe70af5e25e4Michael Kolbimport android.app.ActionBar; 250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.app.Activity; 260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.app.AlertDialog; 27c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolbimport android.app.Dialog; 285a862fcbbd5672fb85aa2f48d963a2dd4d1da940Steve Howardimport android.app.DownloadManager; 290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.app.ProgressDialog; 300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.app.SearchManager; 310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.ActivityNotFoundException; 320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.BroadcastReceiver; 3380f32627140aefe828ad539f66fc439d1580bae7Dianne Hackbornimport android.content.ClipboardManager; 340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.ComponentName; 3558d56c6b5052faa86083965132cd51b1a9594d0eLeon Scrogginsimport android.content.ContentProvider; 3658d56c6b5052faa86083965132cd51b1a9594d0eLeon Scrogginsimport android.content.ContentProviderClient; 370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.ContentResolver; 380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.ContentValues; 390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.Context; 400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.DialogInterface; 410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.Intent; 420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.IntentFilter; 430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.pm.PackageManager; 440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.pm.ResolveInfo; 450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.res.Configuration; 460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.res.Resources; 470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.database.Cursor; 480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.graphics.Bitmap; 49540035dfd1347c78eeec10ec0847e18fcc50ef36Andrei Popescuimport android.graphics.BitmapFactory; 500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.graphics.Canvas; 510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.graphics.Picture; 523bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scrogginsimport android.graphics.PixelFormat; 530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.graphics.drawable.Drawable; 540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.net.ConnectivityManager; 5556199cc25e7ee0455ec2a8099098b66b8554f677Andrei Popescuimport android.net.NetworkInfo; 560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.net.Uri; 570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.net.WebAddress; 580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.net.http.SslCertificate; 590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.net.http.SslError; 600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.AsyncTask; 610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.Bundle; 620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.Debug; 630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.Environment; 640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.Handler; 650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.Message; 660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.PowerManager; 670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.Process; 680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.SystemClock; 690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.provider.Browser; 70370a4f3e47b740fd10b9028aae9e87e17254caa8Michael Kolbimport android.provider.BrowserContract; 711a805652e389d9404ee0fda7c993a6202332e92bJeff Hamiltonimport android.provider.BrowserContract.Images; 72e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolbimport android.provider.ContactsContract; 73a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolbimport android.provider.ContactsContract.Intents.Insert; 740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.provider.Downloads; 750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.provider.MediaStore; 76a1cc3fdce19a336c251297c61cd83ac6cf767cd1Leon Scrogginsimport android.speech.RecognizerResultsIntent; 770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.text.TextUtils; 780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.text.format.DateFormat; 790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.util.Log; 80385effd3192a16b737a7d4fbe4fc71c6cf467627Dianne Hackbornimport android.util.Patterns; 818e4fbf1b26c2cc05a56ba2d4e7d1eda7d1574e91Leon Scroggins IIIimport android.view.ActionMode; 820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.ContextMenu; 83a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolbimport android.view.ContextMenu.ContextMenuInfo; 840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.Gravity; 850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.KeyEvent; 860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.LayoutInflater; 870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.Menu; 880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.MenuInflater; 890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.MenuItem; 90a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolbimport android.view.MenuItem.OnMenuItemClickListener; 910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.View; 920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.ViewGroup; 930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.Window; 940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.WindowManager; 952b34599c39d2c04c242d2a0ed755705fc414541dSvetoslav Ganovimport android.view.accessibility.AccessibilityManager; 960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.CookieManager; 970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.CookieSyncManager; 980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.DownloadListener; 990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.HttpAuthHandler; 1000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.SslErrorHandler; 1010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.URLUtil; 102cb6cc864e53f7d916622daf3b2cec133b36d6a55Leon Clarkeimport android.webkit.ValueCallback; 1030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.WebChromeClient; 1040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.WebHistoryItem; 1050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.WebIconDatabase; 10688d080394ca18120e05c6926b178fd6843ff9cecLeon Scrogginsimport android.webkit.WebSettings; 1070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.webkit.WebView; 1080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.EditText; 1090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.FrameLayout; 1100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.LinearLayout; 1110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.TextView; 1120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.Toast; 1130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 114b6b7f9ef3b4ed220063f555d8b7c205210a61a04Leon Scrogginsimport java.io.ByteArrayOutputStream; 1150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.io.File; 1164f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdochimport java.io.IOException; 1174f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdochimport java.io.InputStream; 1180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.net.MalformedURLException; 1199918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackbornimport java.net.URISyntaxException; 1200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.net.URL; 1210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.net.URLEncoder; 1223d6df16f1c9a64cf2dc5b41a2078f4c49b0c296aElliott Slaughterimport java.util.Calendar; 1230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.Date; 1240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.HashMap; 12500f54c589fd38431efd42ea2a551a49e64d595d5Grace Klobaimport java.util.Iterator; 126068e48b469f5abca53ee3da38f933cf2c25c93b8Grace Klobaimport java.util.Map; 127fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolbimport java.util.Vector; 1280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.regex.Matcher; 1290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.regex.Pattern; 1300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectpublic class BrowserActivity extends Activity 132e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb implements View.OnCreateContextMenuListener, DownloadListener, 13388d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins BookmarksHistoryCallbacks { 1340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13531a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort /* Define some aliases to make these debugging flags easier to refer to. 13631a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort * This file imports android.provider.Browser, so we can't just refer to "Browser.DEBUG". 13731a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort */ 13831a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort private final static boolean DEBUG = com.android.browser.Browser.DEBUG; 13931a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort private final static boolean LOGV_ENABLED = com.android.browser.Browser.LOGV_ENABLED; 14031a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort private final static boolean LOGD_ENABLED = com.android.browser.Browser.LOGD_ENABLED; 14131a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort 142a977124eb29b195127fd161120ebbc58b255fb48Cary Clark private static class ClearThumbnails extends AsyncTask<File, Void, Void> { 1430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 1440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public Void doInBackground(File... files) { 1450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (files != null) { 1460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project for (File f : files) { 147d6be1758b38d5b066ff10b6af906aa66c63670cdCary Clark if (!f.delete()) { 148d6be1758b38d5b066ff10b6af906aa66c63670cdCary Clark Log.e(LOGTAG, f.getPath() + " was not deleted"); 149d6be1758b38d5b066ff10b6af906aa66c63670cdCary Clark } 1500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return null; 1530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1563bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins /** 1573bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * This layout holds everything you see below the status bar, including the 1583bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * error console, the custom view container, and the webviews. 1593bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins */ 1603bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins private FrameLayout mBrowserFrameLayout; 16181db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins 162e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb private CombinedBookmarkHistoryView mComboView; 163e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb 164d746a94137a87ffcc1fcefdac9a3764c3bc3f5cdLeon Scroggins private boolean mXLargeScreenSize; 165d746a94137a87ffcc1fcefdac9a3764c3bc3f5cdLeon Scroggins 16643610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson private Boolean mIsProviderPresent = null; 16743610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson private Uri mRlzUri = null; 16843610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson 16922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba @Override 17022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba public void onCreate(Bundle icicle) { 17131a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 1720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, this + " onStart"); 1730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onCreate(icicle); 1750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // test the browser in OpenGL 1760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // requestWindowFeature(Window.FEATURE_OPENGL); 1770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 178d334bf564b72416e77e707d25f8c55cfe1d85709Mike Reed // enable this to test the browser in 32bit 179d334bf564b72416e77e707d25f8c55cfe1d85709Mike Reed if (false) { 180d334bf564b72416e77e707d25f8c55cfe1d85709Mike Reed getWindow().setFormat(PixelFormat.RGBX_8888); 181d334bf564b72416e77e707d25f8c55cfe1d85709Mike Reed BitmapFactory.setDefaultConfig(Bitmap.Config.ARGB_8888); 182d334bf564b72416e77e707d25f8c55cfe1d85709Mike Reed } 183d334bf564b72416e77e707d25f8c55cfe1d85709Mike Reed 184b1402a5c3e1617867c58d32d1fe9782cf6de423fBjorn Bringert if (((AccessibilityManager) getSystemService(ACCESSIBILITY_SERVICE)).isEnabled()) { 1852b34599c39d2c04c242d2a0ed755705fc414541dSvetoslav Ganov setDefaultKeyMode(DEFAULT_KEYS_DISABLE); 1862b34599c39d2c04c242d2a0ed755705fc414541dSvetoslav Ganov } else { 1872b34599c39d2c04c242d2a0ed755705fc414541dSvetoslav Ganov setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL); 1882b34599c39d2c04c242d2a0ed755705fc414541dSvetoslav Ganov } 1890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mResolver = getContentResolver(); 1910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 192cc14c8c4da26ff93a96078c7c9108682c23bd1afLeon Scroggins III // Keep a settings instance handy. 193cc14c8c4da26ff93a96078c7c9108682c23bd1afLeon Scroggins III mSettings = BrowserSettings.getInstance(); 194cc14c8c4da26ff93a96078c7c9108682c23bd1afLeon Scroggins III 1950923d69a8ca45222cabd82a80eaa88da9f132e9aGrace Kloba // If this was a web search request, pass it on to the default web 1960923d69a8ca45222cabd82a80eaa88da9f132e9aGrace Kloba // search provider and finish this activity. 1970923d69a8ca45222cabd82a80eaa88da9f132e9aGrace Kloba if (handleWebSearchIntent(getIntent())) { 1980923d69a8ca45222cabd82a80eaa88da9f132e9aGrace Kloba finish(); 1990923d69a8ca45222cabd82a80eaa88da9f132e9aGrace Kloba return; 2000923d69a8ca45222cabd82a80eaa88da9f132e9aGrace Kloba } 2010923d69a8ca45222cabd82a80eaa88da9f132e9aGrace Kloba 2020506f2dd9239e23099244e101f7d32d5fc189668Michael Kolb mSecLockIcon = getResources().getDrawable(R.drawable.ic_secure); 2030506f2dd9239e23099244e101f7d32d5fc189668Michael Kolb mMixLockIcon = getResources().getDrawable(R.drawable.ic_partial_secure); 2040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 205ed217745066c160f785626e9a15ebe70af5e25e4Michael Kolb // Create the tab control and our initial tab 206ed217745066c160f785626e9a15ebe70af5e25e4Michael Kolb mTabControl = new TabControl(this); 207ed217745066c160f785626e9a15ebe70af5e25e4Michael Kolb 208ed217745066c160f785626e9a15ebe70af5e25e4Michael Kolb mXLargeScreenSize = (getResources().getConfiguration().screenLayout 209ed217745066c160f785626e9a15ebe70af5e25e4Michael Kolb & Configuration.SCREENLAYOUT_SIZE_MASK) 210ed217745066c160f785626e9a15ebe70af5e25e4Michael Kolb == Configuration.SCREENLAYOUT_SIZE_XLARGE; 211ed217745066c160f785626e9a15ebe70af5e25e4Michael Kolb 21281db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins FrameLayout frameLayout = (FrameLayout) getWindow().getDecorView() 213b1402a5c3e1617867c58d32d1fe9782cf6de423fBjorn Bringert .findViewById(android.R.id.content); 2143bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mBrowserFrameLayout = (FrameLayout) LayoutInflater.from(this) 2153bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins .inflate(R.layout.custom_screen, null); 2163bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mContentView = (FrameLayout) mBrowserFrameLayout.findViewById( 2173bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins R.id.main_content); 2183bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mErrorConsoleContainer = (LinearLayout) mBrowserFrameLayout 2193bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins .findViewById(R.id.error_console); 2203bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mCustomViewContainer = (FrameLayout) mBrowserFrameLayout 2213bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins .findViewById(R.id.fullscreen_custom_content); 2223bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins frameLayout.addView(mBrowserFrameLayout, COVER_SCREEN_PARAMS); 223e0a3666b5c0dca7352895fa8b9b4fbb2237df721Michael Kolb 224d746a94137a87ffcc1fcefdac9a3764c3bc3f5cdLeon Scroggins if (mXLargeScreenSize) { 225a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb mTitleBar = new TitleBarXLarge(this); 226a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb mTitleBar.setProgress(100); 227a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb mFakeTitleBar = new TitleBarXLarge(this); 228ed217745066c160f785626e9a15ebe70af5e25e4Michael Kolb ActionBar actionBar = getActionBar(); 229a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb mTabBar = new TabBar(this, mTabControl, (TitleBarXLarge) mFakeTitleBar); 230ed217745066c160f785626e9a15ebe70af5e25e4Michael Kolb actionBar.setCustomNavigationMode(mTabBar); 23168775756e20243d73f273e4ce25ff3edeb148e41Michael Kolb // disable built in zoom controls 23268775756e20243d73f273e4ce25ff3edeb148e41Michael Kolb mTabControl.setDisplayZoomControls(false); 233d746a94137a87ffcc1fcefdac9a3764c3bc3f5cdLeon Scroggins } else { 234571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins mTitleBar = new TitleBar(this); 235d746a94137a87ffcc1fcefdac9a3764c3bc3f5cdLeon Scroggins // mTitleBar will be always be shown in the fully loaded mode on 236d746a94137a87ffcc1fcefdac9a3764c3bc3f5cdLeon Scroggins // phone 237d746a94137a87ffcc1fcefdac9a3764c3bc3f5cdLeon Scroggins mTitleBar.setProgress(100); 238d746a94137a87ffcc1fcefdac9a3764c3bc3f5cdLeon Scroggins mFakeTitleBar = new TitleBar(this); 239d746a94137a87ffcc1fcefdac9a3764c3bc3f5cdLeon Scroggins } 2400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Open the icon database and retain all the bookmark urls for favicons 2420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project retainIconsOnStartup(); 2430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSettings.setTabControl(mTabControl); 2450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 2470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Browser"); 2480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2496adacc90222a3293bc631ef88ee5613e23b2d4c0Patrick Scott // Find out if the network is currently up. 2506adacc90222a3293bc631ef88ee5613e23b2d4c0Patrick Scott ConnectivityManager cm = (ConnectivityManager) getSystemService( 2516adacc90222a3293bc631ef88ee5613e23b2d4c0Patrick Scott Context.CONNECTIVITY_SERVICE); 2526adacc90222a3293bc631ef88ee5613e23b2d4c0Patrick Scott NetworkInfo info = cm.getActiveNetworkInfo(); 2536adacc90222a3293bc631ef88ee5613e23b2d4c0Patrick Scott if (info != null) { 2546adacc90222a3293bc631ef88ee5613e23b2d4c0Patrick Scott mIsNetworkUp = info.isAvailable(); 2556adacc90222a3293bc631ef88ee5613e23b2d4c0Patrick Scott } 2566adacc90222a3293bc631ef88ee5613e23b2d4c0Patrick Scott 257a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba /* enables registration for changes in network status from 258a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba http stack */ 259a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba mNetworkStateChangedFilter = new IntentFilter(); 260a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba mNetworkStateChangedFilter.addAction( 261a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba ConnectivityManager.CONNECTIVITY_ACTION); 262a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba mNetworkStateIntentReceiver = new BroadcastReceiver() { 263a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba @Override 264a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba public void onReceive(Context context, Intent intent) { 265a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba if (intent.getAction().equals( 266a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba ConnectivityManager.CONNECTIVITY_ACTION)) { 267e4c98469644d3fa2689cf6658b1999add13c7e0eAndrei Popescu 268e4c98469644d3fa2689cf6658b1999add13c7e0eAndrei Popescu NetworkInfo info = intent.getParcelableExtra( 269e4c98469644d3fa2689cf6658b1999add13c7e0eAndrei Popescu ConnectivityManager.EXTRA_NETWORK_INFO); 270e4c98469644d3fa2689cf6658b1999add13c7e0eAndrei Popescu String typeName = info.getTypeName(); 271e4c98469644d3fa2689cf6658b1999add13c7e0eAndrei Popescu String subtypeName = info.getSubtypeName(); 272e4c98469644d3fa2689cf6658b1999add13c7e0eAndrei Popescu sendNetworkType(typeName.toLowerCase(), 273e4c98469644d3fa2689cf6658b1999add13c7e0eAndrei Popescu (subtypeName != null ? subtypeName.toLowerCase() : "")); 274e4c98469644d3fa2689cf6658b1999add13c7e0eAndrei Popescu 275e4c98469644d3fa2689cf6658b1999add13c7e0eAndrei Popescu onNetworkToggle(info.isAvailable()); 276a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba } 277a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba } 278a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba }; 279a34f686112fb4f9fbea00b8c2c47153d34e93e41Grace Kloba 2803d6df16f1c9a64cf2dc5b41a2078f4c49b0c296aElliott Slaughter // Unless the last browser usage was within 24 hours, destroy any 2813d6df16f1c9a64cf2dc5b41a2078f4c49b0c296aElliott Slaughter // remaining incognito tabs. 2823d6df16f1c9a64cf2dc5b41a2078f4c49b0c296aElliott Slaughter 2833d6df16f1c9a64cf2dc5b41a2078f4c49b0c296aElliott Slaughter Calendar lastActiveDate = icicle != null ? (Calendar) icicle.getSerializable("lastActiveDate") : null; 2843d6df16f1c9a64cf2dc5b41a2078f4c49b0c296aElliott Slaughter Calendar today = Calendar.getInstance(); 2853d6df16f1c9a64cf2dc5b41a2078f4c49b0c296aElliott Slaughter Calendar yesterday = Calendar.getInstance(); 2863d6df16f1c9a64cf2dc5b41a2078f4c49b0c296aElliott Slaughter yesterday.add(Calendar.DATE, -1); 2873d6df16f1c9a64cf2dc5b41a2078f4c49b0c296aElliott Slaughter 2883d6df16f1c9a64cf2dc5b41a2078f4c49b0c296aElliott Slaughter boolean dontRestoreIncognitoTabs = lastActiveDate == null 2893d6df16f1c9a64cf2dc5b41a2078f4c49b0c296aElliott Slaughter || lastActiveDate.before(yesterday) 2903d6df16f1c9a64cf2dc5b41a2078f4c49b0c296aElliott Slaughter || lastActiveDate.after(today); 2913d6df16f1c9a64cf2dc5b41a2078f4c49b0c296aElliott Slaughter 2923d6df16f1c9a64cf2dc5b41a2078f4c49b0c296aElliott Slaughter if (!mTabControl.restoreState(icicle, dontRestoreIncognitoTabs)) { 2930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // clear up the thumbnail directory if we can't restore the state as 2940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // none of the files in the directory are referenced any more. 2950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new ClearThumbnails().execute( 2960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.getThumbnailDir().listFiles()); 297aab3f09b5c2d39b19067e57635614080b2403a46Grace Kloba // there is no quit on Android. But if we can't restore the state, 298aab3f09b5c2d39b19067e57635614080b2403a46Grace Kloba // we can treat it as a new Browser, remove the old session cookies. 299aab3f09b5c2d39b19067e57635614080b2403a46Grace Kloba CookieManager.getInstance().removeSessionCookie(); 3003d6df16f1c9a64cf2dc5b41a2078f4c49b0c296aElliott Slaughter // remove any incognito files 3013d6df16f1c9a64cf2dc5b41a2078f4c49b0c296aElliott Slaughter WebView.cleanupPrivateBrowsingFiles(this); 3020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Intent intent = getIntent(); 3030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Bundle extra = intent.getExtras(); 3040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Create an initial tab. 3050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If the intent is ACTION_VIEW and data is not null, the Browser is 3060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // invoked to view the content by another application. In this case, 3070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the tab will be close when exit. 30825ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima UrlData urlData = getUrlDataFromIntent(intent); 30925ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima 31058d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins String action = intent.getAction(); 31122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba final Tab t = mTabControl.createNewTab( 31258d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins (Intent.ACTION_VIEW.equals(action) && 31358d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins intent.getData() != null) 314a1cc3fdce19a336c251297c61cd83ac6cf767cd1Leon Scroggins || RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS 315a1cc3fdce19a336c251297c61cd83ac6cf767cd1Leon Scroggins .equals(action), 316f0f03954b3092296c58dcb040e2dabd1696dd5c4Elliott Slaughter intent.getStringExtra(Browser.EXTRA_APPLICATION_ID), 317f0f03954b3092296c58dcb040e2dabd1696dd5c4Elliott Slaughter urlData.mUrl, false); 3180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.setCurrentTab(t); 3190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project attachTabToContentView(t); 3200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView webView = t.getWebView(); 3210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (extra != null) { 3220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int scale = extra.getInt(Browser.INITIAL_ZOOM_LEVEL, 0); 3230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (scale > 0 && scale <= 1000) { 3240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project webView.setInitialScale(scale); 3250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32825ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima if (urlData.isEmpty()) { 32998d5fce7c687cfcc956b10d44946d31f39b6dc15Shimeng (Simon) Wang loadUrl(webView, mSettings.getHomePage()); 3300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 3319d53da05812f959745810a33bb4e06b273393c42Patrick Scott loadUrlDataIn(t, urlData); 3320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 3343d6df16f1c9a64cf2dc5b41a2078f4c49b0c296aElliott Slaughter if (dontRestoreIncognitoTabs) { 3353d6df16f1c9a64cf2dc5b41a2078f4c49b0c296aElliott Slaughter WebView.cleanupPrivateBrowsingFiles(this); 3363d6df16f1c9a64cf2dc5b41a2078f4c49b0c296aElliott Slaughter } 3373d6df16f1c9a64cf2dc5b41a2078f4c49b0c296aElliott Slaughter 3380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // TabControl.restoreState() will create a new tab even if 3391f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // restoring the state fails. 3400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project attachTabToContentView(mTabControl.getCurrentTab()); 3410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 342615c6c9130a1bd21c63cd37d09f8f4ea3229ca13Grace Kloba 343b4b83182219908210d4554466367736692faf6ceCary Clark // Delete old thumbnails to save space 344b4b83182219908210d4554466367736692faf6ceCary Clark File dir = mTabControl.getThumbnailDir(); 345b4b83182219908210d4554466367736692faf6ceCary Clark if (dir.exists()) { 346b4b83182219908210d4554466367736692faf6ceCary Clark for (String child : dir.list()) { 347b4b83182219908210d4554466367736692faf6ceCary Clark File f = new File(dir, child); 348b4b83182219908210d4554466367736692faf6ceCary Clark f.delete(); 349b4b83182219908210d4554466367736692faf6ceCary Clark } 350b4b83182219908210d4554466367736692faf6ceCary Clark } 351b4b83182219908210d4554466367736692faf6ceCary Clark 352b3c02da4553b1a629b16377970fdabae28394c94Feng Qian // Read JavaScript flags if it exists. 353b3c02da4553b1a629b16377970fdabae28394c94Feng Qian String jsFlags = mSettings.getJsFlags(); 354b3c02da4553b1a629b16377970fdabae28394c94Feng Qian if (jsFlags.trim().length() != 0) { 355b3c02da4553b1a629b16377970fdabae28394c94Feng Qian mTabControl.getCurrentWebView().setJsFlags(jsFlags); 356b3c02da4553b1a629b16377970fdabae28394c94Feng Qian } 357a7611811e0d744a7220b7bf80c8f795af5ea53edBjorn Bringert 358a7611811e0d744a7220b7bf80c8f795af5ea53edBjorn Bringert // Start watching the default geolocation permissions 359a7611811e0d744a7220b7bf80c8f795af5ea53edBjorn Bringert mSystemAllowGeolocationOrigins 360a7611811e0d744a7220b7bf80c8f795af5ea53edBjorn Bringert = new SystemAllowGeolocationOrigins(getApplicationContext()); 361a7611811e0d744a7220b7bf80c8f795af5ea53edBjorn Bringert mSystemAllowGeolocationOrigins.start(); 3620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 364a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb ScrollListener getScrollListener() { 365a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb return mTabBar; 366a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb } 367a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb 36858d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins /** 36958d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins * Feed the previously stored results strings to the BrowserProvider so that 37058d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins * the SearchDialog will show them instead of the standard searches. 37158d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins * @param result String to show on the editable line of the SearchDialog. 37258d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins */ 37358d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins /* package */ void showVoiceSearchResults(String result) { 37458d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins ContentProviderClient client = mResolver.acquireContentProviderClient( 37558d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins Browser.BOOKMARKS_URI); 37658d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins ContentProvider prov = client.getLocalContentProvider(); 37758d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins BrowserProvider bp = (BrowserProvider) prov; 37858d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins bp.setQueryResults(mTabControl.getCurrentTab().getVoiceSearchResults()); 37958d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins client.release(); 38058d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins 381fbb3f15f725e890837431f402b43e802045a4f3fLeon Scroggins Bundle bundle = createGoogleSearchSourceBundle( 382fbb3f15f725e890837431f402b43e802045a4f3fLeon Scroggins GOOGLE_SEARCH_SOURCE_SEARCHKEY); 383fbb3f15f725e890837431f402b43e802045a4f3fLeon Scroggins bundle.putBoolean(SearchManager.CONTEXT_IS_VOICE, true); 384fbb3f15f725e890837431f402b43e802045a4f3fLeon Scroggins startSearch(result, false, bundle, false); 38558d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins } 38658d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins 3870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 3880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project protected void onNewIntent(Intent intent) { 38922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Tab current = mTabControl.getCurrentTab(); 3900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // When a tab is closed on exit, the current tab index is set to -1. 3910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Reset before proceed as Browser requires the current tab to be set. 3920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current == null) { 3930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Try to reset the tab in case the index was incorrect. 3940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project current = mTabControl.getTab(0); 3950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current == null) { 3960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // No tabs at all so just ignore this intent. 3970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 3980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.setCurrentTab(current); 4000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project attachTabToContentView(current); 4010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleAndIcon(current.getWebView()); 4020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 4030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final String action = intent.getAction(); 4040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final int flags = intent.getFlags(); 4050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (Intent.ACTION_MAIN.equals(action) || 4060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (flags & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0) { 4070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // just resume the browser 4080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 4090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 410b8a844da0049965b3cef5739dbab19c7ac766762Leon Scroggins // In case the SearchDialog is open. 411b8a844da0049965b3cef5739dbab19c7ac766762Leon Scroggins ((SearchManager) getSystemService(Context.SEARCH_SERVICE)) 412b8a844da0049965b3cef5739dbab19c7ac766762Leon Scroggins .stopSearch(); 413a1cc3fdce19a336c251297c61cd83ac6cf767cd1Leon Scroggins boolean activateVoiceSearch = RecognizerResultsIntent 414a1cc3fdce19a336c251297c61cd83ac6cf767cd1Leon Scroggins .ACTION_VOICE_SEARCH_RESULTS.equals(action); 4150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (Intent.ACTION_VIEW.equals(action) 4160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || Intent.ACTION_SEARCH.equals(action) 4170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action) 41858d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins || Intent.ACTION_WEB_SEARCH.equals(action) 41958d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins || activateVoiceSearch) { 4203b18ce37c13fce7212948df90a012d7011924a6eLeon Scroggins if (current.isInVoiceSearchMode()) { 4213b18ce37c13fce7212948df90a012d7011924a6eLeon Scroggins String title = current.getVoiceDisplayTitle(); 4223b18ce37c13fce7212948df90a012d7011924a6eLeon Scroggins if (title != null && title.equals(intent.getStringExtra( 4233b18ce37c13fce7212948df90a012d7011924a6eLeon Scroggins SearchManager.QUERY))) { 4243b18ce37c13fce7212948df90a012d7011924a6eLeon Scroggins // The user submitted the same search as the last voice 4253b18ce37c13fce7212948df90a012d7011924a6eLeon Scroggins // search, so do nothing. 4263b18ce37c13fce7212948df90a012d7011924a6eLeon Scroggins return; 4273b18ce37c13fce7212948df90a012d7011924a6eLeon Scroggins } 4281fe13a5230e319df42b21939a14d127bd9bf3856Leon Scroggins if (Intent.ACTION_SEARCH.equals(action) 4291fe13a5230e319df42b21939a14d127bd9bf3856Leon Scroggins && current.voiceSearchSourceIsGoogle()) { 4301fe13a5230e319df42b21939a14d127bd9bf3856Leon Scroggins Intent logIntent = new Intent( 4311fe13a5230e319df42b21939a14d127bd9bf3856Leon Scroggins LoggingEvents.ACTION_LOG_EVENT); 4321fe13a5230e319df42b21939a14d127bd9bf3856Leon Scroggins logIntent.putExtra(LoggingEvents.EXTRA_EVENT, 4331fe13a5230e319df42b21939a14d127bd9bf3856Leon Scroggins LoggingEvents.VoiceSearch.QUERY_UPDATED); 4341fe13a5230e319df42b21939a14d127bd9bf3856Leon Scroggins logIntent.putExtra( 4351fe13a5230e319df42b21939a14d127bd9bf3856Leon Scroggins LoggingEvents.VoiceSearch.EXTRA_QUERY_UPDATED_VALUE, 4361fe13a5230e319df42b21939a14d127bd9bf3856Leon Scroggins intent.getDataString()); 4371fe13a5230e319df42b21939a14d127bd9bf3856Leon Scroggins sendBroadcast(logIntent); 4381fe13a5230e319df42b21939a14d127bd9bf3856Leon Scroggins // Note, onPageStarted will revert the voice title bar 4391fe13a5230e319df42b21939a14d127bd9bf3856Leon Scroggins // When http://b/issue?id=2379215 is fixed, we should update 4401fe13a5230e319df42b21939a14d127bd9bf3856Leon Scroggins // the title bar here. 4411fe13a5230e319df42b21939a14d127bd9bf3856Leon Scroggins } 4423b18ce37c13fce7212948df90a012d7011924a6eLeon Scroggins } 443565505b1a2c1d3099496af5910760087602e994aSatish Sampath // If this was a search request (e.g. search query directly typed into the address bar), 444565505b1a2c1d3099496af5910760087602e994aSatish Sampath // pass it on to the default web search provider. 445565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (handleWebSearchIntent(intent)) { 446565505b1a2c1d3099496af5910760087602e994aSatish Sampath return; 447565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 448565505b1a2c1d3099496af5910760087602e994aSatish Sampath 44925ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima UrlData urlData = getUrlDataFromIntent(intent); 45025ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima if (urlData.isEmpty()) { 45125ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima urlData = new UrlData(mSettings.getHomePage()); 4520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 45325ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima 454cc63403643786905262f505ab5266d8e80b9924cGrace Kloba final String appId = intent 455cc63403643786905262f505ab5266d8e80b9924cGrace Kloba .getStringExtra(Browser.EXTRA_APPLICATION_ID); 4564720868afa09efffadd845019f2d8268ae3f2c78Leon Scroggins if ((Intent.ACTION_VIEW.equals(action) 4574720868afa09efffadd845019f2d8268ae3f2c78Leon Scroggins // If a voice search has no appId, it means that it came 4584720868afa09efffadd845019f2d8268ae3f2c78Leon Scroggins // from the browser. In that case, reuse the current tab. 4594720868afa09efffadd845019f2d8268ae3f2c78Leon Scroggins || (activateVoiceSearch && appId != null)) 460cc63403643786905262f505ab5266d8e80b9924cGrace Kloba && !getPackageName().equals(appId) 461cc63403643786905262f505ab5266d8e80b9924cGrace Kloba && (flags & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { 46222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Tab appTab = mTabControl.getTabFromId(appId); 463f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project if (appTab != null) { 464f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project Log.i(LOGTAG, "Reusing tab for " + appId); 465f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // Dismiss the subwindow if applicable. 466f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project dismissSubWindow(appTab); 467f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // Since we might kill the WebView, remove it from the 468f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // content view first. 469f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project removeTabFromContentView(appTab); 470f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // Recreate the main WebView after destroying the old one. 471f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // If the WebView has the same original url and is on that 472f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project // page, it can be reused. 473f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project boolean needsLoad = 4746eac63e78d43d04e31c4d16830c44c4d9df82639Leon Scroggins mTabControl.recreateWebView(appTab, urlData); 475bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 476f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project if (current != appTab) { 4771f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins switchToTab(mTabControl.getTabIndex(appTab)); 4781f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (needsLoad) { 4799d53da05812f959745810a33bb4e06b273393c42Patrick Scott loadUrlDataIn(appTab, urlData); 4801f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 481f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project } else { 4821f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // If the tab was the current tab, we have to attach 4831f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // it to the view system again. 4841f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins attachTabToContentView(appTab); 4851f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (needsLoad) { 4869d53da05812f959745810a33bb4e06b273393c42Patrick Scott loadUrlDataIn(appTab, urlData); 487f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project } 488f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project } 489f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project return; 490cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott } else { 491cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott // No matching application tab, try to find a regular tab 492cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott // with a matching url. 493cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott appTab = mTabControl.findUnusedTabWithUrl(urlData.mUrl); 49425515f8bd458a2471d13d876cfb0e18d8ff2a00fLeon Scroggins if (appTab != null) { 49525515f8bd458a2471d13d876cfb0e18d8ff2a00fLeon Scroggins if (current != appTab) { 49625515f8bd458a2471d13d876cfb0e18d8ff2a00fLeon Scroggins switchToTab(mTabControl.getTabIndex(appTab)); 49725515f8bd458a2471d13d876cfb0e18d8ff2a00fLeon Scroggins } 49825515f8bd458a2471d13d876cfb0e18d8ff2a00fLeon Scroggins // Otherwise, we are already viewing the correct tab. 499cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott } else { 500cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott // if FLAG_ACTIVITY_BROUGHT_TO_FRONT flag is on, the url 501cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott // will be opened in a new tab unless we have reached 502cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott // MAX_TABS. Then the url will be opened in the current 503cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott // tab. If a new tab is created, it will have "true" for 504cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott // exit on close. 5051f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins openTabAndShow(urlData, true, appId); 506cd11589fc3930906d4b9b7dd18aa52a9f1eb0c8aPatrick Scott } 507f59ec877363eaf43118677f249008eddc7a9ce11The Android Open Source Project } 5080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 509638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba if (!urlData.isEmpty() 510638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba && urlData.mUrl.startsWith("about:debug")) { 511638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba if ("about:debug.dom".equals(urlData.mUrl)) { 512638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba current.getWebView().dumpDomTree(false); 513638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba } else if ("about:debug.dom.file".equals(urlData.mUrl)) { 514638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba current.getWebView().dumpDomTree(true); 515638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba } else if ("about:debug.render".equals(urlData.mUrl)) { 516638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba current.getWebView().dumpRenderTree(false); 517638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba } else if ("about:debug.render.file".equals(urlData.mUrl)) { 518638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba current.getWebView().dumpRenderTree(true); 519638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba } else if ("about:debug.display".equals(urlData.mUrl)) { 520638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba current.getWebView().dumpDisplayTree(); 521638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba } else { 522638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba mSettings.toggleDebugSettings(); 523638d3f45791a31d0b290e180b93bad49576eb6d3Grace Kloba } 5240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 5250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5261f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // Get rid of the subwindow if it exists 5271f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins dismissSubWindow(current); 5288588d15a7c0b87049469fd80f9c53eb274cd837bLeon Scroggins // If the current Tab is being used as an application tab, 5298588d15a7c0b87049469fd80f9c53eb274cd837bLeon Scroggins // remove the association, since the new Intent means that it is 5308588d15a7c0b87049469fd80f9c53eb274cd837bLeon Scroggins // no longer associated with that application. 5318588d15a7c0b87049469fd80f9c53eb274cd837bLeon Scroggins current.setAppId(null); 5329d53da05812f959745810a33bb4e06b273393c42Patrick Scott loadUrlDataIn(current, urlData); 5330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 5360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 537565505b1a2c1d3099496af5910760087602e994aSatish Sampath /** 538565505b1a2c1d3099496af5910760087602e994aSatish Sampath * Launches the default web search activity with the query parameters if the given intent's data 539565505b1a2c1d3099496af5910760087602e994aSatish Sampath * are identified as plain search terms and not URLs/shortcuts. 540565505b1a2c1d3099496af5910760087602e994aSatish Sampath * @return true if the intent was handled and web search activity was launched, false if not. 541565505b1a2c1d3099496af5910760087602e994aSatish Sampath */ 542565505b1a2c1d3099496af5910760087602e994aSatish Sampath private boolean handleWebSearchIntent(Intent intent) { 543565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (intent == null) return false; 544565505b1a2c1d3099496af5910760087602e994aSatish Sampath 545565505b1a2c1d3099496af5910760087602e994aSatish Sampath String url = null; 546565505b1a2c1d3099496af5910760087602e994aSatish Sampath final String action = intent.getAction(); 547a1cc3fdce19a336c251297c61cd83ac6cf767cd1Leon Scroggins if (RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS.equals( 548a1cc3fdce19a336c251297c61cd83ac6cf767cd1Leon Scroggins action)) { 54958d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins return false; 55058d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins } 551565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (Intent.ACTION_VIEW.equals(action)) { 5521e70505659dd9bf0f7e03bce787ba880f9b7a8aaGrace Kloba Uri data = intent.getData(); 5531e70505659dd9bf0f7e03bce787ba880f9b7a8aaGrace Kloba if (data != null) url = data.toString(); 554565505b1a2c1d3099496af5910760087602e994aSatish Sampath } else if (Intent.ACTION_SEARCH.equals(action) 555565505b1a2c1d3099496af5910760087602e994aSatish Sampath || MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action) 556565505b1a2c1d3099496af5910760087602e994aSatish Sampath || Intent.ACTION_WEB_SEARCH.equals(action)) { 557565505b1a2c1d3099496af5910760087602e994aSatish Sampath url = intent.getStringExtra(SearchManager.QUERY); 558565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 5590485170e03e079eb61b9dd52fc2c98da02fa7b2cBjorn Bringert return handleWebSearchRequest(url, intent.getBundleExtra(SearchManager.APP_DATA), 5600485170e03e079eb61b9dd52fc2c98da02fa7b2cBjorn Bringert intent.getStringExtra(SearchManager.EXTRA_DATA_KEY)); 561565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 562565505b1a2c1d3099496af5910760087602e994aSatish Sampath 563565505b1a2c1d3099496af5910760087602e994aSatish Sampath /** 564565505b1a2c1d3099496af5910760087602e994aSatish Sampath * Launches the default web search activity with the query parameters if the given url string 565565505b1a2c1d3099496af5910760087602e994aSatish Sampath * was identified as plain search terms and not URL/shortcut. 566565505b1a2c1d3099496af5910760087602e994aSatish Sampath * @return true if the request was handled and web search activity was launched, false if not. 567565505b1a2c1d3099496af5910760087602e994aSatish Sampath */ 5680485170e03e079eb61b9dd52fc2c98da02fa7b2cBjorn Bringert private boolean handleWebSearchRequest(String inUrl, Bundle appData, String extraData) { 569565505b1a2c1d3099496af5910760087602e994aSatish Sampath if (inUrl == null) return false; 570565505b1a2c1d3099496af5910760087602e994aSatish Sampath 571565505b1a2c1d3099496af5910760087602e994aSatish Sampath // In general, we shouldn't modify URL from Intent. 572565505b1a2c1d3099496af5910760087602e994aSatish Sampath // But currently, we get the user-typed URL from search box as well. 573565505b1a2c1d3099496af5910760087602e994aSatish Sampath String url = fixUrl(inUrl).trim(); 574565505b1a2c1d3099496af5910760087602e994aSatish Sampath 575956cf01ecde1442353a2af0bbce8779df6707b30Leon Scroggins // URLs are handled by the regular flow of control, so 576565505b1a2c1d3099496af5910760087602e994aSatish Sampath // return early. 5775ee906c089567bca705e18561357510d7b55cb5aDan Egnor if (Patterns.WEB_URL.matcher(url).matches() 578956cf01ecde1442353a2af0bbce8779df6707b30Leon Scroggins || ACCEPTED_URI_SCHEMA.matcher(url).matches()) { 579565505b1a2c1d3099496af5910760087602e994aSatish Sampath return false; 580565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 581565505b1a2c1d3099496af5910760087602e994aSatish Sampath 5828d06e36fe80f516e04ad33ff8b446720e36cabfdLeon Scroggins final ContentResolver cr = mResolver; 5838d06e36fe80f516e04ad33ff8b446720e36cabfdLeon Scroggins final String newUrl = url; 584627d96f1564e9f95d8258958b35467057ff4c6b8Elliott Slaughter if (mTabControl == null || !mTabControl.getCurrentWebView().isPrivateBrowsingEnabled()) { 585f0f03954b3092296c58dcb040e2dabd1696dd5c4Elliott Slaughter new AsyncTask<Void, Void, Void>() { 586f0f03954b3092296c58dcb040e2dabd1696dd5c4Elliott Slaughter @Override 587f0f03954b3092296c58dcb040e2dabd1696dd5c4Elliott Slaughter protected Void doInBackground(Void... unused) { 588f0f03954b3092296c58dcb040e2dabd1696dd5c4Elliott Slaughter Browser.updateVisitedHistory(cr, newUrl, false); 589f0f03954b3092296c58dcb040e2dabd1696dd5c4Elliott Slaughter Browser.addSearchUrl(cr, newUrl); 590f0f03954b3092296c58dcb040e2dabd1696dd5c4Elliott Slaughter return null; 591f0f03954b3092296c58dcb040e2dabd1696dd5c4Elliott Slaughter } 592f0f03954b3092296c58dcb040e2dabd1696dd5c4Elliott Slaughter }.execute(); 593f0f03954b3092296c58dcb040e2dabd1696dd5c4Elliott Slaughter } 594565505b1a2c1d3099496af5910760087602e994aSatish Sampath 595d69f51ddd5b6c28c9d16725e65facaf830d650e1Bjorn Bringert SearchEngine searchEngine = mSettings.getSearchEngine(); 596d69f51ddd5b6c28c9d16725e65facaf830d650e1Bjorn Bringert if (searchEngine == null) return false; 597d69f51ddd5b6c28c9d16725e65facaf830d650e1Bjorn Bringert searchEngine.startSearch(this, url, appData, extraData); 598565505b1a2c1d3099496af5910760087602e994aSatish Sampath 599565505b1a2c1d3099496af5910760087602e994aSatish Sampath return true; 600565505b1a2c1d3099496af5910760087602e994aSatish Sampath } 601565505b1a2c1d3099496af5910760087602e994aSatish Sampath 60225ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima private UrlData getUrlDataFromIntent(Intent intent) { 60358d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins String url = ""; 604068e48b469f5abca53ee3da38f933cf2c25c93b8Grace Kloba Map<String, String> headers = null; 6050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (intent != null) { 6060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final String action = intent.getAction(); 6070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (Intent.ACTION_VIEW.equals(action)) { 6080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = smartUrlFilter(intent.getData()); 6090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null && url.startsWith("content:")) { 6100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* Append mimetype so webview knows how to display */ 6110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String mimeType = intent.resolveType(getContentResolver()); 6120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mimeType != null) { 6130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url += "?" + mimeType; 6140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 6150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 616068e48b469f5abca53ee3da38f933cf2c25c93b8Grace Kloba if (url != null && url.startsWith("http")) { 61700f54c589fd38431efd42ea2a551a49e64d595d5Grace Kloba final Bundle pairs = intent 61800f54c589fd38431efd42ea2a551a49e64d595d5Grace Kloba .getBundleExtra(Browser.EXTRA_HEADERS); 6192d508edbf54ea74cd4e89be8b622b1cbd587464aGrace Kloba if (pairs != null && !pairs.isEmpty()) { 62000f54c589fd38431efd42ea2a551a49e64d595d5Grace Kloba Iterator<String> iter = pairs.keySet().iterator(); 621068e48b469f5abca53ee3da38f933cf2c25c93b8Grace Kloba headers = new HashMap<String, String>(); 62200f54c589fd38431efd42ea2a551a49e64d595d5Grace Kloba while (iter.hasNext()) { 62300f54c589fd38431efd42ea2a551a49e64d595d5Grace Kloba String key = iter.next(); 62400f54c589fd38431efd42ea2a551a49e64d595d5Grace Kloba headers.put(key, pairs.getString(key)); 625068e48b469f5abca53ee3da38f933cf2c25c93b8Grace Kloba } 626068e48b469f5abca53ee3da38f933cf2c25c93b8Grace Kloba } 62725ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima } 6280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (Intent.ACTION_SEARCH.equals(action) 6290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action) 6300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || Intent.ACTION_WEB_SEARCH.equals(action)) { 6310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = intent.getStringExtra(SearchManager.QUERY); 6320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null) { 6330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mLastEnteredUrl = url; 6340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // In general, we shouldn't modify URL from Intent. 6350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // But currently, we get the user-typed URL from search box as well. 6360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = fixUrl(url); 6370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = smartUrlFilter(url); 6388d06e36fe80f516e04ad33ff8b446720e36cabfdLeon Scroggins final ContentResolver cr = mResolver; 6398d06e36fe80f516e04ad33ff8b446720e36cabfdLeon Scroggins final String newUrl = url; 6408389e996e600cf51d85fa29b4de12f69e34ccd2dElliott Slaughter if (mTabControl == null 6418389e996e600cf51d85fa29b4de12f69e34ccd2dElliott Slaughter || mTabControl.getCurrentWebView() == null 6428389e996e600cf51d85fa29b4de12f69e34ccd2dElliott Slaughter || !mTabControl.getCurrentWebView().isPrivateBrowsingEnabled()) { 6438389e996e600cf51d85fa29b4de12f69e34ccd2dElliott Slaughter new AsyncTask<Void, Void, Void>() { 6448389e996e600cf51d85fa29b4de12f69e34ccd2dElliott Slaughter @Override 6458389e996e600cf51d85fa29b4de12f69e34ccd2dElliott Slaughter protected Void doInBackground(Void... unused) { 6468389e996e600cf51d85fa29b4de12f69e34ccd2dElliott Slaughter Browser.updateVisitedHistory(cr, newUrl, false); 6478389e996e600cf51d85fa29b4de12f69e34ccd2dElliott Slaughter return null; 6488389e996e600cf51d85fa29b4de12f69e34ccd2dElliott Slaughter } 6498389e996e600cf51d85fa29b4de12f69e34ccd2dElliott Slaughter }.execute(); 6508389e996e600cf51d85fa29b4de12f69e34ccd2dElliott Slaughter } 6510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String searchSource = "&source=android-" + GOOGLE_SEARCH_SOURCE_SUGGEST + "&"; 6520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url.contains(searchSource)) { 6530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String source = null; 6540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final Bundle appData = intent.getBundleExtra(SearchManager.APP_DATA); 6550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (appData != null) { 65610d1cca0c208d1f9db23893a8515685e04cfe224Bjorn Bringert source = appData.getString(Search.SOURCE); 6570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 6580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (TextUtils.isEmpty(source)) { 6590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project source = GOOGLE_SEARCH_SOURCE_UNKNOWN; 6600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 6610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = url.replace(searchSource, "&source=android-"+source+"&"); 6620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 6630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 6640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 6650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 66658d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins return new UrlData(url, headers, intent); 6670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 66858d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins /* package */ void showVoiceTitleBar(String title) { 66958d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins mTitleBar.setInVoiceMode(true); 67058d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins mTitleBar.setDisplayTitle(title); 671a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb mFakeTitleBar.setInVoiceMode(true); 672a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb mFakeTitleBar.setDisplayTitle(title); 67358d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins } 67458d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins /* package */ void revertVoiceTitleBar() { 67558d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins mTitleBar.setInVoiceMode(false); 676003a5ddf3a7ff1b30bfd82cddc8da49cb9fedf15Leon Scroggins mTitleBar.setDisplayTitle(mUrl); 677a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb mFakeTitleBar.setInVoiceMode(false); 678a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb mFakeTitleBar.setDisplayTitle(mUrl); 67958d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins } 6800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ static String fixUrl(String inUrl) { 681652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark // FIXME: Converting the url to lower case 682652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark // duplicates functionality in smartUrlFilter(). 683652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark // However, changing all current callers of fixUrl to 684652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark // call smartUrlFilter in addition may have unwanted 685652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark // consequences, and is deferred for now. 686652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark int colon = inUrl.indexOf(':'); 687652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark boolean allLower = true; 688652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark for (int index = 0; index < colon; index++) { 689652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark char ch = inUrl.charAt(index); 690652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark if (!Character.isLetter(ch)) { 691652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark break; 692652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark } 693652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark allLower &= Character.isLowerCase(ch); 694652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark if (index == colon - 1 && !allLower) { 695652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark inUrl = inUrl.substring(0, colon).toLowerCase() 696652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark + inUrl.substring(colon); 697652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark } 698652ff87f0905abd11f2fdb6cb4de7840985a0810Cary Clark } 6990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (inUrl.startsWith("http://") || inUrl.startsWith("https://")) 7000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return inUrl; 7010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (inUrl.startsWith("http:") || 7020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inUrl.startsWith("https:")) { 7030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (inUrl.startsWith("http:/") || inUrl.startsWith("https:/")) { 7040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inUrl = inUrl.replaceFirst("/", "//"); 7050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else inUrl = inUrl.replaceFirst(":", "://"); 7060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return inUrl; 7080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 71022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba @Override 71122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba protected void onResume() { 7120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onResume(); 71331a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 7140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, "BrowserActivity.onResume: this=" + this); 7150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 7170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!mActivityInPause) { 7180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(LOGTAG, "BrowserActivity is already resumed."); 7190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 7200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 7227bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed mTabControl.resumeCurrentTab(); 7230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mActivityInPause = false; 7247bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed resumeWebViewTimers(); 7250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 7260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mWakeLock.isHeld()) { 7270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mHandler.removeMessages(RELEASE_WAKELOCK); 7280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWakeLock.release(); 7290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 7310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project registerReceiver(mNetworkStateIntentReceiver, 7320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mNetworkStateChangedFilter); 7330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView.enablePlatformNotifications(); 7340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 7350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 7363bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins /** 7373bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * Since the actual title bar is embedded in the WebView, and removing it 738fe87bd3a3897e4bad65bb3d284659ae2f4e57570Leon Scroggins * would change its appearance, use a different TitleBar to show overlayed 739fe87bd3a3897e4bad65bb3d284659ae2f4e57570Leon Scroggins * at the top of the screen, when the menu is open or the page is loading. 7403bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins */ 741a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb private TitleBarBase mFakeTitleBar; 7423bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins 7433bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins /** 7443bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * Keeps track of whether the options menu is open. This is important in 7453bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * determining whether to show or hide the title bar overlay. 7463bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins */ 7473bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins private boolean mOptionsMenuOpen; 7483bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins 7493bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins /** 7503bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * Only meaningful when mOptionsMenuOpen is true. This variable keeps track 7513bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * of whether the configuration has changed. The first onMenuOpened call 7523bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * after a configuration change is simply a reopening of the same menu 7533bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * (i.e. mIconView did not change). 7543bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins */ 7553bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins private boolean mConfigChanged; 7563bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins 7573bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins /** 7583bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * Whether or not the options menu is in its smaller, icon menu form. When 7593bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * true, we want the title bar overlay to be up. When false, we do not. 7603bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * Only meaningful if mOptionsMenuOpen is true. 7613bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins */ 7623bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins private boolean mIconView; 7633bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins 764a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins @Override 765a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins public boolean onMenuOpened(int featureId, Menu menu) { 7663bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins if (Window.FEATURE_OPTIONS_PANEL == featureId) { 7673bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins if (mOptionsMenuOpen) { 7683bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins if (mConfigChanged) { 7693bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // We do not need to make any changes to the state of the 7703bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // title bar, since the only thing that happened was a 7713bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // change in orientation 7723bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mConfigChanged = false; 7733bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } else { 7743bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins if (mIconView) { 7753bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // Switching the menu to expanded view, so hide the 7763bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // title bar. 7773bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins hideFakeTitleBar(); 7783bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mIconView = false; 7793bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } else { 7803bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // Switching the menu back to icon view, so show the 7813bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // title bar once again. 7823bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins showFakeTitleBar(); 7833bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mIconView = true; 7843bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } 7853bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } 7863bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } else { 7873bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins // The options menu is closed, so open it, and show the title 7883bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins showFakeTitleBar(); 7893bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mOptionsMenuOpen = true; 7903bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mConfigChanged = false; 7913bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mIconView = true; 7923bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } 7933bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } 794a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins return true; 795a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins } 796a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins 797a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb void showFakeTitleBar() { 798a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb if (!isFakeTitleBarShowing() && mActiveTabsPage == null && !mActivityInPause) { 799847c25b877f1c912fe54ba7d3890df7ed3798e47Grace Kloba WebView mainView = mTabControl.getCurrentWebView(); 800847c25b877f1c912fe54ba7d3890df7ed3798e47Grace Kloba // if there is no current WebView, don't show the faked title bar; 80165190702c53f2d3ceb8e3c88d707bd6ff874034cGrace Kloba if (mainView == null) { 802a04645545690d9f637ccae4d043a5a1b8478a832Cary Clark return; 803a04645545690d9f637ccae4d043a5a1b8478a832Cary Clark } 80479e36d97b67bf06b1e0c0edf773882e93a3293e4Leon Scroggins // Do not need to check for null, since the current tab will have 80579e36d97b67bf06b1e0c0edf773882e93a3293e4Leon Scroggins // at least a main WebView, or we would have returned above. 8068e4fbf1b26c2cc05a56ba2d4e7d1eda7d1574e91Leon Scroggins III if (isInCustomActionMode()) { 8078e4fbf1b26c2cc05a56ba2d4e7d1eda7d1574e91Leon Scroggins III // Do not show the fake title bar, while a custom ActionMode 8088e4fbf1b26c2cc05a56ba2d4e7d1eda7d1574e91Leon Scroggins III // (i.e. find or select) is showing. 80979e36d97b67bf06b1e0c0edf773882e93a3293e4Leon Scroggins return; 81079e36d97b67bf06b1e0c0edf773882e93a3293e4Leon Scroggins } 811a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb if (mXLargeScreenSize) { 812a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb mContentView.addView(mFakeTitleBar); 813a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb mTabBar.onShowTitleBar(); 814a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb } else { 815a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb WindowManager manager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); 816a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb 817a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb // Add the title bar to the window manager so it can receive 818a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb // touches 819a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb // while the menu is up 820a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb WindowManager.LayoutParams params = 821a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb new WindowManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 822a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb ViewGroup.LayoutParams.WRAP_CONTENT, 823a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb WindowManager.LayoutParams.TYPE_APPLICATION, 824a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 825a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb PixelFormat.TRANSLUCENT); 826a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb params.gravity = Gravity.TOP; 827a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb boolean atTop = mainView.getScrollY() == 0; 828a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb params.windowAnimations = atTop ? 0 : R.style.TitleBar; 829a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb manager.addView(mFakeTitleBar, params); 830a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb } 8313bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } 8323bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } 8333bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins 8343bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins @Override 8353bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins public void onOptionsMenuClosed(Menu menu) { 8363bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mOptionsMenuOpen = false; 837a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins if (!mInLoad) { 838a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins hideFakeTitleBar(); 839a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins } else if (!mIconView) { 840a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins // The page is currently loading, and we are in expanded mode, so 841a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins // we were not showing the menu. Show it once again. It will be 842a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins // removed when the page finishes. 843a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins showFakeTitleBar(); 844a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins } 8453bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } 84622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba 847a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb void stopScrolling() { 848a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb ((ScrollWebView) mTabControl.getCurrentWebView()).stopScroll(); 849a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb } 850a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb 851a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb void hideFakeTitleBar() { 852a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb if (!isFakeTitleBarShowing()) return; 853a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb if (mXLargeScreenSize) { 854a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb mContentView.removeView(mFakeTitleBar); 855a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb mTabBar.onHideTitleBar(); 856a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb } else { 857a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb WindowManager.LayoutParams params = 858a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb (WindowManager.LayoutParams) mFakeTitleBar.getLayoutParams(); 859a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb WebView mainView = mTabControl.getCurrentWebView(); 860a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb // Although we decided whether or not to animate based on the 861a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb // current 862a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb // scroll position, the scroll position may have changed since the 863a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb // fake title bar was displayed. Make sure it has the appropriate 864a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb // animation/lack thereof before removing. 865a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb params.windowAnimations = 866a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb mainView != null && mainView.getScrollY() == 0 ? 0 : R.style.TitleBar; 867a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb WindowManager manager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); 868a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb manager.updateViewLayout(mFakeTitleBar, params); 869a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb manager.removeView(mFakeTitleBar); 870a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb } 871a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb } 872a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb 873a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb boolean isFakeTitleBarShowing() { 874a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb return (mFakeTitleBar.getParent() != null); 8753bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } 8763bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins 8770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 878c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins * Special method for the fake title bar to call when displaying its context 879c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins * menu, since it is in its own Window, and its parent does not show a 880c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins * context menu. 881c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins */ 882c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins /* package */ void showTitleBarContextMenu() { 88365f4a3ce9e5c4a5227bbcbb995e5e15f1f85d3d7Cary Clark if (null == mTitleBar.getParent()) { 88465f4a3ce9e5c4a5227bbcbb995e5e15f1f85d3d7Cary Clark return; 88565f4a3ce9e5c4a5227bbcbb995e5e15f1f85d3d7Cary Clark } 886c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins openContextMenu(mTitleBar); 887c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins } 888c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins 889b2b19f501ee05448ca81bddaaca70e9b2f51cb54Leon Scroggins @Override 890b2b19f501ee05448ca81bddaaca70e9b2f51cb54Leon Scroggins public void onContextMenuClosed(Menu menu) { 891b2b19f501ee05448ca81bddaaca70e9b2f51cb54Leon Scroggins super.onContextMenuClosed(menu); 892b2b19f501ee05448ca81bddaaca70e9b2f51cb54Leon Scroggins if (mInLoad) { 893b2b19f501ee05448ca81bddaaca70e9b2f51cb54Leon Scroggins showFakeTitleBar(); 894b2b19f501ee05448ca81bddaaca70e9b2f51cb54Leon Scroggins } 895b2b19f501ee05448ca81bddaaca70e9b2f51cb54Leon Scroggins } 896b2b19f501ee05448ca81bddaaca70e9b2f51cb54Leon Scroggins 897c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins /** 8980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * onSaveInstanceState(Bundle map) 8990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * onSaveInstanceState is called right before onStop(). The map contains 9000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * the saved state. 9010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 90222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba @Override 90322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba protected void onSaveInstanceState(Bundle outState) { 90431a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGV_ENABLED) { 9050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.v(LOGTAG, "BrowserActivity.onSaveInstanceState: this=" + this); 9060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the default implementation requires each view to have an id. As the 9080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // browser handles the state itself and it doesn't use id for the views, 9090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // don't call the default implementation. Otherwise it will trigger the 9100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // warning like this, "couldn't save which view has focus because the 9110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // focused view XXX has no id". 9120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 9130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Save all the tabs 9140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.saveState(outState); 9153d6df16f1c9a64cf2dc5b41a2078f4c49b0c296aElliott Slaughter 9163d6df16f1c9a64cf2dc5b41a2078f4c49b0c296aElliott Slaughter // Save time so that we know how old incognito tabs (if any) are. 9173d6df16f1c9a64cf2dc5b41a2078f4c49b0c296aElliott Slaughter outState.putSerializable("lastActiveDate", Calendar.getInstance()); 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 979a7611811e0d744a7220b7bf80c8f795af5ea53edBjorn Bringert // Stop watching the default geolocation permissions 980a7611811e0d744a7220b7bf80c8f795af5ea53edBjorn Bringert mSystemAllowGeolocationOrigins.stop(); 981a7611811e0d744a7220b7bf80c8f795af5ea53edBjorn Bringert mSystemAllowGeolocationOrigins = null; 9820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 9840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 9850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onConfigurationChanged(Configuration newConfig) { 9863bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins mConfigChanged = true; 9870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onConfigurationChanged(newConfig); 9880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 9890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mPageInfoDialog != null) { 9900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoDialog.dismiss(); 9910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showPageInfo( 9920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoView, 993c7b92f811dfa3572578ddc6714c98a03936d9ce5Leon Scroggins mPageInfoFromShowSSLCertificateOnError); 9940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 9950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mSSLCertificateDialog != null) { 9960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateDialog.dismiss(); 9970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificate( 9980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateView); 9990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mSSLCertificateOnErrorDialog != null) { 10010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorDialog.dismiss(); 10020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificateOnError( 10030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView, 10040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler, 10050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError); 10060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mHttpAuthenticationDialog != null) { 10082573892d6dbcda5519fcc8bd2876a27c4c9502b1Bjorn Bringert mHttpAuthenticationDialog.reshow(); 10090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 101222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba @Override 101322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba public void onLowMemory() { 10140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onLowMemory(); 10150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.freeMemory(); 10160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1018ff4d92ca529f8b77db67d0aea5d9988d5e390211Cary Clark private void resumeWebViewTimers() { 101922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Tab tab = mTabControl.getCurrentTab(); 1020ff4d92ca529f8b77db67d0aea5d9988d5e390211Cary Clark if (tab == null) return; // monkey can trigger this 102122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba boolean inLoad = tab.inLoad(); 102222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if ((!mActivityInPause && !inLoad) || (mActivityInPause && inLoad)) { 10230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project CookieSyncManager.getInstance().startSync(); 102422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba WebView w = tab.getWebView(); 10250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 10260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.resumeTimers(); 10270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10317bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed private boolean pauseWebViewTimers() { 103222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Tab tab = mTabControl.getCurrentTab(); 103322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba boolean inLoad = tab.inLoad(); 103422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (mActivityInPause && !inLoad) { 10350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project CookieSyncManager.getInstance().stopSync(); 10360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = mTabControl.getCurrentWebView(); 10370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 10380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.pauseTimers(); 10390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 10410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 10420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 10430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Open the icon database and retain all the icons for visited sites. 10470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void retainIconsOnStartup() { 10480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebIconDatabase db = WebIconDatabase.getInstance(); 10490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project db.open(getDir("icons", 0).getPath()); 10502c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins Cursor c = null; 10510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 10522c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins c = Browser.getAllBookmarks(mResolver); 10532c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins if (c.moveToFirst()) { 10542c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins int urlIndex = c.getColumnIndex(Browser.BookmarkColumns.URL); 10552c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins do { 10562c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins String url = c.getString(urlIndex); 10572c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins db.retainIconForPageUrl(url); 10582c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins } while (c.moveToNext()); 10590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (IllegalStateException e) { 10610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.e(LOGTAG, "retainIconsOnStartup", e); 10622c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins } finally { 10632c0f611fab8c0a24365c0dd5cbf0a90f70f314c8Leon Scroggins if (c!= null) c.close(); 10640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Helper method for getting the top window. 10680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView getTopWindow() { 10690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return mTabControl.getCurrentTopWebView(); 10700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 107222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba TabControl getTabControl() { 107322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba return mTabControl; 107422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 107522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba 10760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 10770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onCreateOptionsMenu(Menu menu) { 10780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onCreateOptionsMenu(menu); 10790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project MenuInflater inflater = getMenuInflater(); 10810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inflater.inflate(R.menu.browser, menu); 10820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenu = menu; 10830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project updateInLoadMenuItems(); 10840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 10850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 10860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 10870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 10880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * As the menu can be open when loading state changes 10890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * we must manually update the state of the stop/reload menu 10900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * item 10910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 10920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void updateInLoadMenuItems() { 10930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mMenu == null) { 10940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 10950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1096e0a3666b5c0dca7352895fa8b9b4fbb2237df721Michael Kolb MenuItem dest = mMenu.findItem(R.id.stop_reload_menu_id); 10970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project MenuItem src = mInLoad ? 10980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMenu.findItem(R.id.stop_menu_id): 1099e0a3666b5c0dca7352895fa8b9b4fbb2237df721Michael Kolb mMenu.findItem(R.id.reload_menu_id); 1100e0a3666b5c0dca7352895fa8b9b4fbb2237df721Michael Kolb if (src != null) { 1101e0a3666b5c0dca7352895fa8b9b4fbb2237df721Michael Kolb dest.setIcon(src.getIcon()); 1102e0a3666b5c0dca7352895fa8b9b4fbb2237df721Michael Kolb dest.setTitle(src.getTitle()); 1103e0a3666b5c0dca7352895fa8b9b4fbb2237df721Michael Kolb } 11040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 11070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onContextItemSelected(MenuItem item) { 11080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // chording is not an issue with context menus, but we use the same 11090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // options selector, so set mCanChord to true so we can access them. 11100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCanChord = true; 11110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int id = item.getItemId(); 111296afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins boolean result = true; 11130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (id) { 1114c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins // For the context menu from the title bar 1115c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins case R.id.title_bar_copy_page_url: 111696afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins Tab currentTab = mTabControl.getCurrentTab(); 111796afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins if (null == currentTab) { 111896afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins result = false; 111996afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins break; 1120c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins } 112196afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins WebView mainView = currentTab.getWebView(); 112296afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins if (null == mainView) { 112396afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins result = false; 112496afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins break; 1125c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins } 112696afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins copy(mainView.getUrl()); 1127c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins break; 11280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // -- Browser context menu 11290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.open_context_menu_id: 11300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.bookmark_context_menu_id: 11310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.save_link_context_menu_id: 11320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.share_link_context_menu_id: 11330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.copy_link_context_menu_id: 1134c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins final WebView webView = getTopWindow(); 1135c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins if (null == webView) { 113696afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins result = false; 113796afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins break; 1138c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins } 1139c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins final HashMap hrefMap = new HashMap(); 1140c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins hrefMap.put("webview", webView); 1141c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins final Message msg = mHandler.obtainMessage( 1142c6fa1104e549b8f5b89195d22c41059e77672dfaLeon Scroggins FOCUS_NODE_HREF, id, 0, hrefMap); 11430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project webView.requestFocusNodeHref(msg); 11440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 11450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project default: 11470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // For other context menus 114896afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins result = onOptionsItemSelected(item); 11490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCanChord = false; 115196afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins return result; 11520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Bundle createGoogleSearchSourceBundle(String source) { 11550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Bundle bundle = new Bundle(); 115610d1cca0c208d1f9db23893a8515685e04cfe224Bjorn Bringert bundle.putString(Search.SOURCE, source); 11570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return bundle; 11580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11608ad299270a97dfa3f9bcb956096bc152498fb727Leon Scroggins /* package */ void editUrl() { 116168579393973f745fc65a2781061af9bb8f2d7020Leon Scroggins if (mOptionsMenuOpen) closeOptionsMenu(); 11625bbe98025a2c606a35c91b826760020890daadb1Leon Scroggins String url = (getTopWindow() == null) ? null : getTopWindow().getUrl(); 116383f473462fcd7869031a423c02b957c6e938a2f6Grace Kloba startSearch(mSettings.getHomePage().equals(url) ? null : url, true, 11648ad299270a97dfa3f9bcb956096bc152498fb727Leon Scroggins null, false); 11650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11678ad299270a97dfa3f9bcb956096bc152498fb727Leon Scroggins /** 11688ad299270a97dfa3f9bcb956096bc152498fb727Leon Scroggins * Overriding this to insert a local information bundle 11698ad299270a97dfa3f9bcb956096bc152498fb727Leon Scroggins */ 11700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 11710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void startSearch(String initialQuery, boolean selectInitialQuery, 11720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Bundle appSearchData, boolean globalSearch) { 11730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (appSearchData == null) { 11740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project appSearchData = createGoogleSearchSourceBundle(GOOGLE_SEARCH_SOURCE_TYPE); 11750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1176430057dad085f3c3dbc386f127b1f5a10a9851daLeon Scroggins III 1177430057dad085f3c3dbc386f127b1f5a10a9851daLeon Scroggins III SearchEngine searchEngine = mSettings.getSearchEngine(); 1178430057dad085f3c3dbc386f127b1f5a10a9851daLeon Scroggins III if (searchEngine != null && !searchEngine.supportsVoiceSearch()) { 1179430057dad085f3c3dbc386f127b1f5a10a9851daLeon Scroggins III appSearchData.putBoolean(SearchManager.DISABLE_VOICE_SEARCH, true); 1180430057dad085f3c3dbc386f127b1f5a10a9851daLeon Scroggins III } 1181430057dad085f3c3dbc386f127b1f5a10a9851daLeon Scroggins III 11820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.startSearch(initialQuery, selectInitialQuery, appSearchData, globalSearch); 11830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 11840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 11851f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins /** 11861f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins * Switch tabs. Called by the TitleBarSet when sliding the title bar 11871f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins * results in changing tabs. 1188160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * @param index Index of the tab to change to, as defined by 1189160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * mTabControl.getTabIndex(Tab t). 1190160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * @return boolean True if we successfully switched to a different tab. If 1191160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * the indexth tab is null, or if that tab is the same as 1192160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * the current one, return false. 11931f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins */ 1194160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins /* package */ boolean switchToTab(int index) { 119522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Tab tab = mTabControl.getTab(index); 119622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Tab currentTab = mTabControl.getCurrentTab(); 11971f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (tab == null || tab == currentTab) { 1198160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins return false; 11991f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 12001f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (currentTab != null) { 12011f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // currentTab may be null if it was just removed. In that case, 12021f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // we do not need to remove it 12031f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins removeTabFromContentView(currentTab); 12041f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 12051f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins mTabControl.setCurrentTab(tab); 12061f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins attachTabToContentView(tab); 1207eb6eef4c45df2d65c3e70660493a147a2be405e3Grace Kloba resetTitleIconAndProgress(); 1208eb6eef4c45df2d65c3e70660493a147a2be405e3Grace Kloba updateLockIconToLatest(); 1209160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins return true; 12101f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 12111f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins 121222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba /* package */ Tab openTabToHomePage() { 12130a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins return openTabAndShow(mSettings.getHomePage(), false, null); 12140a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins } 12150a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins 12161f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins /* package */ void closeCurrentWindow() { 121722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba final Tab current = mTabControl.getCurrentTab(); 1218160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins if (mTabControl.getTabCount() == 1) { 1219304442375719effd41dbd53ae62de7a8d0cec7d9Leon Scroggins // This is the last tab. Open a new one, with the home 1220304442375719effd41dbd53ae62de7a8d0cec7d9Leon Scroggins // page and close the current one. 122122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba openTabToHomePage(); 1222160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins closeTab(current); 1223160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins return; 1224160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins } 122522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba final Tab parent = current.getParentTab(); 12261f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins int indexToShow = -1; 12271f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (parent != null) { 12281f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins indexToShow = mTabControl.getTabIndex(parent); 12291f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } else { 1230160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins final int currentIndex = mTabControl.getCurrentIndex(); 1231160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins // Try to move to the tab to the right 1232160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins indexToShow = currentIndex + 1; 1233160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins if (indexToShow > mTabControl.getTabCount() - 1) { 1234160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins // Try to move to the tab to the left 1235160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins indexToShow = currentIndex - 1; 12361f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 12371f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 1238160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins if (switchToTab(indexToShow)) { 1239160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins // Close window 1240160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins closeTab(current); 1241160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins } 12421f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins } 12431f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins 12440a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins private ActiveTabsPage mActiveTabsPage; 12450a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins 12460a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins /** 12470a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins * Remove the active tabs page. 12480a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins * @param needToAttach If true, the active tabs page did not attach a tab 12490a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins * to the content view, so we need to do that here. 12500a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins */ 12510a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins /* package */ void removeActiveTabPage(boolean needToAttach) { 12520a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins mContentView.removeView(mActiveTabsPage); 1253d746a94137a87ffcc1fcefdac9a3764c3bc3f5cdLeon Scroggins mTitleBar.setVisibility(View.VISIBLE); 12540a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins mActiveTabsPage = null; 12550a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins mMenuState = R.id.MAIN_MENU; 12560a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins if (needToAttach) { 12570a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins attachTabToContentView(mTabControl.getCurrentTab()); 12580a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins } 12590a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins getTopWindow().requestFocus(); 12600a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins } 12610a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins 12628e4fbf1b26c2cc05a56ba2d4e7d1eda7d1574e91Leon Scroggins III @Override 1263d7973056703d47fe37b0ee57c36350834aeda827Adam Powell public void onActionModeStarted(ActionMode mode) { 1264d7973056703d47fe37b0ee57c36350834aeda827Adam Powell super.onActionModeStarted(mode); 12654fc12cbfe150afe12059ceb5bfa4a497ef20072dLeon Scroggins hideFakeTitleBar(); 12664fc12cbfe150afe12059ceb5bfa4a497ef20072dLeon Scroggins // Would like to change the MENU, but onEndActionMode may not be called 1267d7973056703d47fe37b0ee57c36350834aeda827Adam Powell // TODO onActionModeFinished will notify when an action mode ends 126801cfcdd0b77d672f5c09d98af683c6732c8250d8Cary Clark } 126901cfcdd0b77d672f5c09d98af683c6732c8250d8Cary Clark 12700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 12710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onOptionsItemSelected(MenuItem item) { 1272370a4f3e47b740fd10b9028aae9e87e17254caa8Michael Kolb if (item.getGroupId() != R.id.CONTEXT_MENU) { 1273370a4f3e47b740fd10b9028aae9e87e17254caa8Michael Kolb // menu remains active, so ensure comboview is dismissed 1274370a4f3e47b740fd10b9028aae9e87e17254caa8Michael Kolb // if main menu option is selected 1275370a4f3e47b740fd10b9028aae9e87e17254caa8Michael Kolb removeComboView(); 1276370a4f3e47b740fd10b9028aae9e87e17254caa8Michael Kolb } 1277ed217745066c160f785626e9a15ebe70af5e25e4Michael Kolb // check the action bar button before mCanChord check, as the prepare call 1278ed217745066c160f785626e9a15ebe70af5e25e4Michael Kolb // doesn't come for action bar buttons 1279ed217745066c160f785626e9a15ebe70af5e25e4Michael Kolb if (item.getItemId() == R.id.newtab) { 1280300b7f0951f3688a8e41f190b57cbf8b3bc06170Michael Kolb openTabToHomePage(); 1281ed217745066c160f785626e9a15ebe70af5e25e4Michael Kolb return true; 1282ed217745066c160f785626e9a15ebe70af5e25e4Michael Kolb } 12830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!mCanChord) { 12840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // The user has already fired a shortcut with this hold down of the 12850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // menu key. 12860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 12870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 12881f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (null == getTopWindow()) { 12890d7ae0ed82e21d472cde8cf92b5657d8ee8ca0d8Leon Scroggins return false; 12900d7ae0ed82e21d472cde8cf92b5657d8ee8ca0d8Leon Scroggins } 12916ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba if (mMenuIsDown) { 12926ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba // The shortcut action consumes the MENU. Even if it is still down, 12936ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba // it won't trigger the next shortcut action. In the case of the 12946ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba // shortcut action triggering a new activity, like Bookmarks, we 12956ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba // won't get onKeyUp for MENU. So it is important to reset it here. 12966ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba mMenuIsDown = false; 12976ee9c498b8cf648f1507281ed5a1834ba3390907Grace Kloba } 12980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (item.getItemId()) { 12990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // -- Main menu 1300a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins case R.id.new_tab_menu_id: 13010a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins openTabToHomePage(); 1302a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins break; 1303a81a764063d2f849fba0cbc3039f86e67c2960ddLeon Scroggins 1304ae62fd48652f989335db21a03d8289ecc5b57e88Michael Kolb case R.id.incognito_menu_id: 1305ae62fd48652f989335db21a03d8289ecc5b57e88Michael Kolb openIncognitoTab(); 1306ae62fd48652f989335db21a03d8289ecc5b57e88Michael Kolb break; 1307ae62fd48652f989335db21a03d8289ecc5b57e88Michael Kolb 130864b80f3efd95d7b5192731e995ccde79c4c6c11fLeon Scroggins case R.id.goto_menu_id: 13098ad299270a97dfa3f9bcb956096bc152498fb727Leon Scroggins editUrl(); 1310b3a5bedeede968b53363a6c517f92bc2484bb42dLeon Scroggins break; 1311b3a5bedeede968b53363a6c517f92bc2484bb42dLeon Scroggins 1312b3a5bedeede968b53363a6c517f92bc2484bb42dLeon Scroggins case R.id.bookmarks_menu_id: 1313e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb bookmarksOrHistoryPicker(false); 13140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13160a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins case R.id.active_tabs_menu_id: 13170a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins mActiveTabsPage = new ActiveTabsPage(this, mTabControl); 13180a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins removeTabFromContentView(mTabControl.getCurrentTab()); 1319d746a94137a87ffcc1fcefdac9a3764c3bc3f5cdLeon Scroggins mTitleBar.setVisibility(View.GONE); 132043de61666cfc98a3acc41c7161a1a8b0bdb2b72bLeon Scroggins hideFakeTitleBar(); 13210a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins mContentView.addView(mActiveTabsPage, COVER_SCREEN_PARAMS); 13220a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins mActiveTabsPage.requestFocus(); 13230a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins mMenuState = EMPTY_MENU; 13240a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins break; 13250a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins 13261f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins case R.id.add_bookmark_menu_id: 1327370a4f3e47b740fd10b9028aae9e87e17254caa8Michael Kolb bookmarkCurrentPage(AddBookmarkPage.DEFAULT_FOLDER_ID); 13280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.stop_reload_menu_id: 13310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mInLoad) { 13320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project stopLoading(); 13330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 13340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().reload(); 13350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 13360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.back_menu_id: 13390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().goBack(); 13400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.forward_menu_id: 13430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().goForward(); 13440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.close_menu_id: 13470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Close the subwindow if it exists. 13480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabControl.getCurrentSubWindow() != null) { 13490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dismissSubWindow(mTabControl.getCurrentTab()); 13500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 13521f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins closeCurrentWindow(); 13530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.homepage_menu_id: 135622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Tab current = mTabControl.getCurrentTab(); 13570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current != null) { 13580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project dismissSubWindow(current); 135992472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins loadUrl(current.getWebView(), mSettings.getHomePage()); 13600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 13610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.preferences_menu_id: 13640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent = new Intent(this, 13650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserPreferencesPage.class); 1366d530494de9c182af4aff97ddd46343b32594da51Leon Scroggins intent.putExtra(BrowserPreferencesPage.CURRENT_PAGE, 1367d530494de9c182af4aff97ddd46343b32594da51Leon Scroggins getTopWindow().getUrl()); 13680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project startActivityForResult(intent, PREFERENCES_PAGE); 13690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.find_menu_id: 13724fc12cbfe150afe12059ceb5bfa4a497ef20072dLeon Scroggins getTopWindow().showFindDialog(null); 13730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.page_info_menu_id: 13760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showPageInfo(mTabControl.getCurrentTab(), false); 13770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.classic_history_menu_id: 1380e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb bookmarksOrHistoryPicker(true); 13810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 138396afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins case R.id.title_bar_share_page_url: 13840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.share_page_menu_id: 138596afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins Tab currentTab = mTabControl.getCurrentTab(); 138696afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins if (null == currentTab) { 138796afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins mCanChord = false; 138896afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins return false; 138996afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins } 139096afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins currentTab.populatePickerData(); 139196afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins sharePage(this, currentTab.getTitle(), 139296afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins currentTab.getUrl(), currentTab.getFavicon(), 139387cc65d95c80c5e3a1c343ad5177a7dc2de874f6Ben Murdoch createScreenshot(currentTab.getWebView(), getDesiredThumbnailWidth(this), 139487cc65d95c80c5e3a1c343ad5177a7dc2de874f6Ben Murdoch getDesiredThumbnailHeight(this))); 13950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 13960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 13970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.dump_nav_menu_id: 13980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().debugDump(); 13990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14017a8b88b0e0f20544df5ee34b798398603261b733Andrei Popescu case R.id.dump_counters_menu_id: 14027a8b88b0e0f20544df5ee34b798398603261b733Andrei Popescu getTopWindow().dumpV8Counters(); 14037a8b88b0e0f20544df5ee34b798398603261b733Andrei Popescu break; 14047a8b88b0e0f20544df5ee34b798398603261b733Andrei Popescu 14050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.zoom_in_menu_id: 14060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().zoomIn(); 14070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.zoom_out_menu_id: 14100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getTopWindow().zoomOut(); 14110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.view_downloads_menu_id: 1414a682a3ccac02db69bd8708258aae263be4b22e72Leon Scroggins III viewDownloads(); 14150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_one_menu_id: 14180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_two_menu_id: 14190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_three_menu_id: 14200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_four_menu_id: 14210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_five_menu_id: 14220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_six_menu_id: 14230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_seven_menu_id: 14240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.window_eight_menu_id: 14250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project { 14260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int menuid = item.getItemId(); 14270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project for (int id = 0; id < WINDOW_SHORTCUT_ID_ARRAY.length; id++) { 14280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (WINDOW_SHORTCUT_ID_ARRAY[id] == menuid) { 142922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Tab desiredTab = mTabControl.getTab(id); 14300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (desiredTab != null && 14310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project desiredTab != mTabControl.getCurrentTab()) { 14321f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins switchToTab(id); 14330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 14390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 14400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project default: 14410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!super.onOptionsItemSelected(item)) { 14420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 14430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Otherwise fall through. 14450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCanChord = false; 14470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 14480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 14490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1450370a4f3e47b740fd10b9028aae9e87e17254caa8Michael Kolb /** 1451370a4f3e47b740fd10b9028aae9e87e17254caa8Michael Kolb * add the current page as a bookmark to the given folder id 1452370a4f3e47b740fd10b9028aae9e87e17254caa8Michael Kolb * @param folderId use -1 for the default folder 1453370a4f3e47b740fd10b9028aae9e87e17254caa8Michael Kolb */ 1454370a4f3e47b740fd10b9028aae9e87e17254caa8Michael Kolb /* package */ void bookmarkCurrentPage(long folderId) { 1455571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins Intent i = new Intent(BrowserActivity.this, 1456571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins AddBookmarkPage.class); 1457571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins WebView w = getTopWindow(); 1458bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins i.putExtra(BrowserContract.Bookmarks.URL, w.getUrl()); 1459bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins i.putExtra(BrowserContract.Bookmarks.TITLE, w.getTitle()); 146088d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins String touchIconUrl = w.getTouchIconUrl(); 146188d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins if (touchIconUrl != null) { 1462bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins i.putExtra(AddBookmarkPage.TOUCH_ICON_URL, touchIconUrl); 146388d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins WebSettings settings = w.getSettings(); 146488d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins if (settings != null) { 1465bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins i.putExtra(AddBookmarkPage.USER_AGENT, 1466bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins settings.getUserAgentString()); 146788d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins } 146888d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins } 1469bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins i.putExtra(BrowserContract.Bookmarks.THUMBNAIL, 1470bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins createScreenshot(w, getDesiredThumbnailWidth(this), 147187cc65d95c80c5e3a1c343ad5177a7dc2de874f6Ben Murdoch getDesiredThumbnailHeight(this))); 1472bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins i.putExtra(BrowserContract.Bookmarks.FAVICON, w.getFavicon()); 1473370a4f3e47b740fd10b9028aae9e87e17254caa8Michael Kolb i.putExtra(BrowserContract.Bookmarks.PARENT, 1474370a4f3e47b740fd10b9028aae9e87e17254caa8Michael Kolb folderId); 147576a0e9ce21bc3ad4798f5f76b36b1d514e3595beLeon Scroggins III // Put the dialog at the upper right of the screen, covering the 147676a0e9ce21bc3ad4798f5f76b36b1d514e3595beLeon Scroggins III // star on the title bar. 147776a0e9ce21bc3ad4798f5f76b36b1d514e3595beLeon Scroggins III i.putExtra("gravity", Gravity.RIGHT | Gravity.TOP); 1478571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins startActivity(i); 1479571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins } 1480571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins 14818e4fbf1b26c2cc05a56ba2d4e7d1eda7d1574e91Leon Scroggins III /* 14828e4fbf1b26c2cc05a56ba2d4e7d1eda7d1574e91Leon Scroggins III * True if a custom ActionMode (i.e. find or select) is in use. 14838e4fbf1b26c2cc05a56ba2d4e7d1eda7d1574e91Leon Scroggins III */ 14848e4fbf1b26c2cc05a56ba2d4e7d1eda7d1574e91Leon Scroggins III private boolean isInCustomActionMode() { 14858e4fbf1b26c2cc05a56ba2d4e7d1eda7d1574e91Leon Scroggins III return mActionMode != null; 148601cfcdd0b77d672f5c09d98af683c6732c8250d8Cary Clark } 148701cfcdd0b77d672f5c09d98af683c6732c8250d8Cary Clark 14888e4fbf1b26c2cc05a56ba2d4e7d1eda7d1574e91Leon Scroggins III /* 14894fc12cbfe150afe12059ceb5bfa4a497ef20072dLeon Scroggins * End the current ActionMode. 14908e4fbf1b26c2cc05a56ba2d4e7d1eda7d1574e91Leon Scroggins III */ 14918e4fbf1b26c2cc05a56ba2d4e7d1eda7d1574e91Leon Scroggins III void endActionMode() { 14928e4fbf1b26c2cc05a56ba2d4e7d1eda7d1574e91Leon Scroggins III if (mActionMode != null) { 14934fc12cbfe150afe12059ceb5bfa4a497ef20072dLeon Scroggins ActionMode mode = mActionMode; 14944fc12cbfe150afe12059ceb5bfa4a497ef20072dLeon Scroggins onEndActionMode(); 14954fc12cbfe150afe12059ceb5bfa4a497ef20072dLeon Scroggins mode.finish(); 14968e4fbf1b26c2cc05a56ba2d4e7d1eda7d1574e91Leon Scroggins III } 149701cfcdd0b77d672f5c09d98af683c6732c8250d8Cary Clark } 149801cfcdd0b77d672f5c09d98af683c6732c8250d8Cary Clark 1499211ba54a3052f7e68bf8af035ea1ef4e9445130cLeon Scroggins III /* 15008e4fbf1b26c2cc05a56ba2d4e7d1eda7d1574e91Leon Scroggins III * Called by find and select when they are finished. Replace title bars 15018e4fbf1b26c2cc05a56ba2d4e7d1eda7d1574e91Leon Scroggins III * as necessary. 1502211ba54a3052f7e68bf8af035ea1ef4e9445130cLeon Scroggins III */ 15038e4fbf1b26c2cc05a56ba2d4e7d1eda7d1574e91Leon Scroggins III public void onEndActionMode() { 15048e4fbf1b26c2cc05a56ba2d4e7d1eda7d1574e91Leon Scroggins III if (!isInCustomActionMode()) return; 150579e36d97b67bf06b1e0c0edf773882e93a3293e4Leon Scroggins if (mInLoad) { 150679e36d97b67bf06b1e0c0edf773882e93a3293e4Leon Scroggins // The title bar was hidden, because otherwise it would cover up the 1507a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb // find or select dialog. Now that the dialog has been removed, 150801cfcdd0b77d672f5c09d98af683c6732c8250d8Cary Clark // show the fake title bar once again. 150979e36d97b67bf06b1e0c0edf773882e93a3293e4Leon Scroggins showFakeTitleBar(); 151079e36d97b67bf06b1e0c0edf773882e93a3293e4Leon Scroggins } 15114fc12cbfe150afe12059ceb5bfa4a497ef20072dLeon Scroggins // Would like to return the menu state to normal, but this does not 15124fc12cbfe150afe12059ceb5bfa4a497ef20072dLeon Scroggins // necessarily get called. 15138e4fbf1b26c2cc05a56ba2d4e7d1eda7d1574e91Leon Scroggins III mActionMode = null; 15140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15168e4fbf1b26c2cc05a56ba2d4e7d1eda7d1574e91Leon Scroggins III // For select and find, we keep track of the ActionMode so that 15178e4fbf1b26c2cc05a56ba2d4e7d1eda7d1574e91Leon Scroggins III // finish() can be called as desired. 15188e4fbf1b26c2cc05a56ba2d4e7d1eda7d1574e91Leon Scroggins III private ActionMode mActionMode; 15198e4fbf1b26c2cc05a56ba2d4e7d1eda7d1574e91Leon Scroggins III 152022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba @Override 152122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba public boolean onPrepareOptionsMenu(Menu menu) { 15220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // This happens when the user begins to hold down the menu key, so 15230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // allow them to chord to get a shortcut. 15240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCanChord = true; 15250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Note: setVisible will decide whether an item is visible; while 15260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // setEnabled() will decide whether an item is enabled, which also means 15270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // whether the matching shortcut key will function. 15280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onPrepareOptionsMenu(menu); 15290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (mMenuState) { 15300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case EMPTY_MENU: 15310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mCurrentMenuState != mMenuState) { 15320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.MAIN_MENU, false); 15330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupEnabled(R.id.MAIN_MENU, false); 15340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupEnabled(R.id.MAIN_SHORTCUT_MENU, false); 15350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project default: 15380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mCurrentMenuState != mMenuState) { 15390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.MAIN_MENU, true); 15400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupEnabled(R.id.MAIN_MENU, true); 15410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupEnabled(R.id.MAIN_SHORTCUT_MENU, true); 15420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView w = getTopWindow(); 15440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean canGoBack = false; 15450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean canGoForward = false; 15460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean isHome = false; 15470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 15480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project canGoBack = w.canGoBack(); 15490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project canGoForward = w.canGoForward(); 15500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project isHome = mSettings.getHomePage().equals(w.getUrl()); 15510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final MenuItem back = menu.findItem(R.id.back_menu_id); 15530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project back.setEnabled(canGoBack); 15540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final MenuItem home = menu.findItem(R.id.homepage_menu_id); 15560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project home.setEnabled(!isHome); 15570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1558e0a3666b5c0dca7352895fa8b9b4fbb2237df721Michael Kolb final MenuItem forward = menu.findItem(R.id.forward_menu_id); 1559e0a3666b5c0dca7352895fa8b9b4fbb2237df721Michael Kolb forward.setEnabled(canGoForward); 15600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1561ed217745066c160f785626e9a15ebe70af5e25e4Michael Kolb if (!mXLargeScreenSize) { 1562ed217745066c160f785626e9a15ebe70af5e25e4Michael Kolb final MenuItem newtab = menu.findItem(R.id.new_tab_menu_id); 1563ed217745066c160f785626e9a15ebe70af5e25e4Michael Kolb newtab.setEnabled(mTabControl.canCreateNewTab()); 1564ed217745066c160f785626e9a15ebe70af5e25e4Michael Kolb } 15650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // decide whether to show the share link option 15660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project PackageManager pm = getPackageManager(); 15670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent send = new Intent(Intent.ACTION_SEND); 15680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project send.setType("text/plain"); 15690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ResolveInfo ri = pm.resolveActivity(send, PackageManager.MATCH_DEFAULT_ONLY); 15700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.share_page_menu_id).setVisible(ri != null); 15710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean isNavDump = mSettings.isNavDump(); 15730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final MenuItem nav = menu.findItem(R.id.dump_nav_menu_id); 15740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project nav.setVisible(isNavDump); 15750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project nav.setEnabled(isNavDump); 15767a8b88b0e0f20544df5ee34b798398603261b733Andrei Popescu 15777a8b88b0e0f20544df5ee34b798398603261b733Andrei Popescu boolean showDebugSettings = mSettings.showDebugSettings(); 15787a8b88b0e0f20544df5ee34b798398603261b733Andrei Popescu final MenuItem counter = menu.findItem(R.id.dump_counters_menu_id); 15797a8b88b0e0f20544df5ee34b798398603261b733Andrei Popescu counter.setVisible(showDebugSettings); 15807a8b88b0e0f20544df5ee34b798398603261b733Andrei Popescu counter.setEnabled(showDebugSettings); 15817a8b88b0e0f20544df5ee34b798398603261b733Andrei Popescu 15820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 15830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCurrentMenuState = mMenuState; 15850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 15860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 15870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 15880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 15890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCreateContextMenu(ContextMenu menu, View v, 15900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ContextMenuInfo menuInfo) { 1591571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins if (v instanceof TitleBarBase) { 15924e9f89b0a64395133b9160dcb4533d2dc62a424fLeon Scroggins return; 15934e9f89b0a64395133b9160dcb4533d2dc62a424fLeon Scroggins } 1594772927a9fa4acaafdef4ae3bde91cf0bb822ebd7Michael Kolb if (!(v instanceof WebView)) { 1595772927a9fa4acaafdef4ae3bde91cf0bb822ebd7Michael Kolb return; 1596772927a9fa4acaafdef4ae3bde91cf0bb822ebd7Michael Kolb } 15970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView webview = (WebView) v; 15980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView.HitTestResult result = webview.getHitTestResult(); 15990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (result == null) { 16000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 16010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int type = result.getType(); 16040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (type == WebView.HitTestResult.UNKNOWN_TYPE) { 16050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.w(LOGTAG, 16060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "We should not show context menu when nothing is touched"); 16070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 16080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (type == WebView.HitTestResult.EDIT_TEXT_TYPE) { 16100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // let TextView handles context menu 16110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 16120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 16130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Note, http://b/issue?id=1106666 is requesting that 16150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // an inflated menu can be used again. This is not available 16160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // yet, so inflate each time (yuk!) 16170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project MenuInflater inflater = getMenuInflater(); 16180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inflater.inflate(R.menu.browsercontext, menu); 16190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Show the correct menu group 16219e997c7c92175c8e24cef90e265cc35fd9b8710eLeon Scroggins III final String extra = result.getExtra(); 16220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.PHONE_MENU, 16230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project type == WebView.HitTestResult.PHONE_TYPE); 16240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.EMAIL_MENU, 16250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project type == WebView.HitTestResult.EMAIL_TYPE); 16260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.GEO_MENU, 16270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project type == WebView.HitTestResult.GEO_TYPE); 16280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.IMAGE_MENU, 16290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project type == WebView.HitTestResult.IMAGE_TYPE 16300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE); 16310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setGroupVisible(R.id.ANCHOR_MENU, 16320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project type == WebView.HitTestResult.SRC_ANCHOR_TYPE 16330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE); 16340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Setup custom handling depending on the type 16360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (type) { 16370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.PHONE_TYPE: 16380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setHeaderTitle(Uri.decode(extra)); 16390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.dial_context_menu_id).setIntent( 16400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Intent(Intent.ACTION_VIEW, Uri 16410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .parse(WebView.SCHEME_TEL + extra))); 16420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent addIntent = new Intent(Intent.ACTION_INSERT_OR_EDIT); 16430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project addIntent.putExtra(Insert.PHONE, Uri.decode(extra)); 16445e335a381a0cd66e94117b202c1f34f5cb29c9b8Cary Clark addIntent.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE); 16450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.add_contact_context_menu_id).setIntent( 16460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project addIntent); 16470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.copy_phone_context_menu_id).setOnMenuItemClickListener( 16480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Copy(extra)); 16490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 16500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.EMAIL_TYPE: 16520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setHeaderTitle(extra); 16530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.email_context_menu_id).setIntent( 16540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Intent(Intent.ACTION_VIEW, Uri 16550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .parse(WebView.SCHEME_MAILTO + extra))); 16560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.copy_mail_context_menu_id).setOnMenuItemClickListener( 16570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Copy(extra)); 16580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 16590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.GEO_TYPE: 16610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setHeaderTitle(extra); 16620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.map_context_menu_id).setIntent( 16630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Intent(Intent.ACTION_VIEW, Uri 16640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .parse(WebView.SCHEME_GEO 16650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project + URLEncoder.encode(extra)))); 16660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.copy_geo_context_menu_id).setOnMenuItemClickListener( 16670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Copy(extra)); 16680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 16690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 16700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.SRC_ANCHOR_TYPE: 16710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE: 16720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project TextView titleView = (TextView) LayoutInflater.from(this) 16730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(android.R.layout.browser_link_context_header, 16740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project null); 16750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project titleView.setText(extra); 16760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setHeaderView(titleView); 16770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // decide whether to show the open link in new tab option 16789e997c7c92175c8e24cef90e265cc35fd9b8710eLeon Scroggins III boolean showNewTab = mTabControl.canCreateNewTab(); 16799e997c7c92175c8e24cef90e265cc35fd9b8710eLeon Scroggins III MenuItem newTabItem 16809e997c7c92175c8e24cef90e265cc35fd9b8710eLeon Scroggins III = menu.findItem(R.id.open_newtab_context_menu_id); 16819e997c7c92175c8e24cef90e265cc35fd9b8710eLeon Scroggins III newTabItem.setVisible(showNewTab); 16829e997c7c92175c8e24cef90e265cc35fd9b8710eLeon Scroggins III if (showNewTab) { 16839e997c7c92175c8e24cef90e265cc35fd9b8710eLeon Scroggins III newTabItem.setOnMenuItemClickListener( 16849e997c7c92175c8e24cef90e265cc35fd9b8710eLeon Scroggins III new MenuItem.OnMenuItemClickListener() { 16859e997c7c92175c8e24cef90e265cc35fd9b8710eLeon Scroggins III public boolean onMenuItemClick(MenuItem item) { 16869e997c7c92175c8e24cef90e265cc35fd9b8710eLeon Scroggins III final Tab parent = mTabControl.getCurrentTab(); 168768792c84eded7f83e2f086d3efe81f9cfc07f9c3Michael Kolb final Tab newTab = openTab(extra, false); 16889e997c7c92175c8e24cef90e265cc35fd9b8710eLeon Scroggins III if (newTab != parent) { 16899e997c7c92175c8e24cef90e265cc35fd9b8710eLeon Scroggins III parent.addChildTab(newTab); 16909e997c7c92175c8e24cef90e265cc35fd9b8710eLeon Scroggins III } 16919e997c7c92175c8e24cef90e265cc35fd9b8710eLeon Scroggins III return true; 16929e997c7c92175c8e24cef90e265cc35fd9b8710eLeon Scroggins III } 16939e997c7c92175c8e24cef90e265cc35fd9b8710eLeon Scroggins III }); 16949e997c7c92175c8e24cef90e265cc35fd9b8710eLeon Scroggins III } 1695de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch menu.findItem(R.id.bookmark_context_menu_id).setVisible( 1696de353621650d17a412b6ffe2cbf0366db5f11c40Ben Murdoch Bookmarks.urlHasAcceptableScheme(extra)); 16970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project PackageManager pm = getPackageManager(); 16980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent send = new Intent(Intent.ACTION_SEND); 16990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project send.setType("text/plain"); 17000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ResolveInfo ri = pm.resolveActivity(send, PackageManager.MATCH_DEFAULT_ONLY); 17010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.share_link_context_menu_id).setVisible(ri != null); 17020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (type == WebView.HitTestResult.SRC_ANCHOR_TYPE) { 17030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 17040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // otherwise fall through to handle image part 17060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case WebView.HitTestResult.IMAGE_TYPE: 17070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (type == WebView.HitTestResult.IMAGE_TYPE) { 17080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.setHeaderTitle(extra); 17090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.view_image_context_menu_id).setIntent( 17110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new Intent(Intent.ACTION_VIEW, Uri.parse(extra))); 17120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project menu.findItem(R.id.download_context_menu_id). 17130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setOnMenuItemClickListener(new Download(extra)); 17144f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch menu.findItem(R.id.set_wallpaper_context_menu_id). 17154f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch setOnMenuItemClickListener(new SetAsWallpaper(extra)); 17160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 17170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project default: 17190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Log.w(LOGTAG, "We should not get here."); 17200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 17210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1722b2b19f501ee05448ca81bddaaca70e9b2f51cb54Leon Scroggins hideFakeTitleBar(); 17230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Attach the given tab to the content view. 1726c928c30a51eee84b40cb7045842c288c1cfafff0Grace Kloba // this should only be called for the current tab. 172722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba private void attachTabToContentView(Tab t) { 17282bc69918d97a767a02132090e58718077381ba1aSteve Block // Attach the container that contains the main WebView and any other UI 17292bc69918d97a767a02132090e58718077381ba1aSteve Block // associated with the tab. 1730d0119535d0c490e087be114ae8fd1639bb1945dcPatrick Scott t.attachTabToContentView(mContentView); 1731bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 1732bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch if (mShouldShowErrorConsole) { 173322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba ErrorConsoleView errorConsole = t.getErrorConsole(true); 1734bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch if (errorConsole.numberOfErrors() == 0) { 1735bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch errorConsole.showConsole(ErrorConsoleView.SHOW_NONE); 1736bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } else { 1737bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch errorConsole.showConsole(ErrorConsoleView.SHOW_MINIMIZED); 1738bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 1739bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 1740bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch mErrorConsoleContainer.addView(errorConsole, 174115b8ec6b226f4d57307716e1f495e10a91f8cbf4Romain Guy new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 1742bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch ViewGroup.LayoutParams.WRAP_CONTENT)); 1743bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 1744bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 1745a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb WebView view = t.getWebView(); 1746a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb view.setEmbeddedTitleBar(mTitleBar); 174758d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins if (t.isInVoiceSearchMode()) { 174858d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins showVoiceTitleBar(t.getVoiceDisplayTitle()); 174958d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins } else { 175058d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins revertVoiceTitleBar(); 175158d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins } 17520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Request focus on the top window. 17530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project t.getTopWindow().requestFocus(); 1754a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb if (mTabControl.getTabChangeListener() != null) { 1755a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb mTabControl.getTabChangeListener().onCurrentTab(t); 1756a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb } 17570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Attach a sub window to the main WebView of the given tab. 176022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba void attachSubWindow(Tab t) { 1761d0119535d0c490e087be114ae8fd1639bb1945dcPatrick Scott t.attachSubWindow(mContentView); 1762d0119535d0c490e087be114ae8fd1639bb1945dcPatrick Scott getTopWindow().requestFocus(); 17630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Remove the given tab from the content view. 176622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba private void removeTabFromContentView(Tab t) { 17672bc69918d97a767a02132090e58718077381ba1aSteve Block // Remove the container that contains the main WebView. 1768d0119535d0c490e087be114ae8fd1639bb1945dcPatrick Scott t.removeTabFromContentView(mContentView); 1769bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 177022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba ErrorConsoleView errorConsole = t.getErrorConsole(false); 177122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (errorConsole != null) { 177222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mErrorConsoleContainer.removeView(errorConsole); 1773bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 1774bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 1775a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb WebView view = t.getWebView(); 1776a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb if (view != null) { 1777a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb view.setEmbeddedTitleBar(null); 1778bb85b9016201d45ea939d7cb7edd0ba6616a111cLeon Scroggins } 17790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Remove the sub window if it exists. Also called by TabControl when the 17820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // user clicks the 'X' to dismiss a sub window. 178322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba /* package */ void dismissSubWindow(Tab t) { 1784d0119535d0c490e087be114ae8fd1639bb1945dcPatrick Scott t.removeSubWindow(mContentView); 178522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // dismiss the subwindow. This will destroy the WebView. 178622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba t.dismissSubWindow(); 1787d0119535d0c490e087be114ae8fd1639bb1945dcPatrick Scott getTopWindow().requestFocus(); 17880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17901f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // A wrapper function of {@link #openTabAndShow(UrlData, boolean, String)} 179125ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima // that accepts url as string. 179222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba private Tab openTabAndShow(String url, boolean closeOnExit, String appId) { 17931f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins return openTabAndShow(new UrlData(url), closeOnExit, appId); 17940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 17950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 17960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // This method does a ton of stuff. It will attempt to create a new tab 17970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we haven't reached MAX_TABS. Otherwise it uses the current tab. If 17981f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // url isn't null, it will load the given url. 179922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba /* package */Tab openTabAndShow(UrlData urlData, boolean closeOnExit, 180022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba String appId) { 180122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba final Tab currentTab = mTabControl.getCurrentTab(); 180222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (mTabControl.canCreateNewTab()) { 180322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba final Tab tab = mTabControl.createNewTab(closeOnExit, appId, 1804f0f03954b3092296c58dcb040e2dabd1696dd5c4Elliott Slaughter urlData.mUrl, false); 18051f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins WebView webview = tab.getWebView(); 18060a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins // If the last tab was removed from the active tabs page, currentTab 18070a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins // will be null. 18080a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins if (currentTab != null) { 18090a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins removeTabFromContentView(currentTab); 18100a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins } 18118bbd69f50abd537bfe7eb314b3a3e20241ac22bdPatrick Scott // We must set the new tab as the current tab to reflect the old 18128bbd69f50abd537bfe7eb314b3a3e20241ac22bdPatrick Scott // animation behavior. 18138bbd69f50abd537bfe7eb314b3a3e20241ac22bdPatrick Scott mTabControl.setCurrentTab(tab); 1814eb6eef4c45df2d65c3e70660493a147a2be405e3Grace Kloba attachTabToContentView(tab); 1815160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins if (!urlData.isEmpty()) { 18169d53da05812f959745810a33bb4e06b273393c42Patrick Scott loadUrlDataIn(tab, urlData); 18170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18181f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins return tab; 181964b80f3efd95d7b5192731e995ccde79c4c6c11fLeon Scroggins } else { 18201f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // Get rid of the subwindow if it exists 18211f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins dismissSubWindow(currentTab); 18221f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins if (!urlData.isEmpty()) { 18231f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // Load the given url. 18249d53da05812f959745810a33bb4e06b273393c42Patrick Scott loadUrlDataIn(currentTab, urlData); 18250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 182658d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins return currentTab; 18270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 183068792c84eded7f83e2f086d3efe81f9cfc07f9c3Michael Kolb private Tab openTab(String url, boolean forceForeground) { 183168792c84eded7f83e2f086d3efe81f9cfc07f9c3Michael Kolb if (mSettings.openInBackground() && !forceForeground) { 183222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Tab t = mTabControl.createNewTab(); 18330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (t != null) { 18341f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins WebView view = t.getWebView(); 183592472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins loadUrl(view, url); 18360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1837c9181841c7ed6b9f7dfc953eab8dc7ba1047022cGrace Kloba return t; 18380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 18391f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins return openTabAndShow(url, false, null); 18400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1843f0f03954b3092296c58dcb040e2dabd1696dd5c4Elliott Slaughter /* package */ Tab openIncognitoTab() { 1844f0f03954b3092296c58dcb040e2dabd1696dd5c4Elliott Slaughter if (mTabControl.canCreateNewTab()) { 1845f0f03954b3092296c58dcb040e2dabd1696dd5c4Elliott Slaughter Tab currentTab = mTabControl.getCurrentTab(); 1846f0f03954b3092296c58dcb040e2dabd1696dd5c4Elliott Slaughter Tab tab = mTabControl.createNewTab(false, null, null, true); 1847f0f03954b3092296c58dcb040e2dabd1696dd5c4Elliott Slaughter if (currentTab != null) { 1848f0f03954b3092296c58dcb040e2dabd1696dd5c4Elliott Slaughter removeTabFromContentView(currentTab); 1849f0f03954b3092296c58dcb040e2dabd1696dd5c4Elliott Slaughter } 1850f0f03954b3092296c58dcb040e2dabd1696dd5c4Elliott Slaughter mTabControl.setCurrentTab(tab); 1851f0f03954b3092296c58dcb040e2dabd1696dd5c4Elliott Slaughter attachTabToContentView(tab); 1852f0f03954b3092296c58dcb040e2dabd1696dd5c4Elliott Slaughter return tab; 1853f0f03954b3092296c58dcb040e2dabd1696dd5c4Elliott Slaughter } 1854f0f03954b3092296c58dcb040e2dabd1696dd5c4Elliott Slaughter return null; 1855f0f03954b3092296c58dcb040e2dabd1696dd5c4Elliott Slaughter } 1856f0f03954b3092296c58dcb040e2dabd1696dd5c4Elliott Slaughter 18570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private class Copy implements OnMenuItemClickListener { 18580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private CharSequence mText; 18590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onMenuItemClick(MenuItem item) { 18610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project copy(mText); 18620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 18630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public Copy(CharSequence toCopy) { 18660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mText = toCopy; 18670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private class Download implements OnMenuItemClickListener { 18710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String mText; 18720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public boolean onMenuItemClick(MenuItem item) { 18740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project onDownloadStartNoStream(mText, null, null, null, -1); 18750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 18760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public Download(String toDownload) { 18790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mText = toDownload; 18800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 18820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 18834f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch private class SetAsWallpaper extends Thread implements 18844f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch OnMenuItemClickListener, DialogInterface.OnCancelListener { 18854f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch private URL mUrl; 18864f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch private ProgressDialog mWallpaperProgress; 18874f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch private boolean mCanceled = false; 18884f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch 18894f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch public SetAsWallpaper(String url) { 18904f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch try { 18914f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch mUrl = new URL(url); 18924f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } catch (MalformedURLException e) { 18934f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch mUrl = null; 18944f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } 18954f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } 18964f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch 18974f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch public void onCancel(DialogInterface dialog) { 18984f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch mCanceled = true; 18994f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } 19004f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch 19014f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch public boolean onMenuItemClick(MenuItem item) { 19024f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch if (mUrl != null) { 19034f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch // The user may have tried to set a image with a large file size as their 19044f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch // background so it may take a few moments to perform the operation. Display 19054f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch // a progress spinner while it is working. 19064f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch mWallpaperProgress = new ProgressDialog(BrowserActivity.this); 19074f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch mWallpaperProgress.setIndeterminate(true); 19084f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch mWallpaperProgress.setMessage(getText(R.string.progress_dialog_setting_wallpaper)); 19094f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch mWallpaperProgress.setCancelable(true); 19104f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch mWallpaperProgress.setOnCancelListener(this); 19114f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch mWallpaperProgress.show(); 19124f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch start(); 19134f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } 19144f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch return true; 19154f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } 19164f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch 1917e0a3666b5c0dca7352895fa8b9b4fbb2237df721Michael Kolb @Override 19184f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch public void run() { 19194f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch Drawable oldWallpaper = BrowserActivity.this.getWallpaper(); 19204f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch try { 19214f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch // TODO: This will cause the resource to be downloaded again, when we 19224f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch // should in most cases be able to grab it from the cache. To fix this 19234f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch // we should query WebCore to see if we can access a cached version and 19244f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch // instead open an input stream on that. This pattern could also be used 19254f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch // in the download manager where the same problem exists. 19264f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch InputStream inputstream = mUrl.openStream(); 19274f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch if (inputstream != null) { 19284f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch setWallpaper(inputstream); 19294f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } 19304f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } catch (IOException e) { 19314f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch Log.e(LOGTAG, "Unable to set new wallpaper"); 19324f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch // Act as though the user canceled the operation so we try to 19334f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch // restore the old wallpaper. 19344f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch mCanceled = true; 19354f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } 19364f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch 19374f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch if (mCanceled) { 19384f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch // Restore the old wallpaper if the user cancelled whilst we were setting 19394f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch // the new wallpaper. 19404f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch int width = oldWallpaper.getIntrinsicWidth(); 19414f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch int height = oldWallpaper.getIntrinsicHeight(); 19424f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); 19434f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch Canvas canvas = new Canvas(bm); 19444f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch oldWallpaper.setBounds(0, 0, width, height); 19454f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch oldWallpaper.draw(canvas); 19464f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch try { 19474f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch setWallpaper(bm); 19484f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } catch (IOException e) { 19494f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch Log.e(LOGTAG, "Unable to restore old wallpaper."); 19504f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } 19514f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch mCanceled = false; 19524f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } 19534f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch 19544f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch if (mWallpaperProgress.isShowing()) { 19554f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch mWallpaperProgress.dismiss(); 19564f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } 19574f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } 19584f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch } 19594f75ba226fb7fd1cf62caf807123dee8f5e65b13Ben Murdoch 19600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void copy(CharSequence text) { 196180f32627140aefe828ad539f66fc439d1580bae7Dianne Hackborn ClipboardManager cm = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE); 196280f32627140aefe828ad539f66fc439d1580bae7Dianne Hackborn cm.setText(text); 19630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 19660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Resets the browser title-view to whatever it must be 19670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * (for example, if we had a loading error) 19680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * When we have a new page, we call resetTitle, when we 19690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * have to reset the titlebar to whatever it used to be 19700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * (for example, if the user chose to stop loading), we 19710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * call resetTitleAndRevertLockIcon. 19720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 19730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ void resetTitleAndRevertLockIcon() { 197422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mTabControl.getCurrentTab().revertLockIcon(); 197522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba updateLockIconToLatest(); 19760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleIconAndProgress(); 19770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 19800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Reset the title, favicon, and progress. 19810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 19820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void resetTitleIconAndProgress() { 19830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView current = mTabControl.getCurrentWebView(); 19840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current == null) { 19850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 19860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleAndIcon(current); 19880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int progress = current.getProgress(); 198922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba current.getWebChromeClient().onProgressChanged(current, progress); 19900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 19910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 19920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Reset the title and the icon based on the given item. 19930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void resetTitleAndIcon(WebView view) { 19940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebHistoryItem item = view.copyBackForwardList().getCurrentItem(); 19950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (item != null) { 199668579393973f745fc65a2781061af9bb8f2d7020Leon Scroggins setUrlTitle(item.getUrl(), item.getTitle()); 19970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setFavicon(item.getFavicon()); 19980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 199968579393973f745fc65a2781061af9bb8f2d7020Leon Scroggins setUrlTitle(null, null); 20000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setFavicon(null); 20010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 20050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Sets a title composed of the URL and the title string. 20060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param url The URL of the site being loaded. 20070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param title The title of the site being loaded. 20080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 200922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba void setUrlTitle(String url, String title) { 20100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mUrl = url; 20110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTitle = title; 20120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 201358d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins // If we are in voice search mode, the title has already been set. 201458d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins if (mTabControl.getCurrentTab().isInVoiceSearchMode()) return; 201558d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins mTitleBar.setDisplayTitle(url); 2016a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb mFakeTitleBar.setDisplayTitle(url); 20170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 20200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param url The URL to build a title version of the URL from. 20210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @return The title version of the URL or null if fails. 20220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * The title version of the URL can be either the URL hostname, 20230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * or the hostname with an "https://" prefix (for secure URLs), 20240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * or an empty string if, for example, the URL in question is a 20250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * file:// URL with no hostname. 20260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 202732e14a6deccfa75490b3032bb4ddd5ae90f89de8Leon Scroggins /* package */ static String buildTitleUrl(String url) { 20280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String titleUrl = null; 20290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null) { 20310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 20320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // parse the url string 20330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project URL urlObj = new URL(url); 20340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (urlObj != null) { 20350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project titleUrl = ""; 20360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String protocol = urlObj.getProtocol(); 20380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String host = urlObj.getHost(); 20390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (host != null && 0 < host.length()) { 20410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project titleUrl = host; 20420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (protocol != null) { 20430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if a secure site, add an "https://" prefix! 20440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (protocol.equalsIgnoreCase("https")) { 20450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project titleUrl = protocol + "://" + host; 20460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (MalformedURLException e) {} 20510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return titleUrl; 20540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Set the favicon in the title bar. 205722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba void setFavicon(Bitmap icon) { 205868579393973f745fc65a2781061af9bb8f2d7020Leon Scroggins mTitleBar.setFavicon(icon); 2059a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb mFakeTitleBar.setFavicon(icon); 20600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 20620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 20630a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins * Close the tab, remove its associated title bar, and adjust mTabControl's 20640a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins * current tab to a valid value. 20651f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins */ 206622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba /* package */ void closeTab(Tab t) { 20670a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins int currentIndex = mTabControl.getCurrentIndex(); 20680a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins int removeIndex = mTabControl.getTabIndex(t); 20691f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins mTabControl.removeTab(t); 20700a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins if (currentIndex >= removeIndex && currentIndex != 0) { 20710a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins currentIndex--; 20720a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins } 20730a64ba581c9e476ef10f36a62825df933771427dLeon Scroggins mTabControl.setCurrentTab(mTabControl.getTab(currentIndex)); 2074a5bf1deca120315a2643ea5b010f94d853461b15Andrei Popescu resetTitleIconAndProgress(); 2075654899b4b7a280efc01aac4977b74369024e5c94Leon Scroggins updateLockIconToLatest(); 2076e440a88fd81c86d1ca6fc18b8b3f68e383e574b4Elliott Slaughter 2077e440a88fd81c86d1ca6fc18b8b3f68e383e574b4Elliott Slaughter if (!mTabControl.hasAnyOpenIncognitoTabs()) { 2078e440a88fd81c86d1ca6fc18b8b3f68e383e574b4Elliott Slaughter WebView.cleanupPrivateBrowsingFiles(this); 2079e440a88fd81c86d1ca6fc18b8b3f68e383e574b4Elliott Slaughter } 20800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2082dcc5eeb63eadd597587a0b2b49998c267b0bcc11Leon Scroggins /* package */ void goBackOnePageOrQuit() { 208322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Tab current = mTabControl.getCurrentTab(); 20840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current == null) { 20850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* 20860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Instead of finishing the activity, simply push this to the back 20870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * of the stack and let ActivityManager to choose the foreground 20880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * activity. As BrowserActivity is singleTask, it will be always the 20890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * root of the task. So we can use either true or false for 20900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * moveTaskToBack(). 20910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 20920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project moveTaskToBack(true); 209300d85e74921459b34e70eb93368245b4c0a9bf5fGrace Kloba return; 20940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 20950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = current.getWebView(); 20960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w.canGoBack()) { 20970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.goBack(); 20980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 20990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Check to see if we are closing a window that was created by 21000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // another window. If so, we switch back to that window. 210122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Tab parent = current.getParentTab(); 21020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (parent != null) { 21031f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins switchToTab(mTabControl.getTabIndex(parent)); 21041f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins // Now we close the other tab 21051f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins closeTab(current); 21060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 21070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (current.closeOnExit()) { 210822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // force the tab's inLoad() to be false as we are going to 210922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // either finish the activity or remove the tab. This will 211022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // ensure pauseWebViewTimers() taking action. 211122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mTabControl.getCurrentTab().clearInLoad(); 21120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mTabControl.getTabCount() == 1) { 21130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project finish(); 21140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 21150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21167bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed // call pauseWebViewTimers() now, we won't be able to call 21177bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed // it in onPause() as the WebView won't be valid. 2118ec1b5ad8d8283b1fbbc5d7fa1cd50ef95b9e594dGrace Kloba // Temporarily change mActivityInPause to be true as 2119ec1b5ad8d8283b1fbbc5d7fa1cd50ef95b9e594dGrace Kloba // pauseWebViewTimers() will do nothing if mActivityInPause 2120ec1b5ad8d8283b1fbbc5d7fa1cd50ef95b9e594dGrace Kloba // is false. 2121918e1d78b2db6ef21c71a07868572d9cda498476Grace Kloba boolean savedState = mActivityInPause; 2122918e1d78b2db6ef21c71a07868572d9cda498476Grace Kloba if (savedState) { 2123ec1b5ad8d8283b1fbbc5d7fa1cd50ef95b9e594dGrace Kloba Log.e(LOGTAG, "BrowserActivity is already paused " 2124ec1b5ad8d8283b1fbbc5d7fa1cd50ef95b9e594dGrace Kloba + "while handing goBackOnePageOrQuit."); 2125918e1d78b2db6ef21c71a07868572d9cda498476Grace Kloba } 2126918e1d78b2db6ef21c71a07868572d9cda498476Grace Kloba mActivityInPause = true; 21277bfa63b55644fbf2da1fe6a24b3be0267529202cMike Reed pauseWebViewTimers(); 2128918e1d78b2db6ef21c71a07868572d9cda498476Grace Kloba mActivityInPause = savedState; 21290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project removeTabFromContentView(current); 21300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTabControl.removeTab(current); 21310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* 21330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Instead of finishing the activity, simply push this to the back 21340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * of the stack and let ActivityManager to choose the foreground 21350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * activity. As BrowserActivity is singleTask, it will be always the 21360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * root of the task. So we can use either true or false for 21370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * moveTaskToBack(). 21380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 21390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project moveTaskToBack(true); 21400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 214422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba boolean isMenuDown() { 214522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba return mMenuIsDown; 214622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 214722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba 21485942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba @Override 21495942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba public boolean onKeyDown(int keyCode, KeyEvent event) { 2150f65b50ddd2f7ed1205002d74082fff1ac2336d5cLeon Scroggins // Even if MENU is already held down, we need to call to super to open 2151f65b50ddd2f7ed1205002d74082fff1ac2336d5cLeon Scroggins // the IME on long press. 2152f65b50ddd2f7ed1205002d74082fff1ac2336d5cLeon Scroggins if (KeyEvent.KEYCODE_MENU == keyCode) { 2153f65b50ddd2f7ed1205002d74082fff1ac2336d5cLeon Scroggins mMenuIsDown = true; 2154f65b50ddd2f7ed1205002d74082fff1ac2336d5cLeon Scroggins return super.onKeyDown(keyCode, event); 2155f65b50ddd2f7ed1205002d74082fff1ac2336d5cLeon Scroggins } 21565942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba // The default key mode is DEFAULT_KEYS_SEARCH_LOCAL. As the MENU is 21575942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba // still down, we don't want to trigger the search. Pretend to consume 21585942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba // the key and do nothing. 21595942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba if (mMenuIsDown) return true; 21605942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba 21615942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba switch(keyCode) { 21625942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba case KeyEvent.KEYCODE_SPACE: 2163da0fe556a00773ce2af25eb6dcc5442bd08c7addGrace Kloba // WebView/WebTextView handle the keys in the KeyDown. As 2164da0fe556a00773ce2af25eb6dcc5442bd08c7addGrace Kloba // the Activity's shortcut keys are only handled when WebView 2165da0fe556a00773ce2af25eb6dcc5442bd08c7addGrace Kloba // doesn't, have to do it in onKeyDown instead of onKeyUp. 2166da0fe556a00773ce2af25eb6dcc5442bd08c7addGrace Kloba if (event.isShiftPressed()) { 2167da0fe556a00773ce2af25eb6dcc5442bd08c7addGrace Kloba getTopWindow().pageUp(false); 2168da0fe556a00773ce2af25eb6dcc5442bd08c7addGrace Kloba } else { 2169da0fe556a00773ce2af25eb6dcc5442bd08c7addGrace Kloba getTopWindow().pageDown(false); 2170da0fe556a00773ce2af25eb6dcc5442bd08c7addGrace Kloba } 21715942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba return true; 21725942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba case KeyEvent.KEYCODE_BACK: 21735942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba if (event.getRepeatCount() == 0) { 21745942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba event.startTracking(); 21755942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba return true; 21765942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba } else if (mCustomView == null && mActiveTabsPage == null 2177e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb && mComboView == null 21785942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba && event.isLongPress()) { 2179e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb bookmarksOrHistoryPicker(true); 21805942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba return true; 21810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21825942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba break; 21830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21845942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba return super.onKeyDown(keyCode, event); 21850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 21860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 21875942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba @Override 21885942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba public boolean onKeyUp(int keyCode, KeyEvent event) { 21895942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba switch(keyCode) { 21905942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba case KeyEvent.KEYCODE_MENU: 21915942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba mMenuIsDown = false; 21925942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba break; 21935942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba case KeyEvent.KEYCODE_BACK: 21945942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba if (event.isTracking() && !event.isCanceled()) { 21955942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba if (mCustomView != null) { 21965942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba // if a custom view is showing, hide it 219722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mTabControl.getCurrentWebView().getWebChromeClient() 219822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba .onHideCustomView(); 21995942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba } else if (mActiveTabsPage != null) { 22005942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba // if tab page is showing, hide it 22015942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba removeActiveTabPage(true); 2202e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb } else if (mComboView != null) { 2203370a4f3e47b740fd10b9028aae9e87e17254caa8Michael Kolb if (!mComboView.onBackPressed()) { 2204370a4f3e47b740fd10b9028aae9e87e17254caa8Michael Kolb removeComboView(); 2205370a4f3e47b740fd10b9028aae9e87e17254caa8Michael Kolb } 22060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 22075942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba WebView subwindow = mTabControl.getCurrentSubWindow(); 22085942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba if (subwindow != null) { 22095942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba if (subwindow.canGoBack()) { 22105942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba subwindow.goBack(); 22115942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba } else { 22125942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba dismissSubWindow(mTabControl.getCurrentTab()); 22135942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba } 22145942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba } else { 22155942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba goBackOnePageOrQuit(); 22165942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba } 22170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22185942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba return true; 22195942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba } 22205942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba break; 22210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22225942df0c38dff7e4335e352e2d03f100b07b8907Grace Kloba return super.onKeyUp(keyCode, event); 22230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 222568579393973f745fc65a2781061af9bb8f2d7020Leon Scroggins /* package */ void stopLoading() { 2226b7cc8b439dc595dc48e1c2183b35d23ad72dfbe5Ben Murdoch mDidStopLoad = true; 22270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project resetTitleAndRevertLockIcon(); 22280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = getTopWindow(); 22290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.stopLoading(); 223022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // FIXME: before refactor, it is using mWebViewClient. So I keep the 223122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // same logic here. But for subwindow case, should we call into the main 223222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // WebView's onPageFinished as we never call its onPageStarted and if 223322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // the page finishes itself, we don't call onPageFinished. 223422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mTabControl.getCurrentWebView().getWebViewClient().onPageFinished(w, 223522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba w.getUrl()); 22360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project cancelStopToast(); 22380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mStopToast = Toast 22390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .makeText(this, R.string.stopping, Toast.LENGTH_SHORT); 22400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mStopToast.show(); 22410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 224322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba boolean didUserStopLoading() { 224422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba return mDidStopLoad; 224522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 224622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba 22470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void cancelStopToast() { 22480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mStopToast != null) { 22490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mStopToast.cancel(); 22500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mStopToast = null; 22510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 225422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // called by a UI or non-UI thread to post the message 225522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba public void postMessage(int what, int arg1, int arg2, Object obj, 225622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba long delayMillis) { 225722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mHandler.sendMessageDelayed(mHandler.obtainMessage(what, arg1, arg2, 225822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba obj), delayMillis); 225922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 226022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba 226122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // called by a UI or non-UI thread to remove the message 226222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba void removeMessages(int what, Object object) { 226322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mHandler.removeMessages(what, object); 22640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // public message ids 22670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public final static int LOAD_URL = 1001; 22680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public final static int STOP_LOAD = 1002; 22690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 22700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Message Ids 22710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static final int FOCUS_NODE_HREF = 102; 227292c18a52ca7a79c114028b5ba22c3dfe443bd1a4Grace Kloba private static final int RELEASE_WAKELOCK = 107; 22730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 227422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba static final int UPDATE_BOOKMARK_THUMBNAIL = 108; 22752694e23a55d5ca526fc29534a80a200e2c58698bBen Murdoch 2276300b7f0951f3688a8e41f190b57cbf8b3bc06170Michael Kolb private static final int OPEN_BOOKMARKS = 201; 2277300b7f0951f3688a8e41f190b57cbf8b3bc06170Michael Kolb 22780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Private handler for handling javascript and saving passwords 22790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Handler mHandler = new Handler() { 22800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2281e0a3666b5c0dca7352895fa8b9b4fbb2237df721Michael Kolb @Override 22820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void handleMessage(Message msg) { 22830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (msg.what) { 2284300b7f0951f3688a8e41f190b57cbf8b3bc06170Michael Kolb case OPEN_BOOKMARKS: 2285e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb bookmarksOrHistoryPicker(false); 2286300b7f0951f3688a8e41f190b57cbf8b3bc06170Michael Kolb break; 22870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case FOCUS_NODE_HREF: 22882694e23a55d5ca526fc29534a80a200e2c58698bBen Murdoch { 22890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String url = (String) msg.getData().get("url"); 229090d088caeee718f89755ee9c25249ba6da15ab97Ben Murdoch String title = (String) msg.getData().get("title"); 22910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url == null || url.length() == 0) { 22920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 22930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 22940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project HashMap focusNodeMap = (HashMap) msg.obj; 22950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView view = (WebView) focusNodeMap.get("webview"); 22960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Only apply the action if the top window did not change. 22970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (getTopWindow() != view) { 22980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 22990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (msg.arg1) { 23010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.open_context_menu_id: 23020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.view_image_context_menu_id: 230392472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins loadUrlFromContext(getTopWindow(), url); 23040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 23050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.bookmark_context_menu_id: 23060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent = new Intent(BrowserActivity.this, 23070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project AddBookmarkPage.class); 2308bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins intent.putExtra(BrowserContract.Bookmarks.URL, url); 2309bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins intent.putExtra(BrowserContract.Bookmarks.TITLE, 2310bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins title); 23110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project startActivity(intent); 23120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 23130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.share_link_context_menu_id: 23143e20445506307d2c8d699e1d17fb82a0cedde1d0Leon Scroggins sharePage(BrowserActivity.this, title, url, null, 231596afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins null); 23160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 23170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.copy_link_context_menu_id: 23180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project copy(url); 23190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 23200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.save_link_context_menu_id: 23210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case R.id.download_context_menu_id: 23220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project onDownloadStartNoStream(url, null, null, null, -1); 23230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 23240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 23262694e23a55d5ca526fc29534a80a200e2c58698bBen Murdoch } 23270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 23280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case LOAD_URL: 232992472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins loadUrlFromContext(getTopWindow(), (String) msg.obj); 23300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 23310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 23320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case STOP_LOAD: 23330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project stopLoading(); 23340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 23350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 23360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project case RELEASE_WAKELOCK: 23370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mWakeLock.isHeld()) { 23380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mWakeLock.release(); 23395d0e02e646e46b14289168f75c2a8f6ed43cac54Grace Kloba // if we reach here, Browser should be still in the 23405d0e02e646e46b14289168f75c2a8f6ed43cac54Grace Kloba // background loading after WAKELOCK_TIMEOUT (5-min). 23415d0e02e646e46b14289168f75c2a8f6ed43cac54Grace Kloba // To avoid burning the battery, stop loading. 23425d0e02e646e46b14289168f75c2a8f6ed43cac54Grace Kloba mTabControl.stopAllLoading(); 23430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 23452694e23a55d5ca526fc29534a80a200e2c58698bBen Murdoch 23462694e23a55d5ca526fc29534a80a200e2c58698bBen Murdoch case UPDATE_BOOKMARK_THUMBNAIL: 23472694e23a55d5ca526fc29534a80a200e2c58698bBen Murdoch WebView view = (WebView) msg.obj; 23482694e23a55d5ca526fc29534a80a200e2c58698bBen Murdoch if (view != null) { 23492694e23a55d5ca526fc29534a80a200e2c58698bBen Murdoch updateScreenshot(view); 23502694e23a55d5ca526fc29534a80a200e2c58698bBen Murdoch } 23512694e23a55d5ca526fc29534a80a200e2c58698bBen Murdoch break; 23520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 23540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 23550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 235696afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins /** 235796afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins * Share a page, providing the title, url, favicon, and a screenshot. Uses 235896afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins * an {@link Intent} to launch the Activity chooser. 235996afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins * @param c Context used to launch a new Activity. 236096afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins * @param title Title of the page. Stored in the Intent with 236103e6d39560d7de359782485d4c863d600b34fb51Paul Westbrook * {@link Intent#EXTRA_SUBJECT} 236296afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins * @param url URL of the page. Stored in the Intent with 236396afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins * {@link Intent#EXTRA_TEXT} 236496afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins * @param favicon Bitmap of the favicon for the page. Stored in the Intent 236596afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins * with {@link Browser#EXTRA_SHARE_FAVICON} 236696afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins * @param screenshot Bitmap of a screenshot of the page. Stored in the 236796afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins * Intent with {@link Browser#EXTRA_SHARE_SCREENSHOT} 236896afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins */ 236996afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins public static final void sharePage(Context c, String title, String url, 237096afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins Bitmap favicon, Bitmap screenshot) { 237196afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins Intent send = new Intent(Intent.ACTION_SEND); 237296afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins send.setType("text/plain"); 237396afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins send.putExtra(Intent.EXTRA_TEXT, url); 237403e6d39560d7de359782485d4c863d600b34fb51Paul Westbrook send.putExtra(Intent.EXTRA_SUBJECT, title); 237596afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins send.putExtra(Browser.EXTRA_SHARE_FAVICON, favicon); 237696afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins send.putExtra(Browser.EXTRA_SHARE_SCREENSHOT, screenshot); 237796afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins try { 237896afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins c.startActivity(Intent.createChooser(send, c.getString( 237996afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins R.string.choosertitle_sharevia))); 238096afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins } catch(android.content.ActivityNotFoundException ex) { 238196afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins // if no app handles it, do nothing 238296afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins } 238396afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins } 238496afcb1a85b1d14be910bfe0a2c4104e6ec87964Leon Scroggins 238589c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins private void updateScreenshot(WebView view) { 238689c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins // If this is a bookmarked site, add a screenshot to the database. 238789c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins // FIXME: When should we update? Every time? 238889c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins // FIXME: Would like to make sure there is actually something to 238989c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins // draw, but the API for that (WebViewCore.pictureReady()) is not 239089c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins // currently accessible here. 2391aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch 239287cc65d95c80c5e3a1c343ad5177a7dc2de874f6Ben Murdoch final Bitmap bm = createScreenshot(view, getDesiredThumbnailWidth(this), 239387cc65d95c80c5e3a1c343ad5177a7dc2de874f6Ben Murdoch getDesiredThumbnailHeight(this)); 2394cb192b548d227e202d9a9d724e65493cbec91ab9Patrick Scott if (bm == null) { 2395cb192b548d227e202d9a9d724e65493cbec91ab9Patrick Scott return; 2396cb192b548d227e202d9a9d724e65493cbec91ab9Patrick Scott } 2397cb192b548d227e202d9a9d724e65493cbec91ab9Patrick Scott 2398cb192b548d227e202d9a9d724e65493cbec91ab9Patrick Scott final ContentResolver cr = getContentResolver(); 2399cb192b548d227e202d9a9d724e65493cbec91ab9Patrick Scott final String url = view.getUrl(); 2400cb192b548d227e202d9a9d724e65493cbec91ab9Patrick Scott final String originalUrl = view.getOriginalUrl(); 2401cb192b548d227e202d9a9d724e65493cbec91ab9Patrick Scott 2402cb192b548d227e202d9a9d724e65493cbec91ab9Patrick Scott new AsyncTask<Void, Void, Void>() { 2403cb192b548d227e202d9a9d724e65493cbec91ab9Patrick Scott @Override 2404cb192b548d227e202d9a9d724e65493cbec91ab9Patrick Scott protected Void doInBackground(Void... unused) { 24051a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton Cursor cursor = null; 2406cb192b548d227e202d9a9d724e65493cbec91ab9Patrick Scott try { 24071a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton cursor = Bookmarks.queryCombinedForUrl(cr, originalUrl, url); 24081a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton if (cursor != null && cursor.moveToFirst()) { 24091a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton final ByteArrayOutputStream os = new ByteArrayOutputStream(); 24101a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton bm.compress(Bitmap.CompressFormat.PNG, 100, os); 24111a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton 24121a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton ContentValues values = new ContentValues(); 24131a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton values.put(Images.THUMBNAIL, os.toByteArray()); 24141a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton values.put(Images.URL, cursor.getString(0)); 24151a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton 24161a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton do { 24171a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton cr.update(Images.CONTENT_URI, values, null, null); 24181a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton } while (cursor.moveToNext()); 24194580057e772b60433272af5cd691825748892693Leon Scroggins } 2420cb192b548d227e202d9a9d724e65493cbec91ab9Patrick Scott } catch (IllegalStateException e) { 2421cb192b548d227e202d9a9d724e65493cbec91ab9Patrick Scott // Ignore 2422cb192b548d227e202d9a9d724e65493cbec91ab9Patrick Scott } finally { 24231a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton if (cursor != null) cursor.close(); 242489c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins } 2425cb192b548d227e202d9a9d724e65493cbec91ab9Patrick Scott return null; 242689c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins } 2427cb192b548d227e202d9a9d724e65493cbec91ab9Patrick Scott }.execute(); 242889c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins } 242989c6d36e2e6d6040540ee93ef4df29a6874a6a95Leon Scroggins 243006ec5f2d8735d1ba17b779deb0f8da032e0a62eaLeon Scroggins /** 2431f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins * Return the desired width for thumbnail screenshots, which are stored in 2432f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins * the database, and used on the bookmarks screen. 2433f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins * @param context Context for finding out the density of the screen. 2434f3026374dccf7b491152946c5d0e42daec08d899Jeff Hamilton * @return desired width for thumbnail screenshot. 2435f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins */ 2436f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins /* package */ static int getDesiredThumbnailWidth(Context context) { 2437f3026374dccf7b491152946c5d0e42daec08d899Jeff Hamilton return context.getResources().getDimensionPixelOffset(R.dimen.bookmarkThumbnailWidth); 2438f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins } 2439f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins 2440f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins /** 2441f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins * Return the desired height for thumbnail screenshots, which are stored in 2442f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins * the database, and used on the bookmarks screen. 2443f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins * @param context Context for finding out the density of the screen. 2444f3026374dccf7b491152946c5d0e42daec08d899Jeff Hamilton * @return desired height for thumbnail screenshot. 2445f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins */ 2446f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins /* package */ static int getDesiredThumbnailHeight(Context context) { 2447f3026374dccf7b491152946c5d0e42daec08d899Jeff Hamilton return context.getResources().getDimensionPixelOffset(R.dimen.bookmarkThumbnailHeight); 2448f85516172840450a4d1270b658905dc1649ceaf2Leon Scroggins } 244906ec5f2d8735d1ba17b779deb0f8da032e0a62eaLeon Scroggins 245087cc65d95c80c5e3a1c343ad5177a7dc2de874f6Ben Murdoch private Bitmap createScreenshot(WebView view, int width, int height) { 2451dcc2b6f08dd5677bc6ba761a9ba6f1c655113051Ben Murdoch Picture thumbnail = view.capturePicture(); 24524580057e772b60433272af5cd691825748892693Leon Scroggins if (thumbnail == null) { 24534580057e772b60433272af5cd691825748892693Leon Scroggins return null; 24544580057e772b60433272af5cd691825748892693Leon Scroggins } 245587cc65d95c80c5e3a1c343ad5177a7dc2de874f6Ben Murdoch Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); 2456dcc2b6f08dd5677bc6ba761a9ba6f1c655113051Ben Murdoch Canvas canvas = new Canvas(bm); 2457dcc2b6f08dd5677bc6ba761a9ba6f1c655113051Ben Murdoch // May need to tweak these values to determine what is the 2458dcc2b6f08dd5677bc6ba761a9ba6f1c655113051Ben Murdoch // best scale factor 24592694e23a55d5ca526fc29534a80a200e2c58698bBen Murdoch int thumbnailWidth = thumbnail.getWidth(); 2460ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch int thumbnailHeight = thumbnail.getHeight(); 2461ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch float scaleFactorX = 1.0f; 2462ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch float scaleFactorY = 1.0f; 24632694e23a55d5ca526fc29534a80a200e2c58698bBen Murdoch if (thumbnailWidth > 0) { 246487cc65d95c80c5e3a1c343ad5177a7dc2de874f6Ben Murdoch scaleFactorX = (float) width / (float)thumbnailWidth; 2465ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch } else { 2466ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch return null; 246706ec5f2d8735d1ba17b779deb0f8da032e0a62eaLeon Scroggins } 2468ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch 2469ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch if (view.getWidth() > view.getHeight() && 2470ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch thumbnailHeight < view.getHeight() && thumbnailHeight > 0) { 2471ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch // If the device is in landscape and the page is shorter 2472ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch // than the height of the view, stretch the thumbnail to fill the 2473ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch // space. 247487cc65d95c80c5e3a1c343ad5177a7dc2de874f6Ben Murdoch scaleFactorY = (float) height / (float)thumbnailHeight; 2475ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch } else { 2476ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch // In the portrait case, this looks nice. 2477ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch scaleFactorY = scaleFactorX; 2478ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch } 2479ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch 2480ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch canvas.scale(scaleFactorX, scaleFactorY); 2481ae59c3f5a5b492f91d72e1d26702a13b91a43fa4Ben Murdoch 2482dcc2b6f08dd5677bc6ba761a9ba6f1c655113051Ben Murdoch thumbnail.draw(canvas); 2483dcc2b6f08dd5677bc6ba761a9ba6f1c655113051Ben Murdoch return bm; 2484dcc2b6f08dd5677bc6ba761a9ba6f1c655113051Ben Murdoch } 2485dcc2b6f08dd5677bc6ba761a9ba6f1c655113051Ben Murdoch 24860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // ------------------------------------------------------------------------- 248722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Helper function for WebViewClient. 24880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project //------------------------------------------------------------------------- 24890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 24900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Use in overrideUrlLoading 24910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ final static String SCHEME_WTAI = "wtai://wp/"; 24920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ final static String SCHEME_WTAI_MC = "wtai://wp/mc;"; 24930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ final static String SCHEME_WTAI_SD = "wtai://wp/sd;"; 24940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* package */ final static String SCHEME_WTAI_AP = "wtai://wp/ap;"; 24950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 249692472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins // Keep this initial progress in sync with initialProgressValue (* 100) 249792472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins // in ProgressTracker.cpp 249892472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins private final static int INITIAL_PROGRESS = 10; 249992472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins 250022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba void onPageStarted(WebView view, String url, Bitmap favicon) { 250122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // when BrowserActivity just starts, onPageStarted may be called before 250222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // onResume as it is triggered from onCreate. Call resumeWebViewTimers 250322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // to start the timer. As we won't switch tabs while an activity is in 250422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // pause state, we can ensure calling resume and pause in pair. 250522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (mActivityInPause) resumeWebViewTimers(); 250622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba 250722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba resetLockIcon(url); 250822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba setUrlTitle(url, null); 250922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba setFavicon(favicon); 25108cf8f682e90f004d4b8028d2f5b74f72c0cf4e19Leon Scroggins // Show some progress so that the user knows the page is beginning to 25118cf8f682e90f004d4b8028d2f5b74f72c0cf4e19Leon Scroggins // load 251292472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins onProgressChanged(view, INITIAL_PROGRESS); 251322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mDidStopLoad = false; 251422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (!mIsNetworkUp) createAndShowNetworkDialog(); 25158e4fbf1b26c2cc05a56ba2d4e7d1eda7d1574e91Leon Scroggins III endActionMode(); 251622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (mSettings.isTracing()) { 251722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba String host; 251822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba try { 251922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba WebAddress uri = new WebAddress(url); 2520131ab511f73b573b76fe8e692b829df4fe89bd54Bjorn Bringert host = uri.getHost(); 252122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } catch (android.net.ParseException ex) { 252222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba host = "browser"; 252322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 252422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba host = host.replace('.', '_'); 252522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba host += ".trace"; 252622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mInTrace = true; 252722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Debug.startMethodTracing(host, 20 * 1024 * 1024); 252815525d48024d325c8a52766d8ca727191251a8d4Patrick Scott } 252915525d48024d325c8a52766d8ca727191251a8d4Patrick Scott 253022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Performance probe 253122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (false) { 253222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mStart = SystemClock.uptimeMillis(); 253322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mProcessStart = Process.getElapsedCpuTime(); 253422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba long[] sysCpu = new long[7]; 253522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (Process.readProcFile("/proc/stat", SYSTEM_CPU_FORMAT, null, 253622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba sysCpu, null)) { 253722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mUserStart = sysCpu[0] + sysCpu[1]; 253822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mSystemStart = sysCpu[2]; 253922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mIdleStart = sysCpu[3]; 254022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mIrqStart = sysCpu[4] + sysCpu[5] + sysCpu[6]; 254122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 254222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mUiStart = SystemClock.currentThreadTimeMillis(); 25430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 25450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 254622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba void onPageFinished(WebView view, String url) { 254722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Reset the title and icon in case we stopped a provisional load. 254822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba resetTitleAndIcon(view); 254922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Update the lock icon image only once we are done loading 255022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba updateLockIconToLatest(); 255122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // pause the WebView timer and release the wake lock if it is finished 255222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // while BrowserActivity is in pause state. 255322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (mActivityInPause && pauseWebViewTimers()) { 255422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (mWakeLock.isHeld()) { 255522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mHandler.removeMessages(RELEASE_WAKELOCK); 255622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mWakeLock.release(); 255722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 255822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 255922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba 256022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Performance probe 256122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (false) { 256222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba long[] sysCpu = new long[7]; 256322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (Process.readProcFile("/proc/stat", SYSTEM_CPU_FORMAT, null, 256422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba sysCpu, null)) { 256522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba String uiInfo = "UI thread used " 256622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba + (SystemClock.currentThreadTimeMillis() - mUiStart) 256722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba + " ms"; 256822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (LOGD_ENABLED) { 256922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Log.d(LOGTAG, uiInfo); 257022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 257122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba //The string that gets written to the log 257222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba String performanceString = "It took total " 257322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba + (SystemClock.uptimeMillis() - mStart) 257422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba + " ms clock time to load the page." 257522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba + "\nbrowser process used " 257622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba + (Process.getElapsedCpuTime() - mProcessStart) 257722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba + " ms, user processes used " 257822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba + (sysCpu[0] + sysCpu[1] - mUserStart) * 10 257922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba + " ms, kernel used " 258022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba + (sysCpu[2] - mSystemStart) * 10 258122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba + " ms, idle took " + (sysCpu[3] - mIdleStart) * 10 258222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba + " ms and irq took " 258322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba + (sysCpu[4] + sysCpu[5] + sysCpu[6] - mIrqStart) 258422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba * 10 + " ms, " + uiInfo; 258522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (LOGD_ENABLED) { 258622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Log.d(LOGTAG, performanceString + "\nWebpage: " + url); 25870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 258822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (url != null) { 258922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // strip the url to maintain consistency 259022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba String newUrl = new String(url); 259122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (newUrl.startsWith("http://www.")) { 259222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba newUrl = newUrl.substring(11); 259322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } else if (newUrl.startsWith("http://")) { 259422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba newUrl = newUrl.substring(7); 259522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } else if (newUrl.startsWith("https://www.")) { 259622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba newUrl = newUrl.substring(12); 259722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } else if (newUrl.startsWith("https://")) { 259822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba newUrl = newUrl.substring(8); 25990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 260031a6d1cb63a513712bad717a6239919fd5428fd1Dave Bort if (LOGD_ENABLED) { 260122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Log.d(LOGTAG, newUrl + " loaded"); 26020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 260522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 26060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 260722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (mInTrace) { 260822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mInTrace = false; 260922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Debug.stopMethodTracing(); 26100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 261122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 26120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 2613e7fe26bb1af55ec9e1535dcff8c9611692a7132dGrace Kloba private void closeEmptyChildTab() { 2614e7fe26bb1af55ec9e1535dcff8c9611692a7132dGrace Kloba Tab current = mTabControl.getCurrentTab(); 2615e7fe26bb1af55ec9e1535dcff8c9611692a7132dGrace Kloba if (current != null 2616e7fe26bb1af55ec9e1535dcff8c9611692a7132dGrace Kloba && current.getWebView().copyBackForwardList().getSize() == 0) { 2617e7fe26bb1af55ec9e1535dcff8c9611692a7132dGrace Kloba Tab parent = current.getParentTab(); 2618e7fe26bb1af55ec9e1535dcff8c9611692a7132dGrace Kloba if (parent != null) { 2619e7fe26bb1af55ec9e1535dcff8c9611692a7132dGrace Kloba switchToTab(mTabControl.getTabIndex(parent)); 2620e7fe26bb1af55ec9e1535dcff8c9611692a7132dGrace Kloba closeTab(current); 2621e7fe26bb1af55ec9e1535dcff8c9611692a7132dGrace Kloba } 2622e7fe26bb1af55ec9e1535dcff8c9611692a7132dGrace Kloba } 2623e7fe26bb1af55ec9e1535dcff8c9611692a7132dGrace Kloba } 2624e7fe26bb1af55ec9e1535dcff8c9611692a7132dGrace Kloba 262522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba boolean shouldOverrideUrlLoading(WebView view, String url) { 262647654f464e2ecd65fb049817201fb00a9f8fe29cJeff Hamilton if (view.isPrivateBrowsingEnabled()) { 262747654f464e2ecd65fb049817201fb00a9f8fe29cJeff Hamilton // Don't allow urls to leave the browser app when in private browsing mode 262847654f464e2ecd65fb049817201fb00a9f8fe29cJeff Hamilton loadUrl(view, url); 262947654f464e2ecd65fb049817201fb00a9f8fe29cJeff Hamilton return true; 263047654f464e2ecd65fb049817201fb00a9f8fe29cJeff Hamilton } 263147654f464e2ecd65fb049817201fb00a9f8fe29cJeff Hamilton 263222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (url.startsWith(SCHEME_WTAI)) { 263322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // wtai://wp/mc;number 263422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // number=string(phone-number) 263522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (url.startsWith(SCHEME_WTAI_MC)) { 263622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Intent intent = new Intent(Intent.ACTION_VIEW, 263722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Uri.parse(WebView.SCHEME_TEL + 263822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba url.substring(SCHEME_WTAI_MC.length()))); 263922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba startActivity(intent); 2640e7fe26bb1af55ec9e1535dcff8c9611692a7132dGrace Kloba // before leaving BrowserActivity, close the empty child tab. 2641e7fe26bb1af55ec9e1535dcff8c9611692a7132dGrace Kloba // If a new tab is created through JavaScript open to load this 2642e7fe26bb1af55ec9e1535dcff8c9611692a7132dGrace Kloba // url, we would like to close it as we will load this url in a 2643e7fe26bb1af55ec9e1535dcff8c9611692a7132dGrace Kloba // different Activity. 2644e7fe26bb1af55ec9e1535dcff8c9611692a7132dGrace Kloba closeEmptyChildTab(); 264522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba return true; 26460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 264722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // wtai://wp/sd;dtmf 264822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // dtmf=string(dialstring) 264922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (url.startsWith(SCHEME_WTAI_SD)) { 265022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // TODO: only send when there is active voice connection 26519918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn return false; 26529918943559193e3e047a1c18442e2cdb0fe22b15Dianne Hackborn } 265322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // wtai://wp/ap;number;name 265422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // number=string(phone-number) 265522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // name=string 265622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (url.startsWith(SCHEME_WTAI_AP)) { 265722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // TODO 26580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 26590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 266222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // The "about:" schemes are internal to the browser; don't want these to 266322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // be dispatched to other apps. 266422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (url.startsWith("about:")) { 266522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba return false; 26660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 266843610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson // If this is a Google search, attempt to add an RLZ string (if one isn't already present). 266943610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson if (rlzProviderPresent()) { 267043610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson Uri siteUri = Uri.parse(url); 267143610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson if (needsRlzString(siteUri)) { 267243610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson String rlz = null; 267343610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson Cursor cur = null; 267443610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson try { 267543610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson cur = getContentResolver().query(getRlzUri(), null, null, null, null); 267643610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson if (cur != null && cur.moveToFirst() && !cur.isNull(0)) { 267743610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson url = siteUri.buildUpon() 267843610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson .appendQueryParameter("rlz", cur.getString(0)) 267943610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson .build().toString(); 268043610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson } 268143610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson } finally { 268243610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson if (cur != null) { 268343610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson cur.close(); 268443610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson } 268543610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson } 268643610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson loadUrl(view, url); 268743610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson return true; 268843610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson } 268943610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson } 269043610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson 269122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Intent intent; 269222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // perform generic parsing of the URI to turn it into an Intent. 269322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba try { 269422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME); 269522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } catch (URISyntaxException ex) { 269622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Log.w("Browser", "Bad URI " + url + ": " + ex.getMessage()); 269722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba return false; 26980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 26990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 270022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // check whether the intent can be resolved. If not, we will see 270122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // whether we can download it from the Market. 270222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (getPackageManager().resolveActivity(intent, 0) == null) { 270322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba String packagename = intent.getPackage(); 270422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (packagename != null) { 270522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba intent = new Intent(Intent.ACTION_VIEW, Uri 270622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba .parse("market://search?q=pname:" + packagename)); 270722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba intent.addCategory(Intent.CATEGORY_BROWSABLE); 270822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba startActivity(intent); 2709e7fe26bb1af55ec9e1535dcff8c9611692a7132dGrace Kloba // before leaving BrowserActivity, close the empty child tab. 2710e7fe26bb1af55ec9e1535dcff8c9611692a7132dGrace Kloba // If a new tab is created through JavaScript open to load this 2711e7fe26bb1af55ec9e1535dcff8c9611692a7132dGrace Kloba // url, we would like to close it as we will load this url in a 2712e7fe26bb1af55ec9e1535dcff8c9611692a7132dGrace Kloba // different Activity. 2713e7fe26bb1af55ec9e1535dcff8c9611692a7132dGrace Kloba closeEmptyChildTab(); 271422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba return true; 27150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 27160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 27170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 27190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 272022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // sanitize the Intent, ensuring web pages can not bypass browser 272122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // security (only access to BROWSABLE activities). 272222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba intent.addCategory(Intent.CATEGORY_BROWSABLE); 272322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba intent.setComponent(null); 272422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba try { 272522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (startActivityIfNeeded(intent, -1)) { 2726e7fe26bb1af55ec9e1535dcff8c9611692a7132dGrace Kloba // before leaving BrowserActivity, close the empty child tab. 2727e7fe26bb1af55ec9e1535dcff8c9611692a7132dGrace Kloba // If a new tab is created through JavaScript open to load this 2728e7fe26bb1af55ec9e1535dcff8c9611692a7132dGrace Kloba // url, we would like to close it as we will load this url in a 2729e7fe26bb1af55ec9e1535dcff8c9611692a7132dGrace Kloba // different Activity. 2730e7fe26bb1af55ec9e1535dcff8c9611692a7132dGrace Kloba closeEmptyChildTab(); 27310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 27320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 273322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } catch (ActivityNotFoundException ex) { 273422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // ignore the error. If no application can handle the URL, 273522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // eg about:blank, assume the browser can handle it. 273622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 27370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 273822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (mMenuIsDown) { 273968792c84eded7f83e2f086d3efe81f9cfc07f9c3Michael Kolb openTab(url, false); 274022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba closeOptionsMenu(); 27410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 27420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 274322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba return false; 274422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 27450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 274643610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson // Determine whether the RLZ provider is present on the system. 274743610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson private boolean rlzProviderPresent() { 274843610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson if (mIsProviderPresent == null) { 274943610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson PackageManager pm = getPackageManager(); 275043610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson mIsProviderPresent = pm.resolveContentProvider(BrowserSettings.RLZ_PROVIDER, 0) != null; 275143610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson } 275243610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson return mIsProviderPresent; 275343610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson } 275443610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson 275543610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson // Retrieve the RLZ access point string and cache the URI used to retrieve RLZ values. 275643610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson private Uri getRlzUri() { 275743610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson if (mRlzUri == null) { 275843610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson String ap = getResources().getString(R.string.rlz_access_point); 275943610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson mRlzUri = Uri.withAppendedPath(BrowserSettings.RLZ_PROVIDER_URI, ap); 276043610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson } 276143610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson return mRlzUri; 276243610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson } 276343610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson 276443610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson // Determine if this URI appears to be for a Google search and does not have an RLZ parameter. 276543610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson // Taken largely from Chrome source, src/chrome/browser/google_url_tracker.cc 276643610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson private static boolean needsRlzString(Uri uri) { 2767c50e71a184ed1963d2358e92b4e196653d0a29faBill Napier String scheme = uri.getScheme(); 2768c50e71a184ed1963d2358e92b4e196653d0a29faBill Napier if (("http".equals(scheme) || "https".equals(scheme)) && 2769c50e71a184ed1963d2358e92b4e196653d0a29faBill Napier (uri.getQueryParameter("q") != null) && (uri.getQueryParameter("rlz") == null)) { 277043610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson String host = uri.getHost(); 277143610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson if (host == null) { 277243610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson return false; 277343610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson } 277443610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson String[] hostComponents = host.split("\\."); 277543610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson 277643610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson if (hostComponents.length < 2) { 277743610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson return false; 277843610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson } 277943610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson int googleComponent = hostComponents.length - 2; 278043610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson String component = hostComponents[googleComponent]; 278143610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson if (!"google".equals(component)) { 278243610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson if (hostComponents.length < 3 || 278343610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson (!"co".equals(component) && !"com".equals(component))) { 278443610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson return false; 278543610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson } 278643610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson googleComponent = hostComponents.length - 3; 278743610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson if (!"google".equals(hostComponents[googleComponent])) { 278843610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson return false; 278943610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson } 279043610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson } 279143610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson 279243610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson // Google corp network handling. 279343610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson if (googleComponent > 0 && "corp".equals(hostComponents[googleComponent - 1])) { 279443610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson return false; 279543610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson } 279643610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson 279743610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson return true; 279843610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson } 279943610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson return false; 280043610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson } 280143610292590fe3e2f8d0ddba1adf9e5557c0f401Jeff Davidson 280222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // ------------------------------------------------------------------------- 280322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Helper function for WebChromeClient 280422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // ------------------------------------------------------------------------- 28050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 280622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba void onProgressChanged(WebView view, int newProgress) { 2807a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb 2808a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb // On the phone, the fake title bar will always cover up the 2809a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb // regular title bar (or the regular one is offscreen), so only the 2810a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb // fake title bar needs to change its progress 2811a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb mFakeTitleBar.setProgress(newProgress); 281222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba 281322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (newProgress == 100) { 281422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // onProgressChanged() may continue to be called after the main 281522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // frame has finished loading, as any remaining sub frames continue 281622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // to load. We'll only get called once though with newProgress as 281722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // 100 when everything is loaded. (onPageFinished is called once 281822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // when the main frame completes loading regardless of the state of 281922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // any sub frames so calls to onProgressChanges may continue after 282022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // onPageFinished has executed) 282122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (mInLoad) { 282222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mInLoad = false; 2823a27ff19e24cb1c9fef5624dbc4554548349b5b31Leon Scroggins updateInLoadMenuItems(); 282422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // If the options menu is open, leave the title bar 282522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (!mOptionsMenuOpen || !mIconView) { 282622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba hideFakeTitleBar(); 28270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 28280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 2829aa37e7fdb52d0180b8eea25d53950c5c0791f968Leon Scroggins } else { 2830aa37e7fdb52d0180b8eea25d53950c5c0791f968Leon Scroggins if (!mInLoad) { 2831aa37e7fdb52d0180b8eea25d53950c5c0791f968Leon Scroggins // onPageFinished may have already been called but a subframe is 2832aa37e7fdb52d0180b8eea25d53950c5c0791f968Leon Scroggins // still loading and updating the progress. Reset mInLoad and 2833aa37e7fdb52d0180b8eea25d53950c5c0791f968Leon Scroggins // update the menu items. 2834aa37e7fdb52d0180b8eea25d53950c5c0791f968Leon Scroggins mInLoad = true; 2835aa37e7fdb52d0180b8eea25d53950c5c0791f968Leon Scroggins updateInLoadMenuItems(); 2836aa37e7fdb52d0180b8eea25d53950c5c0791f968Leon Scroggins } 2837aa37e7fdb52d0180b8eea25d53950c5c0791f968Leon Scroggins // When the page first begins to load, the Activity may still be 2838aa37e7fdb52d0180b8eea25d53950c5c0791f968Leon Scroggins // paused, in which case showFakeTitleBar will do nothing. Call 2839aa37e7fdb52d0180b8eea25d53950c5c0791f968Leon Scroggins // again as the page continues to load so that it will be shown. 2840aa37e7fdb52d0180b8eea25d53950c5c0791f968Leon Scroggins // (Calling it will the fake title bar is already showing will also 2841aa37e7fdb52d0180b8eea25d53950c5c0791f968Leon Scroggins // do nothing. 284222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (!mOptionsMenuOpen || mIconView) { 284322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // This page has begun to load, so show the title bar 284422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba showFakeTitleBar(); 28453918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 28460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 284722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 2848092dd5d22d7f2ee0efcc68bd6e5a3afd1ea98953Ben Murdoch 284922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback) { 28508ff57db0a8dc8eb659fbcdcd4a856208609e6070Derek Sollenberger // if a view already exists then immediately terminate the new one 28518ff57db0a8dc8eb659fbcdcd4a856208609e6070Derek Sollenberger if (mCustomView != null) { 28528ff57db0a8dc8eb659fbcdcd4a856208609e6070Derek Sollenberger callback.onCustomViewHidden(); 285322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba return; 28548ff57db0a8dc8eb659fbcdcd4a856208609e6070Derek Sollenberger } 28552bc69918d97a767a02132090e58718077381ba1aSteve Block 285622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Add the custom view to its container. 285722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mCustomViewContainer.addView(view, COVER_SCREEN_GRAVITY_CENTER); 285822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mCustomView = view; 285922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mCustomViewCallback = callback; 286022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Save the menu state and set it to empty while the custom 286122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // view is showing. 286222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mOldMenuState = mMenuState; 286322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mMenuState = EMPTY_MENU; 286422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Hide the content view. 286522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mContentView.setVisibility(View.GONE); 286622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Finally show the custom view container. 2867163ab74e2f85b53a1a374c49677073fb64d35f28Andrei Popescu setStatusBarVisibility(false); 286822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mCustomViewContainer.setVisibility(View.VISIBLE); 286922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mCustomViewContainer.bringToFront(); 287022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 287122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba 287222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba void onHideCustomView() { 287322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (mCustomView == null) 287422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba return; 28752bc69918d97a767a02132090e58718077381ba1aSteve Block 287622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Hide the custom view. 287722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mCustomView.setVisibility(View.GONE); 287822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Remove the custom view from its container. 287922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mCustomViewContainer.removeView(mCustomView); 288022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mCustomView = null; 288122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Reset the old menu state. 288222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mMenuState = mOldMenuState; 288322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mOldMenuState = EMPTY_MENU; 288422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mCustomViewContainer.setVisibility(View.GONE); 288522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mCustomViewCallback.onCustomViewHidden(); 288622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Show the content view. 2887163ab74e2f85b53a1a374c49677073fb64d35f28Andrei Popescu setStatusBarVisibility(true); 288822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mContentView.setVisibility(View.VISIBLE); 288922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 2890540035dfd1347c78eeec10ec0847e18fcc50ef36Andrei Popescu 289122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Bitmap getDefaultVideoPoster() { 289222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (mDefaultVideoPoster == null) { 289322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mDefaultVideoPoster = BitmapFactory.decodeResource( 289422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba getResources(), R.drawable.default_video_poster); 2895540035dfd1347c78eeec10ec0847e18fcc50ef36Andrei Popescu } 289622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba return mDefaultVideoPoster; 289722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 2898540035dfd1347c78eeec10ec0847e18fcc50ef36Andrei Popescu 289922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba View getVideoLoadingProgressView() { 290022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (mVideoProgressView == null) { 290122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba LayoutInflater inflater = LayoutInflater.from(BrowserActivity.this); 290222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mVideoProgressView = inflater.inflate( 290322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba R.layout.video_loading_progress, null); 2904540035dfd1347c78eeec10ec0847e18fcc50ef36Andrei Popescu } 290522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba return mVideoProgressView; 290622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 29070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 29088d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins /* 29098d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins * The Object used to inform the WebView of the file to upload. 29108d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins */ 29118d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins private ValueCallback<Uri> mUploadMessage; 291262b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch private String mCameraFilePath; 291362b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch 291462b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) { 291562b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch 291662b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch final String imageMimeType = "image/*"; 29176af492aeddda96c749142885e3b49455aa336309Ben Murdoch final String videoMimeType = "video/*"; 2918039bd47edd231965abb2c8e9b2dd32308cddb74bBen Murdoch final String audioMimeType = "audio/*"; 2919b50d7403816f316fdcaf5b5a318383e64f1a8775Ben Murdoch final String mediaSourceKey = "capture"; 29206af492aeddda96c749142885e3b49455aa336309Ben Murdoch final String mediaSourceValueCamera = "camera"; 2921b50d7403816f316fdcaf5b5a318383e64f1a8775Ben Murdoch final String mediaSourceValueFileSystem = "filesystem"; 29226af492aeddda96c749142885e3b49455aa336309Ben Murdoch final String mediaSourceValueCamcorder = "camcorder"; 2923039bd47edd231965abb2c8e9b2dd32308cddb74bBen Murdoch final String mediaSourceValueMicrophone = "microphone"; 292462b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch 2925039bd47edd231965abb2c8e9b2dd32308cddb74bBen Murdoch // media source can be 'filesystem' or 'camera' or 'camcorder' or 'microphone'. 29266af492aeddda96c749142885e3b49455aa336309Ben Murdoch String mediaSource = ""; 292762b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch 29286af492aeddda96c749142885e3b49455aa336309Ben Murdoch // We add the camera intent if there was no accept type (or '*/*' or 'image/*'). 292962b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch boolean addCameraIntent = true; 29306af492aeddda96c749142885e3b49455aa336309Ben Murdoch // We add the camcorder intent if there was no accept type (or '*/*' or 'video/*'). 29316af492aeddda96c749142885e3b49455aa336309Ben Murdoch boolean addCamcorderIntent = true; 29326af492aeddda96c749142885e3b49455aa336309Ben Murdoch 29336af492aeddda96c749142885e3b49455aa336309Ben Murdoch if (mUploadMessage != null) { 29346af492aeddda96c749142885e3b49455aa336309Ben Murdoch // Already a file picker operation in progress. 29356af492aeddda96c749142885e3b49455aa336309Ben Murdoch return; 29366af492aeddda96c749142885e3b49455aa336309Ben Murdoch } 29378d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins 293822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mUploadMessage = uploadMsg; 293962b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch 294062b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch // Parse the accept type. 294162b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch String params[] = acceptType.split(";"); 294262b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch String mimeType = params[0]; 294362b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch 294462b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch for (String p : params) { 294562b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch String[] keyValue = p.split("="); 294662b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch if (keyValue.length == 2) { 294762b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch // Process key=value parameters. 29486af492aeddda96c749142885e3b49455aa336309Ben Murdoch if (mediaSourceKey.equals(keyValue[0])) { 29496af492aeddda96c749142885e3b49455aa336309Ben Murdoch mediaSource = keyValue[1]; 295062b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch } 295162b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch } 295262b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch } 295362b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch 295462b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch // This intent will display the standard OPENABLE file picker. 295522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba Intent i = new Intent(Intent.ACTION_GET_CONTENT); 295622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba i.addCategory(Intent.CATEGORY_OPENABLE); 295762b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch 295862b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch // Create an intent to add to the standard file picker that will 295962b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch // capture an image from the camera. We'll combine this intent with 296062b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch // the standard OPENABLE picker unless the web developer specifically 296162b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch // requested the camera or gallery be opened by passing a parameter 296262b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch // in the accept type. 296362b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 296462b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch File externalDataDir = Environment.getExternalStoragePublicDirectory( 296562b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch Environment.DIRECTORY_DCIM); 296662b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch File cameraDataDir = new File(externalDataDir.getAbsolutePath() + 296762b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch File.separator + "browser-photos"); 296862b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch cameraDataDir.mkdirs(); 296962b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch mCameraFilePath = cameraDataDir.getAbsolutePath() + File.separator + 297062b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch System.currentTimeMillis() + ".jpg"; 297162b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mCameraFilePath))); 297262b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch 29736af492aeddda96c749142885e3b49455aa336309Ben Murdoch Intent camcorderIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); 29746af492aeddda96c749142885e3b49455aa336309Ben Murdoch 2975039bd47edd231965abb2c8e9b2dd32308cddb74bBen Murdoch Intent soundRecIntent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION); 2976039bd47edd231965abb2c8e9b2dd32308cddb74bBen Murdoch 297762b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch if (mimeType.equals(imageMimeType)) { 297862b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch i.setType(imageMimeType); 29796af492aeddda96c749142885e3b49455aa336309Ben Murdoch addCamcorderIntent = false; 29806af492aeddda96c749142885e3b49455aa336309Ben Murdoch if (mediaSource.equals(mediaSourceValueCamera)) { 298162b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch // Specified 'image/*' and requested the camera, so go ahead and launch the camera 298262b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch // directly. 298362b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch BrowserActivity.this.startActivityForResult(cameraIntent, FILE_SELECTED); 298462b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch return; 2985b50d7403816f316fdcaf5b5a318383e64f1a8775Ben Murdoch } else if (mediaSource.equals(mediaSourceValueFileSystem)) { 2986b50d7403816f316fdcaf5b5a318383e64f1a8775Ben Murdoch // Specified filesytem as the source, so don't want to consider the camera. 298762b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch addCameraIntent = false; 298862b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch } 29896af492aeddda96c749142885e3b49455aa336309Ben Murdoch } else if (mimeType.equals(videoMimeType)) { 29906af492aeddda96c749142885e3b49455aa336309Ben Murdoch i.setType(videoMimeType); 29916af492aeddda96c749142885e3b49455aa336309Ben Murdoch addCameraIntent = false; 29926af492aeddda96c749142885e3b49455aa336309Ben Murdoch // The camcorder saves it's own file and returns it to us in the intent, so 29936af492aeddda96c749142885e3b49455aa336309Ben Murdoch // we don't need to generate one here. 29946af492aeddda96c749142885e3b49455aa336309Ben Murdoch mCameraFilePath = null; 29956af492aeddda96c749142885e3b49455aa336309Ben Murdoch 29966af492aeddda96c749142885e3b49455aa336309Ben Murdoch if (mediaSource.equals(mediaSourceValueCamcorder)) { 2997039bd47edd231965abb2c8e9b2dd32308cddb74bBen Murdoch // Specified 'video/*' and requested the camcorder, so go ahead and launch the 2998039bd47edd231965abb2c8e9b2dd32308cddb74bBen Murdoch // camcorder directly. 29996af492aeddda96c749142885e3b49455aa336309Ben Murdoch BrowserActivity.this.startActivityForResult(camcorderIntent, FILE_SELECTED); 30006af492aeddda96c749142885e3b49455aa336309Ben Murdoch return; 3001b50d7403816f316fdcaf5b5a318383e64f1a8775Ben Murdoch } else if (mediaSource.equals(mediaSourceValueFileSystem)) { 3002b50d7403816f316fdcaf5b5a318383e64f1a8775Ben Murdoch // Specified filesystem as the source, so don't want to consider the camcorder. 30036af492aeddda96c749142885e3b49455aa336309Ben Murdoch addCamcorderIntent = false; 30046af492aeddda96c749142885e3b49455aa336309Ben Murdoch } 3005039bd47edd231965abb2c8e9b2dd32308cddb74bBen Murdoch } else if (mimeType.equals(audioMimeType)) { 3006039bd47edd231965abb2c8e9b2dd32308cddb74bBen Murdoch i.setType(audioMimeType); 3007039bd47edd231965abb2c8e9b2dd32308cddb74bBen Murdoch addCameraIntent = false; 3008039bd47edd231965abb2c8e9b2dd32308cddb74bBen Murdoch addCamcorderIntent = false; 3009039bd47edd231965abb2c8e9b2dd32308cddb74bBen Murdoch if (mediaSource.equals(mediaSourceValueMicrophone)) { 3010039bd47edd231965abb2c8e9b2dd32308cddb74bBen Murdoch // Specified 'audio/*' and requested microphone, so go ahead and launch the sound 3011039bd47edd231965abb2c8e9b2dd32308cddb74bBen Murdoch // recorder. 3012039bd47edd231965abb2c8e9b2dd32308cddb74bBen Murdoch BrowserActivity.this.startActivityForResult(soundRecIntent, FILE_SELECTED); 3013039bd47edd231965abb2c8e9b2dd32308cddb74bBen Murdoch return; 3014039bd47edd231965abb2c8e9b2dd32308cddb74bBen Murdoch } 3015039bd47edd231965abb2c8e9b2dd32308cddb74bBen Murdoch // On a default system, there is no single option to open an audio "gallery". Both the 3016039bd47edd231965abb2c8e9b2dd32308cddb74bBen Murdoch // sound recorder and music browser respond to the OPENABLE/audio/* intent unlike the 3017039bd47edd231965abb2c8e9b2dd32308cddb74bBen Murdoch // image/* and video/* OPENABLE intents where the image / video gallery are the only 3018039bd47edd231965abb2c8e9b2dd32308cddb74bBen Murdoch // respondants (and so the user is not prompted by default). 301962b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch } else { 302062b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch i.setType("*/*"); 302162b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch } 302262b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch 30236af492aeddda96c749142885e3b49455aa336309Ben Murdoch // Combine the chooser and the extra choices (like camera or camcorder) 302462b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch Intent chooser = new Intent(Intent.ACTION_CHOOSER); 302562b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch chooser.putExtra(Intent.EXTRA_INTENT, i); 302662b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch 30276af492aeddda96c749142885e3b49455aa336309Ben Murdoch Vector<Intent> extraInitialIntents = new Vector<Intent>(0); 30286af492aeddda96c749142885e3b49455aa336309Ben Murdoch 302962b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch if (addCameraIntent) { 30306af492aeddda96c749142885e3b49455aa336309Ben Murdoch extraInitialIntents.add(cameraIntent); 30316af492aeddda96c749142885e3b49455aa336309Ben Murdoch } 30326af492aeddda96c749142885e3b49455aa336309Ben Murdoch 30336af492aeddda96c749142885e3b49455aa336309Ben Murdoch if (addCamcorderIntent) { 30346af492aeddda96c749142885e3b49455aa336309Ben Murdoch extraInitialIntents.add(camcorderIntent); 30356af492aeddda96c749142885e3b49455aa336309Ben Murdoch } 30366af492aeddda96c749142885e3b49455aa336309Ben Murdoch 30376af492aeddda96c749142885e3b49455aa336309Ben Murdoch if (extraInitialIntents.size() > 0) { 30386af492aeddda96c749142885e3b49455aa336309Ben Murdoch Intent[] extraIntents = new Intent[extraInitialIntents.size()]; 30396af492aeddda96c749142885e3b49455aa336309Ben Murdoch chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraInitialIntents.toArray(extraIntents)); 304062b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch } 304162b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch 304262b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch chooser.putExtra(Intent.EXTRA_TITLE, getString(R.string.choose_upload)); 304362b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch BrowserActivity.this.startActivityForResult(chooser, FILE_SELECTED); 304422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 304522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba 304622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // ------------------------------------------------------------------------- 304722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // Implement functions for DownloadListener 304822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // ------------------------------------------------------------------------- 304922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba 30500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 30510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Notify the host application a download should be done, or that 30520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * the data should be streamed if a streaming viewer is available. 30530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param url The full url to the content that should be downloaded 30540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param contentDisposition Content-disposition http header, if 30550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * present. 30560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param mimetype The mimetype of the content reported by the server 30570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param contentLength The file size reported by the server 30580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 30590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onDownloadStart(String url, String userAgent, 30600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String contentDisposition, String mimetype, long contentLength) { 30610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we're dealing wih A/V content that's not explicitly marked 30620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // for download, check if it's streamable. 30630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (contentDisposition == null 3064e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott || !contentDisposition.regionMatches( 3065e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott true, 0, "attachment", 0, 10)) { 30660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // query the package manager to see if there's a registered handler 30670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // that matches. 30680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent = new Intent(Intent.ACTION_VIEW); 30690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project intent.setDataAndType(Uri.parse(url), mimetype); 3070e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott ResolveInfo info = getPackageManager().resolveActivity(intent, 3071e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott PackageManager.MATCH_DEFAULT_ONLY); 3072e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott if (info != null) { 3073e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott ComponentName myName = getComponentName(); 3074e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott // If we resolved to ourselves, we don't want to attempt to 3075e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott // load the url only to try and download it again. 3076e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott if (!myName.getPackageName().equals( 3077e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott info.activityInfo.packageName) 3078e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott || !myName.getClassName().equals( 3079e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott info.activityInfo.name)) { 3080e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott // someone (other than us) knows how to handle this mime 3081e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott // type with this scheme, don't download. 3082e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott try { 3083e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott startActivity(intent); 3084e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott return; 3085e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott } catch (ActivityNotFoundException ex) { 3086e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott if (LOGD_ENABLED) { 3087e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott Log.d(LOGTAG, "activity not found for " + mimetype 3088e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott + " over " + Uri.parse(url).getScheme(), 3089e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott ex); 3090e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott } 3091e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott // Best behavior is to fall back to a download in this 3092e1fb96676cd2404c5de091d60828185228ef4c90Patrick Scott // case 30930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project onDownloadStartNoStream(url, userAgent, contentDisposition, mimetype, contentLength); 30980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 30990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3100fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen // This is to work around the fact that java.net.URI throws Exceptions 3101fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen // instead of just encoding URL's properly 3102fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen // Helper method for onDownloadStartNoStream 3103fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen private static String encodePath(String path) { 3104fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen char[] chars = path.toCharArray(); 3105fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen 3106fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen boolean needed = false; 3107fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen for (char c : chars) { 3108fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen if (c == '[' || c == ']') { 3109fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen needed = true; 3110fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen break; 3111fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen } 3112fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen } 3113fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen if (needed == false) { 3114fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen return path; 3115fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen } 3116fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen 3117fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen StringBuilder sb = new StringBuilder(""); 3118fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen for (char c : chars) { 3119fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen if (c == '[' || c == ']') { 3120fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen sb.append('%'); 3121fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen sb.append(Integer.toHexString(c)); 3122fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen } else { 3123fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen sb.append(c); 3124fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen } 3125fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen } 3126fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen 3127fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen return sb.toString(); 3128fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen } 3129fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen 31300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 31310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Notify the host application a download should be done, even if there 31320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * is a streaming viewer available for thise type. 31330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param url The full url to the content that should be downloaded 31340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param contentDisposition Content-disposition http header, if 31350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * present. 31360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param mimetype The mimetype of the content reported by the server 31370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param contentLength The file size reported by the server 31380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 31390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /*package */ void onDownloadStartNoStream(String url, String userAgent, 31400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String contentDisposition, String mimetype, long contentLength) { 31410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String filename = URLUtil.guessFileName(url, 31430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project contentDisposition, mimetype); 31440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Check to see if we have an SDCard 31460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String status = Environment.getExternalStorageState(); 31470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!status.equals(Environment.MEDIA_MOUNTED)) { 31480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int title; 31490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String msg; 31500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Check to see if the SDCard is busy, same as the music app 31520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (status.equals(Environment.MEDIA_SHARED)) { 31530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project msg = getString(R.string.download_sdcard_busy_dlg_msg); 31540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = R.string.download_sdcard_busy_dlg_title; 31550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 31560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project msg = getString(R.string.download_no_sdcard_dlg_msg, filename); 31570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = R.string.download_no_sdcard_dlg_title; 31580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 31600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(this) 31610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(title) 31620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setIcon(android.R.drawable.ic_dialog_alert) 31630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setMessage(msg) 31640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, null) 31650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 31660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 31670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3169fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen // java.net.URI is a lot stricter than KURL so we have to encode some 3170fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen // extra characters. Fix for b 2538060 and b 1634719 3171fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen WebAddress webAddress; 31720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 3173fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen webAddress = new WebAddress(url); 3174131ab511f73b573b76fe8e692b829df4fe89bd54Bjorn Bringert webAddress.setPath(encodePath(webAddress.getPath())); 31750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (Exception e) { 3176fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen // This only happens for very bad urls, we want to chatch the 3177fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen // exception here 3178fa52d17a04294c245d6b00180bbe03560390c967Kristian Monsen Log.e(LOGTAG, "Exception trying to parse url:" + url); 31790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 31800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 31810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3182c6076533b489c17493640c14935324a30f582903Leon Scroggins String addressString = webAddress.toString(); 3183c6076533b489c17493640c14935324a30f582903Leon Scroggins Uri uri = Uri.parse(addressString); 3184c6076533b489c17493640c14935324a30f582903Leon Scroggins DownloadManager.Request request = new DownloadManager.Request(uri); 3185c6076533b489c17493640c14935324a30f582903Leon Scroggins request.setMimeType(mimetype); 3186c6076533b489c17493640c14935324a30f582903Leon Scroggins request.setDestinationInExternalFilesDir(this, null, filename); 31871d88aa02955a2579e38f6aeea56ec737a0310d62Vasu Nori // let this downloaded file be scanned by MediaScanner - so that it can show up 31881d88aa02955a2579e38f6aeea56ec737a0310d62Vasu Nori // in Gallery app, for example. 31891d88aa02955a2579e38f6aeea56ec737a0310d62Vasu Nori request.allowScanningByMediaScanner(); 3190c6076533b489c17493640c14935324a30f582903Leon Scroggins request.setDescription(webAddress.getHost()); 3191c54d328a499ec0c35f73e5cf57169541e8bf1cd3Vasu Nori String cookies = CookieManager.getInstance().getCookie(url); 3192c54d328a499ec0c35f73e5cf57169541e8bf1cd3Vasu Nori request.addRequestHeader("cookie", cookies); 319309ccfc737f764131c16334a444c7b96ab751c402Leon Scroggins request.setNotificationVisibility( 319409ccfc737f764131c16334a444c7b96ab751c402Leon Scroggins DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 31950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mimetype == null) { 3196c6076533b489c17493640c14935324a30f582903Leon Scroggins ContentValues values = new ContentValues(); 3197c6076533b489c17493640c14935324a30f582903Leon Scroggins values.put(FetchUrlMimeType.URI, addressString); 3198c6076533b489c17493640c14935324a30f582903Leon Scroggins // XXX: Have to use the old url since the cookies were stored using the 3199c6076533b489c17493640c14935324a30f582903Leon Scroggins // old percent-encoded url. 3200c6076533b489c17493640c14935324a30f582903Leon Scroggins values.put(FetchUrlMimeType.COOKIE_DATA, cookies); 3201c6076533b489c17493640c14935324a30f582903Leon Scroggins values.put(FetchUrlMimeType.USER_AGENT, userAgent); 3202c6076533b489c17493640c14935324a30f582903Leon Scroggins 32030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // We must have long pressed on a link or image to download it. We 32040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // are not sure of the mimetype in this case, so do a head request 3205c6076533b489c17493640c14935324a30f582903Leon Scroggins new FetchUrlMimeType(this, request).execute(values); 32060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 3207c6076533b489c17493640c14935324a30f582903Leon Scroggins DownloadManager manager 3208c6076533b489c17493640c14935324a30f582903Leon Scroggins = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); 3209c6076533b489c17493640c14935324a30f582903Leon Scroggins manager.enqueue(request); 32100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32119191a7f745c965cf57df94d0628890b413c710c9Leon Scroggins Toast.makeText(this, R.string.download_pending, Toast.LENGTH_SHORT) 32129191a7f745c965cf57df94d0628890b413c710c9Leon Scroggins .show(); 32130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 321522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba // ------------------------------------------------------------------------- 321622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba 32170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 32180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Resets the lock icon. This method is called when we start a new load and 32190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * know the url to be loaded. 32200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 32210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void resetLockIcon(String url) { 32220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Save the lock-icon state (we revert to it if the load gets cancelled) 322322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mTabControl.getCurrentTab().resetLockIcon(url); 32240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project updateLockIconImage(LOCK_ICON_UNSECURE); 32250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 32283bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins * Update the lock icon to correspond to our latest state. 32293bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins */ 323022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba private void updateLockIconToLatest() { 323191f65fccfd6feae560a42abdd3385ca3318f0430Leon Scroggins Tab t = mTabControl.getCurrentTab(); 323291f65fccfd6feae560a42abdd3385ca3318f0430Leon Scroggins if (t != null) { 323391f65fccfd6feae560a42abdd3385ca3318f0430Leon Scroggins updateLockIconImage(t.getLockIconType()); 323491f65fccfd6feae560a42abdd3385ca3318f0430Leon Scroggins } 32353bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins } 32363bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins 32373bbb6caa3ceaec1106fe1de76066f5e1a186795eLeon Scroggins /** 32380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Updates the lock-icon image in the title-bar. 32390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 32400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private void updateLockIconImage(int lockIconType) { 32410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Drawable d = null; 32420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (lockIconType == LOCK_ICON_SECURE) { 32430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project d = mSecLockIcon; 32440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (lockIconType == LOCK_ICON_MIXED) { 32450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project d = mMixLockIcon; 32460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 324768579393973f745fc65a2781061af9bb8f2d7020Leon Scroggins mTitleBar.setLock(d); 3248a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb mFakeTitleBar.setLock(d); 32490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 32520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Displays a page-info dialog. 32530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param tab The tab to show info about 32540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param fromShowSSLCertificateOnError The flag that indicates whether 32550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * this dialog was opened from the SSL-certificate-on-error dialog or 32560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * not. This is important, since we need to know whether to return to 32570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * the parent dialog or simply dismiss. 32580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 325922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba private void showPageInfo(final Tab tab, 32600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final boolean fromShowSSLCertificateOnError) { 32610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final LayoutInflater factory = LayoutInflater 32620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .from(this); 32630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final View pageInfoView = factory.inflate(R.layout.page_info, null); 32650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView view = tab.getWebView(); 32670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String url = null; 32690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String title = null; 32700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (view == null) { 32720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = tab.getUrl(); 32730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = tab.getTitle(); 32740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (view == mTabControl.getCurrentWebView()) { 32750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Use the cached title and url if this is the current WebView 32760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = mUrl; 32770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = mTitle; 32780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 32790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = view.getUrl(); 32800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = view.getTitle(); 32810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url == null) { 32840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = ""; 32850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (title == null) { 32870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = ""; 32880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 32890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) pageInfoView.findViewById(R.id.address)).setText(url); 32910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) pageInfoView.findViewById(R.id.title)).setText(title); 32920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoView = tab; 3294c7b92f811dfa3572578ddc6714c98a03936d9ce5Leon Scroggins mPageInfoFromShowSSLCertificateOnError = fromShowSSLCertificateOnError; 32950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 32960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project AlertDialog.Builder alertDialogBuilder = 32970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(this) 32980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.page_info).setIcon(android.R.drawable.ic_dialog_info) 32990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setView(pageInfoView) 33000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton( 33010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.string.ok, 33020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 33030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 33040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 33050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoDialog = null; 33060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoView = null; 33070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we came here from the SSL error dialog 33090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (fromShowSSLCertificateOnError) { 33100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // go back to the SSL error dialog 33110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificateOnError( 33120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView, 33130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler, 33140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError); 33150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 33180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setOnCancelListener( 33190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnCancelListener() { 33200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCancel(DialogInterface dialog) { 33210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoDialog = null; 33220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoView = null; 33230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we came here from the SSL error dialog 33250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (fromShowSSLCertificateOnError) { 33260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // go back to the SSL error dialog 33270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificateOnError( 33280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView, 33290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler, 33300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError); 33310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }); 33340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we have a main top-level page SSL certificate set or a certificate 33360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // error 33370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (fromShowSSLCertificateOnError || 33380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (view != null && view.getCertificate() != null)) { 33390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // add a 'View Certificate' button 33400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project alertDialogBuilder.setNeutralButton( 33410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.string.view_certificate, 33420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 33430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 33440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 33450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoDialog = null; 33460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoView = null; 33470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // if we came here from the SSL error dialog 33490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (fromShowSSLCertificateOnError) { 33500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // go back to the SSL error dialog 33510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificateOnError( 33520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView, 33530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler, 33540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError); 33550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 33560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // otherwise, display the top-most certificate from 33570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // the chain 33580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (view.getCertificate() != null) { 33590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showSSLCertificate(tab); 33600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }); 33640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mPageInfoDialog = alertDialogBuilder.show(); 33670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 33700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Displays the main top-level page SSL certificate dialog 33710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * (accessible from the Page-Info dialog). 33720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param tab The tab to show certificate for. 33730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 337422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba private void showSSLCertificate(final Tab tab) { 33750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final View certificateView = 33760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inflateCertificateView(tab.getWebView().getCertificate()); 33770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (certificateView == null) { 33780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 33790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 33800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LayoutInflater factory = LayoutInflater.from(this); 33820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final LinearLayout placeholder = 33840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (LinearLayout)certificateView.findViewById(R.id.placeholder); 33850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout) factory.inflate( 33870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.layout.ssl_success, placeholder); 33880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.success)) 33890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_certificate_is_valid); 33900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 33910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateView = tab; 33920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateDialog = 33930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(this) 33940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.ssl_certificate).setIcon( 33950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.drawable.ic_dialog_browser_certificate_secure) 33960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setView(certificateView) 33970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, 33980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 33990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 34000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 34010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateDialog = null; 34020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateView = null; 34030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showPageInfo(tab, false); 34050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 34070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setOnCancelListener( 34080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnCancelListener() { 34090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCancel(DialogInterface dialog) { 34100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateDialog = null; 34110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateView = null; 34120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showPageInfo(tab, false); 34140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 34160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 34170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 34200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Displays the SSL error certificate dialog. 34210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param view The target web-view. 34220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param handler The SSL error handler responsible for cancelling the 34230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * connection that resulted in an SSL error or proceeding per user request. 34240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param error The SSL error object. 34250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 342622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba void showSSLCertificateOnError( 34270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final WebView view, final SslErrorHandler handler, final SslError error) { 34280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final View certificateView = 34300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project inflateCertificateView(error.getCertificate()); 34310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (certificateView == null) { 34320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 34330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LayoutInflater factory = LayoutInflater.from(this); 34360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final LinearLayout placeholder = 34380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project (LinearLayout)certificateView.findViewById(R.id.placeholder); 34390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_UNTRUSTED)) { 34410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 34420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, placeholder); 34430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 34440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_untrusted); 34450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_IDMISMATCH)) { 34480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 34490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, placeholder); 34500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 34510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_mismatch); 34520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_EXPIRED)) { 34550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 34560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, placeholder); 34570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 34580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_expired); 34590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (error.hasError(SslError.SSL_NOTYETVALID)) { 34620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LinearLayout ll = (LinearLayout)factory 34630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .inflate(R.layout.ssl_warning, placeholder); 34640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView)ll.findViewById(R.id.warning)) 34650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(R.string.ssl_not_yet_valid); 34660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler = handler; 34690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView = view; 34700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError = error; 34710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorDialog = 34720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new AlertDialog.Builder(this) 34730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setTitle(R.string.ssl_certificate).setIcon( 34740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.drawable.ic_dialog_browser_certificate_partially_secure) 34750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setView(certificateView) 34760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setPositiveButton(R.string.ok, 34770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 34780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 34790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 34800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorDialog = null; 34810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView = null; 34820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler = null; 34830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError = null; 34840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 348522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba view.getWebViewClient().onReceivedSslError( 348622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba view, handler, error); 34870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 34880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 34890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setNeutralButton(R.string.page_info_view, 34900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnClickListener() { 34910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(DialogInterface dialog, 34920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project int whichButton) { 34930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorDialog = null; 34940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // do not clear the dialog state: we will 34960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // need to show the dialog again once the 34970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // user is done exploring the page-info details 34980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 34990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project showPageInfo(mTabControl.getTabFromView(view), 35000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project true); 35010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 35030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setOnCancelListener( 35040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new DialogInterface.OnCancelListener() { 35050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onCancel(DialogInterface dialog) { 35060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorDialog = null; 35070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorView = null; 35080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorHandler = null; 35090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mSSLCertificateOnErrorError = null; 35100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 351122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba view.getWebViewClient().onReceivedSslError( 351222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba view, handler, error); 35130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }) 35150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .show(); 35160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 35190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Inflates the SSL certificate view (helper method). 35200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param certificate The SSL certificate. 35210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @return The resultant certificate view with issued-to, issued-by, 35220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * issued-on, expires-on, and possibly other fields set. 35230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * If the input certificate is null, returns null. 35240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 35250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private View inflateCertificateView(SslCertificate certificate) { 35260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (certificate == null) { 35270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return null; 35280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project LayoutInflater factory = LayoutInflater.from(this); 35310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project View certificateView = factory.inflate( 35330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.layout.ssl_certificate, null); 35340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // issued to: 35360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project SslCertificate.DName issuedTo = certificate.getIssuedTo(); 35370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (issuedTo != null) { 35380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.to_common)) 35390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedTo.getCName()); 35400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.to_org)) 35410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedTo.getOName()); 35420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.to_org_unit)) 35430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedTo.getUName()); 35440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // issued by: 35470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project SslCertificate.DName issuedBy = certificate.getIssuedBy(); 35480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (issuedBy != null) { 35490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.by_common)) 35500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedBy.getCName()); 35510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.by_org)) 35520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedBy.getOName()); 35530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.by_org_unit)) 35540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedBy.getUName()); 35550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // issued on: 355895a2e4ab94514e4e41033b0d27a0e66855cff8ebBrian Carlstrom String issuedOn = formatCertificateDate( 355995a2e4ab94514e4e41033b0d27a0e66855cff8ebBrian Carlstrom certificate.getValidNotBeforeDate()); 35600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.issued_on)) 35610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(issuedOn); 35620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // expires on: 356495a2e4ab94514e4e41033b0d27a0e66855cff8ebBrian Carlstrom String expiresOn = formatCertificateDate( 356595a2e4ab94514e4e41033b0d27a0e66855cff8ebBrian Carlstrom certificate.getValidNotAfterDate()); 35660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ((TextView) certificateView.findViewById(R.id.expires_on)) 35670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project .setText(expiresOn); 35680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return certificateView; 35700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 357395a2e4ab94514e4e41033b0d27a0e66855cff8ebBrian Carlstrom * Formats the certificate date to a properly localized date string. 35740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @return Properly localized version of the certificate date string and 357595a2e4ab94514e4e41033b0d27a0e66855cff8ebBrian Carlstrom * the "" if it fails to localize. 35760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 357795a2e4ab94514e4e41033b0d27a0e66855cff8ebBrian Carlstrom private String formatCertificateDate(Date certificateDate) { 357895a2e4ab94514e4e41033b0d27a0e66855cff8ebBrian Carlstrom if (certificateDate == null) { 357995a2e4ab94514e4e41033b0d27a0e66855cff8ebBrian Carlstrom return ""; 35800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 358195a2e4ab94514e4e41033b0d27a0e66855cff8ebBrian Carlstrom String formattedDate = DateFormat.getDateFormat(this).format(certificateDate); 358295a2e4ab94514e4e41033b0d27a0e66855cff8ebBrian Carlstrom if (formattedDate == null) { 358395a2e4ab94514e4e41033b0d27a0e66855cff8ebBrian Carlstrom return ""; 358495a2e4ab94514e4e41033b0d27a0e66855cff8ebBrian Carlstrom } 358595a2e4ab94514e4e41033b0d27a0e66855cff8ebBrian Carlstrom return formattedDate; 35860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 35870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 35890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Displays an http-authentication dialog. 35900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 35912573892d6dbcda5519fcc8bd2876a27c4c9502b1Bjorn Bringert void showHttpAuthentication(final HttpAuthHandler handler, String host, String realm) { 35922573892d6dbcda5519fcc8bd2876a27c4c9502b1Bjorn Bringert mHttpAuthenticationDialog = new HttpAuthenticationDialog(this, host, realm); 35932573892d6dbcda5519fcc8bd2876a27c4c9502b1Bjorn Bringert mHttpAuthenticationDialog.setOkListener(new HttpAuthenticationDialog.OkListener() { 35942573892d6dbcda5519fcc8bd2876a27c4c9502b1Bjorn Bringert public void onOk(String host, String realm, String username, String password) { 35952573892d6dbcda5519fcc8bd2876a27c4c9502b1Bjorn Bringert BrowserActivity.this.setHttpAuthUsernamePassword(host, realm, username, password); 35962573892d6dbcda5519fcc8bd2876a27c4c9502b1Bjorn Bringert handler.proceed(username, password); 35972573892d6dbcda5519fcc8bd2876a27c4c9502b1Bjorn Bringert mHttpAuthenticationDialog = null; 35982573892d6dbcda5519fcc8bd2876a27c4c9502b1Bjorn Bringert } 35992573892d6dbcda5519fcc8bd2876a27c4c9502b1Bjorn Bringert }); 36002573892d6dbcda5519fcc8bd2876a27c4c9502b1Bjorn Bringert mHttpAuthenticationDialog.setCancelListener(new HttpAuthenticationDialog.CancelListener() { 36012573892d6dbcda5519fcc8bd2876a27c4c9502b1Bjorn Bringert public void onCancel() { 36022573892d6dbcda5519fcc8bd2876a27c4c9502b1Bjorn Bringert handler.cancel(); 36032573892d6dbcda5519fcc8bd2876a27c4c9502b1Bjorn Bringert BrowserActivity.this.resetTitleAndRevertLockIcon(); 36042573892d6dbcda5519fcc8bd2876a27c4c9502b1Bjorn Bringert mHttpAuthenticationDialog = null; 36052573892d6dbcda5519fcc8bd2876a27c4c9502b1Bjorn Bringert } 36062573892d6dbcda5519fcc8bd2876a27c4c9502b1Bjorn Bringert }); 36072573892d6dbcda5519fcc8bd2876a27c4c9502b1Bjorn Bringert mHttpAuthenticationDialog.show(); 36080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public int getProgress() { 36110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = mTabControl.getCurrentWebView(); 36120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 36130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return w.getProgress(); 36140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 36150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return 100; 36160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 36200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Set HTTP authentication password. 36210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 36220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param host The host for the password 36230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param realm The realm for the password 36240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param username The username for the password. If it is null, it means 36250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * password can't be saved. 36260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param password The password 36270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 36280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void setHttpAuthUsernamePassword(String host, String realm, 36290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String username, 36300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String password) { 363195a53b25504f12c3a5f8ecbbfcff7ac1dc047e4fSteve Block WebView w = getTopWindow(); 36320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 36330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.setHttpAuthUsernamePassword(host, realm, username, password); 36340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 36370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 36380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * connectivity manager says net has come or gone... inform the user 36390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @param up true if net has come up, false if net has gone down 36400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 36410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onNetworkToggle(boolean up) { 36420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (up == mIsNetworkUp) { 36430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 36440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else if (up) { 36450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mIsNetworkUp = true; 36460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mAlertDialog != null) { 36470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mAlertDialog.cancel(); 36480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mAlertDialog = null; 36490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 36510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mIsNetworkUp = false; 3652eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott if (mInLoad) { 3653eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott createAndShowNetworkDialog(); 3654eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott } 36550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project WebView w = mTabControl.getCurrentWebView(); 36570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (w != null) { 36580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project w.setNetworkAvailable(up); 36590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 36610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 366222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba boolean isNetworkUp() { 366322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba return mIsNetworkUp; 366422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 366522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba 3666eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott // This method shows the network dialog alerting the user that the net is 3667eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott // down. It will only show the dialog if mAlertDialog is null. 3668eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott private void createAndShowNetworkDialog() { 3669eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott if (mAlertDialog == null) { 3670eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott mAlertDialog = new AlertDialog.Builder(this) 3671eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott .setTitle(R.string.loadSuspendedTitle) 3672eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott .setMessage(R.string.loadSuspended) 3673eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott .setPositiveButton(R.string.ok, null) 3674eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott .show(); 3675eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott } 3676eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott } 3677eb6ab2aeeccb5ddfba7faefd9c1b5fe14ee8d885Patrick Scott 3678e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb /** 3679e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb * callback from ComboPage when bookmark/history selection 3680e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb */ 3681e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb @Override 3682e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb public void onUrlSelected(String url, boolean newTab) { 3683e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb removeComboView(); 3684e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb if (!TextUtils.isEmpty(url)) { 3685e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb if (newTab) { 3686e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb openTab(url, false); 3687e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb } else { 3688e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb final Tab currentTab = mTabControl.getCurrentTab(); 3689e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb dismissSubWindow(currentTab); 3690e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb loadUrl(getTopWindow(), url); 3691e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb } 3692e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb } 3693e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb } 3694e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb 3695e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb /** 3696e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb * callback from ComboPage when dismissed 3697e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb */ 3698e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb @Override 3699e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb public void onComboCanceled() { 3700e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb removeComboView(); 3701e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb } 3702e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb 3703e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb /** 3704e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb * dismiss the ComboPage 3705e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb */ 3706e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb /* package */ void removeComboView() { 3707e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb if (mComboView != null) { 3708e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb mContentView.removeView(mComboView); 3709e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb mTitleBar.setVisibility(View.VISIBLE); 3710e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb mMenuState = R.id.MAIN_MENU; 3711e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb attachTabToContentView(mTabControl.getCurrentTab()); 3712e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb getTopWindow().requestFocus(); 3713e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb mComboView = null; 3714e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb } 3715e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb } 3716e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb 3717e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb /** 3718e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb * callback from ComboPage when clear history is requested 3719e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb */ 3720e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb public void onRemoveParentChildRelationships() { 3721e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb mTabControl.removeParentChildRelationShips(); 3722e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb } 3723e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb 37240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project @Override 37250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project protected void onActivityResult(int requestCode, int resultCode, 37260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Intent intent) { 3727bb394f3e134b6e5898ef7ae861b75e95e618688fGrace Kloba if (getTopWindow() == null) return; 37280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project switch (requestCode) { 3729fde9746ac3055848e110c35f19ec5893c621f766Leon Scroggins case PREFERENCES_PAGE: 3730fde9746ac3055848e110c35f19ec5893c621f766Leon Scroggins if (resultCode == RESULT_OK && intent != null) { 3731fde9746ac3055848e110c35f19ec5893c621f766Leon Scroggins String action = intent.getStringExtra(Intent.EXTRA_TEXT); 3732fde9746ac3055848e110c35f19ec5893c621f766Leon Scroggins if (BrowserSettings.PREF_CLEAR_HISTORY.equals(action)) { 3733fde9746ac3055848e110c35f19ec5893c621f766Leon Scroggins mTabControl.removeParentChildRelationShips(); 3734fde9746ac3055848e110c35f19ec5893c621f766Leon Scroggins } 3735fde9746ac3055848e110c35f19ec5893c621f766Leon Scroggins } 37360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 37378d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins // Choose a file from the file picker. 37388d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins case FILE_SELECTED: 37398d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins if (null == mUploadMessage) break; 37408d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins Uri result = intent == null || resultCode != RESULT_OK ? null 37418d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins : intent.getData(); 374262b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch 374362b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch // As we ask the camera to save the result of the user taking 374462b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch // a picture, the camera application does not return anything other 374562b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch // than RESULT_OK. So we need to check whether the file we expected 374662b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch // was written to disk in the in the case that we 374762b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch // did not get an intent returned but did get a RESULT_OK. If it was, 374862b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch // we assume that this result has came back from the camera. 374962b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch if (result == null && intent == null && resultCode == RESULT_OK) { 375062b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch File cameraFile = new File(mCameraFilePath); 375162b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch if (cameraFile.exists()) { 375262b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch result = Uri.fromFile(cameraFile); 375307d3473804cdfd646b39001ca80ebf530e8f8749Ben Murdoch // Broadcast to the media scanner that we have a new photo 375407d3473804cdfd646b39001ca80ebf530e8f8749Ben Murdoch // so it will be added into the gallery for the user. 375507d3473804cdfd646b39001ca80ebf530e8f8749Ben Murdoch sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, result)); 375662b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch } 375762b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch } 37588d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins mUploadMessage.onReceiveValue(result); 37598d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins mUploadMessage = null; 376062b1b7ef20a1c9f4c6e6f7b73140701b3c6193c5Ben Murdoch mCameraFilePath = null; 37618d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins break; 37620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project default: 37630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project break; 37640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3765304442375719effd41dbd53ae62de7a8d0cec7d9Leon Scroggins getTopWindow().requestFocus(); 37660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 37670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 37680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* 37690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * This method is called as a result of the user selecting the options 3770f08809b2cf7e502fef5965691a7fb6d7cf0322afLeon Scroggins * menu to see the download window. It shows the download window on top of 3771f08809b2cf7e502fef5965691a7fb6d7cf0322afLeon Scroggins * the current window. 37720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 3773a682a3ccac02db69bd8708258aae263be4b22e72Leon Scroggins III private void viewDownloads() { 3774a682a3ccac02db69bd8708258aae263be4b22e72Leon Scroggins III Intent intent = new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS); 3775a682a3ccac02db69bd8708258aae263be4b22e72Leon Scroggins III startActivity(intent); 37760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 37770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3778160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins /** 3779160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * Open the Go page. 3780160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * @param startWithHistory If true, open starting on the history tab. 3781160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins * Otherwise, start with the bookmarks tab. 3782160a7e7d27755b7a3715ad87735b8070ab64d58aLeon Scroggins */ 3783e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb /* package */ void bookmarksOrHistoryPicker(boolean startWithHistory) { 3784bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins if (mTabControl.getCurrentWebView() == null) { 37850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return; 37860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3787e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb Bundle extras = new Bundle(); 3788304442375719effd41dbd53ae62de7a8d0cec7d9Leon Scroggins // Disable opening in a new window if we have maxed out the windows 3789bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins extras.putBoolean(BrowserBookmarksPage.EXTRA_DISABLE_WINDOW, 3790bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins !mTabControl.canCreateNewTab()); 3791e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb 3792e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb mComboView = new CombinedBookmarkHistoryView(this, 3793e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb startWithHistory ? CombinedBookmarkHistoryView.FRAGMENT_ID_HISTORY 3794e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb : CombinedBookmarkHistoryView.FRAGMENT_ID_BOOKMARKS, 3795e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb extras); 3796e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb removeTabFromContentView(mTabControl.getCurrentTab()); 3797e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb mTitleBar.setVisibility(View.GONE); 3798e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb hideFakeTitleBar(); 3799e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb mContentView.addView(mComboView, COVER_SCREEN_PARAMS); 38000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Called when loading from context menu or LOAD_URL message 380392472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins private void loadUrlFromContext(WebView view, String url) { 38040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // In case the user enters nothing. 38050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (url != null && url.length() != 0 && view != null) { 38060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project url = smartUrlFilter(url); 380722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (!view.getWebViewClient().shouldOverrideUrlLoading(view, url)) { 380892472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins loadUrl(view, url); 38090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 381392472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins /** 381492472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * Load the URL into the given WebView and update the title bar 381592472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * to reflect the new load. Call this instead of WebView.loadUrl 381692472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * directly. 381792472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * @param view The WebView used to load url. 381892472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * @param url The URL to load. 381992472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins */ 382092472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins private void loadUrl(WebView view, String url) { 382192472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins updateTitleBarForNewLoad(view, url); 382292472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins view.loadUrl(url); 382392472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins } 382492472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins 382592472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins /** 382692472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * Load UrlData into a Tab and update the title bar to reflect the new 382792472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * load. Call this instead of UrlData.loadIn directly. 382892472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * @param t The Tab used to load. 382992472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * @param data The UrlData being loaded. 383092472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins */ 383192472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins private void loadUrlDataIn(Tab t, UrlData data) { 383292472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins updateTitleBarForNewLoad(t.getWebView(), data.mUrl); 383392472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins data.loadIn(t); 383492472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins } 383592472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins 383692472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins /** 383792472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * If the WebView is the top window, update the title bar to reflect 383892472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * loading the new URL. i.e. set its text, clear the favicon (which 383992472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * will be set once the page begins loading), and set the progress to 384092472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * INITIAL_PROGRESS to show that the page has begun to load. Called 384192472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * by loadUrl and loadUrlDataIn. 384292472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * @param view The WebView that is starting a load. 384392472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * @param url The URL that is being loaded. 384492472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins */ 384592472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins private void updateTitleBarForNewLoad(WebView view, String url) { 384692472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins if (view == getTopWindow()) { 384792472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins setUrlTitle(url, null); 384892472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins setFavicon(null); 384992472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins onProgressChanged(view, INITIAL_PROGRESS); 385092472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins } 385192472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins } 385292472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins 38530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String smartUrlFilter(Uri inUri) { 38540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (inUri != null) { 38550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return smartUrlFilter(inUri.toString()); 38560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return null; 38580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3860b34f87a2e13af13d697130482af01b537ab7c5fdFeng Qian protected static final Pattern ACCEPTED_URI_SCHEMA = Pattern.compile( 38610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "(?i)" + // switch on case insensitive matching 38620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "(" + // begin group for schema 38630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "(?:http|https|file):\\/\\/" + 386425ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima "|(?:inline|data|about|content|javascript):" + 38650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project ")" + 38660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project "(.*)" ); 38670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 38690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Attempts to determine whether user input is a URL or search 38700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * terms. Anything with a space is passed to search. 38710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 38720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Converts to lowercase any mistakenly uppercased schema (i.e., 38730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * "Http://" converts to "http://" 38740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 38750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * @return Original or modified URL 38760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 38770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 38780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String smartUrlFilter(String url) { 38790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String inUrl = url.trim(); 38810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean hasSpace = inUrl.indexOf(' ') != -1; 38820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 38830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Matcher matcher = ACCEPTED_URI_SCHEMA.matcher(inUrl); 38840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (matcher.matches()) { 38850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // force scheme to lowercase 38860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String scheme = matcher.group(1); 38870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String lcScheme = scheme.toLowerCase(); 38880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!lcScheme.equals(scheme)) { 3889123ecfb21e7ca670e3d04efe58780b3bac54a9a1Mitsuru Oshima inUrl = lcScheme + matcher.group(2); 3890123ecfb21e7ca670e3d04efe58780b3bac54a9a1Mitsuru Oshima } 3891123ecfb21e7ca670e3d04efe58780b3bac54a9a1Mitsuru Oshima if (hasSpace) { 3892123ecfb21e7ca670e3d04efe58780b3bac54a9a1Mitsuru Oshima inUrl = inUrl.replace(" ", "%20"); 38930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 38940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return inUrl; 38950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 3896956cf01ecde1442353a2af0bbce8779df6707b30Leon Scroggins if (!hasSpace) { 38975ee906c089567bca705e18561357510d7b55cb5aDan Egnor if (Patterns.WEB_URL.matcher(inUrl).matches()) { 38980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return URLUtil.guessUrl(inUrl); 38990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3902956cf01ecde1442353a2af0bbce8779df6707b30Leon Scroggins // FIXME: Is this the correct place to add to searches? 3903956cf01ecde1442353a2af0bbce8779df6707b30Leon Scroggins // what if someone else calls this function? 3904956cf01ecde1442353a2af0bbce8779df6707b30Leon Scroggins 39050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Browser.addSearchUrl(mResolver, inUrl); 390647fdfdb989ffb79590a39c40792be995de32e521Grace Kloba return URLUtil.composeSearchUrl(inUrl, QuickSearch_G, QUERY_PLACE_HOLDER); 39070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 39080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 3909bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch /* package */ void setShouldShowErrorConsole(boolean flag) { 3910bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch if (flag == mShouldShowErrorConsole) { 3911bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch // Nothing to do. 3912bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch return; 3913bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 3914a9e35b6e3101fafb07e6bb4282e7dfc4dcfdc193Leon Scroggins III Tab t = mTabControl.getCurrentTab(); 3915a9e35b6e3101fafb07e6bb4282e7dfc4dcfdc193Leon Scroggins III if (t == null) { 3916a9e35b6e3101fafb07e6bb4282e7dfc4dcfdc193Leon Scroggins III // There is no current tab so we cannot toggle the error console 3917a9e35b6e3101fafb07e6bb4282e7dfc4dcfdc193Leon Scroggins III return; 3918a9e35b6e3101fafb07e6bb4282e7dfc4dcfdc193Leon Scroggins III } 3919bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 3920bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch mShouldShowErrorConsole = flag; 3921bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 3922a9e35b6e3101fafb07e6bb4282e7dfc4dcfdc193Leon Scroggins III ErrorConsoleView errorConsole = t.getErrorConsole(true); 3923bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 3924bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch if (flag) { 3925bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch // Setting the show state of the console will cause it's the layout to be inflated. 3926bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch if (errorConsole.numberOfErrors() > 0) { 3927bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch errorConsole.showConsole(ErrorConsoleView.SHOW_MINIMIZED); 3928bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } else { 3929bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch errorConsole.showConsole(ErrorConsoleView.SHOW_NONE); 3930bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 3931bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 3932bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch // Now we can add it to the main view. 3933bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch mErrorConsoleContainer.addView(errorConsole, 393415b8ec6b226f4d57307716e1f495e10a91f8cbf4Romain Guy new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 3935bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch ViewGroup.LayoutParams.WRAP_CONTENT)); 3936bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } else { 3937bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch mErrorConsoleContainer.removeView(errorConsole); 3938bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 3939bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 3940bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch } 3941bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 394222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba boolean shouldShowErrorConsole() { 394322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba return mShouldShowErrorConsole; 394422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba } 394522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba 3946163ab74e2f85b53a1a374c49677073fb64d35f28Andrei Popescu private void setStatusBarVisibility(boolean visible) { 3947163ab74e2f85b53a1a374c49677073fb64d35f28Andrei Popescu int flag = visible ? 0 : WindowManager.LayoutParams.FLAG_FULLSCREEN; 3948163ab74e2f85b53a1a374c49677073fb64d35f28Andrei Popescu getWindow().setFlags(flag, WindowManager.LayoutParams.FLAG_FULLSCREEN); 3949163ab74e2f85b53a1a374c49677073fb64d35f28Andrei Popescu } 3950163ab74e2f85b53a1a374c49677073fb64d35f28Andrei Popescu 395156199cc25e7ee0455ec2a8099098b66b8554f677Andrei Popescu 395256199cc25e7ee0455ec2a8099098b66b8554f677Andrei Popescu private void sendNetworkType(String type, String subtype) { 395356199cc25e7ee0455ec2a8099098b66b8554f677Andrei Popescu WebView w = mTabControl.getCurrentWebView(); 395456199cc25e7ee0455ec2a8099098b66b8554f677Andrei Popescu if (w != null) { 395556199cc25e7ee0455ec2a8099098b66b8554f677Andrei Popescu w.setNetworkType(type, subtype); 395656199cc25e7ee0455ec2a8099098b66b8554f677Andrei Popescu } 395756199cc25e7ee0455ec2a8099098b66b8554f677Andrei Popescu } 395856199cc25e7ee0455ec2a8099098b66b8554f677Andrei Popescu 3959eb6eef4c45df2d65c3e70660493a147a2be405e3Grace Kloba final static int LOCK_ICON_UNSECURE = 0; 3960eb6eef4c45df2d65c3e70660493a147a2be405e3Grace Kloba final static int LOCK_ICON_SECURE = 1; 3961eb6eef4c45df2d65c3e70660493a147a2be405e3Grace Kloba final static int LOCK_ICON_MIXED = 2; 39620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private BrowserSettings mSettings; 39640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private TabControl mTabControl; 39650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private ContentResolver mResolver; 39660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private FrameLayout mContentView; 3967adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu private View mCustomView; 3968adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu private FrameLayout mCustomViewContainer; 3969c9b5556351b59caec77b4eec1ad30652fec6a4d9Andrei Popescu private WebChromeClient.CustomViewCallback mCustomViewCallback; 39700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // FIXME, temp address onPrepareMenu performance problem. When we move everything out of 39720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // view, we should rewrite this. 39730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private int mCurrentMenuState = 0; 39740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private int mMenuState = R.id.MAIN_MENU; 3975adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu private int mOldMenuState = EMPTY_MENU; 39760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static final int EMPTY_MENU = -1; 39770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Menu mMenu; 39780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Used to prevent chording to result in firing two shortcuts immediately 39800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // one after another. Fixes bug 1211714. 39810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean mCanChord; 39820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private boolean mInLoad; 39840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private boolean mIsNetworkUp; 3985b7cc8b439dc595dc48e1c2183b35d23ad72dfbe5Ben Murdoch private boolean mDidStopLoad; 39860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39871f10cbfca5bf96e1466e0ed3ce1dbcd6fcfd0608Cary Clark /* package */ boolean mActivityInPause = true; 39880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private boolean mMenuIsDown; 39900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static boolean mInTrace; 39920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 39930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // Performance probe 39940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private static final int[] SYSTEM_CPU_FORMAT = new int[] { 39950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_COMBINE, 39960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 1: user time 39970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 2: nice time 39980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 3: sys time 39990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 4: idle time 40000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 5: iowait time 40010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 6: irq time 40020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG // 7: softirq time 40030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 40040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mStart; 40060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mProcessStart; 40070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mUserStart; 40080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mSystemStart; 40090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mIdleStart; 40100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mIrqStart; 40110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private long mUiStart; 40130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Drawable mMixLockIcon; 40150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Drawable mSecLockIcon; 40160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /* hold a ref so we can auto-cancel if necessary */ 40180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private AlertDialog mAlertDialog; 40190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // The up-to-date URL and title (these can be different from those stored 40210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // in WebView, since it takes some time for the information in WebView to 40220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // get updated) 40230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String mUrl; 40240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String mTitle; 40250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // As PageInfo has different style for landscape / portrait, we have 40270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // to re-open it when configuration changed 40280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private AlertDialog mPageInfoDialog; 402922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba private Tab mPageInfoView; 40300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // If the Page-Info dialog is launched from the SSL-certificate-on-error 40310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // dialog, we should not just dismiss it, but should get back to the 40320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // SSL-certificate-on-error dialog. This flag is used to store this state 4033c7b92f811dfa3572578ddc6714c98a03936d9ce5Leon Scroggins private boolean mPageInfoFromShowSSLCertificateOnError; 40340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // as SSLCertificateOnError has different style for landscape / portrait, 40360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // we have to re-open it when configuration changed 40370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private AlertDialog mSSLCertificateOnErrorDialog; 40380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private WebView mSSLCertificateOnErrorView; 40390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private SslErrorHandler mSSLCertificateOnErrorHandler; 40400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private SslError mSSLCertificateOnErrorError; 40410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // as SSLCertificate has different style for landscape / portrait, we 40430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // have to re-open it when configuration changed 40440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private AlertDialog mSSLCertificateDialog; 404522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba private Tab mSSLCertificateView; 40460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // as HttpAuthentication has different style for landscape / portrait, we 40480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // have to re-open it when configuration changed 40492573892d6dbcda5519fcc8bd2876a27c4c9502b1Bjorn Bringert private HttpAuthenticationDialog mHttpAuthenticationDialog; 40500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /*package*/ static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS = 40520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project new FrameLayout.LayoutParams( 405315b8ec6b226f4d57307716e1f495e10a91f8cbf4Romain Guy ViewGroup.LayoutParams.MATCH_PARENT, 405415b8ec6b226f4d57307716e1f495e10a91f8cbf4Romain Guy ViewGroup.LayoutParams.MATCH_PARENT); 4055adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu /*package*/ static final FrameLayout.LayoutParams COVER_SCREEN_GRAVITY_CENTER = 4056adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu new FrameLayout.LayoutParams( 405715b8ec6b226f4d57307716e1f495e10a91f8cbf4Romain Guy ViewGroup.LayoutParams.MATCH_PARENT, 405815b8ec6b226f4d57307716e1f495e10a91f8cbf4Romain Guy ViewGroup.LayoutParams.MATCH_PARENT, 4059adc008d2d87676a2a32e93afba20156a2bf2355bAndrei Popescu Gravity.CENTER); 406047fdfdb989ffb79590a39c40792be995de32e521Grace Kloba // Google search 406147fdfdb989ffb79590a39c40792be995de32e521Grace Kloba final static String QuickSearch_G = "http://www.google.com/m?q=%s"; 40620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String QUERY_PLACE_HOLDER = "%s"; 40640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "source" parameter for Google search through search key 40660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String GOOGLE_SEARCH_SOURCE_SEARCHKEY = "browser-key"; 40670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "source" parameter for Google search through goto menu 40680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String GOOGLE_SEARCH_SOURCE_GOTO = "browser-goto"; 40690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "source" parameter for Google search through simplily type 40700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String GOOGLE_SEARCH_SOURCE_TYPE = "browser-type"; 40710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "source" parameter for Google search suggested by the browser 40720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String GOOGLE_SEARCH_SOURCE_SUGGEST = "browser-suggest"; 40730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // "source" parameter for Google search from unknown source 40740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static String GOOGLE_SEARCH_SOURCE_UNKNOWN = "unknown"; 40750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final static String LOGTAG = "browser"; 40770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private String mLastEnteredUrl; 40790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private PowerManager.WakeLock mWakeLock; 40810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final static int WAKELOCK_TIMEOUT = 5 * 60 * 1000; // 5 minutes 40820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Toast mStopToast; 40840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 4085571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins private TitleBarBase mTitleBar; 4086a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb private TabBar mTabBar; 408781db366d79bb317de62fed05eb58906abd88a75eLeon Scroggins 4088bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch private LinearLayout mErrorConsoleContainer = null; 4089bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch private boolean mShouldShowErrorConsole = false; 4090bff2d603c022691237c31d9a57ad8c217c6e7e11Ben Murdoch 40910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // As the ids are dynamically created, we can't guarantee that they will 40920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // be in sequence, so this static array maps ids to a window number. 40930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project final static private int[] WINDOW_SHORTCUT_ID_ARRAY = 40940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project { R.id.window_one_menu_id, R.id.window_two_menu_id, R.id.window_three_menu_id, 40950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.id.window_four_menu_id, R.id.window_five_menu_id, R.id.window_six_menu_id, 40960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project R.id.window_seven_menu_id, R.id.window_eight_menu_id }; 40970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 40980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // monitor platform changes 40990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private IntentFilter mNetworkStateChangedFilter; 41000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private BroadcastReceiver mNetworkStateIntentReceiver; 41010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 4102a7611811e0d744a7220b7bf80c8f795af5ea53edBjorn Bringert private SystemAllowGeolocationOrigins mSystemAllowGeolocationOrigins; 4103a7611811e0d744a7220b7bf80c8f795af5ea53edBjorn Bringert 41040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project // activity requestCode 410578a98e459323f938e97789a6131beddbebb459ceNicolas Roard final static int PREFERENCES_PAGE = 3; 41068d5fa439c93c336197cfca4a0bfca7147e43353dLeon Scroggins final static int FILE_SELECTED = 4; 41070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 4108540035dfd1347c78eeec10ec0847e18fcc50ef36Andrei Popescu // the default <video> poster 4109540035dfd1347c78eeec10ec0847e18fcc50ef36Andrei Popescu private Bitmap mDefaultVideoPoster; 4110540035dfd1347c78eeec10ec0847e18fcc50ef36Andrei Popescu // the video progress view 4111540035dfd1347c78eeec10ec0847e18fcc50ef36Andrei Popescu private View mVideoProgressView; 4112540035dfd1347c78eeec10ec0847e18fcc50ef36Andrei Popescu 411325ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima /** 411425ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima * A UrlData class to abstract how the content will be set to WebView. 411525ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima * This base class uses loadUrl to show the content. 411625ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima */ 41176eac63e78d43d04e31c4d16830c44c4d9df82639Leon Scroggins /* package */ static class UrlData { 4118068e48b469f5abca53ee3da38f933cf2c25c93b8Grace Kloba final String mUrl; 4119068e48b469f5abca53ee3da38f933cf2c25c93b8Grace Kloba final Map<String, String> mHeaders; 412058d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins final Intent mVoiceIntent; 412160e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba 412225ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima UrlData(String url) { 412325ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima this.mUrl = url; 4124068e48b469f5abca53ee3da38f933cf2c25c93b8Grace Kloba this.mHeaders = null; 412558d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins this.mVoiceIntent = null; 412625ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima } 412760e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba 412858d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins UrlData(String url, Map<String, String> headers, Intent intent) { 4129068e48b469f5abca53ee3da38f933cf2c25c93b8Grace Kloba this.mUrl = url; 4130068e48b469f5abca53ee3da38f933cf2c25c93b8Grace Kloba this.mHeaders = headers; 4131a1cc3fdce19a336c251297c61cd83ac6cf767cd1Leon Scroggins if (RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS 4132a1cc3fdce19a336c251297c61cd83ac6cf767cd1Leon Scroggins .equals(intent.getAction())) { 413358d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins this.mVoiceIntent = intent; 413458d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins } else { 413558d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins this.mVoiceIntent = null; 413658d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins } 413760e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba } 413860e095c190496d42327f8ec2ef990c044d15a76fGrace Kloba 413925ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima boolean isEmpty() { 414058d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins return mVoiceIntent == null && (mUrl == null || mUrl.length() == 0); 414125ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima } 414225ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima 414392472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins /** 414492472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * Load this UrlData into the given Tab. Use loadUrlDataIn to update 414592472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins * the title bar as well. 414692472e83d198d741f0d242ea87ebb57395505cadLeon Scroggins */ 414758d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins public void loadIn(Tab t) { 414858d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins if (mVoiceIntent != null) { 414958d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins t.activateVoiceSearchMode(mVoiceIntent); 415058d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins } else { 415158d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins t.getWebView().loadUrl(mUrl, mHeaders); 415258d56c6b5052faa86083965132cd51b1a9594d0eLeon Scroggins } 415325ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima } 415425ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima }; 415525ad8ab821d67293a5f53e8d341492be06e187eeMitsuru Oshima 41561f005d370557b6e69d2de6537e5ea21f73a7ec3fLeon Scroggins /* package */ static final UrlData EMPTY_URL_DATA = new UrlData(null); 41570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project} 4158