PossibleMaximumWindowMetrics reports physical display insets for each
DisplayInfo (current and non-current display) Changes behaviour from dumbly applying the insets of the current DisplayInfo to all other DisplayInfo, to reading the insets of each DisplayInfo into WindowMetrics. Additionally, applies the appropriate rotation to the insets of each DisplayInfo, so the WindowMetrics contain the correctly-rotated insets. Bug: 201546646 Test: Manual Change-Id: I5756a768b7544939d55d5759f838b27278ca1da6
This commit is contained in:
@@ -352,25 +352,11 @@ public final class WindowManagerImpl implements WindowManager {
|
||||
throw e.rethrowFromSystemServer();
|
||||
}
|
||||
|
||||
int size = possibleDisplayInfos.size();
|
||||
DisplayInfo currentDisplayInfo;
|
||||
WindowInsets windowInsets = null;
|
||||
if (size > 0) {
|
||||
currentDisplayInfo = possibleDisplayInfos.get(0);
|
||||
|
||||
final WindowManager.LayoutParams params = new WindowManager.LayoutParams();
|
||||
final boolean isScreenRound = (currentDisplayInfo.flags & Display.FLAG_ROUND) != 0;
|
||||
// TODO(181127261) not computing insets correctly - need to have underlying
|
||||
// frame reflect the faked orientation.
|
||||
windowInsets = getWindowInsetsFromServerForDisplay(
|
||||
currentDisplayInfo.displayId, params,
|
||||
new Rect(0, 0, currentDisplayInfo.getNaturalWidth(),
|
||||
currentDisplayInfo.getNaturalHeight()), isScreenRound,
|
||||
WINDOWING_MODE_FULLSCREEN);
|
||||
}
|
||||
|
||||
Set<WindowMetrics> maxMetrics = new HashSet<>();
|
||||
for (int i = 0; i < size; i++) {
|
||||
WindowInsets windowInsets;
|
||||
DisplayInfo currentDisplayInfo;
|
||||
final WindowManager.LayoutParams params = new WindowManager.LayoutParams();
|
||||
for (int i = 0; i < possibleDisplayInfos.size(); i++) {
|
||||
currentDisplayInfo = possibleDisplayInfos.get(i);
|
||||
|
||||
// Calculate max bounds for this rotation and state.
|
||||
@@ -378,7 +364,18 @@ public final class WindowManagerImpl implements WindowManager {
|
||||
currentDisplayInfo.logicalHeight);
|
||||
|
||||
// Calculate insets for the rotated max bounds.
|
||||
// TODO(181127261) calculate insets for each display rotation and state.
|
||||
final boolean isScreenRound = (currentDisplayInfo.flags & Display.FLAG_ROUND) != 0;
|
||||
// Initialize insets based upon display rotation. Note any window-provided insets
|
||||
// will not be set.
|
||||
windowInsets = getWindowInsetsFromServerForDisplay(
|
||||
currentDisplayInfo.displayId, params,
|
||||
new Rect(0, 0, currentDisplayInfo.getNaturalWidth(),
|
||||
currentDisplayInfo.getNaturalHeight()), isScreenRound,
|
||||
WINDOWING_MODE_FULLSCREEN);
|
||||
// Set the hardware-provided insets.
|
||||
windowInsets = new WindowInsets.Builder(windowInsets).setRoundedCorners(
|
||||
currentDisplayInfo.roundedCorners)
|
||||
.setDisplayCutout(currentDisplayInfo.displayCutout).build();
|
||||
|
||||
maxMetrics.add(new WindowMetrics(maxBounds, windowInsets));
|
||||
}
|
||||
|
||||
@@ -588,7 +588,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
|
||||
/** Caches the value whether told display manager that we have content. */
|
||||
private boolean mLastHasContent;
|
||||
|
||||
private DisplayRotationUtil mRotationUtil = new DisplayRotationUtil();
|
||||
private static DisplayRotationUtil sRotationUtil = new DisplayRotationUtil();
|
||||
|
||||
/**
|
||||
* The input method window for this display.
|
||||
@@ -2053,29 +2053,35 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
|
||||
return mDisplayCutoutCache.getOrCompute(mInitialDisplayCutout, rotation);
|
||||
}
|
||||
|
||||
private WmDisplayCutout calculateDisplayCutoutForRotationUncached(
|
||||
DisplayCutout cutout, int rotation) {
|
||||
static WmDisplayCutout calculateDisplayCutoutForRotationAndDisplaySizeUncached(
|
||||
DisplayCutout cutout, int rotation, int displayWidth, int displayHeight) {
|
||||
if (cutout == null || cutout == DisplayCutout.NO_CUTOUT) {
|
||||
return WmDisplayCutout.NO_CUTOUT;
|
||||
}
|
||||
if (rotation == ROTATION_0) {
|
||||
return WmDisplayCutout.computeSafeInsets(
|
||||
cutout, mInitialDisplayWidth, mInitialDisplayHeight);
|
||||
cutout, displayWidth, displayHeight);
|
||||
}
|
||||
final Insets waterfallInsets =
|
||||
RotationUtils.rotateInsets(cutout.getWaterfallInsets(), rotation);
|
||||
final boolean rotated = (rotation == ROTATION_90 || rotation == ROTATION_270);
|
||||
final Rect[] newBounds = mRotationUtil.getRotatedBounds(
|
||||
final Rect[] newBounds = sRotationUtil.getRotatedBounds(
|
||||
cutout.getBoundingRectsAll(),
|
||||
rotation, mInitialDisplayWidth, mInitialDisplayHeight);
|
||||
rotation, displayWidth, displayHeight);
|
||||
final CutoutPathParserInfo info = cutout.getCutoutPathParserInfo();
|
||||
final CutoutPathParserInfo newInfo = new CutoutPathParserInfo(
|
||||
info.getDisplayWidth(), info.getDisplayHeight(), info.getDensity(),
|
||||
info.getCutoutSpec(), rotation, info.getScale());
|
||||
return WmDisplayCutout.computeSafeInsets(
|
||||
DisplayCutout.constructDisplayCutout(newBounds, waterfallInsets, newInfo),
|
||||
rotated ? mInitialDisplayHeight : mInitialDisplayWidth,
|
||||
rotated ? mInitialDisplayWidth : mInitialDisplayHeight);
|
||||
rotated ? displayHeight : displayWidth,
|
||||
rotated ? displayWidth : displayHeight);
|
||||
}
|
||||
|
||||
private WmDisplayCutout calculateDisplayCutoutForRotationUncached(
|
||||
DisplayCutout cutout, int rotation) {
|
||||
return calculateDisplayCutoutForRotationAndDisplaySizeUncached(cutout, rotation,
|
||||
mInitialDisplayWidth, mInitialDisplayHeight);
|
||||
}
|
||||
|
||||
RoundedCorners calculateRoundedCornersForRotation(int rotation) {
|
||||
|
||||
@@ -120,8 +120,15 @@ public class PossibleDisplayInfoMapper {
|
||||
@Surface.Rotation int rotation) {
|
||||
DisplayInfo updatedDisplayInfo = new DisplayInfo();
|
||||
updatedDisplayInfo.copyFrom(displayInfo);
|
||||
updatedDisplayInfo.rotation = rotation;
|
||||
// Apply rotations before updating width and height
|
||||
updatedDisplayInfo.roundedCorners = updatedDisplayInfo.roundedCorners.rotate(rotation,
|
||||
updatedDisplayInfo.logicalWidth, updatedDisplayInfo.logicalHeight);
|
||||
updatedDisplayInfo.displayCutout =
|
||||
DisplayContent.calculateDisplayCutoutForRotationAndDisplaySizeUncached(
|
||||
updatedDisplayInfo.displayCutout, rotation, updatedDisplayInfo.logicalWidth,
|
||||
updatedDisplayInfo.logicalHeight).getDisplayCutout();
|
||||
|
||||
updatedDisplayInfo.rotation = rotation;
|
||||
final int naturalWidth = updatedDisplayInfo.getNaturalWidth();
|
||||
final int naturalHeight = updatedDisplayInfo.getNaturalHeight();
|
||||
updatedDisplayInfo.logicalWidth = naturalWidth;
|
||||
|
||||
Reference in New Issue
Block a user