diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/WindowState.java | 4 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java | 21 |
2 files changed, 25 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index d547275dcf0c..e698e2f28612 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -3583,6 +3583,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) { diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java index a554fab76c2b..e70dd08af8a1 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java @@ -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; @@ -492,6 +493,26 @@ public class WindowStateTests extends WindowTestsBase { } @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"); final SurfaceControl.Transaction t = spy(StubTransaction.class); |