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

Commit 6ba75c94 authored by Chris Li's avatar Chris Li Committed by Automerger Merge Worker
Browse files

Merge "Remove unstarted freeze surface before starting new freeze" into...

Merge "Remove unstarted freeze surface before starting new freeze" into sc-v2-dev am: d0e86ae5 am: 7df019f5

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16183025

Change-Id: I07a7c40ba698b8e6d5dbe9857c86b366d41fe71d
parents 0e18b59c 7df019f5
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -75,6 +75,7 @@ class SurfaceFreezer {
     */
    void freeze(SurfaceControl.Transaction t, Rect startBounds, Point relativePosition,
            @Nullable SurfaceControl freezeTarget) {
        reset(t);
        mFreezeBounds.set(startBounds);

        mLeash = SurfaceAnimator.createAnimationLeash(mAnimatable, mAnimatable.getSurfaceControl(),
@@ -139,6 +140,22 @@ class SurfaceFreezer {
        }
    }

    /** Resets the snapshot before taking another one if the animation hasn't been started yet. */
    private void reset(SurfaceControl.Transaction t) {
        // Those would have been taken by the SurfaceAnimator if the animation has been started, so
        // we can remove the leash directly.
        // No need to reset the mAnimatable leash, as this is called before a new animation leash is
        // created, so another #onAnimationLeashCreated will be called.
        if (mSnapshot != null) {
            mSnapshot.destroy(t);
            mSnapshot = null;
        }
        if (mLeash != null) {
            t.remove(mLeash);
            mLeash = null;
        }
    }

    void setLayer(SurfaceControl.Transaction t, int layer) {
        if (mLeash != null) {
            t.setLayer(mLeash, layer);
+27 −0
Original line number Diff line number Diff line
@@ -1174,6 +1174,33 @@ public class WindowContainerTests extends WindowTestsBase {
        assertNull(surfaceAnimator.mSnapshot);
    }

    @Test
    public void testRemoveUnstartedFreezeSurfaceWhenFreezeAgain() {
        final WindowContainer container = createTaskFragmentWithParentTask(
                createTask(mDisplayContent), false);
        container.mSurfaceControl = mock(SurfaceControl.class);
        final SurfaceFreezer surfaceFreezer = container.mSurfaceFreezer;
        final SurfaceControl.Transaction t = mock(SurfaceControl.Transaction.class);
        spyOn(container);
        doReturn(t).when(container).getPendingTransaction();
        doReturn(t).when(container).getSyncTransaction();

        // Leash and snapshot created for change transition.
        container.initializeChangeTransition(new Rect(0, 0, 1000, 2000));

        assertNotNull(surfaceFreezer.mLeash);

        // Can't really take a snapshot, manually set one.
        final SurfaceFreezer.Snapshot snapshot = mock(SurfaceFreezer.Snapshot.class);
        surfaceFreezer.mSnapshot = snapshot;
        final SurfaceControl prevLeash = surfaceFreezer.mLeash;

        container.initializeChangeTransition(new Rect(0, 0, 1500, 2500));

        verify(t).remove(prevLeash);
        verify(snapshot).destroy(t);
    }

    /* Used so we can gain access to some protected members of the {@link WindowContainer} class */
    private static class TestWindowContainer extends WindowContainer<TestWindowContainer> {
        private final int mLayer;