diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/ActivityRecord.java | 13 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java | 45 |
2 files changed, 48 insertions, 10 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 3969a5f8d50c..d4df2f258a04 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -7013,7 +7013,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // TODO(b/181207944): Consider removing the if condition and always run // resolveFixedOrientationConfiguration() since this should be applied for all cases. if (isFixedOrientationLetterboxAllowed) { - resolveFixedOrientationConfiguration(newParentConfiguration); + resolveFixedOrientationConfiguration(newParentConfiguration, parentWindowingMode); } if (mCompatDisplayInsets != null) { @@ -7160,16 +7160,21 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A * change and the requested orientation is different from the parent. * * <p>If letterboxed due to fixed orientation then aspect ratio restrictions are also applied - * in this methiod. + * in this method. */ - private void resolveFixedOrientationConfiguration(@NonNull Configuration newParentConfig) { + private void resolveFixedOrientationConfiguration(@NonNull Configuration newParentConfig, + int windowingMode) { mLetterboxBoundsForFixedOrientationAndAspectRatio = null; if (handlesOrientationChangeFromDescendant()) { // No need to letterbox because of fixed orientation. Display will handle // fixed-orientation requests. return; } - if (newParentConfig.windowConfiguration.getWindowingMode() == WINDOWING_MODE_PINNED) { + if (WindowConfiguration.inMultiWindowMode(windowingMode) && isResizeable()) { + // Ignore orientation request for resizable apps in multi window. + return; + } + if (windowingMode == WINDOWING_MODE_PINNED) { // PiP bounds have higher priority than the requested orientation. Otherwise the // activity may be squeezed into a small piece. return; diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index aed3f52bd563..821683043804 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -26,6 +26,7 @@ import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_ALWAYS; import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_DEFAULT; import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_IF_ALLOWLISTED; import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_NEVER; +import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_BEHIND; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; @@ -546,7 +547,7 @@ public class ActivityRecordTests extends WindowTestsBase { } @Test - public void ignoreRequestedOrientationInSplitWindows() { + public void ignoreRequestedOrientationForResizableInSplitWindows() { final ActivityRecord activity = createActivityWith2LevelTask(); final Task task = activity.getTask(); final Task rootTask = activity.getRootTask(); @@ -578,13 +579,45 @@ public class ActivityRecordTests extends WindowTestsBase { } task.setBounds(bounds); + final int activityCurOrientation = activity.getConfiguration().orientation; + // Requests orientation that's different from its bounds. - activity.setRequestedOrientation( - isScreenPortrait ? SCREEN_ORIENTATION_PORTRAIT : SCREEN_ORIENTATION_LANDSCAPE); + activity.setRequestedOrientation(activityCurOrientation == ORIENTATION_LANDSCAPE + ? SCREEN_ORIENTATION_PORTRAIT : SCREEN_ORIENTATION_LANDSCAPE); - // Asserts it has orientation derived requested orientation (fixed orientation letterbox). - assertEquals(isScreenPortrait ? ORIENTATION_PORTRAIT : ORIENTATION_LANDSCAPE, - activity.getConfiguration().orientation); + // Asserts fixed orientation request is ignored, and the orientation is not changed + // (fill Task). + assertEquals(activityCurOrientation, activity.getConfiguration().orientation); + assertFalse(activity.isLetterboxedForFixedOrientationAndAspectRatio()); + } + + @Test + public void respectRequestedOrientationForNonResizableInSplitWindows() { + final Task task = new TaskBuilder(mSupervisor) + .setCreateParentTask(true).setCreateActivity(true).build(); + final Task rootTask = task.getRootTask(); + final ActivityRecord activity = new ActivityBuilder(mAtm) + .setParentTask(task) + .setOnTop(true) + .setResizeMode(RESIZE_MODE_UNRESIZEABLE) + .setScreenOrientation(SCREEN_ORIENTATION_PORTRAIT) + .build(); + + // Task in landscape. + rootTask.setWindowingMode(WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY); + task.setBounds(0, 0, 1000, 500); + assertEquals(ORIENTATION_LANDSCAPE, task.getConfiguration().orientation); + + // Asserts fixed orientation request is respected, and the orientation is not changed. + assertEquals(ORIENTATION_PORTRAIT, activity.getConfiguration().orientation); + + // Clear size compat. + activity.clearSizeCompatMode(); + activity.ensureActivityConfiguration(0 /* globalChanges */, false /* preserveWindow */); + activity.mDisplayContent.sendNewConfiguration(); + + // Relaunching the app should still respect the orientation request. + assertEquals(ORIENTATION_PORTRAIT, activity.getConfiguration().orientation); assertTrue(activity.isLetterboxedForFixedOrientationAndAspectRatio()); } |