Merge "Improve ImageView drawable re-use" into mnc-dev
diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java
index a1e6cc8..e13b96f 100644
--- a/core/java/android/widget/ImageView.java
+++ b/core/java/android/widget/ImageView.java
@@ -91,6 +91,7 @@
     private boolean mColorMod = false;
 
     private Drawable mDrawable = null;
+    private ImageViewBitmapDrawable mRecycleableBitmapDrawable = null;
     private ColorStateList mDrawableTintList = null;
     private PorterDuff.Mode mDrawableTintMode = null;
     private boolean mHasDrawableTint = false;
@@ -588,18 +589,16 @@
      */
     @android.view.RemotableViewMethod
     public void setImageBitmap(Bitmap bm) {
-        // if this is used frequently, may handle bitmaps explicitly
-        // to reduce the intermediate drawable object
-        if (mDrawable instanceof ImageViewBitmapDrawable) {
-            ImageViewBitmapDrawable recycledDrawable = (ImageViewBitmapDrawable) mDrawable;
-            // Hacky fix to force setImageDrawable to do a full setImageDrawable
-            // instead of doing an object reference comparison
-            mDrawable = null;
-            recycledDrawable.setBitmap(bm);
-            setImageDrawable(recycledDrawable);
+        // Hacky fix to force setImageDrawable to do a full setImageDrawable
+        // instead of doing an object reference comparison
+        mDrawable = null;
+        if (mRecycleableBitmapDrawable == null) {
+            mRecycleableBitmapDrawable = new ImageViewBitmapDrawable(
+                    mContext.getResources(), bm);
         } else {
-            setImageDrawable(new ImageViewBitmapDrawable(mContext.getResources(), bm));
+            mRecycleableBitmapDrawable.setBitmap(bm);
         }
+        setImageDrawable(mRecycleableBitmapDrawable);
     }
 
     public void setImageState(int[] state, boolean merge) {
@@ -868,6 +867,10 @@
     }
 
     private void updateDrawable(Drawable d) {
+        if (d != mRecycleableBitmapDrawable && mRecycleableBitmapDrawable != null) {
+            mRecycleableBitmapDrawable.setBitmap(null);
+        }
+
         if (mDrawable != null) {
             mDrawable.setCallback(null);
             unscheduleDrawable(mDrawable);