diff options
7 files changed, 62 insertions, 48 deletions
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index f6905c58d928..1c8028270f97 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -26,9 +26,6 @@ import static android.app.ActivityManager.START_RETURN_INTENT_TO_CALLER; import static android.app.ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION; import static android.app.ActivityManager.START_SUCCESS; import static android.app.ActivityManager.START_TASK_TO_FRONT; -import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT; -import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; -import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY; @@ -1249,7 +1246,7 @@ class ActivityStarter { mLaunchBounds.setEmpty(); mSupervisor.getLaunchingBoundsController().calculateBounds(inTask, null /*layout*/, r, - options, mLaunchBounds); + sourceRecord, options, mLaunchBounds); mLaunchMode = r.launchMode; @@ -2170,15 +2167,6 @@ class ActivityStarter { } } - private Rect getOverrideBounds(ActivityRecord r, ActivityOptions options, TaskRecord inTask) { - Rect newBounds = null; - if (mSupervisor.canUseActivityOptionsLaunchBounds(options) - && (r.isResizeable() || (inTask != null && inTask.isResizeable()))) { - newBounds = TaskRecord.validateBounds(options.getLaunchBounds()); - } - return newBounds; - } - private boolean isLaunchModeOneOf(int mode1, int mode2) { return mode1 == mLaunchMode || mode2 == mLaunchMode; } diff --git a/services/core/java/com/android/server/am/LaunchingActivityPositioner.java b/services/core/java/com/android/server/am/LaunchingActivityPositioner.java index 5815e9809756..d5f9cf3ad4d5 100644 --- a/services/core/java/com/android/server/am/LaunchingActivityPositioner.java +++ b/services/core/java/com/android/server/am/LaunchingActivityPositioner.java @@ -34,7 +34,8 @@ public class LaunchingActivityPositioner implements LaunchingBoundsPositioner { @Override public int onCalculateBounds(TaskRecord task, ActivityInfo.WindowLayout layout, - ActivityRecord activity, ActivityOptions options, Rect current, Rect result) { + ActivityRecord activity, ActivityRecord source, + ActivityOptions options, Rect current, Rect result) { // We only care about figuring out bounds for activities. if (activity == null) { return RESULT_SKIP; diff --git a/services/core/java/com/android/server/am/LaunchingBoundsController.java b/services/core/java/com/android/server/am/LaunchingBoundsController.java index 8345ba657c2d..c762f7f4a507 100644 --- a/services/core/java/com/android/server/am/LaunchingBoundsController.java +++ b/services/core/java/com/android/server/am/LaunchingBoundsController.java @@ -62,12 +62,13 @@ class LaunchingBoundsController { * @param task The {@link TaskRecord} currently being positioned. * @param layout The specified {@link WindowLayout}. * @param activity The {@link ActivityRecord} currently being positioned. + * @param source The {@link ActivityRecord} from which activity was started from. * @param options The {@link ActivityOptions} specified for the activity. * @param result The resulting bounds. If no bounds are set, {@link Rect#isEmpty()} will be - * true. + * {@code true}. */ void calculateBounds(TaskRecord task, WindowLayout layout, ActivityRecord activity, - ActivityOptions options, Rect result) { + ActivityRecord source, ActivityOptions options, Rect result) { result.setEmpty(); // We start at the last registered {@link LaunchingBoundsPositioner} as this represents @@ -78,8 +79,8 @@ class LaunchingBoundsController { mTmpCurrent.set(result); final LaunchingBoundsPositioner positioner = mPositioners.get(i); - switch(positioner.onCalculateBounds(task, layout, activity, options, mTmpCurrent, - mTmpResult)) { + switch(positioner.onCalculateBounds(task, layout, activity, source, options, + mTmpCurrent, mTmpResult)) { case RESULT_SKIP: // Do not apply any results when we are told to skip continue; @@ -100,7 +101,8 @@ class LaunchingBoundsController { * @return {@code true} if bounds were set on the task. {@code false} otherwise. */ boolean layoutTask(TaskRecord task, WindowLayout layout) { - calculateBounds(task, layout, null /*activity*/, null /*options*/, mTmpRect); + calculateBounds(task, layout, null /*activity*/, null /*source*/, null /*options*/, + mTmpRect); if (mTmpRect.isEmpty()) { return false; @@ -145,16 +147,17 @@ class LaunchingBoundsController { * @param task The {@link TaskRecord} currently being positioned. * @param layout The specified {@link WindowLayout}. * @param activity The {@link ActivityRecord} currently being positioned. + * @param source The {@link ActivityRecord} activity was started from. * @param options The {@link ActivityOptions} specified for the activity. * @param current The current bounds. This can differ from the initial bounds as it * represents the modified bounds up to this point. * @param result The {@link Rect} which the positioner should return its modified bounds. * Any merging of the current bounds should be already applied to this * value as well before returning. - * @return A {@link Result} representing the result of the bounds calculation. + * @return A {@link Result} representing the result of the bounds calculation. */ @Result int onCalculateBounds(TaskRecord task, WindowLayout layout, ActivityRecord activity, - ActivityOptions options, Rect current, Rect result); + ActivityRecord source, ActivityOptions options, Rect current, Rect result); } } diff --git a/services/core/java/com/android/server/am/LaunchingTaskPositioner.java b/services/core/java/com/android/server/am/LaunchingTaskPositioner.java index 6389075a9b3f..c958fcac6938 100644 --- a/services/core/java/com/android/server/am/LaunchingTaskPositioner.java +++ b/services/core/java/com/android/server/am/LaunchingTaskPositioner.java @@ -79,7 +79,8 @@ class LaunchingTaskPositioner implements LaunchingBoundsController.LaunchingBoun */ @Override public int onCalculateBounds(TaskRecord task, ActivityInfo.WindowLayout layout, - ActivityRecord activity, ActivityOptions options, Rect current, Rect result) { + ActivityRecord activity, ActivityRecord source, + ActivityOptions options, Rect current, Rect result) { // We can only apply positioning if we're in a freeform stack. if (task == null || task.getStack() == null || !task.inFreeformWindowingMode()) { return RESULT_SKIP; diff --git a/services/tests/servicestests/src/com/android/server/am/LaunchingActivityPositionerTests.java b/services/tests/servicestests/src/com/android/server/am/LaunchingActivityPositionerTests.java index de831a09c2ae..62fa764550d8 100644 --- a/services/tests/servicestests/src/com/android/server/am/LaunchingActivityPositionerTests.java +++ b/services/tests/servicestests/src/com/android/server/am/LaunchingActivityPositionerTests.java @@ -79,35 +79,35 @@ public class LaunchingActivityPositionerTests extends ActivityTestsBase { public void testSkippedInvocations() throws Exception { // No specified activity should be ignored assertEquals(RESULT_SKIP, mPositioner.onCalculateBounds(null /*task*/, null /*layout*/, - null /*activity*/, null /*options*/, mCurrent, mResult)); + null /*activity*/, null /*source*/, null /*options*/, mCurrent, mResult)); // No specified activity options should be ignored assertEquals(RESULT_SKIP, mPositioner.onCalculateBounds(null /*task*/, null /*layout*/, - mActivity, null /*options*/, mCurrent, mResult)); + mActivity, null /*source*/, null /*options*/, mCurrent, mResult)); // launch bounds specified should be ignored. final ActivityOptions options = ActivityOptions.makeBasic(); assertEquals(RESULT_SKIP, mPositioner.onCalculateBounds(null /*task*/, null /*layout*/, - mActivity, options /*options*/, mCurrent, mResult)); + mActivity, null /*source*/, options /*options*/, mCurrent, mResult)); // Non-resizeable records should be ignored mActivity.info.resizeMode = ActivityInfo.RESIZE_MODE_UNRESIZEABLE; assertFalse(mActivity.isResizeable()); assertEquals(RESULT_SKIP, mPositioner.onCalculateBounds(null /*task*/, null /*layout*/, - mActivity, options /*options*/, mCurrent, mResult)); + mActivity, null /*source*/, options /*options*/, mCurrent, mResult)); // make record resizeable mActivity.info.resizeMode = ActivityInfo.RESIZE_MODE_RESIZEABLE; assertTrue(mActivity.isResizeable()); assertEquals(RESULT_SKIP, mPositioner.onCalculateBounds(null /*task*/, null /*layout*/, - mActivity, options /*options*/, mCurrent, mResult)); + mActivity, null /*source*/, options /*options*/, mCurrent, mResult)); // Does not support freeform mService.mSupportsFreeformWindowManagement = false; assertFalse(mService.mStackSupervisor.canUseActivityOptionsLaunchBounds(options)); assertEquals(RESULT_SKIP, mPositioner.onCalculateBounds(null /*task*/, null /*layout*/, - mActivity, options /*options*/, mCurrent, mResult)); + mActivity, null /*source*/, options /*options*/, mCurrent, mResult)); mService.mSupportsFreeformWindowManagement = true; options.setLaunchBounds(new Rect()); @@ -115,15 +115,15 @@ public class LaunchingActivityPositionerTests extends ActivityTestsBase { // Invalid bounds assertEquals(RESULT_SKIP, mPositioner.onCalculateBounds(null /*task*/, null /*layout*/, - mActivity, options /*options*/, mCurrent, mResult)); + mActivity, null /*source*/, options /*options*/, mCurrent, mResult)); options.setLaunchBounds(new Rect(0, 0, -1, -1)); assertEquals(RESULT_SKIP, mPositioner.onCalculateBounds(null /*task*/, null /*layout*/, - mActivity, options /*options*/, mCurrent, mResult)); + mActivity, null /*source*/, options /*options*/, mCurrent, mResult)); // Valid bounds should cause the positioner to be applied. options.setLaunchBounds(new Rect(0, 0, 100, 100)); assertEquals(RESULT_DONE, mPositioner.onCalculateBounds(null /*task*/, null /*layout*/, - mActivity, options /*options*/, mCurrent, mResult)); + mActivity, null /*source*/, options /*options*/, mCurrent, mResult)); } @Test @@ -137,7 +137,7 @@ public class LaunchingActivityPositionerTests extends ActivityTestsBase { options.setLaunchBounds(proposedBounds); assertEquals(RESULT_DONE, mPositioner.onCalculateBounds(null /*task*/, null /*layout*/, - mActivity, options /*options*/, mCurrent, mResult)); + mActivity, null /*source*/, options /*options*/, mCurrent, mResult)); assertEquals(mResult, proposedBounds); } } diff --git a/services/tests/servicestests/src/com/android/server/am/LaunchingBoundsControllerTests.java b/services/tests/servicestests/src/com/android/server/am/LaunchingBoundsControllerTests.java index f24a273d66d1..0715174512b5 100644 --- a/services/tests/servicestests/src/com/android/server/am/LaunchingBoundsControllerTests.java +++ b/services/tests/servicestests/src/com/android/server/am/LaunchingBoundsControllerTests.java @@ -18,6 +18,7 @@ package com.android.server.am; import android.app.ActivityOptions; import android.content.pm.ActivityInfo; +import android.content.pm.ActivityInfo.WindowLayout; import android.graphics.Rect; import android.platform.test.annotations.Presubmit; import android.support.test.filters.MediumTest; @@ -63,21 +64,40 @@ public class LaunchingBoundsControllerTests extends ActivityTestsBase { } /** + * Makes sure positioners get values passed to controller. + */ + @Test + public void testArgumentPropagation() { + final ActivityManagerService service = createActivityManagerService(); + final LaunchingBoundsPositioner positioner = mock(LaunchingBoundsPositioner.class); + mController.registerPositioner(positioner); + + final ActivityRecord record = new ActivityBuilder(service).build(); + final ActivityRecord source = new ActivityBuilder(service).build(); + final WindowLayout layout = new WindowLayout(0, 0, 0, 0, 0, 0, 0); + final ActivityOptions options = mock(ActivityOptions.class); + + mController.calculateBounds(record.getTask(), layout, record, source, options, new Rect()); + verify(positioner, times(1)).onCalculateBounds(eq(record.getTask()), eq(layout), eq(record), + eq(source), eq(options), any(), any()); + } + + /** * Ensures positioners further down the chain are not called when RESULT_DONE is returned. */ @Test public void testEarlyExit() { final LaunchingBoundsPositioner ignoredPositioner = mock(LaunchingBoundsPositioner.class); final LaunchingBoundsPositioner earlyExitPositioner = - (task, layout, activity, options, current, result) -> RESULT_DONE; + (task, layout, activity, source, options, current, result) -> RESULT_DONE; mController.registerPositioner(ignoredPositioner); mController.registerPositioner(earlyExitPositioner); mController.calculateBounds(null /*task*/, null /*layout*/, null /*activity*/, - null /*options*/, new Rect()); + null /*source*/, null /*options*/, new Rect()); verify(ignoredPositioner, never()).onCalculateBounds(any(), any(), any(), any(), any(), - any()); + any(), any()); } /** @@ -93,20 +113,20 @@ public class LaunchingBoundsControllerTests extends ActivityTestsBase { mController.registerPositioner(firstPositioner); mController.calculateBounds(null /*task*/, null /*layout*/, null /*activity*/, - null /*options*/, new Rect()); + null /*source*/, null /*options*/, new Rect()); verify(firstPositioner, times(1)).onCalculateBounds(any(), any(), any(), any(), any(), - any()); + any(), any()); final LaunchingBoundsPositioner secondPositioner = spy(earlyExitPositioner); mController.registerPositioner(secondPositioner); mController.calculateBounds(null /*task*/, null /*layout*/, null /*activity*/, - null /*options*/, new Rect()); + null /*source*/, null /*options*/, new Rect()); verify(firstPositioner, times(1)).onCalculateBounds(any(), any(), any(), any(), any(), - any()); + any(), any()); verify(secondPositioner, times(1)).onCalculateBounds(any(), any(), any(), any(), any(), - any()); + any(), any()); } /** @@ -122,9 +142,9 @@ public class LaunchingBoundsControllerTests extends ActivityTestsBase { mController.registerPositioner(positioner2); mController.calculateBounds(null /*task*/, null /*layout*/, null /*activity*/, - null /*options*/, new Rect()); + null /*source*/, null /*options*/, new Rect()); - verify(positioner1, times(1)).onCalculateBounds(any(), any(), any(), any(), + verify(positioner1, times(1)).onCalculateBounds(any(), any(), any(), any(), any(), eq(positioner2.getLaunchBounds()), any()); } @@ -146,7 +166,7 @@ public class LaunchingBoundsControllerTests extends ActivityTestsBase { final Rect resultBounds = new Rect(); mController.calculateBounds(null /*task*/, null /*layout*/, null /*activity*/, - null /*options*/, resultBounds); + null /*source*/, null /*options*/, resultBounds); assertEquals(resultBounds, positioner2.getLaunchBounds()); } @@ -161,7 +181,8 @@ public class LaunchingBoundsControllerTests extends ActivityTestsBase { @Override public int onCalculateBounds(TaskRecord task, ActivityInfo.WindowLayout layout, - ActivityRecord activity, ActivityOptions options, Rect current, Rect result) { + ActivityRecord activity, ActivityRecord source, + ActivityOptions options, Rect current, Rect result) { result.set(mBounds); return mReturnVal; } diff --git a/services/tests/servicestests/src/com/android/server/am/LaunchingTaskPositionerTests.java b/services/tests/servicestests/src/com/android/server/am/LaunchingTaskPositionerTests.java index 30666c0455f8..01e2da61f0d4 100644 --- a/services/tests/servicestests/src/com/android/server/am/LaunchingTaskPositionerTests.java +++ b/services/tests/servicestests/src/com/android/server/am/LaunchingTaskPositionerTests.java @@ -105,7 +105,7 @@ public class LaunchingTaskPositionerTests extends ActivityTestsBase { @Test public void testLaunchNoWindowLayout() throws Exception { assertEquals(RESULT_CONTINUE, mPositioner.onCalculateBounds(mTask, null /*layout*/, - null /*record*/, null /*options*/, mCurrent, mResult)); + null /*record*/, null /*source*/, null /*options*/, mCurrent, mResult)); assertEquals(getDefaultBounds(Gravity.NO_GRAVITY), mResult); } @@ -118,7 +118,7 @@ public class LaunchingTaskPositionerTests extends ActivityTestsBase { public void testlaunchEmptyWindowLayout() throws Exception { assertEquals(RESULT_CONTINUE, mPositioner.onCalculateBounds(mTask, new WindowLayout(0, 0, 0, 0, Gravity.NO_GRAVITY, 0, 0), null /*activity*/, - null /*options*/, mCurrent, mResult)); + null /*source*/, null /*options*/, mCurrent, mResult)); assertEquals(mResult, getDefaultBounds(Gravity.NO_GRAVITY)); } @@ -151,7 +151,7 @@ public class LaunchingTaskPositionerTests extends ActivityTestsBase { try { assertEquals(RESULT_CONTINUE, mPositioner.onCalculateBounds(mTask, new WindowLayout(0, 0, 0, 0, gravity, 0, 0), null /*activity*/, - null /*options*/, mCurrent, mResult)); + null /*source*/, null /*options*/, mCurrent, mResult)); assertEquals(mResult, getDefaultBounds(gravity)); } finally { mCurrent.setEmpty(); @@ -198,7 +198,7 @@ public class LaunchingTaskPositionerTests extends ActivityTestsBase { // layout second task assertEquals(RESULT_CONTINUE, mPositioner.onCalculateBounds(secondTask, layout, null /*activity*/, - null /*options*/, mCurrent, mResult)); + null /*source*/, null /*options*/, mCurrent, mResult)); if ((gravity & (Gravity.TOP | Gravity.RIGHT)) == (Gravity.TOP | Gravity.RIGHT) || (gravity & (Gravity.BOTTOM | Gravity.RIGHT)) |