Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a4d9e96b authored by Chris Banes's avatar Chris Banes Committed by The Android Automerger
Browse files

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
parent f11c2f7d
Loading
Loading
Loading
Loading
+30 −14
Original line number Diff line number Diff line
@@ -873,6 +873,7 @@ public class WindowDecorActionBar extends ActionBar implements
            hideForActionMode();
        }

        if (shouldAnimateContextView()) {
            Animator fadeIn, fadeOut;
            if (toActionMode) {
                fadeOut = mDecorToolbar.setupAnimatorToVisibility(View.GONE,
@@ -888,9 +889,24 @@ public class WindowDecorActionBar extends ActionBar implements
            AnimatorSet set = new AnimatorSet();
            set.playSequentially(fadeOut, fadeIn);
            set.start();
        } else {
            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();
+44 −46
Original line number Diff line number Diff line
@@ -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,9 +1589,11 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
                                mPrimaryActionModeView.getApplicationWindowToken(),
                                Gravity.TOP | Gravity.FILL_HORIZONTAL, 0, 0);
                        endOnGoingFadeAnimation();

                        if (shouldAnimatePrimaryActionModeView()) {
                            mFadeAnim = ObjectAnimator.ofFloat(mPrimaryActionModeView, View.ALPHA,
                                    0f, 1f);
                        mFadeAnim.addListener(new Animator.AnimatorListener() {
                            mFadeAnim.addListener(new AnimatorListenerAdapter() {
                                @Override
                                public void onAnimationStart(Animator animation) {
                                    mPrimaryActionModeView.setVisibility(VISIBLE);
@@ -1601,18 +1604,12 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
                                    mPrimaryActionModeView.setAlpha(1f);
                                    mFadeAnim = null;
                                }

                            @Override
                            public void onAnimationCancel(Animator animation) {

                            }

                            @Override
                            public void onAnimationRepeat(Animator animation) {

                            }
                            });
                            mFadeAnim.start();
                        } else {
                            mPrimaryActionModeView.setAlpha(1f);
                            mPrimaryActionModeView.setVisibility(VISIBLE);
                        }
                    }
                };
            } else {
@@ -1646,8 +1643,9 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
        if (mPrimaryActionModePopup != null) {
            post(mShowPrimaryActionModePopup);
        } else {
            if (shouldAnimatePrimaryActionModeView()) {
                mFadeAnim = ObjectAnimator.ofFloat(mPrimaryActionModeView, View.ALPHA, 0f, 1f);
            mFadeAnim.addListener(new Animator.AnimatorListener() {
                mFadeAnim.addListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationStart(Animator animation) {
                        mPrimaryActionModeView.setVisibility(View.VISIBLE);
@@ -1658,23 +1656,23 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
                        mPrimaryActionModeView.setAlpha(1f);
                        mFadeAnim = null;
                    }

                @Override
                public void onAnimationCancel(Animator animation) {

                }

                @Override
                public void onAnimationRepeat(Animator animation) {

                }
                });
                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) {