1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.browser; 18 19 import android.app.ActionBar; 20 import android.app.Activity; 21 import android.content.res.Resources; 22 import android.graphics.Bitmap; 23 import android.graphics.drawable.BitmapDrawable; 24 import android.graphics.drawable.Drawable; 25 import android.graphics.drawable.LayerDrawable; 26 import android.graphics.drawable.PaintDrawable; 27 import android.os.Bundle; 28 import android.os.Handler; 29 import android.util.Log; 30 import android.view.ActionMode; 31 import android.view.KeyEvent; 32 import android.view.Menu; 33 import android.view.MenuItem; 34 import android.webkit.WebView; 35 36 import java.util.List; 37 38 /** 39 * Ui for xlarge screen sizes 40 */ 41 public class XLargeUi extends BaseUi { 42 43 private static final String LOGTAG = "XLargeUi"; 44 45 private PaintDrawable mFaviconBackground; 46 47 private ActionBar mActionBar; 48 private TabBar mTabBar; 49 50 private NavigationBarTablet mNavBar; 51 52 private Handler mHandler; 53 54 /** 55 * @param browser 56 * @param controller 57 */ 58 public XLargeUi(Activity browser, UiController controller) { 59 super(browser, controller); 60 mHandler = new Handler(); 61 mNavBar = (NavigationBarTablet) mTitleBar.getNavigationBar(); 62 mTabBar = new TabBar(mActivity, mUiController, this); 63 mActionBar = mActivity.getActionBar(); 64 setupActionBar(); 65 setUseQuickControls(BrowserSettings.getInstance().useQuickControls()); 66 } 67 68 private void setupActionBar() { 69 mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 70 mActionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 71 mActionBar.setCustomView(mTabBar); 72 } 73 74 public void showComboView(ComboViews startWith, Bundle extras) { 75 super.showComboView(startWith, extras); 76 if (mUseQuickControls) { 77 mActionBar.show(); 78 } 79 } 80 81 @Override 82 public void setUseQuickControls(boolean useQuickControls) { 83 super.setUseQuickControls(useQuickControls); 84 checkHideActionBar(); 85 if (!useQuickControls) { 86 mActionBar.show(); 87 } 88 mTabBar.setUseQuickControls(mUseQuickControls); 89 // We need to update the tabs with this change 90 for (Tab t : mTabControl.getTabs()) { 91 t.updateShouldCaptureThumbnails(); 92 } 93 } 94 95 private void checkHideActionBar() { 96 if (mUseQuickControls) { 97 mHandler.post(new Runnable() { 98 public void run() { 99 mActionBar.hide(); 100 } 101 }); 102 } 103 } 104 105 @Override 106 public void onResume() { 107 super.onResume(); 108 mNavBar.clearCompletions(); 109 checkHideActionBar(); 110 } 111 112 @Override 113 public void onDestroy() { 114 hideTitleBar(); 115 } 116 117 void stopWebViewScrolling() { 118 BrowserWebView web = (BrowserWebView) mUiController.getCurrentWebView(); 119 } 120 121 @Override 122 public boolean onPrepareOptionsMenu(Menu menu) { 123 MenuItem bm = menu.findItem(R.id.bookmarks_menu_id); 124 if (bm != null) { 125 bm.setVisible(false); 126 } 127 return true; 128 } 129 130 131 // WebView callbacks 132 133 @Override 134 public void addTab(Tab tab) { 135 mTabBar.onNewTab(tab); 136 } 137 138 protected void onAddTabCompleted(Tab tab) { 139 checkHideActionBar(); 140 } 141 142 @Override 143 public void setActiveTab(final Tab tab) { 144 mTitleBar.cancelTitleBarAnimation(true); 145 mTitleBar.setSkipTitleBarAnimations(true); 146 super.setActiveTab(tab); 147 BrowserWebView view = (BrowserWebView) tab.getWebView(); 148 // TabControl.setCurrentTab has been called before this, 149 // so the tab is guaranteed to have a webview 150 if (view == null) { 151 Log.e(LOGTAG, "active tab with no webview detected"); 152 return; 153 } 154 mTabBar.onSetActiveTab(tab); 155 updateLockIconToLatest(tab); 156 mTitleBar.setSkipTitleBarAnimations(false); 157 } 158 159 @Override 160 public void updateTabs(List<Tab> tabs) { 161 mTabBar.updateTabs(tabs); 162 checkHideActionBar(); 163 } 164 165 @Override 166 public void removeTab(Tab tab) { 167 mTitleBar.cancelTitleBarAnimation(true); 168 mTitleBar.setSkipTitleBarAnimations(true); 169 super.removeTab(tab); 170 mTabBar.onRemoveTab(tab); 171 mTitleBar.setSkipTitleBarAnimations(false); 172 } 173 174 protected void onRemoveTabCompleted(Tab tab) { 175 checkHideActionBar(); 176 } 177 178 int getContentWidth() { 179 if (mContentView != null) { 180 return mContentView.getWidth(); 181 } 182 return 0; 183 } 184 185 @Override 186 public void editUrl(boolean clearInput, boolean forceIME) { 187 if (mUseQuickControls) { 188 mTitleBar.setShowProgressOnly(false); 189 } 190 super.editUrl(clearInput, forceIME); 191 } 192 193 // action mode callbacks 194 195 @Override 196 public void onActionModeStarted(ActionMode mode) { 197 if (!mTitleBar.isEditingUrl()) { 198 // hide the title bar when CAB is shown 199 hideTitleBar(); 200 } 201 } 202 203 @Override 204 public void onActionModeFinished(boolean inLoad) { 205 checkHideActionBar(); 206 if (inLoad) { 207 // the titlebar was removed when the CAB was shown 208 // if the page is loading, show it again 209 if (mUseQuickControls) { 210 mTitleBar.setShowProgressOnly(true); 211 } 212 showTitleBar(); 213 } 214 } 215 216 @Override 217 protected void updateNavigationState(Tab tab) { 218 mNavBar.updateNavigationState(tab); 219 } 220 221 @Override 222 public void setUrlTitle(Tab tab) { 223 super.setUrlTitle(tab); 224 mTabBar.onUrlAndTitle(tab, tab.getUrl(), tab.getTitle()); 225 } 226 227 // Set the favicon in the title bar. 228 @Override 229 public void setFavicon(Tab tab) { 230 super.setFavicon(tab); 231 mTabBar.onFavicon(tab, tab.getFavicon()); 232 } 233 234 @Override 235 public void onHideCustomView() { 236 super.onHideCustomView(); 237 checkHideActionBar(); 238 } 239 240 @Override 241 public boolean dispatchKey(int code, KeyEvent event) { 242 if (mActiveTab != null) { 243 WebView web = mActiveTab.getWebView(); 244 if (event.getAction() == KeyEvent.ACTION_DOWN) { 245 switch (code) { 246 case KeyEvent.KEYCODE_TAB: 247 case KeyEvent.KEYCODE_DPAD_UP: 248 case KeyEvent.KEYCODE_DPAD_LEFT: 249 if ((web != null) && web.hasFocus() && !mTitleBar.hasFocus()) { 250 editUrl(false, false); 251 return true; 252 } 253 } 254 boolean ctrl = event.hasModifiers(KeyEvent.META_CTRL_ON); 255 if (!ctrl && isTypingKey(event) && !mTitleBar.isEditingUrl()) { 256 editUrl(true, false); 257 return mContentView.dispatchKeyEvent(event); 258 } 259 } 260 } 261 return false; 262 } 263 264 private boolean isTypingKey(KeyEvent evt) { 265 return evt.getUnicodeChar() > 0; 266 } 267 268 TabBar getTabBar() { 269 return mTabBar; 270 } 271 272 @Override 273 public boolean shouldCaptureThumbnails() { 274 return mUseQuickControls; 275 } 276 277 private Drawable getFaviconBackground() { 278 if (mFaviconBackground == null) { 279 mFaviconBackground = new PaintDrawable(); 280 Resources res = mActivity.getResources(); 281 mFaviconBackground.getPaint().setColor( 282 res.getColor(R.color.tabFaviconBackground)); 283 mFaviconBackground.setCornerRadius( 284 res.getDimension(R.dimen.tab_favicon_corner_radius)); 285 } 286 return mFaviconBackground; 287 } 288 289 @Override 290 public Drawable getFaviconDrawable(Bitmap icon) { 291 Drawable[] array = new Drawable[2]; 292 array[0] = getFaviconBackground(); 293 if (icon == null) { 294 array[1] = mGenericFavicon; 295 } else { 296 array[1] = new BitmapDrawable(mActivity.getResources(), icon); 297 } 298 LayerDrawable d = new LayerDrawable(array); 299 d.setLayerInset(1, 2, 2, 2, 2); 300 return d; 301 } 302 303 } 304