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
This commit is contained in:
Chris Banes
2016-06-01 11:39:54 +01:00
parent 88be465ce5
commit e65b3fbb63
2 changed files with 73 additions and 59 deletions

View File

@@ -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);
if (toActionMode) {
mDecorToolbar.setVisibility(View.GONE);
mContextView.setVisibility(View.VISIBLE);
} else {
mDecorToolbar.setVisibility(View.VISIBLE);
mContextView.setVisibility(View.GONE);
}
}
AnimatorSet set = new AnimatorSet();
set.playSequentially(fadeOut, fadeIn);
set.start();
// 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();

View File

@@ -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;
}
if (shouldAnimatePrimaryActionModeView()) {
mFadeAnim = ObjectAnimator.ofFloat(mPrimaryActionModeView, View.ALPHA,
0f, 1f);
mFadeAnim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
mPrimaryActionModeView.setVisibility(VISIBLE);
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
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);
}
if (shouldAnimatePrimaryActionModeView()) {
mFadeAnim = ObjectAnimator.ofFloat(mPrimaryActionModeView, View.ALPHA, 0f, 1f);
mFadeAnim.addListener(new AnimatorListenerAdapter() {
@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) {
}
});
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) {