summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Chris Li <lihongyu@google.com> 2021-05-26 12:51:11 -0700
committer Chris Li <lihongyu@google.com> 2021-06-01 21:48:26 -0700
commitec9c4cd5fdac1b39e8e1df8a91f77d7fa4014b64 (patch)
tree8c2eb23f49969c52e4addf20d9a938c7f9c98ba4
parentf142b5a368edaf8393d093393708b62fa4d87f94 (diff)
Ignore orientation request from resizable apps in multi window
Resizable app should be able to handle multi window by themselves, no need to letterbox for them. Fix: 189344515 Test: atest WmTests:ActivityRecordTests Change-Id: I9787467246ae94c1ec9f68f5e7aa6bedf110ac4d
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java13
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java45
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());
}