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