diff options
4 files changed, 45 insertions, 5 deletions
diff --git a/core/java/android/app/WindowConfiguration.java b/core/java/android/app/WindowConfiguration.java index affc8b9283fb..c40031631a74 100644 --- a/core/java/android/app/WindowConfiguration.java +++ b/core/java/android/app/WindowConfiguration.java @@ -338,6 +338,11 @@ public class WindowConfiguration implements Parcelable, Comparable<WindowConfigu mDisplayWindowingMode = windowingMode; } + /** @hide */ + @WindowingMode + public int getDisplayWindowingMode() { + return mDisplayWindowingMode; + } public void setActivityType(@ActivityType int activityType) { if (mActivityType == activityType) { diff --git a/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java b/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java index 14585c531203..76dd7bef6ea6 100644 --- a/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java +++ b/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java @@ -211,7 +211,9 @@ class TaskLaunchParamsModifier implements LaunchParamsModifier { if (!currentParams.isEmpty() && !hasInitialBounds && (!currentParams.hasPreferredDisplay() || displayId == currentParams.mPreferredDisplayId)) { - if (currentParams.hasWindowingMode()) { + // Only set windowing mode if display is in freeform. If the display is in fullscreen + // mode we should only launch a task in fullscreen mode. + if (currentParams.hasWindowingMode() && display.inFreeformWindowingMode()) { launchMode = currentParams.mWindowingMode; fullyResolvedCurrentParam = launchMode != WINDOWING_MODE_FREEFORM; if (DEBUG) { diff --git a/services/core/java/com/android/server/wm/TaskRecord.java b/services/core/java/com/android/server/wm/TaskRecord.java index 3fd4e83b9494..7c7fdae45a47 100644 --- a/services/core/java/com/android/server/wm/TaskRecord.java +++ b/services/core/java/com/android/server/wm/TaskRecord.java @@ -1908,7 +1908,7 @@ class TaskRecord extends ConfigurationContainer { /** * Saves launching state if necessary so that we can launch the activity to its latest state. * It only saves state if this task has been shown to user and it's in fullscreen or freeform - * mode. + * mode on freeform displays. */ void saveLaunchingStateIfNeeded() { if (!hasBeenVisible) { @@ -1917,8 +1917,15 @@ class TaskRecord extends ConfigurationContainer { } final int windowingMode = getWindowingMode(); - if (windowingMode != WindowConfiguration.WINDOWING_MODE_FULLSCREEN - && windowingMode != WindowConfiguration.WINDOWING_MODE_FREEFORM) { + if (windowingMode != WINDOWING_MODE_FULLSCREEN + && windowingMode != WINDOWING_MODE_FREEFORM) { + return; + } + + // Don't persist state if display isn't in freeform mode. Then the task will be launched + // back to its last state in a freeform display when it's launched in a freeform display + // next time. + if (getWindowConfiguration().getDisplayWindowingMode() != WINDOWING_MODE_FREEFORM) { return; } diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java index f918149e6781..24ff07d4bffe 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java @@ -346,6 +346,19 @@ public class TaskLaunchParamsModifierTests extends ActivityTestsBase { } @Test + public void testLaunchesFullscreenOnFullscreenDisplayWithFreeformHistory() { + mCurrent.mPreferredDisplayId = Display.INVALID_DISPLAY; + mCurrent.mWindowingMode = WINDOWING_MODE_FREEFORM; + mCurrent.mBounds.set(0, 0, 200, 100); + + assertEquals(RESULT_CONTINUE, mTarget.onCalculate(/* task */ null, /* layout */ null, + mActivity, /* source */ null, /* options */ null, mCurrent, mResult)); + + assertEquivalentWindowingMode(WINDOWING_MODE_FULLSCREEN, mResult.mWindowingMode, + WINDOWING_MODE_FULLSCREEN); + } + + @Test public void testRespectsFullyResolvedCurrentParam_Fullscreen() { final TestActivityDisplay freeformDisplay = createNewActivityDisplay( WINDOWING_MODE_FREEFORM); @@ -1174,6 +1187,19 @@ public class TaskLaunchParamsModifierTests extends ActivityTestsBase { } @Test + public void returnsNonFullscreenBoundsOnFullscreenDisplayWithFreeformHistory() { + mCurrent.mPreferredDisplayId = Display.INVALID_DISPLAY; + mCurrent.mWindowingMode = WINDOWING_MODE_FREEFORM; + mCurrent.mBounds.set(0, 0, 200, 100); + + assertEquals(RESULT_CONTINUE, mTarget.onCalculate(/* task */ null, /* layout */ null, + mActivity, /* source */ null, /* options */ null, mCurrent, mResult)); + + // Returned bounds with in fullscreen mode will be set to last non-fullscreen bounds. + assertEquals(new Rect(0, 0, 200, 100), mCurrent.mBounds); + } + + @Test public void testAdjustsBoundsToFitInDisplayFullyResolvedBounds() { final TestActivityDisplay freeformDisplay = createNewActivityDisplay( WINDOWING_MODE_FREEFORM); @@ -1186,7 +1212,7 @@ public class TaskLaunchParamsModifierTests extends ActivityTestsBase { options.setLaunchDisplayId(freeformDisplay.mDisplayId); assertEquals(RESULT_CONTINUE, mTarget.onCalculate(/* task */ null, /* layout */ null, - mActivity, /* source */ null, /* options */ null, mCurrent, mResult)); + mActivity, /* source */ null, options, mCurrent, mResult)); assertEquals(new Rect(0, 0, 300, 300), mResult.mBounds); } |