Remember original orientation in size compat mode.
We should use the original orientation of the activity when the new requested orientation is undefinded to avoid forcing the activity in the opposite orientation. Fix: 227642889 Test: atest WmTests:SizeCompatTests Change-Id: If7fcca5009d543b70f8f46f3116e4c8a14aee0ad
This commit is contained in:
@@ -8071,7 +8071,11 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
|
||||
final boolean orientationRequested = requestedOrientation != ORIENTATION_UNDEFINED;
|
||||
final int orientation = orientationRequested
|
||||
? requestedOrientation
|
||||
: newParentConfiguration.orientation;
|
||||
// We should use the original orientation of the activity when possible to avoid
|
||||
// forcing the activity in the opposite orientation.
|
||||
: mCompatDisplayInsets.mOriginalRequestedOrientation != ORIENTATION_UNDEFINED
|
||||
? mCompatDisplayInsets.mOriginalRequestedOrientation
|
||||
: newParentConfiguration.orientation;
|
||||
int rotation = newParentConfiguration.windowConfiguration.getRotation();
|
||||
final boolean isFixedToUserRotation = mDisplayContent == null
|
||||
|| mDisplayContent.getDisplayRotation().isFixedToUserRotation();
|
||||
@@ -9339,8 +9343,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
|
||||
* compatibility mode activity compute the configuration without relying on its current display.
|
||||
*/
|
||||
static class CompatDisplayInsets {
|
||||
/** The original rotation the compat insets were computed in */
|
||||
/** The original rotation the compat insets were computed in. */
|
||||
final @Rotation int mOriginalRotation;
|
||||
/** The original requested orientation for the activity. */
|
||||
final @Configuration.Orientation int mOriginalRequestedOrientation;
|
||||
/** The container width on rotation 0. */
|
||||
private final int mWidth;
|
||||
/** The container height on rotation 0. */
|
||||
@@ -9369,6 +9375,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
|
||||
@Nullable Rect fixedOrientationBounds) {
|
||||
mOriginalRotation = display.getRotation();
|
||||
mIsFloating = container.getWindowConfiguration().tasksAreFloating();
|
||||
mOriginalRequestedOrientation = container.getRequestedConfigurationOrientation();
|
||||
if (mIsFloating) {
|
||||
final Rect containerBounds = container.getWindowConfiguration().getBounds();
|
||||
mWidth = containerBounds.width();
|
||||
|
||||
@@ -1528,6 +1528,27 @@ public class SizeCompatTests extends WindowTestsBase {
|
||||
newActivityBounds.width());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDisplayIgnoreOrientationRequest_orientationChangedToUnspecified() {
|
||||
// Set up a display in landscape and ignoring orientation request.
|
||||
setUpDisplaySizeWithApp(2800, 1400);
|
||||
final DisplayContent display = mActivity.mDisplayContent;
|
||||
display.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
|
||||
|
||||
// Portrait fixed app without max aspect.
|
||||
prepareUnresizable(mActivity, 0, SCREEN_ORIENTATION_PORTRAIT);
|
||||
|
||||
assertTrue(mActivity.isLetterboxedForFixedOrientationAndAspectRatio());
|
||||
assertFalse(mActivity.inSizeCompatMode());
|
||||
|
||||
mActivity.setRequestedOrientation(SCREEN_ORIENTATION_UNSPECIFIED);
|
||||
|
||||
assertTrue(mActivity.inSizeCompatMode());
|
||||
// We should remember the original orientation.
|
||||
assertEquals(mActivity.getResolvedOverrideConfiguration().orientation,
|
||||
Configuration.ORIENTATION_PORTRAIT);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDisplayIgnoreOrientationRequest_newLaunchedMaxAspectApp() {
|
||||
// Set up a display in landscape and ignoring orientation request.
|
||||
|
||||
Reference in New Issue
Block a user