From 926aade03600c7fe62ccb115c6f55889cb892457 Mon Sep 17 00:00:00 2001 From: Wale Ogunwale Date: Tue, 29 Aug 2017 11:24:37 -0700 Subject: [PATCH] Introducing split-screen windowing modes. WINDOWING_MODE_SPLIT_SCREEN_PRIMARY is what used to be the docked windowing mode and is used to indicated the primary container dirving the split-screen windowing mode. WINDOWING_MODE_SPLIT_SCREEN_SECONDARY is the windowing mode of any container to the side/adjacent to the primary split-screen container. For example, any container that was in fullscreen mode and that should now be adjacent to the primary split-screen container will. Test: go/wm-smoke Test: WM Unit tests via TreeHugger Change-Id: Idc8560073c613c708cb40ba8449641a6be11d9f1 --- core/java/android/app/ActivityManager.java | 32 ++------ .../java/android/app/WindowConfiguration.java | 31 ++++++-- .../server/am/ActivityMetricsLogger.java | 43 ++++++----- .../com/android/server/am/ActivityStack.java | 3 +- .../server/am/ActivityStackSupervisor.java | 76 +++++++++++-------- .../server/wm/ConfigurationContainer.java | 29 +++++++ .../core/java/com/android/server/wm/Task.java | 4 +- .../java/com/android/server/wm/TaskStack.java | 11 ++- .../server/wm/WindowLayersController.java | 2 +- .../server/wm/TaskStackContainersTests.java | 2 +- .../android/server/wm/WindowTestsBase.java | 2 +- 11 files changed, 143 insertions(+), 92 deletions(-) diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 2d6e99390fd59..a8665037f8d3a 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -20,10 +20,11 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT; import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS; import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; -import static android.app.WindowConfiguration.WINDOWING_MODE_DOCKED; +import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY; 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_SPLIT_SCREEN_SECONDARY; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import android.Manifest; @@ -738,28 +739,6 @@ public class ActivityManager { || stackId == DOCKED_STACK_ID || stackId == PINNED_STACK_ID; } - /** - * Returns true if Stack size is affected by the docked stack changing size. - * @hide - */ - // TODO: Figure-out a way to remove. - public static boolean isResizeableByDockedStack(int stackId) { - return isStaticStack(stackId) && stackId != DOCKED_STACK_ID - && stackId != PINNED_STACK_ID && stackId != ASSISTANT_STACK_ID; - } - - /** - * Returns true if the size of tasks in the input stack are affected by the docked stack - * changing size. - * @hide - */ - // TODO: What is the difference between this method and the one above?? - public static boolean isTaskResizeableByDockedStack(int stackId) { - return isStaticStack(stackId) && stackId != FREEFORM_WORKSPACE_STACK_ID - && stackId != DOCKED_STACK_ID && stackId != PINNED_STACK_ID - && stackId != ASSISTANT_STACK_ID; - } - /** * Returns true if the input stack is affected by drag resizing. * @hide @@ -879,12 +858,15 @@ public class ActivityManager { /** Returns the windowing mode that should be used for this input stack id. * @hide */ // TODO: To be removed once we are not using stack id for stuff... - public static int getWindowingModeForStackId(int stackId) { + public static int getWindowingModeForStackId(int stackId, boolean inSplitScreenMode) { final int windowingMode; switch (stackId) { case FULLSCREEN_WORKSPACE_STACK_ID: case HOME_STACK_ID: case RECENTS_STACK_ID: + windowingMode = inSplitScreenMode + ? WINDOWING_MODE_SPLIT_SCREEN_SECONDARY : WINDOWING_MODE_FULLSCREEN; + break; case ASSISTANT_STACK_ID: windowingMode = WINDOWING_MODE_FULLSCREEN; break; @@ -892,7 +874,7 @@ public class ActivityManager { windowingMode = WINDOWING_MODE_PINNED; break; case DOCKED_STACK_ID: - windowingMode = WINDOWING_MODE_DOCKED; + windowingMode = WINDOWING_MODE_SPLIT_SCREEN_PRIMARY; break; case FREEFORM_WORKSPACE_STACK_ID: windowingMode = WINDOWING_MODE_FREEFORM; diff --git a/core/java/android/app/WindowConfiguration.java b/core/java/android/app/WindowConfiguration.java index b69cd026776b7..515248512255a 100644 --- a/core/java/android/app/WindowConfiguration.java +++ b/core/java/android/app/WindowConfiguration.java @@ -57,19 +57,26 @@ public class WindowConfiguration implements Parcelable, Comparable { onOverrideConfigurationChanged(mTmpConfig); } + /** Returns true if this container is currently in split-screen windowing mode. */ + public boolean inSplitScreenWindowingMode() { + @WindowConfiguration.WindowingMode int windowingMode = + mFullConfiguration.windowConfiguration.getWindowingMode(); + + return windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY + || windowingMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY; + } + + /** Returns true if this container is currently in split-screen secondary windowing mode. */ + public boolean inSplitScreenSecondaryWindowingMode() { + @WindowConfiguration.WindowingMode int windowingMode = + mFullConfiguration.windowConfiguration.getWindowingMode(); + + return windowingMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY; + } + + /** + * Returns true if this container can be put in either + * {@link WindowConfiguration#WINDOWING_MODE_SPLIT_SCREEN_PRIMARY} or + * {@link WindowConfiguration##WINDOWING_MODE_SPLIT_SCREEN_SECONDARY} windowing modes based on + * its current state. + */ + public boolean supportSplitScreenWindowingMode() { + return mFullConfiguration.windowConfiguration.supportSplitScreenWindowingMode(); + } + /** Returns the activity type associated with the the configuration container. */ /*@WindowConfiguration.ActivityType*/ public int getActivityType() { diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index e9f84577cd42b..55b6c912ef90a 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -421,9 +421,9 @@ class Task extends WindowContainer implements DimLayer.DimLayerU /** Return true if the current bound can get outputted to the rest of the system as-is. */ private boolean useCurrentBounds() { - final DisplayContent displayContent = mStack.getDisplayContent(); + final DisplayContent displayContent = getDisplayContent(); return mFillsParent - || !StackId.isTaskResizeableByDockedStack(mStack.mStackId) + || !inSplitScreenSecondaryWindowingMode() || displayContent == null || displayContent.getDockedStackIgnoringVisibility() != null; } diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index 6ec7565ab1565..4664dcbbfa75a 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -289,7 +289,7 @@ public class TaskStack extends WindowContainer implements DimLayer.DimLaye /** Return true if the current bound can get outputted to the rest of the system as-is. */ private boolean useCurrentBounds() { if (mFillsParent - || !StackId.isResizeableByDockedStack(mStackId) + || !inSplitScreenSecondaryWindowingMode() || mDisplayContent == null || mDisplayContent.getDockedStackLocked() != null) { return true; @@ -684,7 +684,7 @@ public class TaskStack extends WindowContainer implements DimLayer.DimLaye Rect bounds = null; final TaskStack dockedStack = dc.getDockedStackIgnoringVisibility(); if (mStackId == DOCKED_STACK_ID - || (dockedStack != null && StackId.isResizeableByDockedStack(mStackId) + || (dockedStack != null && inSplitScreenSecondaryWindowingMode() && !dockedStack.fillsParent())) { // The existence of a docked stack affects the size of other static stack created since // the docked stack occupies a dedicated region on screen, but only if the dock stack is @@ -756,8 +756,7 @@ public class TaskStack extends WindowContainer implements DimLayer.DimLaye return; } - if ((mStackId != DOCKED_STACK_ID && !StackId.isResizeableByDockedStack(mStackId)) - || mDisplayContent == null) { + if (!inSplitScreenWindowingMode() || mDisplayContent == null) { outStackBounds.set(mBounds); return; } @@ -1324,8 +1323,8 @@ public class TaskStack extends WindowContainer implements DimLayer.DimLaye return getDockSide(mBounds); } - int getDockSide(Rect bounds) { - if (mStackId != DOCKED_STACK_ID && !StackId.isResizeableByDockedStack(mStackId)) { + private int getDockSide(Rect bounds) { + if (!inSplitScreenWindowingMode()) { return DOCKED_INVALID; } if (mDisplayContent == null) { diff --git a/services/core/java/com/android/server/wm/WindowLayersController.java b/services/core/java/com/android/server/wm/WindowLayersController.java index 5d1083e2be26e..857b13d2fa402 100644 --- a/services/core/java/com/android/server/wm/WindowLayersController.java +++ b/services/core/java/com/android/server/wm/WindowLayersController.java @@ -101,7 +101,7 @@ class WindowLayersController { mHighestLayerInImeTargetBaseLayer = Math.max(mHighestLayerInImeTargetBaseLayer, w.mWinAnimator.mAnimLayer); } - if (w.getAppToken() != null && StackId.isResizeableByDockedStack(w.getStackId())) { + if (w.getAppToken() != null && w.inSplitScreenSecondaryWindowingMode()) { mHighestDockedAffectedLayer = Math.max(mHighestDockedAffectedLayer, w.mWinAnimator.mAnimLayer); } 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 5f1c0117acad5..29bbe6eca39f6 100644 --- a/services/tests/servicestests/src/com/android/server/wm/TaskStackContainersTests.java +++ b/services/tests/servicestests/src/com/android/server/wm/TaskStackContainersTests.java @@ -54,7 +54,7 @@ public class TaskStackContainersTests extends WindowTestsBase { super.setUp(); final Configuration overrideConfig = new Configuration(); overrideConfig.windowConfiguration.setWindowingMode( - getWindowingModeForStackId(PINNED_STACK_ID)); + getWindowingModeForStackId(PINNED_STACK_ID, false /* inSplitScreenMode */)); mPinnedStack = new StackWindowController(PINNED_STACK_ID, null, mDisplayContent.getDisplayId(), true /* onTop */, new Rect(), sWm).mContainer; mPinnedStack.onOverrideConfigurationChanged(overrideConfig); 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 817f2b4783854..3df13abb23457 100644 --- a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java +++ b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java @@ -240,7 +240,7 @@ class WindowTestsBase { StackWindowController createStackControllerOnStackOnDisplay(int stackId, DisplayContent dc) { final Configuration overrideConfig = new Configuration(); overrideConfig.windowConfiguration.setWindowingMode( - getWindowingModeForStackId(stackId)); + getWindowingModeForStackId(stackId, false /* inSplitScreenMode */)); final StackWindowController controller = new StackWindowController(stackId, null, dc.getDisplayId(), true /* onTop */, new Rect(), sWm); controller.onOverrideConfigurationChanged(overrideConfig);