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 e95616621f697eba499cae40846a0e919262c6f2..f39ec49a5cb31c2b55598e6f14528413ba93dcb8 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 |
@@ -46,6 +46,7 @@ import org.chromium.base.metrics.RecordUserAction; |
import org.chromium.chrome.R; |
import org.chromium.chrome.browser.compositor.Invalidator; |
import org.chromium.chrome.browser.ntp.NewTabPage; |
+import org.chromium.chrome.browser.omaha.UpdateMenuItemHelper; |
import org.chromium.chrome.browser.omnibox.LocationBar; |
import org.chromium.chrome.browser.omnibox.LocationBarPhone; |
import org.chromium.chrome.browser.omnibox.UrlContainer; |
@@ -108,7 +109,7 @@ public class ToolbarPhone extends ToolbarLayout |
private final List<View> mTabSwitcherModeViews = new ArrayList<View>(); |
private final Set<View> mBrowsingModeViews = new HashSet<View>(); |
@ViewDebug.ExportedProperty(category = "chrome") |
- private boolean mInTabSwitcherMode; |
+ private boolean mIsInTabSwitcherMode; |
// 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 |
@@ -124,6 +125,7 @@ public class ToolbarPhone extends ToolbarLayout |
private ColorDrawable mTabSwitcherAnimationBgOverlay; |
private TabSwitcherDrawable mTabSwitcherAnimationTabStackDrawable; |
private Drawable mTabSwitcherAnimationMenuDrawable; |
+ private Drawable mTabSwitcherAnimationMenuBadgeDrawable; |
// Value that determines the amount of transition from the normal toolbar mode to TabSwitcher |
// mode. 0 = entirely in normal mode and 1.0 = entirely in TabSwitcher mode. In between values |
// can be used for animating between the two view modes. |
@@ -283,10 +285,10 @@ public class ToolbarPhone extends ToolbarLayout |
setLayoutTransition(null); |
- mMenuButton.setVisibility(shouldShowMenuButton() ? View.VISIBLE : View.GONE); |
+ mMenuButtonWrapper.setVisibility(shouldShowMenuButton() ? View.VISIBLE : View.GONE); |
if (FeatureUtilities.isDocumentMode(getContext())) { |
ApiCompatibilityUtils.setMarginEnd( |
- (MarginLayoutParams) mMenuButton.getLayoutParams(), |
+ (MarginLayoutParams) mMenuButtonWrapper.getLayoutParams(), |
getResources().getDimensionPixelSize(R.dimen.document_toolbar_menu_offset)); |
} |
@@ -411,7 +413,7 @@ public class ToolbarPhone extends ToolbarLayout |
}); |
onHomeButtonUpdate(HomepageManager.isHomepageEnabled(getContext())); |
- updateVisualsForToolbarState(mInTabSwitcherMode); |
+ updateVisualsForToolbarState(mIsInTabSwitcherMode); |
} |
@Override |
@@ -468,7 +470,7 @@ public class ToolbarPhone extends ToolbarLayout |
super.onMeasure(widthMeasureSpec, heightMeasureSpec); |
boolean changed = layoutLocationBar(MeasureSpec.getSize(widthMeasureSpec)); |
- if (!mInTabSwitcherMode) setUrlFocusChangePercent(mUrlFocusChangePercent); |
+ if (!mIsInTabSwitcherMode) setUrlFocusChangePercent(mUrlFocusChangePercent); |
if (!changed) return; |
} else { |
updateUnfocusedLocationBarLayoutParams(); |
@@ -739,7 +741,7 @@ public class ToolbarPhone extends ToolbarLayout |
} |
private void updateUrlExpansionAnimation() { |
- if (mInTabSwitcherMode || isTabSwitcherAnimationRunning()) return; |
+ if (mIsInTabSwitcherMode || isTabSwitcherAnimationRunning()) return; |
mLocationBarBackgroundOffset.setEmpty(); |
@@ -824,7 +826,7 @@ public class ToolbarPhone extends ToolbarLayout |
} |
private void updateNtpTransitionAnimation(NewTabPage ntp) { |
- if (mInTabSwitcherMode) return; |
+ if (mIsInTabSwitcherMode) return; |
setAncestorsShouldClipChildren(mUrlExpansionPercent == 0f); |
mToolbarShadow.setAlpha(0f); |
@@ -966,6 +968,7 @@ public class ToolbarPhone extends ToolbarLayout |
// Draw the menu button if necessary. |
if (mTabSwitcherAnimationMenuDrawable != null |
&& mUrlExpansionPercent != 1f) { |
+ canvas.save(); |
mTabSwitcherAnimationMenuDrawable.setBounds( |
mMenuButton.getPaddingLeft(), mMenuButton.getPaddingTop(), |
mMenuButton.getWidth() - mMenuButton.getPaddingRight(), |
@@ -977,6 +980,15 @@ public class ToolbarPhone extends ToolbarLayout |
: mDarkModeDefaultColor; |
mTabSwitcherAnimationMenuDrawable.setColorFilter(color, PorterDuff.Mode.SRC_IN); |
mTabSwitcherAnimationMenuDrawable.draw(canvas); |
+ canvas.restore(); |
+ } |
+ |
+ // Draw the menu badge if necessary. |
+ if (mShowMenuBadge && mTabSwitcherAnimationMenuBadgeDrawable != null |
+ && mUrlExpansionPercent != 1f) { |
+ translateCanvasToView(mToolbarButtonsContainer, mMenuBadge, canvas); |
+ mTabSwitcherAnimationMenuBadgeDrawable.setAlpha(rgbAlpha); |
+ mTabSwitcherAnimationMenuBadgeDrawable.draw(canvas); |
} |
canvas.restore(); |
@@ -1015,8 +1027,8 @@ public class ToolbarPhone extends ToolbarLayout |
boolean clipped = false; |
if (mLocationBarBackground != null |
- && ((!mInTabSwitcherMode && !mTabSwitcherModeViews.contains(child)) |
- || (mInTabSwitcherMode && mBrowsingModeViews.contains(child)))) { |
+ && ((!mIsInTabSwitcherMode && !mTabSwitcherModeViews.contains(child)) |
+ || (mIsInTabSwitcherMode && mBrowsingModeViews.contains(child)))) { |
canvas.save(); |
if (mUrlExpansionPercent != 0f && mUrlViewportBounds.top < child.getBottom()) { |
// For other child views, use the inverse clipping of the URL viewport. |
@@ -1061,7 +1073,7 @@ public class ToolbarPhone extends ToolbarLayout |
float locationBarClipTop = 0; |
float locationBarClipBottom = 0; |
- if (mLocationBarBackground != null && (!mInTabSwitcherMode || mTextureCaptureMode)) { |
+ if (mLocationBarBackground != null && (!mIsInTabSwitcherMode || mTextureCaptureMode)) { |
canvas.save(); |
int backgroundAlpha = mUrlBackgroundAlpha; |
if (mTabSwitcherModeAnimation != null) { |
@@ -1168,7 +1180,7 @@ public class ToolbarPhone extends ToolbarLayout |
@Override |
public boolean isReadyForTextureCapture() { |
- return !(mInTabSwitcherMode || mTabSwitcherModeAnimation != null |
+ return !(mIsInTabSwitcherMode || mTabSwitcherModeAnimation != null |
|| urlHasFocus() || mUrlFocusChangeInProgress); |
} |
@@ -1220,7 +1232,7 @@ public class ToolbarPhone extends ToolbarLayout |
@Override |
protected void onHomeButtonUpdate(boolean homeButtonEnabled) { |
if (homeButtonEnabled) { |
- mHomeButton.setVisibility(urlHasFocus() || mInTabSwitcherMode ? INVISIBLE : VISIBLE); |
+ mHomeButton.setVisibility(urlHasFocus() || mIsInTabSwitcherMode ? INVISIBLE : VISIBLE); |
if (!mBrowsingModeViews.contains(mHomeButton)) { |
mBrowsingModeViews.add(mHomeButton); |
} |
@@ -1259,7 +1271,7 @@ public class ToolbarPhone extends ToolbarLayout |
exitAnimation.addListener(new AnimatorListenerAdapter() { |
@Override |
public void onAnimationEnd(Animator animation) { |
- updateViewsForTabSwitcherMode(mInTabSwitcherMode); |
+ updateViewsForTabSwitcherMode(mIsInTabSwitcherMode); |
} |
}); |
@@ -1274,7 +1286,7 @@ public class ToolbarPhone extends ToolbarLayout |
exitAnimation.addListener(new AnimatorListenerAdapter() { |
@Override |
public void onAnimationStart(Animator animation) { |
- updateViewsForTabSwitcherMode(mInTabSwitcherMode); |
+ updateViewsForTabSwitcherMode(mIsInTabSwitcherMode); |
// On older builds, force an update to ensure the new visuals are used |
// when bringing in the toolbar. crbug.com/404571 |
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN) { |
@@ -1285,8 +1297,8 @@ public class ToolbarPhone extends ToolbarLayout |
@Override |
public void onAnimationEnd(Animator animation) { |
mDelayedTabSwitcherModeAnimation = null; |
- updateShadowVisibility(mInTabSwitcherMode); |
- updateViewsForTabSwitcherMode(mInTabSwitcherMode); |
+ updateShadowVisibility(mIsInTabSwitcherMode); |
+ updateViewsForTabSwitcherMode(mIsInTabSwitcherMode); |
} |
}); |
@@ -1331,13 +1343,13 @@ public class ToolbarPhone extends ToolbarLayout |
@Override |
protected void setContentAttached(boolean attached) { |
- updateVisualsForToolbarState(mInTabSwitcherMode); |
+ updateVisualsForToolbarState(mIsInTabSwitcherMode); |
} |
@Override |
protected void setTabSwitcherMode( |
boolean inTabSwitcherMode, boolean showToolbar, boolean delayAnimation) { |
- if (mInTabSwitcherMode == inTabSwitcherMode) return; |
+ if (mIsInTabSwitcherMode == inTabSwitcherMode) return; |
finishAnimations(); |
@@ -1364,7 +1376,7 @@ public class ToolbarPhone extends ToolbarLayout |
} |
mAnimateNormalToolbar = showToolbar; |
- mInTabSwitcherMode = inTabSwitcherMode; |
+ mIsInTabSwitcherMode = inTabSwitcherMode; |
if (mTabSwitcherModeAnimation != null) mTabSwitcherModeAnimation.start(); |
if (SysUtils.isLowEndDevice()) finishAnimations(); |
@@ -1377,9 +1389,16 @@ public class ToolbarPhone extends ToolbarLayout |
setAlpha(1.f); |
mClipRect = null; |
mUIAnimatingTabSwitcherTransition = false; |
+ |
+ if (mShowMenuBadge && !mIsInTabSwitcherMode) { |
+ // If mInTabSwitcherMode is true, the menu button drawable will be updated in |
+ // #updateVisualsForToolbarState(). |
+ mMenuButton.setImageBitmap( |
+ UpdateMenuItemHelper.getInstance().getBadgedMenuButtonBitmap(getContext())); |
+ } |
if (!mAnimateNormalToolbar) { |
finishAnimations(); |
- updateVisualsForToolbarState(mInTabSwitcherMode); |
+ updateVisualsForToolbarState(mIsInTabSwitcherMode); |
} |
if (mDelayingTabSwitcherAnimation) { |
@@ -1387,7 +1406,7 @@ public class ToolbarPhone extends ToolbarLayout |
mDelayedTabSwitcherModeAnimation = createPostExitTabSwitcherAnimation(); |
mDelayedTabSwitcherModeAnimation.start(); |
} else { |
- updateViewsForTabSwitcherMode(mInTabSwitcherMode); |
+ updateViewsForTabSwitcherMode(mIsInTabSwitcherMode); |
} |
} |
@@ -1408,15 +1427,7 @@ public class ToolbarPhone extends ToolbarLayout |
mTabSwitcherAnimationBgOverlay.setColor(getToolbarColorForVisualState( |
mOverlayDrawablesVisualState)); |
- if (shouldShowMenuButton()) { |
- Resources res = getResources(); |
- mTabSwitcherAnimationMenuDrawable = ApiCompatibilityUtils.getDrawable( |
- res, R.drawable.btn_menu).mutate(); |
- mTabSwitcherAnimationMenuDrawable.setColorFilter( |
- isIncognito() ? mLightModeDefaultColor : mDarkModeDefaultColor, |
- PorterDuff.Mode.SRC_IN); |
- ((BitmapDrawable) mTabSwitcherAnimationMenuDrawable).setGravity(Gravity.CENTER); |
- } |
+ setTabSwitcherAnimationMenuDrawable(); |
} |
@Override |
@@ -1486,12 +1497,12 @@ public class ToolbarPhone extends ToolbarLayout |
URL_FOCUS_TOOLBAR_BUTTONS_TRANSLATION_X_DP, isRtl) * density; |
animator = ObjectAnimator.ofFloat( |
- mMenuButton, TRANSLATION_X, toolbarButtonTranslationX); |
+ mMenuButtonWrapper, TRANSLATION_X, toolbarButtonTranslationX); |
animator.setDuration(URL_FOCUS_TOOLBAR_BUTTONS_DURATION_MS); |
animator.setInterpolator(BakedBezierInterpolator.FADE_OUT_CURVE); |
animators.add(animator); |
- animator = ObjectAnimator.ofFloat(mMenuButton, ALPHA, 0); |
+ animator = ObjectAnimator.ofFloat(mMenuButtonWrapper, ALPHA, 0); |
animator.setDuration(URL_FOCUS_TOOLBAR_BUTTONS_DURATION_MS); |
animator.setInterpolator(BakedBezierInterpolator.FADE_OUT_CURVE); |
animators.add(animator); |
@@ -1516,13 +1527,13 @@ public class ToolbarPhone extends ToolbarLayout |
animator.setInterpolator(BakedBezierInterpolator.TRANSFORM_CURVE); |
animators.add(animator); |
- animator = ObjectAnimator.ofFloat(mMenuButton, TRANSLATION_X, 0); |
+ animator = ObjectAnimator.ofFloat(mMenuButtonWrapper, TRANSLATION_X, 0); |
animator.setDuration(URL_FOCUS_TOOLBAR_BUTTONS_DURATION_MS); |
animator.setStartDelay(URL_CLEAR_FOCUS_MENU_DELAY_MS); |
animator.setInterpolator(BakedBezierInterpolator.TRANSFORM_CURVE); |
animators.add(animator); |
- animator = ObjectAnimator.ofFloat(mMenuButton, ALPHA, 1); |
+ animator = ObjectAnimator.ofFloat(mMenuButtonWrapper, ALPHA, 1); |
animator.setDuration(URL_FOCUS_TOOLBAR_BUTTONS_DURATION_MS); |
animator.setStartDelay(URL_CLEAR_FOCUS_MENU_DELAY_MS); |
animator.setInterpolator(BakedBezierInterpolator.TRANSFORM_CURVE); |
@@ -1693,14 +1704,14 @@ public class ToolbarPhone extends ToolbarLayout |
protected void onTabContentViewChanged() { |
super.onTabContentViewChanged(); |
updateNtpAnimationState(); |
- updateVisualsForToolbarState(mInTabSwitcherMode); |
+ updateVisualsForToolbarState(mIsInTabSwitcherMode); |
} |
@Override |
protected void onTabOrModelChanged() { |
super.onTabOrModelChanged(); |
updateNtpAnimationState(); |
- updateVisualsForToolbarState(mInTabSwitcherMode); |
+ updateVisualsForToolbarState(mIsInTabSwitcherMode); |
} |
private static boolean isVisualStateValidForBrandColorTransition(VisualState state) { |
@@ -1746,7 +1757,7 @@ public class ToolbarPhone extends ToolbarLayout |
@Override |
public void onAnimationEnd(Animator animation) { |
mBrandColorTransitionActive = false; |
- updateVisualsForToolbarState(mInTabSwitcherMode); |
+ updateVisualsForToolbarState(mIsInTabSwitcherMode); |
} |
}); |
mBrandColorTransitionAnimation.start(); |
@@ -1771,7 +1782,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 (!mInTabSwitcherMode && previousNtpScrollPercent > 0f) { |
+ if (!mIsInTabSwitcherMode && previousNtpScrollPercent > 0f) { |
mUrlFocusChangePercent = |
Math.max(previousNtpScrollPercent, mUrlFocusChangePercent); |
triggerUrlFocusAnimation(false); |
@@ -1792,7 +1803,7 @@ public class ToolbarPhone extends ToolbarLayout |
post(new Runnable() { |
@Override |
public void run() { |
- updateVisualsForToolbarState(mInTabSwitcherMode); |
+ updateVisualsForToolbarState(mIsInTabSwitcherMode); |
updateNtpAnimationState(); |
} |
}); |
@@ -1913,7 +1924,6 @@ public class ToolbarPhone extends ToolbarLayout |
: R.color.progress_bar_foreground); |
getProgressBar().setForegroundColor(progressBarForegroundColor); |
- |
if (mToggleTabStackButton != null) { |
mToggleTabStackButton.setImageDrawable(mUseLightToolbarDrawables |
? mTabSwitcherButtonDrawableLight : mTabSwitcherButtonDrawable); |
@@ -1924,6 +1934,13 @@ public class ToolbarPhone extends ToolbarLayout |
} |
if (shouldShowMenuButton()) { |
+ // Only change the menu button drawable if isInTabSwitcherMode to avoid changing |
+ // it too soon if we're in the process of existing tab switcher mode. The drawable |
+ // will be changed in #onTabSwitcherTransitionFinished if we are exiting tab switcher |
+ // mode. |
+ if (mShowMenuBadge && isInTabSwitcherMode) { |
+ mMenuButton.setImageDrawable(mUnbadgedMenuButtonDrawable); |
+ } |
mMenuButton.setTint(mUseLightToolbarDrawables ? mLightModeTint : mDarkModeTint); |
} |
if (mHomeButton.getVisibility() != GONE) { |
@@ -1959,12 +1976,56 @@ public class ToolbarPhone extends ToolbarLayout |
mNewTabButton.setContentDescription(newTabContentDescription); |
} |
- getMenuButton().setVisibility(shouldShowMenuButton() ? View.VISIBLE : View.GONE); |
+ getMenuButtonWrapper().setVisibility(shouldShowMenuButton() ? View.VISIBLE : View.GONE); |
} |
@Override |
public LocationBar getLocationBar() { |
return mPhoneLocationBar; |
} |
+ |
+ @Override |
+ public void showAppMenuUpdateBadge() { |
+ super.showAppMenuUpdateBadge(); |
+ // Set up variables. |
+ if (!mBrowsingModeViews.contains(mMenuBadge)) { |
+ mBrowsingModeViews.add(mMenuBadge); |
+ } |
+ |
+ // Finish any in-progress animations and set the TabSwitcherAnimationMenuDrawable. |
+ finishAnimations(); |
+ setTabSwitcherAnimationMenuDrawable(); |
+ |
+ // Show the badge and update the menu button drawable. |
+ if (!mIsInTabSwitcherMode) { |
+ setAppMenuUpdateBadgeToVisible(); |
+ } |
+ |
+ mPhoneLocationBar.showAppMenuUpdateBadge(); |
+ } |
+ |
+ @Override |
+ public void removeAppMenuUpdateBadge() { |
+ super.removeAppMenuUpdateBadge(); |
+ mPhoneLocationBar.removeAppMenuUpdateBadge(); |
+ } |
+ |
+ private void setTabSwitcherAnimationMenuDrawable() { |
+ if (!shouldShowMenuButton()) return; |
+ Resources res = getResources(); |
+ if (mShowMenuBadge) { |
+ mTabSwitcherAnimationMenuDrawable = new BitmapDrawable(res, |
+ UpdateMenuItemHelper.getInstance().getBadgedMenuButtonBitmap(getContext())); |
+ mTabSwitcherAnimationMenuBadgeDrawable = mMenuBadge.getDrawable().mutate(); |
+ } else { |
+ mTabSwitcherAnimationMenuDrawable = ApiCompatibilityUtils.getDrawable(getResources(), |
+ R.drawable.btn_menu); |
+ } |
+ mTabSwitcherAnimationMenuDrawable.mutate(); |
+ mTabSwitcherAnimationMenuDrawable.setColorFilter( |
+ isIncognito() ? mLightModeDefaultColor : mDarkModeDefaultColor, |
+ PorterDuff.Mode.SRC_IN); |
+ ((BitmapDrawable) mTabSwitcherAnimationMenuDrawable).setGravity(Gravity.CENTER); |
+ } |
} |