Index: chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbarAnimationDelegate.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbarAnimationDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbarAnimationDelegate.java |
index 583779551655080c97e76db0105ceb21873e514b..fff29c85bc7bca83101495e1e99aeb32dfdb38eb 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbarAnimationDelegate.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbarAnimationDelegate.java |
@@ -33,8 +33,13 @@ class CustomTabToolbarAnimationDelegate { |
private static final int CUSTOM_TAB_TOOLBAR_FADE_DURATION_MS = 150; |
private final View mSecurityButton; |
- private final AnimatorSet mSecurityButtonShowAnimator; |
- private final AnimatorSet mSecurityButtonHideAnimator; |
+ private final View mOfflineButton; |
+ private final AnimatorSet mNoneToSecurityButtonAnimator; |
+ private final AnimatorSet mSecurityButtonToNoneAnimator; |
+ private final AnimatorSet mNoneToOfflineButtonAnimator; |
+ private final AnimatorSet mOfflineButtonToNoneAnimator; |
+ private final AnimatorSet mSecurityButtonToOfflineButtonAnimator; |
+ private final AnimatorSet mOfflineButtonToSecurityButtonAnimator; |
private TextView mUrlBar; |
private TextView mTitleBar; |
@@ -44,47 +49,79 @@ class CustomTabToolbarAnimationDelegate { |
/** |
* Constructs an instance of {@link CustomTabToolbarAnimationDelegate}. |
*/ |
- CustomTabToolbarAnimationDelegate(View securityButton, final View titleUrlContainer) { |
+ CustomTabToolbarAnimationDelegate( |
+ View securityButton, View offlineButton, final View titleUrlContainer) { |
mSecurityButton = securityButton; |
- |
- mSecurityButtonShowAnimator = new AnimatorSet(); |
- int securityButtonWidth = securityButton.getResources() |
- .getDimensionPixelSize(R.dimen.location_bar_icon_width); |
- Animator translateRight = ObjectAnimator.ofFloat(titleUrlContainer, |
- View.TRANSLATION_X, securityButtonWidth); |
- translateRight.setInterpolator(BakedBezierInterpolator.TRANSFORM_CURVE); |
- translateRight.setDuration(CUSTOM_TAB_TOOLBAR_SLIDE_DURATION_MS); |
- |
- Animator fadeIn = ObjectAnimator.ofFloat(mSecurityButton, View.ALPHA, 1); |
- fadeIn.addListener(new AnimatorListenerAdapter() { |
+ mOfflineButton = offlineButton; |
+ |
+ // Both buttons have the same width. |
+ int buttonWidth = securityButton.getResources().getDimensionPixelSize( |
+ R.dimen.location_bar_icon_width); |
+ Animator translateTitleRight = |
+ ObjectAnimator.ofFloat(titleUrlContainer, View.TRANSLATION_X, buttonWidth); |
+ translateTitleRight.setInterpolator(BakedBezierInterpolator.TRANSFORM_CURVE); |
+ translateTitleRight.setDuration(CUSTOM_TAB_TOOLBAR_SLIDE_DURATION_MS); |
+ translateTitleRight.addListener(new AnimatorListenerAdapter() { |
@Override |
public void onAnimationStart(Animator animation) { |
- mSecurityButton.setVisibility(View.VISIBLE); |
- mSecurityButton.setAlpha(0f); |
titleUrlContainer.setTranslationX(0); |
} |
}); |
- fadeIn.setInterpolator(BakedBezierInterpolator.FADE_IN_CURVE); |
- fadeIn.setDuration(CUSTOM_TAB_TOOLBAR_FADE_DURATION_MS); |
- mSecurityButtonShowAnimator.playSequentially(translateRight, fadeIn); |
- |
- mSecurityButtonHideAnimator = new AnimatorSet(); |
- Animator fadeOut = ObjectAnimator.ofFloat(mSecurityButton, View.ALPHA, 0); |
- fadeOut.setInterpolator(BakedBezierInterpolator.FADE_OUT_CURVE); |
- fadeOut.setDuration(CUSTOM_TAB_TOOLBAR_FADE_DURATION_MS); |
- |
- Animator translateLeft = ObjectAnimator.ofFloat(titleUrlContainer, |
- View.TRANSLATION_X, -securityButtonWidth); |
- translateLeft.setInterpolator(BakedBezierInterpolator.TRANSFORM_CURVE); |
- translateLeft.setDuration(CUSTOM_TAB_TOOLBAR_SLIDE_DURATION_MS); |
- translateLeft.addListener(new AnimatorListenerAdapter() { |
+ |
+ Animator translateTitleLeft = |
+ ObjectAnimator.ofFloat(titleUrlContainer, View.TRANSLATION_X, -buttonWidth); |
+ translateTitleLeft.setInterpolator(BakedBezierInterpolator.TRANSFORM_CURVE); |
+ translateTitleLeft.setDuration(CUSTOM_TAB_TOOLBAR_SLIDE_DURATION_MS); |
+ translateTitleLeft.addListener(new AnimatorListenerAdapter() { |
@Override |
public void onAnimationEnd(Animator animation) { |
mSecurityButton.setVisibility(View.GONE); |
+ mOfflineButton.setVisibility(View.GONE); |
titleUrlContainer.setTranslationX(0); |
} |
}); |
- mSecurityButtonHideAnimator.playSequentially(fadeOut, translateLeft); |
+ |
+ Animator fadeSecurityButtonIn = createFadeButtonInAnimator(mSecurityButton); |
+ Animator fadeSecurityButtonOut = createFadeButtonOutAnimator(mSecurityButton); |
+ |
+ Animator fadeOfflineButtonIn = createFadeButtonInAnimator(mOfflineButton); |
+ Animator fadeOfflineButtonOut = createFadeButtonOutAnimator(mOfflineButton); |
+ |
+ mNoneToSecurityButtonAnimator = new AnimatorSet(); |
+ mNoneToSecurityButtonAnimator.playSequentially(translateTitleRight, fadeSecurityButtonIn); |
+ mSecurityButtonToNoneAnimator = new AnimatorSet(); |
+ mSecurityButtonToNoneAnimator.playSequentially(fadeSecurityButtonOut, translateTitleLeft); |
+ mNoneToOfflineButtonAnimator = new AnimatorSet(); |
+ mNoneToOfflineButtonAnimator.playSequentially(translateTitleRight, fadeOfflineButtonIn); |
+ mOfflineButtonToNoneAnimator = new AnimatorSet(); |
+ mOfflineButtonToNoneAnimator.playSequentially(fadeOfflineButtonOut, translateTitleLeft); |
+ mSecurityButtonToOfflineButtonAnimator = new AnimatorSet(); |
+ mSecurityButtonToOfflineButtonAnimator.playSequentially( |
+ fadeSecurityButtonOut, fadeOfflineButtonIn); |
+ mOfflineButtonToSecurityButtonAnimator = new AnimatorSet(); |
+ mOfflineButtonToSecurityButtonAnimator.playSequentially( |
+ fadeOfflineButtonOut, fadeSecurityButtonIn); |
+ } |
+ |
+ Animator createFadeButtonInAnimator(final View button) { |
+ Animator fadeButtonIn = ObjectAnimator.ofFloat(button, View.ALPHA, 1); |
+ fadeButtonIn.addListener(new AnimatorListenerAdapter() { |
+ @Override |
+ public void onAnimationStart(Animator animation) { |
+ button.setVisibility(View.VISIBLE); |
+ button.setAlpha(0f); |
+ } |
+ }); |
+ fadeButtonIn.setInterpolator(BakedBezierInterpolator.FADE_IN_CURVE); |
+ fadeButtonIn.setDuration(CUSTOM_TAB_TOOLBAR_FADE_DURATION_MS); |
+ return fadeButtonIn; |
+ } |
+ |
+ Animator createFadeButtonOutAnimator(final View button) { |
+ Animator fadeButtonOut = ObjectAnimator.ofFloat(button, View.ALPHA, 0); |
+ fadeButtonOut.setInterpolator(BakedBezierInterpolator.FADE_OUT_CURVE); |
+ fadeButtonOut.setDuration(CUSTOM_TAB_TOOLBAR_FADE_DURATION_MS); |
+ return fadeButtonOut; |
} |
/** |
@@ -154,23 +191,60 @@ class CustomTabToolbarAnimationDelegate { |
}); |
} |
+ void stopRunningAnimators() { |
+ if (mNoneToSecurityButtonAnimator.isRunning()) mNoneToSecurityButtonAnimator.cancel(); |
+ if (mSecurityButtonToNoneAnimator.isRunning()) mSecurityButtonToNoneAnimator.cancel(); |
+ if (mNoneToOfflineButtonAnimator.isRunning()) mNoneToOfflineButtonAnimator.cancel(); |
+ if (mOfflineButtonToNoneAnimator.isRunning()) mOfflineButtonToNoneAnimator.cancel(); |
+ if (mSecurityButtonToOfflineButtonAnimator.isRunning()) { |
+ mSecurityButtonToOfflineButtonAnimator.cancel(); |
+ } |
+ if (mOfflineButtonToSecurityButtonAnimator.isRunning()) { |
+ mOfflineButtonToSecurityButtonAnimator.cancel(); |
+ } |
+ } |
+ |
/** |
* Starts the animation to show the security button. Will do nothing if the button is already |
* visible. |
*/ |
void showSecurityButton() { |
if (mSecurityButton.getVisibility() == View.VISIBLE) return; |
- if (mSecurityButtonShowAnimator.isRunning()) mSecurityButtonShowAnimator.cancel(); |
- mSecurityButtonShowAnimator.start(); |
+ stopRunningAnimators(); |
+ if (mOfflineButton.getVisibility() == View.VISIBLE) { |
+ mOfflineButtonToSecurityButtonAnimator.start(); |
+ } else { |
+ mNoneToSecurityButtonAnimator.start(); |
+ } |
} |
/** |
- * Starts the animation to hide the security button. Will do nothing if the button is not |
+ * Starts the animation to show the offline button. Will do nothing if the button is already |
* visible. |
*/ |
- void hideSecurityButton() { |
- if (mSecurityButton.getVisibility() == View.GONE) return; |
- if (mSecurityButtonHideAnimator.isRunning()) return; |
- mSecurityButtonHideAnimator.start(); |
+ void showOfflineButton() { |
+ if (mOfflineButton.getVisibility() == View.VISIBLE) return; |
+ stopRunningAnimators(); |
+ if (mSecurityButton.getVisibility() == View.VISIBLE) { |
+ mSecurityButtonToOfflineButtonAnimator.start(); |
+ } else { |
+ mNoneToOfflineButtonAnimator.start(); |
+ } |
+ } |
+ |
+ /** |
+ * Starts the animation to hide any buttons button. Will do nothing if no buttons are visible. |
+ */ |
+ void hideButtons() { |
+ if (mSecurityButton.getVisibility() == View.GONE |
+ && mOfflineButton.getVisibility() == View.GONE) { |
+ return; |
+ } |
+ stopRunningAnimators(); |
+ if (mSecurityButton.getVisibility() == View.VISIBLE) { |
+ mSecurityButtonToNoneAnimator.start(); |
+ } else { |
+ mOfflineButtonToNoneAnimator.start(); |
+ } |
} |
} |