diff options
| author | 2024-11-13 05:51:29 +0000 | |
|---|---|---|
| committer | 2024-11-13 05:51:29 +0000 | |
| commit | f5adb8d189ded03d667420730587097196c12f2a (patch) | |
| tree | 3325352e1f49d6e2a925688cfe8866333f9be73a | |
| parent | f2d350f16dc631144b90d69f7a5d1459d68f86d8 (diff) | |
| parent | 97afa75805d0809f571dc9d11e5c12de2071177b (diff) | |
Merge "Unset window destroying state only if its surface is destroyed" into main
| -rw-r--r-- | services/core/java/com/android/server/wm/WindowState.java | 6 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java | 23 |
2 files changed, 27 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 079170a70433..f18f6e95efa4 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -3380,8 +3380,10 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP if (cleanupOnResume) { requestUpdateWallpaperIfNeeded(); } - mDestroying = false; - destroyedSomething = true; + if (!mHasSurface) { + mDestroying = false; + destroyedSomething = true; + } // Since mDestroying will affect ActivityRecord#allDrawn, we need to perform another // traversal in case we are waiting on this window to start the transition. 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 1750a14e0561..b737d35c1534 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java @@ -353,6 +353,29 @@ public class WindowStateTests extends WindowTestsBase { } @Test + public void testDestroySurface() { + final WindowState win = createWindow(null, TYPE_APPLICATION, "win"); + win.mHasSurface = win.mAnimatingExit = true; + win.mWinAnimator.mSurfaceControl = mock(SurfaceControl.class); + win.onExitAnimationDone(); + + assertFalse("Case 1 destroySurface no-op", + win.destroySurface(false /* cleanupOnResume */, false /* appStopped */)); + assertTrue(win.mHasSurface); + assertTrue(win.mDestroying); + + assertFalse("Case 2 destroySurface no-op", + win.destroySurface(true /* cleanupOnResume */, false /* appStopped */)); + assertTrue(win.mHasSurface); + assertTrue(win.mDestroying); + + assertTrue("Case 3 destroySurface destroys surface", + win.destroySurface(false /* cleanupOnResume */, true /* appStopped */)); + assertFalse(win.mDestroying); + assertFalse(win.mHasSurface); + } + + @Test public void testPrepareWindowToDisplayDuringRelayout() { // Call prepareWindowToDisplayDuringRelayout for a window without FLAG_TURN_SCREEN_ON before // calling setCurrentLaunchCanTurnScreenOn for windows with flag in the same activity. |