Improve export to bitmap layers for HierarchyViewer.

- Do not show layers with an invisible parent
- Correctly draw extras from dispatchDraw() (ListView's dividers for instance)

Change-Id: Id2e24ae9d52879290dffbf1cc446c5eda9522fbb
diff --git a/core/java/android/view/ViewDebug.java b/core/java/android/view/ViewDebug.java
index 2b5489c..d2563a8 100644
--- a/core/java/android/view/ViewDebug.java
+++ b/core/java/android/view/ViewDebug.java
@@ -1040,7 +1040,7 @@
             clientStream.writeInt(outRect.width());
             clientStream.writeInt(outRect.height());
     
-            captureViewLayer(root, clientStream);
+            captureViewLayer(root, clientStream, true);
             
             clientStream.write(2);
         } finally {
@@ -1048,9 +1048,11 @@
         }
     }
 
-    private static void captureViewLayer(View view, DataOutputStream clientStream)
+    private static void captureViewLayer(View view, DataOutputStream clientStream, boolean visible)
             throws IOException {
 
+        final boolean localVisible = view.getVisibility() == View.VISIBLE && visible;
+
         if ((view.mPrivateFlags & View.SKIP_DRAW) != View.SKIP_DRAW) {
             final int id = view.getId();
             String name = view.getClass().getSimpleName();
@@ -1060,7 +1062,7 @@
     
             clientStream.write(1);
             clientStream.writeUTF(name);
-            clientStream.writeByte(view.getVisibility() == View.VISIBLE ? 1 : 0);
+            clientStream.writeByte(localVisible ? 1 : 0);
     
             int[] position = new int[2];
             // XXX: Should happen on the UI thread
@@ -1086,7 +1088,7 @@
             int count = group.getChildCount();
 
             for (int i = 0; i < count; i++) {
-                captureViewLayer(group.getChildAt(i), clientStream);
+                captureViewLayer(group.getChildAt(i), clientStream, localVisible);
             }
         }
     }
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 597d583..006aff8 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -1274,13 +1274,27 @@
 
     @Override
     Bitmap createSnapshot(Bitmap.Config quality, int backgroundColor, boolean skipChildren) {
-        int oldCount = mChildrenCount;
+        int count = mChildrenCount;
+        int[] visibilities = null;
+
         if (skipChildren) {
-            mChildrenCount = 0;
+            visibilities = new int[count];
+            for (int i = 0; i < count; i++) {
+                View child = getChildAt(i);
+                visibilities[i] = child.getVisibility();
+                if (visibilities[i] == View.VISIBLE) {
+                    child.setVisibility(INVISIBLE);
+                }
+            }
         }
 
         Bitmap b = super.createSnapshot(quality, backgroundColor, skipChildren);
-        mChildrenCount = oldCount;
+
+        if (skipChildren) {
+            for (int i = 0; i < count; i++) {
+                getChildAt(i).setVisibility(visibilities[i]);
+            }        
+        }
 
         return b;
     }