blob: 063a21c3484e19a2695181dbe7960a4159d06d72 [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
Bijan Amirzada41242f22014-03-21 12:12:18 -070017package com.android.browser;
Michael Kolb66706532010-12-12 19:50:22 -080018
Michael Kolbc3af0672011-08-09 10:24:41 -070019import android.animation.Animator;
20import android.animation.AnimatorListenerAdapter;
21import android.animation.AnimatorSet;
22import android.animation.ObjectAnimator;
Pankaj Garg175dfbc2015-07-10 15:03:49 -070023import android.app.ActionBar;
Michael Kolb66706532010-12-12 19:50:22 -080024import android.app.Activity;
Michael Kolbc3af0672011-08-09 10:24:41 -070025import android.content.Context;
26import android.graphics.Bitmap;
Michael Kolbc3af0672011-08-09 10:24:41 -070027import android.graphics.Matrix;
Tarun Nainani87a86682015-02-05 11:47:35 -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 Kolba4183062011-01-16 10:43:21 -080031import android.view.KeyEvent;
Michael Kolbc3af0672011-08-09 10:24:41 -070032import android.view.LayoutInflater;
Michael Kolb66706532010-12-12 19:50:22 -080033import android.view.Menu;
Michael Kolb3ca12752011-07-20 13:52:25 -070034import android.view.MenuItem;
Michael Kolb66706532010-12-12 19:50:22 -080035import android.view.View;
Tarun Nainani87a86682015-02-05 11:47:35 -080036import android.view.ViewStub;
Michael Kolb30adae62011-07-29 13:37:05 -070037import android.view.accessibility.AccessibilityEvent;
Enrico Ros1f5a0952014-11-18 20:15:48 -080038import android.view.animation.DecelerateInterpolator;
Pankaj Garg66f8cef2015-07-07 17:29:03 -070039
Tarun Nainani87a86682015-02-05 11:47:35 -080040import org.codeaurora.swe.WebView;
41
Michael Kolbc3af0672011-08-09 10:24:41 -070042import android.widget.ImageView;
Michael Kolb66706532010-12-12 19:50:22 -080043
Bijan Amirzada41242f22014-03-21 12:12:18 -070044import com.android.browser.UrlInputView.StateListener;
Michael Kolb629b22c2011-07-13 16:26:47 -070045
Dany Rybnikovbcd37da2015-04-20 11:43:15 +030046import org.codeaurora.net.NetworkServices;
Pankaj Garg79878492015-04-01 14:48:21 -070047
Michael Kolb66706532010-12-12 19:50:22 -080048/**
49 * Ui for regular phone screen sizes
50 */
51public class PhoneUi extends BaseUi {
52
53 private static final String LOGTAG = "PhoneUi";
54
Michael Kolbf2055602011-04-09 17:20:03 -070055 private NavScreen mNavScreen;
John Reckcc0059c2011-10-07 13:53:13 -070056 private AnimScreen mAnimScreen;
Tarun Nainani87a86682015-02-05 11:47:35 -080057 private final NavigationBarPhone mNavigationBar;
Sagar Dhawanf7b5d0b2015-02-06 15:47:20 -080058 private boolean mNavScreenRequested = false;
Michael Kolb66706532010-12-12 19:50:22 -080059
yijunx.zhu2230a312012-07-27 13:37:00 -040060 boolean mShowNav = false;
Tarun Nainani87a86682015-02-05 11:47:35 -080061 private ComboView mComboView;
Michael Kolb66706532010-12-12 19:50:22 -080062
Vivek Sekhar60eb9802014-07-21 19:13:33 -070063
Michael Kolb66706532010-12-12 19:50:22 -080064 /**
65 * @param browser
66 * @param controller
67 */
68 public PhoneUi(Activity browser, UiController controller) {
69 super(browser, controller);
John Reck0f602f32011-07-07 15:38:43 -070070 mNavigationBar = (NavigationBarPhone) mTitleBar.getNavigationBar();
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();
Karthikeyan Periasamy5b8f5752015-01-13 16:00:27 -080076 // Free the allocated memory for GC to clear it from the heap.
77 mAnimScreen = null;
Michael Kolb66706532010-12-12 19:50:22 -080078 }
79
80 @Override
Michael Kolb1f9b3562012-04-24 14:38:34 -070081 public void editUrl(boolean clearInput, boolean forceIME) {
yijunx.zhu2230a312012-07-27 13:37:00 -040082 //Do nothing while at Nav show screen.
83 if (mShowNav) return;
Michael Kolb1f9b3562012-04-24 14:38:34 -070084 super.editUrl(clearInput, forceIME);
Michael Kolbdc2ee1b2011-02-14 14:34:40 -080085 }
86
87 @Override
Tarun Nainani87a86682015-02-05 11:47:35 -080088 public void showComboView(ComboViews startingView, Bundle extras) {
89
90 if (mComboView == null) {
Pankaj Garg66f8cef2015-07-07 17:29:03 -070091 if (mNavScreen != null) {
92 mNavScreen.setVisibility(View.GONE);
93 }
94 ViewStub stub = (ViewStub) mActivity.getWindow().
95 getDecorView().findViewById(R.id.combo_view_stub);
Tarun Nainani87a86682015-02-05 11:47:35 -080096 mComboView = (ComboView) stub.inflate();
97 mComboView.setVisibility(View.GONE);
98 mComboView.setupViews(mActivity);
99 }
100
101 Bundle b = new Bundle();
102 b.putString(ComboViewActivity.EXTRA_INITIAL_VIEW, startingView.name());
103 b.putBundle(ComboViewActivity.EXTRA_COMBO_ARGS, extras);
104 Tab t = getActiveTab();
105 if (t != null) {
106 b.putString(ComboViewActivity.EXTRA_CURRENT_URL, t.getUrl());
107 }
108
109 mComboView.showViews(mActivity, b);
110 }
111
112 @Override
113 public void hideComboView() {
114 mComboView.hideViews();
115 }
116
117 @Override
Michael Kolb66706532010-12-12 19:50:22 -0800118 public boolean onBackKey() {
John Reckcc0059c2011-10-07 13:53:13 -0700119 if (showingNavScreen()) {
Michael Kolba3194d02011-09-07 11:23:51 -0700120 mNavScreen.close(mUiController.getTabControl().getCurrentPosition());
Michael Kolbf2055602011-04-09 17:20:03 -0700121 return true;
Michael Kolb66706532010-12-12 19:50:22 -0800122 }
Pankaj Garg66f8cef2015-07-07 17:29:03 -0700123 if (isComboViewShowing()) {
Tarun Nainani87a86682015-02-05 11:47:35 -0800124 hideComboView();
125 return true;
126 }
Michael Kolb66706532010-12-12 19:50:22 -0800127 return super.onBackKey();
128 }
129
John Reckcc0059c2011-10-07 13:53:13 -0700130 private boolean showingNavScreen() {
131 return mNavScreen != null && mNavScreen.getVisibility() == View.VISIBLE;
132 }
133
Michael Kolb66706532010-12-12 19:50:22 -0800134 @Override
Michael Kolbf2055602011-04-09 17:20:03 -0700135 public boolean dispatchKey(int code, KeyEvent event) {
Michael Kolbf2055602011-04-09 17:20:03 -0700136 return false;
137 }
138
139 @Override
Michael Kolbfdb70242011-03-24 09:41:11 -0700140 public void setActiveTab(final Tab tab) {
John Reck5d43ce82011-06-21 17:16:51 -0700141 super.setActiveTab(tab);
yijunx.zhu2230a312012-07-27 13:37:00 -0400142
143 //if at Nav screen show, detach tab like what showNavScreen() do.
144 if (mShowNav) {
145 detachTab(mActiveTab);
146 }
147
Michael Kolbfdb70242011-03-24 09:41:11 -0700148 BrowserWebView view = (BrowserWebView) tab.getWebView();
Michael Kolb376b5412010-12-15 11:52:57 -0800149 // TabControl.setCurrentTab has been called before this,
150 // so the tab is guaranteed to have a webview
151 if (view == null) {
152 Log.e(LOGTAG, "active tab with no webview detected");
153 return;
154 }
Michael Kolbfdb70242011-03-24 09:41:11 -0700155 // Request focus on the top window.
Vivek Sekhar3bec6a32014-10-22 17:03:42 -0700156 view.setTitleBar(mTitleBar);
157
Michael Kolb629b22c2011-07-13 16:26:47 -0700158 // update nav bar state
159 mNavigationBar.onStateChanged(StateListener.STATE_NORMAL);
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 Kolb315d5022011-10-13 12:47:11 -0700176 MenuItem info = menu.findItem(R.id.page_info_menu_id);
177 if (info != null) {
178 info.setVisible(false);
179 }
Pankaj Garg49b79252014-11-07 17:33:41 -0800180
John Reckcc0059c2011-10-07 13:53:13 -0700181 if (showingNavScreen()) {
Pankaj Garg49b79252014-11-07 17:33:41 -0800182 setMenuItemVisibility(menu, R.id.history_menu_id, false);
183 setMenuItemVisibility(menu, R.id.find_menu_id, false);
John Recke1a03a32011-09-14 17:04:16 -0700184 menu.setGroupVisible(R.id.LIVE_MENU, false);
Pankaj Garg49b79252014-11-07 17:33:41 -0800185 setMenuItemVisibility(menu, R.id.save_snapshot_menu_id, false);
John Recke1a03a32011-09-14 17:04:16 -0700186 menu.setGroupVisible(R.id.SNAPSHOT_MENU, false);
John Recke1a03a32011-09-14 17:04:16 -0700187 menu.setGroupVisible(R.id.NAV_MENU, false);
Michael Kolb7bdee0b2011-08-01 11:55:38 -0700188 }
Tarun Nainani87a86682015-02-05 11:47:35 -0800189
Pankaj Garg66f8cef2015-07-07 17:29:03 -0700190 if (isComboViewShowing()) {
Tarun Nainani87a86682015-02-05 11:47:35 -0800191 menu.setGroupVisible(R.id.MAIN_MENU, false);
192 menu.setGroupEnabled(R.id.MAIN_MENU, false);
193 menu.setGroupEnabled(R.id.MAIN_SHORTCUT_MENU, false);
194 }
195
Michael Kolb7bdee0b2011-08-01 11:55:38 -0700196 }
197
198 @Override
Michael Kolb3ca12752011-07-20 13:52:25 -0700199 public boolean onOptionsItemSelected(MenuItem item) {
Michael Kolb315d5022011-10-13 12:47:11 -0700200 if (showingNavScreen()
201 && (item.getItemId() != R.id.history_menu_id)
202 && (item.getItemId() != R.id.snapshots_menu_id)) {
Michael Kolba3194d02011-09-07 11:23:51 -0700203 hideNavScreen(mUiController.getTabControl().getCurrentPosition(), false);
Michael Kolb3ca12752011-07-20 13:52:25 -0700204 }
205 return false;
206 }
207
208 @Override
Michael Kolb66706532010-12-12 19:50:22 -0800209 public void onContextMenuCreated(Menu menu) {
Michael Kolb7cdc4902011-02-03 17:54:40 -0800210 hideTitleBar();
Michael Kolb66706532010-12-12 19:50:22 -0800211 }
212
213 @Override
214 public void onContextMenuClosed(Menu menu, boolean inLoad) {
215 if (inLoad) {
Michael Kolb7cdc4902011-02-03 17:54:40 -0800216 showTitleBar();
Michael Kolb66706532010-12-12 19:50:22 -0800217 }
218 }
219
220 // action mode callbacks
221
222 @Override
223 public void onActionModeStarted(ActionMode mode) {
Bijan Amirzada357ec8a2014-04-08 14:19:10 -0700224 super.onActionModeStarted(mode);
Michael Kolb42c0c062011-08-02 12:56:06 -0700225 if (!isEditingUrl()) {
Pankaj Garg175dfbc2015-07-10 15:03:49 -0700226 mTitleBar.setVisibility(View.GONE);
227 }
228
229 ActionBar actionBar = mActivity.getActionBar();
230 if (actionBar != null) {
231 actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
232 actionBar.hide();
Michael Kolb42c0c062011-08-02 12:56:06 -0700233 }
Michael Kolb66706532010-12-12 19:50:22 -0800234 }
235
Michael Kolba4183062011-01-16 10:43:21 -0800236 @Override
John Reck6cda7b12011-03-18 15:57:13 -0700237 public void onActionModeFinished(boolean inLoad) {
Bijan Amirzada357ec8a2014-04-08 14:19:10 -0700238 super.onActionModeFinished(inLoad);
Pankaj Garg175dfbc2015-07-10 15:03:49 -0700239 mTitleBar.setVisibility(View.VISIBLE);
John Reck6cda7b12011-03-18 15:57:13 -0700240 }
241
242 @Override
Michael Kolbc3af0672011-08-09 10:24:41 -0700243 public boolean isWebShowing() {
Pankaj Garg66f8cef2015-07-07 17:29:03 -0700244 return super.isWebShowing() && !showingNavScreen() && !isComboViewShowing();
Tarun Nainani87a86682015-02-05 11:47:35 -0800245 }
246
247 @Override
248 public boolean isComboViewShowing() {
Pankaj Garg66f8cef2015-07-07 17:29:03 -0700249 return mComboView != null && mComboView.getVisibility() == View.VISIBLE;
Michael Kolbc3af0672011-08-09 10:24:41 -0700250 }
251
252 @Override
253 public void showWeb(boolean animate) {
254 super.showWeb(animate);
Michael Kolba3194d02011-09-07 11:23:51 -0700255 hideNavScreen(mUiController.getTabControl().getCurrentPosition(), animate);
Michael Kolbc3af0672011-08-09 10:24:41 -0700256 }
257
Sagar Dhawanf7b5d0b2015-02-06 15:47:20 -0800258 //Unblock touch events
259 private void unblockEvents() {
260 mUiController.setBlockEvents(false);
261 }
262 //Block touch events
263 private void blockEvents() {
264 mUiController.setBlockEvents(true);
265 }
266
267 @Override
268 public void cancelNavScreenRequest() {
269 mNavScreenRequested = false;
270 }
271
Michael Kolbf2055602011-04-09 17:20:03 -0700272 void showNavScreen() {
Pankaj Garg79878492015-04-01 14:48:21 -0700273 blockEvents();
274 mNavScreenRequested = true;
275 mTabControl.setOnThumbnailUpdatedListener(
276 new TabControl.OnThumbnailUpdatedListener() {
277 @Override
278 public void onThumbnailUpdated(Tab t) {
279 mTabControl.setOnThumbnailUpdatedListener(null);
Sagar Dhawanf7b5d0b2015-02-06 15:47:20 -0800280
Pankaj Garg79878492015-04-01 14:48:21 -0700281 // Discard the callback if the req is interrupted
282 if (!mNavScreenRequested) {
283 unblockEvents();
284 return;
Sudheer Koganti06cd42f2015-01-30 15:35:12 -0800285 }
Pankaj Garg79878492015-04-01 14:48:21 -0700286
287 Bitmap bm = t.getScreenshot();
288 Bitmap sbm;
289 WebView webView = getWebView();
290 if (webView != null) {
291 int view_width = webView.getWidth();
292 int capture_width = mActivity.getResources().getDimensionPixelSize(
293 R.dimen.tab_thumbnail_width);
294
295 float scale = (float) view_width / capture_width;
296
297 //Upscale the low-res bitmap to the needed size
298 Matrix m = new Matrix();
299 m.postScale(scale, scale);
300 sbm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
301 bm.getHeight(), m, false);
302 } else {
303 sbm = bm;
304 }
305
306 onShowNavScreenContinue(sbm);
Sudheer Koganti06cd42f2015-01-30 15:35:12 -0800307 }
Pankaj Garg79878492015-04-01 14:48:21 -0700308 });
Dany Rybnikovbcd37da2015-04-20 11:43:15 +0300309 if (!BrowserSettings.getInstance().isPowerSaveModeEnabled()) {
310 //Notify about anticipated network activity
311 NetworkServices.hintUpcomingUserActivity();
312 }
Pankaj Garg79878492015-04-01 14:48:21 -0700313 mActiveTab.capture();
Tarun Nainaniea28dde2014-08-27 17:25:09 -0700314 }
315
Sagar Dhawanf7b5d0b2015-02-06 15:47:20 -0800316 void onShowNavScreenContinue(Bitmap viewportBitmap) {
317 dismissIME();
318 mShowNav = true;
319 mNavScreenRequested = false;
John Reckcc0059c2011-10-07 13:53:13 -0700320 if (mNavScreen == null) {
321 mNavScreen = new NavScreen(mActivity, mUiController, this);
322 mCustomViewContainer.addView(mNavScreen, COVER_SCREEN_PARAMS);
323 } else {
324 mNavScreen.setVisibility(View.VISIBLE);
325 mNavScreen.setAlpha(1f);
John Reck9c5004e2011-10-07 16:00:12 -0700326 mNavScreen.refreshAdapter();
John Reckcc0059c2011-10-07 13:53:13 -0700327 }
Sagar Dhawan01493f62015-02-09 11:03:19 -0800328 if (mAnimScreen == null) {
329 mAnimScreen = new AnimScreen(mActivity);
330 } else {
331 mAnimScreen.mMain.setAlpha(1f);
332 mAnimScreen.setScaleFactor(1f);
333 }
334 mAnimScreen.set(getTitleBar(), viewportBitmap);
335 if (mAnimScreen.mMain.getParent() == null) {
336 mCustomViewContainer.addView(mAnimScreen.mMain, COVER_SCREEN_PARAMS);
337 }
Michael Kolbf2055602011-04-09 17:20:03 -0700338 mCustomViewContainer.setVisibility(View.VISIBLE);
339 mCustomViewContainer.bringToFront();
Sagar Dhawan01493f62015-02-09 11:03:19 -0800340 mAnimScreen.mMain.layout(0, 0, mContentView.getWidth(),
341 mContentView.getHeight());
342 int fromLeft = 0;
343 int fromTop = getTitleBar().getHeight();
344 int fromRight = mContentView.getWidth();
345 int fromBottom = mContentView.getHeight();
346 int width = mActivity.getResources().getDimensionPixelSize(R.dimen.nav_tab_width);
347 int height = mActivity.getResources().getDimensionPixelSize(R.dimen.nav_tab_height);
348 int ntth = mActivity.getResources().getDimensionPixelSize(R.dimen.nav_tab_titleheight);
349 int toLeft = (mContentView.getWidth() - width) / 2;
350 int toTop = ((fromBottom - (ntth + height)) / 2 + ntth);
351 int toRight = toLeft + width;
352 int toBottom = toTop + height;
353 float toScaleFactor = width / (float) mContentView.getWidth();
354 ObjectAnimator tx = ObjectAnimator.ofInt(mAnimScreen.mContent, "left", fromLeft, toLeft);
355 ObjectAnimator ty = ObjectAnimator.ofInt(mAnimScreen.mContent, "top", fromTop, toTop);
356 ObjectAnimator tr = ObjectAnimator.ofInt(mAnimScreen.mContent, "right", fromRight, toRight);
Pankaj Garg66f8cef2015-07-07 17:29:03 -0700357 ObjectAnimator tb = ObjectAnimator.ofInt(mAnimScreen.mContent, "bottom",
358 fromBottom, toBottom);
Sagar Dhawan01493f62015-02-09 11:03:19 -0800359 ObjectAnimator sx = ObjectAnimator.ofFloat(mAnimScreen, "scaleFactor", 1f, toScaleFactor);
360 ObjectAnimator navTabsIn = mNavScreen.createToolbarInAnimator();
361 mAnimScreen.mContent.layout(fromLeft, fromTop, fromRight, fromBottom);
362 mAnimScreen.setScaleFactor(1f);
Michael Kolba3194d02011-09-07 11:23:51 -0700363
Sagar Dhawan01493f62015-02-09 11:03:19 -0800364 AnimatorSet inanim = new AnimatorSet();
365 inanim.playTogether(tx, ty, tr, tb, sx, navTabsIn);
366 inanim.setInterpolator(new DecelerateInterpolator());
367 inanim.setDuration(200);
Enrico Ros1f5a0952014-11-18 20:15:48 -0800368
Sagar Dhawan01493f62015-02-09 11:03:19 -0800369 ObjectAnimator disappear = ObjectAnimator.ofFloat(mAnimScreen.mMain, "alpha", 1f, 0f);
370 disappear.setInterpolator(new DecelerateInterpolator());
371 disappear.setDuration(100);
Enrico Ros1f5a0952014-11-18 20:15:48 -0800372
Sagar Dhawan01493f62015-02-09 11:03:19 -0800373 AnimatorSet set1 = new AnimatorSet();
374 set1.addListener(new AnimatorListenerAdapter() {
375 @Override
376 public void onAnimationStart(Animator animation) {
377 mContentView.setVisibility(View.GONE);
378 }
379 @Override
380 public void onAnimationEnd(Animator anim) {
381 mCustomViewContainer.removeView(mAnimScreen.mMain);
382 finishAnimationIn();
Sagar Dhawanf7b5d0b2015-02-06 15:47:20 -0800383 unblockEvents();
Sagar Dhawan01493f62015-02-09 11:03:19 -0800384 }
385 });
386 set1.playSequentially(inanim, disappear);
387 set1.start();
Sagar Dhawanf7b5d0b2015-02-06 15:47:20 -0800388 unblockEvents();
Michael Kolbc3af0672011-08-09 10:24:41 -0700389 }
390
391 private void finishAnimationIn() {
John Reckcc0059c2011-10-07 13:53:13 -0700392 if (showingNavScreen()) {
Michael Kolbb43f2f62011-08-17 10:39:31 -0700393 // notify accessibility manager about the screen change
394 mNavScreen.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
Michael Kolbb43f2f62011-08-17 10:39:31 -0700395 }
Michael Kolbf2055602011-04-09 17:20:03 -0700396 }
397
Michael Kolba3194d02011-09-07 11:23:51 -0700398 void hideNavScreen(int position, boolean animate) {
Sagar Dhawanf7b5d0b2015-02-06 15:47:20 -0800399
yijunx.zhu2230a312012-07-27 13:37:00 -0400400 mShowNav = false;
John Reckcc0059c2011-10-07 13:53:13 -0700401 if (!showingNavScreen()) return;
Michael Kolba3194d02011-09-07 11:23:51 -0700402 final Tab tab = mUiController.getTabControl().getTab(position);
Michael Kolbbf32cd02011-08-16 15:07:04 -0700403 if ((tab == null) || !animate) {
Michael Kolb365561d2011-08-18 09:56:25 -0700404 if (tab != null) {
405 setActiveTab(tab);
406 } else if (mTabControl.getTabCount() > 0) {
407 // use a fallback tab
408 setActiveTab(mTabControl.getCurrentTab());
409 }
Michael Kolbbf32cd02011-08-16 15:07:04 -0700410 mContentView.setVisibility(View.VISIBLE);
411 finishAnimateOut();
Michael Kolb8a009492011-08-15 15:37:30 -0700412 return;
Michael Kolbc3af0672011-08-09 10:24:41 -0700413 }
Michael Kolba3194d02011-09-07 11:23:51 -0700414 NavTabView tabview = (NavTabView) mNavScreen.getTabView(position);
Michael Kolbc3af0672011-08-09 10:24:41 -0700415 if (tabview == null) {
Michael Kolb365561d2011-08-18 09:56:25 -0700416 if (mTabControl.getTabCount() > 0) {
417 // use a fallback tab
418 setActiveTab(mTabControl.getCurrentTab());
419 }
Michael Kolbbf32cd02011-08-16 15:07:04 -0700420 mContentView.setVisibility(View.VISIBLE);
421 finishAnimateOut();
Michael Kolb8a009492011-08-15 15:37:30 -0700422 return;
Michael Kolbc3af0672011-08-09 10:24:41 -0700423 }
Sagar Dhawanf7b5d0b2015-02-06 15:47:20 -0800424 blockEvents();
Michael Kolbc3af0672011-08-09 10:24:41 -0700425 mUiController.setActiveTab(tab);
426 mContentView.setVisibility(View.VISIBLE);
John Reckcc0059c2011-10-07 13:53:13 -0700427 if (mAnimScreen == null) {
428 mAnimScreen = new AnimScreen(mActivity);
429 }
Tarun Nainani8eb00912014-07-17 12:28:32 -0700430 ImageView target = tabview.mImage;
431 int width = target.getDrawable().getIntrinsicWidth();
432 int height = target.getDrawable().getIntrinsicHeight();
Tarun Nainaniea28dde2014-08-27 17:25:09 -0700433 Bitmap bm = tab.getScreenshot();
Vivek Sekharc549e3a2014-06-05 16:19:26 -0700434 if (bm == null)
435 bm = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
436 mAnimScreen.set(bm);
Michael Kolb0755fcd2012-01-10 10:19:50 -0800437 if (mAnimScreen.mMain.getParent() == null) {
438 mCustomViewContainer.addView(mAnimScreen.mMain, COVER_SCREEN_PARAMS);
439 }
John Reckcc0059c2011-10-07 13:53:13 -0700440 mAnimScreen.mMain.layout(0, 0, mContentView.getWidth(),
Tarun Nainani8eb00912014-07-17 12:28:32 -0700441 mContentView.getHeight());
Enrico Ros80c045a2014-11-24 15:23:12 -0800442 mNavScreen.getScroller().finishScroller();
Michael Kolbc3af0672011-08-09 10:24:41 -0700443 int toLeft = 0;
Tarun Nainani8eb00912014-07-17 12:28:32 -0700444 int toTop = mTitleBar.calculateEmbeddedHeight();
Michael Kolbc3af0672011-08-09 10:24:41 -0700445 int toRight = mContentView.getWidth();
Enrico Ros80c045a2014-11-24 15:23:12 -0800446 int fromLeft = tabview.getLeft() + target.getLeft() - mNavScreen.getScroller().getScrollX();
447 int fromTop = tabview.getTop() + target.getTop() - mNavScreen.getScroller().getScrollY();
Tarun Nainani8eb00912014-07-17 12:28:32 -0700448 int fromRight = fromLeft + width;
449 int fromBottom = fromTop + height;
Michael Kolbc3af0672011-08-09 10:24:41 -0700450 float scaleFactor = mContentView.getWidth() / (float) width;
Michael Kolba3194d02011-09-07 11:23:51 -0700451 int toBottom = toTop + (int) (height * scaleFactor);
John Reck9c5004e2011-10-07 16:00:12 -0700452 mAnimScreen.mContent.setLeft(fromLeft);
453 mAnimScreen.mContent.setTop(fromTop);
454 mAnimScreen.mContent.setRight(fromRight);
455 mAnimScreen.mContent.setBottom(fromBottom);
456 mAnimScreen.setScaleFactor(1f);
Enrico Ros1f5a0952014-11-18 20:15:48 -0800457 //ObjectAnimator fade2 = ObjectAnimator.ofFloat(mNavScreen, "alpha", 1f, 0f);
458 //fade2.setDuration(100);
459 AnimatorSet set = new AnimatorSet();
460 ObjectAnimator animAppear = ObjectAnimator.ofFloat(mAnimScreen.mMain, "alpha", 0f, 1f);
461 animAppear.setDuration(100);
462 ObjectAnimator l = ObjectAnimator.ofInt(mAnimScreen.mContent, "left", fromLeft, toLeft);
463 ObjectAnimator t = ObjectAnimator.ofInt(mAnimScreen.mContent, "top", fromTop, toTop);
464 ObjectAnimator r = ObjectAnimator.ofInt(mAnimScreen.mContent, "right", fromRight, toRight);
Pankaj Garg66f8cef2015-07-07 17:29:03 -0700465 ObjectAnimator b = ObjectAnimator.ofInt(mAnimScreen.mContent, "bottom",
466 fromBottom, toBottom);
Enrico Ros1f5a0952014-11-18 20:15:48 -0800467 ObjectAnimator scale = ObjectAnimator.ofFloat(mAnimScreen, "scaleFactor", 1f, scaleFactor);
468 set.playTogether(animAppear, l, t, r, b, scale);
469 set.setInterpolator(new DecelerateInterpolator());
470 set.setDuration(200);
471 set.addListener(new AnimatorListenerAdapter() {
Michael Kolbc3af0672011-08-09 10:24:41 -0700472 @Override
473 public void onAnimationEnd(Animator anim) {
Matthew Hui1eb7a832014-04-15 12:20:58 -0400474 checkTabReady();
475 }
476 });
Enrico Ros1f5a0952014-11-18 20:15:48 -0800477 set.start();
Matthew Hui1eb7a832014-04-15 12:20:58 -0400478 }
479
Axesh R. Ajmera2e241242014-05-19 15:53:38 -0700480
481 private int mNumTries = 0;
Matthew Hui1eb7a832014-04-15 12:20:58 -0400482 private void checkTabReady() {
483 boolean isready = true;
Enrico Ros1f5a0952014-11-18 20:15:48 -0800484 boolean zeroTries = mNumTries == 0;
Matthew Hui1eb7a832014-04-15 12:20:58 -0400485 Tab tab = mUiController.getTabControl().getCurrentTab();
Axesh R. Ajmera2e241242014-05-19 15:53:38 -0700486 BrowserWebView webview = null;
Matthew Hui1eb7a832014-04-15 12:20:58 -0400487 if (tab == null)
488 isready = false;
489 else {
Axesh R. Ajmera2e241242014-05-19 15:53:38 -0700490 webview = (BrowserWebView)tab.getWebView();
491 if (webview == null) {
Matthew Hui1eb7a832014-04-15 12:20:58 -0400492 isready = false;
Axesh R. Ajmera2e241242014-05-19 15:53:38 -0700493 } else {
Matthew Hui1eb7a832014-04-15 12:20:58 -0400494 isready = webview.isReady();
Axesh R. Ajmera2e241242014-05-19 15:53:38 -0700495 }
Matthew Hui1eb7a832014-04-15 12:20:58 -0400496 }
Axesh R. Ajmera2e241242014-05-19 15:53:38 -0700497 // Post only when not ready and not crashed
498 if (!isready && mNumTries++ < 150) {
499 mCustomViewContainer.postDelayed(new Runnable() {
Matthew Hui1eb7a832014-04-15 12:20:58 -0400500 public void run() {
501 checkTabReady();
502 }
503 }, 17); //WebView is not ready. check again in for next frame.
504 return;
505 }
Axesh R. Ajmera2e241242014-05-19 15:53:38 -0700506 mNumTries = 0;
Vivek Sekharc70ae632015-04-08 17:54:05 -0700507 final boolean hasCrashed = (webview == null) ? false :false;
Enrico Ros1f5a0952014-11-18 20:15:48 -0800508 // fast path: don't wait if we've been ready for a while
509 if (zeroTries) {
Vivek Sekharc70ae632015-04-08 17:54:05 -0700510 fadeOutCustomViewContainer();
Enrico Ros1f5a0952014-11-18 20:15:48 -0800511 return;
512 }
Axesh R. Ajmera2e241242014-05-19 15:53:38 -0700513 mCustomViewContainer.postDelayed(new Runnable() {
Enrico Ros1f5a0952014-11-18 20:15:48 -0800514 public void run() {
Vivek Sekharc70ae632015-04-08 17:54:05 -0700515 fadeOutCustomViewContainer();
Enrico Ros1f5a0952014-11-18 20:15:48 -0800516 }
517 }, 32); //WebView is ready, but give it extra 2 frame's time to display and finish the swaps
Matthew Hui1eb7a832014-04-15 12:20:58 -0400518 }
519
Vivek Sekharc70ae632015-04-08 17:54:05 -0700520 private void fadeOutCustomViewContainer() {
Matthew Hui1eb7a832014-04-15 12:20:58 -0400521 ObjectAnimator otheralpha = ObjectAnimator.ofFloat(mCustomViewContainer, "alpha", 1f, 0f);
Vivek Sekharc70ae632015-04-08 17:54:05 -0700522 otheralpha.setDuration(100);
Matthew Hui1eb7a832014-04-15 12:20:58 -0400523 otheralpha.addListener(new AnimatorListenerAdapter() {
524 @Override
525 public void onAnimationEnd(Animator anim) {
John Reckcc0059c2011-10-07 13:53:13 -0700526 mCustomViewContainer.removeView(mAnimScreen.mMain);
Michael Kolbbf32cd02011-08-16 15:07:04 -0700527 finishAnimateOut();
Sagar Dhawanf7b5d0b2015-02-06 15:47:20 -0800528 unblockEvents();
Michael Kolbc3af0672011-08-09 10:24:41 -0700529 }
530 });
Enrico Ros1f5a0952014-11-18 20:15:48 -0800531 otheralpha.setInterpolator(new DecelerateInterpolator());
Matthew Hui1eb7a832014-04-15 12:20:58 -0400532 otheralpha.start();
Michael Kolbc3af0672011-08-09 10:24:41 -0700533 }
534
Michael Kolbbf32cd02011-08-16 15:07:04 -0700535 private void finishAnimateOut() {
Pankaj Garg66f8cef2015-07-07 17:29:03 -0700536 if (mNavScreen != null) {
537 mNavScreen.setVisibility(View.GONE);
538 }
Michael Kolbc3af0672011-08-09 10:24:41 -0700539 mCustomViewContainer.setAlpha(1f);
Michael Kolbf2055602011-04-09 17:20:03 -0700540 mCustomViewContainer.setVisibility(View.GONE);
Tarun Nainaniea28dde2014-08-27 17:25:09 -0700541 mAnimScreen.set(null);
Michael Kolbf2055602011-04-09 17:20:03 -0700542 }
543
John Reck6b4bd5f2011-07-12 10:14:38 -0700544 @Override
545 public boolean needsRestoreAllTabs() {
546 return false;
547 }
548
Michael Kolb20be26d2011-07-18 16:38:02 -0700549 public void toggleNavScreen() {
John Reckcc0059c2011-10-07 13:53:13 -0700550 if (!showingNavScreen()) {
Michael Kolb20be26d2011-07-18 16:38:02 -0700551 showNavScreen();
552 } else {
Michael Kolba3194d02011-09-07 11:23:51 -0700553 hideNavScreen(mUiController.getTabControl().getCurrentPosition(), false);
Michael Kolb20be26d2011-07-18 16:38:02 -0700554 }
555 }
556
Michael Kolbc3af0672011-08-09 10:24:41 -0700557 static class AnimScreen {
John Reck3ba45532011-08-11 16:26:53 -0700558
Michael Kolbc3af0672011-08-09 10:24:41 -0700559 private View mMain;
Michael Kolbc3af0672011-08-09 10:24:41 -0700560 private ImageView mContent;
561 private float mScale;
562
John Reckcc0059c2011-10-07 13:53:13 -0700563 public AnimScreen(Context ctx) {
Enrico Ros1f5a0952014-11-18 20:15:48 -0800564 mMain = LayoutInflater.from(ctx).inflate(R.layout.anim_screen, null);
565 mMain.setOnClickListener(new View.OnClickListener() {
566 @Override
567 public void onClick(View v) {
568 // just eat clicks when this view is visible
569 }
570 });
571 mContent = (ImageView) mMain.findViewById(R.id.anim_screen_content);
John Reckcc0059c2011-10-07 13:53:13 -0700572 mContent.setScaleType(ImageView.ScaleType.MATRIX);
573 mContent.setImageMatrix(new Matrix());
574 mScale = 1.0f;
575 setScaleFactor(getScaleFactor());
576 }
577
Tarun Nainaniea28dde2014-08-27 17:25:09 -0700578 public void set(TitleBar tbar, Bitmap viewportBitmap) {
579 if (tbar == null) {
John Reck62077d82011-10-13 15:17:50 -0700580 return;
581 }
Tarun Nainaniea28dde2014-08-27 17:25:09 -0700582 mContent.setImageBitmap(viewportBitmap);
Michael Kolbc3af0672011-08-09 10:24:41 -0700583 }
584
John Reckcc0059c2011-10-07 13:53:13 -0700585 public void set(Bitmap image) {
Michael Kolbc3af0672011-08-09 10:24:41 -0700586 mContent.setImageBitmap(image);
Michael Kolbc3af0672011-08-09 10:24:41 -0700587 }
588
John Reckcc0059c2011-10-07 13:53:13 -0700589 private void setScaleFactor(float sf) {
Michael Kolbc3af0672011-08-09 10:24:41 -0700590 mScale = sf;
591 Matrix m = new Matrix();
Enrico Ros1f5a0952014-11-18 20:15:48 -0800592 m.postScale(sf, sf);
Michael Kolbc3af0672011-08-09 10:24:41 -0700593 mContent.setImageMatrix(m);
594 }
595
John Reckcc0059c2011-10-07 13:53:13 -0700596 private float getScaleFactor() {
Michael Kolbc3af0672011-08-09 10:24:41 -0700597 return mScale;
598 }
599
John Reck3ba45532011-08-11 16:26:53 -0700600 }
601
Michael Kolb66706532010-12-12 19:50:22 -0800602}