diff options
| author | 2021-01-20 02:30:03 +0000 | |
|---|---|---|
| committer | 2021-01-20 02:30:03 +0000 | |
| commit | bd22adfb6c8bac804a9271fc705fe56bbae16ccf (patch) | |
| tree | c2c11e9ebb22a9216163f43c4198fad20a3b7d31 | |
| parent | 61b1b4e80f76150d318e1c37dee2701bebaa4696 (diff) | |
| parent | 3e4f8e1a7c731a03a587bcf2b478aa40caab2356 (diff) | |
Merge "Task letterbox for resizable fixed-orientation app in dual DisplayAreas"
4 files changed, 67 insertions, 9 deletions
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 042b7e36428b..855c8f562dda 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -3329,6 +3329,14 @@ class Task extends WindowContainer<WindowContainer> { return false; } + @Override + boolean handlesOrientationChangeFromDescendant() { + return super.handlesOrientationChangeFromDescendant() + // Display won't rotate for the orientation request if the TaskDisplayArea can't + // specify orientation. + && getDisplayArea().canSpecifyOrientation(); + } + void resize(boolean relayout, boolean forced) { if (setBounds(getRequestedOverrideBounds(), forced) != BOUNDS_CHANGE_NONE && relayout) { getDisplayContent().layoutAndAssignWindowLayersIfNeeded(); diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index bc0235c0e934..0136c010429b 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -1902,7 +1902,6 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { } /** Whether this task display area can request orientation. */ - @VisibleForTesting boolean canSpecifyOrientation() { // Only allow to specify orientation if this TDA is not set to ignore orientation request, // and it is the last focused one on this logical display that can request orientation diff --git a/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java index 61911b3c36be..e6f24da3e7b9 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java @@ -33,6 +33,7 @@ import static android.window.DisplayAreaOrganizer.FEATURE_VENDOR_FIRST; import static android.window.DisplayAreaOrganizer.FEATURE_WINDOWED_MAGNIFICATION; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; +import static com.android.server.wm.SizeCompatTests.prepareLimitedBounds; import static com.android.server.wm.SizeCompatTests.prepareUnresizable; import static com.android.server.wm.SizeCompatTests.rotateDisplay; @@ -309,6 +310,43 @@ public class DualDisplayAreaGroupPolicyTest extends WindowTestsBase { assertThat(mSecondRoot.findAreaForToken(imeToken)).isEqualTo(imeContainer); } + @Test + public void testResizableFixedOrientationApp_taskLevelLetterboxing() { + mFirstRoot.setIgnoreOrientationRequest(false /* ignoreOrientationRequest */); + mSecondRoot.setIgnoreOrientationRequest(false /* ignoreOrientationRequest */); + + // Launch portrait on first DAG + mDisplay.onLastFocusedTaskDisplayAreaChanged(mFirstTda); + prepareLimitedBounds(mFirstActivity, SCREEN_ORIENTATION_PORTRAIT, + false /* isUnresizable */); + + // Display in landscape (as opposite to DAG), first DAG and activity in portrait + assertThat(mDisplay.getLastOrientation()).isEqualTo(SCREEN_ORIENTATION_LANDSCAPE); + assertThat(mFirstRoot.getConfiguration().orientation).isEqualTo(ORIENTATION_PORTRAIT); + assertThat(mFirstActivity.getConfiguration().orientation).isEqualTo(ORIENTATION_PORTRAIT); + assertThat(mFirstTask.isTaskLetterboxed()).isFalse(); + assertThat(mFirstActivity.inSizeCompatMode()).isFalse(); + + // Launch portrait on second DAG + mDisplay.onLastFocusedTaskDisplayAreaChanged(mSecondTda); + prepareLimitedBounds(mSecondActivity, SCREEN_ORIENTATION_LANDSCAPE, + false /* isUnresizable */); + + // Display in portrait (as opposite to DAG), first DAG and activity in landscape + assertThat(mDisplay.getLastOrientation()).isEqualTo(SCREEN_ORIENTATION_PORTRAIT); + assertThat(mSecondRoot.getConfiguration().orientation).isEqualTo(ORIENTATION_LANDSCAPE); + assertThat(mSecondActivity.getConfiguration().orientation).isEqualTo(ORIENTATION_LANDSCAPE); + assertThat(mSecondTask.isTaskLetterboxed()).isFalse(); + assertThat(mSecondActivity.inSizeCompatMode()).isFalse(); + + // First activity is letterboxed in portrait as requested. + assertThat(mFirstRoot.getConfiguration().orientation).isEqualTo(ORIENTATION_LANDSCAPE); + assertThat(mFirstActivity.getConfiguration().orientation).isEqualTo(ORIENTATION_PORTRAIT); + assertThat(mFirstTask.isTaskLetterboxed()).isTrue(); + assertThat(mFirstActivity.inSizeCompatMode()).isFalse(); + + } + private void setupImeWindow() { final WindowState imeWindow = createWindow(null /* parent */, TYPE_INPUT_METHOD, mDisplay, "mImeWindow"); diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java index 22430a110ca3..eb44476a8618 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -16,6 +16,7 @@ package com.android.server.wm; +import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE; import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; @@ -505,7 +506,7 @@ public class SizeCompatTests extends WindowTestsBase { compatTokens.clear(); // Make the activity resizable again by restarting it - activity.info.resizeMode = ActivityInfo.RESIZE_MODE_RESIZEABLE; + activity.info.resizeMode = RESIZE_MODE_RESIZEABLE; activity.mVisibleRequested = true; activity.restartProcessIfVisible(); // The full lifecycle isn't hooked up so manually set state to resumed @@ -522,7 +523,7 @@ public class SizeCompatTests extends WindowTestsBase { setUpDisplaySizeWithApp(1000, 2500); // Make the task root resizable. - mActivity.info.resizeMode = ActivityInfo.RESIZE_MODE_RESIZEABLE; + mActivity.info.resizeMode = RESIZE_MODE_RESIZEABLE; // Create a size compat activity on the same task. final ActivityRecord activity = new ActivityBuilder(mAtm) @@ -550,7 +551,7 @@ public class SizeCompatTests extends WindowTestsBase { setUpDisplaySizeWithApp(1000, 2500); // Make the task root resizable. - mActivity.info.resizeMode = ActivityInfo.RESIZE_MODE_RESIZEABLE; + mActivity.info.resizeMode = RESIZE_MODE_RESIZEABLE; // Create a size compat activity on the same task. final ActivityRecord activity = new ActivityBuilder(mAtm) @@ -946,13 +947,25 @@ public class SizeCompatTests extends WindowTestsBase { prepareUnresizable(activity, -1 /* maxAspect */, screenOrientation); } - /** - * Setups {@link #mActivity} as a size-compat-mode-able activity with fixed aspect and/or - * orientation. - */ static void prepareUnresizable(ActivityRecord activity, float maxAspect, int screenOrientation) { - activity.info.resizeMode = RESIZE_MODE_UNRESIZEABLE; + prepareLimitedBounds(activity, maxAspect, screenOrientation, true /* isUnresizable */); + } + + static void prepareLimitedBounds(ActivityRecord activity, int screenOrientation, + boolean isUnresizable) { + prepareLimitedBounds(activity, -1 /* maxAspect */, screenOrientation, isUnresizable); + } + + /** + * Setups {@link #mActivity} with restriction on its bounds, such as maxAspect, fixed + * orientation, and/or whether it is resizable. + */ + static void prepareLimitedBounds(ActivityRecord activity, float maxAspect, + int screenOrientation, boolean isUnresizable) { + activity.info.resizeMode = isUnresizable + ? RESIZE_MODE_UNRESIZEABLE + : RESIZE_MODE_RESIZEABLE; activity.mVisibleRequested = true; if (maxAspect >= 0) { activity.info.maxAspectRatio = maxAspect; |