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

Commit f4b1c8d7 authored by Winson Chung's avatar Winson Chung Committed by Android Git Automerger
Browse files

am 5284dd8d: am 91283969: Merge "Fixing crash in recents window transition. ...

am 5284dd8d: am 91283969: Merge "Fixing crash in recents window transition.  (Bug 18246975, 18159006)" into lmp-mr1-dev

* commit '5284dd8d':
  Fixing crash in recents window transition.  (Bug 18246975, 18159006)
parents fb68a976 5284dd8d
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -691,8 +691,10 @@ public class AppTransition implements Dump {
                throw new RuntimeException("Invalid thumbnail transition state");
        }

        return prepareThumbnailAnimationWithDuration(a, appWidth, appHeight,
                THUMBNAIL_APP_TRANSITION_DURATION, mThumbnailFastOutSlowInInterpolator);
        int duration = Math.max(THUMBNAIL_APP_TRANSITION_ALPHA_DURATION,
                THUMBNAIL_APP_TRANSITION_DURATION);
        return prepareThumbnailAnimationWithDuration(a, appWidth, appHeight, duration,
                mThumbnailFastOutSlowInInterpolator);
    }

    /**
+27 −27
Original line number Diff line number Diff line
@@ -58,7 +58,9 @@ public class AppWindowAnimator {
    // the state changes.
    boolean allDrawn;

    // Special surface for thumbnail animation.
    // Special surface for thumbnail animation.  If deferThumbnailDestruction is enabled, then we
    // will make sure that the thumbnail is destroyed after the other surface is completed.  This
    // requires that the duration of the two animations are the same.
    SurfaceControl thumbnail;
    int thumbnailTransactionSeq;
    int thumbnailX;
@@ -68,13 +70,12 @@ public class AppWindowAnimator {
    Animation thumbnailAnimation;
    final Transformation thumbnailTransformation = new Transformation();
    // This flag indicates that the destruction of the thumbnail surface is synchronized with
    // another animation, so do not pre-emptively destroy the thumbnail surface when the animation
    // completes
    // another animation, so defer the destruction of this thumbnail surface for a single frame
    // after the secondary animation completes.
    boolean deferThumbnailDestruction;
    // This is the thumbnail surface that has been bestowed upon this animator, and when the
    // surface for this animator's animation is complete, we will destroy the thumbnail surface
    // as well.  Do not animate or do anything with this surface.
    SurfaceControl deferredThumbnail;
    // This flag is set if the animator has deferThumbnailDestruction set and has reached the final
    // frame of animation.  It will extend the animation by one frame and then clean up afterwards.
    boolean deferFinalFrameCleanup;

    /** WindowStateAnimator from mAppAnimator.allAppWindows as of last performLayout */
    ArrayList<WindowStateAnimator> mAllAppWinAnimators = new ArrayList<WindowStateAnimator>();
@@ -134,9 +135,7 @@ public class AppWindowAnimator {
            animation = null;
            animating = true;
        }
        if (!deferThumbnailDestruction) {
        clearThumbnail();
        }
        if (mAppToken.deferClearAllDrawn) {
            mAppToken.allDrawn = false;
            mAppToken.deferClearAllDrawn = false;
@@ -148,13 +147,7 @@ public class AppWindowAnimator {
            thumbnail.destroy();
            thumbnail = null;
        }
    }

    public void clearDeferredThumbnail() {
        if (deferredThumbnail != null) {
            deferredThumbnail.destroy();
            deferredThumbnail = null;
        }
        deferThumbnailDestruction = false;
    }

    void updateLayers() {
@@ -223,19 +216,26 @@ public class AppWindowAnimator {
            return false;
        }
        transformation.clear();
        final boolean more = animation.getTransformation(currentTime, transformation);
        boolean hasMoreFrames = animation.getTransformation(currentTime, transformation);
        if (!hasMoreFrames) {
            if (deferThumbnailDestruction && !deferFinalFrameCleanup) {
                // We are deferring the thumbnail destruction, so extend the animation for one more
                // (dummy) frame before we clean up
                deferFinalFrameCleanup = true;
                hasMoreFrames = true;
            } else {
                if (false && WindowManagerService.DEBUG_ANIM) Slog.v(
            TAG, "Stepped animation in " + mAppToken + ": more=" + more + ", xform=" + transformation);
        if (!more) {
                        TAG, "Stepped animation in " + mAppToken + ": more=" + hasMoreFrames +
                                ", xform=" + transformation);
                deferFinalFrameCleanup = false;
                animation = null;
            if (!deferThumbnailDestruction) {
                clearThumbnail();
            }
                if (WindowManagerService.DEBUG_ANIM) Slog.v(
                        TAG, "Finished animation in " + mAppToken + " @ " + currentTime);
            }
        hasTransformation = more;
        return more;
        }
        hasTransformation = hasMoreFrames;
        return hasMoreFrames;
    }

    // This must be called while inside a transaction.
+0 −6
Original line number Diff line number Diff line
@@ -9244,12 +9244,6 @@ public class WindowManagerService extends IWindowManager.Stub
                                topClosingLayer);
                        openingAppAnimator.deferThumbnailDestruction =
                                !mAppTransition.isNextThumbnailTransitionScaleUp();
                        if (openingAppAnimator.deferThumbnailDestruction) {
                            if (closingAppAnimator != null &&
                                    closingAppAnimator.animation != null) {
                                closingAppAnimator.deferredThumbnail = surfaceControl;
                            }
                        }
                    } else {
                        anim = mAppTransition.createThumbnailScaleAnimationLocked(
                                displayInfo.appWidth, displayInfo.appHeight, transit);
+0 −5
Original line number Diff line number Diff line
@@ -975,11 +975,6 @@ class WindowStateAnimator {
            mWin.mHasSurface = false;
            mDrawState = NO_SURFACE;
        }

        // Destroy any deferred thumbnail surfaces
        if (mAppAnimator != null) {
            mAppAnimator.clearDeferredThumbnail();
        }
    }

    void destroyDeferredSurfaceLocked() {