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;
21034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reckimport android.content.res.Resources;
22034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reckimport android.graphics.Bitmap;
23034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reckimport android.graphics.drawable.BitmapDrawable;
24034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reckimport android.graphics.drawable.Drawable;
25034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reckimport android.graphics.drawable.LayerDrawable;
26034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reckimport android.graphics.drawable.PaintDrawable;
27ac35bdc798173ca536e57c1e4541cef11d78983aMichael Kolbimport android.os.Bundle;
28ba23870babf7041e72f7d1119ad59d9bb32c6634Michael Kolbimport android.os.Handler;
29376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolbimport android.util.Log;
306670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolbimport android.view.ActionMode;
31376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolbimport android.view.Gravity;
32a418306e08e008da99cef929c48e05d2a101ceafMichael Kolbimport android.view.KeyEvent;
330d0245ffd51825f90a9df883667a71e500da03faMichael Kolbimport android.view.Menu;
340d0245ffd51825f90a9df883667a71e500da03faMichael Kolbimport android.view.MenuItem;
35d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reckimport android.view.View;
3652051eb9ec50f0d7375557996fc3b44c3896e5a1Michael Kolbimport android.view.ViewGroup;
37d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reckimport android.webkit.WebChromeClient.CustomViewCallback;
386670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolbimport android.webkit.WebView;
396670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
406670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolbimport java.util.List;
416670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
426670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb/**
436670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb * Ui for xlarge screen sizes
446670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb */
45b14ff2febe4b6a07a73c875858437c89cf43fc72Michael Kolbpublic class XLargeUi extends BaseUi {
466670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
476670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    private static final String LOGTAG = "XLargeUi";
486670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
49034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reck    private PaintDrawable mFaviconBackground;
50034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reck
51376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    private ActionBar mActionBar;
526670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    private TabBar mTabBar;
536670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
540f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private NavigationBarTablet mNavBar;
556670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
560241e7556501caae1f57d2bdf3677d7e4a619eb0Michael Kolb    private PieControlXLarge mPieControl;
57ba23870babf7041e72f7d1119ad59d9bb32c6634Michael Kolb    private Handler mHandler;
58376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb
596670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    /**
606670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb     * @param browser
616670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb     * @param controller
626670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb     */
636670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public XLargeUi(Activity browser, UiController controller) {
646670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        super(browser, controller);
65ba23870babf7041e72f7d1119ad59d9bb32c6634Michael Kolb        mHandler = new Handler();
660f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mNavBar = (NavigationBarTablet) mTitleBar.getNavigationBar();
676670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        mTabBar = new TabBar(mActivity, mUiController, this);
68376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        mActionBar = mActivity.getActionBar();
69b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck        setupActionBar();
70b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck        setUseQuickControls(BrowserSettings.getInstance().useQuickControls());
71b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck    }
72b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck
73b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck    private void setupActionBar() {
74b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck        mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
75376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        mActionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
76376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        mActionBar.setCustomView(mTabBar);
77b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck    }
78b3417f0a68a1efc64604ea354ae7f856ce79cb16John Reck
792bc8042224be51966d748b870768ec1b376a1621John Reck    public void showComboView(ComboViews startWith, Bundle extras) {
802bc8042224be51966d748b870768ec1b376a1621John Reck        super.showComboView(startWith, extras);
81ac35bdc798173ca536e57c1e4541cef11d78983aMichael Kolb        if (mUseQuickControls) {
82ac35bdc798173ca536e57c1e4541cef11d78983aMichael Kolb            mActionBar.show();
83ac35bdc798173ca536e57c1e4541cef11d78983aMichael Kolb        }
84ac35bdc798173ca536e57c1e4541cef11d78983aMichael Kolb    }
85ac35bdc798173ca536e57c1e4541cef11d78983aMichael Kolb
86ac35bdc798173ca536e57c1e4541cef11d78983aMichael Kolb    @Override
870241e7556501caae1f57d2bdf3677d7e4a619eb0Michael Kolb    public void setUseQuickControls(boolean useQuickControls) {
88376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        mUseQuickControls = useQuickControls;
897cdc4906fc5852297a9a254c3251ad2f4dead6eeMichael Kolb        mTitleBar.setUseQuickControls(mUseQuickControls);
90376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        if (useQuickControls) {
91376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            checkTabCount();
920241e7556501caae1f57d2bdf3677d7e4a619eb0Michael Kolb            mPieControl = new PieControlXLarge(mActivity, mUiController, this);
93376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            mPieControl.attachToContainer(mContentView);
9446f987eca738a36e2c8382aaec6c7ef2ae2482aeMichael Kolb            WebView web = getWebView();
9546f987eca738a36e2c8382aaec6c7ef2ae2482aeMichael Kolb            if (web != null) {
9646f987eca738a36e2c8382aaec6c7ef2ae2482aeMichael Kolb                web.setEmbeddedTitleBar(null);
970241e7556501caae1f57d2bdf3677d7e4a619eb0Michael Kolb
98376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            }
99376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        } else {
100376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            mActivity.getActionBar().show();
101376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            if (mPieControl != null) {
102376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb                mPieControl.removeFromContainer(mContentView);
103376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            }
10446f987eca738a36e2c8382aaec6c7ef2ae2482aeMichael Kolb            WebView web = getWebView();
1057cdc4906fc5852297a9a254c3251ad2f4dead6eeMichael Kolb            if (web != null) {
10652051eb9ec50f0d7375557996fc3b44c3896e5a1Michael Kolb                if (mTitleBar.getParent() != null) {
10752051eb9ec50f0d7375557996fc3b44c3896e5a1Michael Kolb                    ViewGroup p = (ViewGroup) mTitleBar.getParent();
10852051eb9ec50f0d7375557996fc3b44c3896e5a1Michael Kolb                    p.removeView(mTitleBar);
10952051eb9ec50f0d7375557996fc3b44c3896e5a1Michael Kolb                }
110376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb                web.setEmbeddedTitleBar(mTitleBar);
111376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            }
1128a4c38243de9d19162c883d3b20df65f8bcba81aMichael Kolb            setTitleGravity(Gravity.NO_GRAVITY);
113376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        }
114376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        mTabBar.setUseQuickControls(mUseQuickControls);
1151cf4b79a0020bc18c83ca8bde0e318ecd5252bc2John Reck        // We need to update the tabs with this change
1161cf4b79a0020bc18c83ca8bde0e318ecd5252bc2John Reck        for (Tab t : mTabControl.getTabs()) {
1171cf4b79a0020bc18c83ca8bde0e318ecd5252bc2John Reck            t.updateShouldCaptureThumbnails();
1181cf4b79a0020bc18c83ca8bde0e318ecd5252bc2John Reck        }
119718a24d6c9671fe2da4112a3b5f30fd3939b38e8John Reck        updateUrlBarAutoShowManagerTarget();
120376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    }
121376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb
122376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    private void checkTabCount() {
123376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        if (mUseQuickControls) {
124eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb            mHandler.post(new Runnable() {
125eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb                public void run() {
126eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb                    mActionBar.hide();
127eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb                }
128eb95db48b01b3db935601f25bd1a2358674b76daMichael Kolb            });
129376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        }
1306670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
1316670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
1326670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
13367b8c1b4336a77414c74bce6152495502d4bde04Narayan Kamath    public void onResume() {
13467b8c1b4336a77414c74bce6152495502d4bde04Narayan Kamath        super.onResume();
135f3174a588cdf63ef59055998c23aad4b36b7856eNarayan Kamath        mNavBar.clearCompletions();
13667b8c1b4336a77414c74bce6152495502d4bde04Narayan Kamath    }
13767b8c1b4336a77414c74bce6152495502d4bde04Narayan Kamath
13867b8c1b4336a77414c74bce6152495502d4bde04Narayan Kamath    @Override
1396670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public void onDestroy() {
1407cdc4906fc5852297a9a254c3251ad2f4dead6eeMichael Kolb        hideTitleBar();
1416670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
1426670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
1436670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    void stopWebViewScrolling() {
144b9a051bd9ed974c4d3d29a549bb7e00d8a95c33cJohn Reck        BrowserWebView web = (BrowserWebView) mUiController.getCurrentWebView();
1456670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        if (web != null) {
1466670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb            web.stopScroll();
1476670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        }
1486670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
1496670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
1500d0245ffd51825f90a9df883667a71e500da03faMichael Kolb    @Override
1510d0245ffd51825f90a9df883667a71e500da03faMichael Kolb    public boolean onPrepareOptionsMenu(Menu menu) {
1520d0245ffd51825f90a9df883667a71e500da03faMichael Kolb        MenuItem bm = menu.findItem(R.id.bookmarks_menu_id);
1530d0245ffd51825f90a9df883667a71e500da03faMichael Kolb        if (bm != null) {
1540d0245ffd51825f90a9df883667a71e500da03faMichael Kolb            bm.setVisible(false);
1550d0245ffd51825f90a9df883667a71e500da03faMichael Kolb        }
1560d0245ffd51825f90a9df883667a71e500da03faMichael Kolb        return true;
1570d0245ffd51825f90a9df883667a71e500da03faMichael Kolb    }
1580d0245ffd51825f90a9df883667a71e500da03faMichael Kolb
1590d0245ffd51825f90a9df883667a71e500da03faMichael Kolb
1606670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    // WebView callbacks
1616670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
1626670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
16330c714c853a4239e72ab1e238ce2a92472d06ab0John Reck    public void onProgressChanged(Tab tab) {
16430c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        int progress = tab.getLoadProgress();
1656670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        mTabBar.onProgress(tab, progress);
1666670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        if (tab.inForeground()) {
1677cdc4906fc5852297a9a254c3251ad2f4dead6eeMichael Kolb            mTitleBar.setProgress(progress);
1686670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        }
1696670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
1706670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
1716670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
1726670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public void addTab(Tab tab) {
1736670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        mTabBar.onNewTab(tab);
1748814d738ad840ea66f0e5a4733f53f2e3bd8d0ebMichael Kolb    }
1758814d738ad840ea66f0e5a4733f53f2e3bd8d0ebMichael Kolb
1768814d738ad840ea66f0e5a4733f53f2e3bd8d0ebMichael Kolb    protected void onAddTabCompleted(Tab tab) {
177376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        checkTabCount();
1786670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
1796670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
1806670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
181377ea31324391e7878f6f5b7a991c74988c18403Michael Kolb    public void setActiveTab(final Tab tab) {
18246f987eca738a36e2c8382aaec6c7ef2ae2482aeMichael Kolb        mTitleBar.cancelTitleBarAnimation(true);
18346f987eca738a36e2c8382aaec6c7ef2ae2482aeMichael Kolb        mTitleBar.setSkipTitleBarAnimations(true);
1845d43ce897758b7cb5deadc1203717b965334784cJohn Reck        super.setActiveTab(tab);
185b9a051bd9ed974c4d3d29a549bb7e00d8a95c33cJohn Reck        BrowserWebView view = (BrowserWebView) tab.getWebView();
186376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        // TabControl.setCurrentTab has been called before this,
187376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        // so the tab is guaranteed to have a webview
188376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        if (view == null) {
189376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            Log.e(LOGTAG, "active tab with no webview detected");
190376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            return;
191376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        }
192376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        // Request focus on the top window.
193376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        if (mUseQuickControls) {
194376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            mPieControl.forceToTop(mContentView);
195376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        } else {
196377ea31324391e7878f6f5b7a991c74988c18403Michael Kolb            // check if title bar is already attached by animation
1970f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            if (mTitleBar.getParent() == null) {
198377ea31324391e7878f6f5b7a991c74988c18403Michael Kolb                view.setEmbeddedTitleBar(mTitleBar);
199377ea31324391e7878f6f5b7a991c74988c18403Michael Kolb            }
200376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        }
2016670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        mTabBar.onSetActiveTab(tab);
202376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        if (tab.isInVoiceSearchMode()) {
20311d1978d8d16004598347abc93918b54a5ef760bMichael Kolb            showVoiceTitleBar(tab.getVoiceDisplayTitle(), tab.getVoiceSearchResults());
204376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        } else {
205376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            revertVoiceTitleBar(tab);
206376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        }
207376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        updateLockIconToLatest(tab);
208376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        tab.getTopWindow().requestFocus();
2095d43ce897758b7cb5deadc1203717b965334784cJohn Reck        mTitleBar.setSkipTitleBarAnimations(false);
2106670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
2116670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
2126670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
2136670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public void updateTabs(List<Tab> tabs) {
2146670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        mTabBar.updateTabs(tabs);
215376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        checkTabCount();
2166670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
2176670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
2186670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
2196670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public void removeTab(Tab tab) {
22046f987eca738a36e2c8382aaec6c7ef2ae2482aeMichael Kolb        mTitleBar.cancelTitleBarAnimation(true);
22146f987eca738a36e2c8382aaec6c7ef2ae2482aeMichael Kolb        mTitleBar.setSkipTitleBarAnimations(true);
2226670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        super.removeTab(tab);
2236670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        mTabBar.onRemoveTab(tab);
22446f987eca738a36e2c8382aaec6c7ef2ae2482aeMichael Kolb        mTitleBar.setSkipTitleBarAnimations(false);
2258814d738ad840ea66f0e5a4733f53f2e3bd8d0ebMichael Kolb    }
2268814d738ad840ea66f0e5a4733f53f2e3bd8d0ebMichael Kolb
2278814d738ad840ea66f0e5a4733f53f2e3bd8d0ebMichael Kolb    protected void onRemoveTabCompleted(Tab tab) {
228376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        checkTabCount();
2296670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
2306670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
231376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    int getContentWidth() {
232376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        if (mContentView != null) {
233376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            return mContentView.getWidth();
2346670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        }
2356670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        return 0;
2366670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
2376670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
238dc2ee1bfb50b7bec0cf3215e3d298b246dc71101Michael Kolb    @Override
239dc2ee1bfb50b7bec0cf3215e3d298b246dc71101Michael Kolb    public void editUrl(boolean clearInput) {
24046f987eca738a36e2c8382aaec6c7ef2ae2482aeMichael Kolb        if (mUseQuickControls) {
2410f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mTitleBar.setShowProgressOnly(false);
242d72ea3bbab2a745a901c5bc18247c12fe8cfc0b4Michael Kolb        }
24346f987eca738a36e2c8382aaec6c7ef2ae2482aeMichael Kolb        super.editUrl(clearInput);
244376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    }
245376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb
2467cdc4906fc5852297a9a254c3251ad2f4dead6eeMichael Kolb    void stopEditingUrl() {
2470f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mTitleBar.getNavigationBar().stopEditingUrl();
248376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    }
249376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb
2506670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
2517cdc4906fc5852297a9a254c3251ad2f4dead6eeMichael Kolb    protected void showTitleBar() {
2527cdc4906fc5852297a9a254c3251ad2f4dead6eeMichael Kolb        if (canShowTitleBar()) {
25346f987eca738a36e2c8382aaec6c7ef2ae2482aeMichael Kolb            mTitleBar.show();
2547cdc4906fc5852297a9a254c3251ad2f4dead6eeMichael Kolb        }
2556670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
2566670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
2576670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
2587cdc4906fc5852297a9a254c3251ad2f4dead6eeMichael Kolb    protected void hideTitleBar() {
2597cdc4906fc5852297a9a254c3251ad2f4dead6eeMichael Kolb        if (isTitleBarShowing()) {
26046f987eca738a36e2c8382aaec6c7ef2ae2482aeMichael Kolb            mTitleBar.hide();
2616e8d2e9d32bc03ecd5ee2efffb0df260d10533d4John Reck        }
262e5c21d900adadbae92fb395d3dce44a75e90a9e7John Reck    }
263e5c21d900adadbae92fb395d3dce44a75e90a9e7John Reck
2646670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
2652a56ecaf153d788a1acebc54b670347a1a58d693Michael Kolb    protected void setTitleGravity(int gravity) {
26646f987eca738a36e2c8382aaec6c7ef2ae2482aeMichael Kolb        if (!mUseQuickControls) {
2672a56ecaf153d788a1acebc54b670347a1a58d693Michael Kolb            super.setTitleGravity(gravity);
2682a56ecaf153d788a1acebc54b670347a1a58d693Michael Kolb        }
2692a56ecaf153d788a1acebc54b670347a1a58d693Michael Kolb    }
2702a56ecaf153d788a1acebc54b670347a1a58d693Michael Kolb
2716670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    // action mode callbacks
2726670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
2736670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
2746670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    public void onActionModeStarted(ActionMode mode) {
2757cdc4906fc5852297a9a254c3251ad2f4dead6eeMichael Kolb        if (!mTitleBar.isEditingUrl()) {
276b2e91fdb56c13452c6c5e5fd39ce17e7db323bdcMichael Kolb            // hide the title bar when CAB is shown
2777cdc4906fc5852297a9a254c3251ad2f4dead6eeMichael Kolb            hideTitleBar();
2786670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        }
2796670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
2806670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
2816670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
282376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    public void onActionModeFinished(boolean inLoad) {
283376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        checkTabCount();
284376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        if (inLoad) {
285376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            // the titlebar was removed when the CAB was shown
286376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            // if the page is loading, show it again
2871544f3b7494955d8a33b307fb2a96dd1841942c0Michael Kolb            if (mUseQuickControls) {
2881544f3b7494955d8a33b307fb2a96dd1841942c0Michael Kolb                mTitleBar.setShowProgressOnly(true);
289376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb            }
2907cdc4906fc5852297a9a254c3251ad2f4dead6eeMichael Kolb            showTitleBar();
291376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb        }
292376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    }
293376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb
294376b54116e38b3b94c4d64663d1bff38352b0e59Michael Kolb    @Override
2955a72f1858c2f73be3558c6cdaa2c84b4c36fa748Michael Kolb    protected void updateNavigationState(Tab tab) {
2960f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mNavBar.updateNavigationState(tab);
2975a72f1858c2f73be3558c6cdaa2c84b4c36fa748Michael Kolb    }
2985a72f1858c2f73be3558c6cdaa2c84b4c36fa748Michael Kolb
2995a72f1858c2f73be3558c6cdaa2c84b4c36fa748Michael Kolb    @Override
30030c714c853a4239e72ab1e238ce2a92472d06ab0John Reck    public void setUrlTitle(Tab tab) {
30130c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        super.setUrlTitle(tab);
30230c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        mTabBar.onUrlAndTitle(tab, tab.getUrl(), tab.getTitle());
3036670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
3046670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
3056670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    // Set the favicon in the title bar.
3066670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    @Override
30730c714c853a4239e72ab1e238ce2a92472d06ab0John Reck    public void setFavicon(Tab tab) {
30830c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        super.setFavicon(tab);
30930c714c853a4239e72ab1e238ce2a92472d06ab0John Reck        mTabBar.onFavicon(tab, tab.getFavicon());
3106670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    }
3116670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb
312cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb    @Override
313d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck    public void onHideCustomView() {
314d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck        super.onHideCustomView();
315d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck        if (mUseQuickControls) {
316d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck            checkTabCount();
317d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck        }
318d73c5a2bd0cee6801dce425c31d0c3e027588bcaJohn Reck    }
319a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb
320a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb    @Override
321a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb    public boolean dispatchKey(int code, KeyEvent event) {
322dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb        if (mActiveTab != null) {
323dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb            WebView web = mActiveTab.getWebView();
324dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb            if (event.getAction() == KeyEvent.ACTION_DOWN) {
325dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb                switch (code) {
326dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb                    case KeyEvent.KEYCODE_TAB:
327dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb                    case KeyEvent.KEYCODE_DPAD_UP:
328dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb                    case KeyEvent.KEYCODE_DPAD_LEFT:
329dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb                        if ((web != null) && web.hasFocus() && !mTitleBar.hasFocus()) {
330dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb                            editUrl(false);
331dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb                            return true;
332dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb                        }
333dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb                }
334dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb                boolean ctrl = event.hasModifiers(KeyEvent.META_CTRL_ON);
335dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb                if (!ctrl && isTypingKey(event) && !mTitleBar.isEditingUrl()) {
336dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb                    editUrl(true);
337dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb                    return mContentView.dispatchKeyEvent(event);
338dfe99a1ad8fa39277b0b8279f42e4380db4bf674Michael Kolb                }
339dc2ee1bfb50b7bec0cf3215e3d298b246dc71101Michael Kolb            }
340a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb        }
341a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb        return false;
342a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb    }
343a418306e08e008da99cef929c48e05d2a101ceafMichael Kolb
344dc2ee1bfb50b7bec0cf3215e3d298b246dc71101Michael Kolb    private boolean isTypingKey(KeyEvent evt) {
345dc2ee1bfb50b7bec0cf3215e3d298b246dc71101Michael Kolb        return evt.getUnicodeChar() > 0;
346dc2ee1bfb50b7bec0cf3215e3d298b246dc71101Michael Kolb    }
347dc2ee1bfb50b7bec0cf3215e3d298b246dc71101Michael Kolb
348dc2ee1bfb50b7bec0cf3215e3d298b246dc71101Michael Kolb    TabBar getTabBar() {
349dc2ee1bfb50b7bec0cf3215e3d298b246dc71101Michael Kolb        return mTabBar;
350dc2ee1bfb50b7bec0cf3215e3d298b246dc71101Michael Kolb    }
351dc2ee1bfb50b7bec0cf3215e3d298b246dc71101Michael Kolb
3521cf4b79a0020bc18c83ca8bde0e318ecd5252bc2John Reck    @Override
3531cf4b79a0020bc18c83ca8bde0e318ecd5252bc2John Reck    public boolean shouldCaptureThumbnails() {
3541cf4b79a0020bc18c83ca8bde0e318ecd5252bc2John Reck        return mUseQuickControls;
3551cf4b79a0020bc18c83ca8bde0e318ecd5252bc2John Reck    }
3561cf4b79a0020bc18c83ca8bde0e318ecd5252bc2John Reck
357034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reck    private Drawable getFaviconBackground() {
358034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reck        if (mFaviconBackground == null) {
359034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reck            mFaviconBackground = new PaintDrawable();
360034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reck            Resources res = mActivity.getResources();
361034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reck            mFaviconBackground.getPaint().setColor(
362034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reck                    res.getColor(R.color.tabFaviconBackground));
363034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reck            mFaviconBackground.setCornerRadius(
364034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reck                    res.getDimension(R.dimen.tab_favicon_corner_radius));
365034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reck        }
366034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reck        return mFaviconBackground;
367034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reck    }
368034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reck
369034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reck    @Override
370034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reck    public Drawable getFaviconDrawable(Bitmap icon) {
371034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reck        Drawable[] array = new Drawable[2];
372034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reck        array[0] = getFaviconBackground();
373034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reck        if (icon == null) {
374034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reck            array[1] = mGenericFavicon;
375034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reck        } else {
376034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reck            array[1] = new BitmapDrawable(mActivity.getResources(), icon);
377034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reck        }
378034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reck        LayerDrawable d = new LayerDrawable(array);
379034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reck        d.setLayerInset(1, 2, 2, 2, 2);
380034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reck        return d;
381034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reck    }
382034637c74e84153bd1f7cdd922daaeb9f6af9b8eJohn Reck
3836670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb}
384