| 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();
|
| + }
|
| }
|
| }
|
|
|