blob: 8c39f1635bb46f19a03f79e67f07860852c9401a [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;
Narayan Kamath5119edd2011-02-23 15:49:17 +000020import com.android.browser.UI.DropdownChangeListener;
Michael Kolb66706532010-12-12 19:50:22 -080021
Michael Kolb377ea312011-02-17 14:36:56 -080022import android.animation.Animator;
23import android.animation.Animator.AnimatorListener;
24import android.animation.ObjectAnimator;
Michael Kolb66706532010-12-12 19:50:22 -080025import android.app.ActionBar;
26import android.app.Activity;
Michael Kolb24915222011-02-24 11:38:49 -080027import android.content.pm.PackageManager;
Michael Kolbac35bdc2011-01-17 17:06:04 -080028import android.os.Bundle;
Michael Kolb376b5412010-12-15 11:52:57 -080029import android.util.Log;
Michael Kolb66706532010-12-12 19:50:22 -080030import android.view.ActionMode;
Michael Kolb376b5412010-12-15 11:52:57 -080031import android.view.Gravity;
Michael Kolba4183062011-01-16 10:43:21 -080032import android.view.KeyEvent;
John Reckd73c5a22010-12-22 10:22:50 -080033import android.view.View;
34import android.webkit.WebChromeClient.CustomViewCallback;
Michael Kolb66706532010-12-12 19:50:22 -080035import android.webkit.WebView;
Michael Kolb2a56eca2011-02-25 09:45:06 -080036import android.widget.FrameLayout;
Michael Kolb66706532010-12-12 19:50:22 -080037
38import java.util.List;
39
40/**
41 * Ui for xlarge screen sizes
42 */
43public class XLargeUi extends BaseUi implements ScrollListener {
44
45 private static final String LOGTAG = "XLargeUi";
46
Michael Kolb376b5412010-12-15 11:52:57 -080047 private ActionBar mActionBar;
Michael Kolb66706532010-12-12 19:50:22 -080048 private TabBar mTabBar;
49
50 private TitleBarXLarge mTitleBar;
Michael Kolb66706532010-12-12 19:50:22 -080051
Michael Kolb376b5412010-12-15 11:52:57 -080052 private boolean mUseQuickControls;
53 private PieControl mPieControl;
Michael Kolbd72f1592011-03-03 16:30:25 -080054 private boolean mInAnimation = false;
Michael Kolb376b5412010-12-15 11:52:57 -080055
Michael Kolb66706532010-12-12 19:50:22 -080056 /**
57 * @param browser
58 * @param controller
59 */
60 public XLargeUi(Activity browser, UiController controller) {
61 super(browser, controller);
62 mTitleBar = new TitleBarXLarge(mActivity, mUiController, this);
63 mTitleBar.setProgress(100);
Michael Kolb66706532010-12-12 19:50:22 -080064 mTabBar = new TabBar(mActivity, mUiController, this);
Michael Kolb376b5412010-12-15 11:52:57 -080065 mActionBar = mActivity.getActionBar();
John Reckb3417f02011-01-14 11:01:05 -080066 setupActionBar();
67 setUseQuickControls(BrowserSettings.getInstance().useQuickControls());
68 }
69
70 private void setupActionBar() {
71 mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
Michael Kolb376b5412010-12-15 11:52:57 -080072 mActionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
73 mActionBar.setCustomView(mTabBar);
John Reckb3417f02011-01-14 11:01:05 -080074 }
75
76 @Override
Michael Kolbac35bdc2011-01-17 17:06:04 -080077 public void showComboView(boolean startWithHistory, Bundle extras) {
78 super.showComboView(startWithHistory, extras);
79 if (mUseQuickControls) {
80 mActionBar.show();
81 }
82 }
83
84 @Override
John Reckb3417f02011-01-14 11:01:05 -080085 public void hideComboView() {
Michael Kolb8814d732011-01-26 11:22:30 -080086 checkTabCount();
John Reckb3417f02011-01-14 11:01:05 -080087 super.hideComboView();
88 // ComboView changes the action bar, set it back up to what we want
89 setupActionBar();
Michael Kolb376b5412010-12-15 11:52:57 -080090 }
91
92 private void setUseQuickControls(boolean useQuickControls) {
93 mUseQuickControls = useQuickControls;
Michael Kolb7cdc4902011-02-03 17:54:40 -080094 mTitleBar.setUseQuickControls(mUseQuickControls);
Michael Kolb376b5412010-12-15 11:52:57 -080095 if (useQuickControls) {
96 checkTabCount();
97 mPieControl = new PieControl(mActivity, mUiController, this);
98 mPieControl.attachToContainer(mContentView);
Michael Kolb7cdc4902011-02-03 17:54:40 -080099 Tab tab = getActiveTab();
100 if ((tab != null) && (tab.getWebView() != null)) {
101 tab.getWebView().setEmbeddedTitleBar(null);
Michael Kolb376b5412010-12-15 11:52:57 -0800102 }
Michael Kolb7cdc4902011-02-03 17:54:40 -0800103 setTitleGravity(Gravity.BOTTOM);
Michael Kolb376b5412010-12-15 11:52:57 -0800104 } else {
105 mActivity.getActionBar().show();
106 if (mPieControl != null) {
107 mPieControl.removeFromContainer(mContentView);
108 }
Michael Kolb7cdc4902011-02-03 17:54:40 -0800109 setTitleGravity(Gravity.TOP);
Michael Kolb376b5412010-12-15 11:52:57 -0800110 WebView web = mTabControl.getCurrentWebView();
Michael Kolb7cdc4902011-02-03 17:54:40 -0800111 if (web != null) {
Michael Kolb376b5412010-12-15 11:52:57 -0800112 web.setEmbeddedTitleBar(mTitleBar);
113 }
114 }
115 mTabBar.setUseQuickControls(mUseQuickControls);
Michael Kolb376b5412010-12-15 11:52:57 -0800116 }
117
118 private void checkTabCount() {
119 if (mUseQuickControls) {
120 int n = mTabBar.getTabCount();
121 if (n >= 2) {
122 mActivity.getActionBar().show();
123 } else if (n == 1) {
124 mActivity.getActionBar().hide();
125 }
126 }
Michael Kolb66706532010-12-12 19:50:22 -0800127 }
128
129 @Override
130 public void onDestroy() {
Michael Kolb7cdc4902011-02-03 17:54:40 -0800131 hideTitleBar();
Michael Kolb66706532010-12-12 19:50:22 -0800132 }
133
134 // webview factory
135
136 @Override
137 public WebView createWebView(boolean privateBrowsing) {
138 // Create a new WebView
139 ScrollWebView w = new ScrollWebView(mActivity, null,
140 android.R.attr.webViewStyle, privateBrowsing);
141 initWebViewSettings(w);
142 w.setScrollListener(this);
Michael Kolb24915222011-02-24 11:38:49 -0800143 boolean supportsMultiTouch = mActivity.getPackageManager()
144 .hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH);
145 w.getSettings().setDisplayZoomControls(!supportsMultiTouch);
Dave Burke20b6f1f2011-02-01 12:59:04 +0000146 w.setExpandedTileBounds(true); // smoother scrolling
Michael Kolb66706532010-12-12 19:50:22 -0800147 return w;
148 }
149
150 @Override
151 public WebView createSubWebView(boolean privateBrowsing) {
152 ScrollWebView web = (ScrollWebView) createWebView(privateBrowsing);
153 // no scroll listener for subview
154 web.setScrollListener(null);
155 return web;
156 }
157
158 @Override
Michael Kolb5ee018e2011-02-18 15:47:21 -0800159 public void onScroll(int visibleTitleHeight, boolean userInitiated) {
160 mTabBar.onScroll(visibleTitleHeight, userInitiated);
Michael Kolb66706532010-12-12 19:50:22 -0800161 }
162
163 void stopWebViewScrolling() {
164 ScrollWebView web = (ScrollWebView) mUiController.getCurrentWebView();
165 if (web != null) {
166 web.stopScroll();
167 }
168 }
169
170 // WebView callbacks
171
172 @Override
John Reck30c714c2010-12-16 17:30:34 -0800173 public void onProgressChanged(Tab tab) {
174 int progress = tab.getLoadProgress();
Michael Kolb66706532010-12-12 19:50:22 -0800175 mTabBar.onProgress(tab, progress);
176 if (tab.inForeground()) {
Michael Kolb7cdc4902011-02-03 17:54:40 -0800177 mTitleBar.setProgress(progress);
Michael Kolb66706532010-12-12 19:50:22 -0800178 if (progress == 100) {
Michael Kolb7cdc4902011-02-03 17:54:40 -0800179 if (!mTitleBar.isEditingUrl()) {
180 hideTitleBar();
Michael Kolbbd018d42010-12-15 15:43:39 -0800181 if (mUseQuickControls) {
Michael Kolb7cdc4902011-02-03 17:54:40 -0800182 mTitleBar.setShowProgressOnly(false);
183 setTitleGravity(Gravity.BOTTOM);
Michael Kolbbd018d42010-12-15 15:43:39 -0800184 }
Michael Kolb376b5412010-12-15 11:52:57 -0800185 }
Michael Kolb66706532010-12-12 19:50:22 -0800186 } else {
Michael Kolb7cdc4902011-02-03 17:54:40 -0800187 if (!isTitleBarShowing()) {
188 if (mUseQuickControls && !mTitleBar.isEditingUrl()) {
189 mTitleBar.setShowProgressOnly(true);
190 setTitleGravity(Gravity.TOP);
Michael Kolb376b5412010-12-15 11:52:57 -0800191 }
Michael Kolb7cdc4902011-02-03 17:54:40 -0800192 showTitleBar();
Michael Kolb376b5412010-12-15 11:52:57 -0800193 }
Michael Kolb66706532010-12-12 19:50:22 -0800194 }
195 }
196 }
197
198 @Override
199 public boolean needsRestoreAllTabs() {
200 return true;
201 }
202
203 @Override
204 public void addTab(Tab tab) {
205 mTabBar.onNewTab(tab);
Michael Kolb8814d732011-01-26 11:22:30 -0800206 }
207
208 protected void onAddTabCompleted(Tab tab) {
Michael Kolb376b5412010-12-15 11:52:57 -0800209 checkTabCount();
Michael Kolb66706532010-12-12 19:50:22 -0800210 }
211
212 @Override
Michael Kolb377ea312011-02-17 14:36:56 -0800213 public void setActiveTab(final Tab tab) {
Michael Kolbd72f1592011-03-03 16:30:25 -0800214 if (mInAnimation) return;
Michael Kolb377ea312011-02-17 14:36:56 -0800215 if ((tab != mActiveTab) && (mActiveTab != null)) {
Michael Kolbd72f1592011-03-03 16:30:25 -0800216 mInAnimation = true;
Michael Kolb377ea312011-02-17 14:36:56 -0800217 // animate between the two
218 final ScrollWebView fromWV = (ScrollWebView) mActiveTab.getWebView();
219 fromWV.setDrawCached(true);
220 fromWV.setEmbeddedTitleBar(null);
221 final ScrollWebView toWV = (ScrollWebView) tab.getWebView();
222 if (!mUseQuickControls) {
223 if (mTitleBar.getParent() == null) {
224 toWV.setEmbeddedTitleBar(mTitleBar);
225 }
226 }
227 toWV.setDrawCached(true);
228 attachTabToContentView(tab);
229 super.setActiveTab(tab, false);
230 ObjectAnimator transition = ObjectAnimator.ofFloat(
231 toWV, "alpha", 0f, 1f);
232 transition.setDuration(mActivity.getResources()
233 .getInteger(R.integer.tabFadeDuration));
234 transition.addListener(new AnimatorListener() {
235 @Override
236 public void onAnimationCancel(Animator animation) {
237 fromWV.setDrawCached(false);
238 toWV.setDrawCached(false);
239 setActiveTab(tab, false);
Michael Kolbd72f1592011-03-03 16:30:25 -0800240 mInAnimation = false;
Michael Kolb377ea312011-02-17 14:36:56 -0800241 }
242
243 @Override
244 public void onAnimationEnd(Animator animation) {
245 fromWV.setDrawCached(false);
246 toWV.setDrawCached(false);
247 setActiveTab(tab, false);
Michael Kolbd72f1592011-03-03 16:30:25 -0800248 mInAnimation = false;
Michael Kolb377ea312011-02-17 14:36:56 -0800249 }
250
251 @Override
252 public void onAnimationRepeat(Animator animation) {
253 }
254
255 @Override
256 public void onAnimationStart(Animator animation) {
257 }
258 });
259 transition.start();
260 } else {
261 super.setActiveTab(tab, true);
262 setActiveTab(tab, true);
Michael Kolb36a1dc92011-02-22 16:14:59 -0800263 }
Michael Kolb377ea312011-02-17 14:36:56 -0800264 }
265
266 @Override
267 void setActiveTab(Tab tab, boolean needsAttaching) {
Michael Kolb376b5412010-12-15 11:52:57 -0800268 ScrollWebView view = (ScrollWebView) tab.getWebView();
269 // TabControl.setCurrentTab has been called before this,
270 // so the tab is guaranteed to have a webview
271 if (view == null) {
272 Log.e(LOGTAG, "active tab with no webview detected");
273 return;
274 }
275 // Request focus on the top window.
276 if (mUseQuickControls) {
277 mPieControl.forceToTop(mContentView);
278 view.setScrollListener(null);
279 mTabBar.showTitleBarIndicator(false);
280 } else {
Michael Kolb377ea312011-02-17 14:36:56 -0800281 // check if title bar is already attached by animation
282 if (mTitleBar.getParent() == null) {
283 view.setEmbeddedTitleBar(mTitleBar);
284 }
Michael Kolb376b5412010-12-15 11:52:57 -0800285 view.setScrollListener(this);
286 }
Michael Kolb66706532010-12-12 19:50:22 -0800287 mTabBar.onSetActiveTab(tab);
Michael Kolb376b5412010-12-15 11:52:57 -0800288 if (tab.isInVoiceSearchMode()) {
289 showVoiceTitleBar(tab.getVoiceDisplayTitle());
290 } else {
291 revertVoiceTitleBar(tab);
292 }
Michael Kolb376b5412010-12-15 11:52:57 -0800293 updateLockIconToLatest(tab);
294 tab.getTopWindow().requestFocus();
Michael Kolb66706532010-12-12 19:50:22 -0800295 }
296
297 @Override
298 public void updateTabs(List<Tab> tabs) {
299 mTabBar.updateTabs(tabs);
Michael Kolb376b5412010-12-15 11:52:57 -0800300 checkTabCount();
Michael Kolb66706532010-12-12 19:50:22 -0800301 }
302
303 @Override
304 public void removeTab(Tab tab) {
305 super.removeTab(tab);
306 mTabBar.onRemoveTab(tab);
Michael Kolb8814d732011-01-26 11:22:30 -0800307 }
308
309 protected void onRemoveTabCompleted(Tab tab) {
Michael Kolb376b5412010-12-15 11:52:57 -0800310 checkTabCount();
Michael Kolb66706532010-12-12 19:50:22 -0800311 }
312
Michael Kolb376b5412010-12-15 11:52:57 -0800313 int getContentWidth() {
314 if (mContentView != null) {
315 return mContentView.getWidth();
Michael Kolb66706532010-12-12 19:50:22 -0800316 }
317 return 0;
318 }
319
Michael Kolbdc2ee1b2011-02-14 14:34:40 -0800320 @Override
321 public void editUrl(boolean clearInput) {
Michael Kolbd72ea3b2011-01-09 15:56:37 -0800322 if (mUiController.isInCustomActionMode()) {
323 mUiController.endActionMode();
324 }
Michael Kolb7cdc4902011-02-03 17:54:40 -0800325 showTitleBar();
Michael Kolbdc2ee1b2011-02-14 14:34:40 -0800326 mTitleBar.startEditingUrl(clearInput);
Michael Kolb66706532010-12-12 19:50:22 -0800327 }
328
Michael Kolb7cdc4902011-02-03 17:54:40 -0800329 void showTitleBarAndEdit() {
330 mTitleBar.setShowProgressOnly(false);
331 showTitleBar();
Michael Kolbdc2ee1b2011-02-14 14:34:40 -0800332 mTitleBar.startEditingUrl(false);
Michael Kolb7cdc4902011-02-03 17:54:40 -0800333 }
334
335 void stopEditingUrl() {
336 mTitleBar.stopEditingUrl();
337 }
338
339 @Override
340 protected void showTitleBar() {
341 if (canShowTitleBar()) {
342 if (mUseQuickControls) {
Michael Kolb7cdc4902011-02-03 17:54:40 -0800343 mContentView.addView(mTitleBar);
344 } else {
345 setTitleGravity(Gravity.TOP);
346 }
347 super.showTitleBar();
348 mTabBar.onShowTitleBar();
Michael Kolb376b5412010-12-15 11:52:57 -0800349 }
Michael Kolb376b5412010-12-15 11:52:57 -0800350 }
351
Michael Kolb66706532010-12-12 19:50:22 -0800352 @Override
Michael Kolb7cdc4902011-02-03 17:54:40 -0800353 protected void hideTitleBar() {
354 if (isTitleBarShowing()) {
Michael Kolb66706532010-12-12 19:50:22 -0800355 mTabBar.onHideTitleBar();
Michael Kolb7cdc4902011-02-03 17:54:40 -0800356 if (mUseQuickControls) {
357 mContentView.removeView(mTitleBar);
Michael Kolb2a56eca2011-02-25 09:45:06 -0800358 } else {
359 setTitleGravity(Gravity.NO_GRAVITY);
Michael Kolb7cdc4902011-02-03 17:54:40 -0800360 }
361 super.hideTitleBar();
Michael Kolb66706532010-12-12 19:50:22 -0800362 }
363 }
364
Michael Kolb5ee018e2011-02-18 15:47:21 -0800365 public boolean isEditingUrl() {
366 return mTitleBar.isEditingUrl();
367 }
368
Michael Kolb66706532010-12-12 19:50:22 -0800369 @Override
Michael Kolb7cdc4902011-02-03 17:54:40 -0800370 protected TitleBarBase getTitleBar() {
Michael Kolb66706532010-12-12 19:50:22 -0800371 return mTitleBar;
372 }
373
Michael Kolb2a56eca2011-02-25 09:45:06 -0800374 @Override
375 protected void setTitleGravity(int gravity) {
376 if (mUseQuickControls) {
377 FrameLayout.LayoutParams lp =
378 (FrameLayout.LayoutParams) mTitleBar.getLayoutParams();
379 lp.gravity = gravity;
380 mTitleBar.setLayoutParams(lp);
381 } else {
382 super.setTitleGravity(gravity);
383 }
384 }
385
Michael Kolb66706532010-12-12 19:50:22 -0800386 // action mode callbacks
387
388 @Override
389 public void onActionModeStarted(ActionMode mode) {
Michael Kolb7cdc4902011-02-03 17:54:40 -0800390 if (!mTitleBar.isEditingUrl()) {
Michael Kolb66706532010-12-12 19:50:22 -0800391 // hide the fake title bar when CAB is shown
Michael Kolb7cdc4902011-02-03 17:54:40 -0800392 hideTitleBar();
Michael Kolb66706532010-12-12 19:50:22 -0800393 }
394 }
395
396 @Override
Michael Kolb376b5412010-12-15 11:52:57 -0800397 public void onActionModeFinished(boolean inLoad) {
398 checkTabCount();
399 if (inLoad) {
400 // the titlebar was removed when the CAB was shown
401 // if the page is loading, show it again
Michael Kolb7cdc4902011-02-03 17:54:40 -0800402 mTitleBar.setShowProgressOnly(true);
403 if (!isTitleBarShowing()) {
404 setTitleGravity(Gravity.TOP);
Michael Kolb376b5412010-12-15 11:52:57 -0800405 }
Michael Kolb7cdc4902011-02-03 17:54:40 -0800406 showTitleBar();
Michael Kolb376b5412010-12-15 11:52:57 -0800407 }
408 }
409
410 @Override
Michael Kolb5a72f182011-01-13 20:35:06 -0800411 protected void updateNavigationState(Tab tab) {
412 mTitleBar.updateNavigationState(tab);
Michael Kolb5a72f182011-01-13 20:35:06 -0800413 }
414
415 @Override
John Reck30c714c2010-12-16 17:30:34 -0800416 public void setUrlTitle(Tab tab) {
417 super.setUrlTitle(tab);
418 mTabBar.onUrlAndTitle(tab, tab.getUrl(), tab.getTitle());
Michael Kolb66706532010-12-12 19:50:22 -0800419 }
420
421 // Set the favicon in the title bar.
422 @Override
John Reck30c714c2010-12-16 17:30:34 -0800423 public void setFavicon(Tab tab) {
424 super.setFavicon(tab);
425 mTabBar.onFavicon(tab, tab.getFavicon());
Michael Kolb66706532010-12-12 19:50:22 -0800426 }
427
Michael Kolbcfa3af52010-12-14 10:36:11 -0800428 @Override
429 public void showVoiceTitleBar(String title) {
430 List<String> vsresults = null;
431 if (getActiveTab() != null) {
432 vsresults = getActiveTab().getVoiceSearchResults();
433 }
Michael Kolb3a2a1642011-02-15 10:52:07 -0800434 mTitleBar.setInVoiceMode(true, vsresults);
Michael Kolbcfa3af52010-12-14 10:36:11 -0800435 mTitleBar.setDisplayTitle(title);
Michael Kolbcfa3af52010-12-14 10:36:11 -0800436 }
437
438 @Override
439 public void revertVoiceTitleBar(Tab tab) {
440 mTitleBar.setInVoiceMode(false, null);
John Reck30c714c2010-12-16 17:30:34 -0800441 String url = tab.getUrl();
Michael Kolbcfa3af52010-12-14 10:36:11 -0800442 mTitleBar.setDisplayTitle(url);
Michael Kolbcfa3af52010-12-14 10:36:11 -0800443 }
444
John Reckd73c5a22010-12-22 10:22:50 -0800445 @Override
446 public void showCustomView(View view, CustomViewCallback callback) {
447 super.showCustomView(view, callback);
448 mActivity.getActionBar().hide();
449 }
Michael Kolbcfa3af52010-12-14 10:36:11 -0800450
John Reckd73c5a22010-12-22 10:22:50 -0800451 @Override
452 public void onHideCustomView() {
453 super.onHideCustomView();
454 if (mUseQuickControls) {
455 checkTabCount();
456 } else {
457 mActivity.getActionBar().show();
458 }
459 }
Michael Kolba4183062011-01-16 10:43:21 -0800460
461 @Override
462 public boolean dispatchKey(int code, KeyEvent event) {
Michael Kolbdfe99a12011-03-08 11:45:40 -0800463 if (mActiveTab != null) {
464 WebView web = mActiveTab.getWebView();
465 if (event.getAction() == KeyEvent.ACTION_DOWN) {
466 switch (code) {
467 case KeyEvent.KEYCODE_TAB:
468 case KeyEvent.KEYCODE_DPAD_UP:
469 case KeyEvent.KEYCODE_DPAD_LEFT:
470 if ((web != null) && web.hasFocus() && !mTitleBar.hasFocus()) {
471 editUrl(false);
472 return true;
473 }
474 }
475 boolean ctrl = event.hasModifiers(KeyEvent.META_CTRL_ON);
476 if (!ctrl && isTypingKey(event) && !mTitleBar.isEditingUrl()) {
477 editUrl(true);
478 return mContentView.dispatchKeyEvent(event);
479 }
Michael Kolbdc2ee1b2011-02-14 14:34:40 -0800480 }
Michael Kolba4183062011-01-16 10:43:21 -0800481 }
482 return false;
483 }
484
Michael Kolbdc2ee1b2011-02-14 14:34:40 -0800485 private boolean isTypingKey(KeyEvent evt) {
486 return evt.getUnicodeChar() > 0;
487 }
488
489 TabBar getTabBar() {
490 return mTabBar;
491 }
492
Narayan Kamath5119edd2011-02-23 15:49:17 +0000493 @Override
494 public void registerDropdownChangeListener(DropdownChangeListener d) {
495 mTitleBar.registerDropdownChangeListener(d);
496 }
Michael Kolb66706532010-12-12 19:50:22 -0800497}