Add source activity to values passed to LaunchingBoundsPositioner.

Bug: 64144308
Test: bit FrameworksServicesTests:com.android.server.am.LaunchingBoundsControllerTests
Test: bit FrameworksServicesTests:com.android.server.am.LaunchingTaskPositionerTests
Test: bit FrameworksServicesTests:com.android.server.am.LaunchingActivityPositionerTests
Change-Id: I8a9d2a41e923e972c11db0b79854ff4a6a742d1c
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index f6905c5..1c80282 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_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 @@
         mLaunchBounds.setEmpty();
 
         mSupervisor.getLaunchingBoundsController().calculateBounds(inTask, null /*layout*/, r,
-                options, mLaunchBounds);
+                sourceRecord, options, mLaunchBounds);
 
         mLaunchMode = r.launchMode;
 
@@ -2170,15 +2167,6 @@
         }
     }
 
-    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 5815e98..d5f9cf3 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 @@
 
     @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 8345ba6..c762f7f 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 @@
      * @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 @@
             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 @@
      * @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 @@
          * @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 6389075..c958fca 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 @@
      */
     @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 de831a0..62fa764 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 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 @@
 
         // 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 @@
         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 f24a273..0715174 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 @@
 
 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 @@
     }
 
     /**
+     * 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 @@
         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 @@
         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 @@
         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 @@
 
         @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 30666c0..01e2da6 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 @@
     @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 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 @@
         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 @@
             // 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))