Loading services/core/java/com/android/server/wm/ActivityRecord.java +9 −4 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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; Loading services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +39 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading Loading @@ -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()); } Loading Loading
services/core/java/com/android/server/wm/ActivityRecord.java +9 −4 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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; Loading
services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +39 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading Loading @@ -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()); } Loading