summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Vishnu Nair <vishnun@google.com> 2021-09-27 21:53:00 -0700
committer Vishnu Nair <vishnun@google.com> 2021-09-29 01:58:52 +0000
commit135c7f4c88e9f71273290e3c37dbcb18bdcfa0b2 (patch)
treee0d914aefd4e044780fc574ab5a786f13e277a0d
parent6e3c154990daad8c2aeda6cb429e138705a00f69 (diff)
ViewRootImpl: Update opaque flag if SurfaceControl changes from relayout
The opaque flag is necessary for the compositor to blend the layers correctly and prevent translucent pixels from showing the layer underneath during animations. Test: manually punch holes in apps and verify opaque apps don't show the layer underneath Test: automated tests to follow Bug: 198924563 Change-Id: I1116c51b2efd4e9c0fe2acbca080291f3950245c (cherry picked from commit f0ae9acf3644a4669b7a9a10eadad3168035ff3e)
-rw-r--r--core/java/android/view/ViewRootImpl.java16
1 files changed, 10 insertions, 6 deletions
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 3550a31f9038..93138e593646 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -2836,8 +2836,13 @@ public final class ViewRootImpl implements ViewParent,
}
}
+ final boolean surfaceControlChanged =
+ (relayoutResult & RELAYOUT_RES_SURFACE_CHANGED)
+ == RELAYOUT_RES_SURFACE_CHANGED;
+
if (mSurfaceControl.isValid()) {
- updateOpacity(mWindowAttributes, dragResizing);
+ updateOpacity(mWindowAttributes, dragResizing,
+ surfaceControlChanged /*forceUpdate */);
}
if (DEBUG_LAYOUT) Log.v(mTag, "relayout: frame=" + frame.toShortString()
@@ -2872,9 +2877,7 @@ public final class ViewRootImpl implements ViewParent,
// RELAYOUT_RES_SURFACE_CHANGED since it should indicate that WMS created a new
// SurfaceControl.
surfaceReplaced = (surfaceGenerationId != mSurface.getGenerationId()
- || (relayoutResult & RELAYOUT_RES_SURFACE_CHANGED)
- == RELAYOUT_RES_SURFACE_CHANGED)
- && mSurface.isValid();
+ || surfaceControlChanged) && mSurface.isValid();
if (surfaceReplaced) {
mSurfaceSequenceId++;
}
@@ -7824,7 +7827,8 @@ public final class ViewRootImpl implements ViewParent,
return relayoutResult;
}
- private void updateOpacity(WindowManager.LayoutParams params, boolean dragResizing) {
+ private void updateOpacity(WindowManager.LayoutParams params, boolean dragResizing,
+ boolean forceUpdate) {
boolean opaque = false;
if (!PixelFormat.formatHasAlpha(params.format)
@@ -7840,7 +7844,7 @@ public final class ViewRootImpl implements ViewParent,
opaque = true;
}
- if (mIsSurfaceOpaque == opaque) {
+ if (!forceUpdate && mIsSurfaceOpaque == opaque) {
return;
}