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