Merge "Handle general display size change for screen decorations" into udc-qpr-dev am: f158fa25cb

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/23897517

Change-Id: I12a9e73bf6548d64fe695beaa6625a7d97ecbe2e
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Riddle Hsu
2023-07-06 09:12:24 +00:00
committed by Automerger Merge Worker
2 changed files with 33 additions and 41 deletions

View File

@@ -36,6 +36,7 @@ import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.hardware.graphics.common.AlphaInterpretation;
@@ -171,7 +172,7 @@ public class ScreenDecorations implements CoreStartable, Dumpable {
private int mTintColor = Color.BLACK;
@VisibleForTesting
protected DisplayDecorationSupport mHwcScreenDecorationSupport;
private Display.Mode mDisplayMode;
private final Point mDisplaySize = new Point();
@VisibleForTesting
protected DisplayInfo mDisplayInfo = new DisplayInfo();
private DisplayCutout mDisplayCutout;
@@ -484,7 +485,8 @@ public class ScreenDecorations implements CoreStartable, Dumpable {
mWindowManager = mContext.getSystemService(WindowManager.class);
mContext.getDisplay().getDisplayInfo(mDisplayInfo);
mRotation = mDisplayInfo.rotation;
mDisplayMode = mDisplayInfo.getMode();
mDisplaySize.x = mDisplayInfo.getNaturalWidth();
mDisplaySize.y = mDisplayInfo.getNaturalHeight();
mDisplayUniqueId = mDisplayInfo.uniqueId;
mDisplayCutout = mDisplayInfo.displayCutout;
mRoundedCornerResDelegate =
@@ -505,10 +507,12 @@ public class ScreenDecorations implements CoreStartable, Dumpable {
public void onDisplayChanged(int displayId) {
mContext.getDisplay().getDisplayInfo(mDisplayInfo);
final int newRotation = mDisplayInfo.rotation;
final Display.Mode newDisplayMode = mDisplayInfo.getMode();
if ((mOverlays != null || mScreenDecorHwcWindow != null)
&& (mRotation != newRotation
|| displayModeChanged(mDisplayMode, newDisplayMode))) {
|| displaySizeChanged(mDisplaySize, mDisplayInfo))) {
final Point newSize = new Point();
newSize.x = mDisplayInfo.getNaturalWidth();
newSize.y = mDisplayInfo.getNaturalHeight();
// We cannot immediately update the orientation. Otherwise
// WindowManager is still deferring layout until it has finished dispatching
// the config changes, which may cause divergence between what we draw
@@ -520,9 +524,8 @@ public class ScreenDecorations implements CoreStartable, Dumpable {
if (mRotation != newRotation) {
mLogger.logRotationChangeDeferred(mRotation, newRotation);
}
if (displayModeChanged(mDisplayMode, newDisplayMode)) {
mLogger.logDisplayModeChanged(
newDisplayMode.getModeId(), mDisplayMode.getModeId());
if (!mDisplaySize.equals(newSize)) {
mLogger.logDisplaySizeChanged(mDisplaySize, newSize);
}
if (mOverlays != null) {
@@ -531,7 +534,7 @@ public class ScreenDecorations implements CoreStartable, Dumpable {
final ViewGroup overlayView = mOverlays[i].getRootView();
overlayView.getViewTreeObserver().addOnPreDrawListener(
new RestartingPreDrawListener(
overlayView, i, newRotation, newDisplayMode));
overlayView, i, newRotation, newSize));
}
}
}
@@ -541,7 +544,7 @@ public class ScreenDecorations implements CoreStartable, Dumpable {
new RestartingPreDrawListener(
mScreenDecorHwcWindow,
-1, // Pass -1 for views with no specific position.
newRotation, newDisplayMode));
newRotation, newSize));
}
if (mScreenDecorHwcLayer != null) {
mScreenDecorHwcLayer.pendingConfigChange = true;
@@ -943,15 +946,8 @@ public class ScreenDecorations implements CoreStartable, Dumpable {
}
}
private static boolean displayModeChanged(Display.Mode oldMode, Display.Mode newMode) {
if (oldMode == null) {
return true;
}
// We purposely ignore refresh rate and id changes here, because we don't need to
// invalidate for those, and they can trigger the refresh rate to increase
return oldMode.getPhysicalWidth() != newMode.getPhysicalWidth()
|| oldMode.getPhysicalHeight() != newMode.getPhysicalHeight();
private static boolean displaySizeChanged(Point size, DisplayInfo info) {
return size.x != info.getNaturalWidth() || size.y != info.getNaturalHeight();
}
private int getOverlayWindowGravity(@BoundsPosition int pos) {
@@ -1170,14 +1166,14 @@ public class ScreenDecorations implements CoreStartable, Dumpable {
if (mRotation != newRotation) {
mDotViewController.setNewRotation(newRotation);
}
final Display.Mode newMod = mDisplayInfo.getMode();
final DisplayCutout newCutout = mDisplayInfo.displayCutout;
if (!mPendingConfigChange
&& (newRotation != mRotation || displayModeChanged(mDisplayMode, newMod)
&& (newRotation != mRotation || displaySizeChanged(mDisplaySize, mDisplayInfo)
|| !Objects.equals(newCutout, mDisplayCutout))) {
mRotation = newRotation;
mDisplayMode = newMod;
mDisplaySize.x = mDisplayInfo.getNaturalWidth();
mDisplaySize.y = mDisplayInfo.getNaturalHeight();
mDisplayCutout = newCutout;
float ratio = getPhysicalPixelDisplaySizeRatio();
mRoundedCornerResDelegate.setPhysicalPixelDisplaySizeRatio(ratio);
@@ -1494,31 +1490,29 @@ public class ScreenDecorations implements CoreStartable, Dumpable {
private final View mView;
private final int mTargetRotation;
private final Display.Mode mTargetDisplayMode;
private final Point mTargetDisplaySize;
// Pass -1 for ScreenDecorHwcLayer since it's a fullscreen window and has no specific
// position.
private final int mPosition;
private RestartingPreDrawListener(View view, @BoundsPosition int position,
int targetRotation, Display.Mode targetDisplayMode) {
int targetRotation, Point targetDisplaySize) {
mView = view;
mTargetRotation = targetRotation;
mTargetDisplayMode = targetDisplayMode;
mTargetDisplaySize = targetDisplaySize;
mPosition = position;
}
@Override
public boolean onPreDraw() {
mView.getViewTreeObserver().removeOnPreDrawListener(this);
if (mTargetRotation == mRotation
&& !displayModeChanged(mDisplayMode, mTargetDisplayMode)) {
if (mTargetRotation == mRotation && mDisplaySize.equals(mTargetDisplaySize)) {
if (DEBUG_LOGGING) {
final String title = mPosition < 0 ? "ScreenDecorHwcLayer"
: getWindowTitleByPos(mPosition);
Log.i(TAG, title + " already in target rot "
+ mTargetRotation + " and in target resolution "
+ mTargetDisplayMode.getPhysicalWidth() + "x"
+ mTargetDisplayMode.getPhysicalHeight()
+ mTargetDisplaySize.x + "x" + mTargetDisplaySize.y
+ ", allow draw without restarting it");
}
return true;
@@ -1533,8 +1527,7 @@ public class ScreenDecorations implements CoreStartable, Dumpable {
: getWindowTitleByPos(mPosition);
Log.i(TAG, title
+ " restarting listener fired, restarting draw for rot " + mRotation
+ ", resolution " + mDisplayMode.getPhysicalWidth() + "x"
+ mDisplayMode.getPhysicalHeight());
+ ", resolution " + mDisplaySize.x + "x" + mDisplaySize.y);
}
mView.invalidate();
return false;
@@ -1560,19 +1553,18 @@ public class ScreenDecorations implements CoreStartable, Dumpable {
public boolean onPreDraw() {
mContext.getDisplay().getDisplayInfo(mDisplayInfo);
final int displayRotation = mDisplayInfo.rotation;
final Display.Mode displayMode = mDisplayInfo.getMode();
if ((displayRotation != mRotation || displayModeChanged(mDisplayMode, displayMode))
if ((displayRotation != mRotation || displaySizeChanged(mDisplaySize, mDisplayInfo))
&& !mPendingConfigChange) {
if (DEBUG_LOGGING) {
if (displayRotation != mRotation) {
Log.i(TAG, "Drawing rot " + mRotation + ", but display is at rot "
+ displayRotation + ". Restarting draw");
}
if (displayModeChanged(mDisplayMode, displayMode)) {
Log.i(TAG, "Drawing at " + mDisplayMode.getPhysicalWidth()
+ "x" + mDisplayMode.getPhysicalHeight() + ", but display is at "
+ displayMode.getPhysicalWidth() + "x"
+ displayMode.getPhysicalHeight() + ". Restarting draw");
if (displaySizeChanged(mDisplaySize, mDisplayInfo)) {
Log.i(TAG, "Drawing at " + mDisplaySize.x + "x" + mDisplaySize.y
+ ", but display is at "
+ mDisplayInfo.getNaturalWidth() + "x"
+ mDisplayInfo.getNaturalHeight() + ". Restarting draw");
}
}
mView.invalidate();

View File

@@ -189,15 +189,15 @@ constructor(
)
}
fun logDisplayModeChanged(currentMode: Int, newMode: Int) {
fun logDisplaySizeChanged(currentSize: Point, newSize: Point) {
logBuffer.log(
TAG,
INFO,
{
int1 = currentMode
int2 = newMode
str1 = currentSize.flattenToString()
str2 = newSize.flattenToString()
},
{ "Resolution changed, deferring mode change to $int2, staying at $int1" },
{ "Resolution changed, deferring size change to $str2, staying at $str1" },
)
}