diff options
| author | 2016-06-01 11:39:54 +0100 | |
|---|---|---|
| committer | 2016-06-01 14:38:17 +0100 | |
| commit | e65b3fbb63b4b6937fede2e4b889c0a51a881358 (patch) | |
| tree | d9075a29ab9a5e582a8611a2475e6e18b47f8251 | |
| parent | 88be465ce572f84649e01744a7ec96b6346b3686 (diff) | |
Fix action mode animation on recreations - framework edition
Currently if an action mode is started in onCreate()
it will fade in. This isn't ideal though, especially
since Activities are recreated routinely with
multi-window and resizable Activities. In that instance
we fade it in on every recreate.
This CL fixes this in both the decor and toolbar action
modes to only fade in if the decor has been laid out.
BUG: 29036694
Change-Id: Iae985efcced170a0a4229124c1c132355c2aa71e
| -rw-r--r-- | core/java/com/android/internal/app/WindowDecorActionBar.java | 44 | ||||
| -rw-r--r-- | core/java/com/android/internal/policy/DecorView.java | 90 |
2 files changed, 74 insertions, 60 deletions
diff --git a/core/java/com/android/internal/app/WindowDecorActionBar.java b/core/java/com/android/internal/app/WindowDecorActionBar.java index a09dbe553c7c..1376d0ad5cdc 100644 --- a/core/java/com/android/internal/app/WindowDecorActionBar.java +++ b/core/java/com/android/internal/app/WindowDecorActionBar.java @@ -873,24 +873,40 @@ public class WindowDecorActionBar extends ActionBar implements hideForActionMode(); } - Animator fadeIn, fadeOut; - if (toActionMode) { - fadeOut = mDecorToolbar.setupAnimatorToVisibility(View.GONE, - FADE_OUT_DURATION_MS); - fadeIn = mContextView.setupAnimatorToVisibility(View.VISIBLE, - FADE_IN_DURATION_MS); + if (shouldAnimateContextView()) { + Animator fadeIn, fadeOut; + if (toActionMode) { + fadeOut = mDecorToolbar.setupAnimatorToVisibility(View.GONE, + FADE_OUT_DURATION_MS); + fadeIn = mContextView.setupAnimatorToVisibility(View.VISIBLE, + FADE_IN_DURATION_MS); + } else { + fadeIn = mDecorToolbar.setupAnimatorToVisibility(View.VISIBLE, + FADE_IN_DURATION_MS); + fadeOut = mContextView.setupAnimatorToVisibility(View.GONE, + FADE_OUT_DURATION_MS); + } + AnimatorSet set = new AnimatorSet(); + set.playSequentially(fadeOut, fadeIn); + set.start(); } else { - fadeIn = mDecorToolbar.setupAnimatorToVisibility(View.VISIBLE, - FADE_IN_DURATION_MS); - fadeOut = mContextView.setupAnimatorToVisibility(View.GONE, - FADE_OUT_DURATION_MS); - } - AnimatorSet set = new AnimatorSet(); - set.playSequentially(fadeOut, fadeIn); - set.start(); + if (toActionMode) { + mDecorToolbar.setVisibility(View.GONE); + mContextView.setVisibility(View.VISIBLE); + } else { + mDecorToolbar.setVisibility(View.VISIBLE); + mContextView.setVisibility(View.GONE); + } + } // mTabScrollView's visibility is not affected by action mode. } + private boolean shouldAnimateContextView() { + // We only to animate the action mode in if the container view has already been laid out. + // If it hasn't been laid out, it hasn't been drawn to screen yet. + return mContainerView.isLaidOut(); + } + public Context getThemedContext() { if (mThemedContext == null) { TypedValue outValue = new TypedValue(); diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java index a0652197d7b4..7e38d9bc742d 100644 --- a/core/java/com/android/internal/policy/DecorView.java +++ b/core/java/com/android/internal/policy/DecorView.java @@ -32,6 +32,7 @@ import com.android.internal.widget.FloatingToolbar; import java.util.List; import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.app.ActivityManager; import android.content.Context; @@ -1588,31 +1589,27 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind mPrimaryActionModeView.getApplicationWindowToken(), Gravity.TOP | Gravity.FILL_HORIZONTAL, 0, 0); endOnGoingFadeAnimation(); - mFadeAnim = ObjectAnimator.ofFloat(mPrimaryActionModeView, View.ALPHA, - 0f, 1f); - mFadeAnim.addListener(new Animator.AnimatorListener() { - @Override - public void onAnimationStart(Animator animation) { - mPrimaryActionModeView.setVisibility(VISIBLE); - } - - @Override - public void onAnimationEnd(Animator animation) { - mPrimaryActionModeView.setAlpha(1f); - mFadeAnim = null; - } - @Override - public void onAnimationCancel(Animator animation) { - - } - - @Override - public void onAnimationRepeat(Animator animation) { + if (shouldAnimatePrimaryActionModeView()) { + mFadeAnim = ObjectAnimator.ofFloat(mPrimaryActionModeView, View.ALPHA, + 0f, 1f); + mFadeAnim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + mPrimaryActionModeView.setVisibility(VISIBLE); + } - } - }); - mFadeAnim.start(); + @Override + public void onAnimationEnd(Animator animation) { + mPrimaryActionModeView.setAlpha(1f); + mFadeAnim = null; + } + }); + mFadeAnim.start(); + } else { + mPrimaryActionModeView.setAlpha(1f); + mPrimaryActionModeView.setVisibility(VISIBLE); + } } }; } else { @@ -1646,35 +1643,36 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind if (mPrimaryActionModePopup != null) { post(mShowPrimaryActionModePopup); } else { - mFadeAnim = ObjectAnimator.ofFloat(mPrimaryActionModeView, View.ALPHA, 0f, 1f); - mFadeAnim.addListener(new Animator.AnimatorListener() { - @Override - public void onAnimationStart(Animator animation) { - mPrimaryActionModeView.setVisibility(View.VISIBLE); - } - - @Override - public void onAnimationEnd(Animator animation) { - mPrimaryActionModeView.setAlpha(1f); - mFadeAnim = null; - } - - @Override - public void onAnimationCancel(Animator animation) { - - } - - @Override - public void onAnimationRepeat(Animator animation) { + if (shouldAnimatePrimaryActionModeView()) { + mFadeAnim = ObjectAnimator.ofFloat(mPrimaryActionModeView, View.ALPHA, 0f, 1f); + mFadeAnim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + mPrimaryActionModeView.setVisibility(View.VISIBLE); + } - } - }); - mFadeAnim.start(); + @Override + public void onAnimationEnd(Animator animation) { + mPrimaryActionModeView.setAlpha(1f); + mFadeAnim = null; + } + }); + mFadeAnim.start(); + } else { + mPrimaryActionModeView.setAlpha(1f); + mPrimaryActionModeView.setVisibility(View.VISIBLE); + } } mPrimaryActionModeView.sendAccessibilityEvent( AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); } + boolean shouldAnimatePrimaryActionModeView() { + // We only to animate the action mode in if the decor has already been laid out. + // If it hasn't been laid out, it hasn't been drawn to screen yet. + return isLaidOut(); + } + private ActionMode createFloatingActionMode( View originatingView, ActionMode.Callback2 callback) { if (mFloatingActionMode != null) { |