diff options
author | Vishnu Nair <vishnun@google.com> | 2021-09-27 21:53:00 -0700 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2021-09-30 04:41:14 +0000 |
commit | ea63d134d583cfce03f51b451411fa6772fda118 (patch) | |
tree | 1ba42f85906ca7d5645137fb1d5b6c37cd0fbdee | |
parent | 85c4afc13c2aaed5dcc843f20c98ad6b0a108f54 (diff) | |
download | base-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.java | 16 |
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; } |