summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/AppCompatOrientationOverrides.java11
-rw-r--r--services/core/java/com/android/server/wm/DisplayArea.java18
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/AppCompatOrientationOverridesTest.java38
3 files changed, 57 insertions, 10 deletions
diff --git a/services/core/java/com/android/server/wm/AppCompatOrientationOverrides.java b/services/core/java/com/android/server/wm/AppCompatOrientationOverrides.java
index bd01351251a5..c84711d4be51 100644
--- a/services/core/java/com/android/server/wm/AppCompatOrientationOverrides.java
+++ b/services/core/java/com/android/server/wm/AppCompatOrientationOverrides.java
@@ -16,6 +16,7 @@
package com.android.server.wm;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.content.pm.ActivityInfo.OVERRIDE_ANY_ORIENTATION;
import static android.content.pm.ActivityInfo.OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED;
import static android.content.pm.ActivityInfo.OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION;
@@ -106,6 +107,16 @@ class AppCompatOrientationOverrides {
return isChangeEnabled(mActivityRecord, OVERRIDE_RESPECT_REQUESTED_ORIENTATION);
}
+ boolean shouldRespectRequestedOrientationDueToOverride() {
+ // Checking TaskFragment rather than ActivityRecord to ensure that transition
+ // between fullscreen and PiP would work well. Checking TaskFragment rather than
+ // Task to ensure that Activity Embedding is excluded.
+ return mActivityRecord.isVisibleRequested() && mActivityRecord.getTaskFragment() != null
+ && mActivityRecord.getTaskFragment().getWindowingMode() == WINDOWING_MODE_FULLSCREEN
+ && mActivityRecord.mAppCompatController.getAppCompatOrientationOverrides()
+ .isOverrideRespectRequestedOrientationEnabled();
+ }
+
/**
* Whether an app is calling {@link android.app.Activity#setRequestedOrientation}
* in a loop and orientation request should be ignored.
diff --git a/services/core/java/com/android/server/wm/DisplayArea.java b/services/core/java/com/android/server/wm/DisplayArea.java
index 0416f74aa488..29ffda7537ac 100644
--- a/services/core/java/com/android/server/wm/DisplayArea.java
+++ b/services/core/java/com/android/server/wm/DisplayArea.java
@@ -16,7 +16,6 @@
package com.android.server.wm;
-import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_BEHIND;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
@@ -260,15 +259,14 @@ public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> {
if (mDisplayContent == null) {
return false;
}
- ActivityRecord activity = mDisplayContent.topRunningActivity(
- /* considerKeyguardState= */ true);
- return activity != null && activity.getTaskFragment() != null
- // Checking TaskFragment rather than ActivityRecord to ensure that transition
- // between fullscreen and PiP would work well. Checking TaskFragment rather than
- // Task to ensure that Activity Embedding is excluded.
- && activity.getTaskFragment().getWindowingMode() == WINDOWING_MODE_FULLSCREEN
- && activity.mAppCompatController.getAppCompatOrientationOverrides()
- .isOverrideRespectRequestedOrientationEnabled();
+
+ // Top running activity can be freeform and ignore orientation request from bottom activity
+ // that should be respected, Check all activities in display to make sure any eligible
+ // activity should be respected.
+ final ActivityRecord activity = mDisplayContent.getActivity((r) ->
+ r.mAppCompatController.getAppCompatOrientationOverrides()
+ .shouldRespectRequestedOrientationDueToOverride());
+ return activity != null;
}
boolean getIgnoreOrientationRequest() {
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppCompatOrientationOverridesTest.java b/services/tests/wmtests/src/com/android/server/wm/AppCompatOrientationOverridesTest.java
index d9b5f37be86c..8747cfae93f8 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AppCompatOrientationOverridesTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AppCompatOrientationOverridesTest.java
@@ -17,11 +17,13 @@ package com.android.server.wm;
import static android.content.pm.ActivityInfo.OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED;
import static android.content.pm.ActivityInfo.OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION;
+import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE;
import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
import static com.android.server.wm.AppCompatOrientationOverrides.OrientationOverridesState.MIN_COUNT_TO_IGNORE_REQUEST_IN_LOOP;
import static com.android.server.wm.AppCompatOrientationOverrides.OrientationOverridesState.SET_ORIENTATION_REQUEST_COUNTER_TIMEOUT_MS;
@@ -31,6 +33,7 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import android.compat.testing.PlatformCompatChangeRule;
+import android.content.pm.ActivityInfo.ScreenOrientation;
import android.platform.test.annotations.Presubmit;
import androidx.annotation.NonNull;
@@ -228,6 +231,25 @@ public class AppCompatOrientationOverridesTest extends WindowTestsBase {
});
}
+ @Test
+ public void testOverrideRespectRequestedOrientationIsEnabled_bottomOrientationIsRespected() {
+ runTestScenario((robot) -> {
+ robot.applyOnActivity((a) -> {
+ a.setIgnoreOrientationRequest(true);
+ a.createActivityWithComponentInNewTask();
+ robot.setOverrideRespectRequestedOrientationEnabled(true);
+ a.configureUnresizableTopActivity(SCREEN_ORIENTATION_LANDSCAPE);
+ robot.checkDisplayShouldIgnoreOrientationRequest(SCREEN_ORIENTATION_LANDSCAPE,
+ /* expected */ false);
+
+ a.createActivityWithComponentInNewTask();
+ a.setTopActivityInFreeformWindowingMode(true);
+ });
+ robot.checkDisplayShouldIgnoreOrientationRequest(SCREEN_ORIENTATION_LANDSCAPE,
+ /* expected */ false);
+ });
+ }
+
/**
* Runs a test scenario providing a Robot.
*/
@@ -291,6 +313,22 @@ public class AppCompatOrientationOverridesTest extends WindowTestsBase {
}
}
+ void setOverrideRespectRequestedOrientationEnabled(boolean override) {
+ spyOn(getTopOrientationOverrides());
+ doReturn(override).when(getTopOrientationOverrides())
+ .isOverrideRespectRequestedOrientationEnabled();
+ }
+
+ void checkDisplayShouldIgnoreOrientationRequest(@ScreenOrientation int candidate,
+ boolean expected) {
+ assertEquals(expected, activity().displayContent()
+ .shouldIgnoreOrientationRequest(candidate));
+ }
+
+ void checkExpectedDisplayOrientation(@ScreenOrientation int expected) {
+ assertEquals(expected, activity().displayContent().getOrientation());
+ }
+
void checkShouldUseDisplayLandscapeNaturalOrientation(boolean expected) {
assertEquals(expected,
getTopOrientationOverrides().shouldUseDisplayLandscapeNaturalOrientation());