From bcfdead943ace3bc3f870979849db1885466ebf3 Mon Sep 17 00:00:00 2001 From: Doris Liu Date: Fri, 19 Jun 2015 15:00:24 -0700 Subject: [PATCH] Fix NumberPicker.setWrapSelectorWheel(boolean) not respecting user choice The issue states that NumberPicker.setWrapSelectorWheel(false) only works in a specific call order. The underlying problem is that NumberPicker does not remember user's preference on whether the selector wheel should be wrapped. Therefore, it only works when user sets their preference last, after everything else that could affect the choice gets executed. Bug: 19049714 Change-Id: Ic27d909cb3dd657993a4df9a04c819b6965ad11b --- core/java/android/widget/NumberPicker.java | 28 ++++++++++++++++------ 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java index e7d9226d66bcc..b5fae4ed17a99 100644 --- a/core/java/android/widget/NumberPicker.java +++ b/core/java/android/widget/NumberPicker.java @@ -148,6 +148,11 @@ public class NumberPicker extends LinearLayout { */ private static final int SIZE_UNSPECIFIED = -1; + /** + * User choice on whether the selector wheel should be wrapped. + */ + private boolean mWrapSelectorWheelPreferred = true; + /** * Use a custom NumberPicker formatting callback to use two-digit minutes * strings like "01". Keeping a static formatter etc. is the most efficient @@ -1353,10 +1358,21 @@ public class NumberPicker extends LinearLayout { * @param wrapSelectorWheel Whether to wrap. */ public void setWrapSelectorWheel(boolean wrapSelectorWheel) { + mWrapSelectorWheelPreferred = wrapSelectorWheel; + updateWrapSelectorWheel(); + + } + + /** + * Whether or not the selector wheel should be wrapped is determined by user choice and whether + * the choice is allowed. The former comes from {@link #setWrapSelectorWheel(boolean)}, the + * latter is calculated based on min & max value set vs selector's visual length. Therefore, + * this method should be called any time any of the 3 values (i.e. user choice, min and max + * value) gets updated. + */ + private void updateWrapSelectorWheel() { final boolean wrappingAllowed = (mMaxValue - mMinValue) >= mSelectorIndices.length; - if ((!wrapSelectorWheel || wrappingAllowed) && wrapSelectorWheel != mWrapSelectorWheel) { - mWrapSelectorWheel = wrapSelectorWheel; - } + mWrapSelectorWheel = wrappingAllowed && mWrapSelectorWheelPreferred; } /** @@ -1412,8 +1428,7 @@ public class NumberPicker extends LinearLayout { if (mMinValue > mValue) { mValue = mMinValue; } - boolean wrapSelectorWheel = mMaxValue - mMinValue > mSelectorIndices.length; - setWrapSelectorWheel(wrapSelectorWheel); + updateWrapSelectorWheel(); initializeSelectorWheelIndices(); updateInputTextView(); tryComputeMaxWidth(); @@ -1450,8 +1465,7 @@ public class NumberPicker extends LinearLayout { if (mMaxValue < mValue) { mValue = mMaxValue; } - boolean wrapSelectorWheel = mMaxValue - mMinValue > mSelectorIndices.length; - setWrapSelectorWheel(wrapSelectorWheel); + updateWrapSelectorWheel(); initializeSelectorWheelIndices(); updateInputTextView(); tryComputeMaxWidth();