Improve hardware layers rendering speed when setting a View's alpha.

Change-Id: Ib1275677f531c60d9919978c5538c663fdb823b5
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index f05ef8c..53fc0c0 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -7905,7 +7905,16 @@
                     + "LAYER_TYPE_SOFTWARE or LAYER_TYPE_HARDWARE");
         }
         
-        if (layerType == mLayerType) return;
+        if (layerType == mLayerType) {
+            if (layerType != LAYER_TYPE_NONE && paint != mLayerPaint) {
+                mLayerPaint = paint == null ? new Paint() : paint;
+                if (mParent instanceof ViewGroup) {
+                    ((ViewGroup) mParent).invalidate();
+                }
+                invalidate();
+            }
+            return;
+        }
 
         // Destroy any previous software drawing cache if needed
         switch (mLayerType) {
@@ -7931,9 +7940,11 @@
         }
 
         mLayerType = layerType;
-        mLayerPaint = mLayerType == LAYER_TYPE_NONE ? null : paint;
+        mLayerPaint = mLayerType == LAYER_TYPE_NONE ? null : (paint == null ? new Paint() : paint);
 
-        // TODO: Make sure we invalidate the parent's display list
+        if (mParent instanceof ViewGroup) {
+            ((ViewGroup) mParent).invalidate();
+        }
         invalidate();
     }
 
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index f6b6778..d1781cc 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -2398,16 +2398,15 @@
                                 layerType != LAYER_TYPE_NONE) {
                             layerFlags |= Canvas.CLIP_TO_LAYER_SAVE_FLAG;
                         }
-                        if (layerType != LAYER_TYPE_NONE && child.mLayerPaint != null) {
+                        if (layerType != LAYER_TYPE_NONE) {
                             child.mLayerPaint.setAlpha(multipliedAlpha);
                         } else {
                             canvas.saveLayerAlpha(sx, sy, sx + cr - cl, sy + cb - ct,
                                     multipliedAlpha, layerFlags);
-                            layerSaved = true;
                         }
                     } else {
                         // Alpha is handled by the child directly, clobber the layer's alpha
-                        if (layerType != LAYER_TYPE_NONE && child.mLayerPaint != null) {
+                        if (layerType != LAYER_TYPE_NONE) {
                             child.mLayerPaint.setAlpha(255);
                         }
                         child.mPrivateFlags |= ALPHA_SET;
@@ -2433,7 +2432,7 @@
 
         if (hasNoCache) {
             boolean layerRendered = false;
-            if (!layerSaved && layerType == LAYER_TYPE_HARDWARE) {
+            if (layerType == LAYER_TYPE_HARDWARE) {
                 final HardwareLayer layer = child.getHardwareLayer(canvas);
                 if (layer != null && layer.isValid()) {
                     ((HardwareCanvas) canvas).drawHardwareLayer(layer, 0, 0, child.mLayerPaint);
@@ -2465,7 +2464,7 @@
             child.mPrivateFlags &= ~DIRTY_MASK;
             Paint cachePaint;
 
-            if (layerType == LAYER_TYPE_NONE || child.mLayerPaint == null) {
+            if (layerType == LAYER_TYPE_NONE) {
                 cachePaint = mCachePaint;
                 if (alpha < 1.0f) {
                     cachePaint.setAlpha((int) (alpha * 255));
@@ -2476,9 +2475,7 @@
                 }
             } else {
                 cachePaint = child.mLayerPaint;
-                if (alpha < 1.0f) {
-                    cachePaint.setAlpha((int) (alpha * 255));
-                }
+                cachePaint.setAlpha((int) (alpha * 255));
             }
             canvas.drawBitmap(cache, 0.0f, 0.0f, cachePaint);
         }
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity2.java b/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity2.java
index a0b1d78..e795f02 100644
--- a/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity2.java
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity2.java
@@ -38,6 +38,8 @@
         setupList(R.id.list1);
         setupList(R.id.list2);
         setupList(R.id.list3);
+        
+        findViewById(R.id.list1).setAlpha(0.7f);
     }
 
     private void setupList(int listId) {