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

Commit 08c4dfba authored by Rob Carr's avatar Rob Carr Committed by Android (Google) Code Review
Browse files

Merge "Delay pinned animation finish during app transition." into nyc-dev

parents a516aea7 f9aa2a96
Loading
Loading
Loading
Loading
+41 −1
Original line number Diff line number Diff line
@@ -24,10 +24,12 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import android.animation.Animator;
import android.animation.ValueAnimator;
import android.graphics.Rect;
import android.os.IBinder;
import android.os.Debug;
import android.util.ArrayMap;
import android.util.Slog;
import android.view.animation.LinearInterpolator;
import android.view.WindowManagerInternal;

/**
 * Enables animating bounds of objects.
@@ -49,6 +51,32 @@ public class BoundsAnimationController {
    // Only accessed on UI thread.
    private ArrayMap<AnimateBoundsUser, BoundsAnimator> mRunningAnimations = new ArrayMap<>();

    private final WindowManagerInternal.AppTransitionListener mAppTransitionNotifier
        = new WindowManagerInternal.AppTransitionListener() {
                public void onAppTransitionCancelledLocked() {
                    animationFinished();
                }
                public void onAppTransitionFinishedLocked(IBinder token) {
                    animationFinished();
                }
                private void animationFinished() {
                    if (mFinishAnimationAfterTransition) {
                        for (int i = 0; i < mRunningAnimations.size(); i++) {
                            BoundsAnimator b = mRunningAnimations.valueAt(i);
                            b.onAnimationEnd(null);
                        }
                    }
                }
            };

    private final AppTransition mAppTransition;
    private boolean mFinishAnimationAfterTransition = false;

    BoundsAnimationController(AppTransition transition) {
        mAppTransition = transition;
        mAppTransition.registerListenerLocked(mAppTransitionNotifier);
    }

    private final class BoundsAnimator extends ValueAnimator
            implements ValueAnimator.AnimatorUpdateListener, ValueAnimator.AnimatorListener {
        private final AnimateBoundsUser mTarget;
@@ -129,6 +157,7 @@ public class BoundsAnimationController {
        public void onAnimationStart(Animator animation) {
            if (DEBUG) Slog.d(TAG, "onAnimationStart: mTarget=" + mTarget
                    + " mReplacement=" + mReplacement);
            mFinishAnimationAfterTransition = false;
            // Ensure that we have prepared the target for animation before
            // we trigger any size changes, so it can swap surfaces
            // in to appropriate modes, or do as it wishes otherwise.
@@ -150,10 +179,21 @@ public class BoundsAnimationController {
            if (DEBUG) Slog.d(TAG, "onAnimationEnd: mTarget=" + mTarget
                    + " mMoveToFullScreen=" + mMoveToFullScreen + " mWillReplace=" + mWillReplace);

            finishAnimation();
            // There could be another animation running. For example in the
            // move to fullscreen case, recents will also be closing while the
            // previous task will be taking its place in the fullscreen stack.
            // we have to ensure this is completed before we finish the animation
            // and take our place in the fullscreen stack.
            if (mAppTransition.isRunning() && !mFinishAnimationAfterTransition) {
                mFinishAnimationAfterTransition = true;
                return;
            }

            if (mMoveToFullScreen && !mWillReplace) {
                mTarget.moveToFullscreen();
            }

            finishAnimation();
        }

        @Override
+3 −2
Original line number Diff line number Diff line
@@ -715,8 +715,7 @@ public class WindowManagerService extends IWindowManager.Stub

    final WindowAnimator mAnimator;

    private final BoundsAnimationController mBoundsAnimationController =
            new BoundsAnimationController();
    private final BoundsAnimationController mBoundsAnimationController;

    SparseArray<Task> mTaskIdToTask = new SparseArray<>();

@@ -974,6 +973,8 @@ public class WindowManagerService extends IWindowManager.Stub
        mAppTransition = new AppTransition(context, this);
        mAppTransition.registerListenerLocked(mActivityManagerAppTransitionNotifier);

        mBoundsAnimationController = new BoundsAnimationController(mAppTransition);

        mActivityManager = ActivityManagerNative.getDefault();
        mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
        mAppOps = (AppOpsManager)context.getSystemService(Context.APP_OPS_SERVICE);