181e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee/*
281e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee * Copyright (C) 2017 The Android Open Source Project
381e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee *
481e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee * Licensed under the Apache License, Version 2.0 (the "License");
581e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee * you may not use this file except in compliance with the License.
681e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee * You may obtain a copy of the License at
781e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee *
881e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee *      http://www.apache.org/licenses/LICENSE-2.0
981e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee *
1081e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee * Unless required by applicable law or agreed to in writing, software
1181e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee * distributed under the License is distributed on an "AS IS" BASIS,
1281e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1381e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee * See the License for the specific language governing permissions and
1481e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee * limitations under the License
1581e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee */
1681e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
1781e30a2966f20aeb150f33a07e89d0883ede755bBryce Leepackage com.android.server.am;
1881e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
1981e30a2966f20aeb150f33a07e89d0883ede755bBryce Leeimport android.content.pm.ActivityInfo.WindowLayout;
2081e30a2966f20aeb150f33a07e89d0883ede755bBryce Leeimport android.graphics.Rect;
2181e30a2966f20aeb150f33a07e89d0883ede755bBryce Leeimport android.platform.test.annotations.Presubmit;
2281e30a2966f20aeb150f33a07e89d0883ede755bBryce Leeimport android.support.test.filters.MediumTest;
2381e30a2966f20aeb150f33a07e89d0883ede755bBryce Leeimport android.support.test.runner.AndroidJUnit4;
2481e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
2581e30a2966f20aeb150f33a07e89d0883ede755bBryce Leeimport android.view.Gravity;
26ec55eb06eb4868ca593c4b16438b3c6121701c1aBryce Lee
2781e30a2966f20aeb150f33a07e89d0883ede755bBryce Leeimport org.junit.runner.RunWith;
2881e30a2966f20aeb150f33a07e89d0883ede755bBryce Leeimport org.junit.Before;
2981e30a2966f20aeb150f33a07e89d0883ede755bBryce Leeimport org.junit.Test;
3081e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
3181e30a2966f20aeb150f33a07e89d0883ede755bBryce Leeimport org.mockito.invocation.InvocationOnMock;
3281e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
3381e30a2966f20aeb150f33a07e89d0883ede755bBryce Leeimport static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
3481e30a2966f20aeb150f33a07e89d0883ede755bBryce Leeimport static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
35dacefc407fdc6a0e158e6eb02b270dbd1a2e2522Bryce Lee
36ec55eb06eb4868ca593c4b16438b3c6121701c1aBryce Leeimport static com.android.server.am.LaunchParamsController.LaunchParamsModifier.RESULT_CONTINUE;
37dacefc407fdc6a0e158e6eb02b270dbd1a2e2522Bryce Lee
3881e30a2966f20aeb150f33a07e89d0883ede755bBryce Leeimport static org.mockito.Mockito.any;
3981e30a2966f20aeb150f33a07e89d0883ede755bBryce Leeimport static org.mockito.Mockito.mock;
4081e30a2966f20aeb150f33a07e89d0883ede755bBryce Leeimport static org.mockito.Mockito.when;
4181e30a2966f20aeb150f33a07e89d0883ede755bBryce Leeimport static org.mockito.Mockito.doAnswer;
4281e30a2966f20aeb150f33a07e89d0883ede755bBryce Leeimport static org.junit.Assert.assertEquals;
4381e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
4481e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
4581e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee/**
46ec55eb06eb4868ca593c4b16438b3c6121701c1aBryce Lee * Tests for exercising resizing task bounds.
4781e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee *
4881e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee * Build/Install/Run:
49ec55eb06eb4868ca593c4b16438b3c6121701c1aBryce Lee *  atest FrameworksServicesTests:TaskLaunchParamsModifierTests
5081e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee */
5181e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee@MediumTest
5281e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee@Presubmit
5381e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee@RunWith(AndroidJUnit4.class)
54ec55eb06eb4868ca593c4b16438b3c6121701c1aBryce Leepublic class TaskLaunchParamsModifierTests extends ActivityTestsBase {
5581e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    private final static int STACK_WIDTH = 100;
5681e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    private final static int STACK_HEIGHT = 200;
5781e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
5881e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    private final static Rect STACK_BOUNDS = new Rect(0, 0, STACK_WIDTH, STACK_HEIGHT);
5981e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
6081e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    private ActivityManagerService mService;
6181e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    private ActivityStack mStack;
6281e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    private TaskRecord mTask;
6381e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
64ec55eb06eb4868ca593c4b16438b3c6121701c1aBryce Lee    private TaskLaunchParamsModifier mPositioner;
65dacefc407fdc6a0e158e6eb02b270dbd1a2e2522Bryce Lee
66ec55eb06eb4868ca593c4b16438b3c6121701c1aBryce Lee    private LaunchParamsController.LaunchParams mCurrent;
67ec55eb06eb4868ca593c4b16438b3c6121701c1aBryce Lee    private LaunchParamsController.LaunchParams mResult;
68dacefc407fdc6a0e158e6eb02b270dbd1a2e2522Bryce Lee
6981e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    @Before
7081e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    @Override
7181e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    public void setUp() throws Exception {
7281e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        super.setUp();
7381e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
7481e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        mService = createActivityManagerService();
7581e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        mStack = mService.mStackSupervisor.getDefaultDisplay().createStack(
7681e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee                WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD, true /* onTop */);
7781e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        mStack.requestResize(STACK_BOUNDS);
7881e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
7981e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        // We must create the task after resizing to make sure it does not inherit the stack
8081e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        // dimensions on resize.
8118d5159de461411b8d16f0d07c2981c0635d09eaBryce Lee        mTask = new TaskBuilder(mService.mStackSupervisor).setStack(mStack).build();
82dacefc407fdc6a0e158e6eb02b270dbd1a2e2522Bryce Lee
83ec55eb06eb4868ca593c4b16438b3c6121701c1aBryce Lee        mPositioner = new TaskLaunchParamsModifier();
84dacefc407fdc6a0e158e6eb02b270dbd1a2e2522Bryce Lee
85ec55eb06eb4868ca593c4b16438b3c6121701c1aBryce Lee        mResult = new LaunchParamsController.LaunchParams();
86ec55eb06eb4868ca593c4b16438b3c6121701c1aBryce Lee        mCurrent = new LaunchParamsController.LaunchParams();
8781e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    }
8881e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
8981e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    /**
9081e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee     * Ensures that the setup bounds are set as expected with the stack bounds set and the task
9181e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee     * bounds still {@code null}.
9281e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee     * @throws Exception
9381e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee     */
9481e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    @Test
9581e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    public void testInitialBounds() throws Exception {
96f3c6a47bdd009de616b6c490bbb52a82d11cc870Bryce Lee        assertEquals(mStack.getOverrideBounds(), STACK_BOUNDS);
97f3c6a47bdd009de616b6c490bbb52a82d11cc870Bryce Lee        assertEquals(mTask.getOverrideBounds(), new Rect());
9881e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    }
9981e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
10081e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    /**
10181e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee     * Ensures that a task positioned with no {@link WindowLayout} receives the default launch
10281e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee     * position.
10381e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee     * @throws Exception
10481e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee     */
10581e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    @Test
10681e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    public void testLaunchNoWindowLayout() throws Exception {
107ec55eb06eb4868ca593c4b16438b3c6121701c1aBryce Lee        assertEquals(RESULT_CONTINUE, mPositioner.onCalculate(mTask, null /*layout*/,
108e4ad7458eee2edde57e9a8ab9f3c26acdcd751f4Bryce Lee                null /*record*/, null /*source*/, null /*options*/, mCurrent, mResult));
109ec55eb06eb4868ca593c4b16438b3c6121701c1aBryce Lee        assertEquals(getDefaultBounds(Gravity.NO_GRAVITY), mResult.mBounds);
11081e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    }
11181e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
11281e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    /**
11381e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee     * Ensures that a task positioned with an empty {@link WindowLayout} receives the default launch
11481e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee     * position.
11581e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee     * @throws Exception
11681e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee     */
11781e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    @Test
11881e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    public void testlaunchEmptyWindowLayout() throws Exception {
119ec55eb06eb4868ca593c4b16438b3c6121701c1aBryce Lee        assertEquals(RESULT_CONTINUE, mPositioner.onCalculate(mTask,
120dacefc407fdc6a0e158e6eb02b270dbd1a2e2522Bryce Lee                new WindowLayout(0, 0, 0, 0, Gravity.NO_GRAVITY, 0, 0), null /*activity*/,
121e4ad7458eee2edde57e9a8ab9f3c26acdcd751f4Bryce Lee                null /*source*/, null /*options*/, mCurrent, mResult));
122ec55eb06eb4868ca593c4b16438b3c6121701c1aBryce Lee        assertEquals(mResult.mBounds, getDefaultBounds(Gravity.NO_GRAVITY));
12381e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    }
12481e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
12581e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    /**
12681e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee     * Ensures that a task positioned with a {@link WindowLayout} gravity specified is positioned
12781e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee     * according to specification.
12881e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee     * @throws Exception
12981e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee     */
13081e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    @Test
13181e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    public void testlaunchWindowLayoutGravity() throws Exception {
13281e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        // Unspecified gravity should be ignored
13381e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        testGravity(Gravity.NO_GRAVITY);
13481e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
13581e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        // Unsupported gravity should be ignored
13681e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        testGravity(Gravity.LEFT);
13781e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        testGravity(Gravity.RIGHT);
13881e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
13981e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        // Test defaults for vertical gravities
14081e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        testGravity(Gravity.TOP);
14181e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        testGravity(Gravity.BOTTOM);
14281e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
14381e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        // Test corners
14481e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        testGravity(Gravity.TOP | Gravity.LEFT);
14581e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        testGravity(Gravity.TOP | Gravity.RIGHT);
14681e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        testGravity(Gravity.BOTTOM | Gravity.LEFT);
14781e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        testGravity(Gravity.BOTTOM | Gravity.RIGHT);
14881e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    }
14981e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
15081e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    private void testGravity(int gravity) {
151dacefc407fdc6a0e158e6eb02b270dbd1a2e2522Bryce Lee        try {
152ec55eb06eb4868ca593c4b16438b3c6121701c1aBryce Lee            assertEquals(RESULT_CONTINUE, mPositioner.onCalculate(mTask,
153dacefc407fdc6a0e158e6eb02b270dbd1a2e2522Bryce Lee                    new WindowLayout(0, 0, 0, 0, gravity, 0, 0), null /*activity*/,
154e4ad7458eee2edde57e9a8ab9f3c26acdcd751f4Bryce Lee                    null /*source*/, null /*options*/, mCurrent, mResult));
155ec55eb06eb4868ca593c4b16438b3c6121701c1aBryce Lee            assertEquals(mResult.mBounds, getDefaultBounds(gravity));
156dacefc407fdc6a0e158e6eb02b270dbd1a2e2522Bryce Lee        } finally {
157ec55eb06eb4868ca593c4b16438b3c6121701c1aBryce Lee            mCurrent.reset();
158ec55eb06eb4868ca593c4b16438b3c6121701c1aBryce Lee            mResult.reset();
159dacefc407fdc6a0e158e6eb02b270dbd1a2e2522Bryce Lee        }
16081e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    }
16181e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
16281e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    /**
16381e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee     * Ensures that a task which causes a conflict with another task when positioned is adjusted as
16481e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee     * expected.
16581e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee     * @throws Exception
16681e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee     */
16781e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    @Test
16881e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    public void testLaunchWindowCenterConflict() throws Exception {
16981e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        testConflict(Gravity.NO_GRAVITY);
17081e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        testConflict(Gravity.TOP);
17181e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        testConflict(Gravity.BOTTOM);
17281e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        testConflict(Gravity.TOP | Gravity.LEFT);
17381e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        testConflict(Gravity.TOP | Gravity.RIGHT);
17481e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        testConflict(Gravity.BOTTOM | Gravity.LEFT);
17581e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        testConflict(Gravity.BOTTOM | Gravity.RIGHT);
17681e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    }
17781e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
17881e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    private void testConflict(int gravity) {
17981e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        final WindowLayout layout = new WindowLayout(0, 0, 0, 0, gravity, 0, 0);
18081e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
18181e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        // layout first task
182ec55eb06eb4868ca593c4b16438b3c6121701c1aBryce Lee        mService.mStackSupervisor.getLaunchParamsController().layoutTask(mTask, layout);
18381e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
18481e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        // Second task will be laid out on top of the first so starting bounds is the same.
185f3c6a47bdd009de616b6c490bbb52a82d11cc870Bryce Lee        final Rect expectedBounds = new Rect(mTask.getOverrideBounds());
18681e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
18781e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        ActivityRecord activity = null;
18881e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        TaskRecord secondTask = null;
18981e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
19081e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        // wrap with try/finally to ensure cleanup of activity/stack.
19181e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        try {
19281e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee            // empty tasks are ignored in conflicts
19318d5159de461411b8d16f0d07c2981c0635d09eaBryce Lee            activity = new ActivityBuilder(mService).setTask(mTask).build();
19481e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
19581e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee            // Create secondary task
19618d5159de461411b8d16f0d07c2981c0635d09eaBryce Lee            secondTask = new TaskBuilder(mService.mStackSupervisor).setStack(mStack).build();
19781e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
19881e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee            // layout second task
199dacefc407fdc6a0e158e6eb02b270dbd1a2e2522Bryce Lee            assertEquals(RESULT_CONTINUE,
200ec55eb06eb4868ca593c4b16438b3c6121701c1aBryce Lee                    mPositioner.onCalculate(secondTask, layout, null /*activity*/,
201e4ad7458eee2edde57e9a8ab9f3c26acdcd751f4Bryce Lee                            null /*source*/, null /*options*/, mCurrent, mResult));
20281e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
20381e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee            if ((gravity & (Gravity.TOP | Gravity.RIGHT)) == (Gravity.TOP | Gravity.RIGHT)
20481e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee                    || (gravity & (Gravity.BOTTOM | Gravity.RIGHT))
20581e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee                    == (Gravity.BOTTOM | Gravity.RIGHT)) {
206ec55eb06eb4868ca593c4b16438b3c6121701c1aBryce Lee                expectedBounds.offset(-TaskLaunchParamsModifier.getHorizontalStep(
207f3c6a47bdd009de616b6c490bbb52a82d11cc870Bryce Lee                        mStack.getOverrideBounds()), 0);
20881e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee            } else if ((gravity & Gravity.TOP) == Gravity.TOP
20981e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee                    || (gravity & Gravity.BOTTOM) == Gravity.BOTTOM) {
210f3c6a47bdd009de616b6c490bbb52a82d11cc870Bryce Lee                expectedBounds.offset(
211ec55eb06eb4868ca593c4b16438b3c6121701c1aBryce Lee                        TaskLaunchParamsModifier.getHorizontalStep(mStack.getOverrideBounds()), 0);
21281e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee            } else {
213f3c6a47bdd009de616b6c490bbb52a82d11cc870Bryce Lee                expectedBounds.offset(
214ec55eb06eb4868ca593c4b16438b3c6121701c1aBryce Lee                        TaskLaunchParamsModifier.getHorizontalStep(mStack.getOverrideBounds()),
215ec55eb06eb4868ca593c4b16438b3c6121701c1aBryce Lee                        TaskLaunchParamsModifier.getVerticalStep(mStack.getOverrideBounds()));
21681e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee            }
21781e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
218ec55eb06eb4868ca593c4b16438b3c6121701c1aBryce Lee            assertEquals(mResult.mBounds, expectedBounds);
21981e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        } finally {
22081e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee            // Remove task and activity to prevent influencing future tests
22181e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee            if (activity != null) {
22281e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee                mTask.removeActivity(activity);
22381e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee            }
22481e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
22581e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee            if (secondTask != null) {
22681e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee                mStack.removeTask(secondTask, "cleanup", ActivityStack.REMOVE_TASK_MODE_DESTROYING);
22781e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee            }
22881e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        }
22981e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    }
23081e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
23181e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    private Rect getDefaultBounds(int gravity) {
23281e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        final Rect bounds = new Rect();
233f3c6a47bdd009de616b6c490bbb52a82d11cc870Bryce Lee        bounds.set(mStack.getOverrideBounds());
23481e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
235f3c6a47bdd009de616b6c490bbb52a82d11cc870Bryce Lee        final int verticalInset =
236ec55eb06eb4868ca593c4b16438b3c6121701c1aBryce Lee                TaskLaunchParamsModifier.getFreeformStartTop(mStack.getOverrideBounds());
237f3c6a47bdd009de616b6c490bbb52a82d11cc870Bryce Lee        final int horizontalInset =
238ec55eb06eb4868ca593c4b16438b3c6121701c1aBryce Lee                TaskLaunchParamsModifier.getFreeformStartLeft(mStack.getOverrideBounds());
23981e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
24081e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        bounds.inset(horizontalInset, verticalInset);
24181e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
24281e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        if ((gravity & (Gravity.TOP | Gravity.RIGHT)) == (Gravity.TOP | Gravity.RIGHT)) {
24381e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee            bounds.offsetTo(horizontalInset * 2, 0);
24481e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        } else if ((gravity & Gravity.TOP) == Gravity.TOP) {
24581e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee            bounds.offsetTo(0, 0);
24681e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        } else if ((gravity & (Gravity.BOTTOM | Gravity.RIGHT))
24781e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee                == (Gravity.BOTTOM | Gravity.RIGHT)) {
24881e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee            bounds.offsetTo(horizontalInset * 2, verticalInset * 2);
24981e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        } else if ((gravity & Gravity.BOTTOM) == Gravity.BOTTOM) {
25081e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee            bounds.offsetTo(0, verticalInset * 2);
25181e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        }
25281e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee
25381e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee        return bounds;
25481e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee    }
25581e30a2966f20aeb150f33a07e89d0883ede755bBryce Lee}
256