diff --git a/services/core/java/com/android/server/wm/AppWindowContainerController.java b/services/core/java/com/android/server/wm/AppWindowContainerController.java index c982f081d6244..65efa7053baba 100644 --- a/services/core/java/com/android/server/wm/AppWindowContainerController.java +++ b/services/core/java/com/android/server/wm/AppWindowContainerController.java @@ -107,7 +107,7 @@ public class AppWindowContainerController if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Remove starting " + mContainer + ": startingWindow=" + mContainer.startingWindow + " startingView=" + mContainer.startingSurface); - if (mContainer.startingWindow != null) { + if (mContainer.startingData != null) { surface = mContainer.startingSurface; mContainer.startingData = null; mContainer.startingSurface = null; @@ -164,18 +164,16 @@ public class AppWindowContainerController if (surface != null) { boolean abort = false; synchronized(mWindowMap) { + // If the window was successfully added, then + // we need to remove it. if (container.removed || container.startingData == null) { - // If the window was successfully added, then - // we need to remove it. - if (container.startingWindow != null) { - if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, - "Aborted starting " + container - + ": removed=" + container.removed - + " startingData=" + container.startingData); - container.startingWindow = null; - container.startingData = null; - abort = true; - } + if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, + "Aborted starting " + container + + ": removed=" + container.removed + + " startingData=" + container.startingData); + container.startingWindow = null; + container.startingData = null; + abort = true; } else { container.startingSurface = surface; } diff --git a/services/tests/servicestests/src/com/android/server/wm/AppWindowContainerControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/AppWindowContainerControllerTests.java index da3b9c9e92981..65a56327bb244 100644 --- a/services/tests/servicestests/src/com/android/server/wm/AppWindowContainerControllerTests.java +++ b/services/tests/servicestests/src/com/android/server/wm/AppWindowContainerControllerTests.java @@ -19,18 +19,24 @@ package com.android.server.wm; import org.junit.Test; import android.platform.test.annotations.Presubmit; +import android.platform.test.annotations.SecurityTest; import android.support.test.InstrumentationRegistry; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; +import android.view.WindowManager; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; import static android.content.res.Configuration.EMPTY; +import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.fail; +import java.util.function.Consumer; + /** * Test class for {@link AppWindowContainerController}. * @@ -90,6 +96,9 @@ public class AppWindowContainerControllerTests extends WindowTestsBase { assertNull(atoken.startingSurface); assertNull(atoken.startingWindow); assertNull(atoken.startingData); + atoken.forAllWindows(windowState -> { + assertFalse(windowState.getBaseType() == TYPE_APPLICATION_STARTING); + }, true); } @Test @@ -107,6 +116,22 @@ public class AppWindowContainerControllerTests extends WindowTestsBase { assertNoStartingWindow(atoken); } + @Test + public void testAddRemoveRace() throws Exception { + + // There was once a race condition between adding and removing starting windows + for (int i = 0; i < 1000; i++) { + final WindowTestUtils.TestAppWindowContainerController controller = + createAppWindowController(); + controller.addStartingWindow(InstrumentationRegistry.getContext().getPackageName(), + android.R.style.Theme, null, "Test", 0, 0, 0, 0, null, true, true, false, true, + false); + controller.removeStartingWindow(); + waitUntilHandlersIdle(); + assertNoStartingWindow(controller.getAppWindowToken(mDisplayContent)); + } + } + @Test public void testTransferStartingWindow() throws Exception { final WindowTestUtils.TestAppWindowContainerController controller1 =