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