blob: b2695869fa7d742ca50b2496381dfa26b543d2e1 [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;
Michael Kolba4183062011-01-16 10:43:21 -080032import android.view.KeyEvent;
Michael Kolbc3af0672011-08-09 10:24:41 -070033import android.view.LayoutInflater;
Michael Kolb66706532010-12-12 19:50:22 -080034import android.view.Menu;
Michael Kolb3ca12752011-07-20 13:52:25 -070035import android.view.MenuItem;
Michael Kolb66706532010-12-12 19:50:22 -080036import android.view.View;
Michael Kolb30adae62011-07-29 13:37:05 -070037import android.view.accessibility.AccessibilityEvent;
Michael Kolb66706532010-12-12 19:50:22 -080038import android.webkit.WebView;
Michael Kolbc3af0672011-08-09 10:24:41 -070039import android.widget.ImageView;
Michael Kolb66706532010-12-12 19:50:22 -080040
Michael Kolb629b22c2011-07-13 16:26:47 -070041import com.android.browser.UrlInputView.StateListener;
42
Michael Kolb66706532010-12-12 19:50:22 -080043/**
44 * Ui for regular phone screen sizes
45 */
46public class PhoneUi extends BaseUi {
47
48 private static final String LOGTAG = "PhoneUi";
John Reck9c5004e2011-10-07 16:00:12 -070049 private static final int MSG_INIT_NAVSCREEN = 100;
Michael Kolb66706532010-12-12 19:50:22 -080050
Michael Kolbf2055602011-04-09 17:20:03 -070051 private NavScreen mNavScreen;
John Reckcc0059c2011-10-07 13:53:13 -070052 private AnimScreen mAnimScreen;
John Reck0f602f32011-07-07 15:38:43 -070053 private NavigationBarPhone mNavigationBar;
John Reckaae029c2011-09-16 14:36:39 -070054 private int mActionBarHeight;
Michael Kolb66706532010-12-12 19:50:22 -080055
Michael Kolb08a687a2011-04-22 16:13:02 -070056 boolean mAnimating;
Michael Kolb66706532010-12-12 19:50:22 -080057
58 /**
59 * @param browser
60 * @param controller
61 */
62 public PhoneUi(Activity browser, UiController controller) {
63 super(browser, controller);
Michael Kolbfdb70242011-03-24 09:41:11 -070064 setUseQuickControls(BrowserSettings.getInstance().useQuickControls());
John Reck0f602f32011-07-07 15:38:43 -070065 mNavigationBar = (NavigationBarPhone) mTitleBar.getNavigationBar();
John Reckaae029c2011-09-16 14:36:39 -070066 TypedValue heightValue = new TypedValue();
67 browser.getTheme().resolveAttribute(
68 com.android.internal.R.attr.actionBarSize, heightValue, true);
69 mActionBarHeight = TypedValue.complexToDimensionPixelSize(heightValue.data,
70 browser.getResources().getDisplayMetrics());
John Reck285ef042011-02-11 15:44:17 -080071 }
Michael Kolb66706532010-12-12 19:50:22 -080072
John Reck285ef042011-02-11 15:44:17 -080073 @Override
Michael Kolb66706532010-12-12 19:50:22 -080074 public void onDestroy() {
Michael Kolb7cdc4902011-02-03 17:54:40 -080075 hideTitleBar();
Michael Kolb66706532010-12-12 19:50:22 -080076 }
77
78 @Override
Michael Kolb1f9b3562012-04-24 14:38:34 -070079 public void editUrl(boolean clearInput, boolean forceIME) {
Michael Kolb46f987e2011-04-05 10:39:10 -070080 if (mUseQuickControls) {
John Reck0f602f32011-07-07 15:38:43 -070081 mTitleBar.setShowProgressOnly(false);
Michael Kolb46f987e2011-04-05 10:39:10 -070082 }
Michael Kolb1f9b3562012-04-24 14:38:34 -070083 super.editUrl(clearInput, forceIME);
Michael Kolbdc2ee1b2011-02-14 14:34:40 -080084 }
85
86 @Override
Michael Kolb66706532010-12-12 19:50:22 -080087 public boolean onBackKey() {
John Reckcc0059c2011-10-07 13:53:13 -070088 if (showingNavScreen()) {
Michael Kolba3194d02011-09-07 11:23:51 -070089 mNavScreen.close(mUiController.getTabControl().getCurrentPosition());
Michael Kolbf2055602011-04-09 17:20:03 -070090 return true;
Michael Kolb66706532010-12-12 19:50:22 -080091 }
92 return super.onBackKey();
93 }
94
John Reckcc0059c2011-10-07 13:53:13 -070095 private boolean showingNavScreen() {
96 return mNavScreen != null && mNavScreen.getVisibility() == View.VISIBLE;
97 }
98
Michael Kolb66706532010-12-12 19:50:22 -080099 @Override
Michael Kolbf2055602011-04-09 17:20:03 -0700100 public boolean dispatchKey(int code, KeyEvent event) {
Michael Kolbf2055602011-04-09 17:20:03 -0700101 return false;
102 }
103
104 @Override
John Reck30c714c2010-12-16 17:30:34 -0800105 public void onProgressChanged(Tab tab) {
Michael Kolb66706532010-12-12 19:50:22 -0800106 if (tab.inForeground()) {
John Reck30c714c2010-12-16 17:30:34 -0800107 int progress = tab.getLoadProgress();
Michael Kolb7cdc4902011-02-03 17:54:40 -0800108 mTitleBar.setProgress(progress);
Michael Kolb66706532010-12-12 19:50:22 -0800109 }
John Reck9c5004e2011-10-07 16:00:12 -0700110 if (mNavScreen == null && getTitleBar().getHeight() > 0) {
111 mHandler.sendEmptyMessage(MSG_INIT_NAVSCREEN);
112 }
113 }
114
115 @Override
116 protected void handleMessage(Message msg) {
117 super.handleMessage(msg);
118 if (msg.what == MSG_INIT_NAVSCREEN) {
119 if (mNavScreen == null) {
120 mNavScreen = new NavScreen(mActivity, mUiController, this);
121 mCustomViewContainer.addView(mNavScreen, COVER_SCREEN_PARAMS);
122 mNavScreen.setVisibility(View.GONE);
123 }
124 if (mAnimScreen == null) {
125 mAnimScreen = new AnimScreen(mActivity);
126 // initialize bitmaps
127 mAnimScreen.set(getTitleBar(), getWebView());
128 }
129 }
Michael Kolb66706532010-12-12 19:50:22 -0800130 }
131
132 @Override
Michael Kolbfdb70242011-03-24 09:41:11 -0700133 public void setActiveTab(final Tab tab) {
John Reck8ee633f2011-08-09 16:00:35 -0700134 mTitleBar.cancelTitleBarAnimation(true);
135 mTitleBar.setSkipTitleBarAnimations(true);
John Reck5d43ce82011-06-21 17:16:51 -0700136 super.setActiveTab(tab);
Michael Kolbfdb70242011-03-24 09:41:11 -0700137 BrowserWebView view = (BrowserWebView) tab.getWebView();
Michael Kolb376b5412010-12-15 11:52:57 -0800138 // TabControl.setCurrentTab has been called before this,
139 // so the tab is guaranteed to have a webview
140 if (view == null) {
141 Log.e(LOGTAG, "active tab with no webview detected");
142 return;
143 }
Michael Kolbfdb70242011-03-24 09:41:11 -0700144 // Request focus on the top window.
145 if (mUseQuickControls) {
146 mPieControl.forceToTop(mContentView);
Michael Kolb4923c222012-04-02 16:18:36 -0700147 view.setTitleBar(null);
Michael Kolbfdb70242011-03-24 09:41:11 -0700148 } else {
Michael Kolb4923c222012-04-02 16:18:36 -0700149 view.setTitleBar(mTitleBar);
Michael Kolbfdb70242011-03-24 09:41:11 -0700150 }
Michael Kolb376b5412010-12-15 11:52:57 -0800151 if (tab.isInVoiceSearchMode()) {
Michael Kolbfdb70242011-03-24 09:41:11 -0700152 showVoiceTitleBar(tab.getVoiceDisplayTitle(), tab.getVoiceSearchResults());
Michael Kolb376b5412010-12-15 11:52:57 -0800153 } else {
154 revertVoiceTitleBar(tab);
155 }
Michael Kolb629b22c2011-07-13 16:26:47 -0700156 // update nav bar state
157 mNavigationBar.onStateChanged(StateListener.STATE_NORMAL);
Michael Kolbfdb70242011-03-24 09:41:11 -0700158 updateLockIconToLatest(tab);
John Reck8ee633f2011-08-09 16:00:35 -0700159 mTitleBar.setSkipTitleBarAnimations(false);
Michael Kolb376b5412010-12-15 11:52:57 -0800160 }
161
Michael Kolb66706532010-12-12 19:50:22 -0800162 // menu handling callbacks
163
164 @Override
Michael Kolb3ca12752011-07-20 13:52:25 -0700165 public boolean onPrepareOptionsMenu(Menu menu) {
Michael Kolb7bdee0b2011-08-01 11:55:38 -0700166 updateMenuState(mActiveTab, menu);
Michael Kolb3ca12752011-07-20 13:52:25 -0700167 return true;
168 }
169
170 @Override
Michael Kolb7bdee0b2011-08-01 11:55:38 -0700171 public void updateMenuState(Tab tab, Menu menu) {
Michael Kolb0d0245f2011-12-05 16:36:05 -0800172 MenuItem bm = menu.findItem(R.id.bookmarks_menu_id);
173 if (bm != null) {
174 bm.setVisible(!showingNavScreen());
175 }
Michael Kolb7bdee0b2011-08-01 11:55:38 -0700176 MenuItem abm = menu.findItem(R.id.add_bookmark_menu_id);
177 if (abm != null) {
John Reckcc0059c2011-10-07 13:53:13 -0700178 abm.setVisible((tab != null) && !tab.isSnapshot() && !showingNavScreen());
John Recke1a03a32011-09-14 17:04:16 -0700179 }
Michael Kolb315d5022011-10-13 12:47:11 -0700180 MenuItem info = menu.findItem(R.id.page_info_menu_id);
181 if (info != null) {
182 info.setVisible(false);
183 }
184 MenuItem newtab = menu.findItem(R.id.new_tab_menu_id);
185 if (newtab != null && !mUseQuickControls) {
186 newtab.setVisible(false);
187 }
188 MenuItem incognito = menu.findItem(R.id.incognito_menu_id);
189 if (incognito != null) {
190 incognito.setVisible(showingNavScreen() || mUseQuickControls);
191 }
John Reckcc0059c2011-10-07 13:53:13 -0700192 if (showingNavScreen()) {
John Recke1a03a32011-09-14 17:04:16 -0700193 menu.setGroupVisible(R.id.LIVE_MENU, false);
194 menu.setGroupVisible(R.id.SNAPSHOT_MENU, false);
John Recke1a03a32011-09-14 17:04:16 -0700195 menu.setGroupVisible(R.id.NAV_MENU, false);
Michael Kolb315d5022011-10-13 12:47:11 -0700196 menu.setGroupVisible(R.id.COMBO_MENU, true);
Michael Kolb7bdee0b2011-08-01 11:55:38 -0700197 }
198 }
199
200 @Override
Michael Kolb3ca12752011-07-20 13:52:25 -0700201 public boolean onOptionsItemSelected(MenuItem item) {
Michael Kolb315d5022011-10-13 12:47:11 -0700202 if (showingNavScreen()
203 && (item.getItemId() != R.id.history_menu_id)
204 && (item.getItemId() != R.id.snapshots_menu_id)) {
Michael Kolba3194d02011-09-07 11:23:51 -0700205 hideNavScreen(mUiController.getTabControl().getCurrentPosition(), false);
Michael Kolb3ca12752011-07-20 13:52:25 -0700206 }
207 return false;
208 }
209
210 @Override
Michael Kolb66706532010-12-12 19:50:22 -0800211 public void onContextMenuCreated(Menu menu) {
Michael Kolb7cdc4902011-02-03 17:54:40 -0800212 hideTitleBar();
Michael Kolb66706532010-12-12 19:50:22 -0800213 }
214
215 @Override
216 public void onContextMenuClosed(Menu menu, boolean inLoad) {
217 if (inLoad) {
Michael Kolb7cdc4902011-02-03 17:54:40 -0800218 showTitleBar();
Michael Kolb66706532010-12-12 19:50:22 -0800219 }
220 }
221
222 // action mode callbacks
223
224 @Override
225 public void onActionModeStarted(ActionMode mode) {
Michael Kolb42c0c062011-08-02 12:56:06 -0700226 if (!isEditingUrl()) {
227 hideTitleBar();
John Reckaae029c2011-09-16 14:36:39 -0700228 } else {
229 mTitleBar.animate().translationY(mActionBarHeight);
Michael Kolb42c0c062011-08-02 12:56:06 -0700230 }
Michael Kolb66706532010-12-12 19:50:22 -0800231 }
232
Michael Kolba4183062011-01-16 10:43:21 -0800233 @Override
John Reck6cda7b12011-03-18 15:57:13 -0700234 public void onActionModeFinished(boolean inLoad) {
John Reckaae029c2011-09-16 14:36:39 -0700235 mTitleBar.animate().translationY(0);
Michael Kolbc16c5952011-03-29 15:37:03 -0700236 if (inLoad) {
237 if (mUseQuickControls) {
238 mTitleBar.setShowProgressOnly(true);
John Reck6cda7b12011-03-18 15:57:13 -0700239 }
Michael Kolbc16c5952011-03-29 15:37:03 -0700240 showTitleBar();
241 }
John Reck6cda7b12011-03-18 15:57:13 -0700242 }
243
244 @Override
Michael Kolbc3af0672011-08-09 10:24:41 -0700245 public boolean isWebShowing() {
John Reckcc0059c2011-10-07 13:53:13 -0700246 return super.isWebShowing() && !showingNavScreen();
Michael Kolbc3af0672011-08-09 10:24:41 -0700247 }
248
249 @Override
250 public void showWeb(boolean animate) {
251 super.showWeb(animate);
Michael Kolba3194d02011-09-07 11:23:51 -0700252 hideNavScreen(mUiController.getTabControl().getCurrentPosition(), animate);
Michael Kolbc3af0672011-08-09 10:24:41 -0700253 }
254
Michael Kolbf2055602011-04-09 17:20:03 -0700255 void showNavScreen() {
Michael Kolbc3af0672011-08-09 10:24:41 -0700256 mUiController.setBlockEvents(true);
John Reckcc0059c2011-10-07 13:53:13 -0700257 if (mNavScreen == null) {
258 mNavScreen = new NavScreen(mActivity, mUiController, this);
259 mCustomViewContainer.addView(mNavScreen, COVER_SCREEN_PARAMS);
260 } else {
261 mNavScreen.setVisibility(View.VISIBLE);
262 mNavScreen.setAlpha(1f);
John Reck9c5004e2011-10-07 16:00:12 -0700263 mNavScreen.refreshAdapter();
John Reckcc0059c2011-10-07 13:53:13 -0700264 }
Michael Kolbc3af0672011-08-09 10:24:41 -0700265 mActiveTab.capture();
John Reckcc0059c2011-10-07 13:53:13 -0700266 if (mAnimScreen == null) {
267 mAnimScreen = new AnimScreen(mActivity);
John Reckce8bcb02011-10-11 13:45:29 -0700268 } else {
269 mAnimScreen.mMain.setAlpha(1f);
270 mAnimScreen.mTitle.setAlpha(1f);
271 mAnimScreen.setScaleFactor(1f);
John Reckcc0059c2011-10-07 13:53:13 -0700272 }
273 mAnimScreen.set(getTitleBar(), getWebView());
Michael Kolba30e4fb2011-11-07 17:32:01 -0800274 if (mAnimScreen.mMain.getParent() == null) {
275 mCustomViewContainer.addView(mAnimScreen.mMain, COVER_SCREEN_PARAMS);
276 }
Michael Kolbf2055602011-04-09 17:20:03 -0700277 mCustomViewContainer.setVisibility(View.VISIBLE);
278 mCustomViewContainer.bringToFront();
John Reckce8bcb02011-10-11 13:45:29 -0700279 mAnimScreen.mMain.layout(0, 0, mContentView.getWidth(),
280 mContentView.getHeight());
Michael Kolbc3af0672011-08-09 10:24:41 -0700281 int fromLeft = 0;
282 int fromTop = getTitleBar().getHeight();
283 int fromRight = mContentView.getWidth();
284 int fromBottom = mContentView.getHeight();
Michael Kolba3194d02011-09-07 11:23:51 -0700285 int width = mActivity.getResources().getDimensionPixelSize(R.dimen.nav_tab_width);
286 int height = mActivity.getResources().getDimensionPixelSize(R.dimen.nav_tab_height);
Michael Kolb7a321d62011-09-23 15:54:22 -0700287 int ntth = mActivity.getResources().getDimensionPixelSize(R.dimen.nav_tab_titleheight);
Michael Kolbc3af0672011-08-09 10:24:41 -0700288 int toLeft = (mContentView.getWidth() - width) / 2;
Michael Kolb7a321d62011-09-23 15:54:22 -0700289 int toTop = ((fromBottom - (ntth + height)) / 2 + ntth);
Michael Kolbc3af0672011-08-09 10:24:41 -0700290 int toRight = toLeft + width;
291 int toBottom = toTop + height;
292 float scaleFactor = width / (float) mContentView.getWidth();
293 detachTab(mActiveTab);
294 mContentView.setVisibility(View.GONE);
Michael Kolba3194d02011-09-07 11:23:51 -0700295 AnimatorSet set1 = new AnimatorSet();
Michael Kolbc3af0672011-08-09 10:24:41 -0700296 AnimatorSet inanim = new AnimatorSet();
John Reckcc0059c2011-10-07 13:53:13 -0700297 ObjectAnimator tx = ObjectAnimator.ofInt(mAnimScreen.mContent, "left",
Michael Kolbc3af0672011-08-09 10:24:41 -0700298 fromLeft, toLeft);
John Reckcc0059c2011-10-07 13:53:13 -0700299 ObjectAnimator ty = ObjectAnimator.ofInt(mAnimScreen.mContent, "top",
Michael Kolbc3af0672011-08-09 10:24:41 -0700300 fromTop, toTop);
John Reckcc0059c2011-10-07 13:53:13 -0700301 ObjectAnimator tr = ObjectAnimator.ofInt(mAnimScreen.mContent, "right",
Michael Kolbc3af0672011-08-09 10:24:41 -0700302 fromRight, toRight);
John Reckcc0059c2011-10-07 13:53:13 -0700303 ObjectAnimator tb = ObjectAnimator.ofInt(mAnimScreen.mContent, "bottom",
Michael Kolbc3af0672011-08-09 10:24:41 -0700304 fromBottom, toBottom);
John Reckcc0059c2011-10-07 13:53:13 -0700305 ObjectAnimator title = ObjectAnimator.ofFloat(mAnimScreen.mTitle, "alpha",
Michael Kolbc3af0672011-08-09 10:24:41 -0700306 1f, 0f);
John Reckcc0059c2011-10-07 13:53:13 -0700307 ObjectAnimator sx = ObjectAnimator.ofFloat(mAnimScreen, "scaleFactor",
Michael Kolbc3af0672011-08-09 10:24:41 -0700308 1f, scaleFactor);
John Reck1adf0302011-10-11 10:58:12 -0700309 ObjectAnimator blend1 = ObjectAnimator.ofFloat(mAnimScreen.mMain,
310 "alpha", 1f, 0f);
Michael Kolba3194d02011-09-07 11:23:51 -0700311 blend1.setDuration(100);
312
313 inanim.playTogether(tx, ty, tr, tb, sx, title);
314 inanim.setDuration(200);
315 set1.addListener(new AnimatorListenerAdapter() {
Michael Kolbc3af0672011-08-09 10:24:41 -0700316 @Override
317 public void onAnimationEnd(Animator anim) {
John Reck1adf0302011-10-11 10:58:12 -0700318 mCustomViewContainer.removeView(mAnimScreen.mMain);
Michael Kolbc3af0672011-08-09 10:24:41 -0700319 finishAnimationIn();
320 mUiController.setBlockEvents(false);
321 }
322 });
Michael Kolba3194d02011-09-07 11:23:51 -0700323 set1.playSequentially(inanim, blend1);
324 set1.start();
Michael Kolbc3af0672011-08-09 10:24:41 -0700325 }
326
327 private void finishAnimationIn() {
John Reckcc0059c2011-10-07 13:53:13 -0700328 if (showingNavScreen()) {
Michael Kolbb43f2f62011-08-17 10:39:31 -0700329 // notify accessibility manager about the screen change
330 mNavScreen.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
331 mTabControl.setOnThumbnailUpdatedListener(mNavScreen);
332 }
Michael Kolbf2055602011-04-09 17:20:03 -0700333 }
334
Michael Kolba3194d02011-09-07 11:23:51 -0700335 void hideNavScreen(int position, boolean animate) {
John Reckcc0059c2011-10-07 13:53:13 -0700336 if (!showingNavScreen()) return;
Michael Kolba3194d02011-09-07 11:23:51 -0700337 final Tab tab = mUiController.getTabControl().getTab(position);
Michael Kolbbf32cd02011-08-16 15:07:04 -0700338 if ((tab == null) || !animate) {
Michael Kolb365561d2011-08-18 09:56:25 -0700339 if (tab != null) {
340 setActiveTab(tab);
341 } else if (mTabControl.getTabCount() > 0) {
342 // use a fallback tab
343 setActiveTab(mTabControl.getCurrentTab());
344 }
Michael Kolbbf32cd02011-08-16 15:07:04 -0700345 mContentView.setVisibility(View.VISIBLE);
346 finishAnimateOut();
Michael Kolb8a009492011-08-15 15:37:30 -0700347 return;
Michael Kolbc3af0672011-08-09 10:24:41 -0700348 }
Michael Kolba3194d02011-09-07 11:23:51 -0700349 NavTabView tabview = (NavTabView) mNavScreen.getTabView(position);
Michael Kolbc3af0672011-08-09 10:24:41 -0700350 if (tabview == null) {
Michael Kolb365561d2011-08-18 09:56:25 -0700351 if (mTabControl.getTabCount() > 0) {
352 // use a fallback tab
353 setActiveTab(mTabControl.getCurrentTab());
354 }
Michael Kolbbf32cd02011-08-16 15:07:04 -0700355 mContentView.setVisibility(View.VISIBLE);
356 finishAnimateOut();
Michael Kolb8a009492011-08-15 15:37:30 -0700357 return;
Michael Kolbc3af0672011-08-09 10:24:41 -0700358 }
359 mUiController.setBlockEvents(true);
360 mUiController.setActiveTab(tab);
361 mContentView.setVisibility(View.VISIBLE);
John Reckcc0059c2011-10-07 13:53:13 -0700362 if (mAnimScreen == null) {
363 mAnimScreen = new AnimScreen(mActivity);
364 }
365 mAnimScreen.set(tab.getScreenshot());
Michael Kolb0755fcd2012-01-10 10:19:50 -0800366 if (mAnimScreen.mMain.getParent() == null) {
367 mCustomViewContainer.addView(mAnimScreen.mMain, COVER_SCREEN_PARAMS);
368 }
John Reckcc0059c2011-10-07 13:53:13 -0700369 mAnimScreen.mMain.layout(0, 0, mContentView.getWidth(),
Michael Kolba3194d02011-09-07 11:23:51 -0700370 mContentView.getHeight());
371 mNavScreen.mScroller.finishScroller();
372 ImageView target = tabview.mImage;
Michael Kolbc3af0672011-08-09 10:24:41 -0700373 int toLeft = 0;
Michael Kolbb7e16702011-12-15 11:59:40 -0800374 int toTop = (tab.getWebView() != null) ? tab.getWebView().getVisibleTitleHeight() : 0;
Michael Kolbc3af0672011-08-09 10:24:41 -0700375 int toRight = mContentView.getWidth();
Michael Kolba3194d02011-09-07 11:23:51 -0700376 int width = target.getDrawable().getIntrinsicWidth();
377 int height = target.getDrawable().getIntrinsicHeight();
378 int fromLeft = tabview.getLeft() + target.getLeft() - mNavScreen.mScroller.getScrollX();
379 int fromTop = tabview.getTop() + target.getTop() - mNavScreen.mScroller.getScrollY();
Michael Kolbc3af0672011-08-09 10:24:41 -0700380 int fromRight = fromLeft + width;
381 int fromBottom = fromTop + height;
382 float scaleFactor = mContentView.getWidth() / (float) width;
Michael Kolba3194d02011-09-07 11:23:51 -0700383 int toBottom = toTop + (int) (height * scaleFactor);
John Reck9c5004e2011-10-07 16:00:12 -0700384 mAnimScreen.mContent.setLeft(fromLeft);
385 mAnimScreen.mContent.setTop(fromTop);
386 mAnimScreen.mContent.setRight(fromRight);
387 mAnimScreen.mContent.setBottom(fromBottom);
388 mAnimScreen.setScaleFactor(1f);
Michael Kolba3194d02011-09-07 11:23:51 -0700389 AnimatorSet set1 = new AnimatorSet();
John Reckcc0059c2011-10-07 13:53:13 -0700390 ObjectAnimator fade2 = ObjectAnimator.ofFloat(mAnimScreen.mMain, "alpha", 0f, 1f);
Michael Kolba3194d02011-09-07 11:23:51 -0700391 ObjectAnimator fade1 = ObjectAnimator.ofFloat(mNavScreen, "alpha", 1f, 0f);
John Reck9c5004e2011-10-07 16:00:12 -0700392 set1.playTogether(fade1, fade2);
Michael Kolba3194d02011-09-07 11:23:51 -0700393 set1.setDuration(100);
394 AnimatorSet set2 = new AnimatorSet();
John Reckcc0059c2011-10-07 13:53:13 -0700395 ObjectAnimator l = ObjectAnimator.ofInt(mAnimScreen.mContent, "left",
Michael Kolbc3af0672011-08-09 10:24:41 -0700396 fromLeft, toLeft);
John Reckcc0059c2011-10-07 13:53:13 -0700397 ObjectAnimator t = ObjectAnimator.ofInt(mAnimScreen.mContent, "top",
Michael Kolbc3af0672011-08-09 10:24:41 -0700398 fromTop, toTop);
John Reckcc0059c2011-10-07 13:53:13 -0700399 ObjectAnimator r = ObjectAnimator.ofInt(mAnimScreen.mContent, "right",
Michael Kolbc3af0672011-08-09 10:24:41 -0700400 fromRight, toRight);
John Reckcc0059c2011-10-07 13:53:13 -0700401 ObjectAnimator b = ObjectAnimator.ofInt(mAnimScreen.mContent, "bottom",
Michael Kolbc3af0672011-08-09 10:24:41 -0700402 fromBottom, toBottom);
John Reckcc0059c2011-10-07 13:53:13 -0700403 ObjectAnimator scale = ObjectAnimator.ofFloat(mAnimScreen, "scaleFactor",
Michael Kolbc3af0672011-08-09 10:24:41 -0700404 1f, scaleFactor);
Michael Kolbc3af0672011-08-09 10:24:41 -0700405 ObjectAnimator otheralpha = ObjectAnimator.ofFloat(mCustomViewContainer, "alpha", 1f, 0f);
Michael Kolba3194d02011-09-07 11:23:51 -0700406 otheralpha.setDuration(100);
407 set2.playTogether(l, t, r, b, scale);
408 set2.setDuration(200);
409 AnimatorSet combo = new AnimatorSet();
410 combo.playSequentially(set1, set2, otheralpha);
411 combo.addListener(new AnimatorListenerAdapter() {
Michael Kolbc3af0672011-08-09 10:24:41 -0700412 @Override
413 public void onAnimationEnd(Animator anim) {
John Reckcc0059c2011-10-07 13:53:13 -0700414 mCustomViewContainer.removeView(mAnimScreen.mMain);
Michael Kolbbf32cd02011-08-16 15:07:04 -0700415 finishAnimateOut();
Michael Kolbc3af0672011-08-09 10:24:41 -0700416 mUiController.setBlockEvents(false);
417 }
418 });
Michael Kolba3194d02011-09-07 11:23:51 -0700419 combo.start();
Michael Kolbc3af0672011-08-09 10:24:41 -0700420 }
421
Michael Kolbbf32cd02011-08-16 15:07:04 -0700422 private void finishAnimateOut() {
John Reck8ee633f2011-08-09 16:00:35 -0700423 mTabControl.setOnThumbnailUpdatedListener(null);
John Reckcc0059c2011-10-07 13:53:13 -0700424 mNavScreen.setVisibility(View.GONE);
Michael Kolbc3af0672011-08-09 10:24:41 -0700425 mCustomViewContainer.setAlpha(1f);
Michael Kolbf2055602011-04-09 17:20:03 -0700426 mCustomViewContainer.setVisibility(View.GONE);
Michael Kolbf2055602011-04-09 17:20:03 -0700427 }
428
John Reck6b4bd5f2011-07-12 10:14:38 -0700429 @Override
430 public boolean needsRestoreAllTabs() {
431 return false;
432 }
433
Michael Kolb20be26d2011-07-18 16:38:02 -0700434 public void toggleNavScreen() {
John Reckcc0059c2011-10-07 13:53:13 -0700435 if (!showingNavScreen()) {
Michael Kolb20be26d2011-07-18 16:38:02 -0700436 showNavScreen();
437 } else {
Michael Kolba3194d02011-09-07 11:23:51 -0700438 hideNavScreen(mUiController.getTabControl().getCurrentPosition(), false);
Michael Kolb20be26d2011-07-18 16:38:02 -0700439 }
440 }
441
John Reck1cf4b792011-07-26 10:22:22 -0700442 @Override
443 public boolean shouldCaptureThumbnails() {
444 return true;
445 }
446
Michael Kolbc3af0672011-08-09 10:24:41 -0700447 static class AnimScreen {
John Reck3ba45532011-08-11 16:26:53 -0700448
Michael Kolbc3af0672011-08-09 10:24:41 -0700449 private View mMain;
450 private ImageView mTitle;
451 private ImageView mContent;
452 private float mScale;
John Reckcc0059c2011-10-07 13:53:13 -0700453 private Bitmap mTitleBarBitmap;
454 private Bitmap mContentBitmap;
Michael Kolbc3af0672011-08-09 10:24:41 -0700455
John Reckcc0059c2011-10-07 13:53:13 -0700456 public AnimScreen(Context ctx) {
Michael Kolbc3af0672011-08-09 10:24:41 -0700457 mMain = LayoutInflater.from(ctx).inflate(R.layout.anim_screen,
458 null);
Michael Kolbc3af0672011-08-09 10:24:41 -0700459 mTitle = (ImageView) mMain.findViewById(R.id.title);
John Reckcc0059c2011-10-07 13:53:13 -0700460 mContent = (ImageView) mMain.findViewById(R.id.content);
461 mContent.setScaleType(ImageView.ScaleType.MATRIX);
462 mContent.setImageMatrix(new Matrix());
463 mScale = 1.0f;
464 setScaleFactor(getScaleFactor());
465 }
466
467 public void set(TitleBar tbar, WebView web) {
John Reck62077d82011-10-13 15:17:50 -0700468 if (tbar == null || web == null) {
469 return;
470 }
John Reck1adf0302011-10-11 10:58:12 -0700471 if (tbar.getWidth() > 0 && tbar.getEmbeddedHeight() > 0) {
472 if (mTitleBarBitmap == null
473 || mTitleBarBitmap.getWidth() != tbar.getWidth()
474 || mTitleBarBitmap.getHeight() != tbar.getEmbeddedHeight()) {
John Recka98c83b2011-10-31 12:31:58 -0700475 mTitleBarBitmap = safeCreateBitmap(tbar.getWidth(),
476 tbar.getEmbeddedHeight());
John Reck1adf0302011-10-11 10:58:12 -0700477 }
John Recka98c83b2011-10-31 12:31:58 -0700478 if (mTitleBarBitmap != null) {
479 Canvas c = new Canvas(mTitleBarBitmap);
480 tbar.draw(c);
481 c.setBitmap(null);
482 }
John Reck1adf0302011-10-11 10:58:12 -0700483 } else {
484 mTitleBarBitmap = null;
John Reckcc0059c2011-10-07 13:53:13 -0700485 }
John Reckcc0059c2011-10-07 13:53:13 -0700486 mTitle.setImageBitmap(mTitleBarBitmap);
487 mTitle.setVisibility(View.VISIBLE);
John Reck9c5004e2011-10-07 16:00:12 -0700488 int h = web.getHeight() - tbar.getEmbeddedHeight();
John Reckcc0059c2011-10-07 13:53:13 -0700489 if (mContentBitmap == null
490 || mContentBitmap.getWidth() != web.getWidth()
491 || mContentBitmap.getHeight() != h) {
John Recka98c83b2011-10-31 12:31:58 -0700492 mContentBitmap = safeCreateBitmap(web.getWidth(), h);
John Reckcc0059c2011-10-07 13:53:13 -0700493 }
John Recka98c83b2011-10-31 12:31:58 -0700494 if (mContentBitmap != null) {
495 Canvas c = new Canvas(mContentBitmap);
496 int tx = web.getScrollX();
497 int ty = web.getScrollY();
498 c.translate(-tx, -ty - tbar.getEmbeddedHeight());
499 web.draw(c);
500 c.setBitmap(null);
501 }
John Reckcc0059c2011-10-07 13:53:13 -0700502 mContent.setImageBitmap(mContentBitmap);
Michael Kolbc3af0672011-08-09 10:24:41 -0700503 }
504
John Recka98c83b2011-10-31 12:31:58 -0700505 private Bitmap safeCreateBitmap(int width, int height) {
506 if (width <= 0 || height <= 0) {
507 Log.w(LOGTAG, "safeCreateBitmap failed! width: " + width
508 + ", height: " + height);
509 return null;
510 }
511 return Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
512 }
513
John Reckcc0059c2011-10-07 13:53:13 -0700514 public void set(Bitmap image) {
Michael Kolba3194d02011-09-07 11:23:51 -0700515 mTitle.setVisibility(View.GONE);
Michael Kolbc3af0672011-08-09 10:24:41 -0700516 mContent.setImageBitmap(image);
Michael Kolbc3af0672011-08-09 10:24:41 -0700517 }
518
John Reckcc0059c2011-10-07 13:53:13 -0700519 private void setScaleFactor(float sf) {
Michael Kolbc3af0672011-08-09 10:24:41 -0700520 mScale = sf;
521 Matrix m = new Matrix();
522 m.postScale(sf,sf);
523 mContent.setImageMatrix(m);
524 }
525
John Reckcc0059c2011-10-07 13:53:13 -0700526 private float getScaleFactor() {
Michael Kolbc3af0672011-08-09 10:24:41 -0700527 return mScale;
528 }
529
John Reck3ba45532011-08-11 16:26:53 -0700530 }
531
Michael Kolb66706532010-12-12 19:50:22 -0800532}