diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index db3d7ad0c3982..89dac0552c9f0 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -664,13 +664,16 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // naturally. private boolean mInSizeCompatModeForBounds = false; - // Whether this activity is letterboxed for fixed orientation. If letterboxed due to fixed - // orientation then aspect ratio restrictions are also already respected. + // Bounds populated in resolveFixedOrientationConfiguration when this activity is letterboxed + // for fixed orientation. If not null, they are used as parent container in + // resolveSizeCompatModeConfiguration and in a constructor of CompatDisplayInsets. If + // letterboxed due to fixed orientation then aspect ratio restrictions are also respected. // This happens when an activity has fixed orientation which doesn't match orientation of the // parent because a display is ignoring orientation request or fixed to user rotation. // See WindowManagerService#getIgnoreOrientationRequest and // WindowManagerService#getFixedToUserRotation for more context. - private boolean mIsLetterboxedForFixedOrientationAndAspectRatio = false; + @Nullable + private Rect mLetterboxBoundsForFixedOrientationAndAspectRatio; // activity is not displayed? // TODO: rename to mNoDisplay @@ -6863,7 +6866,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } // TODO(b/36505427): Consider moving this method and similar ones to ConfigurationContainer. - private void updateCompatDisplayInsets(@Nullable Rect fixedOrientationBounds) { + private void updateCompatDisplayInsets() { if (mCompatDisplayInsets != null || !shouldCreateCompatDisplayInsets()) { // The override configuration is set only once in size compatibility mode. return; @@ -6891,7 +6894,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // The role of CompatDisplayInsets is like the override bounds. mCompatDisplayInsets = - new CompatDisplayInsets(mDisplayContent, this, fixedOrientationBounds); + new CompatDisplayInsets( + mDisplayContent, this, mLetterboxBoundsForFixedOrientationAndAspectRatio); } @VisibleForTesting @@ -6945,8 +6949,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A || windowingMode == WINDOWING_MODE_FULLSCREEN) { resolveFixedOrientationConfiguration(newParentConfiguration); } - final Rect fixedOrientationBounds = isLetterboxedForFixedOrientationAndAspectRatio() - ? new Rect(resolvedConfig.windowConfiguration.getBounds()) : null; if (mCompatDisplayInsets != null) { resolveSizeCompatModeConfiguration(newParentConfiguration); @@ -6966,7 +6968,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } if (mVisibleRequested) { - updateCompatDisplayInsets(fixedOrientationBounds); + updateCompatDisplayInsets(); } // TODO(b/175212232): Consolidate position logic from each "resolve" method above here. @@ -7001,7 +7003,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A * WindowManagerService#getIgnoreOrientationRequest} for more context. */ boolean isLetterboxedForFixedOrientationAndAspectRatio() { - return mIsLetterboxedForFixedOrientationAndAspectRatio; + return mLetterboxBoundsForFixedOrientationAndAspectRatio != null; } /** @@ -7012,7 +7014,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A * in this methiod. */ private void resolveFixedOrientationConfiguration(@NonNull Configuration newParentConfig) { - mIsLetterboxedForFixedOrientationAndAspectRatio = false; + mLetterboxBoundsForFixedOrientationAndAspectRatio = null; if (handlesOrientationChangeFromDescendant()) { // No need to letterbox because of fixed orientation. Display will handle // fixed-orientation requests. @@ -7089,7 +7091,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // Calculate app bounds using fixed orientation bounds because they will be needed later // for comparison with size compat app bounds in {@link resolveSizeCompatModeConfiguration}. task.computeConfigResourceOverrides(getResolvedOverrideConfiguration(), newParentConfig); - mIsLetterboxedForFixedOrientationAndAspectRatio = true; + mLetterboxBoundsForFixedOrientationAndAspectRatio = new Rect(resolvedBounds); } /** @@ -7635,6 +7637,12 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A if (getConfiguration().equals(mTmpConfig) && !forceNewConfig && !displayChanged) { ProtoLog.v(WM_DEBUG_CONFIGURATION, "Configuration & display " + "unchanged in %s", this); + // It's possible that resolveOverrideConfiguration was called before mVisibleRequested + // became true and mCompatDisplayInsets may not have been created so ensure + // that mCompatDisplayInsets is created here. + if (mVisibleRequested) { + updateCompatDisplayInsets(); + } return true; }