blob: 11642af0b0f0e1819cf0233409e14b599d9ae380 [file] [log] [blame]
Michael Kolb66706532010-12-12 19:50:22 -08001/*
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
17package com.android.browser;
18
19import com.android.browser.ScrollWebView.ScrollListener;
20
21import android.app.ActionBar;
22import android.app.Activity;
23import android.graphics.Bitmap;
Michael Kolb376b5412010-12-15 11:52:57 -080024import android.util.Log;
Michael Kolb66706532010-12-12 19:50:22 -080025import android.view.ActionMode;
Michael Kolb376b5412010-12-15 11:52:57 -080026import android.view.Gravity;
Michael Kolb66706532010-12-12 19:50:22 -080027import android.webkit.WebView;
Michael Kolb376b5412010-12-15 11:52:57 -080028import android.widget.FrameLayout;
29import android.widget.FrameLayout.LayoutParams;
Michael Kolb66706532010-12-12 19:50:22 -080030
31import java.util.List;
32
33/**
34 * Ui for xlarge screen sizes
35 */
36public class XLargeUi extends BaseUi implements ScrollListener {
37
38 private static final String LOGTAG = "XLargeUi";
39
Michael Kolb376b5412010-12-15 11:52:57 -080040 private ActionBar mActionBar;
Michael Kolb66706532010-12-12 19:50:22 -080041 private TabBar mTabBar;
42
43 private TitleBarXLarge mTitleBar;
44 private TitleBarXLarge mFakeTitleBar;
45
Michael Kolb376b5412010-12-15 11:52:57 -080046 private boolean mUseQuickControls;
47 private PieControl mPieControl;
48
Michael Kolb66706532010-12-12 19:50:22 -080049 /**
50 * @param browser
51 * @param controller
52 */
53 public XLargeUi(Activity browser, UiController controller) {
54 super(browser, controller);
55 mTitleBar = new TitleBarXLarge(mActivity, mUiController, this);
56 mTitleBar.setProgress(100);
Michael Kolbcfa3af52010-12-14 10:36:11 -080057 mTitleBar.setEditable(false);
Michael Kolb66706532010-12-12 19:50:22 -080058 mFakeTitleBar = new TitleBarXLarge(mActivity, mUiController, this);
Michael Kolbcfa3af52010-12-14 10:36:11 -080059 mFakeTitleBar.setEditable(true);
Michael Kolb66706532010-12-12 19:50:22 -080060 mTabBar = new TabBar(mActivity, mUiController, this);
Michael Kolb376b5412010-12-15 11:52:57 -080061 mActionBar = mActivity.getActionBar();
62 mActionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
63 mActionBar.setCustomView(mTabBar);
64 setUseQuickControls(BrowserSettings.getInstance().useQuickControls());
65 }
66
67 private void setUseQuickControls(boolean useQuickControls) {
68 mUseQuickControls = useQuickControls;
69 if (useQuickControls) {
70 checkTabCount();
71 mPieControl = new PieControl(mActivity, mUiController, this);
72 mPieControl.attachToContainer(mContentView);
73 setFakeTitleBarGravity(Gravity.BOTTOM);
74
75 // remove embedded title bar if present
76 WebView web = mTabControl.getCurrentWebView();
77 if ((web != null) && (web.getVisibleTitleHeight() > 0)) {
78 web.setEmbeddedTitleBar(null);
79 }
80 } else {
81 mActivity.getActionBar().show();
82 if (mPieControl != null) {
83 mPieControl.removeFromContainer(mContentView);
84 }
85 setFakeTitleBarGravity(Gravity.TOP);
86 // remove embedded title bar if present
87 WebView web = mTabControl.getCurrentWebView();
88 if ((web != null) && (web.getVisibleTitleHeight() == 0)) {
89 web.setEmbeddedTitleBar(mTitleBar);
90 }
91 }
92 mTabBar.setUseQuickControls(mUseQuickControls);
93 mFakeTitleBar.setUseQuickControls(mUseQuickControls);
94 }
95
96 private void checkTabCount() {
97 if (mUseQuickControls) {
98 int n = mTabBar.getTabCount();
99 if (n >= 2) {
100 mActivity.getActionBar().show();
101 } else if (n == 1) {
102 mActivity.getActionBar().hide();
103 }
104 }
Michael Kolb66706532010-12-12 19:50:22 -0800105 }
106
107 @Override
108 public void onDestroy() {
109 hideFakeTitleBar();
110 }
111
112 // webview factory
113
114 @Override
115 public WebView createWebView(boolean privateBrowsing) {
116 // Create a new WebView
117 ScrollWebView w = new ScrollWebView(mActivity, null,
118 android.R.attr.webViewStyle, privateBrowsing);
119 initWebViewSettings(w);
120 w.setScrollListener(this);
121 w.getSettings().setDisplayZoomControls(false);
122 return w;
123 }
124
125 @Override
126 public WebView createSubWebView(boolean privateBrowsing) {
127 ScrollWebView web = (ScrollWebView) createWebView(privateBrowsing);
128 // no scroll listener for subview
129 web.setScrollListener(null);
130 return web;
131 }
132
133 @Override
134 public void onScroll(int visibleTitleHeight) {
135 mTabBar.onScroll(visibleTitleHeight);
136 }
137
138 void stopWebViewScrolling() {
139 ScrollWebView web = (ScrollWebView) mUiController.getCurrentWebView();
140 if (web != null) {
141 web.stopScroll();
142 }
143 }
144
145 // WebView callbacks
146
147 @Override
148 public void onPageStarted(Tab tab, String url, Bitmap favicon) {
149 super.onPageStarted(tab, url, favicon);
150 mTabBar.onPageStarted(tab, url, favicon);
151 }
152
153 @Override
154 public void bookmarkedStatusHasChanged(Tab tab) {
155 if (tab.inForeground()) {
156 boolean isBookmark = tab.isBookmarkedSite();
157 mTitleBar.setCurrentUrlIsBookmark(isBookmark);
158 mFakeTitleBar.setCurrentUrlIsBookmark(isBookmark);
159 }
160 }
161
162 @Override
163 public void onPageFinished(Tab tab, String url) {
164 mTabBar.onPageFinished(tab);
165 super.onPageFinished(tab, url);
Michael Kolb376b5412010-12-15 11:52:57 -0800166 if (mUseQuickControls) {
167 mFakeTitleBar.setShowProgressOnly(false);
168 }
Michael Kolb66706532010-12-12 19:50:22 -0800169 }
170
171 @Override
172 public void onProgressChanged(Tab tab, int progress) {
173 mTabBar.onProgress(tab, progress);
174 if (tab.inForeground()) {
175 mFakeTitleBar.setProgress(progress);
176 if (progress == 100) {
Michael Kolbbd018d42010-12-15 15:43:39 -0800177 if (!mFakeTitleBar.isEditingUrl()) {
178 hideFakeTitleBar();
179 if (mUseQuickControls) {
180 mFakeTitleBar.setShowProgressOnly(false);
181 setFakeTitleBarGravity(Gravity.BOTTOM);
182 }
Michael Kolb376b5412010-12-15 11:52:57 -0800183 }
Michael Kolb66706532010-12-12 19:50:22 -0800184 } else {
Michael Kolbbd018d42010-12-15 15:43:39 -0800185 if (mUseQuickControls && !mFakeTitleBar.isEditingUrl()) {
Michael Kolb376b5412010-12-15 11:52:57 -0800186 mFakeTitleBar.setShowProgressOnly(true);
187 if (!isFakeTitleBarShowing()) {
188 setFakeTitleBarGravity(Gravity.TOP);
189 }
190 }
Michael Kolb66706532010-12-12 19:50:22 -0800191 showFakeTitleBar();
192 }
193 }
194 }
195
196 @Override
197 public boolean needsRestoreAllTabs() {
198 return true;
199 }
200
201 @Override
202 public void addTab(Tab tab) {
203 mTabBar.onNewTab(tab);
Michael Kolb376b5412010-12-15 11:52:57 -0800204 checkTabCount();
Michael Kolb66706532010-12-12 19:50:22 -0800205 }
206
207 @Override
208 public void setActiveTab(Tab tab) {
209 super.setActiveTab(tab);
Michael Kolb376b5412010-12-15 11:52:57 -0800210 ScrollWebView view = (ScrollWebView) tab.getWebView();
211 // TabControl.setCurrentTab has been called before this,
212 // so the tab is guaranteed to have a webview
213 if (view == null) {
214 Log.e(LOGTAG, "active tab with no webview detected");
215 return;
216 }
217 // Request focus on the top window.
218 if (mUseQuickControls) {
219 mPieControl.forceToTop(mContentView);
220 view.setScrollListener(null);
221 mTabBar.showTitleBarIndicator(false);
222 } else {
223 view.setEmbeddedTitleBar(mTitleBar);
224 view.setScrollListener(this);
225 }
Michael Kolb66706532010-12-12 19:50:22 -0800226 mTabBar.onSetActiveTab(tab);
Michael Kolb376b5412010-12-15 11:52:57 -0800227 if (tab.isInVoiceSearchMode()) {
228 showVoiceTitleBar(tab.getVoiceDisplayTitle());
229 } else {
230 revertVoiceTitleBar(tab);
231 }
232 resetTitleIconAndProgress(tab);
233 updateLockIconToLatest(tab);
234 tab.getTopWindow().requestFocus();
Michael Kolb66706532010-12-12 19:50:22 -0800235 }
236
237 @Override
238 public void updateTabs(List<Tab> tabs) {
239 mTabBar.updateTabs(tabs);
Michael Kolb376b5412010-12-15 11:52:57 -0800240 checkTabCount();
Michael Kolb66706532010-12-12 19:50:22 -0800241 }
242
243 @Override
244 public void removeTab(Tab tab) {
245 super.removeTab(tab);
246 mTabBar.onRemoveTab(tab);
Michael Kolb376b5412010-12-15 11:52:57 -0800247 checkTabCount();
Michael Kolb66706532010-12-12 19:50:22 -0800248 }
249
Michael Kolb376b5412010-12-15 11:52:57 -0800250 int getContentWidth() {
251 if (mContentView != null) {
252 return mContentView.getWidth();
Michael Kolb66706532010-12-12 19:50:22 -0800253 }
254 return 0;
255 }
256
257 void editUrl(boolean clearInput) {
258 showFakeTitleBar();
259 mFakeTitleBar.onEditUrl(clearInput);
260 }
261
Michael Kolb376b5412010-12-15 11:52:57 -0800262 void setFakeTitleBarGravity(int gravity) {
263 FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams)
264 mFakeTitleBar.getLayoutParams();
265 if (lp == null) {
266 lp = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,
267 LayoutParams.WRAP_CONTENT);
268 }
269 lp.gravity = gravity;
270 mFakeTitleBar.setLayoutParams(lp);
271 }
272
273 void showFakeTitleBarAndEdit() {
Michael Kolbbd018d42010-12-15 15:43:39 -0800274 mFakeTitleBar.setShowProgressOnly(false);
275 setFakeTitleBarGravity(Gravity.BOTTOM);
Michael Kolb376b5412010-12-15 11:52:57 -0800276 showFakeTitleBar();
277 mFakeTitleBar.onEditUrl(false);
278 }
279
Michael Kolb66706532010-12-12 19:50:22 -0800280 @Override
281 protected void attachFakeTitleBar(WebView mainView) {
282 mContentView.addView(mFakeTitleBar);
283 mTabBar.onShowTitleBar();
284 }
285
286 @Override
287 protected void hideFakeTitleBar() {
288 if (isFakeTitleBarShowing()) {
289 mContentView.removeView(mFakeTitleBar);
290 mTabBar.onHideTitleBar();
291 }
292 }
293
294 @Override
295 protected boolean isFakeTitleBarShowing() {
296 return (mFakeTitleBar.getParent() != null);
297 }
298
299 @Override
300 protected TitleBarBase getFakeTitleBar() {
301 return mFakeTitleBar;
302 }
303
304 @Override
305 protected TitleBarBase getEmbeddedTitleBar() {
306 return mTitleBar;
307 }
308
309 // action mode callbacks
310
311 @Override
312 public void onActionModeStarted(ActionMode mode) {
Michael Kolbbd018d42010-12-15 15:43:39 -0800313 if (!mFakeTitleBar.isEditingUrl()) {
Michael Kolb66706532010-12-12 19:50:22 -0800314 // hide the fake title bar when CAB is shown
315 hideFakeTitleBar();
316 }
317 }
318
319 @Override
Michael Kolb376b5412010-12-15 11:52:57 -0800320 public void onActionModeFinished(boolean inLoad) {
321 checkTabCount();
322 if (inLoad) {
323 // the titlebar was removed when the CAB was shown
324 // if the page is loading, show it again
325 mFakeTitleBar.setShowProgressOnly(true);
326 if (!isFakeTitleBarShowing()) {
327 setFakeTitleBarGravity(Gravity.TOP);
328 }
329 showFakeTitleBar();
330 }
331 }
332
333 @Override
Michael Kolb66706532010-12-12 19:50:22 -0800334 public void setUrlTitle(Tab tab, String url, String title) {
335 super.setUrlTitle(tab, url, title);
336 mTabBar.onUrlAndTitle(tab, url, title);
337 }
338
339 // Set the favicon in the title bar.
340 @Override
341 public void setFavicon(Tab tab, Bitmap icon) {
342 super.setFavicon(tab, icon);
343 mTabBar.onFavicon(tab, icon);
344 }
345
Michael Kolbcfa3af52010-12-14 10:36:11 -0800346 @Override
347 public void showVoiceTitleBar(String title) {
348 List<String> vsresults = null;
349 if (getActiveTab() != null) {
350 vsresults = getActiveTab().getVoiceSearchResults();
351 }
352 mTitleBar.setInVoiceMode(true, null);
353 mTitleBar.setDisplayTitle(title);
354 mFakeTitleBar.setInVoiceMode(true, vsresults);
355 mFakeTitleBar.setDisplayTitle(title);
356 }
357
358 @Override
359 public void revertVoiceTitleBar(Tab tab) {
360 mTitleBar.setInVoiceMode(false, null);
361 String url = tab.getCurrentUrl();
362 mTitleBar.setDisplayTitle(url);
363 mFakeTitleBar.setInVoiceMode(false, null);
364 mFakeTitleBar.setDisplayTitle(url);
365 }
366
367
Michael Kolb66706532010-12-12 19:50:22 -0800368}