summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Shawn Lin <shawnlin@google.com> 2022-06-20 02:59:19 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-06-20 02:59:19 +0000
commite7b5fa88acd39bde9378d0ba82be108fdbe4d6c2 (patch)
tree6681afa5708802e65fb4ab1bff4e743b19ce38ec
parentba9b6ebadb50383433c81544a1b013178628553e (diff)
parent069ff5c01cbca25c332767077d95b708753e7bae (diff)
Merge "Fixed screendecorations flickering while resolution change" into tm-d1-dev
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java2
-rw-r--r--services/core/java/com/android/server/wm/ScreenRotationAnimation.java48
2 files changed, 37 insertions, 13 deletions
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 98c5d512be0e..4b3729de2535 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -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);
}
}
diff --git a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
index 2ef19321d958..f80e732c8212 100644
--- a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
+++ b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
@@ -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();
}