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