Merge "Mutate scroll bar drawables" into lmp-mr1-dev
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 6928b2c..e4a8978 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -12872,7 +12872,7 @@
                         Interpolator.Result.FREEZE_END) {
                     cache.state = ScrollabilityCache.OFF;
                 } else {
-                    cache.scrollBar.setAlpha(Math.round(values[0]));
+                    cache.scrollBar.mutate().setAlpha(Math.round(values[0]));
                 }
 
                 // This will make the scroll bars inval themselves after
@@ -12882,7 +12882,7 @@
             } else {
                 // We're just on -- but we may have been fading before so
                 // reset alpha
-                cache.scrollBar.setAlpha(255);
+                cache.scrollBar.mutate().setAlpha(255);
             }
 
 
diff --git a/core/java/android/widget/ScrollBarDrawable.java b/core/java/android/widget/ScrollBarDrawable.java
index 10e9ff4..8eff1aa 100644
--- a/core/java/android/widget/ScrollBarDrawable.java
+++ b/core/java/android/widget/ScrollBarDrawable.java
@@ -44,6 +44,7 @@
     private final Rect mTempBounds = new Rect();
     private boolean mAlwaysDrawHorizontalTrack;
     private boolean mAlwaysDrawVerticalTrack;
+    private boolean mMutated;
 
     public ScrollBarDrawable() {
     }
@@ -191,6 +192,9 @@
 
     public void setVerticalThumbDrawable(Drawable thumb) {
         if (thumb != null) {
+            if (mMutated) {
+                thumb.mutate();
+            }
             thumb.setState(STATE_ENABLED);
             mVerticalThumb = thumb;
         }
@@ -198,6 +202,9 @@
 
     public void setVerticalTrackDrawable(Drawable track) {
         if (track != null) {
+            if (mMutated) {
+                track.mutate();
+            }
             track.setState(STATE_ENABLED);
         }
         mVerticalTrack = track;
@@ -205,6 +212,9 @@
 
     public void setHorizontalThumbDrawable(Drawable thumb) {
         if (thumb != null) {
+            if (mMutated) {
+                thumb.mutate();
+            }
             thumb.setState(STATE_ENABLED);
             mHorizontalThumb = thumb;
         }
@@ -212,6 +222,9 @@
 
     public void setHorizontalTrackDrawable(Drawable track) {
         if (track != null) {
+            if (mMutated) {
+                track.mutate();
+            }
             track.setState(STATE_ENABLED);
         }
         mHorizontalTrack = track;
@@ -228,6 +241,26 @@
     }
 
     @Override
+    public ScrollBarDrawable mutate() {
+        if (!mMutated && super.mutate() == this) {
+            if (mVerticalTrack != null) {
+                mVerticalTrack.mutate();
+            }
+            if (mVerticalThumb != null) {
+                mVerticalThumb.mutate();
+            }
+            if (mHorizontalTrack != null) {
+                mHorizontalTrack.mutate();
+            }
+            if (mHorizontalThumb != null) {
+                mHorizontalThumb.mutate();
+            }
+            mMutated = true;
+        }
+        return this;
+    }
+
+    @Override
     public void setAlpha(int alpha) {
         if (mVerticalTrack != null) {
             mVerticalTrack.setAlpha(alpha);