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