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

Commit 5c65b011 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: I37f803c41f706736cec6bfa227422c379936b51e
parents c7c6c256 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");