summaryrefslogtreecommitdiffstats
path: root/core/java/android/widget/Switch.java
diff options
context:
space:
mode:
authorAlan Viverette <alanv@google.com>2014-07-11 15:28:38 -0700
committerAlan Viverette <alanv@google.com>2014-07-11 23:03:52 +0000
commit4d065a04ce42c07569cf20651c949c4da97aa4a9 (patch)
tree71d187079bea22dbba1cf79ca918fa5108bb3923 /core/java/android/widget/Switch.java
parenta4fa3b5aa53cf677b623fe346c585cb8a0c1ce26 (diff)
downloadframeworks_base-4d065a04ce42c07569cf20651c949c4da97aa4a9.zip
frameworks_base-4d065a04ce42c07569cf20651c949c4da97aa4a9.tar.gz
frameworks_base-4d065a04ce42c07569cf20651c949c4da97aa4a9.tar.bz2
Remove old listener when rebinding SwitchPreference
Also fixes switch animation during scrolling, unnecessary call to requestLayout() on drawable invalidate, and potential NPE. BUG: 16225972 BUG: 4312303 Change-Id: I015d1f03206dd2c812592b0abfa4214a3de73d3f
Diffstat (limited to 'core/java/android/widget/Switch.java')
-rw-r--r--core/java/android/widget/Switch.java156
1 files changed, 96 insertions, 60 deletions
diff --git a/core/java/android/widget/Switch.java b/core/java/android/widget/Switch.java
index 9a8380d..497cf10 100644
--- a/core/java/android/widget/Switch.java
+++ b/core/java/android/widget/Switch.java
@@ -568,22 +568,38 @@ public class Switch extends CompoundButton {
}
}
- mTrackDrawable.getPadding(mTempRect);
+ final int trackHeight;
+ final Rect padding = mTempRect;
+ if (mTrackDrawable != null) {
+ mTrackDrawable.getPadding(padding);
+ trackHeight = mTrackDrawable.getIntrinsicHeight();
+ } else {
+ padding.setEmpty();
+ trackHeight = 0;
+ }
+
+ final int thumbWidth;
+ final int thumbHeight;
+ if (mThumbDrawable != null) {
+ thumbWidth = mThumbDrawable.getIntrinsicWidth();
+ thumbHeight = mThumbDrawable.getIntrinsicHeight();
+ } else {
+ thumbWidth = 0;
+ thumbHeight = 0;
+ }
final int maxTextWidth = mShowText ? Math.max(mOnLayout.getWidth(), mOffLayout.getWidth())
+ mThumbTextPadding * 2 : 0;
- mThumbWidth = Math.max(maxTextWidth, mThumbDrawable.getIntrinsicWidth());
+ mThumbWidth = Math.max(maxTextWidth, thumbWidth);
final int switchWidth = Math.max(mSwitchMinWidth,
- 2 * mThumbWidth + mTempRect.left + mTempRect.right);
- final int switchHeight = Math.max(mTrackDrawable.getIntrinsicHeight(),
- mThumbDrawable.getIntrinsicHeight());
-
-
+ 2 * mThumbWidth + padding.left + padding.right);
+ final int switchHeight = Math.max(trackHeight, thumbHeight);
mSwitchWidth = switchWidth;
mSwitchHeight = switchHeight;
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
final int measuredHeight = getMeasuredHeight();
if (measuredHeight < switchHeight) {
setMeasuredDimension(getMeasuredWidthAndState(), switchHeight);
@@ -830,32 +846,34 @@ public class Switch extends CompoundButton {
@Override
public void draw(Canvas c) {
- final Rect tempRect = mTempRect;
- final Drawable trackDrawable = mTrackDrawable;
- final Drawable thumbDrawable = mThumbDrawable;
+ final Rect padding = mTempRect;
// Layout the track.
final int switchLeft = mSwitchLeft;
final int switchTop = mSwitchTop;
final int switchRight = mSwitchRight;
final int switchBottom = mSwitchBottom;
- trackDrawable.setBounds(switchLeft, switchTop, switchRight, switchBottom);
- trackDrawable.getPadding(tempRect);
+ if (mTrackDrawable != null) {
+ mTrackDrawable.setBounds(switchLeft, switchTop, switchRight, switchBottom);
+ mTrackDrawable.getPadding(padding);
+ }
- final int switchInnerLeft = switchLeft + tempRect.left;
+ final int switchInnerLeft = switchLeft + padding.left;
// Relies on mTempRect, MUST be called first!
final int thumbPos = getThumbOffset();
// Layout the thumb.
- thumbDrawable.getPadding(tempRect);
- final int thumbLeft = switchInnerLeft - tempRect.left + thumbPos;
- final int thumbRight = switchInnerLeft + thumbPos + mThumbWidth + tempRect.right;
- thumbDrawable.setBounds(thumbLeft, switchTop, thumbRight, switchBottom);
-
- final Drawable background = getBackground();
- if (background != null) {
- background.setHotspotBounds(thumbLeft, switchTop, thumbRight, switchBottom);
+ if (mThumbDrawable != null) {
+ mThumbDrawable.getPadding(padding);
+ final int thumbLeft = switchInnerLeft - padding.left + thumbPos;
+ final int thumbRight = switchInnerLeft + thumbPos + mThumbWidth + padding.right;
+ mThumbDrawable.setBounds(thumbLeft, switchTop, thumbRight, switchBottom);
+
+ final Drawable background = getBackground();
+ if (background != null) {
+ background.setHotspotBounds(thumbLeft, switchTop, thumbRight, switchBottom);
+ }
}
// Draw the background.
@@ -866,35 +884,44 @@ public class Switch extends CompoundButton {
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
- final Rect tempRect = mTempRect;
+ final Rect padding = mTempRect;
final Drawable trackDrawable = mTrackDrawable;
- final Drawable thumbDrawable = mThumbDrawable;
- trackDrawable.getPadding(tempRect);
+ if (trackDrawable != null) {
+ trackDrawable.getPadding(padding);
+ } else {
+ padding.setEmpty();
+ }
final int switchTop = mSwitchTop;
final int switchBottom = mSwitchBottom;
- final int switchInnerLeft = mSwitchLeft + tempRect.left;
- final int switchInnerTop = switchTop + tempRect.top;
- final int switchInnerRight = mSwitchRight - tempRect.right;
- final int switchInnerBottom = switchBottom - tempRect.bottom;
-
- if (mSplitTrack) {
- final Insets insets = thumbDrawable.getOpticalInsets();
- thumbDrawable.copyBounds(tempRect);
- tempRect.left += insets.left;
- tempRect.right -= insets.right;
-
- final int saveCount = canvas.save();
- canvas.clipRect(tempRect, Op.DIFFERENCE);
- trackDrawable.draw(canvas);
- canvas.restoreToCount(saveCount);
- } else {
- trackDrawable.draw(canvas);
+ final int switchInnerLeft = mSwitchLeft + padding.left;
+ final int switchInnerTop = switchTop + padding.top;
+ final int switchInnerRight = mSwitchRight - padding.right;
+ final int switchInnerBottom = switchBottom - padding.bottom;
+
+ final Drawable thumbDrawable = mThumbDrawable;
+ if (trackDrawable != null) {
+ if (mSplitTrack && thumbDrawable != null) {
+ final Insets insets = thumbDrawable.getOpticalInsets();
+ thumbDrawable.copyBounds(padding);
+ padding.left += insets.left;
+ padding.right -= insets.right;
+
+ final int saveCount = canvas.save();
+ canvas.clipRect(padding, Op.DIFFERENCE);
+ trackDrawable.draw(canvas);
+ canvas.restoreToCount(saveCount);
+ } else {
+ trackDrawable.draw(canvas);
+ }
}
final int saveCount = canvas.save();
- canvas.clipRect(switchInnerLeft, switchTop, switchInnerRight, switchBottom);
- thumbDrawable.draw(canvas);
+
+ if (thumbDrawable != null) {
+ canvas.clipRect(switchInnerLeft, switchTop, switchInnerRight, switchBottom);
+ thumbDrawable.draw(canvas);
+ }
final Layout switchText = getTargetCheckedState() ? mOnLayout : mOffLayout;
if (switchText != null) {
@@ -904,8 +931,15 @@ public class Switch extends CompoundButton {
}
mTextPaint.drawableState = drawableState;
- final Rect thumbBounds = thumbDrawable.getBounds();
- final int left = (thumbBounds.left + thumbBounds.right) / 2 - switchText.getWidth() / 2;
+ final int cX;
+ if (thumbDrawable != null) {
+ final Rect bounds = thumbDrawable.getBounds();
+ cX = bounds.left + bounds.right;
+ } else {
+ cX = getWidth() / 2;
+ }
+
+ final int left = cX / 2 - switchText.getWidth() / 2;
final int top = (switchInnerTop + switchInnerBottom) / 2 - switchText.getHeight() / 2;
canvas.translate(left, top);
switchText.draw(canvas);
@@ -955,11 +989,12 @@ public class Switch extends CompoundButton {
}
private int getThumbScrollRange() {
- if (mTrackDrawable == null) {
+ if (mTrackDrawable != null) {
+ mTrackDrawable.getPadding(mTempRect);
+ return mSwitchWidth - mThumbWidth - mTempRect.left - mTempRect.right;
+ } else {
return 0;
}
- mTrackDrawable.getPadding(mTempRect);
- return mSwitchWidth - mThumbWidth - mTempRect.left - mTempRect.right;
}
@Override
@@ -1002,16 +1037,6 @@ public class Switch extends CompoundButton {
}
@Override
- public void invalidateDrawable(Drawable drawable) {
- super.invalidateDrawable(drawable);
-
- if (drawable == mThumbDrawable) {
- // Handle changes to thumb width and height.
- requestLayout();
- }
- }
-
- @Override
protected boolean verifyDrawable(Drawable who) {
return super.verifyDrawable(who) || who == mThumbDrawable || who == mTrackDrawable;
}
@@ -1019,8 +1044,19 @@ public class Switch extends CompoundButton {
@Override
public void jumpDrawablesToCurrentState() {
super.jumpDrawablesToCurrentState();
- mThumbDrawable.jumpToCurrentState();
- mTrackDrawable.jumpToCurrentState();
+
+ if (mThumbDrawable != null) {
+ mThumbDrawable.jumpToCurrentState();
+ }
+
+ if (mTrackDrawable != null) {
+ mTrackDrawable.jumpToCurrentState();
+ }
+
+ if (mPositionAnimator != null && mPositionAnimator.isRunning()) {
+ mPositionAnimator.end();
+ mPositionAnimator = null;
+ }
}
@Override