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

Commit 7dcf08c6 authored by Stefan Kuhne's avatar Stefan Kuhne
Browse files

Dont create a dummy animation for a transferred animation

When multiple windows get created at once, multiple starting windows
will be created as well. The first window will get an animation and a
dummy animation. If another window will get shown shortly after, it
will receive the animation of the first starting window. However, no
new dummy animation should be created for it since otherwise it might
never get an animation end notification.

This CL also reverts previously added changes to ignore dummy animations.

reverted change: Ie907d31f51e130e245a70249a983d490f3d42b21

Bug: 21643278
Bug: 21403998
Change-Id: I228d77a2d9c3597df0eb9c340a65c0c592c35ce6
parent e790c977
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -2734,15 +2734,12 @@ public class WindowManagerService extends IWindowManager.Stub
                }
            }
            final AppWindowToken appToken = win.mAppToken;
            // Prevent an immediate window exit only for a real animation, ignoring e.g.
            // dummy animations.
            final boolean inAnimation = win.mWinAnimator.isWindowAnimatingNow();
            // The starting window is the last window in this app token and it isn't animating.
            // Allow it to be removed now as there is no additional window or animation that will
            // trigger its removal.
            final boolean lastWinStartingNotAnimating = startingWindow && appToken!= null
                    && appToken.allAppWindows.size() == 1 && !inAnimation;
            if (!lastWinStartingNotAnimating && (win.mExiting || inAnimation)) {
                    && appToken.allAppWindows.size() == 1 && !win.mWinAnimator.isAnimating();
            if (!lastWinStartingNotAnimating && (win.mExiting || win.mWinAnimator.isAnimating())) {
                // The exit animation is running... wait for it!
                win.mExiting = true;
                win.mRemoveOnExit = true;
@@ -4674,7 +4671,12 @@ public class WindowManagerService extends IWindowManager.Stub
            // If we are preparing an app transition, then delay changing
            // the visibility of this token until we execute that transition.
            if (okToDisplay() && mAppTransition.isTransitionSet()) {
                if (!wtoken.startingDisplayed || mSkipAppTransitionAnimation) {
                // A dummy animation is a placeholder animation which informs others that an
                // animation is going on (in this case an application transition). If the animation
                // was transferred from another application/animator, no dummy animator should be
                // created since an animation is already in progress.
                if (!wtoken.mAppAnimator.usingTransferredAnimation &&
                        (!wtoken.startingDisplayed || mSkipAppTransitionAnimation)) {
                    if (DEBUG_APP_TRANSITIONS) Slog.v(
                            TAG, "Setting dummy animation on: " + wtoken);
                    wtoken.mAppAnimator.setDummyAnimation();
+1 −11
Original line number Diff line number Diff line
@@ -251,21 +251,11 @@ class WindowStateAnimator {
                && mAppAnimator.animation == AppWindowAnimator.sDummyAnimation;
    }

    /** Is this window currently set to animate or currently animating?
     *  NOTE: The method will return true for cases where the window isn't currently animating, but
     *  is set to animate. i.e. if the window animation is currently set to a dummy placeholder
     *  animation. Use {@link #isWindowAnimatingNow} to know if the window is currently running a
     *  real animation. */
    /** Is this window currently set to animate or currently animating? */
    boolean isWindowAnimating() {
        return mAnimation != null;
    }

    /** Is the window performing a real animation and not a dummy which is only waiting for an
     * an animation to start? */
    boolean isWindowAnimatingNow() {
        return isWindowAnimating() && !isDummyAnimation();
    }

    void cancelExitAnimationForNextAnimationLocked() {
        if (mAnimation != null) {
            mAnimation.cancel();