Merge "Fixed screendecorations flickering while resolution change" into tm-d1-dev

This commit is contained in:
Shawn Lin
2022-06-20 02:59:19 +00:00
committed by Android (Google) Code Review
2 changed files with 37 additions and 13 deletions

View File

@@ -5395,7 +5395,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
SurfaceControl[] findRoundedCornerOverlays() {
List<SurfaceControl> roundedCornerOverlays = new ArrayList<>();
for (WindowToken token : mTokenMap.values()) {
if (token.mRoundedCornerOverlay) {
if (token.mRoundedCornerOverlay && token.isVisible()) {
roundedCornerOverlays.add(token.mSurfaceControl);
}
}

View File

@@ -102,6 +102,7 @@ class ScreenRotationAnimation {
private SurfaceControl mEnterBlackFrameLayer;
/** This layer contains the actual screenshot that is to be faded out. */
private SurfaceControl mScreenshotLayer;
private SurfaceControl[] mRoundedCornerOverlay;
/**
* Only used for screen rotation and not custom animations. Layered behind all other layers
* to avoid showing any "empty" spots
@@ -151,6 +152,11 @@ class ScreenRotationAnimation {
final boolean flipped = delta == Surface.ROTATION_90 || delta == Surface.ROTATION_270;
mOriginalWidth = flipped ? height : width;
mOriginalHeight = flipped ? width : height;
final int logicalWidth = displayInfo.logicalWidth;
final int logicalHeight = displayInfo.logicalHeight;
final boolean isSizeChanged =
logicalWidth > mOriginalWidth == logicalHeight > mOriginalHeight
&& (logicalWidth != mOriginalWidth || logicalHeight != mOriginalHeight);
mSurfaceRotationAnimationController = new SurfaceRotationAnimationController();
// Check whether the current screen contains any secure content.
@@ -159,18 +165,23 @@ class ScreenRotationAnimation {
final SurfaceControl.Transaction t = mService.mTransactionFactory.get();
try {
SurfaceControl.LayerCaptureArgs args =
SurfaceControl.LayerCaptureArgs.Builder builder =
new SurfaceControl.LayerCaptureArgs.Builder(displayContent.getSurfaceControl())
.setCaptureSecureLayers(true)
.setAllowProtected(true)
.setSourceCrop(new Rect(0, 0, width, height))
// Exclude rounded corner overlay from screenshot buffer. Rounded
// corner overlay windows are un-rotated during rotation animation
// for a seamless transition.
.setExcludeLayers(displayContent.findRoundedCornerOverlays())
.build();
.setSourceCrop(new Rect(0, 0, width, height));
if (isSizeChanged) {
mRoundedCornerOverlay = displayContent.findRoundedCornerOverlays();
} else {
// Exclude rounded corner overlay from screenshot buffer. Rounded
// corner overlay windows are un-rotated during rotation animation
// for a seamless transition.
builder.setExcludeLayers(displayContent.findRoundedCornerOverlays());
}
SurfaceControl.ScreenshotHardwareBuffer screenshotBuffer =
SurfaceControl.captureLayers(args);
SurfaceControl.captureLayers(builder.build());
if (screenshotBuffer == null) {
Slog.w(TAG, "Unable to take screenshot of display " + displayId);
return;
@@ -232,6 +243,14 @@ class ScreenRotationAnimation {
t.show(mScreenshotLayer);
t.show(mBackColorSurface);
if (mRoundedCornerOverlay != null) {
for (SurfaceControl sc : mRoundedCornerOverlay) {
if (sc.isValid()) {
t.hide(sc);
}
}
}
} catch (OutOfResourcesException e) {
Slog.w(TAG, "Unable to allocate freeze surface", e);
}
@@ -240,10 +259,7 @@ class ScreenRotationAnimation {
// the new logical display size. Currently pending transaction and RWC#mDisplayTransaction
// are merged to global transaction, so it can be synced with display change when calling
// DisplayManagerInternal#performTraversal(transaction).
final int logicalWidth = displayInfo.logicalWidth;
final int logicalHeight = displayInfo.logicalHeight;
if (logicalWidth > mOriginalWidth == logicalHeight > mOriginalHeight
&& (logicalWidth != mOriginalWidth || logicalHeight != mOriginalHeight)) {
if (mScreenshotLayer != null && isSizeChanged) {
displayContent.getPendingTransaction().setGeometry(mScreenshotLayer,
new Rect(0, 0, mOriginalWidth, mOriginalHeight),
new Rect(0, 0, logicalWidth, logicalHeight), Surface.ROTATION_0);
@@ -472,6 +488,14 @@ class ScreenRotationAnimation {
}
mBackColorSurface = null;
}
if (mRoundedCornerOverlay != null) {
for (SurfaceControl sc : mRoundedCornerOverlay) {
if (sc.isValid()) {
t.show(sc);
}
}
mRoundedCornerOverlay = null;
}
t.apply();
}