OSDN Git Service

Fix status bar background flicker
authorChris Craik <ccraik@google.com>
Thu, 5 May 2016 23:19:22 +0000 (16:19 -0700)
committerChris Craik <ccraik@google.com>
Thu, 5 May 2016 23:22:21 +0000 (16:22 -0700)
Fixes: 28533578

Change-Id: I075f49b7d20e0e95e790a9755d104a0a51575054

core/java/com/android/internal/policy/DecorView.java

index 645ffda..263fae2 100644 (file)
@@ -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;
@@ -258,6 +259,26 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
     }
 
     @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);
         mBackgroundFallback.draw(mContentRoot, c, mWindow.mContentParent);