From 867b812effbd8b24b60f4feb0188032c6cc8dfa5 Mon Sep 17 00:00:00 2001 From: Chris Craik Date: Thu, 5 May 2016 16:19:22 -0700 Subject: [PATCH] Fix status bar background flicker Fixes: 28533578 Change-Id: I075f49b7d20e0e95e790a9755d104a0a51575054 --- .../android/internal/policy/DecorView.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java index 645ffda2cff59..263fae2e69aff 100644 --- a/core/java/com/android/internal/policy/DecorView.java +++ b/core/java/com/android/internal/policy/DecorView.java @@ -43,6 +43,7 @@ import android.graphics.LinearGradient; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.Rect; +import android.graphics.Region; import android.graphics.Shader; import android.graphics.drawable.Drawable; import android.os.RemoteException; @@ -257,6 +258,26 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind setWillNotDraw(getBackground() == null && !mBackgroundFallback.hasFallback()); } + @Override + public boolean gatherTransparentRegion(Region region) { + boolean statusOpaque = gatherTransparentRegion(mStatusColorViewState, region); + boolean navOpaque = gatherTransparentRegion(mNavigationColorViewState, region); + boolean decorOpaque = super.gatherTransparentRegion(region); + + // combine bools after computation, so each method above always executes + return statusOpaque || navOpaque || decorOpaque; + } + + boolean gatherTransparentRegion(ColorViewState colorViewState, Region region) { + if (colorViewState.view != null && colorViewState.visible && isResizing()) { + // If a visible ColorViewState is in a resizing host DecorView, forcibly register its + // opaque area, since it's drawn by a different root RenderNode. It would otherwise be + // rejected by ViewGroup#gatherTransparentRegion() for the view not being VISIBLE. + return colorViewState.view.gatherTransparentRegion(region); + } + return false; // no opaque area added + } + @Override public void onDraw(Canvas c) { super.onDraw(c);