Invalidate when Drawable.setState() returns true
Ensures views that manage drawables follow the contract set forth in
the Drawable.setState() documentation.
Bug: 23792020
Change-Id: I4e5a449cd6535487873fd8443da50555c38e8ed9
diff --git a/core/java/android/widget/Switch.java b/core/java/android/widget/Switch.java
index 9319af0..6f3a711 100644
--- a/core/java/android/widget/Switch.java
+++ b/core/java/android/widget/Switch.java
@@ -1339,17 +1339,22 @@
protected void drawableStateChanged() {
super.drawableStateChanged();
- final int[] myDrawableState = getDrawableState();
+ final int[] state = getDrawableState();
+ boolean changed = false;
- if (mThumbDrawable != null) {
- mThumbDrawable.setState(myDrawableState);
+ final Drawable thumbDrawable = mThumbDrawable;
+ if (thumbDrawable != null && thumbDrawable.isStateful()) {
+ changed |= thumbDrawable.setState(state);
}
- if (mTrackDrawable != null) {
- mTrackDrawable.setState(myDrawableState);
+ final Drawable trackDrawable = mTrackDrawable;
+ if (trackDrawable != null && trackDrawable.isStateful()) {
+ changed |= trackDrawable.setState(state);
}
- invalidate();
+ if (changed) {
+ invalidate();
+ }
}
@Override