Merge "Ignore orientation request from resizable apps in multi window" into sc-dev

This commit is contained in:
Chris Li
2021-06-02 15:08:38 +00:00
committed by Android (Google) Code Review
2 changed files with 49 additions and 11 deletions

View File

@@ -7013,7 +7013,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
// TODO(b/181207944): Consider removing the if condition and always run // TODO(b/181207944): Consider removing the if condition and always run
// resolveFixedOrientationConfiguration() since this should be applied for all cases. // resolveFixedOrientationConfiguration() since this should be applied for all cases.
if (isFixedOrientationLetterboxAllowed) { if (isFixedOrientationLetterboxAllowed) {
resolveFixedOrientationConfiguration(newParentConfiguration); resolveFixedOrientationConfiguration(newParentConfiguration, parentWindowingMode);
} }
if (mCompatDisplayInsets != null) { 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. * change and the requested orientation is different from the parent.
* *
* <p>If letterboxed due to fixed orientation then aspect ratio restrictions are also applied * <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; mLetterboxBoundsForFixedOrientationAndAspectRatio = null;
if (handlesOrientationChangeFromDescendant()) { if (handlesOrientationChangeFromDescendant()) {
// No need to letterbox because of fixed orientation. Display will handle // No need to letterbox because of fixed orientation. Display will handle
// fixed-orientation requests. // fixed-orientation requests.
return; 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 // PiP bounds have higher priority than the requested orientation. Otherwise the
// activity may be squeezed into a small piece. // activity may be squeezed into a small piece.
return; return;

View File

@@ -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_DEFAULT;
import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_IF_ALLOWLISTED; 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.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_BEHIND;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
@@ -546,7 +547,7 @@ public class ActivityRecordTests extends WindowTestsBase {
} }
@Test @Test
public void ignoreRequestedOrientationInSplitWindows() { public void ignoreRequestedOrientationForResizableInSplitWindows() {
final ActivityRecord activity = createActivityWith2LevelTask(); final ActivityRecord activity = createActivityWith2LevelTask();
final Task task = activity.getTask(); final Task task = activity.getTask();
final Task rootTask = activity.getRootTask(); final Task rootTask = activity.getRootTask();
@@ -578,13 +579,45 @@ public class ActivityRecordTests extends WindowTestsBase {
} }
task.setBounds(bounds); task.setBounds(bounds);
// Requests orientation that's different from its bounds. final int activityCurOrientation = activity.getConfiguration().orientation;
activity.setRequestedOrientation(
isScreenPortrait ? SCREEN_ORIENTATION_PORTRAIT : SCREEN_ORIENTATION_LANDSCAPE);
// Asserts it has orientation derived requested orientation (fixed orientation letterbox). // Requests orientation that's different from its bounds.
assertEquals(isScreenPortrait ? ORIENTATION_PORTRAIT : ORIENTATION_LANDSCAPE, activity.setRequestedOrientation(activityCurOrientation == ORIENTATION_LANDSCAPE
activity.getConfiguration().orientation); ? SCREEN_ORIENTATION_PORTRAIT : SCREEN_ORIENTATION_LANDSCAPE);
// 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()); assertTrue(activity.isLetterboxedForFixedOrientationAndAspectRatio());
} }