Merge "Clear bitmap references from display lists as early as possible Bug #6555840" into jb-dev
diff --git a/core/java/android/view/DisplayList.java b/core/java/android/view/DisplayList.java
index 3dab174..da666b5 100644
--- a/core/java/android/view/DisplayList.java
+++ b/core/java/android/view/DisplayList.java
@@ -83,6 +83,12 @@
     public abstract void invalidate();
 
     /**
+     * Clears additional resources held onto by this display list. You should
+     * only invoke this method after {@link #invalidate()}.
+     */
+    public abstract void clear();
+
+    /**
      * Returns whether the display list is currently usable. If this returns false,
      * the display list should be re-recorded prior to replaying it.
      *
diff --git a/core/java/android/view/GLES20DisplayList.java b/core/java/android/view/GLES20DisplayList.java
index 0154556d..08a5831 100644
--- a/core/java/android/view/GLES20DisplayList.java
+++ b/core/java/android/view/GLES20DisplayList.java
@@ -72,6 +72,13 @@
     }
 
     @Override
+    public void clear() {
+        if (!mValid) {
+            mBitmaps.clear();
+        }
+    }
+
+    @Override
     public boolean isValid() {
         return mValid;
     }
@@ -343,7 +350,6 @@
     private static native void nSetPivotX(int displayList, float pivotX);
     private static native void nSetCaching(int displayList, boolean caching);
     private static native void nSetClipChildren(int displayList, boolean clipChildren);
-    private static native void nSetApplicationScale(int displayList, float scale);
     private static native void nSetAlpha(int displayList, float alpha);
     private static native void nSetHasOverlappingRendering(int displayList,
             boolean hasOverlappingRendering);
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 20eef11..8cb5c85 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -6800,6 +6800,8 @@
      */
     public void dispatchStartTemporaryDetach() {
         clearAccessibilityFocus();
+        clearDisplayList();
+
         onStartTemporaryDetach();
     }
 
@@ -11455,10 +11457,8 @@
             }
             mAttachInfo.mViewRootImpl.cancelInvalidate(this);
         } else {
-            if (mDisplayList != null) {
-                // Should never happen
-                mDisplayList.invalidate();
-            }
+            // Should never happen
+            clearDisplayList();
         }
 
         mCurrentAnimation = null;
@@ -12236,6 +12236,13 @@
         return mDisplayList;
     }
 
+    private void clearDisplayList() {
+        if (mDisplayList != null) {
+            mDisplayList.invalidate();
+            mDisplayList.clear();
+        }
+    }
+
     /**
      * <p>Calling this method is equivalent to calling <code>getDrawingCache(false)</code>.</p>
      *
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index c9a41ad..551b6cc 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -2335,7 +2335,9 @@
         final int count = displayLists.size();
 
         for (int i = 0; i < count; i++) {
-            displayLists.get(i).invalidate();
+            final DisplayList displayList = displayLists.get(i);
+            displayList.invalidate();
+            displayList.clear();
         }
 
         displayLists.clear();