Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e0c8ab5a authored by Svetoslav Ganov's avatar Svetoslav Ganov
Browse files

NumberPicker does not not fit on Crespo in landscape.

1. Now the NumberPicker has a max height and width for which is looks
   good but can still shrink if there is not enough available space.

bug:5512787

Change-Id: Ieea88cafa8408e1d4160bab4bfe2b771bd79f7f8
parent 1bfe6e95
Loading
Loading
Loading
Loading
+98 −15
Original line number Diff line number Diff line
@@ -202,6 +202,16 @@ public class NumberPicker extends LinearLayout {
     */
    private final EditText mInputText;

    /**
     * The max height of this widget.
     */
    private final int mMaxHeight;

    /**
     * The max width of this widget.
     */
    private final int mMaxWidth;

    /**
     * The height of the text.
     */
@@ -517,6 +527,8 @@ public class NumberPicker extends LinearLayout {
                getResources().getDisplayMetrics());
        mSelectionDividerHeight = attributesArray.getDimensionPixelSize(
                R.styleable.NumberPicker_selectionDividerHeight, defSelectionDividerHeight);
        mMaxHeight = attributesArray.getDimensionPixelSize(R.styleable.NumberPicker_maxHeight, 0);
        mMaxWidth = attributesArray.getDimensionPixelSize(R.styleable.NumberPicker_maxWidth, 0);
        attributesArray.recycle();

        mShowInputControlsAnimimationDuration = getResources().getInteger(
@@ -665,7 +677,38 @@ public class NumberPicker extends LinearLayout {

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        if (mMaxHeight <= 0 && mMaxWidth <= 0) {
            super.onLayout(changed, left, top, right, bottom);
        } else {
            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();
            final int inptTxtLeft = (msrdWdth - inptTxtMsrdWdth) / 2;
            final int inptTxtTop = (msrdHght - inptTxtMsrdHght) / 2;
            final int inptTxtRight = inptTxtLeft + inptTxtMsrdWdth;
            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;
            // need to do all this when we know our size
@@ -674,6 +717,24 @@ public class NumberPicker extends LinearLayout {
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        final int measuredWidth;
        if (mMaxWidth > 0) {
            measuredWidth = getMaxSize(widthMeasureSpec, mMaxWidth);
        } else {
            measuredWidth = getMeasuredWidth();
        }
        final int measuredHeight;
        if (mMaxHeight > 0) {
            measuredHeight = getMaxSize(heightMeasureSpec, mMaxHeight);
        } else {
            measuredHeight = getMeasuredHeight();
        }
        setMeasuredDimension(measuredWidth, measuredHeight);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        if (!isEnabled() || !mFlingable) {
@@ -700,17 +761,14 @@ public class NumberPicker extends LinearLayout {
                    hideInputControls();
                    return true;
                }
                if (isEventInViewHitRect(event, mInputText)
                        || (!mIncrementButton.isShown()
                                && isEventInViewHitRect(event, mIncrementButton))
                        || (!mDecrementButton.isShown()
                                && isEventInViewHitRect(event, mDecrementButton))) {
                if (isEventInVisibleViewHitRect(event, mIncrementButton)
                        || isEventInVisibleViewHitRect(event, mDecrementButton)) {
                    return false;
                }
                mAdjustScrollerOnUpEvent = false;
                setSelectorWheelState(SELECTOR_WHEEL_STATE_LARGE);
                hideInputControls();
                return true;
                }
                break;
            case MotionEvent.ACTION_MOVE:
                float currentMoveY = event.getY();
                int deltaDownY = (int) Math.abs(currentMoveY - mLastDownEventY);
@@ -1239,6 +1297,28 @@ public class NumberPicker extends LinearLayout {
        // perceive this widget as several controls rather as a whole.
    }

    /**
     * Gets the max value for a size based on the measure spec passed by
     * the parent and the max value for that size.
     *
     * @param measureSpec The measure spec.
     * @param maxValue The max value for the size.
     * @return The max size.
     */
    private int getMaxSize(int measureSpec, int maxValue) {
        final int mode = MeasureSpec.getMode(measureSpec);
        switch (mode) {
            case MeasureSpec.EXACTLY:
                return MeasureSpec.getSize(measureSpec);
            case MeasureSpec.AT_MOST:
                return Math.min(MeasureSpec.getSize(measureSpec), maxValue);
            case MeasureSpec.UNSPECIFIED:
                return maxValue;
            default:
                throw new IllegalArgumentException();
        }
    }

    /**
     * Resets the selector indices and clear the cached
     * string representation of these indices.
@@ -1335,12 +1415,15 @@ public class NumberPicker extends LinearLayout {
    }

    /**
     * @return If the <code>event</code> is in the <code>view</code>.
     * @return If the <code>event</code> is in the visible <code>view</code>.
     */
    private boolean isEventInViewHitRect(MotionEvent event, View 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 <code>selectorWheelState</code>.
+4 −0
Original line number Diff line number Diff line
@@ -3572,6 +3572,10 @@
        <attr name="selectionDivider" format="reference" />
        <!-- @hide The height of the selection divider. -->
        <attr name="selectionDividerHeight" format="dimension" />
        <!-- @hide The max height of the NumberPicker. -->
        <attr name="maxHeight" />
        <!-- @hide The max width of the NumberPicker. -->
        <attr name="maxWidth" />
    </declare-styleable>

    <declare-styleable name="TimePicker">
+4 −2
Original line number Diff line number Diff line
@@ -1646,6 +1646,8 @@ please see styles_device_defaults.xml.
        <item name="android:flingable">true</item>
        <item name="android:selectionDivider">@android:drawable/numberpicker_selection_divider</item>
        <item name="android:selectionDividerHeight">2dip</item>
        <item name="android:maxHeight">180dip</item>
        <item name="android:maxWidth">56dip</item>
    </style>

    <style name="Widget.Holo.TimePicker" parent="Widget.TimePicker">
@@ -1661,13 +1663,13 @@ please see styles_device_defaults.xml.
        <item name="android:background">@null</item>
        <item name="android:src">@android:drawable/numberpicker_up_btn_holo_dark</item>
        <item name="android:paddingTop">16dip</item>
        <item name="android:paddingBottom">36dip</item>
        <item name="android:paddingBottom">22dip</item>
    </style>

    <style name="Widget.Holo.ImageButton.NumberPickerDownButton">
        <item name="android:background">@null</item>
        <item name="android:src">@android:drawable/numberpicker_down_btn_holo_dark</item>
        <item name="android:paddingTop">36dip</item>
        <item name="android:paddingTop">22dip</item>
        <item name="android:paddingBottom">16dip</item>
    </style>