Fix gmail crossfade artifacts.

Display lists could not handle custom views that did their
own draw dispatching, as is the case with gmail. This fix makes that
possible and display lists handle this case robustly. Now the
crossfade works because the display lists contain the right content.

Change-Id: Iea7d6e99239b24f833701d546fe083aa00e2b31b
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index d4efdb6..1313b78 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -2263,13 +2263,14 @@
         boolean scalingRequired = false;
         boolean caching;
         int layerType = child.getLayerType();
-        
+
+        final boolean hardwareAccelerated = canvas.isHardwareAccelerated();
         if ((flags & FLAG_CHILDREN_DRAWN_WITH_CACHE) == FLAG_CHILDREN_DRAWN_WITH_CACHE ||
                 (flags & FLAG_ALWAYS_DRAWN_WITH_CACHE) == FLAG_ALWAYS_DRAWN_WITH_CACHE) {
             caching = true;
             if (mAttachInfo != null) scalingRequired = mAttachInfo.mScalingRequired;
         } else {
-            caching = (layerType != LAYER_TYPE_NONE) || canvas.isHardwareAccelerated();
+            caching = (layerType != LAYER_TYPE_NONE) || hardwareAccelerated;
         }
 
         if (a != null) {
@@ -2351,7 +2352,7 @@
             return more;
         }
 
-        if (canvas.isHardwareAccelerated()) {
+        if (hardwareAccelerated) {
             // Clear INVALIDATED flag to allow invalidation to occur during rendering, but
             // retain the flag's value temporarily in the mRecreateDisplayList flag
             child.mRecreateDisplayList = (child.mPrivateFlags & INVALIDATED) == INVALIDATED;
@@ -2367,7 +2368,7 @@
         Bitmap cache = null;
         boolean hasDisplayList = false;
         if (caching) {
-            if (!canvas.isHardwareAccelerated()) {
+            if (!hardwareAccelerated) {
                 if (layerType != LAYER_TYPE_NONE) {
                     layerType = LAYER_TYPE_SOFTWARE;
                     child.buildDrawingCache(true);
@@ -2506,11 +2507,7 @@
                     }
                 } else {
                     child.mPrivateFlags &= ~DIRTY_MASK;
-                    // Skip drawing the display list into ours if we were just refreshing
-                    // it's content; we already have a reference to it in our display list
-                    if (mRecreateDisplayList || mLayerType != LAYER_TYPE_NONE) {
-                        ((HardwareCanvas) canvas).drawDisplayList(displayList);
-                    }
+                    ((HardwareCanvas) canvas).drawDisplayList(displayList);
                 }
             }
         } else if (cache != null) {
@@ -2536,13 +2533,13 @@
         canvas.restoreToCount(restoreTo);
 
         if (a != null && !more) {
-            if (!canvas.isHardwareAccelerated() && !a.getFillAfter()) {
+            if (!hardwareAccelerated && !a.getFillAfter()) {
                 child.onSetAlpha(255);
             }
             finishAnimatingView(child, a);
         }
 
-        if (more && canvas.isHardwareAccelerated()) {
+        if (more && hardwareAccelerated) {
             // invalidation is the trigger to recreate display lists, so if we're using
             // display lists to render, force an invalidate to allow the animation to
             // continue drawing another frame