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