Merge "Updated the NumberPicker for exposing it into the SDK"
diff --git a/api/current.xml b/api/current.xml
index 83230f0..b2c9f92 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -239929,6 +239929,325 @@
</parameter>
</method>
</interface>
+<class name="NumberPicker"
+ extends="android.widget.LinearLayout"
+ abstract="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<constructor name="NumberPicker"
+ type="android.widget.NumberPicker"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+</constructor>
+<constructor name="NumberPicker"
+ type="android.widget.NumberPicker"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+<parameter name="attrs" type="android.util.AttributeSet">
+</parameter>
+</constructor>
+<constructor name="NumberPicker"
+ type="android.widget.NumberPicker"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+<parameter name="attrs" type="android.util.AttributeSet">
+</parameter>
+<parameter name="defStyle" type="int">
+</parameter>
+</constructor>
+<method name="getCurrent"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getRangeEnd"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getRangeStart"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="setCurrent"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="current" type="int">
+</parameter>
+</method>
+<method name="setFormatter"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="formatter" type="android.widget.NumberPicker.Formatter">
+</parameter>
+</method>
+<method name="setOnChangeListener"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="onChangeListener" type="android.widget.NumberPicker.OnChangeListener">
+</parameter>
+</method>
+<method name="setOnLongPressUpdateInterval"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="intervalMillis" type="long">
+</parameter>
+</method>
+<method name="setOnScrollListener"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="onScrollListener" type="android.widget.NumberPicker.OnScrollListener">
+</parameter>
+</method>
+<method name="setRange"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="start" type="int">
+</parameter>
+<parameter name="end" type="int">
+</parameter>
+</method>
+<method name="setRange"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="start" type="int">
+</parameter>
+<parameter name="end" type="int">
+</parameter>
+<parameter name="displayedValues" type="java.lang.String[]">
+</parameter>
+</method>
+<method name="setRange"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="start" type="int">
+</parameter>
+<parameter name="end" type="int">
+</parameter>
+<parameter name="displayedValues" type="java.lang.String[]">
+</parameter>
+<parameter name="wrapSelectorWheel" type="boolean">
+</parameter>
+</method>
+<method name="setWrapSelectorWheel"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="wrapSelector" type="boolean">
+</parameter>
+</method>
+<field name="TWO_DIGIT_FORMATTER"
+ type="android.widget.NumberPicker.Formatter"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+</class>
+<interface name="NumberPicker.Formatter"
+ abstract="true"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<method name="toString"
+ return="java.lang.String"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="value" type="int">
+</parameter>
+</method>
+</interface>
+<interface name="NumberPicker.OnChangeListener"
+ abstract="true"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<method name="onChange"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="picker" type="android.widget.NumberPicker">
+</parameter>
+<parameter name="oldVal" type="int">
+</parameter>
+<parameter name="newVal" type="int">
+</parameter>
+</method>
+</interface>
+<interface name="NumberPicker.OnScrollListener"
+ abstract="true"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<method name="onScrollStateChange"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="view" type="android.widget.NumberPicker">
+</parameter>
+<parameter name="scrollState" type="int">
+</parameter>
+</method>
+<field name="SCROLL_STATE_FLING"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="2"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="SCROLL_STATE_IDLE"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="0"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="SCROLL_STATE_TOUCH_SCROLL"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="1"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+</interface>
<class name="OverScroller"
extends="java.lang.Object"
abstract="false"
diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java
index 261992b..4e5bc6e 100644
--- a/core/java/android/widget/DatePicker.java
+++ b/core/java/android/widget/DatePicker.java
@@ -28,7 +28,7 @@
import android.util.AttributeSet;
import android.util.SparseArray;
import android.view.LayoutInflater;
-import android.widget.NumberPicker.OnChangedListener;
+import android.widget.NumberPicker.OnChangeListener;
import java.text.SimpleDateFormat;
import java.util.Calendar;
@@ -97,8 +97,8 @@
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.date_picker, this, true);
- OnChangedListener onChangeListener = new OnChangedListener() {
- public void onChanged(NumberPicker picker, int oldVal, int newVal) {
+ OnChangeListener onChangeListener = new OnChangeListener() {
+ public void onChange(NumberPicker picker, int oldVal, int newVal) {
notifyDateChanged();
updateMiniMonth();
}
@@ -107,18 +107,18 @@
// day
mDayPicker = (NumberPicker) findViewById(R.id.day);
mDayPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
- mDayPicker.setSpeed(100);
+ mDayPicker.setOnLongPressUpdateInterval(100);
mDayPicker.setOnChangeListener(onChangeListener);
// month
mMonthPicker = (NumberPicker) findViewById(R.id.month);
mMonthPicker.setRange(0, mNumberOfMonths - 1, getShortMonths());
- mMonthPicker.setSpeed(200);
+ mMonthPicker.setOnLongPressUpdateInterval(200);
mMonthPicker.setOnChangeListener(onChangeListener);
// year
mYearPicker = (NumberPicker) findViewById(R.id.year);
- mYearPicker.setSpeed(100);
+ mYearPicker.setOnLongPressUpdateInterval(100);
mYearPicker.setOnChangeListener(onChangeListener);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DatePicker);
int mStartYear = a.getInt(R.styleable.DatePicker_startYear, DEFAULT_START_YEAR);
diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java
index bdd2e2c..805bc08 100644
--- a/core/java/android/widget/NumberPicker.java
+++ b/core/java/android/widget/NumberPicker.java
@@ -50,10 +50,18 @@
import android.view.inputmethod.InputMethodManager;
/**
- * A view for selecting a number For a dialog using this view, see
- * {@link android.app.TimePickerDialog}.
- *
- * @hide
+ * A widget that enables the user to select a number form a predefined range.
+ * The widget presents an input filed and up and down buttons for selecting the
+ * current value. Pressing/long pressing the up and down buttons increments and
+ * decrements the current value respectively. Touching the input filed shows a
+ * scroll wheel, tapping on which while shown and not moving allows direct edit
+ * of the current value. Sliding motions up or down hide the buttons and the
+ * input filed, show the scroll wheel, and rotate the latter. Flinging is
+ * also supported. The widget enables mapping from positions to strings such
+ * that instead the position index the corresponding string is displayed.
+ * <p>
+ * For an example of using this widget, see {@link android.widget.TimePicker}.
+ * </p>
*/
@Widget
public class NumberPicker extends LinearLayout {
@@ -166,7 +174,7 @@
/**
* Listener to be notified upon current value change.
*/
- private OnChangedListener mOnChangedListener;
+ private OnChangeListener mOnChangeListener;
/**
* Listener to be notified upon scroll state change.
@@ -181,7 +189,7 @@
/**
* The speed for updating the value form long press.
*/
- private long mLongPressUpdateSpeed = 300;
+ private long mLongPressUpdateInterval = 300;
/**
* Cache for the string representation of selector indices.
@@ -320,13 +328,15 @@
/**
* The callback interface used to indicate the number value has changed.
*/
- public interface OnChangedListener {
+ public interface OnChangeListener {
/**
+ * Called upon a change of the current value.
+ *
* @param picker The NumberPicker associated with this listener.
* @param oldVal The previous value.
* @param newVal The new value.
*/
- void onChanged(NumberPicker picker, int oldVal, int newVal);
+ void onChange(NumberPicker picker, int oldVal, int newVal);
}
/**
@@ -356,18 +366,34 @@
* @param scrollState The current scroll state. One of {@link #SCROLL_STATE_IDLE},
* {@link #SCROLL_STATE_TOUCH_SCROLL} or {@link #SCROLL_STATE_IDLE}.
*/
- public void onScrollStateChanged(NumberPicker view, int scrollState);
+ public void onScrollStateChange(NumberPicker view, int scrollState);
}
/**
- * Interface used to format the number into a string for presentation
+ * Interface used to format the number into a string for presentation.
*/
public interface Formatter {
- String toString(int value);
+
+ /**
+ * Formats a string representation of the current index.
+ *
+ * @param value The currently selected value.
+ * @return A formatted string representation.
+ */
+ public String toString(int value);
}
/**
- * Create a new number picker
+ * Create a new number picker.
+ *
+ * @param context The application environment.
+ */
+ public NumberPicker(Context context) {
+ this(context, null);
+ }
+
+ /**
+ * Create a new number picker.
*
* @param context The application environment.
* @param attrs A collection of attributes.
@@ -735,17 +761,22 @@
}
}
- /**
- * Set the callback that indicates the number has been adjusted by the user.
- *
- * @param onChangeListener the callback, should not be null.
- */
- public void setOnChangeListener(OnChangedListener onChangeListener) {
- mOnChangedListener = onChangeListener;
+ @Override
+ public int getSolidColor() {
+ return mSolidColor;
}
/**
- * Set the callback that in notified for scroll state changes.
+ * Sets the listener to be notified on change of the current value.
+ *
+ * @param onChangeListener The listener.
+ */
+ public void setOnChangeListener(OnChangeListener onChangeListener) {
+ mOnChangeListener = onChangeListener;
+ }
+
+ /**
+ * Set listener to be notified for scroll state changes.
*
* @param onScrollListener the callback, should not be null.
*/
@@ -754,10 +785,16 @@
}
/**
- * Set the formatter that will be used to format the number for presentation
+ * Set the formatter to be used for formatting the current value.
+ * <p>
+ * Note: If you have provided alternative values for the selected positons
+ * this formatter is never invoked.
+ * </p>
*
* @param formatter the formatter object. If formatter is null,
- * String.valueOf() will be used
+ * String.valueOf() will be used.
+ *
+ * @see #setRange(int, int, String[])
*/
public void setFormatter(Formatter formatter) {
mFormatter = formatter;
@@ -777,11 +814,11 @@
/**
* Set the range of numbers allowed for the number picker. The current value
* will be automatically set to the start. Also provide a mapping for values
- * used to display to the user.
+ * used to display to the user instead of the numbers in the range.
*
- * @param start the start of the range (inclusive)
- * @param end the end of the range (inclusive)
- * @param displayedValues the values displayed to the user.
+ * @param start The start of the range (inclusive).
+ * @param end The end of the range (inclusive).
+ * @param displayedValues The values displayed to the user.
*/
public void setRange(int start, int end, String[] displayedValues) {
boolean wrapSelector = (end - start) >= mSelectorIndices.length;
@@ -792,12 +829,20 @@
* Set the range of numbers allowed for the number picker. The current value
* will be automatically set to the start. Also provide a mapping for values
* used to display to the user.
+ * <p>
+ * Note: The <code>wrapSelectorWheel</code> argument is ignored if the range
+ * (difference between <code>start</code> and <code>end</code>) us less than
+ * five since this is the number of values shown by the selector wheel.
+ * </p>
*
* @param start the start of the range (inclusive)
* @param end the end of the range (inclusive)
* @param displayedValues the values displayed to the user.
+ * @param wrapSelectorWheel Whether to wrap the selector wheel.
+ *
+ * @see #setWrapSelectorWheel(boolean)
*/
- public void setRange(int start, int end, String[] displayedValues, boolean wrapSelector) {
+ public void setRange(int start, int end, String[] displayedValues, boolean wrapSelectorWheel) {
if (start < 0 || end < 0) {
throw new IllegalArgumentException("start and end must be > 0");
}
@@ -807,7 +852,7 @@
mEnd = end;
mCurrent = start;
- setWrapSelector(wrapSelector);
+ setWrapSelectorWheel(wrapSelectorWheel);
updateInputTextView();
if (displayedValues != null) {
@@ -826,8 +871,9 @@
* Set the current value for the number picker.
*
* @param current the current value the start of the range (inclusive)
+ *
* @throws IllegalArgumentException when current is not within the range of
- * of the number picker
+ * of the number picker.
*/
public void setCurrent(int current) {
if (current < mStart || current > mEnd) {
@@ -839,12 +885,14 @@
}
/**
- * Sets whether the selector shown during flinging/scrolling should wrap
- * around the beginning and end values.
+ * Sets whether the selector wheel shown during flinging/scrolling should wrap
+ * around the beginning and end values. By default if the range is more than
+ * five (the number of items shown on the selector wheel) the selector wheel
+ * wrapping is enabled.
*
* @param wrapSelector Whether to wrap.
*/
- public void setWrapSelector(boolean wrapSelector) {
+ public void setWrapSelectorWheel(boolean wrapSelector) {
if (wrapSelector && (mEnd - mStart) < mSelectorIndices.length) {
throw new IllegalStateException("Range less than selector items count.");
}
@@ -856,18 +904,18 @@
}
/**
- * Sets the speed at which the numbers will scroll when the +/- buttons are
- * longpressed
+ * Sets the speed at which the numbers be incremented and decremented when
+ * the up and down buttons are long pressed respectively.
*
- * @param speed The speed (in milliseconds) at which the numbers will scroll
- * default 300ms
+ * @param intervalMillis The speed (in milliseconds) at which the numbers
+ * will be incremented and decremented (default 300ms).
*/
- public void setSpeed(long speed) {
- mLongPressUpdateSpeed = speed;
+ public void setOnLongPressUpdateInterval(long intervalMillis) {
+ mLongPressUpdateInterval = intervalMillis;
}
/**
- * Returns the current value of the NumberPicker
+ * Returns the current value of the NumberPicker.
*
* @return the current value.
*/
@@ -875,9 +923,22 @@
return mCurrent;
}
- @Override
- public int getSolidColor() {
- return mSolidColor;
+ /**
+ * Returns the range lower value of the NumberPicker.
+ *
+ * @return The lower number of the range.
+ */
+ public int getRangeStart() {
+ return mStart;
+ }
+
+ /**
+ * Returns the range end value of the NumberPicker.
+ *
+ * @return The upper number of the range.
+ */
+ public int getRangeEnd() {
+ return mEnd;
}
@Override
@@ -950,24 +1011,6 @@
}
/**
- * Returns the upper value of the range of the NumberPicker
- *
- * @return the uppper number of the range.
- */
- protected int getEndRange() {
- return mEnd;
- }
-
- /**
- * Returns the lower value of the range of the NumberPicker
- *
- * @return the lower number of the range.
- */
- protected int getBeginRange() {
- return mStart;
- }
-
- /**
* Sets the current value of this NumberPicker, and sets mPrevious to the
* previous value. If current is greater than mEnd less than mStart, the
* value of mCurrent is wrapped around. Subclasses can override this to
@@ -1038,7 +1081,7 @@
private void tryNotifyScrollListener(int scrollState) {
if (mOnScrollListener != null && mScrollState != scrollState) {
mScrollState = scrollState;
- mOnScrollListener.onScrollStateChanged(this, scrollState);
+ mOnScrollListener.onScrollStateChange(this, scrollState);
}
}
@@ -1238,8 +1281,8 @@
* NumberPicker.
*/
private void notifyChange(int previous, int current) {
- if (mOnChangedListener != null) {
- mOnChangedListener.onChanged(this, previous, mCurrent);
+ if (mOnChangeListener != null) {
+ mOnChangeListener.onChange(this, previous, mCurrent);
}
}
@@ -1439,7 +1482,7 @@
public void run() {
changeCurrent(mCurrent + mUpdateStep);
- postDelayed(this, mLongPressUpdateSpeed);
+ postDelayed(this, mLongPressUpdateInterval);
}
}
}
diff --git a/core/java/android/widget/TimePicker.java b/core/java/android/widget/TimePicker.java
index e66eb8d..203b637 100644
--- a/core/java/android/widget/TimePicker.java
+++ b/core/java/android/widget/TimePicker.java
@@ -25,7 +25,7 @@
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
-import android.widget.NumberPicker.OnChangedListener;
+import android.widget.NumberPicker.OnChangeListener;
import java.text.DateFormatSymbols;
import java.util.Calendar;
@@ -110,8 +110,8 @@
// hour
mHourPicker = (NumberPicker) findViewById(R.id.hour);
- mHourPicker.setOnChangeListener(new NumberPicker.OnChangedListener() {
- public void onChanged(NumberPicker spinner, int oldVal, int newVal) {
+ mHourPicker.setOnChangeListener(new NumberPicker.OnChangeListener() {
+ public void onChange(NumberPicker spinner, int oldVal, int newVal) {
mCurrentHour = newVal;
if (!mIs24HourView) {
// adjust from [1-12] to [0-11] internally, with the times
@@ -135,10 +135,10 @@
// digits of minute
mMinutePicker = (NumberPicker) findViewById(R.id.minute);
mMinutePicker.setRange(0, 59);
- mMinutePicker.setSpeed(100);
+ mMinutePicker.setOnLongPressUpdateInterval(100);
mMinutePicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
- mMinutePicker.setOnChangeListener(new NumberPicker.OnChangedListener() {
- public void onChanged(NumberPicker spinner, int oldVal, int newVal) {
+ mMinutePicker.setOnChangeListener(new NumberPicker.OnChangeListener() {
+ public void onChange(NumberPicker spinner, int oldVal, int newVal) {
mCurrentMinute = newVal;
onTimeChanged();
}
@@ -146,8 +146,8 @@
// am/pm
mAmPmPicker = (NumberPicker) findViewById(R.id.amPm);
- mAmPmPicker.setOnChangeListener(new OnChangedListener() {
- public void onChanged(NumberPicker picker, int oldVal, int newVal) {
+ mAmPmPicker.setOnChangeListener(new OnChangeListener() {
+ public void onChange(NumberPicker picker, int oldVal, int newVal) {
picker.requestFocus();
if (mIsAm) {
// Currently AM switching to PM