| Index: chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java
|
| index 93a16a276220396e75c73e9557004e78358d7056..1ac2662a235c7496a27b722ece61466d6f738d17 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java
|
| @@ -94,6 +94,19 @@ public class ToolbarPhone extends ToolbarLayout
|
|
|
| private static final float UNINITIALIZED_PERCENT = -1f;
|
|
|
| + /** States that the toolbar can be in regarding the tab switcher. */
|
| + private static final int STATIC_TAB = 0;
|
| + private static final int TAB_SWITCHER = 1;
|
| + private static final int ENTERING_TAB_SWITCHER = 2;
|
| + private static final int EXITING_TAB_SWITCHER = 3;
|
| +
|
| + @ViewDebug.ExportedProperty(category = "chrome", mapping = {
|
| + @ViewDebug.IntToString(from = STATIC_TAB, to = "STATIC_TAB"),
|
| + @ViewDebug.IntToString(from = TAB_SWITCHER, to = "TAB_SWITCHER"),
|
| + @ViewDebug.IntToString(from = ENTERING_TAB_SWITCHER, to = "ENTERING_TAB_SWITCHER"),
|
| + @ViewDebug.IntToString(from = EXITING_TAB_SWITCHER, to = "EXITING_TAB_SWITCHER")
|
| + })
|
| +
|
| static final int LOCATION_BAR_TRANSPARENT_BACKGROUND_ALPHA = 51;
|
|
|
| private static final Interpolator NTP_SEARCH_BOX_EXPANSION_INTERPOLATOR =
|
| @@ -118,7 +131,7 @@ public class ToolbarPhone extends ToolbarLayout
|
| private final List<View> mTabSwitcherModeViews = new ArrayList<>();
|
| private final Set<View> mBrowsingModeViews = new HashSet<>();
|
| @ViewDebug.ExportedProperty(category = "chrome")
|
| - private boolean mIsInTabSwitcherMode;
|
| + private int mTabSwitcherState;
|
|
|
| // This determines whether or not the toolbar draws as expected (false) or whether it always
|
| // draws as if it's showing the non-tabswitcher, non-animating toolbar. This is used in grabbing
|
| @@ -144,8 +157,6 @@ public class ToolbarPhone extends ToolbarLayout
|
| // can be used for animating between the two view modes.
|
| @ViewDebug.ExportedProperty(category = "chrome")
|
| private float mTabSwitcherModePercent = 0;
|
| - @ViewDebug.ExportedProperty(category = "chrome")
|
| - private boolean mUIAnimatingTabSwitcherTransition;
|
|
|
| // Used to clip the toolbar during the fade transition into and out of TabSwitcher mode. Only
|
| // used when |mAnimateNormalToolbar| is false.
|
| @@ -487,7 +498,7 @@ public class ToolbarPhone extends ToolbarLayout
|
| super.onMeasure(widthMeasureSpec, heightMeasureSpec);
|
|
|
| boolean changed = layoutLocationBar(MeasureSpec.getSize(widthMeasureSpec));
|
| - if (!mIsInTabSwitcherMode) updateUrlExpansionAnimation();
|
| + if (mTabSwitcherState == STATIC_TAB) updateUrlExpansionAnimation();
|
| if (!changed) return;
|
| } else {
|
| updateUnfocusedLocationBarLayoutParams();
|
| @@ -774,7 +785,7 @@ public class ToolbarPhone extends ToolbarLayout
|
| * focus change or scrolling the New Tab Page.
|
| */
|
| private void updateUrlExpansionAnimation() {
|
| - if (mIsInTabSwitcherMode || isTabSwitcherAnimationRunning()) {
|
| + if (mTabSwitcherState != STATIC_TAB) {
|
| mToolbarButtonsContainer.setVisibility(VISIBLE);
|
| return;
|
| }
|
| @@ -890,7 +901,8 @@ public class ToolbarPhone extends ToolbarLayout
|
| * as a result of scrolling the New Tab Page).
|
| */
|
| private void updateNtpTransitionAnimation() {
|
| - if (mIsInTabSwitcherMode) return;
|
| + // Skip if in or entering tab switcher mode.
|
| + if (mTabSwitcherState == TAB_SWITCHER || mTabSwitcherState == ENTERING_TAB_SWITCHER) return;
|
|
|
| setAncestorsShouldClipChildren(mUrlExpansionPercent == 0f);
|
| mToolbarShadow.setAlpha(0f);
|
| @@ -1106,8 +1118,9 @@ public class ToolbarPhone extends ToolbarLayout
|
| boolean clipped = false;
|
|
|
| if (mLocationBarBackground != null
|
| - && ((!mIsInTabSwitcherMode && !mTabSwitcherModeViews.contains(child))
|
| - || (mIsInTabSwitcherMode && mBrowsingModeViews.contains(child)))) {
|
| + && ((mTabSwitcherState == STATIC_TAB && !mTabSwitcherModeViews.contains(child))
|
| + || (mTabSwitcherState != STATIC_TAB
|
| + && mBrowsingModeViews.contains(child)))) {
|
| canvas.save();
|
|
|
| int translationY = (int) mLocationBar.getTranslationY();
|
| @@ -1152,7 +1165,8 @@ public class ToolbarPhone extends ToolbarLayout
|
| private boolean drawLocationBar(Canvas canvas, long drawingTime) {
|
| boolean clipped = false;
|
|
|
| - if (mLocationBarBackground != null && (!mIsInTabSwitcherMode || mTextureCaptureMode)) {
|
| + if (mLocationBarBackground != null
|
| + && (mTabSwitcherState == STATIC_TAB || mTextureCaptureMode)) {
|
| canvas.save();
|
| int backgroundAlpha;
|
| if (mTabSwitcherModeAnimation != null) {
|
| @@ -1275,7 +1289,7 @@ public class ToolbarPhone extends ToolbarLayout
|
| if (mForceTextureCapture) {
|
| return true;
|
| }
|
| - return !(mIsInTabSwitcherMode || mTabSwitcherModeAnimation != null
|
| + return !(mTabSwitcherState == TAB_SWITCHER || mTabSwitcherModeAnimation != null
|
| || urlHasFocus() || mUrlFocusChangeInProgress);
|
| }
|
|
|
| @@ -1337,7 +1351,7 @@ public class ToolbarPhone extends ToolbarLayout
|
| public void updateButtonVisibility() {
|
| if (isReturnButtonVisible()) {
|
| mReturnButton.setVisibility(
|
| - urlHasFocus() || mIsInTabSwitcherMode ? INVISIBLE : VISIBLE);
|
| + urlHasFocus() || isTabSwitcherAnimationRunning() ? INVISIBLE : VISIBLE);
|
| mBrowsingModeViews.add(mReturnButton);
|
| } else {
|
| mReturnButton.setVisibility(GONE);
|
| @@ -1346,7 +1360,8 @@ public class ToolbarPhone extends ToolbarLayout
|
|
|
| boolean isHomeButtonVisible = mIsHomeButtonEnabled && !isReturnButtonVisible();
|
| if (isHomeButtonVisible) {
|
| - mHomeButton.setVisibility(urlHasFocus() || mIsInTabSwitcherMode ? INVISIBLE : VISIBLE);
|
| + mHomeButton.setVisibility(urlHasFocus() || isTabSwitcherAnimationRunning()
|
| + ? INVISIBLE : VISIBLE);
|
| mBrowsingModeViews.add(mHomeButton);
|
| } else {
|
| mHomeButton.setVisibility(GONE);
|
| @@ -1433,15 +1448,13 @@ public class ToolbarPhone extends ToolbarLayout
|
| }
|
|
|
| private boolean isTabSwitcherAnimationRunning() {
|
| - return mUIAnimatingTabSwitcherTransition
|
| - || (mTabSwitcherModeAnimation != null && mTabSwitcherModeAnimation.isRunning())
|
| - || (mDelayedTabSwitcherModeAnimation != null
|
| - && mDelayedTabSwitcherModeAnimation.isRunning());
|
| + return mTabSwitcherState == ENTERING_TAB_SWITCHER
|
| + || mTabSwitcherState == EXITING_TAB_SWITCHER;
|
| }
|
|
|
| private void updateViewsForTabSwitcherMode() {
|
| - int tabSwitcherViewsVisibility = mIsInTabSwitcherMode ? VISIBLE : INVISIBLE;
|
| - int browsingViewsVisibility = mIsInTabSwitcherMode ? INVISIBLE : VISIBLE;
|
| + int tabSwitcherViewsVisibility = mTabSwitcherState != STATIC_TAB ? VISIBLE : INVISIBLE;
|
| + int browsingViewsVisibility = mTabSwitcherState != STATIC_TAB ? INVISIBLE : VISIBLE;
|
|
|
| for (View view : mTabSwitcherModeViews) {
|
| view.setVisibility(tabSwitcherViewsVisibility);
|
| @@ -1450,7 +1463,7 @@ public class ToolbarPhone extends ToolbarLayout
|
| view.setVisibility(browsingViewsVisibility);
|
| }
|
| if (mShowMenuBadge) {
|
| - setMenuButtonContentDescription(!mIsInTabSwitcherMode);
|
| + setMenuButtonContentDescription(mTabSwitcherState == STATIC_TAB);
|
| }
|
|
|
| updateProgressBarVisibility();
|
| @@ -1458,8 +1471,7 @@ public class ToolbarPhone extends ToolbarLayout
|
| }
|
|
|
| private void updateProgressBarVisibility() {
|
| - getProgressBar().setVisibility(
|
| - mIsInTabSwitcherMode || isTabSwitcherAnimationRunning() ? INVISIBLE : VISIBLE);
|
| + getProgressBar().setVisibility(mTabSwitcherState != STATIC_TAB ? INVISIBLE : VISIBLE);
|
| }
|
|
|
| @Override
|
| @@ -1470,8 +1482,19 @@ public class ToolbarPhone extends ToolbarLayout
|
| @Override
|
| protected void setTabSwitcherMode(
|
| boolean inTabSwitcherMode, boolean showToolbar, boolean delayAnimation) {
|
| - if (mIsInTabSwitcherMode == inTabSwitcherMode) return;
|
| - mIsInTabSwitcherMode = inTabSwitcherMode;
|
| + // If setting tab switcher mode to true and the browser is already animating or in the tab
|
| + // switcher skip.
|
| + if (inTabSwitcherMode && (mTabSwitcherState == TAB_SWITCHER
|
| + || mTabSwitcherState == ENTERING_TAB_SWITCHER)) {
|
| + return;
|
| + }
|
| +
|
| + // Likewise if exiting the tab switcher.
|
| + if (!inTabSwitcherMode && (mTabSwitcherState == STATIC_TAB
|
| + || mTabSwitcherState == EXITING_TAB_SWITCHER)) {
|
| + return;
|
| + }
|
| + mTabSwitcherState = inTabSwitcherMode ? ENTERING_TAB_SWITCHER : EXITING_TAB_SWITCHER;
|
|
|
| finishAnimations();
|
|
|
| @@ -1494,7 +1517,6 @@ public class ToolbarPhone extends ToolbarLayout
|
| if (!mDelayingTabSwitcherAnimation) {
|
| mTabSwitcherModeAnimation = createExitTabSwitcherAnimation(showToolbar);
|
| }
|
| - mUIAnimatingTabSwitcherTransition = true;
|
| }
|
|
|
| mAnimateNormalToolbar = showToolbar;
|
| @@ -1509,8 +1531,12 @@ public class ToolbarPhone extends ToolbarLayout
|
| protected void onTabSwitcherTransitionFinished() {
|
| setAlpha(1.f);
|
| mClipRect = null;
|
| - mUIAnimatingTabSwitcherTransition = false;
|
| - mTabSwitcherModePercent = mIsInTabSwitcherMode ? 1.0f : 0.0f;
|
| +
|
| + // Detect what was being transitioned from and set the new state appropriately.
|
| + if (mTabSwitcherState == EXITING_TAB_SWITCHER) mTabSwitcherState = STATIC_TAB;
|
| + if (mTabSwitcherState == ENTERING_TAB_SWITCHER) mTabSwitcherState = TAB_SWITCHER;
|
| +
|
| + mTabSwitcherModePercent = mTabSwitcherState != STATIC_TAB ? 1.0f : 0.0f;
|
|
|
| if (!mAnimateNormalToolbar) {
|
| finishAnimations();
|
| @@ -1546,7 +1572,7 @@ public class ToolbarPhone extends ToolbarLayout
|
| setTabSwitcherAnimationMenuDrawable();
|
| setUseLightDrawablesForTextureCapture();
|
|
|
| - if (!mIsInTabSwitcherMode && !mTextureCaptureMode && mLayoutUpdateHost != null) {
|
| + if (mTabSwitcherState == STATIC_TAB && !mTextureCaptureMode && mLayoutUpdateHost != null) {
|
| // Request a layout update to trigger a texture capture if the tint color is changing
|
| // and we're not already in texture capture mode. This is necessary if the tab switcher
|
| // is entered immediately after a change to the tint color without any user interactions
|
| @@ -1922,7 +1948,7 @@ public class ToolbarPhone extends ToolbarLayout
|
| // Convert the previous NTP scroll percentage to URL focus percentage because that
|
| // will give a nicer transition animation from the expanded NTP omnibox to the
|
| // collapsed normal omnibox on other non-NTP pages.
|
| - if (!mIsInTabSwitcherMode && previousNtpScrollPercent > 0f) {
|
| + if (mTabSwitcherState == STATIC_TAB && previousNtpScrollPercent > 0f) {
|
| mUrlFocusChangePercent =
|
| Math.max(previousNtpScrollPercent, mUrlFocusChangePercent);
|
| triggerUrlFocusAnimation(false);
|
| @@ -1966,7 +1992,7 @@ public class ToolbarPhone extends ToolbarLayout
|
| }
|
|
|
| private void updateShadowVisibility() {
|
| - boolean shouldDrawShadow = !mIsInTabSwitcherMode && !isTabSwitcherAnimationRunning();
|
| + boolean shouldDrawShadow = mTabSwitcherState == STATIC_TAB;
|
| int shadowVisibility = shouldDrawShadow ? View.VISIBLE : View.INVISIBLE;
|
|
|
| if (mToolbarShadow.getVisibility() != shadowVisibility) {
|
| @@ -1986,7 +2012,13 @@ public class ToolbarPhone extends ToolbarLayout
|
| private void updateVisualsForToolbarState() {
|
| final boolean isIncognito = isIncognito();
|
|
|
| - VisualState newVisualState = computeVisualState(mIsInTabSwitcherMode);
|
| + // These are important for setting visual state while the entering or leaving the tab
|
| + // switcher.
|
| + boolean inOrEnteringStaticTab = mTabSwitcherState == STATIC_TAB
|
| + || mTabSwitcherState == EXITING_TAB_SWITCHER;
|
| + boolean inOrEnteringTabSwitcher = !inOrEnteringStaticTab;
|
| +
|
| + VisualState newVisualState = computeVisualState(inOrEnteringTabSwitcher);
|
|
|
| // If we are navigating to or from a brand color, allow the transition animation
|
| // to run to completion as it will handle the triggering this path again and committing
|
| @@ -2047,7 +2079,7 @@ public class ToolbarPhone extends ToolbarLayout
|
| updateToolbarBackground(mVisualState);
|
| getProgressBar().setThemeColor(themeColorForProgressBar, isIncognito());
|
|
|
| - if (mIsInTabSwitcherMode) {
|
| + if (inOrEnteringTabSwitcher) {
|
| mUseLightToolbarDrawables = true;
|
| mLocationBarBackgroundAlpha = LOCATION_BAR_TRANSPARENT_BACKGROUND_ALPHA;
|
| getProgressBar().setBackgroundColor(mProgressBackBackgroundColorWhite);
|
| @@ -2077,7 +2109,7 @@ public class ToolbarPhone extends ToolbarLayout
|
|
|
| mMenuButton.setTint(mUseLightToolbarDrawables ? mLightModeTint : mDarkModeTint);
|
|
|
| - if (mShowMenuBadge && !mIsInTabSwitcherMode) {
|
| + if (mShowMenuBadge && inOrEnteringStaticTab) {
|
| setAppMenuUpdateBadgeDrawable(mUseLightToolbarDrawables);
|
| }
|
| ColorStateList tint = mUseLightToolbarDrawables ? mLightModeTint : mDarkModeTint;
|
| @@ -2098,11 +2130,11 @@ public class ToolbarPhone extends ToolbarLayout
|
|
|
| // We update the alpha before comparing the visual state as we need to change
|
| // its value when entering and exiting TabSwitcher mode.
|
| - if (isLocationBarShownInNTP() && !mIsInTabSwitcherMode) {
|
| + if (isLocationBarShownInNTP() && inOrEnteringStaticTab) {
|
| updateNtpTransitionAnimation();
|
| }
|
|
|
| - if (mIsInTabSwitcherMode) mNewTabButton.setIsIncognito(isIncognito);
|
| + if (inOrEnteringTabSwitcher) mNewTabButton.setIsIncognito(isIncognito);
|
|
|
| CharSequence newTabContentDescription = getResources().getText(
|
| isIncognito ? R.string.accessibility_toolbar_btn_new_incognito_tab :
|
| @@ -2134,7 +2166,7 @@ public class ToolbarPhone extends ToolbarLayout
|
| setTabSwitcherAnimationMenuBadgeDrawable();
|
|
|
| // Show the badge.
|
| - if (!mIsInTabSwitcherMode) {
|
| + if (mTabSwitcherState == STATIC_TAB) {
|
| if (mUseLightToolbarDrawables) {
|
| setAppMenuUpdateBadgeDrawable(mUseLightToolbarDrawables);
|
| }
|
|
|