Generate stack override config in AM vs. WM

First step in allowing activity manager to drive the override
configuration of stacks at creation time vs. using what window manager
returns. Also moves us in the direction where callers outside of AM/WM
will eventually be able to drive the window configuration.

Test: bit FrameworksServicesTests:com.android.server.wm.WindowConfigurationTests
Test: adb shell am instrument -w -e package com.android.server.wm com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
Test: go/wm-smoke
Change-Id: I50bc9e0634779142c173e501d16e7aa1b71f28ce
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index a0132b1..d97554e 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -16,6 +16,12 @@
 
 package android.app;
 
+import static android.app.WindowConfiguration.WINDOWING_MODE_DOCKED;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
+import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
+
 import android.Manifest;
 import android.annotation.IntDef;
 import android.annotation.NonNull;
@@ -852,6 +858,32 @@
                     || stackId == ASSISTANT_STACK_ID
                     || isDynamicStack(stackId);
         }
+
+        /** Returns the windowing mode that should be used for this input stack id. */
+        // TODO: To be removed once we are not using stack id for stuff...
+        public static int getWindowingModeForStackId(int stackId) {
+            final int windowingMode;
+            switch (stackId) {
+                case FULLSCREEN_WORKSPACE_STACK_ID:
+                case HOME_STACK_ID:
+                case RECENTS_STACK_ID:
+                case ASSISTANT_STACK_ID:
+                    windowingMode = WINDOWING_MODE_FULLSCREEN;
+                    break;
+                case PINNED_STACK_ID:
+                    windowingMode = WINDOWING_MODE_PINNED;
+                    break;
+                case DOCKED_STACK_ID:
+                    windowingMode = WINDOWING_MODE_DOCKED;
+                    break;
+                case FREEFORM_WORKSPACE_STACK_ID:
+                    windowingMode = WINDOWING_MODE_FREEFORM;
+                    break;
+                default :
+                    windowingMode = WINDOWING_MODE_UNDEFINED;
+            }
+            return windowingMode;
+        }
     }
 
     /**
diff --git a/core/java/android/app/WindowConfiguration.java b/core/java/android/app/WindowConfiguration.java
index d5d7107..11922ec 100644
--- a/core/java/android/app/WindowConfiguration.java
+++ b/core/java/android/app/WindowConfiguration.java
@@ -24,9 +24,6 @@
 import android.os.Parcelable;
 import android.view.DisplayInfo;
 
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
 /**
  * Class that contains windowing configuration/state for other objects that contain windows directly
  * or indirectly. E.g. Activities, Task, Displays, ...
@@ -65,7 +62,6 @@
             WINDOWING_MODE_DOCKED,
             WINDOWING_MODE_FREEFORM,
     })
-    @Retention(RetentionPolicy.SOURCE)
     public @interface WindowingMode {}
 
     /** Bit that indicates that the {@link #mAppBounds} changed. */
@@ -78,7 +74,6 @@
                     WINDOW_CONFIG_APP_BOUNDS,
                     WINDOW_CONFIG_WINDOWING_MODE,
             })
-    @Retention(RetentionPolicy.SOURCE)
     public @interface WindowConfig {}
 
     public WindowConfiguration() {
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index a9a06d0..64bd667 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -24,6 +24,8 @@
 import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
 import static android.app.ActivityManager.StackId.PINNED_STACK_ID;
 import static android.app.ActivityManager.StackId.RECENTS_STACK_ID;
+import static android.app.ActivityManager.StackId.getWindowingModeForStackId;
+import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
 import static android.content.pm.ActivityInfo.CONFIG_SCREEN_LAYOUT;
 import static android.content.pm.ActivityInfo.FLAG_RESUME_WHILE_PAUSING;
 import static android.content.pm.ActivityInfo.FLAG_SHOW_FOR_ALL_USERS;
@@ -460,24 +462,32 @@
         mTaskPositioner = mStackId == FREEFORM_WORKSPACE_STACK_ID
                 ? new LaunchingTaskPositioner() : null;
         mTmpRect2.setEmpty();
-        final Configuration overrideConfig = getOverrideConfiguration();
+        updateOverrideConfiguration();
         mWindowContainerController = createStackWindowController(display.mDisplayId, onTop,
-                mTmpRect2, overrideConfig);
-        onOverrideConfigurationChanged(overrideConfig);
+                mTmpRect2, getOverrideConfiguration());
         mStackSupervisor.mStacks.put(mStackId, this);
         postAddToDisplay(display, mTmpRect2.isEmpty() ? null : mTmpRect2, onTop);
     }
 
     T createStackWindowController(int displayId, boolean onTop, Rect outBounds,
-            Configuration outOverrideConfig) {
+            Configuration overrideConfig) {
         return (T) new StackWindowController(mStackId, this, displayId, onTop, outBounds,
-                outOverrideConfig);
+                overrideConfig);
     }
 
     T getWindowContainerController() {
         return mWindowContainerController;
     }
 
