Loading services/core/java/com/android/server/wm/WindowManagerService.java +4 −1 Original line number Diff line number Diff line Loading @@ -4318,7 +4318,10 @@ public class WindowManagerService extends IWindowManager.Stub if (mWaitingForConfig) { mWaitingForConfig = false; mLastFinishedFreezeSource = "config-unchanged"; mRoot.getDisplayContent(displayId).setLayoutNeeded(); final DisplayContent dc = mRoot.getDisplayContent(displayId); if (dc != null) { dc.setLayoutNeeded(); } mWindowPlacerLocked.performSurfacePlacement(); } } Loading services/tests/servicestests/src/com/android/server/wm/AppBoundsTests.java +8 −9 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ package com.android.server.wm; import android.app.ActivityManager; import android.content.res.Configuration; import android.graphics.Rect; import android.os.Debug; import android.view.DisplayInfo; import org.junit.Test; Loading Loading @@ -53,11 +52,11 @@ public class AppBoundsTests extends WindowTestsBase { */ @Test public void testRootConfigurationBounds() throws Exception { final DisplayInfo info = sDisplayContent.getDisplayInfo(); final DisplayInfo info = mDisplayContent.getDisplayInfo(); info.appWidth = 1024; info.appHeight = 768; final Configuration config = sWm.computeNewConfiguration(sDisplayContent.getDisplayId()); final Configuration config = sWm.computeNewConfiguration(mDisplayContent.getDisplayId()); // The bounds should always be positioned in the top left. assertEquals(config.appBounds.left, 0); assertEquals(config.appBounds.top, 0); Loading Loading @@ -116,8 +115,8 @@ public class AppBoundsTests extends WindowTestsBase { */ @Test public void testFullScreenFreeFormBounds() throws Exception { final Rect fullScreenBounds = new Rect(0, 0, sDisplayInfo.logicalWidth, sDisplayInfo.logicalHeight); final Rect fullScreenBounds = new Rect(0, 0, mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight); testStackBoundsConfiguration(null /*stackId*/, mParentBounds, fullScreenBounds, mParentBounds); } Loading @@ -126,16 +125,16 @@ public class AppBoundsTests extends WindowTestsBase { private void testStackBoundsConfiguration(Integer stackId, Rect parentBounds, Rect bounds, Rect expectedConfigBounds) { final StackWindowController stackController = stackId != null ? createStackControllerOnStackOnDisplay(stackId, sDisplayContent) : createStackControllerOnDisplay(sDisplayContent); createStackControllerOnStackOnDisplay(stackId, mDisplayContent) : createStackControllerOnDisplay(mDisplayContent); final Configuration parentConfig = sDisplayContent.getConfiguration(); final Configuration parentConfig = mDisplayContent.getConfiguration(); parentConfig.setAppBounds(parentBounds); final Configuration config = new Configuration(); stackController.adjustConfigurationForBounds(bounds, null /*insetBounds*/, new Rect() /*nonDecorBounds*/, new Rect() /*stableBounds*/, false /*overrideWidth*/, false /*overrideHeight*/, sDisplayInfo.logicalDensityDpi, config, parentConfig); false /*overrideHeight*/, mDisplayInfo.logicalDensityDpi, config, parentConfig); // Assert that both expected and actual are null or are equal to each other assertTrue((expectedConfigBounds == null && config.appBounds == null) Loading services/tests/servicestests/src/com/android/server/wm/AppWindowContainerControllerTests.java +14 −13 Original line number Diff line number Diff line Loading @@ -48,14 +48,14 @@ public class AppWindowContainerControllerTests extends WindowTestsBase { createAppWindowController(); // Assert token was added to display. assertNotNull(sDisplayContent.getWindowToken(controller.mToken.asBinder())); assertNotNull(mDisplayContent.getWindowToken(controller.mToken.asBinder())); // Assert that the container was created and linked. assertNotNull(controller.mContainer); controller.removeContainer(sDisplayContent.getDisplayId()); controller.removeContainer(mDisplayContent.getDisplayId()); // Assert token was remove from display. assertNull(sDisplayContent.getWindowToken(controller.mToken.asBinder())); assertNull(mDisplayContent.getWindowToken(controller.mToken.asBinder())); // Assert that the container was removed. assertNull(controller.mContainer); } Loading @@ -68,11 +68,11 @@ public class AppWindowContainerControllerTests extends WindowTestsBase { // Assert orientation is unspecified to start. assertEquals(SCREEN_ORIENTATION_UNSPECIFIED, controller.getOrientation()); controller.setOrientation(SCREEN_ORIENTATION_LANDSCAPE, sDisplayContent.getDisplayId(), controller.setOrientation(SCREEN_ORIENTATION_LANDSCAPE, mDisplayContent.getDisplayId(), EMPTY /* displayConfig */, false /* freezeScreenIfNeeded */); assertEquals(SCREEN_ORIENTATION_LANDSCAPE, controller.getOrientation()); controller.removeContainer(sDisplayContent.getDisplayId()); controller.removeContainer(mDisplayContent.getDisplayId()); // Assert orientation is unspecified to after container is removed. assertEquals(SCREEN_ORIENTATION_UNSPECIFIED, controller.getOrientation()); Loading @@ -99,7 +99,7 @@ public class AppWindowContainerControllerTests extends WindowTestsBase { controller.addStartingWindow(InstrumentationRegistry.getContext().getPackageName(), android.R.style.Theme, null, "Test", 0, 0, 0, 0, null, true, true, false, true); waitUntilHandlersIdle(); final AppWindowToken atoken = controller.getAppWindowToken(); final AppWindowToken atoken = controller.getAppWindowToken(mDisplayContent); assertHasStartingWindow(atoken); controller.removeStartingWindow(); waitUntilHandlersIdle(); Loading @@ -119,8 +119,8 @@ public class AppWindowContainerControllerTests extends WindowTestsBase { android.R.style.Theme, null, "Test", 0, 0, 0, 0, controller1.mToken.asBinder(), true, true, false, true); waitUntilHandlersIdle(); assertNoStartingWindow(controller1.getAppWindowToken()); assertHasStartingWindow(controller2.getAppWindowToken()); assertNoStartingWindow(controller1.getAppWindowToken(mDisplayContent)); assertHasStartingWindow(controller2.getAppWindowToken(mDisplayContent)); } @Test Loading @@ -129,7 +129,7 @@ public class AppWindowContainerControllerTests extends WindowTestsBase { createAppWindowController(); final WindowTestUtils.TestAppWindowContainerController controller2 = createAppWindowController(); sPolicy.setRunnableWhenAddingSplashScreen(() -> { ((TestWindowManagerPolicy) sWm.mPolicy).setRunnableWhenAddingSplashScreen(() -> { // Surprise, ...! Transfer window in the middle of the creation flow. controller2.addStartingWindow(InstrumentationRegistry.getContext().getPackageName(), Loading @@ -139,14 +139,14 @@ public class AppWindowContainerControllerTests extends WindowTestsBase { controller1.addStartingWindow(InstrumentationRegistry.getContext().getPackageName(), android.R.style.Theme, null, "Test", 0, 0, 0, 0, null, true, true, false, true); waitUntilHandlersIdle(); assertNoStartingWindow(controller1.getAppWindowToken()); assertHasStartingWindow(controller2.getAppWindowToken()); assertNoStartingWindow(controller1.getAppWindowToken(mDisplayContent)); assertHasStartingWindow(controller2.getAppWindowToken(mDisplayContent)); } @Test public void testReparent() throws Exception { final StackWindowController stackController = createStackControllerOnDisplay(sDisplayContent); createStackControllerOnDisplay(mDisplayContent); final WindowTestUtils.TestTaskWindowContainerController taskController1 = new WindowTestUtils.TestTaskWindowContainerController(stackController); final WindowTestUtils.TestAppWindowContainerController appWindowController1 = Loading Loading @@ -183,7 +183,8 @@ public class AppWindowContainerControllerTests extends WindowTestsBase { } private WindowTestUtils.TestAppWindowContainerController createAppWindowController() { return createAppWindowController(new WindowTestUtils.TestTaskWindowContainerController()); return createAppWindowController( new WindowTestUtils.TestTaskWindowContainerController(this)); } private WindowTestUtils.TestAppWindowContainerController createAppWindowController( Loading services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java +11 −12 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ package com.android.server.wm; import org.junit.Test; import org.junit.Ignore; import org.junit.runner.RunWith; import android.platform.test.annotations.Presubmit; Loading Loading @@ -52,7 +51,7 @@ public class AppWindowTokenTests extends WindowTestsBase { @Test public void testAddWindow_Order() throws Exception { final WindowTestUtils.TestAppWindowToken token = new WindowTestUtils.TestAppWindowToken(sDisplayContent); new WindowTestUtils.TestAppWindowToken(mDisplayContent); assertEquals(0, token.getWindowsCount()); Loading Loading @@ -80,7 +79,7 @@ public class AppWindowTokenTests extends WindowTestsBase { @Test public void testFindMainWindow() throws Exception { final WindowTestUtils.TestAppWindowToken token = new WindowTestUtils.TestAppWindowToken(sDisplayContent); new WindowTestUtils.TestAppWindowToken(mDisplayContent); assertNull(token.findMainWindow()); Loading @@ -102,10 +101,10 @@ public class AppWindowTokenTests extends WindowTestsBase { sWm.mDisplayEnabled = true; // Create an app window with token on a display. final TaskStack stack = createTaskStackOnDisplay(sDisplayContent); final TaskStack stack = createTaskStackOnDisplay(mDisplayContent); final Task task = createTaskInStack(stack, 0 /* userId */); final WindowTestUtils.TestAppWindowToken appWindowToken = new WindowTestUtils.TestAppWindowToken(sDisplayContent); new WindowTestUtils.TestAppWindowToken(mDisplayContent); task.addChild(appWindowToken, 0); final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams( TYPE_BASE_APPLICATION); Loading @@ -115,17 +114,17 @@ public class AppWindowTokenTests extends WindowTestsBase { // Set initial orientation and update. appWindowToken.setOrientation(SCREEN_ORIENTATION_LANDSCAPE); sWm.updateOrientationFromAppTokens(sDisplayContent.getOverrideConfiguration(), null, sDisplayContent.getDisplayId()); assertEquals(SCREEN_ORIENTATION_LANDSCAPE, sDisplayContent.getLastOrientation()); sWm.updateOrientationFromAppTokens(mDisplayContent.getOverrideConfiguration(), null, mDisplayContent.getDisplayId()); assertEquals(SCREEN_ORIENTATION_LANDSCAPE, mDisplayContent.getLastOrientation()); appWindow.resizeReported = false; // Update the orientation to perform 180 degree rotation and check that resize was reported. appWindowToken.setOrientation(SCREEN_ORIENTATION_REVERSE_LANDSCAPE); sWm.updateOrientationFromAppTokens(sDisplayContent.getOverrideConfiguration(), null, sDisplayContent.getDisplayId()); sWm.updateOrientationFromAppTokens(mDisplayContent.getOverrideConfiguration(), null, mDisplayContent.getDisplayId()); sWm.mRoot.performSurfacePlacement(false /* recoveringMemory */); assertEquals(SCREEN_ORIENTATION_REVERSE_LANDSCAPE, sDisplayContent.getLastOrientation()); assertEquals(SCREEN_ORIENTATION_REVERSE_LANDSCAPE, mDisplayContent.getLastOrientation()); assertTrue(appWindow.resizeReported); appWindow.removeImmediately(); } Loading Loading @@ -170,7 +169,7 @@ public class AppWindowTokenTests extends WindowTestsBase { @Test public void testGetOrientation() throws Exception { final WindowTestUtils.TestAppWindowToken token = new WindowTestUtils.TestAppWindowToken(sDisplayContent); new WindowTestUtils.TestAppWindowToken(mDisplayContent); token.setOrientation(SCREEN_ORIENTATION_LANDSCAPE); token.setFillsParent(false); Loading services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java +81 −81 Original line number Diff line number Diff line Loading @@ -52,74 +52,74 @@ public class DisplayContentTests extends WindowTestsBase { @Test public void testForAllWindows() throws Exception { final WindowState exitingAppWindow = createWindow(null, TYPE_BASE_APPLICATION, sDisplayContent, "exiting app"); mDisplayContent, "exiting app"); final AppWindowToken exitingAppToken = exitingAppWindow.mAppToken; exitingAppToken.mIsExiting = true; exitingAppToken.getTask().mStack.mExitingAppTokens.add(exitingAppToken); assertForAllWindowsOrder(Arrays.asList( sWallpaperWindow, mWallpaperWindow, exitingAppWindow, sChildAppWindowBelow, sAppWindow, sChildAppWindowAbove, sDockedDividerWindow, sStatusBarWindow, sNavBarWindow, sImeWindow, sImeDialogWindow)); mChildAppWindowBelow, mAppWindow, mChildAppWindowAbove, mDockedDividerWindow, mStatusBarWindow, mNavBarWindow, mImeWindow, mImeDialogWindow)); } @Test public void testForAllWindows_WithAppImeTarget() throws Exception { final WindowState imeAppTarget = createWindow(null, TYPE_BASE_APPLICATION, sDisplayContent, "imeAppTarget"); createWindow(null, TYPE_BASE_APPLICATION, mDisplayContent, "imeAppTarget"); sWm.mInputMethodTarget = imeAppTarget; assertForAllWindowsOrder(Arrays.asList( sWallpaperWindow, sChildAppWindowBelow, sAppWindow, sChildAppWindowAbove, mWallpaperWindow, mChildAppWindowBelow, mAppWindow, mChildAppWindowAbove, imeAppTarget, sImeWindow, sImeDialogWindow, sDockedDividerWindow, sStatusBarWindow, sNavBarWindow)); mImeWindow, mImeDialogWindow, mDockedDividerWindow, mStatusBarWindow, mNavBarWindow)); } @Test public void testForAllWindows_WithChildWindowImeTarget() throws Exception { sWm.mInputMethodTarget = sChildAppWindowAbove; sWm.mInputMethodTarget = mChildAppWindowAbove; assertForAllWindowsOrder(Arrays.asList( sWallpaperWindow, sChildAppWindowBelow, sAppWindow, sChildAppWindowAbove, sImeWindow, sImeDialogWindow, sDockedDividerWindow, sStatusBarWindow, sNavBarWindow)); mWallpaperWindow, mChildAppWindowBelow, mAppWindow, mChildAppWindowAbove, mImeWindow, mImeDialogWindow, mDockedDividerWindow, mStatusBarWindow, mNavBarWindow)); } @Test public void testForAllWindows_WithStatusBarImeTarget() throws Exception { sWm.mInputMethodTarget = sStatusBarWindow; sWm.mInputMethodTarget = mStatusBarWindow; assertForAllWindowsOrder(Arrays.asList( sWallpaperWindow, sChildAppWindowBelow, sAppWindow, sChildAppWindowAbove, sDockedDividerWindow, sStatusBarWindow, sImeWindow, sImeDialogWindow, sNavBarWindow)); mWallpaperWindow, mChildAppWindowBelow, mAppWindow, mChildAppWindowAbove, mDockedDividerWindow, mStatusBarWindow, mImeWindow, mImeDialogWindow, mNavBarWindow)); } @Test Loading @@ -127,28 +127,28 @@ public class DisplayContentTests extends WindowTestsBase { // This window is set-up to be z-ordered between some windows that go in the same token like // the nav bar and status bar. final WindowState voiceInteractionWindow = createWindow(null, TYPE_VOICE_INTERACTION, sDisplayContent, "voiceInteractionWindow"); mDisplayContent, "voiceInteractionWindow"); assertForAllWindowsOrder(Arrays.asList( sWallpaperWindow, sChildAppWindowBelow, sAppWindow, sChildAppWindowAbove, sDockedDividerWindow, mWallpaperWindow, mChildAppWindowBelow, mAppWindow, mChildAppWindowAbove, mDockedDividerWindow, voiceInteractionWindow, sStatusBarWindow, sNavBarWindow, sImeWindow, sImeDialogWindow)); mStatusBarWindow, mNavBarWindow, mImeWindow, mImeDialogWindow)); } @Test public void testComputeImeTarget() throws Exception { // Verify that an app window can be an ime target. final WindowState appWin = createWindow(null, TYPE_APPLICATION, sDisplayContent, "appWin"); final WindowState appWin = createWindow(null, TYPE_APPLICATION, mDisplayContent, "appWin"); appWin.setHasSurface(true); assertTrue(appWin.canBeImeTarget()); WindowState imeTarget = sDisplayContent.computeImeTarget(false /* updateImeTarget */); WindowState imeTarget = mDisplayContent.computeImeTarget(false /* updateImeTarget */); assertEquals(appWin, imeTarget); // Verify that an child window can be an ime target. Loading @@ -156,7 +156,7 @@ public class DisplayContentTests extends WindowTestsBase { TYPE_APPLICATION_ATTACHED_DIALOG, "childWin"); childWin.setHasSurface(true); assertTrue(childWin.canBeImeTarget()); imeTarget = sDisplayContent.computeImeTarget(false /* updateImeTarget */); imeTarget = mDisplayContent.computeImeTarget(false /* updateImeTarget */); assertEquals(childWin, imeTarget); } Loading @@ -182,12 +182,12 @@ public class DisplayContentTests extends WindowTestsBase { assertEquals(dc, token.getDisplayContent()); // Move stack to first display. sDisplayContent.moveStackToDisplay(stack, true /* onTop */); assertEquals(sDisplayContent.getDisplayId(), stack.getDisplayContent().getDisplayId()); assertEquals(sDisplayContent, stack.getParent().getParent()); assertEquals(sDisplayContent, stack.getDisplayContent()); assertEquals(sDisplayContent, task.getDisplayContent()); assertEquals(sDisplayContent, token.getDisplayContent()); mDisplayContent.moveStackToDisplay(stack, true /* onTop */); assertEquals(mDisplayContent.getDisplayId(), stack.getDisplayContent().getDisplayId()); assertEquals(mDisplayContent, stack.getParent().getParent()); assertEquals(mDisplayContent, stack.getDisplayContent()); assertEquals(mDisplayContent, task.getDisplayContent()); assertEquals(mDisplayContent, token.getDisplayContent()); } /** Loading @@ -195,8 +195,8 @@ public class DisplayContentTests extends WindowTestsBase { */ @Test public void testDisplayOverrideConfigUpdate() throws Exception { final int displayId = sDisplayContent.getDisplayId(); final Configuration currentOverrideConfig = sDisplayContent.getOverrideConfiguration(); final int displayId = mDisplayContent.getDisplayId(); final Configuration currentOverrideConfig = mDisplayContent.getOverrideConfiguration(); // Create new, slightly changed override configuration and apply it to the display. final Configuration newOverrideConfig = new Configuration(currentOverrideConfig); Loading @@ -206,7 +206,7 @@ public class DisplayContentTests extends WindowTestsBase { sWm.setNewDisplayOverrideConfiguration(newOverrideConfig, displayId); // Check that override config is applied. assertEquals(newOverrideConfig, sDisplayContent.getOverrideConfiguration()); assertEquals(newOverrideConfig, mDisplayContent.getOverrideConfiguration()); } /** Loading @@ -214,7 +214,7 @@ public class DisplayContentTests extends WindowTestsBase { */ @Test public void testDefaultDisplayOverrideConfigUpdate() throws Exception { final Configuration currentConfig = sDisplayContent.getConfiguration(); final Configuration currentConfig = mDisplayContent.getConfiguration(); // Create new, slightly changed override configuration and apply it to the display. final Configuration newOverrideConfig = new Configuration(currentConfig); Loading @@ -239,7 +239,7 @@ public class DisplayContentTests extends WindowTestsBase { public void testFocusedWindowMultipleDisplays() throws Exception { // Create a focusable window and check that focus is calcualted correctly final WindowState window1 = createWindow(null, TYPE_BASE_APPLICATION, sDisplayContent, "window1"); createWindow(null, TYPE_BASE_APPLICATION, mDisplayContent, "window1"); assertEquals(window1, sWm.mRoot.computeFocusedWindow()); // Check that a new display doesn't affect focus Loading @@ -264,30 +264,30 @@ public class DisplayContentTests extends WindowTestsBase { final int baseHeight = 2560; final int baseDensity = 300; sDisplayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity); mDisplayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity); final int maxWidth = 300; final int resultingHeight = (maxWidth * baseHeight) / baseWidth; final int resultingDensity = (maxWidth * baseDensity) / baseWidth; sDisplayContent.setMaxUiWidth(maxWidth); verifySizes(sDisplayContent, maxWidth, resultingHeight, resultingDensity); mDisplayContent.setMaxUiWidth(maxWidth); verifySizes(mDisplayContent, maxWidth, resultingHeight, resultingDensity); // Assert setting values again does not change; sDisplayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity); verifySizes(sDisplayContent, maxWidth, resultingHeight, resultingDensity); mDisplayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity); verifySizes(mDisplayContent, maxWidth, resultingHeight, resultingDensity); final int smallerWidth = 200; final int smallerHeight = 400; final int smallerDensity = 100; // Specify smaller dimension, verify that it is honored sDisplayContent.updateBaseDisplayMetrics(smallerWidth, smallerHeight, smallerDensity); verifySizes(sDisplayContent, smallerWidth, smallerHeight, smallerDensity); mDisplayContent.updateBaseDisplayMetrics(smallerWidth, smallerHeight, smallerDensity); verifySizes(mDisplayContent, smallerWidth, smallerHeight, smallerDensity); // Verify that setting the max width to a greater value than the base width has no effect sDisplayContent.setMaxUiWidth(maxWidth); verifySizes(sDisplayContent, smallerWidth, smallerHeight, smallerDensity); mDisplayContent.setMaxUiWidth(maxWidth); verifySizes(mDisplayContent, smallerWidth, smallerHeight, smallerDensity); } /** Loading @@ -295,17 +295,17 @@ public class DisplayContentTests extends WindowTestsBase { */ @Test public void testPinnedStackLocation() { createStackControllerOnStackOnDisplay(PINNED_STACK_ID, sDisplayContent); final int initialStackCount = sDisplayContent.getStackCount(); createStackControllerOnStackOnDisplay(PINNED_STACK_ID, mDisplayContent); final int initialStackCount = mDisplayContent.getStackCount(); // Ensure that the pinned stack was placed at the end assertEquals(initialStackCount - 1, sDisplayContent.getStaskPosById(PINNED_STACK_ID)); assertEquals(initialStackCount - 1, mDisplayContent.getStaskPosById(PINNED_STACK_ID)); // By default, this should try to create a new stack on top createTaskStackOnDisplay(sDisplayContent); final int afterStackCount = sDisplayContent.getStackCount(); createTaskStackOnDisplay(mDisplayContent); final int afterStackCount = mDisplayContent.getStackCount(); // Make sure the stack count has increased assertEquals(initialStackCount + 1, afterStackCount); // Ensure that the pinned stack is still on top assertEquals(afterStackCount - 1, sDisplayContent.getStaskPosById(PINNED_STACK_ID)); assertEquals(afterStackCount - 1, mDisplayContent.getStaskPosById(PINNED_STACK_ID)); } private static void verifySizes(DisplayContent displayContent, int expectedBaseWidth, Loading @@ -319,7 +319,7 @@ public class DisplayContentTests extends WindowTestsBase { final LinkedList<WindowState> actualWindows = new LinkedList(); // Test forward traversal. sDisplayContent.forAllWindows(actualWindows::addLast, false /* traverseTopToBottom */); mDisplayContent.forAllWindows(actualWindows::addLast, false /* traverseTopToBottom */); assertEquals(expectedWindows.size(), actualWindows.size()); for (WindowState w : expectedWindows) { assertEquals(w, actualWindows.pollFirst()); Loading @@ -327,7 +327,7 @@ public class DisplayContentTests extends WindowTestsBase { assertTrue(actualWindows.isEmpty()); // Test backward traversal. sDisplayContent.forAllWindows(actualWindows::addLast, true /* traverseTopToBottom */); mDisplayContent.forAllWindows(actualWindows::addLast, true /* traverseTopToBottom */); assertEquals(expectedWindows.size(), actualWindows.size()); for (WindowState w : expectedWindows) { assertEquals(w, actualWindows.pollLast()); Loading Loading
services/core/java/com/android/server/wm/WindowManagerService.java +4 −1 Original line number Diff line number Diff line Loading @@ -4318,7 +4318,10 @@ public class WindowManagerService extends IWindowManager.Stub if (mWaitingForConfig) { mWaitingForConfig = false; mLastFinishedFreezeSource = "config-unchanged"; mRoot.getDisplayContent(displayId).setLayoutNeeded(); final DisplayContent dc = mRoot.getDisplayContent(displayId); if (dc != null) { dc.setLayoutNeeded(); } mWindowPlacerLocked.performSurfacePlacement(); } } Loading
services/tests/servicestests/src/com/android/server/wm/AppBoundsTests.java +8 −9 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ package com.android.server.wm; import android.app.ActivityManager; import android.content.res.Configuration; import android.graphics.Rect; import android.os.Debug; import android.view.DisplayInfo; import org.junit.Test; Loading Loading @@ -53,11 +52,11 @@ public class AppBoundsTests extends WindowTestsBase { */ @Test public void testRootConfigurationBounds() throws Exception { final DisplayInfo info = sDisplayContent.getDisplayInfo(); final DisplayInfo info = mDisplayContent.getDisplayInfo(); info.appWidth = 1024; info.appHeight = 768; final Configuration config = sWm.computeNewConfiguration(sDisplayContent.getDisplayId()); final Configuration config = sWm.computeNewConfiguration(mDisplayContent.getDisplayId()); // The bounds should always be positioned in the top left. assertEquals(config.appBounds.left, 0); assertEquals(config.appBounds.top, 0); Loading Loading @@ -116,8 +115,8 @@ public class AppBoundsTests extends WindowTestsBase { */ @Test public void testFullScreenFreeFormBounds() throws Exception { final Rect fullScreenBounds = new Rect(0, 0, sDisplayInfo.logicalWidth, sDisplayInfo.logicalHeight); final Rect fullScreenBounds = new Rect(0, 0, mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight); testStackBoundsConfiguration(null /*stackId*/, mParentBounds, fullScreenBounds, mParentBounds); } Loading @@ -126,16 +125,16 @@ public class AppBoundsTests extends WindowTestsBase { private void testStackBoundsConfiguration(Integer stackId, Rect parentBounds, Rect bounds, Rect expectedConfigBounds) { final StackWindowController stackController = stackId != null ? createStackControllerOnStackOnDisplay(stackId, sDisplayContent) : createStackControllerOnDisplay(sDisplayContent); createStackControllerOnStackOnDisplay(stackId, mDisplayContent) : createStackControllerOnDisplay(mDisplayContent); final Configuration parentConfig = sDisplayContent.getConfiguration(); final Configuration parentConfig = mDisplayContent.getConfiguration(); parentConfig.setAppBounds(parentBounds); final Configuration config = new Configuration(); stackController.adjustConfigurationForBounds(bounds, null /*insetBounds*/, new Rect() /*nonDecorBounds*/, new Rect() /*stableBounds*/, false /*overrideWidth*/, false /*overrideHeight*/, sDisplayInfo.logicalDensityDpi, config, parentConfig); false /*overrideHeight*/, mDisplayInfo.logicalDensityDpi, config, parentConfig); // Assert that both expected and actual are null or are equal to each other assertTrue((expectedConfigBounds == null && config.appBounds == null) Loading
services/tests/servicestests/src/com/android/server/wm/AppWindowContainerControllerTests.java +14 −13 Original line number Diff line number Diff line Loading @@ -48,14 +48,14 @@ public class AppWindowContainerControllerTests extends WindowTestsBase { createAppWindowController(); // Assert token was added to display. assertNotNull(sDisplayContent.getWindowToken(controller.mToken.asBinder())); assertNotNull(mDisplayContent.getWindowToken(controller.mToken.asBinder())); // Assert that the container was created and linked. assertNotNull(controller.mContainer); controller.removeContainer(sDisplayContent.getDisplayId()); controller.removeContainer(mDisplayContent.getDisplayId()); // Assert token was remove from display. assertNull(sDisplayContent.getWindowToken(controller.mToken.asBinder())); assertNull(mDisplayContent.getWindowToken(controller.mToken.asBinder())); // Assert that the container was removed. assertNull(controller.mContainer); } Loading @@ -68,11 +68,11 @@ public class AppWindowContainerControllerTests extends WindowTestsBase { // Assert orientation is unspecified to start. assertEquals(SCREEN_ORIENTATION_UNSPECIFIED, controller.getOrientation()); controller.setOrientation(SCREEN_ORIENTATION_LANDSCAPE, sDisplayContent.getDisplayId(), controller.setOrientation(SCREEN_ORIENTATION_LANDSCAPE, mDisplayContent.getDisplayId(), EMPTY /* displayConfig */, false /* freezeScreenIfNeeded */); assertEquals(SCREEN_ORIENTATION_LANDSCAPE, controller.getOrientation()); controller.removeContainer(sDisplayContent.getDisplayId()); controller.removeContainer(mDisplayContent.getDisplayId()); // Assert orientation is unspecified to after container is removed. assertEquals(SCREEN_ORIENTATION_UNSPECIFIED, controller.getOrientation()); Loading @@ -99,7 +99,7 @@ public class AppWindowContainerControllerTests extends WindowTestsBase { controller.addStartingWindow(InstrumentationRegistry.getContext().getPackageName(), android.R.style.Theme, null, "Test", 0, 0, 0, 0, null, true, true, false, true); waitUntilHandlersIdle(); final AppWindowToken atoken = controller.getAppWindowToken(); final AppWindowToken atoken = controller.getAppWindowToken(mDisplayContent); assertHasStartingWindow(atoken); controller.removeStartingWindow(); waitUntilHandlersIdle(); Loading @@ -119,8 +119,8 @@ public class AppWindowContainerControllerTests extends WindowTestsBase { android.R.style.Theme, null, "Test", 0, 0, 0, 0, controller1.mToken.asBinder(), true, true, false, true); waitUntilHandlersIdle(); assertNoStartingWindow(controller1.getAppWindowToken()); assertHasStartingWindow(controller2.getAppWindowToken()); assertNoStartingWindow(controller1.getAppWindowToken(mDisplayContent)); assertHasStartingWindow(controller2.getAppWindowToken(mDisplayContent)); } @Test Loading @@ -129,7 +129,7 @@ public class AppWindowContainerControllerTests extends WindowTestsBase { createAppWindowController(); final WindowTestUtils.TestAppWindowContainerController controller2 = createAppWindowController(); sPolicy.setRunnableWhenAddingSplashScreen(() -> { ((TestWindowManagerPolicy) sWm.mPolicy).setRunnableWhenAddingSplashScreen(() -> { // Surprise, ...! Transfer window in the middle of the creation flow. controller2.addStartingWindow(InstrumentationRegistry.getContext().getPackageName(), Loading @@ -139,14 +139,14 @@ public class AppWindowContainerControllerTests extends WindowTestsBase { controller1.addStartingWindow(InstrumentationRegistry.getContext().getPackageName(), android.R.style.Theme, null, "Test", 0, 0, 0, 0, null, true, true, false, true); waitUntilHandlersIdle(); assertNoStartingWindow(controller1.getAppWindowToken()); assertHasStartingWindow(controller2.getAppWindowToken()); assertNoStartingWindow(controller1.getAppWindowToken(mDisplayContent)); assertHasStartingWindow(controller2.getAppWindowToken(mDisplayContent)); } @Test public void testReparent() throws Exception { final StackWindowController stackController = createStackControllerOnDisplay(sDisplayContent); createStackControllerOnDisplay(mDisplayContent); final WindowTestUtils.TestTaskWindowContainerController taskController1 = new WindowTestUtils.TestTaskWindowContainerController(stackController); final WindowTestUtils.TestAppWindowContainerController appWindowController1 = Loading Loading @@ -183,7 +183,8 @@ public class AppWindowContainerControllerTests extends WindowTestsBase { } private WindowTestUtils.TestAppWindowContainerController createAppWindowController() { return createAppWindowController(new WindowTestUtils.TestTaskWindowContainerController()); return createAppWindowController( new WindowTestUtils.TestTaskWindowContainerController(this)); } private WindowTestUtils.TestAppWindowContainerController createAppWindowController( Loading
services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java +11 −12 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ package com.android.server.wm; import org.junit.Test; import org.junit.Ignore; import org.junit.runner.RunWith; import android.platform.test.annotations.Presubmit; Loading Loading @@ -52,7 +51,7 @@ public class AppWindowTokenTests extends WindowTestsBase { @Test public void testAddWindow_Order() throws Exception { final WindowTestUtils.TestAppWindowToken token = new WindowTestUtils.TestAppWindowToken(sDisplayContent); new WindowTestUtils.TestAppWindowToken(mDisplayContent); assertEquals(0, token.getWindowsCount()); Loading Loading @@ -80,7 +79,7 @@ public class AppWindowTokenTests extends WindowTestsBase { @Test public void testFindMainWindow() throws Exception { final WindowTestUtils.TestAppWindowToken token = new WindowTestUtils.TestAppWindowToken(sDisplayContent); new WindowTestUtils.TestAppWindowToken(mDisplayContent); assertNull(token.findMainWindow()); Loading @@ -102,10 +101,10 @@ public class AppWindowTokenTests extends WindowTestsBase { sWm.mDisplayEnabled = true; // Create an app window with token on a display. final TaskStack stack = createTaskStackOnDisplay(sDisplayContent); final TaskStack stack = createTaskStackOnDisplay(mDisplayContent); final Task task = createTaskInStack(stack, 0 /* userId */); final WindowTestUtils.TestAppWindowToken appWindowToken = new WindowTestUtils.TestAppWindowToken(sDisplayContent); new WindowTestUtils.TestAppWindowToken(mDisplayContent); task.addChild(appWindowToken, 0); final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams( TYPE_BASE_APPLICATION); Loading @@ -115,17 +114,17 @@ public class AppWindowTokenTests extends WindowTestsBase { // Set initial orientation and update. appWindowToken.setOrientation(SCREEN_ORIENTATION_LANDSCAPE); sWm.updateOrientationFromAppTokens(sDisplayContent.getOverrideConfiguration(), null, sDisplayContent.getDisplayId()); assertEquals(SCREEN_ORIENTATION_LANDSCAPE, sDisplayContent.getLastOrientation()); sWm.updateOrientationFromAppTokens(mDisplayContent.getOverrideConfiguration(), null, mDisplayContent.getDisplayId()); assertEquals(SCREEN_ORIENTATION_LANDSCAPE, mDisplayContent.getLastOrientation()); appWindow.resizeReported = false; // Update the orientation to perform 180 degree rotation and check that resize was reported. appWindowToken.setOrientation(SCREEN_ORIENTATION_REVERSE_LANDSCAPE); sWm.updateOrientationFromAppTokens(sDisplayContent.getOverrideConfiguration(), null, sDisplayContent.getDisplayId()); sWm.updateOrientationFromAppTokens(mDisplayContent.getOverrideConfiguration(), null, mDisplayContent.getDisplayId()); sWm.mRoot.performSurfacePlacement(false /* recoveringMemory */); assertEquals(SCREEN_ORIENTATION_REVERSE_LANDSCAPE, sDisplayContent.getLastOrientation()); assertEquals(SCREEN_ORIENTATION_REVERSE_LANDSCAPE, mDisplayContent.getLastOrientation()); assertTrue(appWindow.resizeReported); appWindow.removeImmediately(); } Loading Loading @@ -170,7 +169,7 @@ public class AppWindowTokenTests extends WindowTestsBase { @Test public void testGetOrientation() throws Exception { final WindowTestUtils.TestAppWindowToken token = new WindowTestUtils.TestAppWindowToken(sDisplayContent); new WindowTestUtils.TestAppWindowToken(mDisplayContent); token.setOrientation(SCREEN_ORIENTATION_LANDSCAPE); token.setFillsParent(false); Loading
services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java +81 −81 Original line number Diff line number Diff line Loading @@ -52,74 +52,74 @@ public class DisplayContentTests extends WindowTestsBase { @Test public void testForAllWindows() throws Exception { final WindowState exitingAppWindow = createWindow(null, TYPE_BASE_APPLICATION, sDisplayContent, "exiting app"); mDisplayContent, "exiting app"); final AppWindowToken exitingAppToken = exitingAppWindow.mAppToken; exitingAppToken.mIsExiting = true; exitingAppToken.getTask().mStack.mExitingAppTokens.add(exitingAppToken); assertForAllWindowsOrder(Arrays.asList( sWallpaperWindow, mWallpaperWindow, exitingAppWindow, sChildAppWindowBelow, sAppWindow, sChildAppWindowAbove, sDockedDividerWindow, sStatusBarWindow, sNavBarWindow, sImeWindow, sImeDialogWindow)); mChildAppWindowBelow, mAppWindow, mChildAppWindowAbove, mDockedDividerWindow, mStatusBarWindow, mNavBarWindow, mImeWindow, mImeDialogWindow)); } @Test public void testForAllWindows_WithAppImeTarget() throws Exception { final WindowState imeAppTarget = createWindow(null, TYPE_BASE_APPLICATION, sDisplayContent, "imeAppTarget"); createWindow(null, TYPE_BASE_APPLICATION, mDisplayContent, "imeAppTarget"); sWm.mInputMethodTarget = imeAppTarget; assertForAllWindowsOrder(Arrays.asList( sWallpaperWindow, sChildAppWindowBelow, sAppWindow, sChildAppWindowAbove, mWallpaperWindow, mChildAppWindowBelow, mAppWindow, mChildAppWindowAbove, imeAppTarget, sImeWindow, sImeDialogWindow, sDockedDividerWindow, sStatusBarWindow, sNavBarWindow)); mImeWindow, mImeDialogWindow, mDockedDividerWindow, mStatusBarWindow, mNavBarWindow)); } @Test public void testForAllWindows_WithChildWindowImeTarget() throws Exception { sWm.mInputMethodTarget = sChildAppWindowAbove; sWm.mInputMethodTarget = mChildAppWindowAbove; assertForAllWindowsOrder(Arrays.asList( sWallpaperWindow, sChildAppWindowBelow, sAppWindow, sChildAppWindowAbove, sImeWindow, sImeDialogWindow, sDockedDividerWindow, sStatusBarWindow, sNavBarWindow)); mWallpaperWindow, mChildAppWindowBelow, mAppWindow, mChildAppWindowAbove, mImeWindow, mImeDialogWindow, mDockedDividerWindow, mStatusBarWindow, mNavBarWindow)); } @Test public void testForAllWindows_WithStatusBarImeTarget() throws Exception { sWm.mInputMethodTarget = sStatusBarWindow; sWm.mInputMethodTarget = mStatusBarWindow; assertForAllWindowsOrder(Arrays.asList( sWallpaperWindow, sChildAppWindowBelow, sAppWindow, sChildAppWindowAbove, sDockedDividerWindow, sStatusBarWindow, sImeWindow, sImeDialogWindow, sNavBarWindow)); mWallpaperWindow, mChildAppWindowBelow, mAppWindow, mChildAppWindowAbove, mDockedDividerWindow, mStatusBarWindow, mImeWindow, mImeDialogWindow, mNavBarWindow)); } @Test Loading @@ -127,28 +127,28 @@ public class DisplayContentTests extends WindowTestsBase { // This window is set-up to be z-ordered between some windows that go in the same token like // the nav bar and status bar. final WindowState voiceInteractionWindow = createWindow(null, TYPE_VOICE_INTERACTION, sDisplayContent, "voiceInteractionWindow"); mDisplayContent, "voiceInteractionWindow"); assertForAllWindowsOrder(Arrays.asList( sWallpaperWindow, sChildAppWindowBelow, sAppWindow, sChildAppWindowAbove, sDockedDividerWindow, mWallpaperWindow, mChildAppWindowBelow, mAppWindow, mChildAppWindowAbove, mDockedDividerWindow, voiceInteractionWindow, sStatusBarWindow, sNavBarWindow, sImeWindow, sImeDialogWindow)); mStatusBarWindow, mNavBarWindow, mImeWindow, mImeDialogWindow)); } @Test public void testComputeImeTarget() throws Exception { // Verify that an app window can be an ime target. final WindowState appWin = createWindow(null, TYPE_APPLICATION, sDisplayContent, "appWin"); final WindowState appWin = createWindow(null, TYPE_APPLICATION, mDisplayContent, "appWin"); appWin.setHasSurface(true); assertTrue(appWin.canBeImeTarget()); WindowState imeTarget = sDisplayContent.computeImeTarget(false /* updateImeTarget */); WindowState imeTarget = mDisplayContent.computeImeTarget(false /* updateImeTarget */); assertEquals(appWin, imeTarget); // Verify that an child window can be an ime target. Loading @@ -156,7 +156,7 @@ public class DisplayContentTests extends WindowTestsBase { TYPE_APPLICATION_ATTACHED_DIALOG, "childWin"); childWin.setHasSurface(true); assertTrue(childWin.canBeImeTarget()); imeTarget = sDisplayContent.computeImeTarget(false /* updateImeTarget */); imeTarget = mDisplayContent.computeImeTarget(false /* updateImeTarget */); assertEquals(childWin, imeTarget); } Loading @@ -182,12 +182,12 @@ public class DisplayContentTests extends WindowTestsBase { assertEquals(dc, token.getDisplayContent()); // Move stack to first display. sDisplayContent.moveStackToDisplay(stack, true /* onTop */); assertEquals(sDisplayContent.getDisplayId(), stack.getDisplayContent().getDisplayId()); assertEquals(sDisplayContent, stack.getParent().getParent()); assertEquals(sDisplayContent, stack.getDisplayContent()); assertEquals(sDisplayContent, task.getDisplayContent()); assertEquals(sDisplayContent, token.getDisplayContent()); mDisplayContent.moveStackToDisplay(stack, true /* onTop */); assertEquals(mDisplayContent.getDisplayId(), stack.getDisplayContent().getDisplayId()); assertEquals(mDisplayContent, stack.getParent().getParent()); assertEquals(mDisplayContent, stack.getDisplayContent()); assertEquals(mDisplayContent, task.getDisplayContent()); assertEquals(mDisplayContent, token.getDisplayContent()); } /** Loading @@ -195,8 +195,8 @@ public class DisplayContentTests extends WindowTestsBase { */ @Test public void testDisplayOverrideConfigUpdate() throws Exception { final int displayId = sDisplayContent.getDisplayId(); final Configuration currentOverrideConfig = sDisplayContent.getOverrideConfiguration(); final int displayId = mDisplayContent.getDisplayId(); final Configuration currentOverrideConfig = mDisplayContent.getOverrideConfiguration(); // Create new, slightly changed override configuration and apply it to the display. final Configuration newOverrideConfig = new Configuration(currentOverrideConfig); Loading @@ -206,7 +206,7 @@ public class DisplayContentTests extends WindowTestsBase { sWm.setNewDisplayOverrideConfiguration(newOverrideConfig, displayId); // Check that override config is applied. assertEquals(newOverrideConfig, sDisplayContent.getOverrideConfiguration()); assertEquals(newOverrideConfig, mDisplayContent.getOverrideConfiguration()); } /** Loading @@ -214,7 +214,7 @@ public class DisplayContentTests extends WindowTestsBase { */ @Test public void testDefaultDisplayOverrideConfigUpdate() throws Exception { final Configuration currentConfig = sDisplayContent.getConfiguration(); final Configuration currentConfig = mDisplayContent.getConfiguration(); // Create new, slightly changed override configuration and apply it to the display. final Configuration newOverrideConfig = new Configuration(currentConfig); Loading @@ -239,7 +239,7 @@ public class DisplayContentTests extends WindowTestsBase { public void testFocusedWindowMultipleDisplays() throws Exception { // Create a focusable window and check that focus is calcualted correctly final WindowState window1 = createWindow(null, TYPE_BASE_APPLICATION, sDisplayContent, "window1"); createWindow(null, TYPE_BASE_APPLICATION, mDisplayContent, "window1"); assertEquals(window1, sWm.mRoot.computeFocusedWindow()); // Check that a new display doesn't affect focus Loading @@ -264,30 +264,30 @@ public class DisplayContentTests extends WindowTestsBase { final int baseHeight = 2560; final int baseDensity = 300; sDisplayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity); mDisplayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity); final int maxWidth = 300; final int resultingHeight = (maxWidth * baseHeight) / baseWidth; final int resultingDensity = (maxWidth * baseDensity) / baseWidth; sDisplayContent.setMaxUiWidth(maxWidth); verifySizes(sDisplayContent, maxWidth, resultingHeight, resultingDensity); mDisplayContent.setMaxUiWidth(maxWidth); verifySizes(mDisplayContent, maxWidth, resultingHeight, resultingDensity); // Assert setting values again does not change; sDisplayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity); verifySizes(sDisplayContent, maxWidth, resultingHeight, resultingDensity); mDisplayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity); verifySizes(mDisplayContent, maxWidth, resultingHeight, resultingDensity); final int smallerWidth = 200; final int smallerHeight = 400; final int smallerDensity = 100; // Specify smaller dimension, verify that it is honored sDisplayContent.updateBaseDisplayMetrics(smallerWidth, smallerHeight, smallerDensity); verifySizes(sDisplayContent, smallerWidth, smallerHeight, smallerDensity); mDisplayContent.updateBaseDisplayMetrics(smallerWidth, smallerHeight, smallerDensity); verifySizes(mDisplayContent, smallerWidth, smallerHeight, smallerDensity); // Verify that setting the max width to a greater value than the base width has no effect sDisplayContent.setMaxUiWidth(maxWidth); verifySizes(sDisplayContent, smallerWidth, smallerHeight, smallerDensity); mDisplayContent.setMaxUiWidth(maxWidth); verifySizes(mDisplayContent, smallerWidth, smallerHeight, smallerDensity); } /** Loading @@ -295,17 +295,17 @@ public class DisplayContentTests extends WindowTestsBase { */ @Test public void testPinnedStackLocation() { createStackControllerOnStackOnDisplay(PINNED_STACK_ID, sDisplayContent); final int initialStackCount = sDisplayContent.getStackCount(); createStackControllerOnStackOnDisplay(PINNED_STACK_ID, mDisplayContent); final int initialStackCount = mDisplayContent.getStackCount(); // Ensure that the pinned stack was placed at the end assertEquals(initialStackCount - 1, sDisplayContent.getStaskPosById(PINNED_STACK_ID)); assertEquals(initialStackCount - 1, mDisplayContent.getStaskPosById(PINNED_STACK_ID)); // By default, this should try to create a new stack on top createTaskStackOnDisplay(sDisplayContent); final int afterStackCount = sDisplayContent.getStackCount(); createTaskStackOnDisplay(mDisplayContent); final int afterStackCount = mDisplayContent.getStackCount(); // Make sure the stack count has increased assertEquals(initialStackCount + 1, afterStackCount); // Ensure that the pinned stack is still on top assertEquals(afterStackCount - 1, sDisplayContent.getStaskPosById(PINNED_STACK_ID)); assertEquals(afterStackCount - 1, mDisplayContent.getStaskPosById(PINNED_STACK_ID)); } private static void verifySizes(DisplayContent displayContent, int expectedBaseWidth, Loading @@ -319,7 +319,7 @@ public class DisplayContentTests extends WindowTestsBase { final LinkedList<WindowState> actualWindows = new LinkedList(); // Test forward traversal. sDisplayContent.forAllWindows(actualWindows::addLast, false /* traverseTopToBottom */); mDisplayContent.forAllWindows(actualWindows::addLast, false /* traverseTopToBottom */); assertEquals(expectedWindows.size(), actualWindows.size()); for (WindowState w : expectedWindows) { assertEquals(w, actualWindows.pollFirst()); Loading @@ -327,7 +327,7 @@ public class DisplayContentTests extends WindowTestsBase { assertTrue(actualWindows.isEmpty()); // Test backward traversal. sDisplayContent.forAllWindows(actualWindows::addLast, true /* traverseTopToBottom */); mDisplayContent.forAllWindows(actualWindows::addLast, true /* traverseTopToBottom */); assertEquals(expectedWindows.size(), actualWindows.size()); for (WindowState w : expectedWindows) { assertEquals(w, actualWindows.pollLast()); Loading