Loading services/core/java/com/android/server/wm/ActivityRecord.java +19 −11 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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); Loading @@ -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. Loading Loading @@ -7001,7 +7003,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A * WindowManagerService#getIgnoreOrientationRequest} for more context. */ boolean isLetterboxedForFixedOrientationAndAspectRatio() { return mIsLetterboxedForFixedOrientationAndAspectRatio; return mLetterboxBoundsForFixedOrientationAndAspectRatio != null; } /** Loading @@ -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. Loading Loading @@ -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); } /** Loading Loading @@ -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; } Loading Loading
services/core/java/com/android/server/wm/ActivityRecord.java +19 −11 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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); Loading @@ -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. Loading Loading @@ -7001,7 +7003,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A * WindowManagerService#getIgnoreOrientationRequest} for more context. */ boolean isLetterboxedForFixedOrientationAndAspectRatio() { return mIsLetterboxedForFixedOrientationAndAspectRatio; return mLetterboxBoundsForFixedOrientationAndAspectRatio != null; } /** Loading @@ -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. Loading Loading @@ -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); } /** Loading Loading @@ -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; } Loading