XLargeUi.java revision a418306e08e008da99cef929c48e05d2a101ceaf
16670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb/*
26670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb * Copyright (C) 2010 The Android Open Source Project
36670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb *
46670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb * Licensed under the Apache License, Version 2.0 (the "License");
56670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb * you may not use this file except in compliance with the License.
66670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb * You may obtain a copy of the License at
76670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb *
86670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb *      http://www.apache.org/licenses/LICENSE-2.0
96670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb *
106670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb * Unless required by applicable law or agreed to in writing, software
116670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb * distributed under the License is distributed on an "AS IS" BASIS,
126670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb * See the License for the specific language governing permissions and
146670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb * limitations under the License.
156670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb */
166670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
176670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolbpackage com.android.browser;
186670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
196670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolbimport com.android.browser.ScrollWebView.ScrollListener;
206670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
216670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolbimport android.app.ActionBar;
226670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolbimport android.app.Activity;
23ac35bdc798173ca536e57c1e4541cef11d78983aMichael Kolbimport android.os.Bundle;
24376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolbimport android.util.Log;
256670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolbimport android.view.ActionMode;
26376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolbimport android.view.Gravity;
27a418306e08e008da99cef929c48e05d2a101ceafMichael Kolbimport android.view.KeyEvent;
28d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reckimport android.view.View;
29d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reckimport android.webkit.WebChromeClient.CustomViewCallback;
306670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolbimport android.webkit.WebView;
31376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolbimport android.widget.FrameLayout;
32376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolbimport android.widget.FrameLayout.LayoutParams;
336670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
346670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolbimport java.util.List;
356670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
366670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb/**
376670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb * Ui for xlarge screen sizes
386670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb */
396670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolbpublic class XLargeUi extends BaseUi implements ScrollListener {
406670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
416670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    private static final String LOGTAG = "XLargeUi";
426670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
43376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    private ActionBar mActionBar;
446670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    private TabBar mTabBar;
456670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
466670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    private TitleBarXLarge mTitleBar;
476670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    private TitleBarXLarge mFakeTitleBar;
486670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
49376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    private boolean mUseQuickControls;
50376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    private PieControl mPieControl;
51376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb
526670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    /**
536670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb     * @param browser
546670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb     * @param controller
556670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb     */
566670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public XLargeUi(Activity browser, UiController controller) {
576670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        super(browser, controller);
586670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        mTitleBar = new TitleBarXLarge(mActivity, mUiController, this);
596670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        mTitleBar.setProgress(100);
60cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        mTitleBar.setEditable(false);
616670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        mFakeTitleBar = new TitleBarXLarge(mActivity, mUiController, this);
62cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        mFakeTitleBar.setEditable(true);
636670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        mTabBar = new TabBar(mActivity, mUiController, this);
64376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        mActionBar = mActivity.getActionBar();
65b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck        setupActionBar();
66b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck        setUseQuickControls(BrowserSettings.getInstance().useQuickControls());
67b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck    }
68b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck
69b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck    private void setupActionBar() {
70b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck        mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
71376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        mActionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
72376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        mActionBar.setCustomView(mTabBar);
73b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck    }
74b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck
75b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck    @Override
76ac35bdc798173ca536e57c1e4541cef11d78983aMichael Kolb    public void showComboView(boolean startWithHistory, Bundle extras) {
77ac35bdc798173ca536e57c1e4541cef11d78983aMichael Kolb        super.showComboView(startWithHistory, extras);
78ac35bdc798173ca536e57c1e4541cef11d78983aMichael Kolb        if (mUseQuickControls) {
79ac35bdc798173ca536e57c1e4541cef11d78983aMichael Kolb            mActionBar.show();
80ac35bdc798173ca536e57c1e4541cef11d78983aMichael Kolb        }
81ac35bdc798173ca536e57c1e4541cef11d78983aMichael Kolb    }
82ac35bdc798173ca536e57c1e4541cef11d78983aMichael Kolb
83ac35bdc798173ca536e57c1e4541cef11d78983aMichael Kolb    @Override
84b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck    public void hideComboView() {
85b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck        super.hideComboView();
86b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck        // ComboView changes the action bar, set it back up to what we want
87b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck        setupActionBar();
88376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    }
89376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb
90376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    private void setUseQuickControls(boolean useQuickControls) {
91376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        mUseQuickControls = useQuickControls;
92376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        if (useQuickControls) {
93376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            checkTabCount();
94376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            mPieControl = new PieControl(mActivity, mUiController, this);
95376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            mPieControl.attachToContainer(mContentView);
96376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            setFakeTitleBarGravity(Gravity.BOTTOM);
97376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb
98376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            // remove embedded title bar if present
99376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            WebView web = mTabControl.getCurrentWebView();
100376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            if ((web != null) && (web.getVisibleTitleHeight() > 0)) {
101376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb                web.setEmbeddedTitleBar(null);
102376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            }
103376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        } else {
104376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            mActivity.getActionBar().show();
105376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            if (mPieControl != null) {
106376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb                mPieControl.removeFromContainer(mContentView);
107376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            }
108376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            setFakeTitleBarGravity(Gravity.TOP);
109376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            // remove embedded title bar if present
110376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            WebView web = mTabControl.getCurrentWebView();
111376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            if ((web != null) && (web.getVisibleTitleHeight() == 0)) {
112376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb                web.setEmbeddedTitleBar(mTitleBar);
113376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            }
114376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        }
115376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        mTabBar.setUseQuickControls(mUseQuickControls);
116376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        mFakeTitleBar.setUseQuickControls(mUseQuickControls);
117376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    }
118376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb
119376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    private void checkTabCount() {
120376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        if (mUseQuickControls) {
121376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            int n = mTabBar.getTabCount();
122376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            if (n >= 2) {
123376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb                mActivity.getActionBar().show();
124376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            } else if (n == 1) {
125376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb                mActivity.getActionBar().hide();
126376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            }
127376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        }
1286670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
1296670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
1306670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
1316670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public void onDestroy() {
1326670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        hideFakeTitleBar();
1336670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
1346670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
1356670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    // webview factory
1366670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
1376670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
1386670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public WebView createWebView(boolean privateBrowsing) {
1396670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        // Create a new WebView
1406670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        ScrollWebView w = new ScrollWebView(mActivity, null,
1416670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb                android.R.attr.webViewStyle, privateBrowsing);
1426670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        initWebViewSettings(w);
1436670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        w.setScrollListener(this);
1446670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        w.getSettings().setDisplayZoomControls(false);
1456670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        return w;
1466670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
1476670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
1486670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
1496670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public WebView createSubWebView(boolean privateBrowsing) {
1506670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        ScrollWebView web = (ScrollWebView) createWebView(privateBrowsing);
1516670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        // no scroll listener for subview
1526670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        web.setScrollListener(null);
1536670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        return web;
1546670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
1556670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
1566670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
1576670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public void onScroll(int visibleTitleHeight) {
1586670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        mTabBar.onScroll(visibleTitleHeight);
1596670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
1606670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
1616670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    void stopWebViewScrolling() {
1626670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        ScrollWebView web = (ScrollWebView) mUiController.getCurrentWebView();
1636670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        if (web != null) {
1646670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb            web.stopScroll();
1656670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        }
1666670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
1676670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
1686670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    // WebView callbacks
1696670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
1706670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
1716670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public void bookmarkedStatusHasChanged(Tab tab) {
1726670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        if (tab.inForeground()) {
1736670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb            boolean isBookmark = tab.isBookmarkedSite();
1746670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb            mTitleBar.setCurrentUrlIsBookmark(isBookmark);
1756670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb            mFakeTitleBar.setCurrentUrlIsBookmark(isBookmark);
1766670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        }
1776670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
1786670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
1796670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
18030c714c853a4239e72ab1e238ce2a92472d06ab0John Reck    public void onProgressChanged(Tab tab) {
18130c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        int progress = tab.getLoadProgress();
1826670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        mTabBar.onProgress(tab, progress);
1836670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        if (tab.inForeground()) {
1846670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb            mFakeTitleBar.setProgress(progress);
1856670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb            if (progress == 100) {
186bd018d44c193f7afe5f3c0839766ff1ab19712b9Michael Kolb                if (!mFakeTitleBar.isEditingUrl()) {
187bd018d44c193f7afe5f3c0839766ff1ab19712b9Michael Kolb                    hideFakeTitleBar();
188bd018d44c193f7afe5f3c0839766ff1ab19712b9Michael Kolb                    if (mUseQuickControls) {
189bd018d44c193f7afe5f3c0839766ff1ab19712b9Michael Kolb                        mFakeTitleBar.setShowProgressOnly(false);
190bd018d44c193f7afe5f3c0839766ff1ab19712b9Michael Kolb                        setFakeTitleBarGravity(Gravity.BOTTOM);
191bd018d44c193f7afe5f3c0839766ff1ab19712b9Michael Kolb                    }
192376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb                }
1936670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb            } else {
194bd018d44c193f7afe5f3c0839766ff1ab19712b9Michael Kolb                if (mUseQuickControls && !mFakeTitleBar.isEditingUrl()) {
195376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb                    mFakeTitleBar.setShowProgressOnly(true);
196376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb                    if (!isFakeTitleBarShowing()) {
197376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb                        setFakeTitleBarGravity(Gravity.TOP);
198376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb                    }
199376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb                }
2006670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb                showFakeTitleBar();
2016670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb            }
2026670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        }
2036670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
2046670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
2056670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
2066670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public boolean needsRestoreAllTabs() {
2076670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        return true;
2086670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
2096670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
2106670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
2116670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public void addTab(Tab tab) {
2126670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        mTabBar.onNewTab(tab);
213376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        checkTabCount();
2146670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
2156670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
2166670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
2176670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public void setActiveTab(Tab tab) {
2186670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        super.setActiveTab(tab);
219376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        ScrollWebView view = (ScrollWebView) tab.getWebView();
220376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        // TabControl.setCurrentTab has been called before this,
221376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        // so the tab is guaranteed to have a webview
222376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        if (view == null) {
223376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            Log.e(LOGTAG, "active tab with no webview detected");
224376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            return;
225376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        }
226376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        // Request focus on the top window.
227376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        if (mUseQuickControls) {
228376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            mPieControl.forceToTop(mContentView);
229376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            view.setScrollListener(null);
230376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            mTabBar.showTitleBarIndicator(false);
231376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        } else {
232376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            view.setEmbeddedTitleBar(mTitleBar);
233376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            view.setScrollListener(this);
234376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        }
2356670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        mTabBar.onSetActiveTab(tab);
236376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        if (tab.isInVoiceSearchMode()) {
237376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            showVoiceTitleBar(tab.getVoiceDisplayTitle());
238376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        } else {
239376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            revertVoiceTitleBar(tab);
240376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        }
241376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        updateLockIconToLatest(tab);
242376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        tab.getTopWindow().requestFocus();
2436670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
2446670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
2456670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
2466670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public void updateTabs(List<Tab> tabs) {
2476670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        mTabBar.updateTabs(tabs);
248376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        checkTabCount();
2496670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
2506670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
2516670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
2526670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public void removeTab(Tab tab) {
2536670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        super.removeTab(tab);
2546670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        mTabBar.onRemoveTab(tab);
255376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        checkTabCount();
2566670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
2576670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
258376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    int getContentWidth() {
259376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        if (mContentView != null) {
260376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            return mContentView.getWidth();
2616670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        }
2626670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        return 0;
2636670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
2646670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
2656670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    void editUrl(boolean clearInput) {
266d72ea3bbab2a745a901c5bc18247c12fe8cfc0b4Michael Kolb        if (mUiController.isInCustomActionMode()) {
267d72ea3bbab2a745a901c5bc18247c12fe8cfc0b4Michael Kolb            mUiController.endActionMode();
268d72ea3bbab2a745a901c5bc18247c12fe8cfc0b4Michael Kolb        }
2696670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        showFakeTitleBar();
2706670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        mFakeTitleBar.onEditUrl(clearInput);
2716670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
2726670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
273376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    void setFakeTitleBarGravity(int gravity) {
274376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams)
275376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb                mFakeTitleBar.getLayoutParams();
276376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        if (lp == null) {
277376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            lp = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,
278376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb                    LayoutParams.WRAP_CONTENT);
279376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        }
280376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        lp.gravity = gravity;
281376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        mFakeTitleBar.setLayoutParams(lp);
282376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    }
283376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb
284376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    void showFakeTitleBarAndEdit() {
285bd018d44c193f7afe5f3c0839766ff1ab19712b9Michael Kolb        mFakeTitleBar.setShowProgressOnly(false);
286bd018d44c193f7afe5f3c0839766ff1ab19712b9Michael Kolb        setFakeTitleBarGravity(Gravity.BOTTOM);
287376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        showFakeTitleBar();
288376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        mFakeTitleBar.onEditUrl(false);
289376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    }
290376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb
2916670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
2926670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    protected void attachFakeTitleBar(WebView mainView) {
2936670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        mContentView.addView(mFakeTitleBar);
2946670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        mTabBar.onShowTitleBar();
2956670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
2966670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
2976670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
2986670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    protected void hideFakeTitleBar() {
2996670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        if (isFakeTitleBarShowing()) {
300467af0a9e10715b86005992555d1c0a0654d136fMichael Kolb            mFakeTitleBar.setUrlMode(false);
3016670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb            mContentView.removeView(mFakeTitleBar);
3026670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb            mTabBar.onHideTitleBar();
3036670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        }
3046670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
3056670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
3066670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
3076670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    protected boolean isFakeTitleBarShowing() {
3086670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        return (mFakeTitleBar.getParent() != null);
3096670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
3106670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
3116670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
3126670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    protected TitleBarBase getFakeTitleBar() {
3136670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        return mFakeTitleBar;
3146670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
3156670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
3166670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
3176670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    protected TitleBarBase getEmbeddedTitleBar() {
3186670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        return mTitleBar;
3196670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
3206670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
3216670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    // action mode callbacks
3226670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
3236670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
3246670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public void onActionModeStarted(ActionMode mode) {
325bd018d44c193f7afe5f3c0839766ff1ab19712b9Michael Kolb        if (!mFakeTitleBar.isEditingUrl()) {
3266670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb            // hide the fake title bar when CAB is shown
3276670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb            hideFakeTitleBar();
3286670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        }
3296670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
3306670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
3316670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
332376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    public void onActionModeFinished(boolean inLoad) {
333376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        checkTabCount();
334376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        if (inLoad) {
335376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            // the titlebar was removed when the CAB was shown
336376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            // if the page is loading, show it again
337376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            mFakeTitleBar.setShowProgressOnly(true);
338376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            if (!isFakeTitleBarShowing()) {
339376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb                setFakeTitleBarGravity(Gravity.TOP);
340376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            }
341376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            showFakeTitleBar();
342376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        }
343376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    }
344376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb
345376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    @Override
3465a72f1858c2f73be3558c6cdaa2c84b4c36fa748Michael Kolb    protected void updateNavigationState(Tab tab) {
3475a72f1858c2f73be3558c6cdaa2c84b4c36fa748Michael Kolb        mTitleBar.updateNavigationState(tab);
3485a72f1858c2f73be3558c6cdaa2c84b4c36fa748Michael Kolb        mFakeTitleBar.updateNavigationState(tab);
3495a72f1858c2f73be3558c6cdaa2c84b4c36fa748Michael Kolb    }
3505a72f1858c2f73be3558c6cdaa2c84b4c36fa748Michael Kolb
3515a72f1858c2f73be3558c6cdaa2c84b4c36fa748Michael Kolb    @Override
35230c714c853a4239e72ab1e238ce2a92472d06ab0John Reck    public void setUrlTitle(Tab tab) {
35330c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        super.setUrlTitle(tab);
35430c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        mTabBar.onUrlAndTitle(tab, tab.getUrl(), tab.getTitle());
3556670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
3566670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
3576670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    // Set the favicon in the title bar.
3586670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
35930c714c853a4239e72ab1e238ce2a92472d06ab0John Reck    public void setFavicon(Tab tab) {
36030c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        super.setFavicon(tab);
36130c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        mTabBar.onFavicon(tab, tab.getFavicon());
3626670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
3636670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
364cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb    @Override
365cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb    public void showVoiceTitleBar(String title) {
366cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        List<String> vsresults = null;
367cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        if (getActiveTab() != null) {
368cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb            vsresults = getActiveTab().getVoiceSearchResults();
369cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        }
370cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        mTitleBar.setInVoiceMode(true, null);
371cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        mTitleBar.setDisplayTitle(title);
372cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        mFakeTitleBar.setInVoiceMode(true, vsresults);
373cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        mFakeTitleBar.setDisplayTitle(title);
374cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb    }
375cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb
376cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb    @Override
377cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb    public void revertVoiceTitleBar(Tab tab) {
378cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        mTitleBar.setInVoiceMode(false, null);
37930c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        String url = tab.getUrl();
380cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        mTitleBar.setDisplayTitle(url);
381cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        mFakeTitleBar.setInVoiceMode(false, null);
382cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        mFakeTitleBar.setDisplayTitle(url);
383cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb    }
384cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb
385d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck    @Override
386d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck    public void showCustomView(View view, CustomViewCallback callback) {
387d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck        super.showCustomView(view, callback);
388d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck        mActivity.getActionBar().hide();
389d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck    }
390cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb
391d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck    @Override
392d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck    public void onHideCustomView() {
393d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck        super.onHideCustomView();
394d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck        if (mUseQuickControls) {
395d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck            checkTabCount();
396d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck        } else {
397d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck            mActivity.getActionBar().show();
398d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck        }
399d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck    }
400a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb
401a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb    @Override
402a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb    public boolean dispatchKey(int code, KeyEvent event) {
403a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb        WebView web = getActiveTab().getWebView();
404a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb        switch (code) {
405a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb            case KeyEvent.KEYCODE_TAB:
406a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb            case KeyEvent.KEYCODE_DPAD_UP:
407a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb            case KeyEvent.KEYCODE_DPAD_LEFT:
408a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb                if ((web != null) && web.hasFocus()) {
409a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb                    editUrl(true);
410a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb                    return true;
411a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb                }
412a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb        }
413a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb        if (event.isPrintingKey() && !mFakeTitleBar.isEditingUrl()) {
414a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb            editUrl(true);
415a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb            return mContentView.dispatchKeyEvent(event);
416a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb        }
417a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb        return false;
418a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb    }
419a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb
4206670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb}
421