summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVishnu Nair <vishnun@google.com>2021-09-27 21:53:00 -0700
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2021-09-30 04:41:14 +0000
commitea63d134d583cfce03f51b451411fa6772fda118 (patch)
tree1ba42f85906ca7d5645137fb1d5b6c37cd0fbdee
parent85c4afc13c2aaed5dcc843f20c98ad6b0a108f54 (diff)
downloadbase-ea63d134d583cfce03f51b451411fa6772fda118.tar.gz
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) (cherry picked from commit 135c7f4c88e9f71273290e3c37dbcb18bdcfa0b2)
-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;
}