blob: 37370e5595bbc69c2b4fcac7ee0961fc1c6a5b6c [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
Michael Kolbc3af0672011-08-09 10:24:41 -070019import android.animation.Animator;
20import android.animation.AnimatorListenerAdapter;
21import android.animation.AnimatorSet;
22import android.animation.ObjectAnimator;
Michael Kolb66706532010-12-12 19:50:22 -080023import android.app.Activity;
Michael Kolbc3af0672011-08-09 10:24:41 -070024import android.content.Context;
25import android.graphics.Bitmap;
26import android.graphics.Canvas;
27import android.graphics.Matrix;
John Reck9c5004e2011-10-07 16:00:12 -070028import android.os.Message;
Michael Kolb376b5412010-12-15 11:52:57 -080029import android.util.Log;
John Reckaae029c2011-09-16 14:36:39 -070030import android.util.TypedValue;
Michael Kolb66706532010-12-12 19:50:22 -080031import android.view.ActionMode;
32import android.view.Gravity;
Michael Kolba4183062011-01-16 10:43:21 -080033import android.view.KeyEvent;
Michael Kolbc3af0672011-08-09 10:24:41 -070034import android.view.LayoutInflater;
Michael Kolb66706532010-12-12 19:50:22 -080035import android.view.Menu;
Michael Kolb3ca12752011-07-20 13:52:25 -070036import android.view.MenuItem;
Michael Kolb66706532010-12-12 19:50:22 -080037import android.view.View;
Michael Kolb199e43c2011-08-17 10:45:45 -070038import android.view.ViewGroup;
Michael Kolb30adae62011-07-29 13:37:05 -070039import android.view.accessibility.AccessibilityEvent;
Michael Kolb66706532010-12-12 19:50:22 -080040import android.webkit.WebView;
Michael Kolbfdb70242011-03-24 09:41:11 -070041import android.widget.FrameLayout;
Michael Kolbc3af0672011-08-09 10:24:41 -070042import android.widget.ImageView;
Michael Kolb66706532010-12-12 19:50:22 -080043
Michael Kolb629b22c2011-07-13 16:26:47 -070044import com.android.browser.UrlInputView.StateListener;
45
Michael Kolb66706532010-12-12 19:50:22 -080046/**
47 * Ui for regular phone screen sizes
48 */
49public class PhoneUi extends BaseUi {
50
51 private static final String LOGTAG = "PhoneUi";
John Reck9c5004e2011-10-07 16:00:12 -070052 private static final int MSG_INIT_NAVSCREEN = 100;
Michael Kolb66706532010-12-12 19:50:22 -080053
Michael Kolb0241e752011-07-07 14:58:50 -070054 private PieControlPhone mPieControl;
Michael Kolbf2055602011-04-09 17:20:03 -070055 private NavScreen mNavScreen;
John Reckcc0059c2011-10-07 13:53:13 -070056 private AnimScreen mAnimScreen;
John Reck0f602f32011-07-07 15:38:43 -070057 private NavigationBarPhone mNavigationBar;
John Reckaae029c2011-09-16 14:36:39 -070058 private int mActionBarHeight;
Michael Kolb66706532010-12-12 19:50:22 -080059
60 boolean mExtendedMenuOpen;
61 boolean mOptionsMenuOpen;
Michael Kolb08a687a2011-04-22 16:13:02 -070062 boolean mAnimating;
Michael Kolb66706532010-12-12 19:50:22 -080063
64 /**
65 * @param browser
66 * @param controller
67 */
68 public PhoneUi(Activity browser, UiController controller) {
69 super(browser, controller);
Michael Kolbfdb70242011-03-24 09:41:11 -070070 setUseQuickControls(BrowserSettings.getInstance().useQuickControls());
John Reck0f602f32011-07-07 15:38:43 -070071 mNavigationBar = (NavigationBarPhone) mTitleBar.getNavigationBar();
John Reckaae029c2011-09-16 14:36:39 -070072 TypedValue heightValue = new TypedValue();
73 browser.getTheme().resolveAttribute(
74 com.android.internal.R.attr.actionBarSize, heightValue, true);
75 mActionBarHeight = TypedValue.complexToDimensionPixelSize(heightValue.data,
76 browser.getResources().getDisplayMetrics());
John Reck285ef042011-02-11 15:44:17 -080077 }
Michael Kolb66706532010-12-12 19:50:22 -080078
John Reck285ef042011-02-11 15:44:17 -080079 @Override
Michael Kolb66706532010-12-12 19:50:22 -080080 public void onDestroy() {
Michael Kolb7cdc4902011-02-03 17:54:40 -080081 hideTitleBar();
Michael Kolb66706532010-12-12 19:50:22 -080082 }
83
84 @Override
Michael Kolbdc2ee1b2011-02-14 14:34:40 -080085 public void editUrl(boolean clearInput) {
Michael Kolb46f987e2011-04-05 10:39:10 -070086 if (mUseQuickControls) {
John Reck0f602f32011-07-07 15:38:43 -070087 mTitleBar.setShowProgressOnly(false);
Michael Kolb46f987e2011-04-05 10:39:10 -070088 }
89 super.editUrl(clearInput);
Michael Kolbdc2ee1b2011-02-14 14:34:40 -080090 }
91
92 @Override
Michael Kolb66706532010-12-12 19:50:22 -080093 public boolean onBackKey() {
John Reckcc0059c2011-10-07 13:53:13 -070094 if (showingNavScreen()) {
Michael Kolba3194d02011-09-07 11:23:51 -070095 mNavScreen.close(mUiController.getTabControl().getCurrentPosition());
Michael Kolbf2055602011-04-09 17:20:03 -070096 return true;
Michael Kolb66706532010-12-12 19:50:22 -080097 }
98 return super.onBackKey();
99 }
100
John Reckcc0059c2011-10-07 13:53:13 -0700101 private boolean showingNavScreen() {
102 return mNavScreen != null && mNavScreen.getVisibility() == View.VISIBLE;
103 }
104
Michael Kolb66706532010-12-12 19:50:22 -0800105 @Override
Michael Kolbf2055602011-04-09 17:20:03 -0700106 public boolean dispatchKey(int code, KeyEvent event) {
Michael Kolbf2055602011-04-09 17:20:03 -0700107 return false;
108 }
109
110 @Override
John Reck30c714c2010-12-16 17:30:34 -0800111 public void onProgressChanged(Tab tab) {
Michael Kolb66706532010-12-12 19:50:22 -0800112 if (tab.inForeground()) {
John Reck30c714c2010-12-16 17:30:34 -0800113 int progress = tab.getLoadProgress();
Michael Kolb7cdc4902011-02-03 17:54:40 -0800114 mTitleBar.setProgress(progress);
Michael Kolb66706532010-12-12 19:50:22 -0800115 if (progress == 100) {
116 if (!mOptionsMenuOpen || !mExtendedMenuOpen) {
John Reck5d43ce82011-06-21 17:16:51 -0700117 suggestHideTitleBar();
Michael Kolbc16c5952011-03-29 15:37:03 -0700118 if (mUseQuickControls) {
119 mTitleBar.setShowProgressOnly(false);
120 }
Michael Kolb66706532010-12-12 19:50:22 -0800121 }
122 } else {
123 if (!mOptionsMenuOpen || mExtendedMenuOpen) {
Michael Kolbc16c5952011-03-29 15:37:03 -0700124 if (mUseQuickControls && !mTitleBar.isEditingUrl()) {
125 mTitleBar.setShowProgressOnly(true);
126 setTitleGravity(Gravity.TOP);
127 }
Michael Kolb7cdc4902011-02-03 17:54:40 -0800128 showTitleBar();
Michael Kolb66706532010-12-12 19:50:22 -0800129 }
130 }
131 }
John Reck9c5004e2011-10-07 16:00:12 -0700132 if (mNavScreen == null && getTitleBar().getHeight() > 0) {
133 mHandler.sendEmptyMessage(MSG_INIT_NAVSCREEN);
134 }
135 }
136
137 @Override
138 protected void handleMessage(Message msg) {
139 super.handleMessage(msg);
140 if (msg.what == MSG_INIT_NAVSCREEN) {
141 if (mNavScreen == null) {
142 mNavScreen = new NavScreen(mActivity, mUiController, this);
143 mCustomViewContainer.addView(mNavScreen, COVER_SCREEN_PARAMS);
144 mNavScreen.setVisibility(View.GONE);
145 }
146 if (mAnimScreen == null) {
147 mAnimScreen = new AnimScreen(mActivity);
148 // initialize bitmaps
149 mAnimScreen.set(getTitleBar(), getWebView());
150 }
151 }
Michael Kolb66706532010-12-12 19:50:22 -0800152 }
153
154 @Override
Michael Kolbfdb70242011-03-24 09:41:11 -0700155 public void setActiveTab(final Tab tab) {
John Reck8ee633f2011-08-09 16:00:35 -0700156 mTitleBar.cancelTitleBarAnimation(true);
157 mTitleBar.setSkipTitleBarAnimations(true);
John Reck5d43ce82011-06-21 17:16:51 -0700158 super.setActiveTab(tab);
Michael Kolbfdb70242011-03-24 09:41:11 -0700159 BrowserWebView view = (BrowserWebView) tab.getWebView();
Michael Kolb376b5412010-12-15 11:52:57 -0800160 // TabControl.setCurrentTab has been called before this,
161 // so the tab is guaranteed to have a webview
162 if (view == null) {
163 Log.e(LOGTAG, "active tab with no webview detected");
164 return;
165 }
Michael Kolbfdb70242011-03-24 09:41:11 -0700166 // Request focus on the top window.
167 if (mUseQuickControls) {
168 mPieControl.forceToTop(mContentView);
Michael Kolbfdb70242011-03-24 09:41:11 -0700169 } else {
170 // check if title bar is already attached by animation
171 if (mTitleBar.getParent() == null) {
172 view.setEmbeddedTitleBar(mTitleBar);
173 }
174 }
Michael Kolb376b5412010-12-15 11:52:57 -0800175 if (tab.isInVoiceSearchMode()) {
Michael Kolbfdb70242011-03-24 09:41:11 -0700176 showVoiceTitleBar(tab.getVoiceDisplayTitle(), tab.getVoiceSearchResults());
Michael Kolb376b5412010-12-15 11:52:57 -0800177 } else {
178 revertVoiceTitleBar(tab);
179 }
Michael Kolb629b22c2011-07-13 16:26:47 -0700180 // update nav bar state
181 mNavigationBar.onStateChanged(StateListener.STATE_NORMAL);
Michael Kolbfdb70242011-03-24 09:41:11 -0700182 updateLockIconToLatest(tab);
Michael Kolb376b5412010-12-15 11:52:57 -0800183 tab.getTopWindow().requestFocus();
John Reck8ee633f2011-08-09 16:00:35 -0700184 mTitleBar.setSkipTitleBarAnimations(false);
Michael Kolb376b5412010-12-15 11:52:57 -0800185 }
186
Michael Kolb66706532010-12-12 19:50:22 -0800187 // menu handling callbacks
188
189 @Override
Michael Kolb3ca12752011-07-20 13:52:25 -0700190 public boolean onPrepareOptionsMenu(Menu menu) {
Michael Kolb7bdee0b2011-08-01 11:55:38 -0700191 updateMenuState(mActiveTab, menu);
Michael Kolb3ca12752011-07-20 13:52:25 -0700192 return true;
193 }
194
195 @Override
Michael Kolb7bdee0b2011-08-01 11:55:38 -0700196 public void updateMenuState(Tab tab, Menu menu) {
Michael Kolb7bdee0b2011-08-01 11:55:38 -0700197 MenuItem bm = menu.findItem(R.id.bookmarks_menu_id);
198 if (bm != null) {
George Mounta4933652011-10-12 08:18:05 -0700199 boolean isDataUrl = false;
200 if (tab != null) {
201 String url = tab.getUrl();
202 isDataUrl = DataUri.isDataUri(url);
203 }
George Mount387d45d2011-10-07 15:57:53 -0700204 bm.setVisible(!showingNavScreen() && !isDataUrl);
Michael Kolb7bdee0b2011-08-01 11:55:38 -0700205 }
206 MenuItem nt = menu.findItem(R.id.new_tab_menu_id);
207 if (nt != null) {
John Reckcc0059c2011-10-07 13:53:13 -0700208 nt.setVisible(!showingNavScreen());
Michael Kolb7bdee0b2011-08-01 11:55:38 -0700209 }
Michael Kolb7bdee0b2011-08-01 11:55:38 -0700210 MenuItem abm = menu.findItem(R.id.add_bookmark_menu_id);
211 if (abm != null) {
John Reckcc0059c2011-10-07 13:53:13 -0700212 abm.setVisible((tab != null) && !tab.isSnapshot() && !showingNavScreen());
John Recke1a03a32011-09-14 17:04:16 -0700213 }
John Reckcc0059c2011-10-07 13:53:13 -0700214 if (showingNavScreen()) {
John Recke1a03a32011-09-14 17:04:16 -0700215 menu.setGroupVisible(R.id.LIVE_MENU, false);
216 menu.setGroupVisible(R.id.SNAPSHOT_MENU, false);
217 menu.findItem(R.id.page_info_menu_id).setVisible(false);
218 menu.setGroupVisible(R.id.NAV_MENU, false);
Michael Kolb7bdee0b2011-08-01 11:55:38 -0700219 }
220 }
221
222 @Override
Michael Kolb3ca12752011-07-20 13:52:25 -0700223 public boolean onOptionsItemSelected(MenuItem item) {
John Reckcc0059c2011-10-07 13:53:13 -0700224 if (showingNavScreen()) {
Michael Kolba3194d02011-09-07 11:23:51 -0700225 hideNavScreen(mUiController.getTabControl().getCurrentPosition(), false);
Michael Kolb3ca12752011-07-20 13:52:25 -0700226 }
227 return false;
228 }
229
230 @Override
Michael Kolb66706532010-12-12 19:50:22 -0800231 public void onContextMenuCreated(Menu menu) {
Michael Kolb7cdc4902011-02-03 17:54:40 -0800232 hideTitleBar();
Michael Kolb66706532010-12-12 19:50:22 -0800233 }
234
235 @Override
236 public void onContextMenuClosed(Menu menu, boolean inLoad) {
237 if (inLoad) {
Michael Kolb7cdc4902011-02-03 17:54:40 -0800238 showTitleBar();
Michael Kolb66706532010-12-12 19:50:22 -0800239 }
240 }
241
242 // action mode callbacks
243
244 @Override
245 public void onActionModeStarted(ActionMode mode) {
Michael Kolb42c0c062011-08-02 12:56:06 -0700246 if (!isEditingUrl()) {
247 hideTitleBar();
John Reckaae029c2011-09-16 14:36:39 -0700248 } else {
249 mTitleBar.animate().translationY(mActionBarHeight);
Michael Kolb42c0c062011-08-02 12:56:06 -0700250 }
Michael Kolb66706532010-12-12 19:50:22 -0800251 }
252
Michael Kolba4183062011-01-16 10:43:21 -0800253 @Override
John Reck6cda7b12011-03-18 15:57:13 -0700254 public void onActionModeFinished(boolean inLoad) {
John Reckaae029c2011-09-16 14:36:39 -0700255 mTitleBar.animate().translationY(0);
Michael Kolbc16c5952011-03-29 15:37:03 -0700256 if (inLoad) {
257 if (mUseQuickControls) {
258 mTitleBar.setShowProgressOnly(true);
John Reck6cda7b12011-03-18 15:57:13 -0700259 }
Michael Kolbc16c5952011-03-29 15:37:03 -0700260 showTitleBar();
261 }
John Reck6cda7b12011-03-18 15:57:13 -0700262 }
263
264 @Override
Michael Kolbfdb70242011-03-24 09:41:11 -0700265 protected void setTitleGravity(int gravity) {
266 if (mUseQuickControls) {
267 FrameLayout.LayoutParams lp =
John Reck0f602f32011-07-07 15:38:43 -0700268 (FrameLayout.LayoutParams) mTitleBar.getLayoutParams();
Michael Kolbfdb70242011-03-24 09:41:11 -0700269 lp.gravity = gravity;
John Reck0f602f32011-07-07 15:38:43 -0700270 mTitleBar.setLayoutParams(lp);
Michael Kolbfdb70242011-03-24 09:41:11 -0700271 } else {
272 super.setTitleGravity(gravity);
273 }
274 }
275
Michael Kolb0241e752011-07-07 14:58:50 -0700276 @Override
277 public void setUseQuickControls(boolean useQuickControls) {
Michael Kolbfdb70242011-03-24 09:41:11 -0700278 mUseQuickControls = useQuickControls;
John Reck0f602f32011-07-07 15:38:43 -0700279 mTitleBar.setUseQuickControls(mUseQuickControls);
Michael Kolbfdb70242011-03-24 09:41:11 -0700280 if (useQuickControls) {
Michael Kolb0241e752011-07-07 14:58:50 -0700281 mPieControl = new PieControlPhone(mActivity, mUiController, this);
Michael Kolbfdb70242011-03-24 09:41:11 -0700282 mPieControl.attachToContainer(mContentView);
Michael Kolb46f987e2011-04-05 10:39:10 -0700283 WebView web = getWebView();
284 if (web != null) {
285 web.setEmbeddedTitleBar(null);
Michael Kolbfdb70242011-03-24 09:41:11 -0700286 }
287 } else {
Michael Kolbfdb70242011-03-24 09:41:11 -0700288 if (mPieControl != null) {
289 mPieControl.removeFromContainer(mContentView);
290 }
Michael Kolb46f987e2011-04-05 10:39:10 -0700291 WebView web = getWebView();
Michael Kolbfdb70242011-03-24 09:41:11 -0700292 if (web != null) {
Michael Kolb199e43c2011-08-17 10:45:45 -0700293 // make sure we can re-parent titlebar
294 if ((mTitleBar != null) && (mTitleBar.getParent() != null)) {
295 ((ViewGroup) mTitleBar.getParent()).removeView(mTitleBar);
296 }
Michael Kolbfdb70242011-03-24 09:41:11 -0700297 web.setEmbeddedTitleBar(mTitleBar);
298 }
299 setTitleGravity(Gravity.NO_GRAVITY);
300 }
John Reck718a24d2011-08-12 11:08:30 -0700301 updateUrlBarAutoShowManagerTarget();
Michael Kolbfdb70242011-03-24 09:41:11 -0700302 }
303
Michael Kolbc3af0672011-08-09 10:24:41 -0700304 @Override
305 public boolean isWebShowing() {
John Reckcc0059c2011-10-07 13:53:13 -0700306 return super.isWebShowing() && !showingNavScreen();
Michael Kolbc3af0672011-08-09 10:24:41 -0700307 }
308
309 @Override
310 public void showWeb(boolean animate) {
311 super.showWeb(animate);
Michael Kolba3194d02011-09-07 11:23:51 -0700312 hideNavScreen(mUiController.getTabControl().getCurrentPosition(), animate);
Michael Kolbc3af0672011-08-09 10:24:41 -0700313 }
314
Michael Kolbf2055602011-04-09 17:20:03 -0700315 void showNavScreen() {
Michael Kolbc3af0672011-08-09 10:24:41 -0700316 mUiController.setBlockEvents(true);
John Reckcc0059c2011-10-07 13:53:13 -0700317 if (mNavScreen == null) {
318 mNavScreen = new NavScreen(mActivity, mUiController, this);
319 mCustomViewContainer.addView(mNavScreen, COVER_SCREEN_PARAMS);
320 } else {
321 mNavScreen.setVisibility(View.VISIBLE);
322 mNavScreen.setAlpha(1f);
John Reck9c5004e2011-10-07 16:00:12 -0700323 mNavScreen.refreshAdapter();
John Reckcc0059c2011-10-07 13:53:13 -0700324 }
Michael Kolbc3af0672011-08-09 10:24:41 -0700325 mActiveTab.capture();
John Reckcc0059c2011-10-07 13:53:13 -0700326 if (mAnimScreen == null) {
327 mAnimScreen = new AnimScreen(mActivity);
John Reckce8bcb02011-10-11 13:45:29 -0700328 } else {
329 mAnimScreen.mMain.setAlpha(1f);
330 mAnimScreen.mTitle.setAlpha(1f);
331 mAnimScreen.setScaleFactor(1f);
John Reckcc0059c2011-10-07 13:53:13 -0700332 }
333 mAnimScreen.set(getTitleBar(), getWebView());
John Reck1adf0302011-10-11 10:58:12 -0700334 mCustomViewContainer.addView(mAnimScreen.mMain, COVER_SCREEN_PARAMS);
Michael Kolbf2055602011-04-09 17:20:03 -0700335 mCustomViewContainer.setVisibility(View.VISIBLE);
336 mCustomViewContainer.bringToFront();
John Reckce8bcb02011-10-11 13:45:29 -0700337 mAnimScreen.mMain.layout(0, 0, mContentView.getWidth(),
338 mContentView.getHeight());
Michael Kolbc3af0672011-08-09 10:24:41 -0700339 int fromLeft = 0;
340 int fromTop = getTitleBar().getHeight();
341 int fromRight = mContentView.getWidth();
342 int fromBottom = mContentView.getHeight();
Michael Kolba3194d02011-09-07 11:23:51 -0700343 int width = mActivity.getResources().getDimensionPixelSize(R.dimen.nav_tab_width);
344 int height = mActivity.getResources().getDimensionPixelSize(R.dimen.nav_tab_height);
Michael Kolb7a321d62011-09-23 15:54:22 -0700345 int ntth = mActivity.getResources().getDimensionPixelSize(R.dimen.nav_tab_titleheight);
Michael Kolbc3af0672011-08-09 10:24:41 -0700346 int toLeft = (mContentView.getWidth() - width) / 2;
Michael Kolb7a321d62011-09-23 15:54:22 -0700347 int toTop = ((fromBottom - (ntth + height)) / 2 + ntth);
Michael Kolbc3af0672011-08-09 10:24:41 -0700348 int toRight = toLeft + width;
349 int toBottom = toTop + height;
350 float scaleFactor = width / (float) mContentView.getWidth();
351 detachTab(mActiveTab);
352 mContentView.setVisibility(View.GONE);
Michael Kolba3194d02011-09-07 11:23:51 -0700353 AnimatorSet set1 = new AnimatorSet();
Michael Kolbc3af0672011-08-09 10:24:41 -0700354 AnimatorSet inanim = new AnimatorSet();
John Reckcc0059c2011-10-07 13:53:13 -0700355 ObjectAnimator tx = ObjectAnimator.ofInt(mAnimScreen.mContent, "left",
Michael Kolbc3af0672011-08-09 10:24:41 -0700356 fromLeft, toLeft);
John Reckcc0059c2011-10-07 13:53:13 -0700357 ObjectAnimator ty = ObjectAnimator.ofInt(mAnimScreen.mContent, "top",
Michael Kolbc3af0672011-08-09 10:24:41 -0700358 fromTop, toTop);
John Reckcc0059c2011-10-07 13:53:13 -0700359 ObjectAnimator tr = ObjectAnimator.ofInt(mAnimScreen.mContent, "right",
Michael Kolbc3af0672011-08-09 10:24:41 -0700360 fromRight, toRight);
John Reckcc0059c2011-10-07 13:53:13 -0700361 ObjectAnimator tb = ObjectAnimator.ofInt(mAnimScreen.mContent, "bottom",
Michael Kolbc3af0672011-08-09 10:24:41 -0700362 fromBottom, toBottom);
John Reckcc0059c2011-10-07 13:53:13 -0700363 ObjectAnimator title = ObjectAnimator.ofFloat(mAnimScreen.mTitle, "alpha",
Michael Kolbc3af0672011-08-09 10:24:41 -0700364 1f, 0f);
John Reckcc0059c2011-10-07 13:53:13 -0700365 ObjectAnimator sx = ObjectAnimator.ofFloat(mAnimScreen, "scaleFactor",
Michael Kolbc3af0672011-08-09 10:24:41 -0700366 1f, scaleFactor);
John Reck1adf0302011-10-11 10:58:12 -0700367 ObjectAnimator blend1 = ObjectAnimator.ofFloat(mAnimScreen.mMain,
368 "alpha", 1f, 0f);
Michael Kolba3194d02011-09-07 11:23:51 -0700369 blend1.setDuration(100);
370
371 inanim.playTogether(tx, ty, tr, tb, sx, title);
372 inanim.setDuration(200);
373 set1.addListener(new AnimatorListenerAdapter() {
Michael Kolbc3af0672011-08-09 10:24:41 -0700374 @Override
375 public void onAnimationEnd(Animator anim) {
John Reck1adf0302011-10-11 10:58:12 -0700376 mCustomViewContainer.removeView(mAnimScreen.mMain);
Michael Kolbc3af0672011-08-09 10:24:41 -0700377 finishAnimationIn();
378 mUiController.setBlockEvents(false);
379 }
380 });
Michael Kolba3194d02011-09-07 11:23:51 -0700381 set1.playSequentially(inanim, blend1);
382 set1.start();
Michael Kolbc3af0672011-08-09 10:24:41 -0700383 }
384
385 private void finishAnimationIn() {
John Reckcc0059c2011-10-07 13:53:13 -0700386 if (showingNavScreen()) {
Michael Kolbb43f2f62011-08-17 10:39:31 -0700387 // notify accessibility manager about the screen change
388 mNavScreen.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
389 mTabControl.setOnThumbnailUpdatedListener(mNavScreen);
390 }
Michael Kolbf2055602011-04-09 17:20:03 -0700391 }
392
Michael Kolba3194d02011-09-07 11:23:51 -0700393 void hideNavScreen(int position, boolean animate) {
John Reckcc0059c2011-10-07 13:53:13 -0700394 if (!showingNavScreen()) return;
Michael Kolba3194d02011-09-07 11:23:51 -0700395 final Tab tab = mUiController.getTabControl().getTab(position);
Michael Kolbbf32cd02011-08-16 15:07:04 -0700396 if ((tab == null) || !animate) {
Michael Kolb365561d2011-08-18 09:56:25 -0700397 if (tab != null) {
398 setActiveTab(tab);
399 } else if (mTabControl.getTabCount() > 0) {
400 // use a fallback tab
401 setActiveTab(mTabControl.getCurrentTab());
402 }
Michael Kolbbf32cd02011-08-16 15:07:04 -0700403 mContentView.setVisibility(View.VISIBLE);
404 finishAnimateOut();
Michael Kolb8a009492011-08-15 15:37:30 -0700405 return;
Michael Kolbc3af0672011-08-09 10:24:41 -0700406 }
Michael Kolba3194d02011-09-07 11:23:51 -0700407 NavTabView tabview = (NavTabView) mNavScreen.getTabView(position);
Michael Kolbc3af0672011-08-09 10:24:41 -0700408 if (tabview == null) {
Michael Kolb365561d2011-08-18 09:56:25 -0700409 if (mTabControl.getTabCount() > 0) {
410 // use a fallback tab
411 setActiveTab(mTabControl.getCurrentTab());
412 }
Michael Kolbbf32cd02011-08-16 15:07:04 -0700413 mContentView.setVisibility(View.VISIBLE);
414 finishAnimateOut();
Michael Kolb8a009492011-08-15 15:37:30 -0700415 return;
Michael Kolbc3af0672011-08-09 10:24:41 -0700416 }
417 mUiController.setBlockEvents(true);
418 mUiController.setActiveTab(tab);
419 mContentView.setVisibility(View.VISIBLE);
John Reckcc0059c2011-10-07 13:53:13 -0700420 if (mAnimScreen == null) {
421 mAnimScreen = new AnimScreen(mActivity);
422 }
423 mAnimScreen.set(tab.getScreenshot());
424 mCustomViewContainer.addView(mAnimScreen.mMain, COVER_SCREEN_PARAMS);
425 mAnimScreen.mMain.layout(0, 0, mContentView.getWidth(),
Michael Kolba3194d02011-09-07 11:23:51 -0700426 mContentView.getHeight());
427 mNavScreen.mScroller.finishScroller();
428 ImageView target = tabview.mImage;
Michael Kolbc3af0672011-08-09 10:24:41 -0700429 int toLeft = 0;
430 int toTop = getTitleBar().getHeight();
431 int toRight = mContentView.getWidth();
Michael Kolba3194d02011-09-07 11:23:51 -0700432 int width = target.getDrawable().getIntrinsicWidth();
433 int height = target.getDrawable().getIntrinsicHeight();
434 int fromLeft = tabview.getLeft() + target.getLeft() - mNavScreen.mScroller.getScrollX();
435 int fromTop = tabview.getTop() + target.getTop() - mNavScreen.mScroller.getScrollY();
Michael Kolbc3af0672011-08-09 10:24:41 -0700436 int fromRight = fromLeft + width;
437 int fromBottom = fromTop + height;
438 float scaleFactor = mContentView.getWidth() / (float) width;
Michael Kolba3194d02011-09-07 11:23:51 -0700439 int toBottom = toTop + (int) (height * scaleFactor);
John Reck9c5004e2011-10-07 16:00:12 -0700440 mAnimScreen.mContent.setLeft(fromLeft);
441 mAnimScreen.mContent.setTop(fromTop);
442 mAnimScreen.mContent.setRight(fromRight);
443 mAnimScreen.mContent.setBottom(fromBottom);
444 mAnimScreen.setScaleFactor(1f);
Michael Kolba3194d02011-09-07 11:23:51 -0700445 AnimatorSet set1 = new AnimatorSet();
John Reckcc0059c2011-10-07 13:53:13 -0700446 ObjectAnimator fade2 = ObjectAnimator.ofFloat(mAnimScreen.mMain, "alpha", 0f, 1f);
Michael Kolba3194d02011-09-07 11:23:51 -0700447 ObjectAnimator fade1 = ObjectAnimator.ofFloat(mNavScreen, "alpha", 1f, 0f);
John Reck9c5004e2011-10-07 16:00:12 -0700448 set1.playTogether(fade1, fade2);
Michael Kolba3194d02011-09-07 11:23:51 -0700449 set1.setDuration(100);
450 AnimatorSet set2 = new AnimatorSet();
John Reckcc0059c2011-10-07 13:53:13 -0700451 ObjectAnimator l = ObjectAnimator.ofInt(mAnimScreen.mContent, "left",
Michael Kolbc3af0672011-08-09 10:24:41 -0700452 fromLeft, toLeft);
John Reckcc0059c2011-10-07 13:53:13 -0700453 ObjectAnimator t = ObjectAnimator.ofInt(mAnimScreen.mContent, "top",
Michael Kolbc3af0672011-08-09 10:24:41 -0700454 fromTop, toTop);
John Reckcc0059c2011-10-07 13:53:13 -0700455 ObjectAnimator r = ObjectAnimator.ofInt(mAnimScreen.mContent, "right",
Michael Kolbc3af0672011-08-09 10:24:41 -0700456 fromRight, toRight);
John Reckcc0059c2011-10-07 13:53:13 -0700457 ObjectAnimator b = ObjectAnimator.ofInt(mAnimScreen.mContent, "bottom",
Michael Kolbc3af0672011-08-09 10:24:41 -0700458 fromBottom, toBottom);
John Reckcc0059c2011-10-07 13:53:13 -0700459 ObjectAnimator scale = ObjectAnimator.ofFloat(mAnimScreen, "scaleFactor",
Michael Kolbc3af0672011-08-09 10:24:41 -0700460 1f, scaleFactor);
Michael Kolbc3af0672011-08-09 10:24:41 -0700461 ObjectAnimator otheralpha = ObjectAnimator.ofFloat(mCustomViewContainer, "alpha", 1f, 0f);
Michael Kolba3194d02011-09-07 11:23:51 -0700462 otheralpha.setDuration(100);
463 set2.playTogether(l, t, r, b, scale);
464 set2.setDuration(200);
465 AnimatorSet combo = new AnimatorSet();
466 combo.playSequentially(set1, set2, otheralpha);
467 combo.addListener(new AnimatorListenerAdapter() {
Michael Kolbc3af0672011-08-09 10:24:41 -0700468 @Override
469 public void onAnimationEnd(Animator anim) {
John Reckcc0059c2011-10-07 13:53:13 -0700470 mCustomViewContainer.removeView(mAnimScreen.mMain);
Michael Kolbbf32cd02011-08-16 15:07:04 -0700471 finishAnimateOut();
Michael Kolbc3af0672011-08-09 10:24:41 -0700472 mUiController.setBlockEvents(false);
473 }
474 });
Michael Kolba3194d02011-09-07 11:23:51 -0700475 combo.start();
Michael Kolbc3af0672011-08-09 10:24:41 -0700476 }
477
Michael Kolbbf32cd02011-08-16 15:07:04 -0700478 private void finishAnimateOut() {
John Reck8ee633f2011-08-09 16:00:35 -0700479 mTabControl.setOnThumbnailUpdatedListener(null);
John Reckcc0059c2011-10-07 13:53:13 -0700480 mNavScreen.setVisibility(View.GONE);
Michael Kolbc3af0672011-08-09 10:24:41 -0700481 mCustomViewContainer.setAlpha(1f);
Michael Kolbf2055602011-04-09 17:20:03 -0700482 mCustomViewContainer.setVisibility(View.GONE);
Michael Kolbf2055602011-04-09 17:20:03 -0700483 }
484
John Reck6b4bd5f2011-07-12 10:14:38 -0700485 @Override
486 public boolean needsRestoreAllTabs() {
487 return false;
488 }
489
Michael Kolb20be26d2011-07-18 16:38:02 -0700490 public void toggleNavScreen() {
John Reckcc0059c2011-10-07 13:53:13 -0700491 if (!showingNavScreen()) {
Michael Kolb20be26d2011-07-18 16:38:02 -0700492 showNavScreen();
493 } else {
Michael Kolba3194d02011-09-07 11:23:51 -0700494 hideNavScreen(mUiController.getTabControl().getCurrentPosition(), false);
Michael Kolb20be26d2011-07-18 16:38:02 -0700495 }
496 }
497
John Reck1cf4b792011-07-26 10:22:22 -0700498 @Override
499 public boolean shouldCaptureThumbnails() {
500 return true;
501 }
502
Michael Kolbc3af0672011-08-09 10:24:41 -0700503 static class AnimScreen {
John Reck3ba45532011-08-11 16:26:53 -0700504
Michael Kolbc3af0672011-08-09 10:24:41 -0700505 private View mMain;
506 private ImageView mTitle;
507 private ImageView mContent;
508 private float mScale;
John Reckcc0059c2011-10-07 13:53:13 -0700509 private Bitmap mTitleBarBitmap;
510 private Bitmap mContentBitmap;
Michael Kolbc3af0672011-08-09 10:24:41 -0700511
John Reckcc0059c2011-10-07 13:53:13 -0700512 public AnimScreen(Context ctx) {
Michael Kolbc3af0672011-08-09 10:24:41 -0700513 mMain = LayoutInflater.from(ctx).inflate(R.layout.anim_screen,
514 null);
Michael Kolbc3af0672011-08-09 10:24:41 -0700515 mTitle = (ImageView) mMain.findViewById(R.id.title);
John Reckcc0059c2011-10-07 13:53:13 -0700516 mContent = (ImageView) mMain.findViewById(R.id.content);
517 mContent.setScaleType(ImageView.ScaleType.MATRIX);
518 mContent.setImageMatrix(new Matrix());
519 mScale = 1.0f;
520 setScaleFactor(getScaleFactor());
521 }
522
523 public void set(TitleBar tbar, WebView web) {
John Reck62077d82011-10-13 15:17:50 -0700524 if (tbar == null || web == null) {
525 return;
526 }
John Reck1adf0302011-10-11 10:58:12 -0700527 if (tbar.getWidth() > 0 && tbar.getEmbeddedHeight() > 0) {
528 if (mTitleBarBitmap == null
529 || mTitleBarBitmap.getWidth() != tbar.getWidth()
530 || mTitleBarBitmap.getHeight() != tbar.getEmbeddedHeight()) {
531 mTitleBarBitmap = Bitmap.createBitmap(tbar.getWidth(),
532 tbar.getEmbeddedHeight(), Bitmap.Config.RGB_565);
533 }
534 Canvas c = new Canvas(mTitleBarBitmap);
535 tbar.draw(c);
536 c.setBitmap(null);
537 } else {
538 mTitleBarBitmap = null;
John Reckcc0059c2011-10-07 13:53:13 -0700539 }
John Reckcc0059c2011-10-07 13:53:13 -0700540 mTitle.setImageBitmap(mTitleBarBitmap);
541 mTitle.setVisibility(View.VISIBLE);
John Reck9c5004e2011-10-07 16:00:12 -0700542 int h = web.getHeight() - tbar.getEmbeddedHeight();
John Reckcc0059c2011-10-07 13:53:13 -0700543 if (mContentBitmap == null
544 || mContentBitmap.getWidth() != web.getWidth()
545 || mContentBitmap.getHeight() != h) {
546 mContentBitmap = Bitmap.createBitmap(web.getWidth(), h,
547 Bitmap.Config.RGB_565);
548 }
John Reck1adf0302011-10-11 10:58:12 -0700549 Canvas c = new Canvas(mContentBitmap);
Michael Kolbc3af0672011-08-09 10:24:41 -0700550 int tx = web.getScrollX();
551 int ty = web.getScrollY();
John Reck9c5004e2011-10-07 16:00:12 -0700552 c.translate(-tx, -ty - tbar.getEmbeddedHeight());
John Reckcc0059c2011-10-07 13:53:13 -0700553 web.draw(c);
554 c.setBitmap(null);
555 mContent.setImageBitmap(mContentBitmap);
Michael Kolbc3af0672011-08-09 10:24:41 -0700556 }
557
John Reckcc0059c2011-10-07 13:53:13 -0700558 public void set(Bitmap image) {
Michael Kolba3194d02011-09-07 11:23:51 -0700559 mTitle.setVisibility(View.GONE);
Michael Kolbc3af0672011-08-09 10:24:41 -0700560 mContent.setImageBitmap(image);
Michael Kolbc3af0672011-08-09 10:24:41 -0700561 }
562
John Reckcc0059c2011-10-07 13:53:13 -0700563 private void setScaleFactor(float sf) {
Michael Kolbc3af0672011-08-09 10:24:41 -0700564 mScale = sf;
565 Matrix m = new Matrix();
566 m.postScale(sf,sf);
567 mContent.setImageMatrix(m);
568 }
569
John Reckcc0059c2011-10-07 13:53:13 -0700570 private float getScaleFactor() {
Michael Kolbc3af0672011-08-09 10:24:41 -0700571 return mScale;
572 }
573
John Reck3ba45532011-08-11 16:26:53 -0700574 }
575
Michael Kolb66706532010-12-12 19:50:22 -0800576}