From 912ab8506ae6409ee7fa0323b217fefaf0bd9771 Mon Sep 17 00:00:00 2001 From: Svetoslav Ganov Date: Wed, 9 Nov 2011 14:08:41 -0800 Subject: [PATCH] Revamp of the NumberPicker widget. 1. The number picker no longer shows up and down arrows, it has only three touch targets which are the currently selected number in the middle with a lesser one above and greater below, now what you touch is what you get, flingability and long press are still supported. 2. Removed the restriction for a View with an AccessibilityNodeProvider to not have any concrete children. If the View has a provider, then this provider is responsible for creating the AccessibilityNodeInfos for all its descendants, concrete and virtual. The number picker is a good example for such a case - it has a concrete input view and two virtual buttons as its children. This is a safe change since this behavior has not been released. 3. This patch also fixes bug where the number picker is stretched too much in the Theme theme. bug:6177794 bug:5728294 Change-Id: Id8c0b3549174b9599f971d6e3086ca427cfbaa39 --- api/current.txt | 1 - core/java/android/view/ViewGroup.java | 14 - core/java/android/widget/DatePicker.java | 37 +- core/java/android/widget/NumberPicker.java | 1318 +++++++++-------- core/java/android/widget/TimePicker.java | 31 +- ...picker_down_disabled_focused_holo_dark.png | Bin 634 -> 0 bytes ...icker_down_disabled_focused_holo_light.png | Bin 489 -> 0 bytes .../numberpicker_down_disabled_holo_dark.png | Bin 444 -> 0 bytes .../numberpicker_down_disabled_holo_light.png | Bin 418 -> 0 bytes .../numberpicker_down_focused_holo_dark.png | Bin 661 -> 0 bytes .../numberpicker_down_focused_holo_light.png | Bin 514 -> 0 bytes ...umberpicker_down_longpressed_holo_dark.png | Bin 555 -> 0 bytes ...mberpicker_down_longpressed_holo_light.png | Bin 555 -> 0 bytes .../numberpicker_down_normal_holo_dark.png | Bin 439 -> 0 bytes .../numberpicker_down_normal_holo_light.png | Bin 441 -> 0 bytes .../numberpicker_down_pressed_holo_dark.png | Bin 564 -> 0 bytes .../numberpicker_down_pressed_holo_light.png | Bin 564 -> 0 bytes ...erpicker_up_disabled_focused_holo_dark.png | Bin 605 -> 0 bytes ...rpicker_up_disabled_focused_holo_light.png | Bin 457 -> 0 bytes .../numberpicker_up_disabled_holo_dark.png | Bin 416 -> 0 bytes .../numberpicker_up_disabled_holo_light.png | Bin 407 -> 0 bytes .../numberpicker_up_focused_holo_dark.png | Bin 652 -> 0 bytes .../numberpicker_up_focused_holo_light.png | Bin 497 -> 0 bytes .../numberpicker_up_longpressed_holo_dark.png | Bin 536 -> 0 bytes ...numberpicker_up_longpressed_holo_light.png | Bin 536 -> 0 bytes .../numberpicker_up_normal_holo_dark.png | Bin 426 -> 0 bytes .../numberpicker_up_normal_holo_light.png | Bin 427 -> 0 bytes .../numberpicker_up_pressed_holo_dark.png | Bin 542 -> 0 bytes .../numberpicker_up_pressed_holo_light.png | Bin 542 -> 0 bytes ...picker_down_disabled_focused_holo_dark.png | Bin 561 -> 0 bytes ...icker_down_disabled_focused_holo_light.png | Bin 426 -> 0 bytes .../numberpicker_down_disabled_holo_dark.png | Bin 398 -> 0 bytes .../numberpicker_down_disabled_holo_light.png | Bin 384 -> 0 bytes .../numberpicker_down_focused_holo_dark.png | Bin 575 -> 0 bytes .../numberpicker_down_focused_holo_light.png | Bin 446 -> 0 bytes ...umberpicker_down_longpressed_holo_dark.png | Bin 473 -> 0 bytes ...mberpicker_down_longpressed_holo_light.png | Bin 473 -> 0 bytes .../numberpicker_down_normal_holo_dark.png | Bin 423 -> 0 bytes .../numberpicker_down_normal_holo_light.png | Bin 412 -> 0 bytes .../numberpicker_down_pressed_holo_dark.png | Bin 473 -> 0 bytes .../numberpicker_down_pressed_holo_light.png | Bin 473 -> 0 bytes ...erpicker_up_disabled_focused_holo_dark.png | Bin 535 -> 0 bytes ...rpicker_up_disabled_focused_holo_light.png | Bin 410 -> 0 bytes .../numberpicker_up_disabled_holo_dark.png | Bin 394 -> 0 bytes .../numberpicker_up_disabled_holo_light.png | Bin 383 -> 0 bytes .../numberpicker_up_focused_holo_dark.png | Bin 556 -> 0 bytes .../numberpicker_up_focused_holo_light.png | Bin 429 -> 0 bytes .../numberpicker_up_longpressed_holo_dark.png | Bin 466 -> 0 bytes ...numberpicker_up_longpressed_holo_light.png | Bin 466 -> 0 bytes .../numberpicker_up_normal_holo_dark.png | Bin 404 -> 0 bytes .../numberpicker_up_normal_holo_light.png | Bin 408 -> 0 bytes .../numberpicker_up_pressed_holo_dark.png | Bin 468 -> 0 bytes .../numberpicker_up_pressed_holo_light.png | Bin 468 -> 0 bytes ...picker_down_disabled_focused_holo_dark.png | Bin 748 -> 0 bytes ...icker_down_disabled_focused_holo_light.png | Bin 556 -> 0 bytes .../numberpicker_down_disabled_holo_dark.png | Bin 480 -> 0 bytes .../numberpicker_down_disabled_holo_light.png | Bin 459 -> 0 bytes .../numberpicker_down_focused_holo_dark.png | Bin 785 -> 0 bytes .../numberpicker_down_focused_holo_light.png | Bin 627 -> 0 bytes ...umberpicker_down_longpressed_holo_dark.png | Bin 698 -> 0 bytes ...mberpicker_down_longpressed_holo_light.png | Bin 698 -> 0 bytes .../numberpicker_down_normal_holo_dark.png | Bin 494 -> 0 bytes .../numberpicker_down_normal_holo_light.png | Bin 503 -> 0 bytes .../numberpicker_down_pressed_holo_dark.png | Bin 696 -> 0 bytes .../numberpicker_down_pressed_holo_light.png | Bin 696 -> 0 bytes ...erpicker_up_disabled_focused_holo_dark.png | Bin 741 -> 0 bytes ...rpicker_up_disabled_focused_holo_light.png | Bin 554 -> 0 bytes .../numberpicker_up_disabled_holo_dark.png | Bin 474 -> 0 bytes .../numberpicker_up_disabled_holo_light.png | Bin 463 -> 0 bytes .../numberpicker_up_focused_holo_dark.png | Bin 780 -> 0 bytes .../numberpicker_up_focused_holo_light.png | Bin 617 -> 0 bytes .../numberpicker_up_longpressed_holo_dark.png | Bin 674 -> 0 bytes ...numberpicker_up_longpressed_holo_light.png | Bin 674 -> 0 bytes .../numberpicker_up_normal_holo_dark.png | Bin 485 -> 0 bytes .../numberpicker_up_normal_holo_light.png | Bin 490 -> 0 bytes .../numberpicker_up_pressed_holo_dark.png | Bin 670 -> 0 bytes .../numberpicker_up_pressed_holo_light.png | Bin 670 -> 0 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, 829 insertions(+), 910 deletions(-) delete mode 100644 core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_dark.png delete mode 100644 core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_light.png delete mode 100644 core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_dark.png delete mode 100644 core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_light.png delete mode 100644 core/res/res/drawable-hdpi/numberpicker_down_focused_holo_dark.png delete mode 100644 core/res/res/drawable-hdpi/numberpicker_down_focused_holo_light.png delete mode 100644 core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_dark.png delete mode 100644 core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_light.png delete mode 100644 core/res/res/drawable-hdpi/numberpicker_down_normal_holo_dark.png delete mode 100644 core/res/res/drawable-hdpi/numberpicker_down_normal_holo_light.png delete mode 100644 core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_dark.png delete mode 100644 core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_light.png delete mode 100644 core/res/res/drawable-hdpi/numberpicker_up_disabled_focused_holo_dark.png delete mode 100644 core/res/res/drawable-hdpi/numberpicker_up_disabled_focused_holo_light.png delete mode 100644 core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_dark.png delete mode 100644 core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_light.png delete mode 100644 core/res/res/drawable-hdpi/numberpicker_up_focused_holo_dark.png delete mode 100644 core/res/res/drawable-hdpi/numberpicker_up_focused_holo_light.png delete mode 100644 core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_dark.png delete mode 100644 core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_light.png delete mode 100644 core/res/res/drawable-hdpi/numberpicker_up_normal_holo_dark.png delete mode 100644 core/res/res/drawable-hdpi/numberpicker_up_normal_holo_light.png delete mode 100644 core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_dark.png delete mode 100644 core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_light.png delete mode 100644 core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_dark.png delete mode 100644 core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_light.png delete mode 100644 core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_dark.png delete mode 100644 core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_light.png delete mode 100644 core/res/res/drawable-mdpi/numberpicker_down_focused_holo_dark.png delete mode 100644 core/res/res/drawable-mdpi/numberpicker_down_focused_holo_light.png delete mode 100644 core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_dark.png delete mode 100644 core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_light.png delete mode 100644 core/res/res/drawable-mdpi/numberpicker_down_normal_holo_dark.png delete mode 100644 core/res/res/drawable-mdpi/numberpicker_down_normal_holo_light.png delete mode 100644 core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_dark.png delete mode 100644 core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_light.png delete mode 100644 core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_dark.png delete mode 100644 core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_light.png delete mode 100644 core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_dark.png delete mode 100644 core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_light.png delete mode 100644 core/res/res/drawable-mdpi/numberpicker_up_focused_holo_dark.png delete mode 100644 core/res/res/drawable-mdpi/numberpicker_up_focused_holo_light.png delete mode 100644 core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_dark.png delete mode 100644 core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_light.png delete mode 100644 core/res/res/drawable-mdpi/numberpicker_up_normal_holo_dark.png delete mode 100644 core/res/res/drawable-mdpi/numberpicker_up_normal_holo_light.png delete mode 100644 core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_dark.png delete mode 100644 core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_light.png delete mode 100644 core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_dark.png delete mode 100644 core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_light.png delete mode 100644 core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_dark.png delete mode 100644 core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_light.png delete mode 100644 core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_dark.png delete mode 100644 core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_light.png delete mode 100644 core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_dark.png delete mode 100644 core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_light.png delete mode 100644 core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_dark.png delete mode 100644 core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_light.png delete mode 100644 core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_dark.png delete mode 100644 core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_light.png delete mode 100644 core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_dark.png delete mode 100644 core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_light.png delete mode 100644 core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_dark.png delete mode 100644 core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_light.png delete mode 100644 core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_dark.png delete mode 100644 core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_light.png delete mode 100644 core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_dark.png delete mode 100644 core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_light.png delete mode 100644 core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_dark.png delete mode 100644 core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_light.png delete mode 100644 core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_dark.png delete mode 100644 core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_light.png delete mode 100644 core/res/res/drawable/numberpicker_down_btn_holo_dark.xml delete mode 100644 core/res/res/drawable/numberpicker_down_btn_holo_light.xml delete mode 100644 core/res/res/drawable/numberpicker_up_btn_holo_dark.xml delete mode 100644 core/res/res/drawable/numberpicker_up_btn_holo_light.xml create mode 100644 core/res/res/layout/number_picker_with_selector_wheel.xml diff --git a/api/current.txt b/api/current.txt index 29f093a98f4c2..211ff6e2a7a55 100644 --- a/api/current.txt +++ b/api/current.txt @@ -26924,7 +26924,6 @@ 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 1993ce6a52657..de71e6ce0e359 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -2679,15 +2679,6 @@ 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. @@ -3109,11 +3100,6 @@ 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 fd939802a5775..c5066b672861a 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,9 +280,7 @@ public class DatePicker extends FrameLayout { reorderSpinners(); // set content descriptions - if (AccessibilityManager.getInstance(mContext).isEnabled()) { - setContentDescriptions(); - } + setContentDescriptions(); } /** @@ -717,20 +715,27 @@ public class DatePicker extends FrameLayout { private void setContentDescriptions() { // Day - 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); + trySetContentDescription(mDaySpinner, R.id.increment, + R.string.date_picker_increment_day_button); + trySetContentDescription(mDaySpinner, R.id.decrement, + R.string.date_picker_decrement_day_button); // Month - 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); + trySetContentDescription(mMonthSpinner, R.id.increment, + R.string.date_picker_increment_month_button); + trySetContentDescription(mMonthSpinner, R.id.decrement, + R.string.date_picker_decrement_month_button); // Year - 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); + 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)); + } } private void updateInputState() { diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java index 3335da0bd6724..506b0c06a85e3 100644 --- a/core/java/android/widget/NumberPicker.java +++ b/core/java/android/widget/NumberPicker.java @@ -16,10 +16,6 @@ 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; @@ -48,22 +44,41 @@ 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. - * 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. + * There are two flavors of this widget and which one is presented to the user + * depends on the current theme. + * *

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

@@ -74,7 +89,7 @@ public class NumberPicker extends LinearLayout { /** * The number of items show in the selector wheel. */ - public static final int SELECTOR_WHEEL_ITEM_COUNT = 5; + private static final int SELECTOR_WHEEL_ITEM_COUNT = 3; /** * The default update interval during long press. @@ -84,7 +99,7 @@ public class NumberPicker extends LinearLayout { /** * The index of the middle selector item. */ - private static final int SELECTOR_MIDDLE_ITEM_INDEX = 2; + private static final int SELECTOR_MIDDLE_ITEM_INDEX = SELECTOR_WHEEL_ITEM_COUNT / 2; /** * The coefficient by which to adjust (divide) the max fling velocity. @@ -97,18 +112,11 @@ 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. */ @@ -120,56 +128,31 @@ public class NumberPicker extends LinearLayout { private static final int UNSCALED_DEFAULT_SELECTION_DIVIDER_HEIGHT = 2; /** - * In this state the selector wheel is not shown. + * The default unscaled distance between the selection dividers. */ - private static final int SELECTOR_WHEEL_STATE_NONE = 0; + private static final int UNSCALED_DEFAULT_SELECTION_DIVIDERS_DISTANCE = 48; /** - * In this state the selector wheel is small. + * The default unscaled minimal distance for a swipe to be considered a fling. */ - private static final int SELECTOR_WHEEL_STATE_SMALL = 1; + private static final int UNSCALED_DEFAULT_MIN_FLING_DISTANCE = 150; /** - * In this state the selector wheel is large. + * Coefficient for adjusting touch scroll distance. */ - private static final int SELECTOR_WHEEL_STATE_LARGE = 2; + private static final float TOUCH_SCROLL_DECELERATION_COEFFICIENT = 2.5f; /** - * The alpha of the selector wheel when it is bright. + * The resource id for the default layout. */ - 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"; + private static final int DEFAULT_LAYOUT_RESOURCE_ID = R.layout.number_picker; /** * 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. @@ -214,6 +197,11 @@ 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. */ @@ -244,6 +232,11 @@ 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. */ @@ -297,10 +290,7 @@ public class NumberPicker extends LinearLayout { /** * The selector indices whose value are show by the selector. */ - private final int[] mSelectorIndices = new int[] { - Integer.MIN_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE, - Integer.MIN_VALUE - }; + private final int[] mSelectorIndices = new int[SELECTOR_WHEEL_ITEM_COUNT]; /** * The {@link Paint} for drawing the selector. @@ -342,11 +332,6 @@ 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. @@ -354,14 +339,9 @@ public class NumberPicker extends LinearLayout { private ChangeCurrentByOneFromLongPressCommand mChangeCurrentByOneFromLongPressCommand; /** - * {@link Animator} for showing the up/down arrows. + * Command for beginning an edit of the current value via IME on long press. */ - private final AnimatorSet mShowInputControlsAnimator; - - /** - * {@link Animator} for dimming the selector wheel. - */ - private final Animator mDimSelectorWheelAnimator; + private BeginSoftInputOnLongPressCommand mBeginSoftInputOnLongPressCommand; /** * The Y position of the last down event. @@ -369,24 +349,14 @@ public class NumberPicker extends LinearLayout { private float mLastDownEventY; /** - * The Y position of the last motion event. + * The time of the last down event. */ - private float mLastMotionEventY; + private long mLastDownEventTime; /** - * Flag if to check for double tap and potentially start edit. + * The Y position of the last down or move event. */ - 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; + private float mLastDownOrMoveEventY; /** * Determines speed during touch scrolling. @@ -419,9 +389,9 @@ public class NumberPicker extends LinearLayout { private final int mSolidColor; /** - * Flag indicating if this widget supports flinging. + * Flag whether this widget has a selector wheel. */ - private final boolean mFlingable; + private final boolean mHasSelectorWheel; /** * Divider for showing item to be selected while scrolling @@ -433,30 +403,41 @@ 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; /** - * The duration of the animation for showing the input controls. + * Flag whether to ignore move events - we ignore such when we show in IME + * to prevent the content from scrolling. */ - private final long mShowInputControlsAnimimationDuration; + private boolean mIngonreMoveEvents; /** - * Flag whether the scoll wheel and the fading edges have been initialized. + * Flag whether to show soft input on tap. */ - private boolean mScrollWheelAndFadingEdgesInitialized; + private boolean mShowSoftInputOnTap; /** - * The time of the last up event. + * The top of the top selection divider. */ - private long mLastUpEventTimeMillis; + 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; /** * Interface to listen for changes of the current value. @@ -484,7 +465,7 @@ public class NumberPicker extends LinearLayout { public static int SCROLL_STATE_IDLE = 0; /** - * The user is scrolling using touch, and their finger is still on the screen. + * The user is scrolling using touch, and his finger is still on the screen. */ public static int SCROLL_STATE_TOUCH_SCROLL = 1; @@ -549,58 +530,78 @@ public class NumberPicker extends LinearLayout { super(context, attrs, defStyle); // process style attributes - TypedArray attributesArray = context.obtainStyledAttributes(attrs, - R.styleable.NumberPicker, defStyle, 0); + 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); + mSolidColor = attributesArray.getColor(R.styleable.NumberPicker_solidColor, 0); - mFlingable = attributesArray.getBoolean(R.styleable.NumberPicker_flingable, true); + mSelectionDivider = attributesArray.getDrawable(R.styleable.NumberPicker_selectionDivider); - int defSelectionDividerHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, - UNSCALED_DEFAULT_SELECTION_DIVIDER_HEIGHT, + + final 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); + mComputeMaxWidth = (mMaxWidth == Integer.MAX_VALUE); + + attributesArray.recycle(); // 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(false); - setSelectorWheelState(SELECTOR_WHEEL_STATE_NONE); + setWillNotDraw(!mHasSelectorWheel); LayoutInflater inflater = (LayoutInflater) getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE); - inflater.inflate(R.layout.number_picker, this, true); + inflater.inflate(layoutResId, this, true); OnClickListener onClickListener = new OnClickListener() { public void onClick(View v) { hideSoftInput(); mInputText.clearFocus(); if (v.getId() == R.id.increment) { - changeCurrentByOne(true); + changeValueByOne(true); } else { - changeCurrentByOne(false); + changeValueByOne(false); } } }; @@ -610,23 +611,31 @@ public class NumberPicker extends LinearLayout { hideSoftInput(); mInputText.clearFocus(); if (v.getId() == R.id.increment) { - postChangeCurrentByOneFromLongPress(true); + postChangeCurrentByOneFromLongPress(true, 0); } else { - postChangeCurrentByOneFromLongPress(false); + postChangeCurrentByOneFromLongPress(false, 0); } return true; } }; // increment button - mIncrementButton = (ImageButton) findViewById(R.id.increment); - mIncrementButton.setOnClickListener(onClickListener); - mIncrementButton.setOnLongClickListener(onLongClickListener); + if (!mHasSelectorWheel) { + mIncrementButton = (ImageButton) findViewById(R.id.increment); + mIncrementButton.setOnClickListener(onClickListener); + mIncrementButton.setOnLongClickListener(onLongClickListener); + } else { + mIncrementButton = null; + } // decrement button - mDecrementButton = (ImageButton) findViewById(R.id.decrement); - mDecrementButton.setOnClickListener(onClickListener); - mDecrementButton.setOnLongClickListener(onLongClickListener); + if (!mHasSelectorWheel) { + mDecrementButton = (ImageButton) findViewById(R.id.decrement); + mDecrementButton.setOnClickListener(onClickListener); + mDecrementButton.setOnLongClickListener(onLongClickListener); + } else { + mDecrementButton = null; + } // input text mInputText = (EditText) findViewById(R.id.numberpicker_input); @@ -648,7 +657,6 @@ 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(); @@ -667,69 +675,22 @@ 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(); @@ -739,24 +700,23 @@ public class NumberPicker extends LinearLayout { final int inptTxtBottom = inptTxtTop + inptTxtMsrdHght; mInputText.layout(inptTxtLeft, inptTxtTop, inptTxtRight, inptTxtBottom); - // 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; + if (changed) { // 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); @@ -769,120 +729,143 @@ public class NumberPicker extends LinearLayout { setMeasuredDimension(widthSize, heightSize); } - @Override - public boolean onInterceptTouchEvent(MotionEvent event) { - if (!isEnabled() || !mFlingable) { - return false; - } - switch (event.getActionMasked()) { - case MotionEvent.ACTION_DOWN: - mLastMotionEventY = mLastDownEventY = event.getY(); - removeAllCallbacks(); - 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(); - hideInputControls(); - return true; + /** + * 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; } - 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; + } + amountToScroll += overshootAdjustment; + scrollBy(0, amountToScroll); + return true; } return false; } @Override - public boolean onTouchEvent(MotionEvent ev) { - if (!isEnabled()) { + public boolean onInterceptTouchEvent(MotionEvent event) { + if (!mHasSelectorWheel || !isEnabled()) { + return false; + } + final int action = event.getActionMasked(); + switch (action) { + case MotionEvent.ACTION_DOWN: { + 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) { + hideSoftInput(); + postChangeCurrentByOneFromLongPress( + false, ViewConfiguration.getLongPressTimeout()); + } else if (mLastDownEventY > mBottomSelectionDividerBottom) { + hideSoftInput(); + postChangeCurrentByOneFromLongPress( + true, ViewConfiguration.getLongPressTimeout()); + } else { + mShowSoftInputOnTap = true; + postBeginSoftInputOnLongPressCommand(); + } + return true; + } + } + return false; + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (!isEnabled() || !mHasSelectorWheel) { return false; } if (mVelocityTracker == null) { mVelocityTracker = VelocityTracker.obtain(); } - mVelocityTracker.addMovement(ev); - int action = ev.getActionMasked(); + mVelocityTracker.addMovement(event); + int action = event.getActionMasked(); switch (action) { - case MotionEvent.ACTION_MOVE: - float currentMoveY = ev.getY(); - if (mCheckBeginEditOnUpEvent - || mScrollState != OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) { + case MotionEvent.ACTION_MOVE: { + if (mIngonreMoveEvents) { + break; + } + float currentMoveY = event.getY(); + if (mScrollState != OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) { int deltaDownY = (int) Math.abs(currentMoveY - mLastDownEventY); if (deltaDownY > mTouchSlop) { - mCheckBeginEditOnUpEvent = false; + removeAllCallbacks(); onScrollStateChange(OnScrollListener.SCROLL_STATE_TOUCH_SCROLL); } + } else { + int deltaMoveY = (int) ((currentMoveY - mLastDownOrMoveEventY) + / TOUCH_SCROLL_DECELERATION_COEFFICIENT); + scrollBy(0, deltaMoveY); + invalidate(); } - 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; - } - } + mLastDownOrMoveEventY = currentMoveY; + } break; + case MotionEvent.ACTION_UP: { + removeBeginSoftInputCommand(); + removeChangeCurrentByOneFromLongPress(); VelocityTracker velocityTracker = mVelocityTracker; velocityTracker.computeCurrentVelocity(1000, mMaximumFlingVelocity); int initialVelocity = (int) velocityTracker.getYVelocity(); if (Math.abs(initialVelocity) > mMinimumFlingVelocity) { - fling(initialVelocity); + int deltaMove = (int) (event.getY() - mLastDownEventY); + int absDeltaMoveY = Math.abs(deltaMove); + if (absDeltaMoveY > mMinFlingDistance) { + fling(initialVelocity); + } else { + changeValueByOne(deltaMove < 0); + } onScrollStateChange(OnScrollListener.SCROLL_STATE_FLING); } else { - if (mAdjustScrollerOnUpEvent) { - if (mFlingScroller.isFinished() && mAdjustScroller.isFinished()) { - postAdjustScrollerCommand(0); + 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); + } } } else { - postAdjustScrollerCommand(SHOW_INPUT_CONTROLS_DELAY_MILLIS); + ensureScrollWheelAdjusted(); } + onScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); } mVelocityTracker.recycle(); mVelocityTracker = null; - mLastUpEventTimeMillis = ev.getEventTime(); - break; + } break; } return true; } @@ -891,12 +874,6 @@ 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(); @@ -907,27 +884,75 @@ public class NumberPicker extends LinearLayout { @Override public boolean dispatchKeyEvent(KeyEvent event) { - int keyCode = event.getKeyCode(); - if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER) { - removeAllCallbacks(); + final int keyCode = event.getKeyCode(); + switch (keyCode) { + case KeyEvent.KEYCODE_DPAD_CENTER: + case KeyEvent.KEYCODE_ENTER: + removeAllCallbacks(); + break; } return super.dispatchKeyEvent(event); } @Override public boolean dispatchTrackballEvent(MotionEvent event) { - int action = event.getActionMasked(); - if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) { - removeAllCallbacks(); + final int action = event.getActionMasked(); + switch (action) { + case MotionEvent.ACTION_CANCEL: + case MotionEvent.ACTION_UP: + removeAllCallbacks(); + break; } return super.dispatchTrackballEvent(event); } @Override - public void computeScroll() { - if (mSelectorWheelState == SELECTOR_WHEEL_STATE_NONE) { - return; + 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() { Scroller scroller = mFlingScroller; if (scroller.isFinished()) { scroller = mAdjustScroller; @@ -952,16 +977,17 @@ public class NumberPicker extends LinearLayout { @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); - mIncrementButton.setEnabled(enabled); - mDecrementButton.setEnabled(enabled); + if (!mHasSelectorWheel) { + mIncrementButton.setEnabled(enabled); + } + if (!mHasSelectorWheel) { + 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) { @@ -977,7 +1003,7 @@ public class NumberPicker extends LinearLayout { while (mCurrentScrollOffset - mInitialScrollOffset > mSelectorTextGapHeight) { mCurrentScrollOffset -= mSelectorElementHeight; decrementSelectorIndices(selectorIndices); - changeCurrent(selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX]); + setValueInternal(selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX], true); if (!mWrapSelectorWheel && selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] <= mMinValue) { mCurrentScrollOffset = mInitialScrollOffset; } @@ -985,7 +1011,7 @@ public class NumberPicker extends LinearLayout { while (mCurrentScrollOffset - mInitialScrollOffset < -mSelectorTextGapHeight) { mCurrentScrollOffset += mSelectorElementHeight; incrementSelectorIndices(selectorIndices); - changeCurrent(selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX]); + setValueInternal(selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX], true); if (!mWrapSelectorWheel && selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] >= mMaxValue) { mCurrentScrollOffset = mInitialScrollOffset; } @@ -1024,8 +1050,7 @@ 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) { @@ -1068,26 +1093,35 @@ public class NumberPicker extends LinearLayout { if (mValue == value) { return; } - if (value < mMinValue) { - value = mWrapSelectorWheel ? mMaxValue : mMinValue; - } - if (value > mMaxValue) { - value = mWrapSelectorWheel ? mMinValue : mMaxValue; - } - mValue = value; + setValueInternal(value, false); initializeSelectorWheelIndices(); - updateInputTextView(); - updateIncrementAndDecrementButtonsVisibilityState(); invalidate(); } /** - * Hides the soft input of it is active for the input text. + * 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. */ private void hideSoftInput() { InputMethodManager inputMethodManager = InputMethodManager.peekInstance(); if (inputMethodManager != null && inputMethodManager.isActive(mInputText)) { inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0); + if (mHasSelectorWheel) { + mInputText.setVisibility(View.INVISIBLE); + } } } @@ -1151,23 +1185,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 five (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 {@link #SELECTOR_WHEEL_ITEM_COUNT} + * (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(); } } @@ -1224,6 +1258,7 @@ public class NumberPicker extends LinearLayout { initializeSelectorWheelIndices(); updateInputTextView(); tryComputeMaxWidth(); + invalidate(); } /** @@ -1256,6 +1291,7 @@ public class NumberPicker extends LinearLayout { initializeSelectorWheelIndices(); updateInputTextView(); tryComputeMaxWidth(); + invalidate(); } /** @@ -1299,103 +1335,50 @@ 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 (mSelectorWheelState == SELECTOR_WHEEL_STATE_NONE) { + if (!mHasSelectorWheel) { + super.onDraw(canvas); 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 (only if scrolling and drawable specified) + // draw the selection dividers if (mSelectionDivider != null) { // draw the top divider - int topOfTopDivider = - (getHeight() - mSelectorElementHeight - mSelectionDividerHeight) / 2; + int topOfTopDivider = mTopSelectionDividerTop; int bottomOfTopDivider = topOfTopDivider + mSelectionDividerHeight; mSelectionDivider.setBounds(0, topOfTopDivider, mRight, bottomOfTopDivider); mSelectionDivider.draw(canvas); // draw the bottom divider - int topOfBottomDivider = topOfTopDivider + mSelectorElementHeight; - int bottomOfBottomDivider = bottomOfTopDivider + mSelectorElementHeight; + int bottomOfBottomDivider = mBottomSelectionDividerBottom; + int topOfBottomDivider = bottomOfBottomDivider - mSelectionDividerHeight; mSelectionDivider.setBounds(0, topOfBottomDivider, mRight, bottomOfBottomDivider); mSelectionDivider.draw(canvas); } - - canvas.restoreToCount(restoreCount); } @Override @@ -1408,12 +1391,20 @@ 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 void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { - super.onInitializeAccessibilityNodeInfo(info); - info.setClassName(NumberPicker.class.getName()); + public AccessibilityNodeProvider getAccessibilityNodeProvider() { + if (!mHasSelectorWheel) { + return super.getAccessibilityNodeProvider(); + } + if (mAccessibilityNodeProvider == null) { + mAccessibilityNodeProvider = new AccessibilityNodeProviderImpl(); + } + return mAccessibilityNodeProvider; } /** @@ -1442,17 +1433,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); @@ -1462,8 +1453,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(); @@ -1480,39 +1471,44 @@ public class NumberPicker extends LinearLayout { } /** - * 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 + * Sets the current value of this NumberPicker. * - * @param current the new value of the NumberPicker + * @param current The new value of the NumberPicker. + * @param notifyChange Whether to notify if the current value changed. */ - private void changeCurrent(int current) { + private void setValueInternal(int current, boolean notifyChange) { 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; - setValue(current); - notifyChange(previous, current); + mValue = current; + updateInputTextView(); + if (notifyChange) { + 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 changeCurrentByOne(boolean increment) { - if (mFlingable) { - mDimSelectorWheelAnimator.cancel(); + private void changeValueByOne(boolean increment) { + if (mHasSelectorWheel) { mInputText.setVisibility(View.INVISIBLE); - mSelectorWheelPaint.setAlpha(SELECTOR_WHEEL_BRIGHT_ALPHA); + if (!moveToFinalScrollerPosition(mFlingScroller)) { + moveToFinalScrollerPosition(mAdjustScroller); + } mPreviousScrollerY = 0; - forceCompleteChangeCurrentByOneViaScroll(); if (increment) { mFlingScroller.startScroll(0, 0, 0, -mSelectorElementHeight, CHANGE_CURRENT_BY_ONE_SCROLL_DURATION); @@ -1523,81 +1519,26 @@ public class NumberPicker extends LinearLayout { invalidate(); } else { if (increment) { - changeCurrent(mValue + 1); + setValueInternal(mValue + 1, true); } else { - changeCurrent(mValue - 1); + setValueInternal(mValue - 1, true); } } } - /** - * 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 - 1; + float textGapCount = selectorIndices.length; 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(); } @@ -1612,16 +1553,14 @@ public class NumberPicker extends LinearLayout { */ private void onScrollerFinished(Scroller scroller) { if (scroller == mFlingScroller) { - if (mSelectorWheelState == SELECTOR_WHEEL_STATE_LARGE) { - postAdjustScrollerCommand(0); - onScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); - } else { + if (!ensureScrollWheelAdjusted()) { updateInputTextView(); - fadeSelectorWheel(mShowInputControlsAnimimationDuration); } + onScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); } else { - updateInputTextView(); - showInputControls(mShowInputControlsAnimimationDuration); + if (mScrollState != OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) { + updateInputTextView(); + } } } @@ -1653,56 +1592,6 @@ 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. */ @@ -1749,8 +1638,7 @@ 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; @@ -1783,7 +1671,7 @@ public class NumberPicker extends LinearLayout { } else { // Check the new value and ensure it's in range int current = getSelectedPos(str.toString()); - changeCurrent(current); + setValueInternal(current, true); } } @@ -1792,25 +1680,23 @@ 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 void updateInputTextView() { + private boolean 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. */ - if (mDisplayedValues == null) { - mInputText.setText(formatNumber(mValue)); - } else { - mInputText.setText(mDisplayedValues[mValue - mMinValue]); + String text = (mDisplayedValues == null) ? formatNumber(mValue) + : mDisplayedValues[mValue - mMinValue]; + if (!TextUtils.isEmpty(text) && !text.equals(mInputText.getText().toString())) { + mInputText.setText(text); + return true; } - mInputText.setSelection(mInputText.getText().length()); - if (mFlingable && AccessibilityManager.getInstance(mContext).isEnabled()) { - String text = mContext.getString(R.string.number_picker_increment_scroll_mode, - mInputText.getText()); - mInputText.setContentDescription(text); - } + return false; } /** @@ -1828,14 +1714,45 @@ public class NumberPicker extends LinearLayout { * * @param increment Whether to increment or decrement the value. */ - private void postChangeCurrentByOneFromLongPress(boolean increment) { - mInputText.clearFocus(); - removeAllCallbacks(); + private void postChangeCurrentByOneFromLongPress(boolean increment, long delayMillis) { 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); } /** @@ -1845,12 +1762,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); + } } /** @@ -1888,8 +1805,7 @@ 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) { @@ -1902,20 +1818,6 @@ 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. @@ -1934,8 +1836,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) { @@ -1980,6 +1882,27 @@ 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. */ @@ -1993,40 +1916,19 @@ 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 setIncrement(boolean increment) { + private void setStep(boolean increment) { mIncrement = increment; } + @Override public void run() { - changeCurrentByOne(mIncrement); + changeValueByOne(mIncrement); postDelayed(this, mLongPressUpdateInterval); } } @@ -2048,4 +1950,248 @@ 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 7eff1aa04bd23..bc88b622eaf4a 100644 --- a/core/java/android/widget/TimePicker.java +++ b/core/java/android/widget/TimePicker.java @@ -532,21 +532,28 @@ public class TimePicker extends FrameLayout { private void setContentDescriptions() { // Minute - 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); + trySetContentDescription(mMinuteSpinner, R.id.increment, + R.string.time_picker_increment_minute_button); + trySetContentDescription(mMinuteSpinner, R.id.decrement, + R.string.time_picker_decrement_minute_button); // Hour - 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); + trySetContentDescription(mHourSpinner, R.id.increment, + R.string.time_picker_increment_hour_button); + trySetContentDescription(mHourSpinner, R.id.decrement, + R.string.time_picker_decrement_hour_button); // AM/PM if (mAmPmSpinner != null) { - 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); + 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)); } } 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 deleted file mode 100644 index 9584649d7d4028d52fe5d37e18c1fd75abf02c1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index 5c37873b68aa4d8af7a3dedbbd4075728a548cde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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` 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 deleted file mode 100644 index 041412b100d2379341cd13fdb6f603261d33eef9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index 5717beebcf23f0711a95cc82821f9abea5635e33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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}` 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 deleted file mode 100644 index e874330d386891255dcd11207e99e4cd768d7165..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index 96a6c8a2dd916dbf2631c2b9d51c1503afb7a8ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index 96a6c8a2dd916dbf2631c2b9d51c1503afb7a8ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index 4631d85cf15ee95278ce6c7c61af6b91dd834d4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index 9c23a18ed917932c9e11ed8accae931983af2676..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index e5f04309615c24236751e3a8d45c86df6c0306b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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)<= 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 deleted file mode 100644 index b06017e0f8b6f99540559e8c87c255e924cbaec5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index b3d6706a408c2ddb10aedcafb2f35265264304d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index b3d6706a408c2ddb10aedcafb2f35265264304d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index 9ee35c7db9d8151f6d6dadb4f066337660d7aa5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index 358a13fca7aca7eb52c845029facdd1d71bb7397..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index 358a13fca7aca7eb52c845029facdd1d71bb7397..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index 50f6e98accd90e2e2e0dbe2ba6f7cde1631537c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index 67434f6277c5b37ed18ef1535f6a25d9803951dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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? 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 deleted file mode 100644 index 9c2b8338386559af0fea80a1f7d83ce07a5e7a1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index dcf2fb7cf71bc2e6a2901d10468ee96408711660..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index b63c510dcde0bf375f86dd96ac766eabf1fb34e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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!+ 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 deleted file mode 100644 index 48e300c26472c597cca10728fabba7f03611805c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index 48e300c26472c597cca10728fabba7f03611805c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index 1558d3d95893da8a18ad799fbcee8986026768db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index 6b6e7e1f50ee59199545df084760455a6e8bb131..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index eb16f8dde140bb5fa51b7060a7c13aa02f6806cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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; 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 deleted file mode 100644 index eb16f8dde140bb5fa51b7060a7c13aa02f6806cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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; 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 deleted file mode 100644 index 58a3b64322accdf7c23abfd4e4cc1d5ccfcb185a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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| 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 deleted file mode 100644 index 382943b08ac7d2da3d63becbef167d95fa325cdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index cf856a19261b00607c083d262bd1556aa96be77c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index 6665953aeb3d10873facfcc92b72315cd1a24135..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index d63d797e51a2e678aea85ccd9890e40dc102c37f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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~) 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 deleted file mode 100644 index 22b6dbd4d0af57a82f10db0b8eac7cf14be9b82c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index 4bcce9871f23bea28cf959137f16c99e8fc7a9db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index d841f5a6c555a635ba5e2f40b429acfd9f435903..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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!{ 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 deleted file mode 100644 index bc5e3faef985d7c948565889bd258a3437bd88a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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@^ 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 deleted file mode 100644 index bc5e3faef985d7c948565889bd258a3437bd88a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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@^ 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 deleted file mode 100644 index 111f57eb772dc01482f75aaf519b8f16e3c6fd8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index d0ef05b8a5d2477fa29229564b3af47f9365b3ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index ff2194168af6b7a0000550bd820c96c78faa6291..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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!}( 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 deleted file mode 100644 index 0462fca4890259c9a01804468b499a6615a54ff6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index a488e8e6b62e608ebb8895b53b27c2eb6bcfc139..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index f61b076519142db5604b48f0b5e268bf1b9c2059..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index f61b076519142db5604b48f0b5e268bf1b9c2059..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index 211944e53f7a6ece25d283007efa59d147339929..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index 12bc11ae0ca707e030a0c0bef100794391892f6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index 635184cec76e96006ad7b0bfd26156f638115a1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index 16df74df151afb4392a7d83bb2dfcf7cc4596dab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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@+ 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 deleted file mode 100644 index d8f459a70fe65311436dcdc08aec2fe78a3dfe80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index 08bf2411a2b4be85094e06c3994a3f4809e8d9dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index f4f73317b3fb98a288945e030c3f08124bed2f1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index 78085d3d11d59ffc4a87ad98d16edde108b54306..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index b8f68499dbac38fe69416ca88ec2afadd895b230..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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! 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 deleted file mode 100644 index b8f68499dbac38fe69416ca88ec2afadd895b230..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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! diff --git a/core/res/res/drawable/numberpicker_down_btn_holo_dark.xml b/core/res/res/drawable/numberpicker_down_btn_holo_dark.xml deleted file mode 100644 index dd6332db56856..0000000000000 --- a/core/res/res/drawable/numberpicker_down_btn_holo_dark.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/core/res/res/drawable/numberpicker_down_btn_holo_light.xml b/core/res/res/drawable/numberpicker_down_btn_holo_light.xml deleted file mode 100644 index 565fd868bfb27..0000000000000 --- a/core/res/res/drawable/numberpicker_down_btn_holo_light.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/core/res/res/drawable/numberpicker_up_btn_holo_dark.xml b/core/res/res/drawable/numberpicker_up_btn_holo_dark.xml deleted file mode 100644 index 7af3ee42df3c7..0000000000000 --- a/core/res/res/drawable/numberpicker_up_btn_holo_dark.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/core/res/res/drawable/numberpicker_up_btn_holo_light.xml b/core/res/res/drawable/numberpicker_up_btn_holo_light.xml deleted file mode 100644 index cbcbb07704ee5..0000000000000 --- a/core/res/res/drawable/numberpicker_up_btn_holo_light.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/core/res/res/layout/number_picker.xml b/core/res/res/layout/number_picker.xml index 2967696d56aee..b7e7ae1467303 100644 --- a/core/res/res/layout/number_picker.xml +++ b/core/res/res/layout/number_picker.xml @@ -22,19 +22,26 @@ - + android:textAppearance="@style/TextAppearance.Large.Inverse.NumberPickerInputText" + android:gravity="center" + android:singleLine="true" + android:background="@drawable/numberpicker_input" /> diff --git a/core/res/res/layout/number_picker_with_selector_wheel.xml b/core/res/res/layout/number_picker_with_selector_wheel.xml new file mode 100644 index 0000000000000..c8fa0f7b21801 --- /dev/null +++ b/core/res/res/layout/number_picker_with_selector_wheel.xml @@ -0,0 +1,31 @@ + + + + + + + + diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index db908ca20b478..428790f6b7343 100755 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -589,12 +589,6 @@ - - - - - - @@ -3617,12 +3611,12 @@ - - + + @@ -3631,6 +3625,10 @@ + + + + diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 7137b7c0dc926..660f53a9fdeb9 100755 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -3170,8 +3170,6 @@ 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 a51f3f946e762..288b8b2a1f57f 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. - - - - - - - - - - - - @@ -2109,17 +2067,6 @@ 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 64198728515ff..330e68c0e462d 100644 --- a/core/res/res/values/styles_device_defaults.xml +++ b/core/res/res/values/styles_device_defaults.xml @@ -199,9 +199,6 @@ easier. - - - - - -