+    // TODO: Not needed once we are no longer using stack ids as the override config. can be passed
+    // in.
+    private void updateOverrideConfiguration() {
+        final int windowingMode = getWindowingModeForStackId(mStackId);
+        if (windowingMode != WINDOWING_MODE_UNDEFINED) {
+            setWindowingMode(windowingMode);
+        }
+    }
+
     /** Adds the stack to specified display and calls WindowManager to do the same. */
     void reparent(ActivityStackSupervisor.ActivityDisplay activityDisplay, boolean onTop) {
         removeFromDisplay();
diff --git a/services/core/java/com/android/server/am/PinnedActivityStack.java b/services/core/java/com/android/server/am/PinnedActivityStack.java
index c825b314..a1b95f9 100644
--- a/services/core/java/com/android/server/am/PinnedActivityStack.java
+++ b/services/core/java/com/android/server/am/PinnedActivityStack.java
@@ -39,9 +39,9 @@
 
     @Override
     PinnedStackWindowController createStackWindowController(int displayId, boolean onTop,
-            Rect outBounds, Configuration outOverrideConfig) {
+            Rect outBounds, Configuration overrideConfig) {
         return new PinnedStackWindowController(mStackId, this, displayId, onTop, outBounds,
-                outOverrideConfig);
+                overrideConfig);
     }
 
     Rect getDefaultPictureInPictureBounds(float aspectRatio) {
diff --git a/services/core/java/com/android/server/wm/ConfigurationContainer.java b/services/core/java/com/android/server/wm/ConfigurationContainer.java
index 1d3f198..a682a1e 100644
--- a/services/core/java/com/android/server/wm/ConfigurationContainer.java
+++ b/services/core/java/com/android/server/wm/ConfigurationContainer.java
@@ -120,8 +120,7 @@
     }
 
     /** Sets the windowing mode for the configuration container. */
