summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Massimo Carli <mcarli@google.com> 2022-10-13 21:27:10 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-10-13 21:27:10 +0000
commitd119d2542912acfa12821b491187bba8c7a5b69e (patch)
treee91b11016afb77085f3558500200df6f7349d000
parent8664c9501c02b7d8a84375bad02b4d7a4419ecd1 (diff)
parentdd0f6850606c85b6914e1f946efd32a132bae599 (diff)
Merge "Fix letterbox for SCREEN_ORIENTATION_BEHIND" into tm-qpr-dev
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java25
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java16
2 files changed, 41 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 20059fe97b9c..2eb2cf643c42 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -7638,6 +7638,31 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
ensureActivityConfiguration(0 /* globalChanges */, false /* preserveWindow */);
}
+ /**
+ * Returns the requested {@link Configuration.Orientation} for the current activity.
+ *
+ * <p>When The current orientation is set to {@link SCREEN_ORIENTATION_BEHIND} it returns the
+ * requested orientation for the activity below which is the first activity with an explicit
+ * (different from {@link SCREEN_ORIENTATION_UNSET}) orientation which is not {@link
+ * SCREEN_ORIENTATION_BEHIND}.
+ */
+ @Configuration.Orientation
+ @Override
+ int getRequestedConfigurationOrientation(boolean forDisplay) {
+ if (mOrientation == SCREEN_ORIENTATION_BEHIND && task != null) {
+ // We use Task here because we want to be consistent with what happens in
+ // multi-window mode where other tasks orientations are ignored.
+ final ActivityRecord belowCandidate = task.getActivity(
+ a -> a.mOrientation != SCREEN_ORIENTATION_UNSET && !a.finishing
+ && a.mOrientation != ActivityInfo.SCREEN_ORIENTATION_BEHIND, this,
+ false /* includeBoundary */, true /* traverseTopToBottom */);
+ if (belowCandidate != null) {
+ return belowCandidate.getRequestedConfigurationOrientation(forDisplay);
+ }
+ }
+ return super.getRequestedConfigurationOrientation(forDisplay);
+ }
+
@Override
void onCancelFixedRotationTransform(int originalDisplayRotation) {
if (this != mDisplayContent.getLastOrientationSource()) {
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 d5447447a7b2..462957a88a6c 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
@@ -2319,6 +2319,22 @@ public class ActivityRecordTests extends WindowTestsBase {
assertTrue(activity1.getTask().getTaskInfo().launchCookies.contains(launchCookie));
}
+ @Test
+ public void testOrientationForScreenOrientationBehind() {
+ final Task task = createTask(mDisplayContent);
+ // Activity below
+ new ActivityBuilder(mAtm)
+ .setTask(task)
+ .setScreenOrientation(SCREEN_ORIENTATION_PORTRAIT)
+ .build();
+ final ActivityRecord activityTop = new ActivityBuilder(mAtm)
+ .setTask(task)
+ .setScreenOrientation(SCREEN_ORIENTATION_BEHIND)
+ .build();
+ final int topOrientation = activityTop.getRequestedConfigurationOrientation();
+ assertEquals(SCREEN_ORIENTATION_PORTRAIT, topOrientation);
+ }
+
private void verifyProcessInfoUpdate(ActivityRecord activity, State state,
boolean shouldUpdate, boolean activityChange) {
reset(activity.app);