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 1ac2662a235c7496a27b722ece61466d6f738d17..735bbee18c4b5a56bdc301f379fdf34c8c115ba0 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 |
@@ -122,6 +122,7 @@ public class ToolbarPhone extends ToolbarLayout |
private TextView mUrlBar; |
private View mUrlActionContainer; |
private ImageView mToolbarShadow; |
+ private boolean mUrlHasFocus; |
private final int mProgressBackBackgroundColorWhite; |
@@ -132,6 +133,7 @@ public class ToolbarPhone extends ToolbarLayout |
private final Set<View> mBrowsingModeViews = new HashSet<>(); |
@ViewDebug.ExportedProperty(category = "chrome") |
private int mTabSwitcherState; |
+ private boolean mIsCompositorReady; |
// 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 |
@@ -173,6 +175,8 @@ public class ToolbarPhone extends ToolbarLayout |
@ViewDebug.ExportedProperty(category = "chrome") |
private float mUrlFocusChangePercent; |
+ private float mToolbarShadowAlpha; |
+ |
/** |
* The degree to which the omnibox has expanded to full width, either because it is getting |
* focused or the NTP search box is being scrolled up. Note that in the latter case, the actual |
@@ -265,6 +269,7 @@ public class ToolbarPhone extends ToolbarLayout |
private NewTabPage mVisibleNewTabPage; |
private float mPreTextureCaptureAlpha = 1f; |
+ private int mPreTextureCaptureVisibility; |
private boolean mIsOverlayTabStackDrawableLight; |
// The following are some properties used during animation. We use explicit property classes |
@@ -280,6 +285,7 @@ public class ToolbarPhone extends ToolbarLayout |
@Override |
public void set(ToolbarPhone object, Float value) { |
setUrlFocusChangePercent(value); |
+ setToolbarShadowAlpha(value); |
} |
}; |
@@ -877,12 +883,12 @@ public class ToolbarPhone extends ToolbarLayout |
private void resetNtpAnimationValues() { |
mLocationBarBackgroundNtpOffset.setEmpty(); |
mLocationBar.setTranslationY(0); |
+ |
if (!mUrlFocusChangeInProgress) { |
mToolbarButtonsContainer.setTranslationY(0); |
mReturnButton.setTranslationY(0); |
mHomeButton.setTranslationY(0); |
} |
- mToolbarShadow.setAlpha(1f); |
mLocationBar.setAlpha(1); |
mForceDrawLocationBarBackground = false; |
mLocationBarBackgroundAlpha = 255; |
@@ -905,7 +911,6 @@ public class ToolbarPhone extends ToolbarLayout |
if (mTabSwitcherState == TAB_SWITCHER || mTabSwitcherState == ENTERING_TAB_SWITCHER) return; |
setAncestorsShouldClipChildren(mUrlExpansionPercent == 0f); |
- mToolbarShadow.setAlpha(0f); |
NewTabPage ntp = getToolbarDataProvider().getNewTabPageForCurrentTab(); |
ntp.getSearchBoxBounds(mNtpSearchBoxBounds, mNtpSearchBoxTranslation); |
@@ -1437,10 +1442,12 @@ public class ToolbarPhone extends ToolbarLayout |
assert mTextureCaptureMode != textureMode; |
mTextureCaptureMode = textureMode; |
if (mTextureCaptureMode) { |
- mToolbarShadow.setVisibility(VISIBLE); |
+ mPreTextureCaptureVisibility = mToolbarShadow.getVisibility(); |
+ mToolbarShadow.setVisibility(INVISIBLE); |
mPreTextureCaptureAlpha = getAlpha(); |
setAlpha(1); |
} else { |
+ mToolbarShadow.setVisibility(mPreTextureCaptureVisibility); |
setAlpha(mPreTextureCaptureAlpha); |
updateShadowVisibility(); |
mPreTextureCaptureAlpha = 1f; |
@@ -1763,6 +1770,7 @@ public class ToolbarPhone extends ToolbarLayout |
triggerUrlFocusAnimation(hasFocus); |
TransitionDrawable shadowDrawable = (TransitionDrawable) mToolbarShadow.getDrawable(); |
+ |
if (hasFocus) { |
dismissTabSwitcherCallout(); |
shadowDrawable.startTransition(URL_FOCUS_CHANGE_ANIMATION_DURATION_MS); |
@@ -1809,6 +1817,7 @@ public class ToolbarPhone extends ToolbarLayout |
public void onAnimationEnd(Animator animation) { |
if (mCanceled) return; |
+ mUrlHasFocus = hasFocus; |
if (!hasFocus) { |
mDisableLocationBarRelayout = false; |
mLayoutLocationBarInFocusedMode = false; |
@@ -1816,6 +1825,7 @@ public class ToolbarPhone extends ToolbarLayout |
} |
mLocationBar.finishUrlFocusChange(hasFocus); |
mUrlFocusChangeInProgress = false; |
+ updateShadowVisibility(); |
} |
}); |
mUrlFocusLayoutAnimator.start(); |
@@ -1882,6 +1892,8 @@ public class ToolbarPhone extends ToolbarLayout |
mHasCheckedIfTabSwitcherCalloutIsNecessary = true; |
showTabSwitcherCalloutIfNecessary(); |
} |
+ |
+ updateShadowVisibility(); |
} |
private static boolean isVisualStateValidForBrandColorTransition(VisualState state) { |
@@ -1991,13 +2003,54 @@ public class ToolbarPhone extends ToolbarLayout |
return ntp != null && ntp.isLocationBarShownInNTP(); |
} |
+ /** |
+ * @return True if the Android version of the toolbar shadow is needed. |
+ */ |
+ private boolean needsAndroidToolbarShadow() { |
+ // Reasons to draw the Android toolbar shadow: |
+ // 1. Web page is using a native view except in the case of the NTP. |
+ // 2. Omnibox is focused and there are suggestions under it. |
+ if (!mIsCompositorReady || getToolbarDataProvider() == null |
+ || getToolbarDataProvider().getTab() == null) { |
+ return true; |
+ } |
+ Tab tab = getToolbarDataProvider().getTab(); |
+ |
+ // If the shadow is not needed, this is definitely the NTP. There are other shadows that |
+ // will show in place of the normal toolbar shadow. |
+ if (tab.getNativePage() != null && !tab.getNativePage().needsToolbarShadow()) return false; |
+ |
+ // Check if the current tab uses a native android View instead of a WebContents. |
+ boolean usesNativeView = tab.isNativePage() || tab.isShowingSadTab(); |
+ |
+ return mTabSwitcherState == STATIC_TAB && (mUrlHasFocus || usesNativeView); |
+ } |
+ |
private void updateShadowVisibility() { |
- boolean shouldDrawShadow = mTabSwitcherState == STATIC_TAB; |
- int shadowVisibility = shouldDrawShadow ? View.VISIBLE : View.INVISIBLE; |
+ if (needsAndroidToolbarShadow()) { |
+ mToolbarShadow.setAlpha(1.0f); |
+ } else { |
+ mToolbarShadow.setAlpha(0.0f); |
+ } |
+ } |
- if (mToolbarShadow.getVisibility() != shadowVisibility) { |
- mToolbarShadow.setVisibility(shadowVisibility); |
+ /** |
+ * Set the toolbar shadow's alpha during animation. |
+ * @param alpha The alpha that the toolbar shadow should have. |
+ */ |
+ private void setToolbarShadowAlpha(float value) { |
+ boolean isNativePage = false; |
+ if (getToolbarDataProvider() != null && getToolbarDataProvider().getTab() != null) { |
+ isNativePage = getToolbarDataProvider().getTab().isNativePage(); |
} |
+ |
+ // If the toolbar shadow is always supposed be showing, don't fade it. Check if the page |
+ // is native because the shadow might be showing becuase of the omnibox. |
+ if (needsAndroidToolbarShadow() && isNativePage) { |
+ mToolbarShadow.setAlpha(1.0f); |
+ return; |
+ } |
+ mToolbarShadow.setAlpha(Math.min(value, 1.0f)); |
} |
private VisualState computeVisualState(boolean isInTabSwitcherMode) { |
@@ -2268,5 +2321,12 @@ public class ToolbarPhone extends ToolbarLayout |
mFullscreenCalloutToken); |
} |
} |
+ |
+ @Override |
+ public void onFirstCompositorFrame() { |
+ if (mIsCompositorReady) return; |
+ mIsCompositorReady = true; |
+ updateShadowVisibility(); |
+ } |
} |