BaseUi.java revision d1e2ccc38a2d5318a4ab06b2349cb43303fd6ceb
18233facddcc51865d612a919d450db6954aa48e3Michael Kolb/*
28233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Copyright (C) 2010 The Android Open Source Project
38233facddcc51865d612a919d450db6954aa48e3Michael Kolb *
48233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Licensed under the Apache License, Version 2.0 (the "License");
58233facddcc51865d612a919d450db6954aa48e3Michael Kolb * you may not use this file except in compliance with the License.
68233facddcc51865d612a919d450db6954aa48e3Michael Kolb * You may obtain a copy of the License at
78233facddcc51865d612a919d450db6954aa48e3Michael Kolb *
88233facddcc51865d612a919d450db6954aa48e3Michael Kolb *      http://www.apache.org/licenses/LICENSE-2.0
98233facddcc51865d612a919d450db6954aa48e3Michael Kolb *
108233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Unless required by applicable law or agreed to in writing, software
118233facddcc51865d612a919d450db6954aa48e3Michael Kolb * distributed under the License is distributed on an "AS IS" BASIS,
128233facddcc51865d612a919d450db6954aa48e3Michael Kolb * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138233facddcc51865d612a919d450db6954aa48e3Michael Kolb * See the License for the specific language governing permissions and
148233facddcc51865d612a919d450db6954aa48e3Michael Kolb * limitations under the License.
158233facddcc51865d612a919d450db6954aa48e3Michael Kolb */
168233facddcc51865d612a919d450db6954aa48e3Michael Kolb
178233facddcc51865d612a919d450db6954aa48e3Michael Kolbpackage com.android.browser;
188233facddcc51865d612a919d450db6954aa48e3Michael Kolb
1930c714c853a4239e72ab1e238ce2a92472d06ab0John Reckimport com.android.browser.Tab.LockIcon;
2030c714c853a4239e72ab1e238ce2a92472d06ab0John Reck
218233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.app.Activity;
228233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.content.res.Configuration;
238233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.content.res.Resources;
248233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.graphics.Bitmap;
258233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.graphics.BitmapFactory;
268233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.graphics.drawable.Drawable;
278233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.os.Bundle;
288233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.text.TextUtils;
298233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.util.Log;
308233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.view.Gravity;
318233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.view.LayoutInflater;
328233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.view.Menu;
338233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.view.View;
341514bb7ed5656316a8dac966cee21653f3c59affMichael Kolbimport android.view.View.OnClickListener;
358233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.view.ViewGroup;
361514bb7ed5656316a8dac966cee21653f3c59affMichael Kolbimport android.view.ViewGroup.LayoutParams;
378233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.view.WindowManager;
383a696280cba53eea153c9d5707b236997d193328Michael Kolbimport android.view.inputmethod.InputMethodManager;
398233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.webkit.WebChromeClient;
408233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.webkit.WebView;
418233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.widget.FrameLayout;
421514bb7ed5656316a8dac966cee21653f3c59affMichael Kolbimport android.widget.ImageButton;
438233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.widget.LinearLayout;
448233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.widget.Toast;
458233facddcc51865d612a919d450db6954aa48e3Michael Kolb
461bf231334fd4bda8dbde5b9a0345c756a213b3a2Michael Kolbimport java.util.List;
471bf231334fd4bda8dbde5b9a0345c756a213b3a2Michael Kolb
488233facddcc51865d612a919d450db6954aa48e3Michael Kolb/**
498233facddcc51865d612a919d450db6954aa48e3Michael Kolb * UI interface definitions
508233facddcc51865d612a919d450db6954aa48e3Michael Kolb */
516670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolbpublic abstract class BaseUi implements UI, WebViewFactory {
528233facddcc51865d612a919d450db6954aa48e3Michael Kolb
538233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private static final String LOGTAG = "BaseUi";
548233facddcc51865d612a919d450db6954aa48e3Michael Kolb
556670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    protected static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS =
568233facddcc51865d612a919d450db6954aa48e3Michael Kolb        new FrameLayout.LayoutParams(
578233facddcc51865d612a919d450db6954aa48e3Michael Kolb        ViewGroup.LayoutParams.MATCH_PARENT,
588233facddcc51865d612a919d450db6954aa48e3Michael Kolb        ViewGroup.LayoutParams.MATCH_PARENT);
598233facddcc51865d612a919d450db6954aa48e3Michael Kolb
606670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    protected static final FrameLayout.LayoutParams COVER_SCREEN_GRAVITY_CENTER =
618233facddcc51865d612a919d450db6954aa48e3Michael Kolb        new FrameLayout.LayoutParams(
628233facddcc51865d612a919d450db6954aa48e3Michael Kolb        ViewGroup.LayoutParams.MATCH_PARENT,
638233facddcc51865d612a919d450db6954aa48e3Michael Kolb        ViewGroup.LayoutParams.MATCH_PARENT,
648233facddcc51865d612a919d450db6954aa48e3Michael Kolb        Gravity.CENTER);
658233facddcc51865d612a919d450db6954aa48e3Michael Kolb
668233facddcc51865d612a919d450db6954aa48e3Michael Kolb    Activity mActivity;
678233facddcc51865d612a919d450db6954aa48e3Michael Kolb    UiController mUiController;
688233facddcc51865d612a919d450db6954aa48e3Michael Kolb    TabControl mTabControl;
6977df4568331d527f993f4d69168218ddf5acdddaMichael Kolb    private Tab mActiveTab;
703a696280cba53eea153c9d5707b236997d193328Michael Kolb    private InputMethodManager mInputManager;
718233facddcc51865d612a919d450db6954aa48e3Michael Kolb
728233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private Drawable mSecLockIcon;
738233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private Drawable mMixLockIcon;
748233facddcc51865d612a919d450db6954aa48e3Michael Kolb
758233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private FrameLayout mBrowserFrameLayout;
766670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    protected FrameLayout mContentView;
778233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private FrameLayout mCustomViewContainer;
788233facddcc51865d612a919d450db6954aa48e3Michael Kolb
798233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private View mCustomView;
808233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private WebChromeClient.CustomViewCallback mCustomViewCallback;
818233facddcc51865d612a919d450db6954aa48e3Michael Kolb
828233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private CombinedBookmarkHistoryView mComboView;
838233facddcc51865d612a919d450db6954aa48e3Michael Kolb
848233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private LinearLayout mErrorConsoleContainer = null;
858233facddcc51865d612a919d450db6954aa48e3Michael Kolb
868233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private Toast mStopToast;
878233facddcc51865d612a919d450db6954aa48e3Michael Kolb
888233facddcc51865d612a919d450db6954aa48e3Michael Kolb    // the default <video> poster
898233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private Bitmap mDefaultVideoPoster;
908233facddcc51865d612a919d450db6954aa48e3Michael Kolb    // the video progress view
918233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private View mVideoProgressView;
928233facddcc51865d612a919d450db6954aa48e3Michael Kolb
938233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private boolean mActivityPaused;
948233facddcc51865d612a919d450db6954aa48e3Michael Kolb
958233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public BaseUi(Activity browser, UiController controller) {
968233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mActivity = browser;
978233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mUiController = controller;
988233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mTabControl = controller.getTabControl();
998233facddcc51865d612a919d450db6954aa48e3Michael Kolb        Resources res = mActivity.getResources();
1003a696280cba53eea153c9d5707b236997d193328Michael Kolb        mInputManager = (InputMethodManager)
1013a696280cba53eea153c9d5707b236997d193328Michael Kolb                browser.getSystemService(Activity.INPUT_METHOD_SERVICE);
1025a72f1858c2f73be3558c6cdaa2c84b4c36fa748Michael Kolb        mSecLockIcon = res.getDrawable(R.drawable.ic_secure_holo_dark);
1038233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mMixLockIcon = res.getDrawable(R.drawable.ic_partial_secure);
1048233facddcc51865d612a919d450db6954aa48e3Michael Kolb
1058233facddcc51865d612a919d450db6954aa48e3Michael Kolb        FrameLayout frameLayout = (FrameLayout) mActivity.getWindow()
1068233facddcc51865d612a919d450db6954aa48e3Michael Kolb                .getDecorView().findViewById(android.R.id.content);
1078233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mBrowserFrameLayout = (FrameLayout) LayoutInflater.from(mActivity)
1088233facddcc51865d612a919d450db6954aa48e3Michael Kolb                .inflate(R.layout.custom_screen, null);
1098233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mContentView = (FrameLayout) mBrowserFrameLayout.findViewById(
1108233facddcc51865d612a919d450db6954aa48e3Michael Kolb                R.id.main_content);
1118233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mErrorConsoleContainer = (LinearLayout) mBrowserFrameLayout
1128233facddcc51865d612a919d450db6954aa48e3Michael Kolb                .findViewById(R.id.error_console);
1138233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mCustomViewContainer = (FrameLayout) mBrowserFrameLayout
1148233facddcc51865d612a919d450db6954aa48e3Michael Kolb                .findViewById(R.id.fullscreen_custom_content);
1158233facddcc51865d612a919d450db6954aa48e3Michael Kolb        frameLayout.addView(mBrowserFrameLayout, COVER_SCREEN_PARAMS);
1168233facddcc51865d612a919d450db6954aa48e3Michael Kolb
1178233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
1188233facddcc51865d612a919d450db6954aa48e3Michael Kolb
1196670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    /**
1206670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb     * common webview initialization
1216670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb     * @param w the webview to initialize
1226670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb     */
1236670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    protected void initWebViewSettings(WebView w) {
1248233facddcc51865d612a919d450db6954aa48e3Michael Kolb        w.setScrollbarFadingEnabled(true);
1258233facddcc51865d612a919d450db6954aa48e3Michael Kolb        w.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
1268233facddcc51865d612a919d450db6954aa48e3Michael Kolb        w.setMapTrackballToArrowKeys(false); // use trackball directly
1278233facddcc51865d612a919d450db6954aa48e3Michael Kolb        // Enable the built-in zoom
1288233facddcc51865d612a919d450db6954aa48e3Michael Kolb        w.getSettings().setBuiltInZoomControls(true);
1298233facddcc51865d612a919d450db6954aa48e3Michael Kolb
1308233facddcc51865d612a919d450db6954aa48e3Michael Kolb        // Add this WebView to the settings observer list and update the
1318233facddcc51865d612a919d450db6954aa48e3Michael Kolb        // settings
1328233facddcc51865d612a919d450db6954aa48e3Michael Kolb        final BrowserSettings s = BrowserSettings.getInstance();
1338233facddcc51865d612a919d450db6954aa48e3Michael Kolb        s.addObserver(w.getSettings()).update(s, null);
1348233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
1358233facddcc51865d612a919d450db6954aa48e3Michael Kolb
1368233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private void cancelStopToast() {
1378233facddcc51865d612a919d450db6954aa48e3Michael Kolb        if (mStopToast != null) {
1388233facddcc51865d612a919d450db6954aa48e3Michael Kolb            mStopToast.cancel();
1398233facddcc51865d612a919d450db6954aa48e3Michael Kolb            mStopToast = null;
1408233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
1418233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
1428233facddcc51865d612a919d450db6954aa48e3Michael Kolb
1438233facddcc51865d612a919d450db6954aa48e3Michael Kolb    // lifecycle
1448233facddcc51865d612a919d450db6954aa48e3Michael Kolb
1458233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public void onPause() {
1467a5cf4714453bd982afc662f373d0c38cddfb023Michael Kolb        if (isCustomViewShowing()) {
1477a5cf4714453bd982afc662f373d0c38cddfb023Michael Kolb            onHideCustomView();
1487a5cf4714453bd982afc662f373d0c38cddfb023Michael Kolb        }
1498233facddcc51865d612a919d450db6954aa48e3Michael Kolb        cancelStopToast();
1508233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mActivityPaused = true;
1518233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
1528233facddcc51865d612a919d450db6954aa48e3Michael Kolb
1538233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public void onResume() {
1548233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mActivityPaused = false;
1558233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
1568233facddcc51865d612a919d450db6954aa48e3Michael Kolb
1576670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    protected boolean isActivityPaused() {
1586670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        return mActivityPaused;
1598233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
1608233facddcc51865d612a919d450db6954aa48e3Michael Kolb
1618233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public void onConfigurationChanged(Configuration config) {
1628233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
1638233facddcc51865d612a919d450db6954aa48e3Michael Kolb
1648233facddcc51865d612a919d450db6954aa48e3Michael Kolb    // key handling
1658233facddcc51865d612a919d450db6954aa48e3Michael Kolb
1668233facddcc51865d612a919d450db6954aa48e3Michael Kolb    @Override
1678233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public boolean onBackKey() {
1688233facddcc51865d612a919d450db6954aa48e3Michael Kolb        if (mComboView != null) {
1698233facddcc51865d612a919d450db6954aa48e3Michael Kolb            if (!mComboView.onBackPressed()) {
1708233facddcc51865d612a919d450db6954aa48e3Michael Kolb                mUiController.removeComboView();
1718233facddcc51865d612a919d450db6954aa48e3Michael Kolb            }
1728233facddcc51865d612a919d450db6954aa48e3Michael Kolb            return true;
1738233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
1748233facddcc51865d612a919d450db6954aa48e3Michael Kolb        if (mCustomView != null) {
1758233facddcc51865d612a919d450db6954aa48e3Michael Kolb            mUiController.hideCustomView();
1768233facddcc51865d612a919d450db6954aa48e3Michael Kolb            return true;
1778233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
1788233facddcc51865d612a919d450db6954aa48e3Michael Kolb        return false;
1798233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
1808233facddcc51865d612a919d450db6954aa48e3Michael Kolb
18130c714c853a4239e72ab1e238ce2a92472d06ab0John Reck    // Tab callbacks
1828233facddcc51865d612a919d450db6954aa48e3Michael Kolb    @Override
18330c714c853a4239e72ab1e238ce2a92472d06ab0John Reck    public void onTabDataChanged(Tab tab) {
18430c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        setUrlTitle(tab);
18530c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        setFavicon(tab);
18630c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        updateLockIconToLatest(tab);
1875a72f1858c2f73be3558c6cdaa2c84b4c36fa748Michael Kolb        updateNavigationState(tab);
1888233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
1898233facddcc51865d612a919d450db6954aa48e3Michael Kolb
1908233facddcc51865d612a919d450db6954aa48e3Michael Kolb    @Override
1914cd97793901e8f5681cf642d0b2684697964a37aLeon Scroggins    public void bookmarkedStatusHasChanged(Tab tab) {
1926670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        // no op in base case
1934cd97793901e8f5681cf642d0b2684697964a37aLeon Scroggins    }
1944cd97793901e8f5681cf642d0b2684697964a37aLeon Scroggins
1954cd97793901e8f5681cf642d0b2684697964a37aLeon Scroggins    @Override
1968233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public void onPageStopped(Tab tab) {
1978233facddcc51865d612a919d450db6954aa48e3Michael Kolb        cancelStopToast();
1988233facddcc51865d612a919d450db6954aa48e3Michael Kolb        if (tab.inForeground()) {
1998233facddcc51865d612a919d450db6954aa48e3Michael Kolb            mStopToast = Toast
2008233facddcc51865d612a919d450db6954aa48e3Michael Kolb                    .makeText(mActivity, R.string.stopping, Toast.LENGTH_SHORT);
2018233facddcc51865d612a919d450db6954aa48e3Michael Kolb            mStopToast.show();
2028233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
2038233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
2048233facddcc51865d612a919d450db6954aa48e3Michael Kolb
2058233facddcc51865d612a919d450db6954aa48e3Michael Kolb    @Override
2061bf231334fd4bda8dbde5b9a0345c756a213b3a2Michael Kolb    public boolean needsRestoreAllTabs() {
2076670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        return false;
2081bf231334fd4bda8dbde5b9a0345c756a213b3a2Michael Kolb    }
2091bf231334fd4bda8dbde5b9a0345c756a213b3a2Michael Kolb
2101bf231334fd4bda8dbde5b9a0345c756a213b3a2Michael Kolb    @Override
2118233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public void addTab(Tab tab) {
2128233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
2138233facddcc51865d612a919d450db6954aa48e3Michael Kolb
2148233facddcc51865d612a919d450db6954aa48e3Michael Kolb    @Override
2158233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public void setActiveTab(Tab tab) {
21677df4568331d527f993f4d69168218ddf5acdddaMichael Kolb        if ((tab != mActiveTab) && (mActiveTab != null)) {
21777df4568331d527f993f4d69168218ddf5acdddaMichael Kolb            removeTabFromContentView(mActiveTab);
2188233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
21977df4568331d527f993f4d69168218ddf5acdddaMichael Kolb        mActiveTab = tab;
2208233facddcc51865d612a919d450db6954aa48e3Michael Kolb        attachTabToContentView(tab);
2218233facddcc51865d612a919d450db6954aa48e3Michael Kolb        setShouldShowErrorConsole(tab, mUiController.shouldShowErrorConsole());
22230c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        onTabDataChanged(tab);
22330c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        onProgressChanged(tab);
224117f07d08e3e25e3c920a1dabe31dcd7643bacb2John Reck        boolean incognito = mActiveTab.getWebView().isPrivateBrowsingEnabled();
225117f07d08e3e25e3c920a1dabe31dcd7643bacb2John Reck        getEmbeddedTitleBar().setIncognitoMode(incognito);
226117f07d08e3e25e3c920a1dabe31dcd7643bacb2John Reck        getFakeTitleBar().setIncognitoMode(incognito);
2278233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
2288233facddcc51865d612a919d450db6954aa48e3Michael Kolb
229cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb    Tab getActiveTab() {
230cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        return mActiveTab;
231cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb    }
232cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb
2338233facddcc51865d612a919d450db6954aa48e3Michael Kolb    @Override
2341bf231334fd4bda8dbde5b9a0345c756a213b3a2Michael Kolb    public void updateTabs(List<Tab> tabs) {
2351bf231334fd4bda8dbde5b9a0345c756a213b3a2Michael Kolb    }
2361bf231334fd4bda8dbde5b9a0345c756a213b3a2Michael Kolb
2371bf231334fd4bda8dbde5b9a0345c756a213b3a2Michael Kolb    @Override
2388233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public void removeTab(Tab tab) {
23977df4568331d527f993f4d69168218ddf5acdddaMichael Kolb        if (mActiveTab == tab) {
2408233facddcc51865d612a919d450db6954aa48e3Michael Kolb            removeTabFromContentView(tab);
24177df4568331d527f993f4d69168218ddf5acdddaMichael Kolb            mActiveTab = null;
2428233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
2438233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
2448233facddcc51865d612a919d450db6954aa48e3Michael Kolb
2458233facddcc51865d612a919d450db6954aa48e3Michael Kolb    @Override
2468233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public void detachTab(Tab tab) {
2478233facddcc51865d612a919d450db6954aa48e3Michael Kolb        removeTabFromContentView(tab);
2488233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
2498233facddcc51865d612a919d450db6954aa48e3Michael Kolb
2508233facddcc51865d612a919d450db6954aa48e3Michael Kolb    @Override
2518233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public void attachTab(Tab tab) {
2528233facddcc51865d612a919d450db6954aa48e3Michael Kolb        attachTabToContentView(tab);
2538233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
2548233facddcc51865d612a919d450db6954aa48e3Michael Kolb
2558233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private void attachTabToContentView(Tab tab) {
256d1e2ccc38a2d5318a4ab06b2349cb43303fd6cebMichael Kolb        if ((tab == null) || (tab.getWebView() == null)) {
2578233facddcc51865d612a919d450db6954aa48e3Michael Kolb            return;
2588233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
2598233facddcc51865d612a919d450db6954aa48e3Michael Kolb        View container = tab.getViewContainer();
2608233facddcc51865d612a919d450db6954aa48e3Michael Kolb        WebView mainView  = tab.getWebView();
2618233facddcc51865d612a919d450db6954aa48e3Michael Kolb        // Attach the WebView to the container and then attach the
2628233facddcc51865d612a919d450db6954aa48e3Michael Kolb        // container to the content view.
2638233facddcc51865d612a919d450db6954aa48e3Michael Kolb        FrameLayout wrapper =
2648233facddcc51865d612a919d450db6954aa48e3Michael Kolb                (FrameLayout) container.findViewById(R.id.webview_wrapper);
2658233facddcc51865d612a919d450db6954aa48e3Michael Kolb        ViewGroup parent = (ViewGroup) mainView.getParent();
2668233facddcc51865d612a919d450db6954aa48e3Michael Kolb        if (parent != wrapper) {
2678233facddcc51865d612a919d450db6954aa48e3Michael Kolb            if (parent != null) {
2688233facddcc51865d612a919d450db6954aa48e3Michael Kolb                Log.w(LOGTAG, "mMainView already has a parent in"
2698233facddcc51865d612a919d450db6954aa48e3Michael Kolb                        + " attachTabToContentView!");
2708233facddcc51865d612a919d450db6954aa48e3Michael Kolb                parent.removeView(mainView);
2718233facddcc51865d612a919d450db6954aa48e3Michael Kolb            }
2728233facddcc51865d612a919d450db6954aa48e3Michael Kolb            wrapper.addView(mainView);
2738233facddcc51865d612a919d450db6954aa48e3Michael Kolb        } else {
2748233facddcc51865d612a919d450db6954aa48e3Michael Kolb            Log.w(LOGTAG, "mMainView is already attached to wrapper in"
2758233facddcc51865d612a919d450db6954aa48e3Michael Kolb                    + " attachTabToContentView!");
2768233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
2778233facddcc51865d612a919d450db6954aa48e3Michael Kolb        parent = (ViewGroup) container.getParent();
2788233facddcc51865d612a919d450db6954aa48e3Michael Kolb        if (parent != mContentView) {
2798233facddcc51865d612a919d450db6954aa48e3Michael Kolb            if (parent != null) {
2808233facddcc51865d612a919d450db6954aa48e3Michael Kolb                Log.w(LOGTAG, "mContainer already has a parent in"
2818233facddcc51865d612a919d450db6954aa48e3Michael Kolb                        + " attachTabToContentView!");
2828233facddcc51865d612a919d450db6954aa48e3Michael Kolb                parent.removeView(container);
2838233facddcc51865d612a919d450db6954aa48e3Michael Kolb            }
2848233facddcc51865d612a919d450db6954aa48e3Michael Kolb            mContentView.addView(container, COVER_SCREEN_PARAMS);
2858233facddcc51865d612a919d450db6954aa48e3Michael Kolb        } else {
2868233facddcc51865d612a919d450db6954aa48e3Michael Kolb            Log.w(LOGTAG, "mContainer is already attached to content in"
2878233facddcc51865d612a919d450db6954aa48e3Michael Kolb                    + " attachTabToContentView!");
2888233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
2898233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mUiController.attachSubWindow(tab);
2908233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
2918233facddcc51865d612a919d450db6954aa48e3Michael Kolb
2928233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private void removeTabFromContentView(Tab tab) {
2938233facddcc51865d612a919d450db6954aa48e3Michael Kolb        // Remove the container that contains the main WebView.
2948233facddcc51865d612a919d450db6954aa48e3Michael Kolb        WebView mainView = tab.getWebView();
2958233facddcc51865d612a919d450db6954aa48e3Michael Kolb        View container = tab.getViewContainer();
2968233facddcc51865d612a919d450db6954aa48e3Michael Kolb        if (mainView == null) {
2978233facddcc51865d612a919d450db6954aa48e3Michael Kolb            return;
2988233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
2998233facddcc51865d612a919d450db6954aa48e3Michael Kolb        // Remove the container from the content and then remove the
3008233facddcc51865d612a919d450db6954aa48e3Michael Kolb        // WebView from the container. This will trigger a focus change
3018233facddcc51865d612a919d450db6954aa48e3Michael Kolb        // needed by WebView.
3028233facddcc51865d612a919d450db6954aa48e3Michael Kolb        FrameLayout wrapper =
3038233facddcc51865d612a919d450db6954aa48e3Michael Kolb                (FrameLayout) container.findViewById(R.id.webview_wrapper);
3048233facddcc51865d612a919d450db6954aa48e3Michael Kolb        wrapper.removeView(mainView);
3058233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mContentView.removeView(container);
3068233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mUiController.endActionMode();
3078233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mUiController.removeSubWindow(tab);
3088233facddcc51865d612a919d450db6954aa48e3Michael Kolb        ErrorConsoleView errorConsole = tab.getErrorConsole(false);
3098233facddcc51865d612a919d450db6954aa48e3Michael Kolb        if (errorConsole != null) {
3108233facddcc51865d612a919d450db6954aa48e3Michael Kolb            mErrorConsoleContainer.removeView(errorConsole);
3118233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
3128233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mainView.setEmbeddedTitleBar(null);
3138233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
3148233facddcc51865d612a919d450db6954aa48e3Michael Kolb
315a713ec8cc9da6c0c8078cd297c6240eb8bf01bbbMichael Kolb    @Override
316a713ec8cc9da6c0c8078cd297c6240eb8bf01bbbMichael Kolb    public void onSetWebView(Tab tab, WebView webView) {
317a713ec8cc9da6c0c8078cd297c6240eb8bf01bbbMichael Kolb        View container = tab.getViewContainer();
318a713ec8cc9da6c0c8078cd297c6240eb8bf01bbbMichael Kolb        if (container == null) {
319a713ec8cc9da6c0c8078cd297c6240eb8bf01bbbMichael Kolb            // The tab consists of a container view, which contains the main
320a713ec8cc9da6c0c8078cd297c6240eb8bf01bbbMichael Kolb            // WebView, as well as any other UI elements associated with the tab.
321a713ec8cc9da6c0c8078cd297c6240eb8bf01bbbMichael Kolb            container = mActivity.getLayoutInflater().inflate(R.layout.tab,
322a713ec8cc9da6c0c8078cd297c6240eb8bf01bbbMichael Kolb                    null);
323a713ec8cc9da6c0c8078cd297c6240eb8bf01bbbMichael Kolb            tab.setViewContainer(container);
324a713ec8cc9da6c0c8078cd297c6240eb8bf01bbbMichael Kolb        }
325a713ec8cc9da6c0c8078cd297c6240eb8bf01bbbMichael Kolb        if (tab.getWebView() != webView) {
326a713ec8cc9da6c0c8078cd297c6240eb8bf01bbbMichael Kolb            // Just remove the old one.
327a713ec8cc9da6c0c8078cd297c6240eb8bf01bbbMichael Kolb            FrameLayout wrapper =
328a713ec8cc9da6c0c8078cd297c6240eb8bf01bbbMichael Kolb                    (FrameLayout) container.findViewById(R.id.webview_wrapper);
329a713ec8cc9da6c0c8078cd297c6240eb8bf01bbbMichael Kolb            wrapper.removeView(tab.getWebView());
330a713ec8cc9da6c0c8078cd297c6240eb8bf01bbbMichael Kolb        }
331a713ec8cc9da6c0c8078cd297c6240eb8bf01bbbMichael Kolb    }
332a713ec8cc9da6c0c8078cd297c6240eb8bf01bbbMichael Kolb
3338233facddcc51865d612a919d450db6954aa48e3Michael Kolb    /**
3341514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb     * create a sub window container and webview for the tab
3351514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb     * Note: this methods operates through side-effects for now
3361514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb     * it sets both the subView and subViewContainer for the given tab
3371514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb     * @param tab tab to create the sub window for
3381514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb     * @param subView webview to be set as a subwindow for the tab
3391514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb     */
3401514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb    @Override
3411514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb    public void createSubWindow(Tab tab, WebView subView) {
3421514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb        View subViewContainer = mActivity.getLayoutInflater().inflate(
3431514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb                R.layout.browser_subwindow, null);
3441514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb        ViewGroup inner = (ViewGroup) subViewContainer
3451514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb                .findViewById(R.id.inner_container);
3461514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb        inner.addView(subView, new LayoutParams(LayoutParams.MATCH_PARENT,
3471514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb                LayoutParams.MATCH_PARENT));
3481514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb        final ImageButton cancel = (ImageButton) subViewContainer
3491514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb                .findViewById(R.id.subwindow_close);
3501514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb        final WebView cancelSubView = subView;
3511514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb        cancel.setOnClickListener(new OnClickListener() {
3521514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb            public void onClick(View v) {
3531514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb                cancelSubView.getWebChromeClient().onCloseWindow(cancelSubView);
3541514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb            }
3551514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb        });
3561514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb        tab.setSubWebView(subView);
3571514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb        tab.setSubViewContainer(subViewContainer);
3581514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb    }
3591514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb
3601514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb    /**
3618233facddcc51865d612a919d450db6954aa48e3Michael Kolb     * Remove the sub window from the content view.
3628233facddcc51865d612a919d450db6954aa48e3Michael Kolb     */
3638233facddcc51865d612a919d450db6954aa48e3Michael Kolb    @Override
3648233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public void removeSubWindow(View subviewContainer) {
3658233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mContentView.removeView(subviewContainer);
3668233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mUiController.endActionMode();
3678233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
3688233facddcc51865d612a919d450db6954aa48e3Michael Kolb
3698233facddcc51865d612a919d450db6954aa48e3Michael Kolb    /**
3708233facddcc51865d612a919d450db6954aa48e3Michael Kolb     * Attach the sub window to the content view.
3718233facddcc51865d612a919d450db6954aa48e3Michael Kolb     */
3728233facddcc51865d612a919d450db6954aa48e3Michael Kolb    @Override
3738233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public void attachSubWindow(View container) {
3741514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb        if (container.getParent() != null) {
3751514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb            // already attached, remove first
3761514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb            ((ViewGroup) container.getParent()).removeView(container);
3771514bb7ed5656316a8dac966cee21653f3c59affMichael Kolb        }
3788233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mContentView.addView(container, COVER_SCREEN_PARAMS);
3798233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
3808233facddcc51865d612a919d450db6954aa48e3Michael Kolb
3818233facddcc51865d612a919d450db6954aa48e3Michael Kolb    void showFakeTitleBar() {
3826670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        if (!isFakeTitleBarShowing() && !isActivityPaused()) {
3838233facddcc51865d612a919d450db6954aa48e3Michael Kolb            WebView mainView = mUiController.getCurrentWebView();
3848233facddcc51865d612a919d450db6954aa48e3Michael Kolb            // if there is no current WebView, don't show the faked title bar;
3858233facddcc51865d612a919d450db6954aa48e3Michael Kolb            if (mainView == null) {
3868233facddcc51865d612a919d450db6954aa48e3Michael Kolb                return;
3878233facddcc51865d612a919d450db6954aa48e3Michael Kolb            }
3888233facddcc51865d612a919d450db6954aa48e3Michael Kolb            // Do not need to check for null, since the current tab will have
3898233facddcc51865d612a919d450db6954aa48e3Michael Kolb            // at least a main WebView, or we would have returned above.
3908233facddcc51865d612a919d450db6954aa48e3Michael Kolb            if (mUiController.isInCustomActionMode()) {
3918233facddcc51865d612a919d450db6954aa48e3Michael Kolb                // Do not show the fake title bar, while a custom ActionMode
3928233facddcc51865d612a919d450db6954aa48e3Michael Kolb                // (i.e. find or select) is showing.
3938233facddcc51865d612a919d450db6954aa48e3Michael Kolb                return;
3948233facddcc51865d612a919d450db6954aa48e3Michael Kolb            }
3956670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb            attachFakeTitleBar(mainView);
3968233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
3978233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
3988233facddcc51865d612a919d450db6954aa48e3Michael Kolb
3996670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    protected abstract void attachFakeTitleBar(WebView mainView);
4006670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
4016670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    protected abstract void hideFakeTitleBar();
4026670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
4036670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    protected abstract boolean isFakeTitleBarShowing();
4046670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
4056670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    protected abstract TitleBarBase getFakeTitleBar();
4066670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
4076670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    protected abstract TitleBarBase getEmbeddedTitleBar();
4086670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
4096670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
4106670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public void showVoiceTitleBar(String title) {
4116670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        getEmbeddedTitleBar().setInVoiceMode(true);
4126670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        getEmbeddedTitleBar().setDisplayTitle(title);
4136670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        getFakeTitleBar().setInVoiceMode(true);
4146670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        getFakeTitleBar().setDisplayTitle(title);
4158233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
4168233facddcc51865d612a919d450db6954aa48e3Michael Kolb
4176670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
4186670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public void revertVoiceTitleBar(Tab tab) {
4196670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        getEmbeddedTitleBar().setInVoiceMode(false);
42030c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        String url = tab.getUrl();
4216670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        getEmbeddedTitleBar().setDisplayTitle(url);
4226670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        getFakeTitleBar().setInVoiceMode(false);
4236670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        getFakeTitleBar().setDisplayTitle(url);
4248233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
4258233facddcc51865d612a919d450db6954aa48e3Michael Kolb
4268233facddcc51865d612a919d450db6954aa48e3Michael Kolb    @Override
4278233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public void showComboView(boolean startWithHistory, Bundle extras) {
428439c9a58765aa6aab95d55422ee61ea8360e912dJohn Reck        if (mComboView != null) {
429439c9a58765aa6aab95d55422ee61ea8360e912dJohn Reck            return;
430439c9a58765aa6aab95d55422ee61ea8360e912dJohn Reck        }
4318233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mComboView = new CombinedBookmarkHistoryView(mActivity,
4328233facddcc51865d612a919d450db6954aa48e3Michael Kolb                mUiController,
4338233facddcc51865d612a919d450db6954aa48e3Michael Kolb                startWithHistory ?
4348233facddcc51865d612a919d450db6954aa48e3Michael Kolb                        CombinedBookmarkHistoryView.FRAGMENT_ID_HISTORY
4358233facddcc51865d612a919d450db6954aa48e3Michael Kolb                        : CombinedBookmarkHistoryView.FRAGMENT_ID_BOOKMARKS,
4368233facddcc51865d612a919d450db6954aa48e3Michael Kolb                extras);
43747d63f843cf6973c7cb59db99888df7485bfee39Michael Kolb        FrameLayout wrapper =
43847d63f843cf6973c7cb59db99888df7485bfee39Michael Kolb            (FrameLayout) mContentView.findViewById(R.id.webview_wrapper);
43947d63f843cf6973c7cb59db99888df7485bfee39Michael Kolb        wrapper.setVisibility(View.GONE);
4408233facddcc51865d612a919d450db6954aa48e3Michael Kolb        hideFakeTitleBar();
4413a696280cba53eea153c9d5707b236997d193328Michael Kolb        dismissIME();
4423a696280cba53eea153c9d5707b236997d193328Michael Kolb        if (mActiveTab != null) {
4433a696280cba53eea153c9d5707b236997d193328Michael Kolb            WebView web = mActiveTab.getWebView();
4443a696280cba53eea153c9d5707b236997d193328Michael Kolb            mActiveTab.putInBackground();
4453a696280cba53eea153c9d5707b236997d193328Michael Kolb        }
4468233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mContentView.addView(mComboView, COVER_SCREEN_PARAMS);
4478233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
4488233facddcc51865d612a919d450db6954aa48e3Michael Kolb
4498233facddcc51865d612a919d450db6954aa48e3Michael Kolb    /**
4508233facddcc51865d612a919d450db6954aa48e3Michael Kolb     * dismiss the ComboPage
4518233facddcc51865d612a919d450db6954aa48e3Michael Kolb     */
4528233facddcc51865d612a919d450db6954aa48e3Michael Kolb    @Override
4538233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public void hideComboView() {
4548233facddcc51865d612a919d450db6954aa48e3Michael Kolb        if (mComboView != null) {
4558233facddcc51865d612a919d450db6954aa48e3Michael Kolb            mContentView.removeView(mComboView);
45647d63f843cf6973c7cb59db99888df7485bfee39Michael Kolb            FrameLayout wrapper =
45747d63f843cf6973c7cb59db99888df7485bfee39Michael Kolb                (FrameLayout) mContentView.findViewById(R.id.webview_wrapper);
45847d63f843cf6973c7cb59db99888df7485bfee39Michael Kolb            wrapper.setVisibility(View.VISIBLE);
4598233facddcc51865d612a919d450db6954aa48e3Michael Kolb            mComboView = null;
4608233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
4613a696280cba53eea153c9d5707b236997d193328Michael Kolb        if (mActiveTab != null) {
4623a696280cba53eea153c9d5707b236997d193328Michael Kolb            mActiveTab.putInForeground();
4633a696280cba53eea153c9d5707b236997d193328Michael Kolb        }
464b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck        mActivity.invalidateOptionsMenu();
4658233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
4668233facddcc51865d612a919d450db6954aa48e3Michael Kolb
4678233facddcc51865d612a919d450db6954aa48e3Michael Kolb    @Override
4688233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public void showCustomView(View view,
4698233facddcc51865d612a919d450db6954aa48e3Michael Kolb            WebChromeClient.CustomViewCallback callback) {
4708233facddcc51865d612a919d450db6954aa48e3Michael Kolb        // if a view already exists then immediately terminate the new one
4718233facddcc51865d612a919d450db6954aa48e3Michael Kolb        if (mCustomView != null) {
4728233facddcc51865d612a919d450db6954aa48e3Michael Kolb            callback.onCustomViewHidden();
4738233facddcc51865d612a919d450db6954aa48e3Michael Kolb            return;
4748233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
4758233facddcc51865d612a919d450db6954aa48e3Michael Kolb
4768233facddcc51865d612a919d450db6954aa48e3Michael Kolb        // Add the custom view to its container.
4778233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mCustomViewContainer.addView(view, COVER_SCREEN_GRAVITY_CENTER);
4788233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mCustomView = view;
4798233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mCustomViewCallback = callback;
4808233facddcc51865d612a919d450db6954aa48e3Michael Kolb        // Hide the content view.
4818233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mContentView.setVisibility(View.GONE);
4828233facddcc51865d612a919d450db6954aa48e3Michael Kolb        // Finally show the custom view container.
4838233facddcc51865d612a919d450db6954aa48e3Michael Kolb        setStatusBarVisibility(false);
4848233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mCustomViewContainer.setVisibility(View.VISIBLE);
4858233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mCustomViewContainer.bringToFront();
4868233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
4878233facddcc51865d612a919d450db6954aa48e3Michael Kolb
4888233facddcc51865d612a919d450db6954aa48e3Michael Kolb    @Override
4898233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public void onHideCustomView() {
4908233facddcc51865d612a919d450db6954aa48e3Michael Kolb        if (mCustomView == null)
4918233facddcc51865d612a919d450db6954aa48e3Michael Kolb            return;
4928233facddcc51865d612a919d450db6954aa48e3Michael Kolb
4938233facddcc51865d612a919d450db6954aa48e3Michael Kolb        // Hide the custom view.
4948233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mCustomView.setVisibility(View.GONE);
4958233facddcc51865d612a919d450db6954aa48e3Michael Kolb        // Remove the custom view from its container.
4968233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mCustomViewContainer.removeView(mCustomView);
4978233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mCustomView = null;
4988233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mCustomViewContainer.setVisibility(View.GONE);
4998233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mCustomViewCallback.onCustomViewHidden();
5008233facddcc51865d612a919d450db6954aa48e3Michael Kolb        // Show the content view.
5018233facddcc51865d612a919d450db6954aa48e3Michael Kolb        setStatusBarVisibility(true);
5028233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mContentView.setVisibility(View.VISIBLE);
5038233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
5048233facddcc51865d612a919d450db6954aa48e3Michael Kolb
5058233facddcc51865d612a919d450db6954aa48e3Michael Kolb    @Override
5068233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public boolean isCustomViewShowing() {
5078233facddcc51865d612a919d450db6954aa48e3Michael Kolb        return mCustomView != null;
5088233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
5098233facddcc51865d612a919d450db6954aa48e3Michael Kolb
5106670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    protected void dismissIME() {
5113a696280cba53eea153c9d5707b236997d193328Michael Kolb        if (mInputManager.isActive()) {
5123a696280cba53eea153c9d5707b236997d193328Michael Kolb            mInputManager.hideSoftInputFromWindow(mContentView.getWindowToken(),
5133a696280cba53eea153c9d5707b236997d193328Michael Kolb                    0);
5143a696280cba53eea153c9d5707b236997d193328Michael Kolb        }
5153a696280cba53eea153c9d5707b236997d193328Michael Kolb    }
5163a696280cba53eea153c9d5707b236997d193328Michael Kolb
5176670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
5186670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public boolean showsWeb() {
5196670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        return mCustomView == null
5206670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb            && mComboView == null;
5216670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
5226670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
5238233facddcc51865d612a919d450db6954aa48e3Michael Kolb    // -------------------------------------------------------------------------
5248233facddcc51865d612a919d450db6954aa48e3Michael Kolb
5255a72f1858c2f73be3558c6cdaa2c84b4c36fa748Michael Kolb    protected void updateNavigationState(Tab tab) {
5265a72f1858c2f73be3558c6cdaa2c84b4c36fa748Michael Kolb    }
5275a72f1858c2f73be3558c6cdaa2c84b4c36fa748Michael Kolb
5288233facddcc51865d612a919d450db6954aa48e3Michael Kolb    /**
5298233facddcc51865d612a919d450db6954aa48e3Michael Kolb     * Update the lock icon to correspond to our latest state.
5308233facddcc51865d612a919d450db6954aa48e3Michael Kolb     */
5316670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    protected void updateLockIconToLatest(Tab t) {
53230c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        if (t != null && t.inForeground()) {
5338233facddcc51865d612a919d450db6954aa48e3Michael Kolb            updateLockIconImage(t.getLockIconType());
5348233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
5358233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
5368233facddcc51865d612a919d450db6954aa48e3Michael Kolb
5378233facddcc51865d612a919d450db6954aa48e3Michael Kolb    /**
5388233facddcc51865d612a919d450db6954aa48e3Michael Kolb     * Updates the lock-icon image in the title-bar.
5398233facddcc51865d612a919d450db6954aa48e3Michael Kolb     */
54030c714c853a4239e72ab1e238ce2a92472d06ab0John Reck    private void updateLockIconImage(LockIcon lockIconType) {
5418233facddcc51865d612a919d450db6954aa48e3Michael Kolb        Drawable d = null;
54230c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        if (lockIconType == LockIcon.LOCK_ICON_SECURE) {
5438233facddcc51865d612a919d450db6954aa48e3Michael Kolb            d = mSecLockIcon;
54430c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        } else if (lockIconType == LockIcon.LOCK_ICON_MIXED) {
5458233facddcc51865d612a919d450db6954aa48e3Michael Kolb            d = mMixLockIcon;
5468233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
5476670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        getEmbeddedTitleBar().setLock(d);
5486670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        getFakeTitleBar().setLock(d);
5498233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
5508233facddcc51865d612a919d450db6954aa48e3Michael Kolb
55130c714c853a4239e72ab1e238ce2a92472d06ab0John Reck    protected void setUrlTitle(Tab tab) {
55230c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        String url = tab.getUrl();
55330c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        String title = tab.getTitle();
5546670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        if (TextUtils.isEmpty(title)) {
5556670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb            title = url;
5566670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        }
5576670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        if (tab.isInVoiceSearchMode()) return;
5586670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        if (tab.inForeground()) {
5596670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb            getEmbeddedTitleBar().setDisplayTitle(url);
5606670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb            getFakeTitleBar().setDisplayTitle(url);
5616670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        }
5628233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
5638233facddcc51865d612a919d450db6954aa48e3Michael Kolb
5646670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    // Set the favicon in the title bar.
56530c714c853a4239e72ab1e238ce2a92472d06ab0John Reck    protected void setFavicon(Tab tab) {
56630c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        if (tab.inForeground()) {
56730c714c853a4239e72ab1e238ce2a92472d06ab0John Reck            Bitmap icon = tab.getFavicon();
56830c714c853a4239e72ab1e238ce2a92472d06ab0John Reck            getEmbeddedTitleBar().setFavicon(icon);
56930c714c853a4239e72ab1e238ce2a92472d06ab0John Reck            getFakeTitleBar().setFavicon(icon);
57030c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        }
5718233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
5728233facddcc51865d612a919d450db6954aa48e3Michael Kolb
5738233facddcc51865d612a919d450db6954aa48e3Michael Kolb    @Override
5748233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public void onActionModeFinished(boolean inLoad) {
5758233facddcc51865d612a919d450db6954aa48e3Michael Kolb        if (inLoad) {
5768233facddcc51865d612a919d450db6954aa48e3Michael Kolb            // the titlebar was removed when the CAB was shown
5778233facddcc51865d612a919d450db6954aa48e3Michael Kolb            // if the page is loading, show it again
5788233facddcc51865d612a919d450db6954aa48e3Michael Kolb            showFakeTitleBar();
5798233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
5808233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
5818233facddcc51865d612a919d450db6954aa48e3Michael Kolb
5826670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    // active tabs page
5836670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
5846670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public void showActiveTabsPage() {
5856670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
5866670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
5876670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    /**
5886670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb     * Remove the active tabs page.
5896670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb     */
5906670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public void removeActiveTabsPage() {
5916670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
5926670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
5938233facddcc51865d612a919d450db6954aa48e3Michael Kolb    // menu handling callbacks
5948233facddcc51865d612a919d450db6954aa48e3Michael Kolb
5958233facddcc51865d612a919d450db6954aa48e3Michael Kolb    @Override
5968233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public void onOptionsMenuOpened() {
5978233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
5988233facddcc51865d612a919d450db6954aa48e3Michael Kolb
5998233facddcc51865d612a919d450db6954aa48e3Michael Kolb    @Override
6008233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public void onExtendedMenuOpened() {
6018233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
6028233facddcc51865d612a919d450db6954aa48e3Michael Kolb
6038233facddcc51865d612a919d450db6954aa48e3Michael Kolb    @Override
6048233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public void onOptionsMenuClosed(boolean inLoad) {
6058233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
6068233facddcc51865d612a919d450db6954aa48e3Michael Kolb
6078233facddcc51865d612a919d450db6954aa48e3Michael Kolb    @Override
6088233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public void onExtendedMenuClosed(boolean inLoad) {
6098233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
6108233facddcc51865d612a919d450db6954aa48e3Michael Kolb
6118233facddcc51865d612a919d450db6954aa48e3Michael Kolb    @Override
6128233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public void onContextMenuCreated(Menu menu) {
6138233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
6148233facddcc51865d612a919d450db6954aa48e3Michael Kolb
6158233facddcc51865d612a919d450db6954aa48e3Michael Kolb    @Override
6168233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public void onContextMenuClosed(Menu menu, boolean inLoad) {
6178233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
6188233facddcc51865d612a919d450db6954aa48e3Michael Kolb
6198233facddcc51865d612a919d450db6954aa48e3Michael Kolb    // error console
6208233facddcc51865d612a919d450db6954aa48e3Michael Kolb
6218233facddcc51865d612a919d450db6954aa48e3Michael Kolb    @Override
6228233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public void setShouldShowErrorConsole(Tab tab, boolean flag) {
6238233facddcc51865d612a919d450db6954aa48e3Michael Kolb        ErrorConsoleView errorConsole = tab.getErrorConsole(true);
6248233facddcc51865d612a919d450db6954aa48e3Michael Kolb        if (flag) {
6258233facddcc51865d612a919d450db6954aa48e3Michael Kolb            // Setting the show state of the console will cause it's the layout
6268233facddcc51865d612a919d450db6954aa48e3Michael Kolb            // to be inflated.
6278233facddcc51865d612a919d450db6954aa48e3Michael Kolb            if (errorConsole.numberOfErrors() > 0) {
6288233facddcc51865d612a919d450db6954aa48e3Michael Kolb                errorConsole.showConsole(ErrorConsoleView.SHOW_MINIMIZED);
6298233facddcc51865d612a919d450db6954aa48e3Michael Kolb            } else {
6308233facddcc51865d612a919d450db6954aa48e3Michael Kolb                errorConsole.showConsole(ErrorConsoleView.SHOW_NONE);
6318233facddcc51865d612a919d450db6954aa48e3Michael Kolb            }
6328233facddcc51865d612a919d450db6954aa48e3Michael Kolb            if (errorConsole.getParent() != null) {
6338233facddcc51865d612a919d450db6954aa48e3Michael Kolb                mErrorConsoleContainer.removeView(errorConsole);
6348233facddcc51865d612a919d450db6954aa48e3Michael Kolb            }
6358233facddcc51865d612a919d450db6954aa48e3Michael Kolb            // Now we can add it to the main view.
6368233facddcc51865d612a919d450db6954aa48e3Michael Kolb            mErrorConsoleContainer.addView(errorConsole,
6378233facddcc51865d612a919d450db6954aa48e3Michael Kolb                    new LinearLayout.LayoutParams(
6388233facddcc51865d612a919d450db6954aa48e3Michael Kolb                            ViewGroup.LayoutParams.MATCH_PARENT,
6398233facddcc51865d612a919d450db6954aa48e3Michael Kolb                            ViewGroup.LayoutParams.WRAP_CONTENT));
6408233facddcc51865d612a919d450db6954aa48e3Michael Kolb        } else {
6418233facddcc51865d612a919d450db6954aa48e3Michael Kolb            mErrorConsoleContainer.removeView(errorConsole);
6428233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
6438233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
6448233facddcc51865d612a919d450db6954aa48e3Michael Kolb
6458233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private void setStatusBarVisibility(boolean visible) {
6468233facddcc51865d612a919d450db6954aa48e3Michael Kolb        int flag = visible ? 0 : WindowManager.LayoutParams.FLAG_FULLSCREEN;
6478233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mActivity.getWindow().setFlags(flag,
6488233facddcc51865d612a919d450db6954aa48e3Michael Kolb                WindowManager.LayoutParams.FLAG_FULLSCREEN);
6498233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
6508233facddcc51865d612a919d450db6954aa48e3Michael Kolb
6518233facddcc51865d612a919d450db6954aa48e3Michael Kolb    // -------------------------------------------------------------------------
6528233facddcc51865d612a919d450db6954aa48e3Michael Kolb    // Helper function for WebChromeClient
6538233facddcc51865d612a919d450db6954aa48e3Michael Kolb    // -------------------------------------------------------------------------
6548233facddcc51865d612a919d450db6954aa48e3Michael Kolb
6558233facddcc51865d612a919d450db6954aa48e3Michael Kolb    @Override
6568233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public Bitmap getDefaultVideoPoster() {
6578233facddcc51865d612a919d450db6954aa48e3Michael Kolb        if (mDefaultVideoPoster == null) {
6588233facddcc51865d612a919d450db6954aa48e3Michael Kolb            mDefaultVideoPoster = BitmapFactory.decodeResource(
6598233facddcc51865d612a919d450db6954aa48e3Michael Kolb                    mActivity.getResources(), R.drawable.default_video_poster);
6608233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
6618233facddcc51865d612a919d450db6954aa48e3Michael Kolb        return mDefaultVideoPoster;
6628233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
6638233facddcc51865d612a919d450db6954aa48e3Michael Kolb
6648233facddcc51865d612a919d450db6954aa48e3Michael Kolb    @Override
6658233facddcc51865d612a919d450db6954aa48e3Michael Kolb    public View getVideoLoadingProgressView() {
6668233facddcc51865d612a919d450db6954aa48e3Michael Kolb        if (mVideoProgressView == null) {
6678233facddcc51865d612a919d450db6954aa48e3Michael Kolb            LayoutInflater inflater = LayoutInflater.from(mActivity);
6688233facddcc51865d612a919d450db6954aa48e3Michael Kolb            mVideoProgressView = inflater.inflate(
6698233facddcc51865d612a919d450db6954aa48e3Michael Kolb                    R.layout.video_loading_progress, null);
6708233facddcc51865d612a919d450db6954aa48e3Michael Kolb        }
6718233facddcc51865d612a919d450db6954aa48e3Michael Kolb        return mVideoProgressView;
6728233facddcc51865d612a919d450db6954aa48e3Michael Kolb    }
6738233facddcc51865d612a919d450db6954aa48e3Michael Kolb
674843510fb4f36a9a834c69d8773156db20ca3d740Michael Kolb    @Override
675843510fb4f36a9a834c69d8773156db20ca3d740Michael Kolb    public void showMaxTabsWarning() {
676843510fb4f36a9a834c69d8773156db20ca3d740Michael Kolb        Toast warning = Toast.makeText(mActivity,
677843510fb4f36a9a834c69d8773156db20ca3d740Michael Kolb                mActivity.getString(R.string.max_tabs_warning),
678843510fb4f36a9a834c69d8773156db20ca3d740Michael Kolb                Toast.LENGTH_SHORT);
679843510fb4f36a9a834c69d8773156db20ca3d740Michael Kolb        warning.show();
680843510fb4f36a9a834c69d8773156db20ca3d740Michael Kolb    }
681843510fb4f36a9a834c69d8773156db20ca3d740Michael Kolb
6828233facddcc51865d612a919d450db6954aa48e3Michael Kolb}
683