-    void setWindowingMode(/*@WindowConfiguration.WindowingMode TODO: causes build error...why?*/
-            int windowingMode) {
+    public void setWindowingMode(@WindowConfiguration.WindowingMode int windowingMode) {
         mOverrideConfiguration.windowConfiguration.setWindowingMode(windowingMode);
         onOverrideConfigurationChanged(mOverrideConfiguration);
     }
diff --git a/services/core/java/com/android/server/wm/PinnedStackWindowController.java b/services/core/java/com/android/server/wm/PinnedStackWindowController.java
index 3f81b38..135f400 100644
--- a/services/core/java/com/android/server/wm/PinnedStackWindowController.java
+++ b/services/core/java/com/android/server/wm/PinnedStackWindowController.java
@@ -40,8 +40,8 @@
     private Rect mTmpToBounds = new Rect();
 
     public PinnedStackWindowController(int stackId, PinnedStackWindowListener listener,
-            int displayId, boolean onTop, Rect outBounds, Configuration outOverrideConfig) {
-        super(stackId, listener, displayId, onTop, outBounds, outOverrideConfig,
+            int displayId, boolean onTop, Rect outBounds, Configuration overrideConfig) {
+        super(stackId, listener, displayId, onTop, outBounds, overrideConfig,
                 WindowManagerService.getInstance());
     }
 
diff --git a/services/core/java/com/android/server/wm/StackWindowController.java b/services/core/java/com/android/server/wm/StackWindowController.java
index 3f6378a..aaacef5 100644
--- a/services/core/java/com/android/server/wm/StackWindowController.java
+++ b/services/core/java/com/android/server/wm/StackWindowController.java
@@ -58,14 +58,14 @@
     private final Rect mTmpDisplayBounds = new Rect();
 
     public StackWindowController(int stackId, StackWindowListener listener,
-            int displayId, boolean onTop, Rect outBounds, Configuration outOverriderConfig) {
-        this(stackId, listener, displayId, onTop, outBounds, outOverriderConfig,
+            int displayId, boolean onTop, Rect outBounds, Configuration overriderConfig) {
+        this(stackId, listener, displayId, onTop, outBounds, overriderConfig,
                 WindowManagerService.getInstance());
     }
 
     @VisibleForTesting
     public StackWindowController(int stackId, StackWindowListener listener,
-            int displayId, boolean onTop, Rect outBounds, Configuration outOverrideConfig,
+            int displayId, boolean onTop, Rect outBounds, Configuration overrideConfig,
             WindowManagerService service) {
         super(listener, service);
         mStackId = stackId;
@@ -79,9 +79,11 @@
             }
 
             final TaskStack stack = dc.addStackToDisplay(stackId, onTop);
+            if (overrideConfig != null) {
+                stack.onOverrideConfigurationChanged(overrideConfig);
+            }
             stack.setController(this);
             getRawBounds(outBounds);
-            outOverrideConfig.setTo(mContainer.getOverrideConfiguration());
         }
     }
 
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index 8a4a49a..1a6e2c8 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -163,32 +163,6 @@
         mDockedStackMinimizeThickness = service.mContext.getResources().getDimensionPixelSize(
                 com.android.internal.R.dimen.docked_stack_minimize_thickness);
         EventLog.writeEvent(EventLogTags.WM_STACK_CREATED, stackId);
-
-        // TODO: Remove once we are no longer using Stacks for windowing mode or grouping tasks.
-        final int windowingMode;
-        switch (stackId) {
-            case FULLSCREEN_WORKSPACE_STACK_ID:
-            case HOME_STACK_ID:
-            case RECENTS_STACK_ID:
-            case ASSISTANT_STACK_ID:
-                windowingMode = WINDOWING_MODE_FULLSCREEN;
-                break;
-            case PINNED_STACK_ID:
-                windowingMode = WINDOWING_MODE_PINNED;
-                break;
-            case DOCKED_STACK_ID:
-                windowingMode = WINDOWING_MODE_DOCKED;
-                break;
-            case FREEFORM_WORKSPACE_STACK_ID:
-                windowingMode = WINDOWING_MODE_FREEFORM;
-                break;
-            default :
-                windowingMode = WINDOWING_MODE_UNDEFINED;
-        }
-
-        if (windowingMode != WINDOWING_MODE_UNDEFINED) {
-            setWindowingMode(windowingMode);
-        }
     }
 
     DisplayContent getDisplayContent() {
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
index f64de00..55a1c2a 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
@@ -272,7 +272,7 @@
 
         @Override
         protected T createStackWindowController(int displayId, boolean onTop, Rect outBounds,
-                Configuration outOverrideConfig) {
+                Configuration overrideConfig) {
             mContainerController = (T) WindowTestUtils.createMockStackWindowContainerController();
             return mContainerController;
         }
diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskStackContainersTests.java b/services/tests/servicestests/src/com/android/server/wm/TaskStackContainersTests.java
index efe7667..52f66ae 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TaskStackContainersTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TaskStackContainersTests.java
@@ -29,6 +29,7 @@
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 
+import static android.app.ActivityManager.StackId.getWindowingModeForStackId;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -51,9 +52,12 @@
     @Before
     public void setUp() throws Exception {
         super.setUp();
+        final Configuration overrideConfig = new Configuration();
+        overrideConfig.windowConfiguration.setWindowingMode(
+                getWindowingModeForStackId(PINNED_STACK_ID));
         mPinnedStack = new StackWindowController(PINNED_STACK_ID, null,
-                mDisplayContent.getDisplayId(), true /* onTop */, new Rect(), new Configuration(),
-                sWm).mContainer;
+                mDisplayContent.getDisplayId(), true /* onTop */, new Rect(),
+                overrideConfig, sWm).mContainer;
 
         // Stack should contain visible app window to be considered visible.
         final Task pinnedTask = createTaskInStack(mPinnedStack, 0 /* userId */);
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowConfigurationTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowConfigurationTests.java
index bd0e0df..a1ff2d7 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowConfigurationTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowConfigurationTests.java
@@ -197,8 +197,7 @@
                 false /*overrideHeight*/, mDisplayInfo.logicalDensityDpi, config, parentConfig);
         // Assert that both expected and actual are null or are equal to each other
 
-        assertTrue((expectedConfigBounds == null && winConfig.getAppBounds() == null)
-                || expectedConfigBounds.equals(winConfig.getAppBounds()));
+        assertEquals(expectedConfigBounds, winConfig.getAppBounds());
     }
 
 }
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
index eb8cf91..bce740b 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
@@ -16,6 +16,7 @@
 
 package com.android.server.wm;
 
+import static android.app.ActivityManager.StackId.getWindowingModeForStackId;
 import static android.view.Display.DEFAULT_DISPLAY;
 import static android.view.View.VISIBLE;
 
@@ -238,8 +239,10 @@
 
     StackWindowController createStackControllerOnStackOnDisplay(int stackId,
             DisplayContent dc) {
+        final Configuration overrideConfig = new Configuration();
+        overrideConfig.windowConfiguration.setWindowingMode(getWindowingModeForStackId(stackId));
         return new StackWindowController(stackId, null, dc.getDisplayId(),
-                true /* onTop */, new Rect(), new Configuration(), sWm);
+                true /* onTop */, new Rect(), overrideConfig, sWm);
     }
 
     /** Creates a {@link Task} and adds it to the specified {@link TaskStack}. */