Loading services/core/java/com/android/server/wm/DisplayContent.java +6 −0 Original line number Diff line number Diff line Loading @@ -6453,6 +6453,12 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp * @see #mRemoved */ boolean isRemoved() { // After DisplayManager removes the LogicalDisplay object but before WindowManager begins // removing the corresponding DisplayContent, we should check Display.isValid(), which // returns false in this specific scenario. if (mDisplayId != DEFAULT_DISPLAY && !mDisplay.isValid()) { return true; } return mRemoved; } Loading services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +10 −0 Original line number Diff line number Diff line Loading @@ -3171,6 +3171,16 @@ public class DisplayContentTests extends WindowTestsBase { assertFalse(mDisplayContent.isTaskMoveAllowedOnDisplay()); } @Test public void testIsRemoved_nonDefaultDisplay_isNotValid() { final DisplayInfo displayInfo = new DisplayInfo(mDisplayInfo); displayInfo.displayId = DEFAULT_DISPLAY + 1; final DisplayContent dc = createNewDisplay(displayInfo); spyOn(dc.mDisplay); doReturn(false).when(dc.mDisplay).isValid(); assertTrue(dc.isRemoved()); } private void removeRootTaskTests(@NonNull Runnable runnable) { final TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea(); final Task rootTask1 = taskDisplayArea.createRootTask(WINDOWING_MODE_FULLSCREEN, Loading services/tests/wmtests/src/com/android/server/wm/TestDisplayContent.java +8 −0 Original line number Diff line number Diff line Loading @@ -106,6 +106,7 @@ class TestDisplayContent extends DisplayContent { @NonNull private DeviceStateController mDeviceStateController = mock(DeviceStateController.class); private boolean mCanHostTasks = true; private boolean mIsValid = true; Builder(ActivityTaskManagerService service, int width, int height) { mService = service; Loading Loading @@ -165,6 +166,10 @@ class TestDisplayContent extends DisplayContent { mCanHostTasks = canHostTasks; return this; } Builder setIsValid(boolean isValid) { mIsValid = isValid; return this; } Builder setCutout(int left, int top, int right, int bottom) { final int cutoutFillerSize = 80; Rect boundLeft = left != 0 ? new Rect(0, 0, left, cutoutFillerSize) : null; Loading Loading @@ -224,6 +229,9 @@ class TestDisplayContent extends DisplayContent { if (mCanHostTasks) { doReturn(true).when(display).canHostTasks(); } if (mIsValid) { doReturn(true).when(display).isValid(); } final TestDisplayContent newDisplay = createInternal(display); // disable the normal system decorations final DisplayPolicy displayPolicy = newDisplay.getDisplayPolicy(); Loading Loading
services/core/java/com/android/server/wm/DisplayContent.java +6 −0 Original line number Diff line number Diff line Loading @@ -6453,6 +6453,12 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp * @see #mRemoved */ boolean isRemoved() { // After DisplayManager removes the LogicalDisplay object but before WindowManager begins // removing the corresponding DisplayContent, we should check Display.isValid(), which // returns false in this specific scenario. if (mDisplayId != DEFAULT_DISPLAY && !mDisplay.isValid()) { return true; } return mRemoved; } Loading
services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +10 −0 Original line number Diff line number Diff line Loading @@ -3171,6 +3171,16 @@ public class DisplayContentTests extends WindowTestsBase { assertFalse(mDisplayContent.isTaskMoveAllowedOnDisplay()); } @Test public void testIsRemoved_nonDefaultDisplay_isNotValid() { final DisplayInfo displayInfo = new DisplayInfo(mDisplayInfo); displayInfo.displayId = DEFAULT_DISPLAY + 1; final DisplayContent dc = createNewDisplay(displayInfo); spyOn(dc.mDisplay); doReturn(false).when(dc.mDisplay).isValid(); assertTrue(dc.isRemoved()); } private void removeRootTaskTests(@NonNull Runnable runnable) { final TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea(); final Task rootTask1 = taskDisplayArea.createRootTask(WINDOWING_MODE_FULLSCREEN, Loading
services/tests/wmtests/src/com/android/server/wm/TestDisplayContent.java +8 −0 Original line number Diff line number Diff line Loading @@ -106,6 +106,7 @@ class TestDisplayContent extends DisplayContent { @NonNull private DeviceStateController mDeviceStateController = mock(DeviceStateController.class); private boolean mCanHostTasks = true; private boolean mIsValid = true; Builder(ActivityTaskManagerService service, int width, int height) { mService = service; Loading Loading @@ -165,6 +166,10 @@ class TestDisplayContent extends DisplayContent { mCanHostTasks = canHostTasks; return this; } Builder setIsValid(boolean isValid) { mIsValid = isValid; return this; } Builder setCutout(int left, int top, int right, int bottom) { final int cutoutFillerSize = 80; Rect boundLeft = left != 0 ? new Rect(0, 0, left, cutoutFillerSize) : null; Loading Loading @@ -224,6 +229,9 @@ class TestDisplayContent extends DisplayContent { if (mCanHostTasks) { doReturn(true).when(display).canHostTasks(); } if (mIsValid) { doReturn(true).when(display).isValid(); } final TestDisplayContent newDisplay = createInternal(display); // disable the normal system decorations final DisplayPolicy displayPolicy = newDisplay.getDisplayPolicy(); Loading