From efd1c6777929e5a81a030fc51145cd3064d3e979 Mon Sep 17 00:00:00 2001 From: Svetoslav Ganov Date: Mon, 19 Mar 2012 20:03:29 -0700 Subject: [PATCH] Revert "Revamp of the NumberPicker widget." This reverts commit 912ab8506ae6409ee7fa0323b217fefaf0bd9771 --- api/current.txt | 1 + core/java/android/view/ViewGroup.java | 14 + core/java/android/widget/DatePicker.java | 37 +- core/java/android/widget/NumberPicker.java | 1302 ++++++++--------- core/java/android/widget/TimePicker.java | 31 +- ...picker_down_disabled_focused_holo_dark.png | Bin 0 -> 634 bytes ...icker_down_disabled_focused_holo_light.png | Bin 0 -> 489 bytes .../numberpicker_down_disabled_holo_dark.png | Bin 0 -> 444 bytes .../numberpicker_down_disabled_holo_light.png | Bin 0 -> 418 bytes .../numberpicker_down_focused_holo_dark.png | Bin 0 -> 661 bytes .../numberpicker_down_focused_holo_light.png | Bin 0 -> 514 bytes ...umberpicker_down_longpressed_holo_dark.png | Bin 0 -> 555 bytes ...mberpicker_down_longpressed_holo_light.png | Bin 0 -> 555 bytes .../numberpicker_down_normal_holo_dark.png | Bin 0 -> 439 bytes .../numberpicker_down_normal_holo_light.png | Bin 0 -> 441 bytes .../numberpicker_down_pressed_holo_dark.png | Bin 0 -> 564 bytes .../numberpicker_down_pressed_holo_light.png | Bin 0 -> 564 bytes ...erpicker_up_disabled_focused_holo_dark.png | Bin 0 -> 605 bytes ...rpicker_up_disabled_focused_holo_light.png | Bin 0 -> 457 bytes .../numberpicker_up_disabled_holo_dark.png | Bin 0 -> 416 bytes .../numberpicker_up_disabled_holo_light.png | Bin 0 -> 407 bytes .../numberpicker_up_focused_holo_dark.png | Bin 0 -> 652 bytes .../numberpicker_up_focused_holo_light.png | Bin 0 -> 497 bytes .../numberpicker_up_longpressed_holo_dark.png | Bin 0 -> 536 bytes ...numberpicker_up_longpressed_holo_light.png | Bin 0 -> 536 bytes .../numberpicker_up_normal_holo_dark.png | Bin 0 -> 426 bytes .../numberpicker_up_normal_holo_light.png | Bin 0 -> 427 bytes .../numberpicker_up_pressed_holo_dark.png | Bin 0 -> 542 bytes .../numberpicker_up_pressed_holo_light.png | Bin 0 -> 542 bytes ...picker_down_disabled_focused_holo_dark.png | Bin 0 -> 561 bytes ...icker_down_disabled_focused_holo_light.png | Bin 0 -> 426 bytes .../numberpicker_down_disabled_holo_dark.png | Bin 0 -> 398 bytes .../numberpicker_down_disabled_holo_light.png | Bin 0 -> 384 bytes .../numberpicker_down_focused_holo_dark.png | Bin 0 -> 575 bytes .../numberpicker_down_focused_holo_light.png | Bin 0 -> 446 bytes ...umberpicker_down_longpressed_holo_dark.png | Bin 0 -> 473 bytes ...mberpicker_down_longpressed_holo_light.png | Bin 0 -> 473 bytes .../numberpicker_down_normal_holo_dark.png | Bin 0 -> 423 bytes .../numberpicker_down_normal_holo_light.png | Bin 0 -> 412 bytes .../numberpicker_down_pressed_holo_dark.png | Bin 0 -> 473 bytes .../numberpicker_down_pressed_holo_light.png | Bin 0 -> 473 bytes ...erpicker_up_disabled_focused_holo_dark.png | Bin 0 -> 535 bytes ...rpicker_up_disabled_focused_holo_light.png | Bin 0 -> 410 bytes .../numberpicker_up_disabled_holo_dark.png | Bin 0 -> 394 bytes .../numberpicker_up_disabled_holo_light.png | Bin 0 -> 383 bytes .../numberpicker_up_focused_holo_dark.png | Bin 0 -> 556 bytes .../numberpicker_up_focused_holo_light.png | Bin 0 -> 429 bytes .../numberpicker_up_longpressed_holo_dark.png | Bin 0 -> 466 bytes ...numberpicker_up_longpressed_holo_light.png | Bin 0 -> 466 bytes .../numberpicker_up_normal_holo_dark.png | Bin 0 -> 404 bytes .../numberpicker_up_normal_holo_light.png | Bin 0 -> 408 bytes .../numberpicker_up_pressed_holo_dark.png | Bin 0 -> 468 bytes .../numberpicker_up_pressed_holo_light.png | Bin 0 -> 468 bytes ...picker_down_disabled_focused_holo_dark.png | Bin 0 -> 748 bytes ...icker_down_disabled_focused_holo_light.png | Bin 0 -> 556 bytes .../numberpicker_down_disabled_holo_dark.png | Bin 0 -> 480 bytes .../numberpicker_down_disabled_holo_light.png | Bin 0 -> 459 bytes .../numberpicker_down_focused_holo_dark.png | Bin 0 -> 785 bytes .../numberpicker_down_focused_holo_light.png | Bin 0 -> 627 bytes ...umberpicker_down_longpressed_holo_dark.png | Bin 0 -> 698 bytes ...mberpicker_down_longpressed_holo_light.png | Bin 0 -> 698 bytes .../numberpicker_down_normal_holo_dark.png | Bin 0 -> 494 bytes .../numberpicker_down_normal_holo_light.png | Bin 0 -> 503 bytes .../numberpicker_down_pressed_holo_dark.png | Bin 0 -> 696 bytes .../numberpicker_down_pressed_holo_light.png | Bin 0 -> 696 bytes ...erpicker_up_disabled_focused_holo_dark.png | Bin 0 -> 741 bytes ...rpicker_up_disabled_focused_holo_light.png | Bin 0 -> 554 bytes .../numberpicker_up_disabled_holo_dark.png | Bin 0 -> 474 bytes .../numberpicker_up_disabled_holo_light.png | Bin 0 -> 463 bytes .../numberpicker_up_focused_holo_dark.png | Bin 0 -> 780 bytes .../numberpicker_up_focused_holo_light.png | Bin 0 -> 617 bytes .../numberpicker_up_longpressed_holo_dark.png | Bin 0 -> 674 bytes ...numberpicker_up_longpressed_holo_light.png | Bin 0 -> 674 bytes .../numberpicker_up_normal_holo_dark.png | Bin 0 -> 485 bytes .../numberpicker_up_normal_holo_light.png | Bin 0 -> 490 bytes .../numberpicker_up_pressed_holo_dark.png | Bin 0 -> 670 bytes .../numberpicker_up_pressed_holo_light.png | Bin 0 -> 670 bytes .../numberpicker_down_btn_holo_dark.xml | 43 + .../numberpicker_down_btn_holo_light.xml | 43 + .../numberpicker_up_btn_holo_dark.xml | 43 + .../numberpicker_up_btn_holo_light.xml | 43 + core/res/res/layout/number_picker.xml | 15 +- .../number_picker_with_selector_wheel.xml | 31 - core/res/res/values/attrs.xml | 14 +- core/res/res/values/strings.xml | 2 + core/res/res/values/styles.xml | 61 +- .../res/res/values/styles_device_defaults.xml | 18 + core/res/res/values/themes.xml | 15 +- .../res/res/values/themes_device_defaults.xml | 10 +- 89 files changed, 902 insertions(+), 821 deletions(-) create mode 100644 core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_dark.png create mode 100644 core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_light.png create mode 100644 core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_dark.png create mode 100644 core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_light.png create mode 100644 core/res/res/drawable-hdpi/numberpicker_down_focused_holo_dark.png create mode 100644 core/res/res/drawable-hdpi/numberpicker_down_focused_holo_light.png create mode 100644 core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_dark.png create mode 100644 core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_light.png create mode 100644 core/res/res/drawable-hdpi/numberpicker_down_normal_holo_dark.png create mode 100644 core/res/res/drawable-hdpi/numberpicker_down_normal_holo_light.png create mode 100644 core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_dark.png create mode 100644 core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_light.png create mode 100644 core/res/res/drawable-hdpi/numberpicker_up_disabled_focused_holo_dark.png create mode 100644 core/res/res/drawable-hdpi/numberpicker_up_disabled_focused_holo_light.png create mode 100644 core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_dark.png create mode 100644 core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_light.png create mode 100644 core/res/res/drawable-hdpi/numberpicker_up_focused_holo_dark.png create mode 100644 core/res/res/drawable-hdpi/numberpicker_up_focused_holo_light.png create mode 100644 core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_dark.png create mode 100644 core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_light.png create mode 100644 core/res/res/drawable-hdpi/numberpicker_up_normal_holo_dark.png create mode 100644 core/res/res/drawable-hdpi/numberpicker_up_normal_holo_light.png create mode 100644 core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_dark.png create mode 100644 core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_light.png create mode 100644 core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_dark.png create mode 100644 core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_light.png create mode 100644 core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_dark.png create mode 100644 core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_light.png create mode 100644 core/res/res/drawable-mdpi/numberpicker_down_focused_holo_dark.png create mode 100644 core/res/res/drawable-mdpi/numberpicker_down_focused_holo_light.png create mode 100644 core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_dark.png create mode 100644 core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_light.png create mode 100644 core/res/res/drawable-mdpi/numberpicker_down_normal_holo_dark.png create mode 100644 core/res/res/drawable-mdpi/numberpicker_down_normal_holo_light.png create mode 100644 core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_dark.png create mode 100644 core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_light.png create mode 100644 core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_dark.png create mode 100644 core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_light.png create mode 100644 core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_dark.png create mode 100644 core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_light.png create mode 100644 core/res/res/drawable-mdpi/numberpicker_up_focused_holo_dark.png create mode 100644 core/res/res/drawable-mdpi/numberpicker_up_focused_holo_light.png create mode 100644 core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_dark.png create mode 100644 core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_light.png create mode 100644 core/res/res/drawable-mdpi/numberpicker_up_normal_holo_dark.png create mode 100644 core/res/res/drawable-mdpi/numberpicker_up_normal_holo_light.png create mode 100644 core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_dark.png create mode 100644 core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_light.png create mode 100644 core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_dark.png create mode 100644 core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_light.png create mode 100644 core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_dark.png create mode 100644 core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_light.png create mode 100644 core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_dark.png create mode 100644 core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_light.png create mode 100644 core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_dark.png create mode 100644 core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_light.png create mode 100644 core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_dark.png create mode 100644 core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_light.png create mode 100644 core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_dark.png create mode 100644 core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_light.png create mode 100644 core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_dark.png create mode 100644 core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_light.png create mode 100644 core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_dark.png create mode 100644 core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_light.png create mode 100644 core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_dark.png create mode 100644 core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_light.png create mode 100644 core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_dark.png create mode 100644 core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_light.png create mode 100644 core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_dark.png create mode 100644 core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_light.png create mode 100644 core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_dark.png create mode 100644 core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_light.png create mode 100644 core/res/res/drawable/numberpicker_down_btn_holo_dark.xml create mode 100644 core/res/res/drawable/numberpicker_down_btn_holo_light.xml create mode 100644 core/res/res/drawable/numberpicker_up_btn_holo_dark.xml create mode 100644 core/res/res/drawable/numberpicker_up_btn_holo_light.xml delete mode 100644 core/res/res/layout/number_picker_with_selector_wheel.xml diff --git a/api/current.txt b/api/current.txt index 211ff6e2a7a55..29f093a98f4c2 100644 --- a/api/current.txt +++ b/api/current.txt @@ -26924,6 +26924,7 @@ package android.widget { method public void setOnValueChangedListener(android.widget.NumberPicker.OnValueChangeListener); method public void setValue(int); method public void setWrapSelectorWheel(boolean); + field public static final int SELECTOR_WHEEL_ITEM_COUNT = 5; // 0x5 } public static abstract interface NumberPicker.Formatter { diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index de71e6ce0e359..1993ce6a52657 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -2679,6 +2679,15 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager return child.draw(canvas, this, drawingTime); } + @Override + public void requestLayout() { + if (mChildrenCount > 0 && getAccessibilityNodeProvider() != null) { + throw new IllegalStateException("Views with AccessibilityNodeProvider" + + " can't have children."); + } + super.requestLayout(); + } + /** * * @param enabled True if children should be drawn with layers, false otherwise. @@ -3100,6 +3109,11 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager private void addViewInner(View child, int index, LayoutParams params, boolean preventRequestLayout) { + if (getAccessibilityNodeProvider() != null) { + throw new IllegalStateException("Views with AccessibilityNodeProvider" + + " can't have children."); + } + if (mTransition != null) { // Don't prevent other add transitions from completing, but cancel remove // transitions to let them complete the process before we add to the container diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java index c5066b672861a..fd939802a5775 100644 --- a/core/java/android/widget/DatePicker.java +++ b/core/java/android/widget/DatePicker.java @@ -29,8 +29,8 @@ import android.util.AttributeSet; import android.util.Log; import android.util.SparseArray; import android.view.LayoutInflater; -import android.view.View; import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityNodeInfo; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; @@ -280,7 +280,9 @@ public class DatePicker extends FrameLayout { reorderSpinners(); // set content descriptions - setContentDescriptions(); + if (AccessibilityManager.getInstance(mContext).isEnabled()) { + setContentDescriptions(); + } } /** @@ -715,27 +717,20 @@ public class DatePicker extends FrameLayout { private void setContentDescriptions() { // Day - trySetContentDescription(mDaySpinner, R.id.increment, - R.string.date_picker_increment_day_button); - trySetContentDescription(mDaySpinner, R.id.decrement, - R.string.date_picker_decrement_day_button); + String text = mContext.getString(R.string.date_picker_increment_day_button); + mDaySpinner.findViewById(R.id.increment).setContentDescription(text); + text = mContext.getString(R.string.date_picker_decrement_day_button); + mDaySpinner.findViewById(R.id.decrement).setContentDescription(text); // Month - trySetContentDescription(mMonthSpinner, R.id.increment, - R.string.date_picker_increment_month_button); - trySetContentDescription(mMonthSpinner, R.id.decrement, - R.string.date_picker_decrement_month_button); + text = mContext.getString(R.string.date_picker_increment_month_button); + mMonthSpinner.findViewById(R.id.increment).setContentDescription(text); + text = mContext.getString(R.string.date_picker_decrement_month_button); + mMonthSpinner.findViewById(R.id.decrement).setContentDescription(text); // Year - trySetContentDescription(mYearSpinner, R.id.increment, - R.string.date_picker_increment_year_button); - trySetContentDescription(mYearSpinner, R.id.decrement, - R.string.date_picker_decrement_year_button); - } - - private void trySetContentDescription(View root, int viewId, int contDescResId) { - View target = root.findViewById(viewId); - if (target != null) { - target.setContentDescription(mContext.getString(contDescResId)); - } + text = mContext.getString(R.string.date_picker_increment_year_button); + mYearSpinner.findViewById(R.id.increment).setContentDescription(text); + text = mContext.getString(R.string.date_picker_decrement_year_button); + mYearSpinner.findViewById(R.id.decrement).setContentDescription(text); } private void updateInputState() { diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java index 506b0c06a85e3..3335da0bd6724 100644 --- a/core/java/android/widget/NumberPicker.java +++ b/core/java/android/widget/NumberPicker.java @@ -16,6 +16,10 @@ package android.widget; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; import android.annotation.Widget; import android.content.Context; import android.content.res.ColorStateList; @@ -44,41 +48,22 @@ import android.view.ViewConfiguration; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityNodeInfo; -import android.view.accessibility.AccessibilityNodeProvider; import android.view.animation.DecelerateInterpolator; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; import com.android.internal.R; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - /** * A widget that enables the user to select a number form a predefined range. - * There are two flavors of this widget and which one is presented to the user - * depends on the current theme. - * + * The widget presents an input field 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 field shows a + * scroll wheel, which when touched allows direct edit + * of the current value. Sliding gestures up or down hide the buttons and the + * input filed, show and rotate the scroll wheel. Flinging is + * also supported. The widget enables mapping from positions to strings such + * that, instead of the position index, the corresponding string is displayed. *

* For an example of using this widget, see {@link android.widget.TimePicker}. *

@@ -89,7 +74,7 @@ public class NumberPicker extends LinearLayout { /** * The number of items show in the selector wheel. */ - private static final int SELECTOR_WHEEL_ITEM_COUNT = 3; + public static final int SELECTOR_WHEEL_ITEM_COUNT = 5; /** * The default update interval during long press. @@ -99,7 +84,7 @@ public class NumberPicker extends LinearLayout { /** * The index of the middle selector item. */ - private static final int SELECTOR_MIDDLE_ITEM_INDEX = SELECTOR_WHEEL_ITEM_COUNT / 2; + private static final int SELECTOR_MIDDLE_ITEM_INDEX = 2; /** * The coefficient by which to adjust (divide) the max fling velocity. @@ -112,11 +97,18 @@ public class NumberPicker extends LinearLayout { private static final int SELECTOR_ADJUSTMENT_DURATION_MILLIS = 800; /** - * The duration of scrolling to the next/previous value while changing the - * current value by one, i.e. increment or decrement. + * The duration of scrolling to the next/previous value while changing + * the current value by one, i.e. increment or decrement. */ private static final int CHANGE_CURRENT_BY_ONE_SCROLL_DURATION = 300; + /** + * The the delay for showing the input controls after a single tap on the + * input text. + */ + private static final int SHOW_INPUT_CONTROLS_DELAY_MILLIS = ViewConfiguration + .getDoubleTapTimeout(); + /** * The strength of fading in the top and bottom while drawing the selector. */ @@ -128,31 +120,56 @@ public class NumberPicker extends LinearLayout { private static final int UNSCALED_DEFAULT_SELECTION_DIVIDER_HEIGHT = 2; /** - * The default unscaled distance between the selection dividers. + * In this state the selector wheel is not shown. */ - private static final int UNSCALED_DEFAULT_SELECTION_DIVIDERS_DISTANCE = 48; + private static final int SELECTOR_WHEEL_STATE_NONE = 0; /** - * The default unscaled minimal distance for a swipe to be considered a fling. + * In this state the selector wheel is small. */ - private static final int UNSCALED_DEFAULT_MIN_FLING_DISTANCE = 150; + private static final int SELECTOR_WHEEL_STATE_SMALL = 1; /** - * Coefficient for adjusting touch scroll distance. + * In this state the selector wheel is large. */ - private static final float TOUCH_SCROLL_DECELERATION_COEFFICIENT = 2.5f; + private static final int SELECTOR_WHEEL_STATE_LARGE = 2; /** - * The resource id for the default layout. + * The alpha of the selector wheel when it is bright. */ - private static final int DEFAULT_LAYOUT_RESOURCE_ID = R.layout.number_picker; + private static final int SELECTOR_WHEEL_BRIGHT_ALPHA = 255; + + /** + * The alpha of the selector wheel when it is dimmed. + */ + private static final int SELECTOR_WHEEL_DIM_ALPHA = 60; + + /** + * The alpha for the increment/decrement button when it is transparent. + */ + private static final int BUTTON_ALPHA_TRANSPARENT = 0; + + /** + * The alpha for the increment/decrement button when it is opaque. + */ + private static final int BUTTON_ALPHA_OPAQUE = 1; + + /** + * The property for setting the selector paint. + */ + private static final String PROPERTY_SELECTOR_PAINT_ALPHA = "selectorPaintAlpha"; + + /** + * The property for setting the increment/decrement button alpha. + */ + private static final String PROPERTY_BUTTON_ALPHA = "alpha"; /** * The numbers accepted by the input text's {@link Filter} */ private static final char[] DIGIT_CHARACTERS = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' - }; + }; /** * Constant for unspecified size. @@ -197,11 +214,6 @@ public class NumberPicker extends LinearLayout { */ private final EditText mInputText; - /** - * The distance between the two selection dividers. - */ - private final int mSelectionDividersDistance; - /** * The min height of this widget. */ @@ -232,11 +244,6 @@ public class NumberPicker extends LinearLayout { */ private final int mTextSize; - /** - * The minimal distance for a swipe to be considered a fling. - */ - private final int mMinFlingDistance; - /** * The height of the gap between text elements if the selector wheel. */ @@ -290,7 +297,10 @@ public class NumberPicker extends LinearLayout { /** * The selector indices whose value are show by the selector. */ - private final int[] mSelectorIndices = new int[SELECTOR_WHEEL_ITEM_COUNT]; + private final int[] mSelectorIndices = new int[] { + Integer.MIN_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE, + Integer.MIN_VALUE + }; /** * The {@link Paint} for drawing the selector. @@ -332,6 +342,11 @@ public class NumberPicker extends LinearLayout { */ private SetSelectionCommand mSetSelectionCommand; + /** + * Handle to the reusable command for adjusting the scroller. + */ + private AdjustScrollerCommand mAdjustScrollerCommand; + /** * Handle to the reusable command for changing the current value from long * press by one. @@ -339,9 +354,14 @@ public class NumberPicker extends LinearLayout { private ChangeCurrentByOneFromLongPressCommand mChangeCurrentByOneFromLongPressCommand; /** - * Command for beginning an edit of the current value via IME on long press. + * {@link Animator} for showing the up/down arrows. */ - private BeginSoftInputOnLongPressCommand mBeginSoftInputOnLongPressCommand; + private final AnimatorSet mShowInputControlsAnimator; + + /** + * {@link Animator} for dimming the selector wheel. + */ + private final Animator mDimSelectorWheelAnimator; /** * The Y position of the last down event. @@ -349,14 +369,24 @@ public class NumberPicker extends LinearLayout { private float mLastDownEventY; /** - * The time of the last down event. + * The Y position of the last motion event. */ - private long mLastDownEventTime; + private float mLastMotionEventY; /** - * The Y position of the last down or move event. + * Flag if to check for double tap and potentially start edit. */ - private float mLastDownOrMoveEventY; + private boolean mCheckBeginEditOnUpEvent; + + /** + * Flag if to adjust the selector wheel on next up event. + */ + private boolean mAdjustScrollerOnUpEvent; + + /** + * The state of the selector wheel. + */ + private int mSelectorWheelState; /** * Determines speed during touch scrolling. @@ -389,9 +419,9 @@ public class NumberPicker extends LinearLayout { private final int mSolidColor; /** - * Flag whether this widget has a selector wheel. + * Flag indicating if this widget supports flinging. */ - private final boolean mHasSelectorWheel; + private final boolean mFlingable; /** * Divider for showing item to be selected while scrolling @@ -403,41 +433,30 @@ public class NumberPicker extends LinearLayout { */ private final int mSelectionDividerHeight; + /** + * Reusable {@link Rect} instance. + */ + private final Rect mTempRect = new Rect(); + /** * The current scroll state of the number picker. */ private int mScrollState = OnScrollListener.SCROLL_STATE_IDLE; /** - * Flag whether to ignore move events - we ignore such when we show in IME - * to prevent the content from scrolling. + * The duration of the animation for showing the input controls. */ - private boolean mIngonreMoveEvents; + private final long mShowInputControlsAnimimationDuration; /** - * Flag whether to show soft input on tap. + * Flag whether the scoll wheel and the fading edges have been initialized. */ - private boolean mShowSoftInputOnTap; + private boolean mScrollWheelAndFadingEdgesInitialized; /** - * The top of the top selection divider. + * The time of the last up event. */ - private int mTopSelectionDividerTop; - - /** - * The bottom of the bottom selection divider. - */ - private int mBottomSelectionDividerBottom; - - /** - * The virtual id of the last hovered child. - */ - private int mLastHoveredChildVirtualViewId; - - /** - * Provider to report to clients the semantic structure of this widget. - */ - private AccessibilityNodeProviderImpl mAccessibilityNodeProvider; + private long mLastUpEventTimeMillis; /** * Interface to listen for changes of the current value. @@ -465,7 +484,7 @@ public class NumberPicker extends LinearLayout { public static int SCROLL_STATE_IDLE = 0; /** - * The user is scrolling using touch, and his finger is still on the screen. + * The user is scrolling using touch, and their finger is still on the screen. */ public static int SCROLL_STATE_TOUCH_SCROLL = 1; @@ -530,78 +549,58 @@ public class NumberPicker extends LinearLayout { super(context, attrs, defStyle); // process style attributes - TypedArray attributesArray = context.obtainStyledAttributes( - attrs, R.styleable.NumberPicker, defStyle, 0); - final int layoutResId = attributesArray.getResourceId( - R.styleable.NumberPicker_internalLayout, DEFAULT_LAYOUT_RESOURCE_ID); - - mHasSelectorWheel = (layoutResId != DEFAULT_LAYOUT_RESOURCE_ID); - + TypedArray attributesArray = context.obtainStyledAttributes(attrs, + R.styleable.NumberPicker, defStyle, 0); mSolidColor = attributesArray.getColor(R.styleable.NumberPicker_solidColor, 0); - + mFlingable = attributesArray.getBoolean(R.styleable.NumberPicker_flingable, true); mSelectionDivider = attributesArray.getDrawable(R.styleable.NumberPicker_selectionDivider); - - final int defSelectionDividerHeight = (int) TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_DIP, UNSCALED_DEFAULT_SELECTION_DIVIDER_HEIGHT, + int defSelectionDividerHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, + UNSCALED_DEFAULT_SELECTION_DIVIDER_HEIGHT, getResources().getDisplayMetrics()); mSelectionDividerHeight = attributesArray.getDimensionPixelSize( R.styleable.NumberPicker_selectionDividerHeight, defSelectionDividerHeight); - - final int defSelectionDividerDistance = (int) TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_DIP, UNSCALED_DEFAULT_SELECTION_DIVIDERS_DISTANCE, - getResources().getDisplayMetrics()); - mSelectionDividersDistance = attributesArray.getDimensionPixelSize( - R.styleable.NumberPicker_selectionDividersDistance, defSelectionDividerDistance); - - final int defMinFlingDistance = (int) TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_DIP, UNSCALED_DEFAULT_MIN_FLING_DISTANCE, - getResources().getDisplayMetrics()); - mMinFlingDistance = attributesArray.getDimensionPixelSize( - R.styleable.NumberPicker_minFlingDistance, defMinFlingDistance); - mMinHeight = attributesArray.getDimensionPixelSize( R.styleable.NumberPicker_internalMinHeight, SIZE_UNSPECIFIED); - mMaxHeight = attributesArray.getDimensionPixelSize( R.styleable.NumberPicker_internalMaxHeight, SIZE_UNSPECIFIED); if (mMinHeight != SIZE_UNSPECIFIED && mMaxHeight != SIZE_UNSPECIFIED && mMinHeight > mMaxHeight) { throw new IllegalArgumentException("minHeight > maxHeight"); } - - mMinWidth = attributesArray.getDimensionPixelSize( - R.styleable.NumberPicker_internalMinWidth, SIZE_UNSPECIFIED); - - mMaxWidth = attributesArray.getDimensionPixelSize( - R.styleable.NumberPicker_internalMaxWidth, SIZE_UNSPECIFIED); + mMinWidth = attributesArray.getDimensionPixelSize(R.styleable.NumberPicker_internalMinWidth, + SIZE_UNSPECIFIED); + mMaxWidth = attributesArray.getDimensionPixelSize(R.styleable.NumberPicker_internalMaxWidth, + SIZE_UNSPECIFIED); if (mMinWidth != SIZE_UNSPECIFIED && mMaxWidth != SIZE_UNSPECIFIED && mMinWidth > mMaxWidth) { throw new IllegalArgumentException("minWidth > maxWidth"); } - mComputeMaxWidth = (mMaxWidth == Integer.MAX_VALUE); - attributesArray.recycle(); + mShowInputControlsAnimimationDuration = getResources().getInteger( + R.integer.config_longAnimTime); + // By default Linearlayout that we extend is not drawn. This is // its draw() method is not called but dispatchDraw() is called // directly (see ViewGroup.drawChild()). However, this class uses // the fading edge effect implemented by View and we need our // draw() method to be called. Therefore, we declare we will draw. - setWillNotDraw(!mHasSelectorWheel); + setWillNotDraw(false); + setSelectorWheelState(SELECTOR_WHEEL_STATE_NONE); LayoutInflater inflater = (LayoutInflater) getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE); - inflater.inflate(layoutResId, this, true); + inflater.inflate(R.layout.number_picker, this, true); OnClickListener onClickListener = new OnClickListener() { public void onClick(View v) { hideSoftInput(); mInputText.clearFocus(); if (v.getId() == R.id.increment) { - changeValueByOne(true); + changeCurrentByOne(true); } else { - changeValueByOne(false); + changeCurrentByOne(false); } } }; @@ -611,31 +610,23 @@ public class NumberPicker extends LinearLayout { hideSoftInput(); mInputText.clearFocus(); if (v.getId() == R.id.increment) { - postChangeCurrentByOneFromLongPress(true, 0); + postChangeCurrentByOneFromLongPress(true); } else { - postChangeCurrentByOneFromLongPress(false, 0); + postChangeCurrentByOneFromLongPress(false); } return true; } }; // increment button - if (!mHasSelectorWheel) { - mIncrementButton = (ImageButton) findViewById(R.id.increment); - mIncrementButton.setOnClickListener(onClickListener); - mIncrementButton.setOnLongClickListener(onLongClickListener); - } else { - mIncrementButton = null; - } + mIncrementButton = (ImageButton) findViewById(R.id.increment); + mIncrementButton.setOnClickListener(onClickListener); + mIncrementButton.setOnLongClickListener(onLongClickListener); // decrement button - if (!mHasSelectorWheel) { - mDecrementButton = (ImageButton) findViewById(R.id.decrement); - mDecrementButton.setOnClickListener(onClickListener); - mDecrementButton.setOnLongClickListener(onLongClickListener); - } else { - mDecrementButton = null; - } + mDecrementButton = (ImageButton) findViewById(R.id.decrement); + mDecrementButton.setOnClickListener(onClickListener); + mDecrementButton.setOnLongClickListener(onLongClickListener); // input text mInputText = (EditText) findViewById(R.id.numberpicker_input); @@ -657,6 +648,7 @@ public class NumberPicker extends LinearLayout { mInputText.setImeOptions(EditorInfo.IME_ACTION_DONE); // initialize constants + mTouchSlop = ViewConfiguration.getTapTimeout(); ViewConfiguration configuration = ViewConfiguration.get(context); mTouchSlop = configuration.getScaledTouchSlop(); mMinimumFlingVelocity = configuration.getScaledMinimumFlingVelocity(); @@ -675,22 +667,69 @@ public class NumberPicker extends LinearLayout { paint.setColor(color); mSelectorWheelPaint = paint; + // create the animator for showing the input controls + mDimSelectorWheelAnimator = ObjectAnimator.ofInt(this, PROPERTY_SELECTOR_PAINT_ALPHA, + SELECTOR_WHEEL_BRIGHT_ALPHA, SELECTOR_WHEEL_DIM_ALPHA); + final ObjectAnimator showIncrementButton = ObjectAnimator.ofFloat(mIncrementButton, + PROPERTY_BUTTON_ALPHA, BUTTON_ALPHA_TRANSPARENT, BUTTON_ALPHA_OPAQUE); + final ObjectAnimator showDecrementButton = ObjectAnimator.ofFloat(mDecrementButton, + PROPERTY_BUTTON_ALPHA, BUTTON_ALPHA_TRANSPARENT, BUTTON_ALPHA_OPAQUE); + mShowInputControlsAnimator = new AnimatorSet(); + mShowInputControlsAnimator.playTogether(mDimSelectorWheelAnimator, showIncrementButton, + showDecrementButton); + mShowInputControlsAnimator.addListener(new AnimatorListenerAdapter() { + private boolean mCanceled = false; + + @Override + public void onAnimationEnd(Animator animation) { + if (!mCanceled) { + // if canceled => we still want the wheel drawn + setSelectorWheelState(SELECTOR_WHEEL_STATE_SMALL); + } + mCanceled = false; + } + + @Override + public void onAnimationCancel(Animator animation) { + if (mShowInputControlsAnimator.isRunning()) { + mCanceled = true; + } + } + }); + // create the fling and adjust scrollers mFlingScroller = new Scroller(getContext(), null, true); mAdjustScroller = new Scroller(getContext(), new DecelerateInterpolator(2.5f)); updateInputTextView(); + updateIncrementAndDecrementButtonsVisibilityState(); + + if (mFlingable) { + if (isInEditMode()) { + setSelectorWheelState(SELECTOR_WHEEL_STATE_SMALL); + } else { + // Start with shown selector wheel and hidden controls. When made + // visible hide the selector and fade-in the controls to suggest + // fling interaction. + setSelectorWheelState(SELECTOR_WHEEL_STATE_LARGE); + hideInputControls(); + } + } } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - if (!mHasSelectorWheel) { - super.onLayout(changed, left, top, right, bottom); - return; - } final int msrdWdth = getMeasuredWidth(); final int msrdHght = getMeasuredHeight(); + // Increment button at the top. + final int inctBtnMsrdWdth = mIncrementButton.getMeasuredWidth(); + final int incrBtnLeft = (msrdWdth - inctBtnMsrdWdth) / 2; + final int incrBtnTop = 0; + final int incrBtnRight = incrBtnLeft + inctBtnMsrdWdth; + final int incrBtnBottom = incrBtnTop + mIncrementButton.getMeasuredHeight(); + mIncrementButton.layout(incrBtnLeft, incrBtnTop, incrBtnRight, incrBtnBottom); + // Input text centered horizontally. final int inptTxtMsrdWdth = mInputText.getMeasuredWidth(); final int inptTxtMsrdHght = mInputText.getMeasuredHeight(); @@ -700,23 +739,24 @@ public class NumberPicker extends LinearLayout { final int inptTxtBottom = inptTxtTop + inptTxtMsrdHght; mInputText.layout(inptTxtLeft, inptTxtTop, inptTxtRight, inptTxtBottom); - if (changed) { + // Decrement button at the top. + final int decrBtnMsrdWdth = mIncrementButton.getMeasuredWidth(); + final int decrBtnLeft = (msrdWdth - decrBtnMsrdWdth) / 2; + final int decrBtnTop = msrdHght - mDecrementButton.getMeasuredHeight(); + final int decrBtnRight = decrBtnLeft + decrBtnMsrdWdth; + final int decrBtnBottom = msrdHght; + mDecrementButton.layout(decrBtnLeft, decrBtnTop, decrBtnRight, decrBtnBottom); + + if (!mScrollWheelAndFadingEdgesInitialized) { + mScrollWheelAndFadingEdgesInitialized = true; // need to do all this when we know our size initializeSelectorWheel(); initializeFadingEdges(); - mTopSelectionDividerTop = (getHeight() - mSelectionDividersDistance) / 2 - - mSelectionDividerHeight; - mBottomSelectionDividerBottom = mTopSelectionDividerTop + 2 * mSelectionDividerHeight - + mSelectionDividersDistance; } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - if (!mHasSelectorWheel) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - return; - } // Try greedily to fit the max width and height. final int newWidthMeasureSpec = makeMeasureSpec(widthMeasureSpec, mMaxWidth); final int newHeightMeasureSpec = makeMeasureSpec(heightMeasureSpec, mMaxHeight); @@ -729,143 +769,120 @@ public class NumberPicker extends LinearLayout { setMeasuredDimension(widthSize, heightSize); } - /** - * Move to the final position of a scroller. Ensures to force finish the scroller - * and if it is not at its final position a scroll of the selector wheel is - * performed to fast forward to the final position. - * - * @param scroller The scroller to whose final position to get. - * @return True of the a move was performed, i.e. the scroller was not in final position. - */ - private boolean moveToFinalScrollerPosition(Scroller scroller) { - scroller.forceFinished(true); - int amountToScroll = scroller.getFinalY() - scroller.getCurrY(); - int futureScrollOffset = (mCurrentScrollOffset + amountToScroll) % mSelectorElementHeight; - int overshootAdjustment = mInitialScrollOffset - futureScrollOffset; - if (overshootAdjustment != 0) { - if (Math.abs(overshootAdjustment) > mSelectorElementHeight / 2) { - if (overshootAdjustment > 0) { - overshootAdjustment -= mSelectorElementHeight; - } else { - overshootAdjustment += mSelectorElementHeight; - } - } - amountToScroll += overshootAdjustment; - scrollBy(0, amountToScroll); - return true; - } - return false; - } - @Override public boolean onInterceptTouchEvent(MotionEvent event) { - if (!mHasSelectorWheel || !isEnabled()) { + if (!isEnabled() || !mFlingable) { return false; } - final int action = event.getActionMasked(); - switch (action) { - case MotionEvent.ACTION_DOWN: { + switch (event.getActionMasked()) { + case MotionEvent.ACTION_DOWN: + mLastMotionEventY = mLastDownEventY = event.getY(); removeAllCallbacks(); - mInputText.setVisibility(View.INVISIBLE); - mLastDownOrMoveEventY = mLastDownEventY = event.getY(); - mLastDownEventTime = event.getEventTime(); - mIngonreMoveEvents = false; - mShowSoftInputOnTap = false; - if (!mFlingScroller.isFinished()) { - mFlingScroller.forceFinished(true); - mAdjustScroller.forceFinished(true); - onScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); - } else if (!mAdjustScroller.isFinished()) { - mFlingScroller.forceFinished(true); - mAdjustScroller.forceFinished(true); - } else if (mLastDownEventY < mTopSelectionDividerTop) { + mShowInputControlsAnimator.cancel(); + mDimSelectorWheelAnimator.cancel(); + mCheckBeginEditOnUpEvent = false; + mAdjustScrollerOnUpEvent = true; + if (mSelectorWheelState == SELECTOR_WHEEL_STATE_LARGE) { + mSelectorWheelPaint.setAlpha(SELECTOR_WHEEL_BRIGHT_ALPHA); + boolean scrollersFinished = mFlingScroller.isFinished() + && mAdjustScroller.isFinished(); + if (!scrollersFinished) { + mFlingScroller.forceFinished(true); + mAdjustScroller.forceFinished(true); + onScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); + } + mCheckBeginEditOnUpEvent = scrollersFinished; + mAdjustScrollerOnUpEvent = true; hideSoftInput(); - postChangeCurrentByOneFromLongPress( - false, ViewConfiguration.getLongPressTimeout()); - } else if (mLastDownEventY > mBottomSelectionDividerBottom) { - hideSoftInput(); - postChangeCurrentByOneFromLongPress( - true, ViewConfiguration.getLongPressTimeout()); - } else { - mShowSoftInputOnTap = true; - postBeginSoftInputOnLongPressCommand(); + hideInputControls(); + return true; } + if (isEventInVisibleViewHitRect(event, mIncrementButton) + || isEventInVisibleViewHitRect(event, mDecrementButton)) { + return false; + } + mAdjustScrollerOnUpEvent = false; + setSelectorWheelState(SELECTOR_WHEEL_STATE_LARGE); + hideSoftInput(); + hideInputControls(); return true; - } + case MotionEvent.ACTION_MOVE: + float currentMoveY = event.getY(); + int deltaDownY = (int) Math.abs(currentMoveY - mLastDownEventY); + if (deltaDownY > mTouchSlop) { + mCheckBeginEditOnUpEvent = false; + onScrollStateChange(OnScrollListener.SCROLL_STATE_TOUCH_SCROLL); + setSelectorWheelState(SELECTOR_WHEEL_STATE_LARGE); + hideSoftInput(); + hideInputControls(); + return true; + } + break; } return false; } @Override - public boolean onTouchEvent(MotionEvent event) { - if (!isEnabled() || !mHasSelectorWheel) { + public boolean onTouchEvent(MotionEvent ev) { + if (!isEnabled()) { return false; } if (mVelocityTracker == null) { mVelocityTracker = VelocityTracker.obtain(); } - mVelocityTracker.addMovement(event); - int action = event.getActionMasked(); + mVelocityTracker.addMovement(ev); + int action = ev.getActionMasked(); switch (action) { - case MotionEvent.ACTION_MOVE: { - if (mIngonreMoveEvents) { - break; - } - float currentMoveY = event.getY(); - if (mScrollState != OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) { + case MotionEvent.ACTION_MOVE: + float currentMoveY = ev.getY(); + if (mCheckBeginEditOnUpEvent + || mScrollState != OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) { int deltaDownY = (int) Math.abs(currentMoveY - mLastDownEventY); if (deltaDownY > mTouchSlop) { - removeAllCallbacks(); + mCheckBeginEditOnUpEvent = false; onScrollStateChange(OnScrollListener.SCROLL_STATE_TOUCH_SCROLL); } - } else { - int deltaMoveY = (int) ((currentMoveY - mLastDownOrMoveEventY) - / TOUCH_SCROLL_DECELERATION_COEFFICIENT); - scrollBy(0, deltaMoveY); - invalidate(); } - mLastDownOrMoveEventY = currentMoveY; - } break; - case MotionEvent.ACTION_UP: { - removeBeginSoftInputCommand(); - removeChangeCurrentByOneFromLongPress(); + int deltaMoveY = (int) (currentMoveY - mLastMotionEventY); + scrollBy(0, deltaMoveY); + invalidate(); + mLastMotionEventY = currentMoveY; + break; + case MotionEvent.ACTION_UP: + if (mCheckBeginEditOnUpEvent) { + mCheckBeginEditOnUpEvent = false; + final long deltaTapTimeMillis = ev.getEventTime() - mLastUpEventTimeMillis; + if (deltaTapTimeMillis < ViewConfiguration.getDoubleTapTimeout()) { + setSelectorWheelState(SELECTOR_WHEEL_STATE_SMALL); + showInputControls(mShowInputControlsAnimimationDuration); + mInputText.requestFocus(); + InputMethodManager inputMethodManager = InputMethodManager.peekInstance(); + if (inputMethodManager != null) { + inputMethodManager.showSoftInput(mInputText, 0); + } + mLastUpEventTimeMillis = ev.getEventTime(); + return true; + } + } VelocityTracker velocityTracker = mVelocityTracker; velocityTracker.computeCurrentVelocity(1000, mMaximumFlingVelocity); int initialVelocity = (int) velocityTracker.getYVelocity(); if (Math.abs(initialVelocity) > mMinimumFlingVelocity) { - int deltaMove = (int) (event.getY() - mLastDownEventY); - int absDeltaMoveY = Math.abs(deltaMove); - if (absDeltaMoveY > mMinFlingDistance) { - fling(initialVelocity); - } else { - changeValueByOne(deltaMove < 0); - } + fling(initialVelocity); onScrollStateChange(OnScrollListener.SCROLL_STATE_FLING); } else { - int eventY = (int) event.getY(); - int deltaMoveY = (int) Math.abs(eventY - mLastDownEventY); - long deltaTime = event.getEventTime() - mLastDownEventTime; - if (deltaMoveY <= mTouchSlop && deltaTime < ViewConfiguration.getTapTimeout()) { - if (mShowSoftInputOnTap) { - mShowSoftInputOnTap = false; - showSoftInput(); - } else { - int selectorIndexOffset = (eventY / mSelectorElementHeight) - - SELECTOR_MIDDLE_ITEM_INDEX; - if (selectorIndexOffset > 0) { - changeValueByOne(true); - } else if (selectorIndexOffset < 0) { - changeValueByOne(false); - } + if (mAdjustScrollerOnUpEvent) { + if (mFlingScroller.isFinished() && mAdjustScroller.isFinished()) { + postAdjustScrollerCommand(0); } } else { - ensureScrollWheelAdjusted(); + postAdjustScrollerCommand(SHOW_INPUT_CONTROLS_DELAY_MILLIS); } - onScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); } mVelocityTracker.recycle(); mVelocityTracker = null; - } break; + mLastUpEventTimeMillis = ev.getEventTime(); + break; } return true; } @@ -874,6 +891,12 @@ public class NumberPicker extends LinearLayout { public boolean dispatchTouchEvent(MotionEvent event) { final int action = event.getActionMasked(); switch (action) { + case MotionEvent.ACTION_MOVE: + if (mSelectorWheelState == SELECTOR_WHEEL_STATE_LARGE) { + removeAllCallbacks(); + forceCompleteChangeCurrentByOneViaScroll(); + } + break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: removeAllCallbacks(); @@ -884,75 +907,27 @@ public class NumberPicker extends LinearLayout { @Override public boolean dispatchKeyEvent(KeyEvent event) { - final int keyCode = event.getKeyCode(); - switch (keyCode) { - case KeyEvent.KEYCODE_DPAD_CENTER: - case KeyEvent.KEYCODE_ENTER: - removeAllCallbacks(); - break; + int keyCode = event.getKeyCode(); + if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER) { + removeAllCallbacks(); } return super.dispatchKeyEvent(event); } @Override public boolean dispatchTrackballEvent(MotionEvent event) { - final int action = event.getActionMasked(); - switch (action) { - case MotionEvent.ACTION_CANCEL: - case MotionEvent.ACTION_UP: - removeAllCallbacks(); - break; + int action = event.getActionMasked(); + if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) { + removeAllCallbacks(); } return super.dispatchTrackballEvent(event); } - @Override - protected boolean dispatchHoverEvent(MotionEvent event) { - if (!mHasSelectorWheel) { - return super.dispatchHoverEvent(event); - } - if (AccessibilityManager.getInstance(mContext).isEnabled()) { - final int eventY = (int) event.getY(); - final int hoveredVirtualViewId; - if (eventY < mTopSelectionDividerTop) { - hoveredVirtualViewId = AccessibilityNodeProviderImpl.VIRTUAL_VIEW_ID_DECREMENT; - } else if (eventY > mBottomSelectionDividerBottom) { - hoveredVirtualViewId = AccessibilityNodeProviderImpl.VIRTUAL_VIEW_ID_INCREMENT; - } else { - hoveredVirtualViewId = AccessibilityNodeProviderImpl.VIRTUAL_VIEW_ID_INPUT; - } - final int action = event.getActionMasked(); - AccessibilityNodeProviderImpl provider = - (AccessibilityNodeProviderImpl) getAccessibilityNodeProvider(); - switch (action) { - case MotionEvent.ACTION_HOVER_ENTER: { - provider.sendAccessibilityEventForVirtualView(hoveredVirtualViewId, - AccessibilityEvent.TYPE_VIEW_HOVER_ENTER); - mLastHoveredChildVirtualViewId = hoveredVirtualViewId; - } break; - case MotionEvent.ACTION_HOVER_MOVE: { - if (mLastHoveredChildVirtualViewId != hoveredVirtualViewId - && mLastHoveredChildVirtualViewId != View.NO_ID) { - provider.sendAccessibilityEventForVirtualView( - mLastHoveredChildVirtualViewId, - AccessibilityEvent.TYPE_VIEW_HOVER_EXIT); - provider.sendAccessibilityEventForVirtualView(hoveredVirtualViewId, - AccessibilityEvent.TYPE_VIEW_HOVER_ENTER); - mLastHoveredChildVirtualViewId = hoveredVirtualViewId; - } - } break; - case MotionEvent.ACTION_HOVER_EXIT: { - provider.sendAccessibilityEventForVirtualView(hoveredVirtualViewId, - AccessibilityEvent.TYPE_VIEW_HOVER_EXIT); - mLastHoveredChildVirtualViewId = View.NO_ID; - } break; - } - } - return false; - } - @Override public void computeScroll() { + if (mSelectorWheelState == SELECTOR_WHEEL_STATE_NONE) { + return; + } Scroller scroller = mFlingScroller; if (scroller.isFinished()) { scroller = mAdjustScroller; @@ -977,17 +952,16 @@ public class NumberPicker extends LinearLayout { @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); - if (!mHasSelectorWheel) { - mIncrementButton.setEnabled(enabled); - } - if (!mHasSelectorWheel) { - mDecrementButton.setEnabled(enabled); - } + mIncrementButton.setEnabled(enabled); + mDecrementButton.setEnabled(enabled); mInputText.setEnabled(enabled); } @Override public void scrollBy(int x, int y) { + if (mSelectorWheelState == SELECTOR_WHEEL_STATE_NONE) { + return; + } int[] selectorIndices = mSelectorIndices; if (!mWrapSelectorWheel && y > 0 && selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] <= mMinValue) { @@ -1003,7 +977,7 @@ public class NumberPicker extends LinearLayout { while (mCurrentScrollOffset - mInitialScrollOffset > mSelectorTextGapHeight) { mCurrentScrollOffset -= mSelectorElementHeight; decrementSelectorIndices(selectorIndices); - setValueInternal(selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX], true); + changeCurrent(selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX]); if (!mWrapSelectorWheel && selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] <= mMinValue) { mCurrentScrollOffset = mInitialScrollOffset; } @@ -1011,7 +985,7 @@ public class NumberPicker extends LinearLayout { while (mCurrentScrollOffset - mInitialScrollOffset < -mSelectorTextGapHeight) { mCurrentScrollOffset += mSelectorElementHeight; incrementSelectorIndices(selectorIndices); - setValueInternal(selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX], true); + changeCurrent(selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX]); if (!mWrapSelectorWheel && selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] >= mMaxValue) { mCurrentScrollOffset = mInitialScrollOffset; } @@ -1050,7 +1024,8 @@ public class NumberPicker extends LinearLayout { * * @param formatter The formatter object. If formatter is null, * {@link String#valueOf(int)} will be used. - *@see #setDisplayedValues(String[]) + * + * @see #setDisplayedValues(String[]) */ public void setFormatter(Formatter formatter) { if (formatter == mFormatter) { @@ -1093,35 +1068,26 @@ public class NumberPicker extends LinearLayout { if (mValue == value) { return; } - setValueInternal(value, false); + if (value < mMinValue) { + value = mWrapSelectorWheel ? mMaxValue : mMinValue; + } + if (value > mMaxValue) { + value = mWrapSelectorWheel ? mMinValue : mMaxValue; + } + mValue = value; initializeSelectorWheelIndices(); + updateInputTextView(); + updateIncrementAndDecrementButtonsVisibilityState(); invalidate(); } /** - * Shows the soft input for its input text. - */ - private void showSoftInput() { - InputMethodManager inputMethodManager = InputMethodManager.peekInstance(); - if (inputMethodManager != null) { - if (mHasSelectorWheel) { - mInputText.setVisibility(View.VISIBLE); - } - mInputText.requestFocus(); - inputMethodManager.showSoftInput(mInputText, 0); - } - } - - /** - * Hides the soft input if it is active for the input text. + * Hides the soft input of it is active for the input text. */ private void hideSoftInput() { InputMethodManager inputMethodManager = InputMethodManager.peekInstance(); if (inputMethodManager != null && inputMethodManager.isActive(mInputText)) { inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0); - if (mHasSelectorWheel) { - mInputText.setVisibility(View.INVISIBLE); - } } } @@ -1185,23 +1151,23 @@ public class NumberPicker extends LinearLayout { * wrap around the {@link NumberPicker#getMinValue()} and * {@link NumberPicker#getMaxValue()} values. *

- * By default if the range (max - min) is more than {@link #SELECTOR_WHEEL_ITEM_COUNT} - * (the number of items shown on the selector wheel) the selector wheel - * wrapping is enabled. + * By default if the range (max - min) is more than five (the number of + * items shown on the selector wheel) the selector wheel wrapping is + * enabled. *

*

- * Note: If the number of items, i.e. the range ( - * {@link #getMaxValue()} - {@link #getMinValue()}) is less than - * {@link #SELECTOR_WHEEL_ITEM_COUNT}, the selector wheel will not wrap. - * Hence, in such a case calling this method is a NOP. + * Note: If the number of items, i.e. the range + * ({@link #getMaxValue()} - {@link #getMinValue()}) is less than + * {@link #SELECTOR_WHEEL_ITEM_COUNT}, the selector wheel will not + * wrap. Hence, in such a case calling this method is a NOP. *

- * * @param wrapSelectorWheel Whether to wrap. */ public void setWrapSelectorWheel(boolean wrapSelectorWheel) { final boolean wrappingAllowed = (mMaxValue - mMinValue) >= mSelectorIndices.length; if ((!wrapSelectorWheel || wrappingAllowed) && wrapSelectorWheel != mWrapSelectorWheel) { mWrapSelectorWheel = wrapSelectorWheel; + updateIncrementAndDecrementButtonsVisibilityState(); } } @@ -1258,7 +1224,6 @@ public class NumberPicker extends LinearLayout { initializeSelectorWheelIndices(); updateInputTextView(); tryComputeMaxWidth(); - invalidate(); } /** @@ -1291,7 +1256,6 @@ public class NumberPicker extends LinearLayout { initializeSelectorWheelIndices(); updateInputTextView(); tryComputeMaxWidth(); - invalidate(); } /** @@ -1335,50 +1299,103 @@ public class NumberPicker extends LinearLayout { return TOP_AND_BOTTOM_FADING_EDGE_STRENGTH; } + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + // make sure we show the controls only the very + // first time the user sees this widget + if (mFlingable && !isInEditMode()) { + // animate a bit slower the very first time + showInputControls(mShowInputControlsAnimimationDuration * 2); + } + } + @Override protected void onDetachedFromWindow() { removeAllCallbacks(); } + @Override + protected void dispatchDraw(Canvas canvas) { + // There is a good reason for doing this. See comments in draw(). + } + + @Override + public void draw(Canvas canvas) { + // Dispatch draw to our children only if we are not currently running + // the animation for simultaneously dimming the scroll wheel and + // showing in the buttons. This class takes advantage of the View + // implementation of fading edges effect to draw the selector wheel. + // However, in View.draw(), the fading is applied after all the children + // have been drawn and we do not want this fading to be applied to the + // buttons. Therefore, we draw our children after we have completed + // drawing ourselves. + super.draw(canvas); + + // Draw our children if we are not showing the selector wheel of fading + // it out + if (mShowInputControlsAnimator.isRunning() + || mSelectorWheelState != SELECTOR_WHEEL_STATE_LARGE) { + long drawTime = getDrawingTime(); + for (int i = 0, count = getChildCount(); i < count; i++) { + View child = getChildAt(i); + if (!child.isShown()) { + continue; + } + drawChild(canvas, getChildAt(i), drawTime); + } + } + } + @Override protected void onDraw(Canvas canvas) { - if (!mHasSelectorWheel) { - super.onDraw(canvas); + if (mSelectorWheelState == SELECTOR_WHEEL_STATE_NONE) { return; } + float x = (mRight - mLeft) / 2; float y = mCurrentScrollOffset; + final int restoreCount = canvas.save(); + + if (mSelectorWheelState == SELECTOR_WHEEL_STATE_SMALL) { + Rect clipBounds = canvas.getClipBounds(); + clipBounds.inset(0, mSelectorElementHeight); + canvas.clipRect(clipBounds); + } + // draw the selector wheel int[] selectorIndices = mSelectorIndices; for (int i = 0; i < selectorIndices.length; i++) { int selectorIndex = selectorIndices[i]; String scrollSelectorValue = mSelectorIndexToStringCache.get(selectorIndex); - // Do not draw the middle item if input is visible since the input - // is shown only if the wheel is static and it covers the middle - // item. Otherwise, if the user starts editing the text via the - // IME he may see a dimmed version of the old value intermixed - // with the new one. + // Do not draw the middle item if input is visible since the input is shown only + // if the wheel is static and it covers the middle item. Otherwise, if the user + // starts editing the text via the IME he may see a dimmed version of the old + // value intermixed with the new one. if (i != SELECTOR_MIDDLE_ITEM_INDEX || mInputText.getVisibility() != VISIBLE) { canvas.drawText(scrollSelectorValue, x, y, mSelectorWheelPaint); } y += mSelectorElementHeight; } - // draw the selection dividers + // draw the selection dividers (only if scrolling and drawable specified) if (mSelectionDivider != null) { // draw the top divider - int topOfTopDivider = mTopSelectionDividerTop; + int topOfTopDivider = + (getHeight() - mSelectorElementHeight - mSelectionDividerHeight) / 2; int bottomOfTopDivider = topOfTopDivider + mSelectionDividerHeight; mSelectionDivider.setBounds(0, topOfTopDivider, mRight, bottomOfTopDivider); mSelectionDivider.draw(canvas); // draw the bottom divider - int bottomOfBottomDivider = mBottomSelectionDividerBottom; - int topOfBottomDivider = bottomOfBottomDivider - mSelectionDividerHeight; + int topOfBottomDivider = topOfTopDivider + mSelectorElementHeight; + int bottomOfBottomDivider = bottomOfTopDivider + mSelectorElementHeight; mSelectionDivider.setBounds(0, topOfBottomDivider, mRight, bottomOfBottomDivider); mSelectionDivider.draw(canvas); } + + canvas.restoreToCount(restoreCount); } @Override @@ -1391,20 +1408,12 @@ public class NumberPicker extends LinearLayout { public void onInitializeAccessibilityEvent(AccessibilityEvent event) { super.onInitializeAccessibilityEvent(event); event.setClassName(NumberPicker.class.getName()); - event.setScrollable(true); - event.setScrollY((mMinValue + mValue) * mSelectorElementHeight); - event.setMaxScrollY((mMaxValue - mMinValue) * mSelectorElementHeight); } @Override - public AccessibilityNodeProvider getAccessibilityNodeProvider() { - if (!mHasSelectorWheel) { - return super.getAccessibilityNodeProvider(); - } - if (mAccessibilityNodeProvider == null) { - mAccessibilityNodeProvider = new AccessibilityNodeProviderImpl(); - } - return mAccessibilityNodeProvider; + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(info); + info.setClassName(NumberPicker.class.getName()); } /** @@ -1433,17 +1442,17 @@ public class NumberPicker extends LinearLayout { } /** - * Utility to reconcile a desired size and state, with constraints imposed - * by a MeasureSpec. Tries to respect the min size, unless a different size - * is imposed by the constraints. + * Utility to reconcile a desired size and state, with constraints imposed by + * a MeasureSpec. Tries to respect the min size, unless a different size is + * imposed by the constraints. * * @param minSize The minimal desired size. * @param measuredSize The currently measured size. * @param measureSpec The current measure spec. * @return The resolved size and state. */ - private int resolveSizeAndStateRespectingMinSize( - int minSize, int measuredSize, int measureSpec) { + private int resolveSizeAndStateRespectingMinSize(int minSize, int measuredSize, + int measureSpec) { if (minSize != SIZE_UNSPECIFIED) { final int desiredWidth = Math.max(minSize, measuredSize); return resolveSizeAndState(desiredWidth, measureSpec, 0); @@ -1453,8 +1462,8 @@ public class NumberPicker extends LinearLayout { } /** - * Resets the selector indices and clear the cached string representation of - * these indices. + * Resets the selector indices and clear the cached + * string representation of these indices. */ private void initializeSelectorWheelIndices() { mSelectorIndexToStringCache.clear(); @@ -1471,44 +1480,39 @@ public class NumberPicker extends LinearLayout { } /** - * Sets the current value of this NumberPicker. + * 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 + * change the wrapping behavior * - * @param current The new value of the NumberPicker. - * @param notifyChange Whether to notify if the current value changed. + * @param current the new value of the NumberPicker */ - private void setValueInternal(int current, boolean notifyChange) { + private void changeCurrent(int current) { if (mValue == current) { return; } // Wrap around the values if we go past the start or end if (mWrapSelectorWheel) { current = getWrappedSelectorIndex(current); - } else { - current = Math.max(current, mMinValue); - current = Math.min(current, mMaxValue); } int previous = mValue; - mValue = current; - updateInputTextView(); - if (notifyChange) { - notifyChange(previous, current); - } + setValue(current); + notifyChange(previous, current); } /** * Changes the current value by one which is increment or * decrement based on the passes argument. - * decrement the current value. * * @param increment True to increment, false to decrement. */ - private void changeValueByOne(boolean increment) { - if (mHasSelectorWheel) { + private void changeCurrentByOne(boolean increment) { + if (mFlingable) { + mDimSelectorWheelAnimator.cancel(); mInputText.setVisibility(View.INVISIBLE); - if (!moveToFinalScrollerPosition(mFlingScroller)) { - moveToFinalScrollerPosition(mAdjustScroller); - } + mSelectorWheelPaint.setAlpha(SELECTOR_WHEEL_BRIGHT_ALPHA); mPreviousScrollerY = 0; + forceCompleteChangeCurrentByOneViaScroll(); if (increment) { mFlingScroller.startScroll(0, 0, 0, -mSelectorElementHeight, CHANGE_CURRENT_BY_ONE_SCROLL_DURATION); @@ -1519,26 +1523,81 @@ public class NumberPicker extends LinearLayout { invalidate(); } else { if (increment) { - setValueInternal(mValue + 1, true); + changeCurrent(mValue + 1); } else { - setValueInternal(mValue - 1, true); + changeCurrent(mValue - 1); } } } + /** + * Ensures that if we are in the process of changing the current value + * by one via scrolling the scroller gets to its final state and the + * value is updated. + */ + private void forceCompleteChangeCurrentByOneViaScroll() { + Scroller scroller = mFlingScroller; + if (!scroller.isFinished()) { + final int yBeforeAbort = scroller.getCurrY(); + scroller.abortAnimation(); + final int yDelta = scroller.getCurrY() - yBeforeAbort; + scrollBy(0, yDelta); + } + } + + /** + * Sets the alpha of the {@link Paint} for drawing the selector + * wheel. + */ + @SuppressWarnings("unused") + // Called via reflection + private void setSelectorPaintAlpha(int alpha) { + mSelectorWheelPaint.setAlpha(alpha); + invalidate(); + } + + /** + * @return If the event is in the visible view. + */ + private boolean isEventInVisibleViewHitRect(MotionEvent event, View view) { + if (view.getVisibility() == VISIBLE) { + view.getHitRect(mTempRect); + return mTempRect.contains((int) event.getX(), (int) event.getY()); + } + return false; + } + + /** + * Sets the selectorWheelState. + */ + private void setSelectorWheelState(int selectorWheelState) { + mSelectorWheelState = selectorWheelState; + if (selectorWheelState == SELECTOR_WHEEL_STATE_LARGE) { + mSelectorWheelPaint.setAlpha(SELECTOR_WHEEL_BRIGHT_ALPHA); + } + + if (mFlingable && selectorWheelState == SELECTOR_WHEEL_STATE_LARGE + && AccessibilityManager.getInstance(mContext).isEnabled()) { + AccessibilityManager.getInstance(mContext).interrupt(); + String text = mContext.getString(R.string.number_picker_increment_scroll_action); + mInputText.setContentDescription(text); + mInputText.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); + mInputText.setContentDescription(null); + } + } + private void initializeSelectorWheel() { initializeSelectorWheelIndices(); int[] selectorIndices = mSelectorIndices; int totalTextHeight = selectorIndices.length * mTextSize; float totalTextGapHeight = (mBottom - mTop) - totalTextHeight; - float textGapCount = selectorIndices.length; + float textGapCount = selectorIndices.length - 1; mSelectorTextGapHeight = (int) (totalTextGapHeight / textGapCount + 0.5f); mSelectorElementHeight = mTextSize + mSelectorTextGapHeight; - // Ensure that the middle item is positioned the same as the text in - // mInputText + // Ensure that the middle item is positioned the same as the text in mInputText int editTextTextPosition = mInputText.getBaseline() + mInputText.getTop(); - mInitialScrollOffset = editTextTextPosition - - (mSelectorElementHeight * SELECTOR_MIDDLE_ITEM_INDEX); + mInitialScrollOffset = editTextTextPosition - + (mSelectorElementHeight * SELECTOR_MIDDLE_ITEM_INDEX); mCurrentScrollOffset = mInitialScrollOffset; updateInputTextView(); } @@ -1553,14 +1612,16 @@ public class NumberPicker extends LinearLayout { */ private void onScrollerFinished(Scroller scroller) { if (scroller == mFlingScroller) { - if (!ensureScrollWheelAdjusted()) { + if (mSelectorWheelState == SELECTOR_WHEEL_STATE_LARGE) { + postAdjustScrollerCommand(0); + onScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); + } else { updateInputTextView(); + fadeSelectorWheel(mShowInputControlsAnimimationDuration); } - onScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); } else { - if (mScrollState != OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) { - updateInputTextView(); - } + updateInputTextView(); + showInputControls(mShowInputControlsAnimimationDuration); } } @@ -1592,6 +1653,56 @@ public class NumberPicker extends LinearLayout { invalidate(); } + /** + * Hides the input controls which is the up/down arrows and the text field. + */ + private void hideInputControls() { + mShowInputControlsAnimator.cancel(); + mIncrementButton.setVisibility(INVISIBLE); + mDecrementButton.setVisibility(INVISIBLE); + mInputText.setVisibility(INVISIBLE); + } + + /** + * Show the input controls by making them visible and animating the alpha + * property up/down arrows. + * + * @param animationDuration The duration of the animation. + */ + private void showInputControls(long animationDuration) { + updateIncrementAndDecrementButtonsVisibilityState(); + mInputText.setVisibility(VISIBLE); + mShowInputControlsAnimator.setDuration(animationDuration); + mShowInputControlsAnimator.start(); + } + + /** + * Fade the selector wheel via an animation. + * + * @param animationDuration The duration of the animation. + */ + private void fadeSelectorWheel(long animationDuration) { + mInputText.setVisibility(VISIBLE); + mDimSelectorWheelAnimator.setDuration(animationDuration); + mDimSelectorWheelAnimator.start(); + } + + /** + * Updates the visibility state of the increment and decrement buttons. + */ + private void updateIncrementAndDecrementButtonsVisibilityState() { + if (mWrapSelectorWheel || mValue < mMaxValue) { + mIncrementButton.setVisibility(VISIBLE); + } else { + mIncrementButton.setVisibility(INVISIBLE); + } + if (mWrapSelectorWheel || mValue > mMinValue) { + mDecrementButton.setVisibility(VISIBLE); + } else { + mDecrementButton.setVisibility(INVISIBLE); + } + } + /** * @return The wrapped index selectorIndex value. */ @@ -1638,7 +1749,8 @@ public class NumberPicker extends LinearLayout { /** * Ensures we have a cached string representation of the given - * selectorIndex to avoid multiple instantiations of the same string. + * selectorIndex + * to avoid multiple instantiations of the same string. */ private void ensureCachedScrollSelectorValue(int selectorIndex) { SparseArray cache = mSelectorIndexToStringCache; @@ -1671,7 +1783,7 @@ public class NumberPicker extends LinearLayout { } else { // Check the new value and ensure it's in range int current = getSelectedPos(str.toString()); - setValueInternal(current, true); + changeCurrent(current); } } @@ -1680,23 +1792,25 @@ public class NumberPicker extends LinearLayout { * the string corresponding to the index specified by the current value will * be returned. Otherwise, the formatter specified in {@link #setFormatter} * will be used to format the number. - * - * @return Whether the text was updated. */ - private boolean updateInputTextView() { + private void updateInputTextView() { /* * If we don't have displayed values then use the current number else * find the correct value in the displayed values for the current * number. */ - String text = (mDisplayedValues == null) ? formatNumber(mValue) - : mDisplayedValues[mValue - mMinValue]; - if (!TextUtils.isEmpty(text) && !text.equals(mInputText.getText().toString())) { - mInputText.setText(text); - return true; + if (mDisplayedValues == null) { + mInputText.setText(formatNumber(mValue)); + } else { + mInputText.setText(mDisplayedValues[mValue - mMinValue]); } + mInputText.setSelection(mInputText.getText().length()); - return false; + if (mFlingable && AccessibilityManager.getInstance(mContext).isEnabled()) { + String text = mContext.getString(R.string.number_picker_increment_scroll_mode, + mInputText.getText()); + mInputText.setContentDescription(text); + } } /** @@ -1714,45 +1828,14 @@ public class NumberPicker extends LinearLayout { * * @param increment Whether to increment or decrement the value. */ - private void postChangeCurrentByOneFromLongPress(boolean increment, long delayMillis) { + private void postChangeCurrentByOneFromLongPress(boolean increment) { + mInputText.clearFocus(); + removeAllCallbacks(); if (mChangeCurrentByOneFromLongPressCommand == null) { mChangeCurrentByOneFromLongPressCommand = new ChangeCurrentByOneFromLongPressCommand(); - } else { - removeCallbacks(mChangeCurrentByOneFromLongPressCommand); - } - mChangeCurrentByOneFromLongPressCommand.setStep(increment); - postDelayed(mChangeCurrentByOneFromLongPressCommand, delayMillis); - } - - /** - * Removes the command for changing the current value by one. - */ - private void removeChangeCurrentByOneFromLongPress() { - if (mChangeCurrentByOneFromLongPressCommand != null) { - removeCallbacks(mChangeCurrentByOneFromLongPressCommand); - } - } - - /** - * Posts a command for beginning an edit of the current value via IME on - * long press. - */ - private void postBeginSoftInputOnLongPressCommand() { - if (mBeginSoftInputOnLongPressCommand == null) { - mBeginSoftInputOnLongPressCommand = new BeginSoftInputOnLongPressCommand(); - } else { - removeCallbacks(mBeginSoftInputOnLongPressCommand); - } - postDelayed(mBeginSoftInputOnLongPressCommand, ViewConfiguration.getLongPressTimeout()); - } - - /** - * Removes the command for beginning an edit of the current value via IME. - */ - private void removeBeginSoftInputCommand() { - if (mBeginSoftInputOnLongPressCommand != null) { - removeCallbacks(mBeginSoftInputOnLongPressCommand); } + mChangeCurrentByOneFromLongPressCommand.setIncrement(increment); + post(mChangeCurrentByOneFromLongPressCommand); } /** @@ -1762,12 +1845,12 @@ public class NumberPicker extends LinearLayout { if (mChangeCurrentByOneFromLongPressCommand != null) { removeCallbacks(mChangeCurrentByOneFromLongPressCommand); } + if (mAdjustScrollerCommand != null) { + removeCallbacks(mAdjustScrollerCommand); + } if (mSetSelectionCommand != null) { removeCallbacks(mSetSelectionCommand); } - if (mBeginSoftInputOnLongPressCommand != null) { - removeCallbacks(mBeginSoftInputOnLongPressCommand); - } } /** @@ -1805,7 +1888,8 @@ public class NumberPicker extends LinearLayout { /** * Posts an {@link SetSelectionCommand} from the given selectionStart - * to selectionEnd. + * to + * selectionEnd. */ private void postSetSelectionCommand(int selectionStart, int selectionEnd) { if (mSetSelectionCommand == null) { @@ -1818,6 +1902,20 @@ public class NumberPicker extends LinearLayout { post(mSetSelectionCommand); } + /** + * Posts an {@link AdjustScrollerCommand} within the given + * delayMillis + * . + */ + private void postAdjustScrollerCommand(int delayMillis) { + if (mAdjustScrollerCommand == null) { + mAdjustScrollerCommand = new AdjustScrollerCommand(); + } else { + removeCallbacks(mAdjustScrollerCommand); + } + postDelayed(mAdjustScrollerCommand, delayMillis); + } + /** * Filter for accepting only valid indices or prefixes of the string * representation of valid indices. @@ -1836,8 +1934,8 @@ public class NumberPicker extends LinearLayout { } @Override - public CharSequence filter( - CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { + public CharSequence filter(CharSequence source, int start, int end, Spanned dest, + int dstart, int dend) { if (mDisplayedValues == null) { CharSequence filtered = super.filter(source, start, end, dest, dstart, dend); if (filtered == null) { @@ -1882,27 +1980,6 @@ public class NumberPicker extends LinearLayout { } } - /** - * Ensures that the scroll wheel is adjusted i.e. there is no offset and the - * middle element is in the middle of the widget. - * - * @return Whether an adjustment has been made. - */ - private boolean ensureScrollWheelAdjusted() { - // adjust to the closest value - int deltaY = mInitialScrollOffset - mCurrentScrollOffset; - if (deltaY != 0) { - mPreviousScrollerY = 0; - if (Math.abs(deltaY) > mSelectorElementHeight / 2) { - deltaY += (deltaY > 0) ? -mSelectorElementHeight : mSelectorElementHeight; - } - mAdjustScroller.startScroll(0, 0, 0, deltaY, SELECTOR_ADJUSTMENT_DURATION_MILLIS); - invalidate(); - return true; - } - return false; - } - /** * Command for setting the input text selection. */ @@ -1916,19 +1993,40 @@ public class NumberPicker extends LinearLayout { } } + /** + * Command for adjusting the scroller to show in its center the closest of + * the displayed items. + */ + class AdjustScrollerCommand implements Runnable { + public void run() { + mPreviousScrollerY = 0; + if (mInitialScrollOffset == mCurrentScrollOffset) { + updateInputTextView(); + showInputControls(mShowInputControlsAnimimationDuration); + return; + } + // adjust to the closest value + int deltaY = mInitialScrollOffset - mCurrentScrollOffset; + if (Math.abs(deltaY) > mSelectorElementHeight / 2) { + deltaY += (deltaY > 0) ? -mSelectorElementHeight : mSelectorElementHeight; + } + mAdjustScroller.startScroll(0, 0, 0, deltaY, SELECTOR_ADJUSTMENT_DURATION_MILLIS); + invalidate(); + } + } + /** * Command for changing the current value from a long press by one. */ class ChangeCurrentByOneFromLongPressCommand implements Runnable { private boolean mIncrement; - private void setStep(boolean increment) { + private void setIncrement(boolean increment) { mIncrement = increment; } - @Override public void run() { - changeValueByOne(mIncrement); + changeCurrentByOne(mIncrement); postDelayed(this, mLongPressUpdateInterval); } } @@ -1950,248 +2048,4 @@ public class NumberPicker extends LinearLayout { } } } - - /** - * Command for beginning soft input on long press. - */ - class BeginSoftInputOnLongPressCommand implements Runnable { - - @Override - public void run() { - showSoftInput(); - mIngonreMoveEvents = true; - } - } - - class AccessibilityNodeProviderImpl extends AccessibilityNodeProvider { - private static final int VIRTUAL_VIEW_ID_INCREMENT = 1; - - private static final int VIRTUAL_VIEW_ID_INPUT = 2; - - private static final int VIRTUAL_VIEW_ID_DECREMENT = 3; - - private final Rect mTempRect = new Rect(); - - private final int[] mTempArray = new int[2]; - - @Override - public AccessibilityNodeInfo createAccessibilityNodeInfo(int virtualViewId) { - switch (virtualViewId) { - case View.NO_ID: - return createAccessibilityNodeInfoForNumberPicker( mScrollX, mScrollY, - mScrollX + (mRight - mLeft), mScrollY + (mBottom - mTop)); - case VIRTUAL_VIEW_ID_DECREMENT: - return createAccessibilityNodeInfoForVirtualButton(VIRTUAL_VIEW_ID_DECREMENT, - getVirtualDecrementButtonText(), mScrollX, mScrollY, - mScrollX + (mRight - mLeft), - mTopSelectionDividerTop + mSelectionDividerHeight); - case VIRTUAL_VIEW_ID_INPUT: - return createAccessibiltyNodeInfoForInputText(); - case VIRTUAL_VIEW_ID_INCREMENT: - return createAccessibilityNodeInfoForVirtualButton(VIRTUAL_VIEW_ID_INCREMENT, - getVirtualIncrementButtonText(), mScrollX, - mBottomSelectionDividerBottom - mSelectionDividerHeight, - mScrollX + (mRight - mLeft), mScrollY + (mBottom - mTop)); - } - return super.createAccessibilityNodeInfo(virtualViewId); - } - - @Override - public List findAccessibilityNodeInfosByText(String searched, - int virtualViewId) { - if (TextUtils.isEmpty(searched)) { - return Collections.emptyList(); - } - String searchedLowerCase = searched.toLowerCase(); - List result = new ArrayList(); - switch (virtualViewId) { - case View.NO_ID: { - findAccessibilityNodeInfosByTextInChild(searchedLowerCase, - VIRTUAL_VIEW_ID_DECREMENT, result); - findAccessibilityNodeInfosByTextInChild(searchedLowerCase, - VIRTUAL_VIEW_ID_INPUT, result); - findAccessibilityNodeInfosByTextInChild(searchedLowerCase, - VIRTUAL_VIEW_ID_INCREMENT, result); - return result; - } - case VIRTUAL_VIEW_ID_DECREMENT: - case VIRTUAL_VIEW_ID_INCREMENT: - case VIRTUAL_VIEW_ID_INPUT: { - findAccessibilityNodeInfosByTextInChild(searchedLowerCase, virtualViewId, - result); - return result; - } - } - return super.findAccessibilityNodeInfosByText(searched, virtualViewId); - } - - @Override - public boolean performAccessibilityAction(int action, int virtualViewId) { - switch (virtualViewId) { - case VIRTUAL_VIEW_ID_INPUT: { - switch (action) { - case AccessibilityNodeInfo.ACTION_FOCUS: { - if (!mInputText.isFocused()) { - return mInputText.requestFocus(); - } - } break; - case AccessibilityNodeInfo.ACTION_CLEAR_FOCUS: { - if (mInputText.isFocused()) { - mInputText.clearFocus(); - return true; - } - } break; - } - } break; - } - return super.performAccessibilityAction(action, virtualViewId); - } - - public void sendAccessibilityEventForVirtualView(int virtualViewId, int eventType) { - switch (virtualViewId) { - case VIRTUAL_VIEW_ID_DECREMENT: { - sendAccessibilityEventForVirtualButton(virtualViewId, eventType, - getVirtualDecrementButtonText()); - } break; - case VIRTUAL_VIEW_ID_INPUT: { - sendAccessibilityEventForVirtualText(eventType); - } break; - case VIRTUAL_VIEW_ID_INCREMENT: { - sendAccessibilityEventForVirtualButton(virtualViewId, eventType, - getVirtualIncrementButtonText()); - } break; - } - } - - private void sendAccessibilityEventForVirtualText(int eventType) { - AccessibilityEvent event = AccessibilityEvent.obtain(eventType); - mInputText.onInitializeAccessibilityEvent(event); - mInputText.onPopulateAccessibilityEvent(event); - event.setSource(NumberPicker.this, VIRTUAL_VIEW_ID_INPUT); - requestSendAccessibilityEvent(NumberPicker.this, event); - } - - private void sendAccessibilityEventForVirtualButton(int virtualViewId, int eventType, - String text) { - AccessibilityEvent event = AccessibilityEvent.obtain(eventType); - event.setClassName(Button.class.getName()); - event.setPackageName(mContext.getPackageName()); - event.getText().add(text); - event.setEnabled(NumberPicker.this.isEnabled()); - event.setSource(NumberPicker.this, virtualViewId); - requestSendAccessibilityEvent(NumberPicker.this, event); - } - - private void findAccessibilityNodeInfosByTextInChild(String searchedLowerCase, - int virtualViewId, List outResult) { - switch (virtualViewId) { - case VIRTUAL_VIEW_ID_DECREMENT: { - String text = getVirtualDecrementButtonText(); - if (!TextUtils.isEmpty(text) - && text.toString().toLowerCase().contains(searchedLowerCase)) { - outResult.add(createAccessibilityNodeInfo(VIRTUAL_VIEW_ID_DECREMENT)); - } - } return; - case VIRTUAL_VIEW_ID_INPUT: { - CharSequence text = mInputText.getText(); - if (!TextUtils.isEmpty(text) && - text.toString().toLowerCase().contains(searchedLowerCase)) { - outResult.add(createAccessibilityNodeInfo(VIRTUAL_VIEW_ID_INPUT)); - return; - } - CharSequence contentDesc = mInputText.getText(); - if (!TextUtils.isEmpty(contentDesc) && - contentDesc.toString().toLowerCase().contains(searchedLowerCase)) { - outResult.add(createAccessibilityNodeInfo(VIRTUAL_VIEW_ID_INPUT)); - return; - } - } break; - case VIRTUAL_VIEW_ID_INCREMENT: { - String text = getVirtualIncrementButtonText(); - if (!TextUtils.isEmpty(text) - && text.toString().toLowerCase().contains(searchedLowerCase)) { - outResult.add(createAccessibilityNodeInfo(VIRTUAL_VIEW_ID_INCREMENT)); - } - } return; - } - } - - private AccessibilityNodeInfo createAccessibiltyNodeInfoForInputText() { - AccessibilityNodeInfo info = mInputText.createAccessibilityNodeInfo(); - info.setLongClickable(true); - info.setSource(NumberPicker.this, VIRTUAL_VIEW_ID_INPUT); - return info; - } - - private AccessibilityNodeInfo createAccessibilityNodeInfoForVirtualButton(int virtualViewId, - String text, int left, int top, int right, int bottom) { - AccessibilityNodeInfo info = AccessibilityNodeInfo.obtain(); - info.setClassName(Button.class.getName()); - info.setPackageName(mContext.getPackageName()); - info.setSource(NumberPicker.this, virtualViewId); - info.setParent(NumberPicker.this); - info.addChild(NumberPicker.this, VIRTUAL_VIEW_ID_DECREMENT); - info.addChild(NumberPicker.this, VIRTUAL_VIEW_ID_INPUT); - info.addChild(NumberPicker.this, VIRTUAL_VIEW_ID_INCREMENT); - info.setText(text); - info.setClickable(true); - info.setLongClickable(true); - info.setEnabled(NumberPicker.this.isEnabled()); - Rect boundsInParent = mTempRect; - boundsInParent.set(left, top, right, bottom); - info.setBoundsInParent(boundsInParent); - Rect boundsInScreen = boundsInParent; - int[] locationOnScreen = mTempArray; - getLocationOnScreen(locationOnScreen); - boundsInScreen.offsetTo(0, 0); - boundsInScreen.offset(locationOnScreen[0], locationOnScreen[1]); - info.setBoundsInScreen(boundsInScreen); - return info; - } - - private AccessibilityNodeInfo createAccessibilityNodeInfoForNumberPicker(int left, int top, - int right, int bottom) { - AccessibilityNodeInfo info = AccessibilityNodeInfo.obtain(); - info.setClassName(Button.class.getName()); - info.setPackageName(mContext.getPackageName()); - info.setSource(NumberPicker.this); - info.setParent((View) getParent()); - info.setEnabled(NumberPicker.this.isEnabled()); - info.setScrollable(true); - Rect boundsInParent = mTempRect; - boundsInParent.set(left, top, right, bottom); - info.setBoundsInParent(boundsInParent); - Rect boundsInScreen = boundsInParent; - int[] locationOnScreen = mTempArray; - getLocationOnScreen(locationOnScreen); - boundsInScreen.offsetTo(0, 0); - boundsInScreen.offset(locationOnScreen[0], locationOnScreen[1]); - info.setBoundsInScreen(boundsInScreen); - return info; - } - - private String getVirtualDecrementButtonText() { - int value = mValue - 1; - if (mWrapSelectorWheel) { - value = getWrappedSelectorIndex(value); - } - if (value >= mMinValue) { - return (mDisplayedValues == null) ? formatNumber(value) - : mDisplayedValues[value - mMinValue]; - } - return null; - } - - private String getVirtualIncrementButtonText() { - int value = mValue + 1; - if (mWrapSelectorWheel) { - value = getWrappedSelectorIndex(value); - } - if (value <= mMaxValue) { - return (mDisplayedValues == null) ? formatNumber(value) - : mDisplayedValues[value - mMinValue]; - } - return null; - } - } } diff --git a/core/java/android/widget/TimePicker.java b/core/java/android/widget/TimePicker.java index bc88b622eaf4a..7eff1aa04bd23 100644 --- a/core/java/android/widget/TimePicker.java +++ b/core/java/android/widget/TimePicker.java @@ -532,28 +532,21 @@ public class TimePicker extends FrameLayout { private void setContentDescriptions() { // Minute - trySetContentDescription(mMinuteSpinner, R.id.increment, - R.string.time_picker_increment_minute_button); - trySetContentDescription(mMinuteSpinner, R.id.decrement, - R.string.time_picker_decrement_minute_button); + String text = mContext.getString(R.string.time_picker_increment_minute_button); + mMinuteSpinner.findViewById(R.id.increment).setContentDescription(text); + text = mContext.getString(R.string.time_picker_decrement_minute_button); + mMinuteSpinner.findViewById(R.id.decrement).setContentDescription(text); // Hour - trySetContentDescription(mHourSpinner, R.id.increment, - R.string.time_picker_increment_hour_button); - trySetContentDescription(mHourSpinner, R.id.decrement, - R.string.time_picker_decrement_hour_button); + text = mContext.getString(R.string.time_picker_increment_hour_button); + mHourSpinner.findViewById(R.id.increment).setContentDescription(text); + text = mContext.getString(R.string.time_picker_decrement_hour_button); + mHourSpinner.findViewById(R.id.decrement).setContentDescription(text); // AM/PM if (mAmPmSpinner != null) { - trySetContentDescription(mAmPmSpinner, R.id.increment, - R.string.time_picker_increment_set_pm_button); - trySetContentDescription(mAmPmSpinner, R.id.decrement, - R.string.time_picker_decrement_set_am_button); - } - } - - private void trySetContentDescription(View root, int viewId, int contDescResId) { - View target = root.findViewById(viewId); - if (target != null) { - target.setContentDescription(mContext.getString(contDescResId)); + text = mContext.getString(R.string.time_picker_increment_set_pm_button); + mAmPmSpinner.findViewById(R.id.increment).setContentDescription(text); + text = mContext.getString(R.string.time_picker_decrement_set_am_button); + mAmPmSpinner.findViewById(R.id.decrement).setContentDescription(text); } } diff --git a/core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..9584649d7d4028d52fe5d37e18c1fd75abf02c1e GIT binary patch literal 634 zcmeAS@N?(olHy`uVBq!ia0vp^azHG^!3HFKKIPp6Qfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>t_i0wa$=%ficR{#WBR=_|_}F-b{fa$3FhQQ+<4* zq}N=5rZ_V$$A_opzCPqS|GMi1b&e?4Zn3R~iW84*H;I3CZc9do!C6V!^Pg`1sdz9a zIYe5wf#(5(+U~iQ225#MPTdW>64q^pPrO{QVr4GNtrLCsrq1v$Z(?62>NkhkUgQ#+ z46DZhfm`NX`sLL>w=bV_VV{TSRIL}X^S(wu54Y7-X$U#M@?mS{%CeniCu;bv);+h( zXR#8s5i$Bv;NSkXD0hLcHcL%{QiI_I)-P8IOE(97XFD3CFJk1uEGy!@H*M)VU)gYG zt4+t)9JXE*a^Ndq%kBs&*kwK_ykP%fTSZKX z<{r&?EU}#GM<*}(f2i=I?}e=&tYi{|O~m$a+1KsSW!MuJQ#N_g#)qjpX7#c*%-`6& zBtxl!QJ+Dpt9IZ0gd7vYKiu0Jb3}X_3WY=-aDVsFNGM8pbpsgWq9v{oCC){ui6xo& zc?uz!xv316`bGx&h6e9-Sa$#wsDc!vB$lLFC4*F@G8h>c8tNKY>KYn{7#dp{m{=KG z=o*+?85kVelh%l$AvZrIGp!Q0hRqM}*#b4lfNTiPPb(=;EJ|f?Ovz75RdCBJN-fVX a$}U!L4mK^^`q&Jpj=|H_&t;ucLK6T>(Cz*J literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..5c37873b68aa4d8af7a3dedbbd4075728a548cde GIT binary patch literal 489 zcmeAS@N?(olHy`uVBq!ia0vp^azHG^!2%?o{aywVU`q0KcVYP7-hXC4kjGiz5n0T@ zz%2yAjF;}#{Q(J<6*#5?X|P^~kYDQzft<6RE{-79=N?RD5e#Nndp$p{t4B<{b* z>Vo$LzVOv?E&k}3lRbIk$vygMGdBCLh}5v1S-!94M~~Pwu0*wWqW2aBDRykGSRbgd zI7VR4iWK3@=L!8bR@pA@7hkK~t1Q2gJ;zwxdhNAqapsNha<@iVFL#)`a?O*X)$H5j zUtUYR%&PX;`qlS-^$(1tvKN@`obLL4m$&o!>#KZF_)2ZKvW+M2;ysTqU5U78UUO1) zA*1O&KJkB_->^)*wbUv&vMb}wv6WwxuFX7Te9mvS%jf%vj&=SXHS7z49uqBbjVN(0 zN=+=u%+FH@$;?eIQ+eo=O@f^)EG;nv4yKy?hBu6{1-oD!M2gNXnQz){=zNWCrS1l zm|LXr?ucN?6>baXlL8w%lTNJT?9G|_?Bw}(;x|?sF-#5&%n6vbarVNJXc^0$rF+!! z?##SA(>uKfes9{F%U;Cy21&!u?&|B*NoDz|Fbgqi_76#O(oUEEOy0{-dM=ECYsOvmdKI;Vst0P5_Sr2qf` literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..041412b100d2379341cd13fdb6f603261d33eef9 GIT binary patch literal 418 zcmeAS@N?(olHy`uVBq!ia0vp^azHG^!2%?o{aywVU`q0KcVYP7-hXC4kjGiz5n0T@ zz%2yAjF;}#{Q(J<6*#5?X|P^~kYDQzft)r^7sn8b(?>5G@--XqI9%*^*vTBcvTDbi zlkLvBGR%#aRGnIGwCKE@zsJVf`$4=Z!=(oq+ElSki2#ljxeFsjDm=vzZng^38fQH~BI*PzzIj zx7ehxtbM2Xe={9qv~{VxEtdmyk!Xo)M2T}zYGO%dex5=|W^O8jrM{7YzM;W;9o8K{ z1*#wgDTyViR>>e$sSHL2hK9NZmb!+a>QWe}Xi&D$;i?WLqoP$jZw>~xls$=kU^>bP0 Hl+XkK4V#Lf literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-hdpi/numberpicker_down_focused_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_down_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..5717beebcf23f0711a95cc82821f9abea5635e33 GIT binary patch literal 661 zcmeAS@N?(olHy`uVBq!ia0vp^azHG^!3HFKKIPp6Qfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>t_i0wa$=%fw9!n#WBR=_}0tb-b{%SM?e1GQ@q)5 zmuI+UkISN4k}X$^GA_EmNd9s&hDCRGK#F!Z$EsG|kO@;PFFlF5715GyKMV_f)`NtXOL~HMUVPM}8o?cdVpFw`cw_e6M7oRwv z(acVJn;OJ5mej(?FYy*y_c(8f<+U@H zG`TfJKRns}*OZ~U^0SLrFVFwhY1eTKhs88ydXVVch{#pbAou zl30>zl?+mq%3x$*XsByop=)3oVrXGyVqs-utZQIyWnkd+!e%RqhTQy=%(P0}8jQEL zZ~`^RfNTiPPb(=;EJ|f?Ovz75RdCBJN-fVX$}U!L4mK^^`q&Jpj=|H_&t;ucLK6Uo CyZk}` literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-hdpi/numberpicker_down_focused_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_down_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..e874330d386891255dcd11207e99e4cd768d7165 GIT binary patch literal 514 zcmeAS@N?(olHy`uVBq!ia0vp^azHG^!2%?o{aywVU`q0KcVYP7-hXC4kjGiz5n0T@ zz%2yAjF;}#{Q(J<6*#5?X|P^~kYDQzft+WaE{-79;~^mhuBV0*xRp4FTuhh^?T zUao^(7xNyK|Cs$lUTk-gpsc8tNKY=o*-Y7+P4FSXdbu>l&C_85lUdu-S^DAvZrIGp!Q0 z2IH+QoInjSARB`7(@M${i&7aJQ}UBi72Gn5Qp@v;vWpd*gG~#!J~jiYWAJqKb6Mw< G&;$Tfm%Tgy literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..96a6c8a2dd916dbf2631c2b9d51c1503afb7a8ba GIT binary patch literal 555 zcmeAS@N?(olHy`uVBq!ia0vp^azHG^!3HFKKIPp6Qfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>t_i0wa$=%fsxzO#WBR=_|~hty_g+E7%oiSq2=PZ zL41;0>sm&^w|_tm}%{reo#A3|;g=OcyCn4b)fb6kb;!Nl2of? zkg8M$BLhQ2T>}eU1Je*g3o8=~Dzopr0C~63ApigX literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..96a6c8a2dd916dbf2631c2b9d51c1503afb7a8ba GIT binary patch literal 555 zcmeAS@N?(olHy`uVBq!ia0vp^azHG^!3HFKKIPp6Qfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>t_i0wa$=%fsxzO#WBR=_|~hty_g+E7%oiSq2=PZ zL41;0>sm&^w|_tm}%{reo#A3|;g=OcyCn4b)fb6kb;!Nl2of? zkg8M$BLhQ2T>}eU1Je*g3o8=~Dzopr0C~63ApigX literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-hdpi/numberpicker_down_normal_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_down_normal_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..4631d85cf15ee95278ce6c7c61af6b91dd834d4b GIT binary patch literal 439 zcmeAS@N?(olHy`uVBq!ia0vp^azHG^!2%?o{aywVU`q0KcVYP7-hXC4kjGiz5n0T@ zz%2yAjF;}#{Q(J<6*#5?X|P^~kYDQzft=Z%E{-7GN}P*Q z6H7Al^Atidb5j{C^^FYl4GrGwuphHDVTq8=H zi&7IyGV}8kLNaqx87%dU4D<~R-s`aL04h)gDM(2yNwrD_sY+!qGB7mMHL%b%Fby%Z zurjf*GBVaRFt;)=aC%|06-7gCeoAIqC2kGITU$7R8e~8=1m~xflqVLYGB~E>C#5R5 gWfrBD=NDxcD>w(67H)lP22{u3>FVdQ&MBb@0Diuc+W-In literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..9c23a18ed917932c9e11ed8accae931983af2676 GIT binary patch literal 564 zcmeAS@N?(olHy`uVBq!ia0vp^azHG^!3HFKKIPp6Qfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>t_i0wa$=%flW5g%pUv5?Wzz5MxqqhGVDgsTlUc-f z9NPJ~FTduIHt!cn-zDyC(;x0xQg~VIRfddUe3Ia`P^lZ7Sv!v9$}BoHF|nmEqF2QD zOkrF3YPXepL+?vh*lc)n`$Aw$$R@d1!F}R?nZp~zoy-sYKft{>`XTd&pcj5S zSmLDaa*H33Z4zrLfAD?dpD;09p8SKK&#Tn`;akgm- zRgi*|#FA92WRR*<1|tJQLtO()T|?s#Lt`rg6Dwm2T?2C~1A{|*(i%}T2BR0kYHJXV>*xq>t_i0wa$=%flW5g%pUv5?Wzz5MxqqhGVDgsTlUc-f z9NPJ~FTduIHt!cn-zDyC(;x0xQg~VIRfddUe3Ia`P^lZ7Sv!v9$}BoHF|nmEqF2QD zOkrF3YPXepL+?vh*lc)n`$Aw$$R@d1!F}R?nZp~zoy-sYKft{>`XTd&pcj5S zSmLDaa*H33Z4zrLfAD?dpD;09p8SKK&#Tn`;akgm- zRgi*|#FA92WRR*<1|tJQLtO()T|?s#Lt`rg6Dwm2T?2C~1A{|*(i%}T2BR0kYHJXV>*xq>t_i0wa$=%fzj5}#WBR=_|~h2{)ZeS8XkVH3irO% zalu7$imQ2Vp}|M-44FTB`Bcv3_#NR@YhAjrAxh*$tgH^Fq1rdE%H#Pv)bD?qdtlS) z-wT<4IOxjPGHyP;+d27jpGM<5Mqh`gk3}SygQfQv>}hLj2&Wx{apo4?xm=i4{x>YZA2D1%+0c!_3n zx9^3})PjwgQDWku3sMULMYFoQwF0GMLVCrH9yPn5^yAe7^VM#QEf@WOCfwTV_d<0e zOG@6)uKDq9C!fY_`E_@fy)3KSE~%HVd>@AXD-i*TlvGq1UtG7mVb-bZ=X*k2j)%Wr z|F*k-)q$@)uT$Mt@tj~-+raX{*!|c1-Rv*TE^IYQU{m3WU=S2wcsK1~>b@6`q=k7k zQ~uiQnF9nO2Eg!{&$gY=IhNKsE&D urCAf?R7XnqV?j}gMIQIJ2(gLBf41rR@@B!I;A>|; zM=W61)hp^e&SY!-aFzDQh$WZbD)ozIbspD>eXy}ntTJa2tDN*po&K{WZO8e3^{a0! zGhSNc)P7Cb((BM_w`t*qCT!s+4Ntn&{JzPu+--57U)9!I8=C$8Ec1V7XBt=bsQunw ze%GfpcOD(iTLN^rXo+h?iE~kEVo7Fxow$jwj5OsmALVe`X#wm=Os yARB`7(@M${i&7aJQ}UBi72Gn5Qp@v;vWpd*gG~#!J~jiYWAJqKb6Mw<&;$TtVWn39 literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..e5f04309615c24236751e3a8d45c86df6c0306b9 GIT binary patch literal 416 zcmeAS@N?(olHy`uVBq!ia0vp^azHG^!2%?o{aywVU`q0KcVYP7-hXC4kjGiz5n0T@ zz%2yAjF;}#{Q(J<6*#5?X|P^~kYDQzft(gk7sn8b(`Qd_6 zkb;!Nl2of?kg8M$BLhQ2T?0#9L*o!bV=Ds_D`N{?19K|_gF}1L8c{Ul=BH$)RpQpL z`QbfVpavO`4Z-mdKI;Vst0HU9O^Z)<= literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-hdpi/numberpicker_up_focused_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_up_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..b06017e0f8b6f99540559e8c87c255e924cbaec5 GIT binary patch literal 652 zcmeAS@N?(olHy`uVBq!ia0vp^azHG^!3HFKKIPp6Qfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>t_i0wa$=%ficI^#WBR=_|~hA-b{`X4G+uj#BRT4 z#O3AHy5>cI6Z>KTYc|{~K;#(xrA>`KWwmWIpZrNK-N+%+(fBzx- zEb*Dae1}bUT#dO>8n)PHG4wyZ{G|Pir4qv|=1&La*w?XpIYhF_OUpU-GdTalYdKbX?+Z>h`?wzUe_ykco!gA&2G%N;)B8;)#olc5q0`iia<2Wa2m%-@VUFr+2Uwr)bSKY24ofp$G8QStwLljt#OmU3& zz2X(Q`0}kH(Y5W1zN)qEH?~^4)@ALL+;=kfEoaFw2d(=5t#5V4xzooE9?q^>FC}I% zYxPU#@QX4B7;{8dFiGkQMZQ0)UwzrZU5dfqA(Yi;0Y?rqx5vATPMZa<$Ko1c=IR*74K@zxejpavO`4Z-9=F^aj+?Gn?^XvC5-(%aktXBDV#n+n8 zH}||$ec4&eYImnPR0bmhLqlBy z3ta=#5JL+q6ALRNV_gGtD+2?k7dBf_H00)|WTsW()?mD~g%hYj24q8Uep*R+Vo@rC mV@iHfs)Ac)QEGX9QFgI{bFgXQ*2iW*bqt=aelF{r5}E)94Y9re literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..b3d6706a408c2ddb10aedcafb2f35265264304d2 GIT binary patch literal 536 zcmeAS@N?(olHy`uVBq!ia0vp^azHG^!3HFKKIPp6Qfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>t_i0wayU8`Qho}7~*k!>s3cDW~r$dD{gbqa*F%%ET>Z^P(KGAFfm_ z(T$5R`IE@K!eVij$>JI9Gelk_iL>@yJRaS%?9y@WcZXkz75-f>!LK3BGX3+;CqCT` zRTf9~sBSsMjJLLM0yW5hYzWRzD=AMbN@Z|N$xljEaLX)8Ezd8? ZE>>_3HZ9!x*bJzS!PC{xWt~$(697R(!}0(C literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..b3d6706a408c2ddb10aedcafb2f35265264304d2 GIT binary patch literal 536 zcmeAS@N?(olHy`uVBq!ia0vp^azHG^!3HFKKIPp6Qfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>t_i0wayU8`Qho}7~*k!>s3cDW~r$dD{gbqa*F%%ET>Z^P(KGAFfm_ z(T$5R`IE@K!eVij$>JI9Gelk_iL>@yJRaS%?9y@WcZXkz75-f>!LK3BGX3+;CqCT` zRTf9~sBSsMjJLLM0yW5hYzWRzD=AMbN@Z|N$xljEaLX)8Ezd8? ZE>>_3HZ9!x*bJzS!PC{xWt~$(697R(!}0(C literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-hdpi/numberpicker_up_normal_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_up_normal_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..9ee35c7db9d8151f6d6dadb4f066337660d7aa5f GIT binary patch literal 426 zcmeAS@N?(olHy`uVBq!ia0vp^azHG^!2%?o{aywVU`q0KcVYP7-hXC4kjGiz5n0T@ zz%2yAjF;}#{Q(J<6*#5?X|P^~kYDQzft)^17sn8b(`Qc`@-+pBxLou;#^RK8)Gi|< zC#Lu0^+VTohs z^i1EP$|E~?s*=3@WS<*pCKRp>n4CRTDuz$$Y0*WF>67(}cD`f^XPWzwM?pl!!s^9# zar0f@c%>QCs@T+7C1wiUvwy+-&fLnAUrM(C=rYj~*N775qSVBa%=|oskj&gv21|V- z1ARk-_d2XQfC^MW3Q`hFQmv9fs!|z@3=9o*4J>pGOhXJUtV}GdjEr>+%&iOzoL<;$ zMbVI(pOTqYiCcs5))r2n1{shI!TD(=<%vb942~)JNvR5MnMJAP`9;~q3eLf%gyC0|5Y`u0{yS;2qLvhtJxuT5o z6LrtNE0pfqQ2IqCVsp~u=S7+i3UvdfXHT?>VVw1p>mpD1gmXo$FL}Zl|2`6JFn#06 zX!Z5bjwR+-7x1`BSL*_uCR*YeQQ};bnpl#VpQjL#nVZUB zsc&SUZ)osdhjj-~fhtHrN@7W>RWe9bDua=Mp`osUg|2~Vh@pj*iG`Jsv95u+m4SiN z3!AMd8glbfGSez?YcSs0!U@zM1F|7FKdq!Zu_%?nF(p4KRlzN@D78GlD7#p}IoPyt S>ti#ZItEWyKbLh*2~7ZJuagr1 literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..358a13fca7aca7eb52c845029facdd1d71bb7397 GIT binary patch literal 542 zcmeAS@N?(olHy`uVBq!ia0vp^azHG^!3HFKKIPp6Qfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>t_i0wayU8`RD247~*k!>(#wp%#H#K5AweA z?~wVS`UUA0ovQv4%N}JvHb1;)3)CP3vLQG>t)x7$D3!r6B|j-u h!7Z~WwLHHlyI8?F*tBr#V>6&S22WQ%mvv4FO#q6l$>#t7 literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..358a13fca7aca7eb52c845029facdd1d71bb7397 GIT binary patch literal 542 zcmeAS@N?(olHy`uVBq!ia0vp^azHG^!3HFKKIPp6Qfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>t_i0wayU8`RD247~*k!>(#wp%#H#K5AweA z?~wVS`UUA0ovQv4%N}JvHb1;)3)CP3vLQG>t)x7$D3!r6B|j-u h!7Z~WwLHHlyI8?F*tBr#V>6&S22WQ%mvv4FO#q6l$>#t7 literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..50f6e98accd90e2e2e0dbe2ba6f7cde1631537c1 GIT binary patch literal 561 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W;!3HFgc;@~FQfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>t|3@*wn$mz$obH;uxZFe(vRsUWWrjj(z;Ub8qey zEh%ock_$@%*f(BKf1x(TZtWLE8J4*+EQ$%tl1V}QqIvaI$t;X!C^!1MUGo+S2cUaWG!@<3L z?(e^aQ>yOX=-Tu;@$QZH{fiG}K6l_qVKSKE!&t`P|2+TP%e$q^wK6%s)mdBpy!mQZ zhA5kNdQkhd#QFnTA`AGUIoG+oS8r$d_w>b5E^XH7fuU!j8Qiu%3yo0y!F~7HZ&Su3 z1?|HO`xsPsHY!T6OML={lxT@-M2T}zYGO%dex5=|W^O8jrM{7YzM;W;9o8K{1*#wg zDTyViR>>e$sSHL2hK9NZ7PS?=U~&qt&h!s>KHs-{an^LB{Ts5 DZ)(d9 literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..67434f6277c5b37ed18ef1535f6a25d9803951dc GIT binary patch literal 426 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W;!2%>tu!a@@DW)WEcNd2L?fqx=19_YU9+AZi z4BSE>%y{W;-5-!(S%G6ZkOu2zP*m8|0p#>~x;TbNT&}&~&DRvb!+N2)Qqa^;P)(3J)Bb3?ChM@4Vsgwt)x7$D3!r6B|j-u!7Z~WwLHHlyI8?F*tBr# RV>6&S22WQ%mvv4FO#r2rkGuc? literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..9c2b8338386559af0fea80a1f7d83ce07a5e7a1a GIT binary patch literal 398 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W;!2%>tu!a@@DW)WEcNd2L?fqx=19_YU9+AZi z4BSE>%y{W;-5-!(S%G6ZkOu2zP*m8|0pt{Ux;TbNT<$&X$j4~N;BfJJUqtlnjRlP5 zuNFS@({pGN-Y|W}MuUl&mmjUa|NK0YW<*!~nFkm9xi@UfymavBRECwCH?O^P@aD$) zO9vD0+;?65JuF!`=Yr(#16*fs@Q7_mkeqXIV+!jW4fEx5LcI--&R=ntJ1o(Bd%IIR z&}|H&C9V-A&PAz-C7Jno3L%-fsSK9-Mh5zZ2JdxPcK{Wrf)u1AmZVxGgH)w57#SEE z>Ka(;8XAWf8e18dSQ%UB8kk!d7#!M@)`+4ZH$NpatrE9}%@6O{0yW5hYzWRzD=AMb pN@Z|N$xljEaLX)8Ezd8?E>>_3HZ9!x*bJzS!PC{xWt~$(69Da~g+>4X literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..dcf2fb7cf71bc2e6a2901d10468ee96408711660 GIT binary patch literal 384 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W;!2%>tu!a@@DW)WEcNd2L?fqx=19_YU9+AZi z4BSE>%y{W;-5-!(S%G6ZkOu2zP*m8|0pz53x;TbNT<$&P&F5es;&AbHn9iY|jI3FzQ-HFnH}8Y*Y@?wiZn>5wI!9VIrFV1Y3r|N$s5^p zJ0g3dL>AB5qVmh@)+UZ5iAL2t*F~=N%XUfsS*Bro-0sj`pnakxt`Q~9MX8A;nfZAN zA(^?U43_#v2Kt5u?{!#r02Qc$6r?1Uq*^6|RHZT)85kPs8d&NY8iyDfTN#*G8C&QY zm|Gbb9NLrCh@v4kKP5A*61RrU5AWFmHOPQ$2+mI{DNig)WpGT%PfAsA%PdMQ&o9a@ YR&WkBE!_Ip45*I5)78&qol`;+0La#PH~;_u literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-mdpi/numberpicker_down_focused_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_down_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..b63c510dcde0bf375f86dd96ac766eabf1fb34e4 GIT binary patch literal 575 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W;!3HFgc;@~FQfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>t|3@*wn$mz$owO;uxZFe(AY`UQU4$M?U^9f9J_; z+-cydm@6nD$m*o&@<2~u{(|E#E*=r@P?*dVy_JJWRn>E%m*V3pzu8Qhd#`6rJNzM8 zB|6i!!A9V5{YwUMsT19%><1n7mmFL7S^T6$l}%KXZ**XWg3h%STYsN^JM~+x-(K24%S$^?cbXP244d*>#ykA>OsBgVcUiOi z9zFTO`a(k1W1pLORd@3`VVQ5jO`-p8q;1_8ZdKg8(0u`q39CYMCg%huuPT$C<*%M9 zuU~Gw;aI6*=F@Bw{a3AwC!XBk|9ZHtAx@(~-b{2(*S!!vMycILi}iEVe#nNts}?!% z;=p9_XPkZuULW|E9?Cpxvq1y@;nmw^?5~UU1H(6kb;!Nl2of?kg8M$BLhQ2T?0#9L*o!bV=Ds_D`N{?19K|_gF}1L z8c{Ul=BH$)RpQpL`QbfVpavO`4Z-tu!a@@DW)WEcNd2L?fqx=19_YU9+AZi z4BSE>%y{W;-5-!(S%G6ZkOu2zP*m8|0pu+5ba4!kxLkX|(C<(JL)*jW&)>T>oJ>%0 zEGuhq{vtDHKhs88ydXVVch{#pbAoul30>zl?+mq%3x$*XsByo zscUE)VrXn-U}9x#p=)4nWngeti#ZItEWyKbLh*2~7a+HJi!+ literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..48e300c26472c597cca10728fabba7f03611805c GIT binary patch literal 473 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W;!3HFgc;@~FQfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>t|3@*wg{!?DTYT4AD5h^qiyLp#Txq3!gU{H}`e) zwO9r>&ypy6U=$fzc?^ywpZRr$QF@9*nnppl?z*Z)_iu>FYp|`@a6s;KgvFNw(>|6p zYBlWPk$9|HXZ`-i7S7w1d;fDSKXw0N7|)^gS?05jyh@O|+G^T-_C@iXH9-;95$^7W zwf>2jAK3RE)=^_!WyaH2_R+WXLQj`G&=aC1t`Q~9MX8A;nfZANA(^?U43_#v2Kt5u z?{!#r02Qc$6r?1Uq*^6|RHZT)85kPs8d&NY8iyDfTN#*G8C&QYm|Gbb9NLrCh@v4k zKP5A*61RrU5AWFmHOPQ$2+mI{DNig)WpGT%PfAsA%PdMQ&o9a@R&WkBE!_Ip45*I5 M)78&qol`;+0QnH6RR910 literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..48e300c26472c597cca10728fabba7f03611805c GIT binary patch literal 473 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W;!3HFgc;@~FQfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>t|3@*wg{!?DTYT4AD5h^qiyLp#Txq3!gU{H}`e) zwO9r>&ypy6U=$fzc?^ywpZRr$QF@9*nnppl?z*Z)_iu>FYp|`@a6s;KgvFNw(>|6p zYBlWPk$9|HXZ`-i7S7w1d;fDSKXw0N7|)^gS?05jyh@O|+G^T-_C@iXH9-;95$^7W zwf>2jAK3RE)=^_!WyaH2_R+WXLQj`G&=aC1t`Q~9MX8A;nfZANA(^?U43_#v2Kt5u z?{!#r02Qc$6r?1Uq*^6|RHZT)85kPs8d&NY8iyDfTN#*G8C&QYm|Gbb9NLrCh@v4k zKP5A*61RrU5AWFmHOPQ$2+mI{DNig)WpGT%PfAsA%PdMQ&o9a@R&WkBE!_Ip45*I5 M)78&qol`;+0QnH6RR910 literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-mdpi/numberpicker_down_normal_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_down_normal_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..1558d3d95893da8a18ad799fbcee8986026768db GIT binary patch literal 423 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W;!2%>tu!a@@DW)WEcNd2L?fqx=19_YU9+AZi z4BSE>%y{W;-5-!(S%G6ZkOu2zP*m8|0pxUhx;TbNT<*PS$k${b(e`jUQ?GFI!O0Ie z_b`XQc%|C0*=Q!8-0=+tRb1&pJj)Ulm*}>B`1g8p{?Ej8L5+i*C5L%xwt6x+o}7A^ z>viRaBS$XGdgOerRr%&475%Kg%@PY_yVy?7Oxakr{F1CsL2Fb_8{;bj?y4)vd|O`J zPnVms;=$RosRyTo6usZi)O*|BjL$~)_cfriL`z&FN}P*Q6H7Al^Atidb5j{C^^FYl z4GrGwuMUIXD literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-mdpi/numberpicker_down_normal_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_down_normal_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..6b6e7e1f50ee59199545df084760455a6e8bb131 GIT binary patch literal 412 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W;!2%>tu!a@@DW)WEcNd2L?fqx=19_YU9+AZi z4BSE>%y{W;-5-!(S%G6ZkOu2zP*m8|0pv7zx;TbNT<*QNk+&&;!Sy1ulHtNK;p-bp z*t|4#b#!&Met!Q@;9XL#QU{UsI`(>Zk{ASuYckfk}?AW_s zBwJ1ePF}LMJNR!B>e$sSHL2hK9NZmb!+a>QWe}Xi&D$;i?WLqoP$jZw>~xls$=kU^>bP0l+XkK D+>MGu literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..eb16f8dde140bb5fa51b7060a7c13aa02f6806cd GIT binary patch literal 473 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W;!3HFgc;@~FQfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>t|3@*wg{!?DTYT4AD40_mXwqAqN453+V;I6WIb) zOSW)m9x_#bu*a_Pb%e)>E(?YoPIDM0r3EZHGJl3{diwlln?0w=&);~6r}OwZ^>a6t zH?IBAaw>+fAEvUqr{e-L)ZX1LIt` zAD3E7o9r)$>nMjT%sc#m`vjYRpi1%vkS9b-Tq8=Hi&7IyGV}8kLNaqx87%dU4D<~R z-s`aL04h)gDM(2yNwrD_sY+!qGB7mMHL%b%Fby%Zurjf*GBVaRFt;)=aC%|06-7gC zeoAIqC2kGITU$7R8e~8=1m~xflqVLYGB~E>C#5R5WfrBD=NDxcD>w(67H)lP22{u3 M>FVdQ&MBb@00Ww(od5s; literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..eb16f8dde140bb5fa51b7060a7c13aa02f6806cd GIT binary patch literal 473 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W;!3HFgc;@~FQfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>t|3@*wg{!?DTYT4AD40_mXwqAqN453+V;I6WIb) zOSW)m9x_#bu*a_Pb%e)>E(?YoPIDM0r3EZHGJl3{diwlln?0w=&);~6r}OwZ^>a6t zH?IBAaw>+fAEvUqr{e-L)ZX1LIt` zAD3E7o9r)$>nMjT%sc#m`vjYRpi1%vkS9b-Tq8=Hi&7IyGV}8kLNaqx87%dU4D<~R z-s`aL04h)gDM(2yNwrD_sY+!qGB7mMHL%b%Fby%Zurjf*GBVaRFt;)=aC%|06-7gC zeoAIqC2kGITU$7R8e~8=1m~xflqVLYGB~E>C#5R5WfrBD=NDxcD>w(67H)lP22{u3 M>FVdQ&MBb@00Ww(od5s; literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..58a3b64322accdf7c23abfd4e4cc1d5ccfcb185a GIT binary patch literal 535 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W;!3HFgc;@~FQfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>t|3@*wg{!eD`#54AD40_3}Zl!wv!s59_bxI+;#7 zrqo!)!6D~*v3b3M$oy?z?x+jAT6-aQrJT|%jip(qcD-K8s()7Pe__JD%RK>?-~M1- zz^!sSkh8{~@BFuS9qiUDL8)ep4Ob7cooHNNyW)pI?ApU`GHaMN?2r;uvsv{j;A7I| zK>KsgIS-^)1?sJnzxO&Iv#E14(*qYvc`e_Kv34Q15_|(PyMG33-McwVqQOGD(9VC; z%N6TamvSs|2xqoU^);B``)EakTUdEr?T!D7k|cT4gg@6*{!g6xF7tpz;JdGX^1e>H zyXIEH?l+F?>Zcgpn3oD4J^wM&BTn>`p9BVhXo+h?iE~kEVo7Fx zoDSr1-Hzi)bjkI a>|zDyVAH~_kIjJU7(8A5T-G@yGywpsu*8P| literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..382943b08ac7d2da3d63becbef167d95fa325cdb GIT binary patch literal 410 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W;!2%>tu!a@@DW)WEcNd2L?fqx=19_YU9+AZi z4BSE>%y{W;-5-!(S%G6ZkOu2zP*m8|0p!$qx;TbNT&_Lq%hi-1(R%T7n}*wke&*>f zW<@168wqqB+R)j2<@~&twgrcm7%x?hI-j=bNKfw7qCK%TvrJ?nAGXZCKIK?b=;N=Y zUdjiV4$pC$6nQBkky~nYj+^t7AIG)Sf4RncUiEBiOb5UwyNoIbYLP%zADuboIk%7LU!FwIn9Y6)DAO$Ij zC8<`)AXTXhMh1q4x&{`y2Bsl~7FH$}Rz}9U2If`<22L+*wxVdr%}>cptHiCrcxwwM zP=gG}hT#0PlJdl&R0hYC{G?O`x6Go{^8BLgVg=`5)55Kf&4B6{JYD@<);T3K0RZbQ Bi9i4V literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..cf856a19261b00607c083d262bd1556aa96be77c GIT binary patch literal 394 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W;!2%>tu!a@@DW)WEcNd2L?fqx=19_YU9+AZi z4BSE>%y{W;-5-!(S%G6ZkOu2zP*m8|0p#R)x;TbNT%LQ;knfOzNb^H`LuKYg#!gIA zxu5v$%w5;G>*BlILwEL=2;G?dHMi}*aP60}sfkG`9K~9(5=Xn$!)t!LS;97#ivtSn3)Y zhZq`L8JJiZTj&~?TNxM}+LP9Zq9HdwB{QuOw}#CR@7V%1$bf7J&QB{TPb^Aha7@Wh jN>y;nEJ`iUFUl@fa1J&t-1^uIsE)zY)z4*}Q$iB}X{~$Y literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..6665953aeb3d10873facfcc92b72315cd1a24135 GIT binary patch literal 383 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W;!2%>tu!a@@DW)WEcNd2L?fqx=19_YU9+AZi z4BSE>%y{W;-5-!(S%G6ZkOu2zP*m8|0puimx;TbNT%LQ;kwp z`}B&C2q)H%jF(++7HUWDkYXt7^J@ID@;dLWVom<8g2$3T>qJXjBTAf$QWHxu^Yau! zGILWIEcJ~H^bHN(>#*(sDo_O}NJ%V7wMqu5N@XxIFf`OPu+%j)4ly*gGBB|+w$L>& zw=ys|v?r|*MMG|WN@iLmZVj6s-m?X2kOA2coS#-wo>-L1;Fyx1l&avCS(I9yUzA;} X;2dmPxb?9aP#uG(tDnm{r-UW|$6I+C literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-mdpi/numberpicker_up_focused_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_up_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..d63d797e51a2e678aea85ccd9890e40dc102c37f GIT binary patch literal 556 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W;!3HFgc;@~FQfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>t|3@*wn$mz{un2;uxZFe(t%0UQB@^?H}LY*_k=v zqMD&whDL_6OH+dGqEdx#Om=PkYU^4#dNfwJDr_<0o?~+O%!(QBas!*B_a@)}#Q*%b z;Iohw_FNk{MgA}2e(-PAl&zcdjx@45M7qXjGAtIhUBI>_ec_`+U!GSe?^r3%wB@^3 zdSKB~YkpDnvRLaV?)Q8QZ8PV7F56dQ#Xr?zM#N&qH7icEdd1{S;-2cd!D7XBjc>nO zLr;F}-v8&?cej^o(-#XzDtytty6}1UD#ijK@!|!sydqOOul)^Eo-b8W|ju%Od~) literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-mdpi/numberpicker_up_focused_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_up_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..22b6dbd4d0af57a82f10db0b8eac7cf14be9b82c GIT binary patch literal 429 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W;!2%>tu!a@@DW)WEcNd2L?fqx=19_YU9+AZi z4BSE>%y{W;-5-!(S%G6ZkOu2zP*m8|0pv{dba4!kxLkY6kdM((!r`I$KT9UXmeBmA zvo7p7xTDS3lD+(f%N8Nssl5|6be_9(?v4HHt?!Lpa(RShHay?-ukE-=MB8%qJ2#5> zR%)0foSee0?DhXnro;x;zopr0A;(5H~;_u literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..4bcce9871f23bea28cf959137f16c99e8fc7a9db GIT binary patch literal 466 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W;!3HFgc;@~FQfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>t|3@*wg{!Z1Qw*4AD40_mW{2Q=$Od1@pvyfzGMl z!ZclURLnofSWbTaflbJO<+elAT9MrxVV+wGT1?*kdmUb9{CO2;>CClEwmqAE9ys>; zL&<9usSS3^UZm_kF7rA%LnI;Ar|45#uB;U64en!>wZ|9n^*XIN)jMC!Br3t{LPn?Q zqC)ntZo3_SBBOoY^?Y77+iiVOO=guAg?pbbqFdmd@sy zUBbK5+Mi0wFZA}jvt{)cpzB3TTq8=Hi&7IyGV}8kLNaqx87%dU4D<~R-s`aL04h)g zDM(2yNwrD_sY+!qGB7mMHL%n*G!8K|wlXlWGPck)Ft;)=IJ76N5k*68eoAIqC2kFy zAKtSCYLEfh5S*V@Ql40p%HWuipOmWLmRXcqo?nz*tl%7MTDbMG8BiUAr>mdKI;Vst E0J0UK8vp2BR0kYHJXV>*xq>t|3@*wg{!Z1Qw*4AD40_mW{2Q=$Od1@pvyfzGMl z!ZclURLnofSWbTaflbJO<+elAT9MrxVV+wGT1?*kdmUb9{CO2;>CClEwmqAE9ys>; zL&<9usSS3^UZm_kF7rA%LnI;Ar|45#uB;U64en!>wZ|9n^*XIN)jMC!Br3t{LPn?Q zqC)ntZo3_SBBOoY^?Y77+iiVOO=guAg?pbbqFdmd@sy zUBbK5+Mi0wFZA}jvt{)cpzB3TTq8=Hi&7IyGV}8kLNaqx87%dU4D<~R-s`aL04h)g zDM(2yNwrD_sY+!qGB7mMHL%n*G!8K|wlXlWGPck)Ft;)=IJ76N5k*68eoAIqC2kFy zAKtSCYLEfh5S*V@Ql40p%HWuipOmWLmRXcqo?nz*tl%7MTDbMG8BiUAr>mdKI;Vst E0J0UK8vptu!a@@DW)WEcNd2L?fqx=19_YU9+AZi z4BSE>%y{W;-5-!(S%G6ZkOu2zP*m8|0pwJ8x;TbNT%LQ;kn50vMBBsde-t?^{pQ5% z@qKaa(W>bM!s{PAGW1&bUDL&hUH!8<9aR2)yw0Xm zs4;a(_g7<}8$?T7BTAf$QWHxu^Yau!GILWIEcJ~H^bHN(>#*(sDo_O}NJ%V7wMqu5 zN@XxIFf`OPu+%j)4ly*gGBB|+w$L>&w=ys|v?r|*MMG|WN@iLmZVj6s-m?X2kOA2c voS#-wo>-L1;Fyx1l&avCS(I9yUzA;};2dmPxb?9aP#uG(tDnm{r-UW|e1eDu literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-mdpi/numberpicker_up_normal_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_up_normal_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..d841f5a6c555a635ba5e2f40b429acfd9f435903 GIT binary patch literal 408 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W;!2%>tu!a@@DW)WEcNd2L?fqx=19_YU9+AZi z4BSE>%y{W;-5-!(S%G6ZkOu2zP*m8|0p!$px;TbNT%LQ;kgM51qV1viA4QQpe(LWZ zSU$S;=*a};l2YUJ7mpq&?g?0!Fp^3o zn9XOh1&?(dn9Dsa+e`H@gRkmoqYy5iK+R1pQXSK#MYp}JHa7Ux&uTW$r(Q1NCf}d0 ztZUY4I@WCFTmW>3Xo+h?iE~kEVo7Fxow$jwj5OsmALVe`X#wm=Os yARB`7(@M${i&7aJQ}UBi72Gn5Qp@v;vWpd*gG~#!J~jiYWAJqKb6Mw<&;$U4kc5!{ literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..bc5e3faef985d7c948565889bd258a3437bd88a3 GIT binary patch literal 468 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W;!3HFgc;@~FQfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>t|3@*wg{!Z1Hq)4AD40_tM5JCPx8=3+5;PHbhA7 z&en0^hXn5D;CEiemRpu4tj0q+*rV5R=)lD0WoXi-w|z`x*H?v4sl%e$^G#6 zpH*Isuk81sK*IW1<8eq`yb{b$R*uiL)vJ~=OPpX4&bRWZ}c8aT7&aBaA~qVR~=Wi9>mHyhq}{ylDae&Z?2 z6ZyyIK8Qb8Sj)J7g--;#8uKEc`$bD!BTAf$QWHxu^Yau!GILWIEcJ~H^bHN(>#*(s zDo_O}NJ%V7wMqu5N@XxIFf`OPu+TLy4KcK^GO@5SGS)RPw=ytrdSSB_MMG|WN@iLm zZVkp;TR4FlWI#3q=ckpFCl;kLIHu$$r7E~(7NwTw7iAYKI0u^+ZhdS9RL9`y>gTe~ HDWM4fzYU@^ literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..bc5e3faef985d7c948565889bd258a3437bd88a3 GIT binary patch literal 468 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W;!3HFgc;@~FQfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>t|3@*wg{!Z1Hq)4AD40_tM5JCPx8=3+5;PHbhA7 z&en0^hXn5D;CEiemRpu4tj0q+*rV5R=)lD0WoXi-w|z`x*H?v4sl%e$^G#6 zpH*Isuk81sK*IW1<8eq`yb{b$R*uiL)vJ~=OPpX4&bRWZ}c8aT7&aBaA~qVR~=Wi9>mHyhq}{ylDae&Z?2 z6ZyyIK8Qb8Sj)J7g--;#8uKEc`$bD!BTAf$QWHxu^Yau!GILWIEcJ~H^bHN(>#*(s zDo_O}NJ%V7wMqu5N@XxIFf`OPu+TLy4KcK^GO@5SGS)RPw=ytrdSSB_MMG|WN@iLm zZVkp;TR4FlWI#3q=ckpFCl;kLIHu$$r7E~(7NwTw7iAYKI0u^+ZhdS9RL9`y>gTe~ HDWM4fzYU@^ literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..111f57eb772dc01482f75aaf519b8f16e3c6fd8f GIT binary patch literal 748 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<;!3HEdTJ|3RQfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>u0DjTg1)4z<9>f#WBR=_}T0B`IjAJ8XkT>cip6@ zal(W~t&meL>|I?`_DZjHIdYs=sQ5Wg$6Dbgm(&Hz)D(-de&0D*K1p=z%Kxfw^S9{S zUwu6Nv=~G4MG*%^Ux!aS7B@0<96Ky`=*Uio=bfxo2b?CJD)o61EHN{4=f>?@ITeI_ zlMCNkBr3=)*14CdX8!K9g`m*wr9K-O3Jy8Ei=VSSYQKJzQs?%n)xr-m{(p_G|Mc#0 z>6L=5nUlCW8YBV&4_}?$uD*}!*{h%P<#kssUh9&z^2?rTgWWbZAAMz(X---q{mFg; zgU;PD8%wLNX?OR{_i&#cW4wP($(J>^zpJ}1zjrD3__qz2Uf*venA}yY4TzJ7Dig1t z+ngUCmm3u1y)^yqzW=X(T)ygc$NqpcfAzvx3zgb6&u>qPQ8qW%RSY|QZkx*I6E};) z#qaD$iL!?@%mMBWJA>qlryrD$OP{{E^69;ygsl^(2If`<28Z^fHKJ(9%}>cptHiBg^TT_#Kn*e=8-nxG tO3D+9QW+dm@{>{(+%k(&%kzt}ixr%MO$)a^HUp|-@O1TaS?83{1OT>RGOqvt literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef05b8a5d2477fa29229564b3af47f9365b3ba GIT binary patch literal 556 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<;!2%?eddt0m6jPG7y9>kr_Wm>bfjrIvkH}&M z25un`X1sK_?hiU@HA=e zTO7r!wu-%IuGm&9E-e=0&AYeHUAy_OLbFGi3*zV$fc=lA>-K8JQo;JMe+OR_AN~|!SHuo;M#Pyq2G~X!h zulD?~=#tlrz-zo5|23Y^DcZYB@!`^<)|gA8E#h9Ov7QwnpL7;&l)ZLWp(QmyzG=7X z$ICw$b8p<{erxpF5ExLRC9V-A&PAz-C7Jno3L%-fsSK9-Mh5zZ2JdxPcK{Wrf)u1A zmZVxGgH)w57#SEE>Ka(;8XAWf8e18dSQ%UB8kk!d7#!M@)`+4ZH$NpatrE9}%@6O{ z0yW5hYzWRzD=AMbN@Z|N$xljEaLX)8Ezd8?E>>_3HZ9!x*bJzS!PC{xWt~$(69BRD B*F69L literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..ff2194168af6b7a0000550bd820c96c78faa6291 GIT binary patch literal 480 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<;!2%?eddt0m6jPG7y9>kr_Wm>bfjrIvkH}&M z25un`X1sK_?hiNyNbd_X4+O#p<5Uh)qC75j+t}i z%9R%r1yYW6GT&^P^T;W5#k)^tQ_uhDOK_K3n{6T9|IjLG)0LmR2hFkyU7f$4{P@>0 z%JSmbrirI!o)hQ^kSaNru;9{)%`D7Q#O9j52#hN2Tj2cif@QPV(%|QuQd8vSnp*@` zl`9nO2Eg!{&$gY=IhNKsE&Drkr_Wm>bfjrIvkH}&M z25un`X1sK_?hiG!o$?3o&2;+ZCdBxc$b{80wEW*u@c81~k~3#^^a^Zw za#Z%_#LW`-POUStPn9%0J=JY)Vob4g;&P)4tcUcT`jrcqY4PuB-ry;D(Y1BzsTF!! zYl75DJQE#fUQun0Om&+ssx~DuHcTQ^ti<)9U*r|h*2Yav;i_LwsT)i!zIxfI`}0)! zyW&B@8Q-S(?)(aLx@d`OM2T}zYGO%dex5=|W^O8jrM{7YzM;W;9o8K{1*#wgDTyVi zR>>e$sSHL2hK9NZmb!+a>QWe}Xi&D$;i?WLqoP$jZw>~xls$=kU^>bP0l+XkKi5!}( literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..0462fca4890259c9a01804468b499a6615a54ff6 GIT binary patch literal 785 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<;!3HEdTJ|3RQfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>u0DjTg1)4!1&SA#WBR=_|fZUvu`CZ9RK)!@{*6K zUye4fQPrM&Fl@%+r4`ag@7kRCyZhaS=;d!rHcnaF{_c{|;VF*SS6w-BB!zvx!^E@C zeE&M?@%vAbpWo8{T##XEn`VP=0{;o7rmsiXbsmTtCKT&kPQTV_F*6Who2906` zYdv=gKR7D&R8CEMH^ZHbGj^*PIUZI!?caZPW#8Jhi*J@FKlb}%ogA-m!mnCt!D;TR z8@Jv){p_OO`%OxJR_;4hv@bw?`|kC((sq8kdbQZ^f;ThU0gf9*U*}x5UNJBC#^SYS z?}s1ndcN*S{TGq5Qlj7Yf9G43zDZ`&We3Jz2lx}X5}tEE&f9rSO3Yg}K5*`g_dNQ` zSDf1r@v7wX)@gI~d!Bv>DSO4;;C1*8+dani2CfM^|4+Vc|34yj*^=cM*MRE&*wp;5 zTzAK^;MO|n@-7(}hUEv2u2K;{5qm<9c}8?tn5v|k-i*~}?(Qx*xuMAM-%bO4Z=K1NrvVvOt>|v@QIwTkFU|X7>$EVCV4(N#C2?%kCwQn!KxIgqCi$>?`5ju-X9E4 zrr)>Q%lcy9%34n?ag}$+OeS1uxZaQjbo}eZ{Jsq4pHn7<=uLc}bduduWqL?K+$H8X zBkTJNJTu=upH=v@X-SdCDw8uhA4G0Ub1rw-A8Wp5$@zcWNoKPuns*0^08@f!iEBiO zb5UwyNoIbYLP%zADuboIk%7LU!FwIn9Y6)DAO$IjC8<`)AXTXhMh1q4x(1fIhQ=X= z##ROl^(2If`<28Z^fHKJ(9%}>cptHiBg^TT_#Kn*e=8-nxGO3D+9QW+dm@{>{( h+%k(&%kzt}ixr%MO$)a^HUp|-@O1TaS?83{1OVUtO5*?k literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..a488e8e6b62e608ebb8895b53b27c2eb6bcfc139 GIT binary patch literal 627 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<;!2%?eddt0m6jPG7y9>kr_Wm>bfjrIvkH}&M z25un`X1sK_?hi6r7sjb$FI=SpY#_WTJw_3Rr)1IYG+PruA z{QmjHN>vl5ZEHL6>$5`f%U!<(zA9Psm6(`yG@sFTwole&FEhVn>vvf1-;rBZN)wk= zH1DtuF4>aY$+D6En`-v4yH;<_N=Fx^Z>xz}eew){deI$^Y_(%)Go++WY9D{< z*0yYh^v8ookfVXbbKOs5=(u5v~>!BKOE_2{(uMlta5F ze2A>f_vgNTjPG=bHpjy2AFi3L^Vt>o;(NWqgo|n+g7ZM(E?VLmQQ};bnpl#VpQjL# znVZUBsc&SUZ)osdhjj-~fhtHrN@7W>RWe9bDua=Mp`osUrLLiIh@r8Sfr*u|g|30Q zm4U&bJ!y?78glbfGSez?YuNnoo-I&=49JGy{Irtt#G+IN$CUh}R0X%pqSW&IqU>S? X=U~&qt&h!s>KHs-{an^LB{Ts5(O&jL literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..f61b076519142db5604b48f0b5e268bf1b9c2059 GIT binary patch literal 698 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<;!3HEdTJ|3RQfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>u0DjTg1)4z&Oj(#WBR=_|faR)IT}>)Z;Ch>y*3>(auF*IdtCP`sgLY+ldT5_4|u z!+$@X8QnQ~AYsZwPQDASY38NfLi-EW#otL2d}qmbvAbdS8X^0_Ci%(}vX74PJ$-ex zSLcJZdHtHb9Mco|fA$^vdoZ-8+Tz4Vi#nwn(tB2a-4=TNM~`4y=sKC;m)@ z<~rtGTlKOZ9+P+_o~k}8Smt3#_oVM9=ekYP>|Q_hV1~T>N2&fryW9D%?N&d{QNBkY zuSfasqcyuWY%X|grV>7B^{fB-&(3PP1Isyy=x^da&f= zwW8Hr%RJOhnhNLW&D04Gy__7XI`eU8%Nmu19sg5ymNlJLy?^{i@T!>TgQ=4a&)Dxb z)mykGV$&*>ogoKTX`S3(k@>Hd`T4WwI}@XKuDbSlqKQQ5N1opoEf1@lo8|eH|6J$Y z1ECj9oq$m$TH+c};#`!PSdy8arx22vo62CRZ)BivXz*T#bq7#^Do8;}Vo9o1GDuY_ zgOP!up{{|YuAy;=p|O>LiIuU1u7SCgfx)3YX^kiva`RI%(<*Um*!=LGEl`6D$cEtj uw370~qErUQl>DSr1-Hzi)bjkI>|zDyVAH~_kIjJU7(8A5T-G@yGywp2LL?;s literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..f61b076519142db5604b48f0b5e268bf1b9c2059 GIT binary patch literal 698 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<;!3HEdTJ|3RQfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>u0DjTg1)4z&Oj(#WBR=_|faR)IT}>)Z;Ch>y*3>(auF*IdtCP`sgLY+ldT5_4|u z!+$@X8QnQ~AYsZwPQDASY38NfLi-EW#otL2d}qmbvAbdS8X^0_Ci%(}vX74PJ$-ex zSLcJZdHtHb9Mco|fA$^vdoZ-8+Tz4Vi#nwn(tB2a-4=TNM~`4y=sKC;m)@ z<~rtGTlKOZ9+P+_o~k}8Smt3#_oVM9=ekYP>|Q_hV1~T>N2&fryW9D%?N&d{QNBkY zuSfasqcyuWY%X|grV>7B^{fB-&(3PP1Isyy=x^da&f= zwW8Hr%RJOhnhNLW&D04Gy__7XI`eU8%Nmu19sg5ymNlJLy?^{i@T!>TgQ=4a&)Dxb z)mykGV$&*>ogoKTX`S3(k@>Hd`T4WwI}@XKuDbSlqKQQ5N1opoEf1@lo8|eH|6J$Y z1ECj9oq$m$TH+c};#`!PSdy8arx22vo62CRZ)BivXz*T#bq7#^Do8;}Vo9o1GDuY_ zgOP!up{{|YuAy;=p|O>LiIuU1u7SCgfx)3YX^kiva`RI%(<*Um*!=LGEl`6D$cEtj uw370~qErUQl>DSr1-Hzi)bjkI>|zDyVAH~_kIjJU7(8A5T-G@yGywp2LL?;s literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..211944e53f7a6ece25d283007efa59d147339929 GIT binary patch literal 494 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<;!2%?eddt0m6jPG7y9>kr_Wm>bfjrIvkH}&M z25un`X1sK_?hi5L0U zSXp`RX-QeFkZtk!-6;^|A;NpcQGhqZq_#e4@vh0o_ww_}|GE2RllzyMM*kK}F5;cf z(EP_Bsq?_w8QvT>3)gcvo{89;bV;#1*lC*?Y`0WJgM~5e2b6$ zJI+XMz2wT0`cC(TW8`JiCf%vLb5(9QX`Rajw`QZHc2gYTh6OB zC2FpsMxa#5u>{}DE0HYPr`jXaMbAv-V>f#?=PQSQMSS<)TYDG;k7X_sIJcV#=sVF8 z*N775qSVBa%=|oskj&gv21|V-1ARk-_d2XQfC^MW3Q`hFQmv9fs!|z@3=9o*4J>sH zjYABLtqe@8j4gBx%&iOz4(&;6MA49&pOTqYiCe?whxcrO8e~8=1m~xflqVLYGB~E> kC#5R5WfrBD=NDxcD>w(67H)lP22{u3>FVdQ&MBb@02WHBH~;_u literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..12bc11ae0ca707e030a0c0bef100794391892f6c GIT binary patch literal 503 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<;!2%?eddt0m6jPG7y9>kr_Wm>bfjrIvkH}&M z25un`X1sK_?hiV3d4uOm2xTbf<)s8SS1lAv=^k^Rn$rSZjg%0GMxVXrq|`$ZtP?Tg)u zI~MKy4d=2S8YQ+}H<-R5@$6OwmWP`YPAzbJcc@RpW~sRP?PJ>?G#sC?Zfo9YBb&5v z_4>}q3H`@8u6u1)Jyo24knPl@bwXQ0!b&DBXboC4nJrsusg>)7wxET{6{H{~u_V literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..635184cec76e96006ad7b0bfd26156f638115a1b GIT binary patch literal 696 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<;!3HEdTJ|3RQfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>u0DjTg1)4z&OLx#WBR=_|fa}*|!oz*dM6R+P2|q z-co}@d2Dy*&klTc{KMy8hFdmum%4sfb|T?ScjH!_+?RSqPTgCweR}52Zh5Tz^XDGJ zIVu;V&j{@~B*^z>+rLNV(+<~_&3Dw{jVS2hF~?UIXc9x>aw*3T|&mjBUr`^1*%kGQ;LjVId@Dp=|ohn`NFo@x#nnRd;KTJFJ_hg&jj(e-)J4;e@cX~BRPgtWH z9=f43MS15|mTV8RY1-OrcNMs9>i%A+qx!H|M*8$sp*0FWRnP4=ow`~(BJ|U;l`+Z( z#Z^vcsay})uqNn}+fR`FZS8iuY688 z@=60EOti!`qQtoR0bmh zLqlByOI<_b5JO`t0~0G_3ta2BR0kYHJXV>*xq>u0DjTg1)4z&OLx#WBR=_|fa}*|!oz*dM6R+P2|q z-co}@d2Dy*&klTc{KMy8hFdmum%4sfb|T?ScjH!_+?RSqPTgCweR}52Zh5Tz^XDGJ zIVu;V&j{@~B*^z>+rLNV(+<~_&3Dw{jVS2hF~?UIXc9x>aw*3T|&mjBUr`^1*%kGQ;LjVId@Dp=|ohn`NFo@x#nnRd;KTJFJ_hg&jj(e-)J4;e@cX~BRPgtWH z9=f43MS15|mTV8RY1-OrcNMs9>i%A+qx!H|M*8$sp*0FWRnP4=ow`~(BJ|U;l`+Z( z#Z^vcsay})uqNn}+fR`FZS8iuY688 z@=60EOti!`qQtoR0bmh zLqlByOI<_b5JO`t0~0G_3ta2BR0kYHJXV>*xq>u0DjTg1)4z^iGoCDKbmRLvSF*@0FC(*NAIrQaPuG0@ zefRjJuR0$B*4x!^Hb_h;(`4WDaYOzryJ!<0HUUP?1!he57&Hs4<-X0W_IN(`wbo(T z9GS3Nrl%&X4EL=v6gaSwAq(*y**4Yg*C%!&|3?KYVccI7`B> zPqn+U?5}={V>ehgX)BBTr0)Ikrw*n}kvU`cok6T!{rY9`_m|dGPcfg$v*(1bn`e31 zJz+QYLoXIsTfgU3TfAiJ9xiPG+1=)!^mg>lG5B>Zv0K5!PG!4jO~||c$<>qotX|N4 zC(U$fjn9T{bMjACv(}#YIjLraXR>Adq;i&W#p@wOn`f5qTsA2wzG&T~)XQ^E@ATrb z&XEh0oLQzB?p(weGi~yQThn8BJz0-T`g%f?>BRig4}QGavizC&Dh}txhc|pYu`hS! z&sHlt>$A(x-#_bmz2w779pe7-o%*knU?=zOC+l081QsrB+4;cO z6)ka%C~+=IO)SaG&r=A=%uQvm)HgEFH#B&!!@2{gKoz7QC9x#cDjB3ImBGls&`{UF zQrFNp#L(Evz{JYfLf63D%D~{zp0q|34Y~O#nQ4`{HEe!(&ladb24q8Uep*R+Vo@rC mV@iHfs)Ac)QEGX9QFgI{bFgXQ*2iW*bqt=aelF{r5}E+Eek{QN literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..16df74df151afb4392a7d83bb2dfcf7cc4596dab GIT binary patch literal 554 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<;!2%?eddt0m6jPG7y9>kr_Wm>bfjrIvkH}&M z25un`X1sK_?hiyjx3t z_tdG`KW7~2g%7pl#YvZ@di{w0etE6d`xfn8J4K$>{!YH@_S9*I<95fLG8apw zr=)H73p|&6yR_?4%FD1RX5QNunaq8fY8CLiMDuBDxVP)vrQVv^T8kr_Wm>bfjrIvkH}&M z25un`X1sK_?hi*=6)v{Foef{ubRpb9dpN~o3O6?h@&sY8Rx*%?` zZH>XxrCD}-zhsWH9iGFw%*NA8@ddYx*yX!=si{UcUcU?05I)%Wu25fN@xh6HD|=X) zt)?1D^t=)|D}<-$J5JSGDZ_GgSIZ|&3s3RTZwF8A>L|MQ)JP}n`x&O} z6)V5_mNsGR@+ literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..d8f459a70fe65311436dcdc08aec2fe78a3dfe80 GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<;!2%?eddt0m6jPG7y9>kr_Wm>bfjrIvkH}&M z25un`X1sK_?hiuGhe%Xc*~Y1cR%aF{F0id+IOEhhK3ijt$X)#s#E=;OH8uj z-zRMA=bF3pU_!=*efKnZtb~ung^9H;)^l5^!;!vA!f~dkUWr$#+l-5vQ#=#HmItV{ zH2DSSwJh=rIM?D8>-bYK>e$sSHL2hK9NZmb!+a>QWe}Xi&D$;i?WLqoP$jZw>~xls$=kU^>bP0l+XkK D-`kzm literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..08bf2411a2b4be85094e06c3994a3f4809e8d9dd GIT binary patch literal 780 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<;!3HEdTJ|3RQfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>u0DjTg1)4!1%_~#WBR=_|fb8{ck%+9DjKJC%fM( zD^U-QRVfQ6Sv!O_u8>%z(6&hDXZ3EEw*gY6NoCA#(e3cTL&Zm{G`=hdIipmdz~>2kvlycP39 zjaEN!c~@?+{Qk-5`>w??&)L7CM#?T~-=x~v4pTynras6m+8Os?+N`ZbiWar37h>;P z*xg@sh5g>ErK^@KbX^yzU48IopTyB^KqNlr?UY$tH(h@J z^5ZIPm1~_p?Q1GO^>=Hr@1*~tXOzsNS4}GCTsG~p?oWS5*`i%4`NAR7F01}*e_-<@ zL^Yjt>*_U!>%Osh&kx1hTfW-1P3!o@pnp+mS`iK!^J8+XFZMtG z9pBWu_t~N*-|!skz#Qv|HN1@%m~J_6S4`t*Uby>GeMf=u)Du3r-5*((>sfa>ylXtn zo3g{|!t8(iRR@A4172=h9?;2igRQDJ%Wx-S`;y`h)khgyfQdk~#5JPCxhOTUBr`ux zAtW<5mBCWq$UxuF;Jps(4xj>6kb;!Nl2of?kg8M$BLhQ2T?0#9L*o!bV=Ds_D`N{? z19K|_gF}1L8c{Ul=BH$)RpQpL`QbfVpavO`4Z-kr_Wm>bfjrIvkH}&M z25un`X1sK_?hilFzu{gc->fStIM+w#oo9k1QCoMg! zV6`MS#zASRQ=g8@+2S8F{}_mHbZhalnv{41f_BZ9=w~3fJPR1gq9v{oCC){ui6xo&c?uz!xv316`bGx& zh6e9-Sa$#wsDc!vB$lLFC4*F@G8h>c8tNKY>KYn{7#dp{m{=KG=o*+?85kVelh%l$ zAvZrIGp!Q0hRqM}*#b4lfNTiPPb(=;EJ|f?Ovz75RdCBJN-fVX$}U!L4mK^^`q&Jp Oj=|H_&t;ucLK6V($N5wM literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..f4f73317b3fb98a288945e030c3f08124bed2f1a GIT binary patch literal 674 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<;!3HEdTJ|3RQfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>u0DjTg1)4z}V#J;uzv_{OI+KezyZe*dCl;>9}B8 ziHm6TQXL*qkC_6Z&Xv<`gx?3TUFqmtD0^#Zv1qAIpeEC*k`J8*VVdv09+f${srdZX z&(Eb7J$CA|vWh;e7I*9ve~r0hd|7SDMZ<_j#d}FDy)Vvu6qPT?Gm2YM=X&!aJ6~ag zdBwGe`v)1+wJt9465cbly8Ug`j;j{&M}L~{dl0cGWz~bAb#i&K)rGZP@fU9&^Ii4i zKj%ID?=rt7jz2f{`M7!Y6NSll?8-I@9nV{{_V~P|PaJKOHz!!{oO&$wx~0l(u5A;u z!^BS3b1yq-x_a^x=O)dfNY(#(Gu-vMpVT&4KH21PPqap6r{5&sgU2VlR*C$gFf7GyU0LQN0t4g^9nO2Eg!{&$gY=IhNKsE&Dr2BR0kYHJXV>*xq>u0DjTg1)4z}V#J;uzv_{OI+KezyZe*dCl;>9}B8 ziHm6TQXL*qkC_6Z&Xv<`gx?3TUFqmtD0^#Zv1qAIpeEC*k`J8*VVdv09+f${srdZX z&(Eb7J$CA|vWh;e7I*9ve~r0hd|7SDMZ<_j#d}FDy)Vvu6qPT?Gm2YM=X&!aJ6~ag zdBwGe`v)1+wJt9465cbly8Ug`j;j{&M}L~{dl0cGWz~bAb#i&K)rGZP@fU9&^Ii4i zKj%ID?=rt7jz2f{`M7!Y6NSll?8-I@9nV{{_V~P|PaJKOHz!!{oO&$wx~0l(u5A;u z!^BS3b1yq-x_a^x=O)dfNY(#(Gu-vMpVT&4KH21PPqap6r{5&sgU2VlR*C$gFf7GyU0LQN0t4g^9nO2Eg!{&$gY=IhNKsE&Drkr_Wm>bfjrIvkH}&M z25un`X1sK_?hil_$jgQ(a#}MzTl3-3YVVgEt2$U*84fgUjn3rVwkwTksp^f3ro~#l z2j}^%Fk#thH8DuqLs?kWjORoA!{IYs}Vqt)U~ynNRrr%blm zp3;9vdQP>T`qL?544Z$ge01jNVHpQc(?`Fye`kn~@xJP*Jo_}zQ=%oV5hcz=sfi_- z`FRQ97#ivtSn3)YhZq`L8JJiZ zTj&~?TNxM}+LP9Zq9HdwB{QuOw}#CR@7V%1$bf7J&QB{TPb^Aha7@WhN>y;nEJ`iU bFUl@fa1J&t-1^uIsE)zY)z4*}Q$iB}2A!wR literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..78085d3d11d59ffc4a87ad98d16edde108b54306 GIT binary patch literal 490 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<;!2%?eddt0m6jPG7y9>kr_Wm>bfjrIvkH}&M z25un`X1sK_?hi_ z#`5y-cQ-1CPu!T=Dt=$@=Ys`YCnJOnQX9qN^^Y!C&~?ItgJH(T6797I-NOABY+;Gs zRpqzT@Ww^Xscj3w)Pu5`-R3&1uFT=(jC+44+tQuyC38ZM?9@3H^)s0@G}!n2duz+69_1(h?`qy;pwC20Tq8=H zi&7IyGV}8kLNaqx87%dU4D<~R-s`aL04h)gDM(2yNwrD_sY+!qGB7mMHL%n*G!8K| zwlXlWGPck)Ft;)=IJ76N5k*68eoAIqC2kFyAKtSCYLEfh5S*V@Ql40p%HWuipOmWL gmRXcqo?nz*tl%7MTDbMG8BiUAr>mdKI;Vst0PhX0DF6Tf literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..b8f68499dbac38fe69416ca88ec2afadd895b230 GIT binary patch literal 670 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<;!3HEdTJ|3RQfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>u0DjTg1)4z*y($;uzv_{OGl_UWXk-+8&ylhUM&D zy@T_nNXQ+JH67v;Uw>6{S#-3uX@PX1a%uSDzl-&rwe&S#D@mIrqv2`1@aL~HDHe=! zuikvx%30Fb7bC^^K2pjzrrx@Mr>(_`HEDsav-|<>0`8toCY$QqUi@IUc96GV*w*v9 zovEN%XsedCqwhPJ7nu*YJ++wnSf+w)-Nq?fM0K8gDX>1!Ip;oOvgB*e0PT}oS;9}e zW#TN*xi8}d3n3eO_tGiD}D5R(JiK13tMI| z`u2WXc_^Xk?9=9yS#1XdDww;@K3~18ph{QevH?rc6(-gj?w;2og*nX`J|)TX1QhQ( zUbOI9X!4ac&myIC_c4mhoaj33t9%+TT0~1+BTAf$QWHxu^Yau!GILWIEcJ~H^bHN( z>#*(sDo_O}NJ%V7wMqu5N@XxIFf`OPu+%j)4ly*gGBB|+w$L>&w=ys|v?r|*MMG|W zN@iLmZVj6s-m?X2kOA2coS#-wo>-L1;Fyx1l&avCS(I9yUzA;};2dmPxb?9aP#uG( LtDnm{r-UW|TRHo! literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..b8f68499dbac38fe69416ca88ec2afadd895b230 GIT binary patch literal 670 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<;!3HEdTJ|3RQfx`y?k)`fL2$v|<&%LToCO|{ z#S9GGLLkg|>2BR0kYHJXV>*xq>u0DjTg1)4z*y($;uzv_{OGl_UWXk-+8&ylhUM&D zy@T_nNXQ+JH67v;Uw>6{S#-3uX@PX1a%uSDzl-&rwe&S#D@mIrqv2`1@aL~HDHe=! zuikvx%30Fb7bC^^K2pjzrrx@Mr>(_`HEDsav-|<>0`8toCY$QqUi@IUc96GV*w*v9 zovEN%XsedCqwhPJ7nu*YJ++wnSf+w)-Nq?fM0K8gDX>1!Ip;oOvgB*e0PT}oS;9}e zW#TN*xi8}d3n3eO_tGiD}D5R(JiK13tMI| z`u2WXc_^Xk?9=9yS#1XdDww;@K3~18ph{QevH?rc6(-gj?w;2og*nX`J|)TX1QhQ( zUbOI9X!4ac&myIC_c4mhoaj33t9%+TT0~1+BTAf$QWHxu^Yau!GILWIEcJ~H^bHN( z>#*(sDo_O}NJ%V7wMqu5N@XxIFf`OPu+%j)4ly*gGBB|+w$L>&w=ys|v?r|*MMG|W zN@iLmZVj6s-m?X2kOA2coS#-wo>-L1;Fyx1l&avCS(I9yUzA;};2dmPxb?9aP#uG( LtDnm{r-UW|TRHo! literal 0 HcmV?d00001 diff --git a/core/res/res/drawable/numberpicker_down_btn_holo_dark.xml b/core/res/res/drawable/numberpicker_down_btn_holo_dark.xml new file mode 100644 index 0000000000000..dd6332db56856 --- /dev/null +++ b/core/res/res/drawable/numberpicker_down_btn_holo_dark.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + diff --git a/core/res/res/drawable/numberpicker_down_btn_holo_light.xml b/core/res/res/drawable/numberpicker_down_btn_holo_light.xml new file mode 100644 index 0000000000000..565fd868bfb27 --- /dev/null +++ b/core/res/res/drawable/numberpicker_down_btn_holo_light.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + diff --git a/core/res/res/drawable/numberpicker_up_btn_holo_dark.xml b/core/res/res/drawable/numberpicker_up_btn_holo_dark.xml new file mode 100644 index 0000000000000..7af3ee42df3c7 --- /dev/null +++ b/core/res/res/drawable/numberpicker_up_btn_holo_dark.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + diff --git a/core/res/res/drawable/numberpicker_up_btn_holo_light.xml b/core/res/res/drawable/numberpicker_up_btn_holo_light.xml new file mode 100644 index 0000000000000..cbcbb07704ee5 --- /dev/null +++ b/core/res/res/drawable/numberpicker_up_btn_holo_light.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + diff --git a/core/res/res/layout/number_picker.xml b/core/res/res/layout/number_picker.xml index b7e7ae1467303..2967696d56aee 100644 --- a/core/res/res/layout/number_picker.xml +++ b/core/res/res/layout/number_picker.xml @@ -22,26 +22,19 @@ - + style="?android:attr/numberPickerInputTextStyle" /> diff --git a/core/res/res/layout/number_picker_with_selector_wheel.xml b/core/res/res/layout/number_picker_with_selector_wheel.xml deleted file mode 100644 index c8fa0f7b21801..0000000000000 --- a/core/res/res/layout/number_picker_with_selector_wheel.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 428790f6b7343..db908ca20b478 100755 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -589,6 +589,12 @@ + + + + + + @@ -3611,12 +3617,12 @@ + + - - @@ -3625,10 +3631,6 @@ - - - - diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 660f53a9fdeb9..7137b7c0dc926 100755 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -3170,6 +3170,8 @@ Increment Decrement + + %s touch and hold. Slide up to increment and down to decrement. diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml index 288b8b2a1f57f..a51f3f946e762 100644 --- a/core/res/res/values/styles.xml +++ b/core/res/res/values/styles.xml @@ -521,10 +521,10 @@ please see styles_device_defaults.xml. + + + + + + + + + + + + @@ -2067,6 +2109,17 @@ please see styles_device_defaults.xml. + + + + + + diff --git a/core/res/res/values/styles_device_defaults.xml b/core/res/res/values/styles_device_defaults.xml index 330e68c0e462d..64198728515ff 100644 --- a/core/res/res/values/styles_device_defaults.xml +++ b/core/res/res/values/styles_device_defaults.xml @@ -199,6 +199,9 @@ easier. + + + + + +