Merge "Fixed screendecorations flickering while resolution change" into tm-d1-dev
This commit is contained in:
@@ -5395,7 +5395,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
|
|||||||
SurfaceControl[] findRoundedCornerOverlays() {
|
SurfaceControl[] findRoundedCornerOverlays() {
|
||||||
List<SurfaceControl> roundedCornerOverlays = new ArrayList<>();
|
List<SurfaceControl> roundedCornerOverlays = new ArrayList<>();
|
||||||
for (WindowToken token : mTokenMap.values()) {
|
for (WindowToken token : mTokenMap.values()) {
|
||||||
if (token.mRoundedCornerOverlay) {
|
if (token.mRoundedCornerOverlay && token.isVisible()) {
|
||||||
roundedCornerOverlays.add(token.mSurfaceControl);
|
roundedCornerOverlays.add(token.mSurfaceControl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -102,6 +102,7 @@ class ScreenRotationAnimation {
|
|||||||
private SurfaceControl mEnterBlackFrameLayer;
|
private SurfaceControl mEnterBlackFrameLayer;
|
||||||
/** This layer contains the actual screenshot that is to be faded out. */
|
/** This layer contains the actual screenshot that is to be faded out. */
|
||||||
private SurfaceControl mScreenshotLayer;
|
private SurfaceControl mScreenshotLayer;
|
||||||
|
private SurfaceControl[] mRoundedCornerOverlay;
|
||||||
/**
|
/**
|
||||||
* Only used for screen rotation and not custom animations. Layered behind all other layers
|
* Only used for screen rotation and not custom animations. Layered behind all other layers
|
||||||
* to avoid showing any "empty" spots
|
* to avoid showing any "empty" spots
|
||||||
@@ -151,6 +152,11 @@ class ScreenRotationAnimation {
|
|||||||
final boolean flipped = delta == Surface.ROTATION_90 || delta == Surface.ROTATION_270;
|
final boolean flipped = delta == Surface.ROTATION_90 || delta == Surface.ROTATION_270;
|
||||||
mOriginalWidth = flipped ? height : width;
|
mOriginalWidth = flipped ? height : width;
|
||||||
mOriginalHeight = flipped ? width : height;
|
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();
|
mSurfaceRotationAnimationController = new SurfaceRotationAnimationController();
|
||||||
|
|
||||||
// Check whether the current screen contains any secure content.
|
// Check whether the current screen contains any secure content.
|
||||||
@@ -159,18 +165,23 @@ class ScreenRotationAnimation {
|
|||||||
final SurfaceControl.Transaction t = mService.mTransactionFactory.get();
|
final SurfaceControl.Transaction t = mService.mTransactionFactory.get();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
SurfaceControl.LayerCaptureArgs args =
|
SurfaceControl.LayerCaptureArgs.Builder builder =
|
||||||
new SurfaceControl.LayerCaptureArgs.Builder(displayContent.getSurfaceControl())
|
new SurfaceControl.LayerCaptureArgs.Builder(displayContent.getSurfaceControl())
|
||||||
.setCaptureSecureLayers(true)
|
.setCaptureSecureLayers(true)
|
||||||
.setAllowProtected(true)
|
.setAllowProtected(true)
|
||||||
.setSourceCrop(new Rect(0, 0, width, height))
|
.setSourceCrop(new Rect(0, 0, width, height));
|
||||||
// Exclude rounded corner overlay from screenshot buffer. Rounded
|
|
||||||
// corner overlay windows are un-rotated during rotation animation
|
if (isSizeChanged) {
|
||||||
// for a seamless transition.
|
mRoundedCornerOverlay = displayContent.findRoundedCornerOverlays();
|
||||||
.setExcludeLayers(displayContent.findRoundedCornerOverlays())
|
} else {
|
||||||
.build();
|
// 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.ScreenshotHardwareBuffer screenshotBuffer =
|
||||||
SurfaceControl.captureLayers(args);
|
SurfaceControl.captureLayers(builder.build());
|
||||||
if (screenshotBuffer == null) {
|
if (screenshotBuffer == null) {
|
||||||
Slog.w(TAG, "Unable to take screenshot of display " + displayId);
|
Slog.w(TAG, "Unable to take screenshot of display " + displayId);
|
||||||
return;
|
return;
|
||||||
@@ -232,6 +243,14 @@ class ScreenRotationAnimation {
|
|||||||
t.show(mScreenshotLayer);
|
t.show(mScreenshotLayer);
|
||||||
t.show(mBackColorSurface);
|
t.show(mBackColorSurface);
|
||||||
|
|
||||||
|
if (mRoundedCornerOverlay != null) {
|
||||||
|
for (SurfaceControl sc : mRoundedCornerOverlay) {
|
||||||
|
if (sc.isValid()) {
|
||||||
|
t.hide(sc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} catch (OutOfResourcesException e) {
|
} catch (OutOfResourcesException e) {
|
||||||
Slog.w(TAG, "Unable to allocate freeze surface", 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
|
// 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
|
// are merged to global transaction, so it can be synced with display change when calling
|
||||||
// DisplayManagerInternal#performTraversal(transaction).
|
// DisplayManagerInternal#performTraversal(transaction).
|
||||||
final int logicalWidth = displayInfo.logicalWidth;
|
if (mScreenshotLayer != null && isSizeChanged) {
|
||||||
final int logicalHeight = displayInfo.logicalHeight;
|
|
||||||
if (logicalWidth > mOriginalWidth == logicalHeight > mOriginalHeight
|
|
||||||
&& (logicalWidth != mOriginalWidth || logicalHeight != mOriginalHeight)) {
|
|
||||||
displayContent.getPendingTransaction().setGeometry(mScreenshotLayer,
|
displayContent.getPendingTransaction().setGeometry(mScreenshotLayer,
|
||||||
new Rect(0, 0, mOriginalWidth, mOriginalHeight),
|
new Rect(0, 0, mOriginalWidth, mOriginalHeight),
|
||||||
new Rect(0, 0, logicalWidth, logicalHeight), Surface.ROTATION_0);
|
new Rect(0, 0, logicalWidth, logicalHeight), Surface.ROTATION_0);
|
||||||
@@ -472,6 +488,14 @@ class ScreenRotationAnimation {
|
|||||||
}
|
}
|
||||||
mBackColorSurface = null;
|
mBackColorSurface = null;
|
||||||
}
|
}
|
||||||
|
if (mRoundedCornerOverlay != null) {
|
||||||
|
for (SurfaceControl sc : mRoundedCornerOverlay) {
|
||||||
|
if (sc.isValid()) {
|
||||||
|
t.show(sc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mRoundedCornerOverlay = null;
|
||||||
|
}
|
||||||
t.apply();
|
t.apply();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user