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

Commit 49cb9de9 authored by Riddle Hsu's avatar Riddle Hsu Committed by Automerger Merge Worker
Browse files

Merge "Consume sync draw handlers if the surface is destroyed" into tm-dev am: d0f3d14f

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

Change-Id: Ia350d1e2438a54b843988949720a1e6386688936
parents df18e062 d0f3d14f
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -3584,6 +3584,10 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
        // Clear animating flags now, since the surface is now gone. (Note this is true even
        // if the surface is saved, to outside world the surface is still NO_SURFACE.)
        mAnimatingExit = false;

        if (useBLASTSync()) {
            immediatelyNotifyBlastSync();
        }
    }

    void onSurfaceShownChanged(boolean shown) {
+21 −0
Original line number Diff line number Diff line
@@ -61,6 +61,7 @@ import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
@@ -491,6 +492,26 @@ public class WindowStateTests extends WindowTestsBase {
        assertThat(app.getDisplayId(), is(mDisplayContent.getDisplayId()));
    }

    @Test
    public void testApplyWithNextDraw() {
        final WindowState win = createWindow(null, TYPE_APPLICATION_OVERLAY, "app");
        final SurfaceControl.Transaction[] handledT = { null };
        // The normal case that the draw transaction is applied with finishing drawing.
        win.applyWithNextDraw(t -> handledT[0] = t);
        assertTrue(win.useBLASTSync());
        final SurfaceControl.Transaction drawT = new StubTransaction();
        win.prepareDrawHandlers();
        assertTrue(win.finishDrawing(drawT));
        assertEquals(drawT, handledT[0]);
        assertFalse(win.useBLASTSync());

        // If the window is gone before reporting drawn, the sync state should be cleared.
        win.applyWithNextDraw(t -> handledT[0] = t);
        win.destroySurfaceUnchecked();
        assertFalse(win.useBLASTSync());
        assertNotEquals(drawT, handledT[0]);
    }

    @Test
    public void testSeamlesslyRotateWindow() {
        final WindowState app = createWindow(null, TYPE_APPLICATION, "app");