XLargeUi.java revision 1cf4b79a0020bc18c83ca8bde0e318ecd5252bc2
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 android.app.ActionBar;
206670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolbimport android.app.Activity;
21ac35bdc798173ca536e57c1e4541cef11d78983aMichael Kolbimport android.os.Bundle;
22ba23870babf7041e72f7d1119ad59d9bb32c6634Michael Kolbimport android.os.Handler;
23376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolbimport android.util.Log;
246670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolbimport android.view.ActionMode;
25376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolbimport android.view.Gravity;
26a418306e08e008da99cef929c48e05d2a101ceafMichael Kolbimport android.view.KeyEvent;
27d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reckimport android.view.View;
28d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reckimport android.webkit.WebChromeClient.CustomViewCallback;
296670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolbimport android.webkit.WebView;
306670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
316670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolbimport java.util.List;
326670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
336670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb/**
346670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb * Ui for xlarge screen sizes
356670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb */
36b14ff2febe4b6a07a73c875858437c89cf43fc72Michael Kolbpublic class XLargeUi extends BaseUi {
376670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
386670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    private static final String LOGTAG = "XLargeUi";
396670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
40376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    private ActionBar mActionBar;
416670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    private TabBar mTabBar;
426670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
430f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private NavigationBarTablet mNavBar;
446670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
450241e7556501caae1f57d2bdf3677d7e4a619eb0Michael Kolb    private PieControlXLarge mPieControl;
46ba23870babf7041e72f7d1119ad59d9bb32c6634Michael Kolb    private Handler mHandler;
47376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb
486670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    /**
496670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb     * @param browser
506670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb     * @param controller
516670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb     */
526670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public XLargeUi(Activity browser, UiController controller) {
536670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        super(browser, controller);
54ba23870babf7041e72f7d1119ad59d9bb32c6634Michael Kolb        mHandler = new Handler();
550f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mNavBar = (NavigationBarTablet) mTitleBar.getNavigationBar();
566670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        mTabBar = new TabBar(mActivity, mUiController, this);
57376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        mActionBar = mActivity.getActionBar();
58b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck        setupActionBar();
59b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck        setUseQuickControls(BrowserSettings.getInstance().useQuickControls());
60b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck    }
61b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck
62b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck    private void setupActionBar() {
63b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck        mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
64376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        mActionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
65376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        mActionBar.setCustomView(mTabBar);
66b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck    }
67b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck
682bc8042224be51966d748b870768ec1b376a1621John Reck    public void showComboView(ComboViews startWith, Bundle extras) {
692bc8042224be51966d748b870768ec1b376a1621John Reck        super.showComboView(startWith, extras);
70ac35bdc798173ca536e57c1e4541cef11d78983aMichael Kolb        if (mUseQuickControls) {
71ac35bdc798173ca536e57c1e4541cef11d78983aMichael Kolb            mActionBar.show();
72ac35bdc798173ca536e57c1e4541cef11d78983aMichael Kolb        }
73ac35bdc798173ca536e57c1e4541cef11d78983aMichael Kolb    }
74ac35bdc798173ca536e57c1e4541cef11d78983aMichael Kolb
75ac35bdc798173ca536e57c1e4541cef11d78983aMichael Kolb    @Override
760241e7556501caae1f57d2bdf3677d7e4a619eb0Michael Kolb    public void setUseQuickControls(boolean useQuickControls) {
77376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        mUseQuickControls = useQuickControls;
787cdc4906fc5852297a9a254c3251ad2f4dead6eeMichael Kolb        mTitleBar.setUseQuickControls(mUseQuickControls);
79376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        if (useQuickControls) {
80376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            checkTabCount();
810241e7556501caae1f57d2bdf3677d7e4a619eb0Michael Kolb            mPieControl = new PieControlXLarge(mActivity, mUiController, this);
82376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            mPieControl.attachToContainer(mContentView);
8346f987eca738a36e2c8382aaec6c7ef2ae2482aeMichael Kolb            WebView web = getWebView();
8446f987eca738a36e2c8382aaec6c7ef2ae2482aeMichael Kolb            if (web != null) {
8546f987eca738a36e2c8382aaec6c7ef2ae2482aeMichael Kolb                web.setEmbeddedTitleBar(null);
860241e7556501caae1f57d2bdf3677d7e4a619eb0Michael Kolb                // don't show url bar on scrolling
870241e7556501caae1f57d2bdf3677d7e4a619eb0Michael Kolb                web.setOnTouchListener(null);
880241e7556501caae1f57d2bdf3677d7e4a619eb0Michael Kolb
89376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            }
90376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        } else {
91376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            mActivity.getActionBar().show();
92376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            if (mPieControl != null) {
93376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb                mPieControl.removeFromContainer(mContentView);
94376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            }
9546f987eca738a36e2c8382aaec6c7ef2ae2482aeMichael Kolb            WebView web = getWebView();
967cdc4906fc5852297a9a254c3251ad2f4dead6eeMichael Kolb            if (web != null) {
97376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb                web.setEmbeddedTitleBar(mTitleBar);
980241e7556501caae1f57d2bdf3677d7e4a619eb0Michael Kolb                // show url bar on scrolling
990241e7556501caae1f57d2bdf3677d7e4a619eb0Michael Kolb                web.setOnTouchListener(this);
100376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            }
1018a4c38243de9d19162c883d3b20df65f8bcba81aMichael Kolb            setTitleGravity(Gravity.NO_GRAVITY);
102376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        }
103376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        mTabBar.setUseQuickControls(mUseQuickControls);
1041cf4b79a0020bc18c83ca8bde0e318ecd5252bc2John Reck        // We need to update the tabs with this change
1051cf4b79a0020bc18c83ca8bde0e318ecd5252bc2John Reck        for (Tab t : mTabControl.getTabs()) {
1061cf4b79a0020bc18c83ca8bde0e318ecd5252bc2John Reck            t.updateShouldCaptureThumbnails();
1071cf4b79a0020bc18c83ca8bde0e318ecd5252bc2John Reck        }
108376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    }
109376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb
110376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    private void checkTabCount() {
111376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        if (mUseQuickControls) {
112eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb            mHandler.post(new Runnable() {
113eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb                public void run() {
114eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb                    mActionBar.hide();
115eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb                }
116eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb            });
117376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        }
1186670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
1196670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
1206670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
12167b8c1b4336a77414c74bce6152495502d4bde04Narayan Kamath    public void onResume() {
12267b8c1b4336a77414c74bce6152495502d4bde04Narayan Kamath        super.onResume();
12335e9dd6283a2d65687104eb0b3a459c02dcb150bJohn Reck        if (!BrowserSettings.getInstance().useInstantSearch()) {
1240f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mNavBar.clearCompletions();
12567b8c1b4336a77414c74bce6152495502d4bde04Narayan Kamath        }
12667b8c1b4336a77414c74bce6152495502d4bde04Narayan Kamath    }
12767b8c1b4336a77414c74bce6152495502d4bde04Narayan Kamath
12867b8c1b4336a77414c74bce6152495502d4bde04Narayan Kamath    @Override
1296670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public void onDestroy() {
1307cdc4906fc5852297a9a254c3251ad2f4dead6eeMichael Kolb        hideTitleBar();
1316670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
1326670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
1336670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    void stopWebViewScrolling() {
134b9a051bd9ed974c4d3d29a549bb7e00d8a95c33cJohn Reck        BrowserWebView web = (BrowserWebView) mUiController.getCurrentWebView();
1356670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        if (web != null) {
1366670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb            web.stopScroll();
1376670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        }
1386670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
1396670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
1406670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    // WebView callbacks
1416670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
1426670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
14330c714c853a4239e72ab1e238ce2a92472d06ab0John Reck    public void onProgressChanged(Tab tab) {
14430c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        int progress = tab.getLoadProgress();
1456670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        mTabBar.onProgress(tab, progress);
1466670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        if (tab.inForeground()) {
1477cdc4906fc5852297a9a254c3251ad2f4dead6eeMichael Kolb            mTitleBar.setProgress(progress);
1486670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        }
1496670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
1506670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
1516670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
1526670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public void addTab(Tab tab) {
1536670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        mTabBar.onNewTab(tab);
1548814d738ad840ea66f0e5a4733f53f2e3bd8d0ebMichael Kolb    }
1558814d738ad840ea66f0e5a4733f53f2e3bd8d0ebMichael Kolb
1568814d738ad840ea66f0e5a4733f53f2e3bd8d0ebMichael Kolb    protected void onAddTabCompleted(Tab tab) {
157376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        checkTabCount();
1586670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
1596670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
1606670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
161377ea31324391e7878f6f5b7a991c74988c18403Michael Kolb    public void setActiveTab(final Tab tab) {
16246f987eca738a36e2c8382aaec6c7ef2ae2482aeMichael Kolb        mTitleBar.cancelTitleBarAnimation(true);
16346f987eca738a36e2c8382aaec6c7ef2ae2482aeMichael Kolb        mTitleBar.setSkipTitleBarAnimations(true);
1645d43ce897758b7cb5deadc1203717b965334784cJohn Reck        super.setActiveTab(tab);
165b9a051bd9ed974c4d3d29a549bb7e00d8a95c33cJohn Reck        BrowserWebView view = (BrowserWebView) tab.getWebView();
166376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        // TabControl.setCurrentTab has been called before this,
167376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        // so the tab is guaranteed to have a webview
168376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        if (view == null) {
169376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            Log.e(LOGTAG, "active tab with no webview detected");
170376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            return;
171376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        }
172376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        // Request focus on the top window.
173376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        if (mUseQuickControls) {
174376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            mPieControl.forceToTop(mContentView);
175376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        } else {
176377ea31324391e7878f6f5b7a991c74988c18403Michael Kolb            // check if title bar is already attached by animation
1770f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            if (mTitleBar.getParent() == null) {
178377ea31324391e7878f6f5b7a991c74988c18403Michael Kolb                view.setEmbeddedTitleBar(mTitleBar);
179377ea31324391e7878f6f5b7a991c74988c18403Michael Kolb            }
180376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        }
1816670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        mTabBar.onSetActiveTab(tab);
182376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        if (tab.isInVoiceSearchMode()) {
18311d1978d8d16004598347abc93918b54a5ef760bMichael Kolb            showVoiceTitleBar(tab.getVoiceDisplayTitle(), tab.getVoiceSearchResults());
184376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        } else {
185376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            revertVoiceTitleBar(tab);
186376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        }
187376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        updateLockIconToLatest(tab);
188376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        tab.getTopWindow().requestFocus();
1895d43ce897758b7cb5deadc1203717b965334784cJohn Reck        mTitleBar.setSkipTitleBarAnimations(false);
1906670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
1916670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
1926670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
1936670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public void updateTabs(List<Tab> tabs) {
1946670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        mTabBar.updateTabs(tabs);
195376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        checkTabCount();
1966670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
1976670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
1986670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
1996670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public void removeTab(Tab tab) {
20046f987eca738a36e2c8382aaec6c7ef2ae2482aeMichael Kolb        mTitleBar.cancelTitleBarAnimation(true);
20146f987eca738a36e2c8382aaec6c7ef2ae2482aeMichael Kolb        mTitleBar.setSkipTitleBarAnimations(true);
2026670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        super.removeTab(tab);
2036670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        mTabBar.onRemoveTab(tab);
20446f987eca738a36e2c8382aaec6c7ef2ae2482aeMichael Kolb        mTitleBar.setSkipTitleBarAnimations(false);
2058814d738ad840ea66f0e5a4733f53f2e3bd8d0ebMichael Kolb    }
2068814d738ad840ea66f0e5a4733f53f2e3bd8d0ebMichael Kolb
2078814d738ad840ea66f0e5a4733f53f2e3bd8d0ebMichael Kolb    protected void onRemoveTabCompleted(Tab tab) {
208376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        checkTabCount();
2096670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
2106670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
211376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    int getContentWidth() {
212376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        if (mContentView != null) {
213376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            return mContentView.getWidth();
2146670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        }
2156670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        return 0;
2166670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
2176670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
218dc2ee1bfb50b7bec0cf3215e3d298b246dc71101Michael Kolb    @Override
219dc2ee1bfb50b7bec0cf3215e3d298b246dc71101Michael Kolb    public void editUrl(boolean clearInput) {
22046f987eca738a36e2c8382aaec6c7ef2ae2482aeMichael Kolb        if (mUseQuickControls) {
2210f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mTitleBar.setShowProgressOnly(false);
222d72ea3bbab2a745a901c5bc18247c12fe8cfc0b4Michael Kolb        }
22346f987eca738a36e2c8382aaec6c7ef2ae2482aeMichael Kolb        super.editUrl(clearInput);
224376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    }
225376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb
2267cdc4906fc5852297a9a254c3251ad2f4dead6eeMichael Kolb    void stopEditingUrl() {
2270f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mTitleBar.getNavigationBar().stopEditingUrl();
228376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    }
229376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb
2306670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
2317cdc4906fc5852297a9a254c3251ad2f4dead6eeMichael Kolb    protected void showTitleBar() {
2327cdc4906fc5852297a9a254c3251ad2f4dead6eeMichael Kolb        if (canShowTitleBar()) {
23346f987eca738a36e2c8382aaec6c7ef2ae2482aeMichael Kolb            mTitleBar.show();
2347cdc4906fc5852297a9a254c3251ad2f4dead6eeMichael Kolb        }
2356670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
2366670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
2376670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
2387cdc4906fc5852297a9a254c3251ad2f4dead6eeMichael Kolb    protected void hideTitleBar() {
2397cdc4906fc5852297a9a254c3251ad2f4dead6eeMichael Kolb        if (isTitleBarShowing()) {
24046f987eca738a36e2c8382aaec6c7ef2ae2482aeMichael Kolb            mTitleBar.hide();
2416e8d2e9d32bc03ecd5ee2efffb0df260d10533d4John Reck        }
242e5c21d900adadbae92fb395d3dce44a75e90a9e7John Reck    }
243e5c21d900adadbae92fb395d3dce44a75e90a9e7John Reck
2446670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
2452a56ecaf153d788a1acebc54b670347a1a58d693Michael Kolb    protected void setTitleGravity(int gravity) {
24646f987eca738a36e2c8382aaec6c7ef2ae2482aeMichael Kolb        if (!mUseQuickControls) {
2472a56ecaf153d788a1acebc54b670347a1a58d693Michael Kolb            super.setTitleGravity(gravity);
2482a56ecaf153d788a1acebc54b670347a1a58d693Michael Kolb        }
2492a56ecaf153d788a1acebc54b670347a1a58d693Michael Kolb    }
2502a56ecaf153d788a1acebc54b670347a1a58d693Michael Kolb
2516670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    // action mode callbacks
2526670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
2536670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
2546670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public void onActionModeStarted(ActionMode mode) {
2557cdc4906fc5852297a9a254c3251ad2f4dead6eeMichael Kolb        if (!mTitleBar.isEditingUrl()) {
2566670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb            // hide the fake title bar when CAB is shown
2577cdc4906fc5852297a9a254c3251ad2f4dead6eeMichael Kolb            hideTitleBar();
2586670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        }
2596670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
2606670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
2616670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
262376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    public void onActionModeFinished(boolean inLoad) {
263376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        checkTabCount();
264376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        if (inLoad) {
265376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            // the titlebar was removed when the CAB was shown
266376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            // if the page is loading, show it again
2671544f3b7494955d8a33b307fb2a96dd1841942c0Michael Kolb            if (mUseQuickControls) {
2681544f3b7494955d8a33b307fb2a96dd1841942c0Michael Kolb                mTitleBar.setShowProgressOnly(true);
269376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            }
2707cdc4906fc5852297a9a254c3251ad2f4dead6eeMichael Kolb            showTitleBar();
271376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        }
272376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    }
273376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb
274376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    @Override
2755a72f1858c2f73be3558c6cdaa2c84b4c36fa748Michael Kolb    protected void updateNavigationState(Tab tab) {
2760f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mNavBar.updateNavigationState(tab);
2775a72f1858c2f73be3558c6cdaa2c84b4c36fa748Michael Kolb    }
2785a72f1858c2f73be3558c6cdaa2c84b4c36fa748Michael Kolb
2795a72f1858c2f73be3558c6cdaa2c84b4c36fa748Michael Kolb    @Override
28030c714c853a4239e72ab1e238ce2a92472d06ab0John Reck    public void setUrlTitle(Tab tab) {
28130c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        super.setUrlTitle(tab);
28230c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        mTabBar.onUrlAndTitle(tab, tab.getUrl(), tab.getTitle());
2836670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
2846670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
2856670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    // Set the favicon in the title bar.
2866670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
28730c714c853a4239e72ab1e238ce2a92472d06ab0John Reck    public void setFavicon(Tab tab) {
28830c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        super.setFavicon(tab);
28930c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        mTabBar.onFavicon(tab, tab.getFavicon());
2906670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
2916670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
292cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb    @Override
2932d4f1e2553dee6bce5a12162ff6d4459babe2512Derek Sollenberger    public void showCustomView(View view, int requestedOrientation,
2942d4f1e2553dee6bce5a12162ff6d4459babe2512Derek Sollenberger            CustomViewCallback callback) {
2952d4f1e2553dee6bce5a12162ff6d4459babe2512Derek Sollenberger        super.showCustomView(view, requestedOrientation, callback);
296d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck        mActivity.getActionBar().hide();
297d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck    }
298cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb
299d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck    @Override
300d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck    public void onHideCustomView() {
301d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck        super.onHideCustomView();
302d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck        if (mUseQuickControls) {
303d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck            checkTabCount();
304d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck        } else {
305d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck            mActivity.getActionBar().show();
306d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck        }
307d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck    }
308a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb
309a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb    @Override
310a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb    public boolean dispatchKey(int code, KeyEvent event) {
311dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb        if (mActiveTab != null) {
312dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb            WebView web = mActiveTab.getWebView();
313dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb            if (event.getAction() == KeyEvent.ACTION_DOWN) {
314dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb                switch (code) {
315dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb                    case KeyEvent.KEYCODE_TAB:
316dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb                    case KeyEvent.KEYCODE_DPAD_UP:
317dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb                    case KeyEvent.KEYCODE_DPAD_LEFT:
318dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb                        if ((web != null) && web.hasFocus() && !mTitleBar.hasFocus()) {
319dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb                            editUrl(false);
320dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb                            return true;
321dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb                        }
322dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb                }
323dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb                boolean ctrl = event.hasModifiers(KeyEvent.META_CTRL_ON);
324dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb                if (!ctrl && isTypingKey(event) && !mTitleBar.isEditingUrl()) {
325dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb                    editUrl(true);
326dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb                    return mContentView.dispatchKeyEvent(event);
327dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb                }
328dc2ee1bfb50b7bec0cf3215e3d298b246dc71101Michael Kolb            }
329a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb        }
330a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb        return false;
331a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb    }
332a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb
333dc2ee1bfb50b7bec0cf3215e3d298b246dc71101Michael Kolb    private boolean isTypingKey(KeyEvent evt) {
334dc2ee1bfb50b7bec0cf3215e3d298b246dc71101Michael Kolb        return evt.getUnicodeChar() > 0;
335dc2ee1bfb50b7bec0cf3215e3d298b246dc71101Michael Kolb    }
336dc2ee1bfb50b7bec0cf3215e3d298b246dc71101Michael Kolb
337dc2ee1bfb50b7bec0cf3215e3d298b246dc71101Michael Kolb    TabBar getTabBar() {
338dc2ee1bfb50b7bec0cf3215e3d298b246dc71101Michael Kolb        return mTabBar;
339dc2ee1bfb50b7bec0cf3215e3d298b246dc71101Michael Kolb    }
340dc2ee1bfb50b7bec0cf3215e3d298b246dc71101Michael Kolb
3411cf4b79a0020bc18c83ca8bde0e318ecd5252bc2John Reck    @Override
3421cf4b79a0020bc18c83ca8bde0e318ecd5252bc2John Reck    public boolean shouldCaptureThumbnails() {
3431cf4b79a0020bc18c83ca8bde0e318ecd5252bc2John Reck        return mUseQuickControls;
3441cf4b79a0020bc18c83ca8bde0e318ecd5252bc2John Reck    }
3451cf4b79a0020bc18c83ca8bde0e318ecd5252bc2John Reck
3466670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb}
347