AppBoundsTests.java revision 11cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1
1b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen/* 2b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * Copyright (C) 2017 The Android Open Source Project 3b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * 4b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * Licensed under the Apache License, Version 2.0 (the "License"); 5b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * you may not use this file except in compliance with the License. 6b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * You may obtain a copy of the License at 7b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * 8b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * http://www.apache.org/licenses/LICENSE-2.0 9b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * 10b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * Unless required by applicable law or agreed to in writing, software 11b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * distributed under the License is distributed on an "AS IS" BASIS, 12b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * See the License for the specific language governing permissions and 14b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * limitations under the License 15b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen */ 16b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 17b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenpackage com.android.server.wm; 18b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 19b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenimport android.app.ActivityManager; 20b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenimport android.content.res.Configuration; 21b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissenimport android.graphics.Rect; 22b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenimport android.view.DisplayInfo; 23b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenimport org.junit.Test; 24b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 25b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenimport android.platform.test.annotations.Presubmit; 26b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenimport android.support.test.filters.SmallTest; 27b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenimport android.support.test.runner.AndroidJUnit4; 28e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia 29b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenimport static org.junit.Assert.assertEquals; 30b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenimport static org.junit.Assert.assertTrue; 31b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 32b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen/** 33b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * Test class to exercise logic related to {@link android.content.res.Configuration#appBounds}. 34b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * 35b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * Build/Install/Run: 36b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * bit FrameworksServicesTests:com.android.server.wm.AppBoundsTests 37b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen */ 38b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen@SmallTest 39f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung@Presubmit 401f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia@org.junit.runner.RunWith(AndroidJUnit4.class) 41cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hungpublic class AppBoundsTests extends WindowTestsBase { 42cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung private Rect mParentBounds; 43b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 44b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen @Override 45b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen public void setUp() throws Exception { 46b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen super.setUp(); 47b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen mParentBounds = new Rect(10 /*left*/, 30 /*top*/, 80 /*right*/, 60 /*bottom*/); 48f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung } 49f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung 50b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen /** 51b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen * Ensures the configuration app bounds at the root level match the app dimensions. 52f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung */ 53b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen @Test 54f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung public void testRootConfigurationBounds() throws Exception { 55f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung final DisplayInfo info = mDisplayContent.getDisplayInfo(); 56f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung info.appWidth = 1024; 57b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen info.appHeight = 768; 58b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen 59b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen final Configuration config = sWm.computeNewConfiguration(mDisplayContent.getDisplayId()); 60f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung // The bounds should always be positioned in the top left. 619bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung assertEquals(config.appBounds.left, 0); 629bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung assertEquals(config.appBounds.top, 0); 639bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung 64f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung // The bounds should equal the defined app width and height 65f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung assertEquals(config.appBounds.width(), info.appWidth); 66b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen assertEquals(config.appBounds.height(), info.appHeight); 67b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen } 68b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 69b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen /** 7064a2870d8515fd914638c60803db86dbd92f5b06Chih-Hung Hsieh * Ensures that bounds are clipped to their parent. 71f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung */ 72b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen @Test 73b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen public void testBoundsClipping() throws Exception { 74b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen final Rect shiftedBounds = new Rect(mParentBounds); 75b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen shiftedBounds.offset(10, 10); 76b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen final Rect expectedBounds = new Rect(mParentBounds); 77b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen expectedBounds.intersect(shiftedBounds); 78b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen testStackBoundsConfiguration(null /*stackId*/, mParentBounds, shiftedBounds, 79b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen expectedBounds); 80b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 81b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 82b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen /** 83b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * Ensures that empty bounds are not propagated to the configuration. 84b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen */ 85b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen @Test 86b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen public void testEmptyBounds() throws Exception { 87b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen final Rect emptyBounds = new Rect(); 88b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen testStackBoundsConfiguration(null /*stackId*/, mParentBounds, emptyBounds, 89b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen null /*ExpectedBounds*/); 90b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 91b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 92b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen /** 93b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * Ensures that bounds on freeform stacks are not clipped. 94b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen */ 95b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen @Test 96b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen public void testFreeFormBounds() throws Exception { 97b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen final Rect freeFormBounds = new Rect(mParentBounds); 98f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung freeFormBounds.offset(10, 10); 99f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung testStackBoundsConfiguration(ActivityManager.StackId.FREEFORM_WORKSPACE_STACK_ID, 100f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung mParentBounds, freeFormBounds, freeFormBounds); 101f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung } 102b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 103b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen /** 104b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * Ensures that fully contained bounds are not clipped. 105b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen */ 106b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen @Test 107b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen public void testContainedBounds() throws Exception { 108b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen final Rect insetBounds = new Rect(mParentBounds); 109b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen insetBounds.inset(5, 5, 5, 5); 110b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen testStackBoundsConfiguration(null /*stackId*/, mParentBounds, insetBounds, insetBounds); 111b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 112b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 113b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen /** 114b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * Ensures that full screen free form bounds are clipped 115b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen */ 116b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen @Test 117f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung public void testFullScreenFreeFormBounds() throws Exception { 118f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung final Rect fullScreenBounds = new Rect(0, 0, mDisplayInfo.logicalWidth, 119f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung mDisplayInfo.logicalHeight); 120f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung testStackBoundsConfiguration(null /*stackId*/, mParentBounds, fullScreenBounds, 121f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung mParentBounds); 122b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 123b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 124b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 125f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung private void testStackBoundsConfiguration(Integer stackId, Rect parentBounds, Rect bounds, 126f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung Rect expectedConfigBounds) { 1271f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia final StackWindowController stackController = stackId != null ? 1281f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia createStackControllerOnStackOnDisplay(stackId, mDisplayContent) 1291f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia : createStackControllerOnDisplay(mDisplayContent); 1301f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia 1311f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia final Configuration parentConfig = mDisplayContent.getConfiguration(); 1321f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia parentConfig.setAppBounds(parentBounds); 1331f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia 134f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung final Configuration config = new Configuration(); 135f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung stackController.adjustConfigurationForBounds(bounds, null /*insetBounds*/, 136f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung new Rect() /*nonDecorBounds*/, new Rect() /*stableBounds*/, false /*overrideWidth*/, 1371f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia false /*overrideHeight*/, mDisplayInfo.logicalDensityDpi, config, parentConfig); 138f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung // Assert that both expected and actual are null or are equal to each other 1391f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia 1401f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia assertTrue((expectedConfigBounds == null && config.appBounds == null) 1411f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia || expectedConfigBounds.equals(config.appBounds)); 1421f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia } 143f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung} 144f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung