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

Commit cb1198a5 authored by Robert Carr's avatar Robert Carr Committed by android-build-merger
Browse files

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

am: 08c4dfba

* commit '08c4dfba':
  Delay pinned animation finish during app transition.

Change-Id: Id7ac481dcb282863f37759504db181d6dd2130d8
parents 573042aa 08c4dfba
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);