Update layers based on the dirty region.
Bug #3413433

This helps Launcher when a widget updates during a scroll, or when interacting
with widgets on the workspace if layers are still turned on.

Change-Id: Ic7a42eb34f74f4ae988039754f815e2efd1d1e4f
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index d3913dc..393412f 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -73,7 +73,6 @@
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.List;
 import java.util.WeakHashMap;
 
 /**
@@ -2375,6 +2374,7 @@
     })
     int mLayerType = LAYER_TYPE_NONE;
     Paint mLayerPaint;
+    Rect mLocalDirtyRect;
 
     /**
      * Simple constructor to use when creating a view from code.
@@ -8173,7 +8173,9 @@
         }
 
         mLayerType = layerType;
-        mLayerPaint = mLayerType == LAYER_TYPE_NONE ? null : (paint == null ? new Paint() : paint);
+        final boolean layerDisabled = mLayerType == LAYER_TYPE_NONE;
+        mLayerPaint = layerDisabled ? null : (paint == null ? new Paint() : paint);
+        mLocalDirtyRect = layerDisabled ? null : new Rect();
 
         invalidateParentCaches();
         invalidate(true);
@@ -8228,8 +8230,7 @@
             mAttachInfo.mHardwareCanvas = canvas;
             try {
                 canvas.setViewport(width, height);
-                // TODO: We should pass the dirty rect
-                canvas.onPreDraw(null);
+                canvas.onPreDraw(mLocalDirtyRect);
 
                 final int restoreCount = canvas.save();
 
@@ -8251,6 +8252,7 @@
                 canvas.onPostDraw();
                 mHardwareLayer.end(currentCanvas);
                 mAttachInfo.mHardwareCanvas = currentCanvas;
+                mLocalDirtyRect.setEmpty();
             }
         }