Fix win mode issues for unresizable apps
Some unresizable apps are launched in freeform in freeform display, but the override windowing mode of this task needs to be left UNDEFINED. Otherwise, the task would remain freeform even when the display transitions from freeform to fullscreen. On the other hand, fullscreen unresizable apps need to remain fullscreen regardless of the windowing mode of the display. Also, with this CL, the same unresizable policies are applied in fullscreen display too as the display could be freeform later anyway. Bug: 185427982 Test: atest WmTests:TaskLaunchParamsModifierTests Change-Id: I7279be115d88731566c19be691ff562d5885a3af
This commit is contained in:
@@ -277,29 +277,31 @@ class TaskLaunchParamsModifier implements LaunchParamsModifier {
|
||||
// is set with the suggestedDisplayArea. If it is set, but the eventual TaskDisplayArea is
|
||||
// different, we should recalcuating the bounds.
|
||||
boolean hasInitialBoundsForSuggestedDisplayAreaInFreeformMode = false;
|
||||
if (suggestedDisplayArea.inFreeformWindowingMode()) {
|
||||
if (launchMode == WINDOWING_MODE_PINNED) {
|
||||
if (DEBUG) appendLog("picture-in-picture");
|
||||
} else if (!root.isResizeable()) {
|
||||
if (shouldLaunchUnresizableAppInFreeform(root, suggestedDisplayArea, options)) {
|
||||
launchMode = WINDOWING_MODE_FREEFORM;
|
||||
if (outParams.mBounds.isEmpty()) {
|
||||
getTaskBounds(root, suggestedDisplayArea, layout, launchMode,
|
||||
hasInitialBounds, outParams.mBounds);
|
||||
hasInitialBoundsForSuggestedDisplayAreaInFreeformMode = true;
|
||||
}
|
||||
if (DEBUG) appendLog("unresizable-freeform");
|
||||
} else {
|
||||
launchMode = WINDOWING_MODE_FULLSCREEN;
|
||||
outParams.mBounds.setEmpty();
|
||||
if (DEBUG) appendLog("unresizable-forced-maximize");
|
||||
// shouldSetAsOverrideWindowingMode is set if the task needs to retain the launchMode
|
||||
// regardless of the windowing mode of the parent.
|
||||
boolean shouldSetAsOverrideWindowingMode = false;
|
||||
if (launchMode == WINDOWING_MODE_PINNED) {
|
||||
if (DEBUG) appendLog("picture-in-picture");
|
||||
} else if (!root.isResizeable()) {
|
||||
if (shouldLaunchUnresizableAppInFreeformInFreeformMode(root, suggestedDisplayArea,
|
||||
options)) {
|
||||
launchMode = WINDOWING_MODE_UNDEFINED;
|
||||
if (outParams.mBounds.isEmpty()) {
|
||||
getTaskBounds(root, suggestedDisplayArea, layout, launchMode, hasInitialBounds,
|
||||
outParams.mBounds);
|
||||
hasInitialBoundsForSuggestedDisplayAreaInFreeformMode = true;
|
||||
}
|
||||
if (DEBUG) appendLog("unresizable-freeform");
|
||||
} else {
|
||||
launchMode = WINDOWING_MODE_FULLSCREEN;
|
||||
outParams.mBounds.setEmpty();
|
||||
shouldSetAsOverrideWindowingMode = true;
|
||||
if (DEBUG) appendLog("unresizable-forced-maximize");
|
||||
}
|
||||
} else {
|
||||
if (DEBUG) appendLog("non-freeform-task-display-area");
|
||||
}
|
||||
// If launch mode matches display windowing mode, let it inherit from display.
|
||||
outParams.mWindowingMode = launchMode == suggestedDisplayArea.getWindowingMode()
|
||||
&& !shouldSetAsOverrideWindowingMode
|
||||
? WINDOWING_MODE_UNDEFINED : launchMode;
|
||||
|
||||
if (phase == PHASE_WINDOWING_MODE) {
|
||||
@@ -650,7 +652,7 @@ class TaskLaunchParamsModifier implements LaunchParamsModifier {
|
||||
inOutBounds.offset(xOffset, yOffset);
|
||||
}
|
||||
|
||||
private boolean shouldLaunchUnresizableAppInFreeform(ActivityRecord activity,
|
||||
private boolean shouldLaunchUnresizableAppInFreeformInFreeformMode(ActivityRecord activity,
|
||||
TaskDisplayArea displayArea, @Nullable ActivityOptions options) {
|
||||
if (options != null && options.getLaunchWindowingMode() == WINDOWING_MODE_FULLSCREEN) {
|
||||
// Do not launch the activity in freeform if it explicitly requested fullscreen mode.
|
||||
@@ -663,8 +665,7 @@ class TaskLaunchParamsModifier implements LaunchParamsModifier {
|
||||
final int displayOrientation = orientationFromBounds(displayArea.getBounds());
|
||||
final int activityOrientation = resolveOrientation(activity, displayArea,
|
||||
displayArea.getBounds());
|
||||
if (displayArea.getWindowingMode() == WINDOWING_MODE_FREEFORM
|
||||
&& displayOrientation != activityOrientation) {
|
||||
if (displayOrientation != activityOrientation) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -825,10 +825,11 @@ public class TaskLaunchParamsModifierTests extends WindowTestsBase {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLaunchesPortraitUnresizableOnFreeformDisplayWithFreeformSizeCompat() {
|
||||
public void testLaunchesPortraitUnresizableOnFreeformLandscapeDisplay() {
|
||||
mAtm.mDevEnableNonResizableMultiWindow = true;
|
||||
final TestDisplayContent freeformDisplay = createNewDisplayContent(
|
||||
WINDOWING_MODE_FREEFORM);
|
||||
assertTrue(freeformDisplay.getBounds().width() > freeformDisplay.getBounds().height());
|
||||
final ActivityOptions options = ActivityOptions.makeBasic();
|
||||
mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
|
||||
mActivity.info.resizeMode = RESIZE_MODE_UNRESIZEABLE;
|
||||
@@ -836,12 +837,42 @@ public class TaskLaunchParamsModifierTests extends WindowTestsBase {
|
||||
assertEquals(RESULT_CONTINUE,
|
||||
new CalculateRequestBuilder().setOptions(options).calculate());
|
||||
|
||||
assertEquivalentWindowingMode(WINDOWING_MODE_FREEFORM, mResult.mWindowingMode,
|
||||
WINDOWING_MODE_FREEFORM);
|
||||
assertEquals(WINDOWING_MODE_UNDEFINED, mResult.mWindowingMode);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSkipsForceMaximizingAppsOnNonFreeformDisplay() {
|
||||
public void testLaunchesLandscapeUnresizableOnFreeformLandscapeDisplay() {
|
||||
mAtm.mDevEnableNonResizableMultiWindow = true;
|
||||
final TestDisplayContent freeformDisplay = createNewDisplayContent(
|
||||
WINDOWING_MODE_FREEFORM);
|
||||
assertTrue(freeformDisplay.getBounds().width() > freeformDisplay.getBounds().height());
|
||||
final ActivityOptions options = ActivityOptions.makeBasic();
|
||||
mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
|
||||
mActivity.info.resizeMode = RESIZE_MODE_UNRESIZEABLE;
|
||||
mActivity.info.screenOrientation = SCREEN_ORIENTATION_LANDSCAPE;
|
||||
assertEquals(RESULT_CONTINUE,
|
||||
new CalculateRequestBuilder().setOptions(options).calculate());
|
||||
|
||||
assertEquals(WINDOWING_MODE_FULLSCREEN, mResult.mWindowingMode);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLaunchesUndefinedUnresizableOnFreeformLandscapeDisplay() {
|
||||
mAtm.mDevEnableNonResizableMultiWindow = true;
|
||||
final TestDisplayContent freeformDisplay = createNewDisplayContent(
|
||||
WINDOWING_MODE_FREEFORM);
|
||||
assertTrue(freeformDisplay.getBounds().width() > freeformDisplay.getBounds().height());
|
||||
final ActivityOptions options = ActivityOptions.makeBasic();
|
||||
mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea();
|
||||
mActivity.info.resizeMode = RESIZE_MODE_UNRESIZEABLE;
|
||||
assertEquals(RESULT_CONTINUE,
|
||||
new CalculateRequestBuilder().setOptions(options).calculate());
|
||||
|
||||
assertEquals(WINDOWING_MODE_FULLSCREEN, mResult.mWindowingMode);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testForceMaximizingAppsOnNonFreeformDisplay() {
|
||||
final ActivityOptions options = ActivityOptions.makeBasic();
|
||||
options.setLaunchWindowingMode(WINDOWING_MODE_FREEFORM);
|
||||
options.setLaunchBounds(new Rect(0, 0, 200, 100));
|
||||
@@ -855,8 +886,9 @@ public class TaskLaunchParamsModifierTests extends WindowTestsBase {
|
||||
assertEquals(RESULT_CONTINUE,
|
||||
new CalculateRequestBuilder().setOptions(options).calculate());
|
||||
|
||||
assertEquivalentWindowingMode(WINDOWING_MODE_FREEFORM, mResult.mWindowingMode,
|
||||
WINDOWING_MODE_FULLSCREEN);
|
||||
// Non-resizable apps must be launched in fullscreen in a fullscreen display regardless of
|
||||
// other properties.
|
||||
assertEquals(WINDOWING_MODE_FULLSCREEN, mResult.mWindowingMode);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user