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

Commit 5c33949d authored by Alan Viverette's avatar Alan Viverette
Browse files

Fix DatePicker max date, disabled day color, and arrow visibility

Day validation moved from the PagerAdapter to the DayPickerView,
which is widget that actually handles the touch interaction and
disabled state for individual days.

Fixed disabled states for primary and secondary activated text
colors. Replaced old light/dark color state lists with themed
versions.

Removed conflicting view visibility changes for managing next and
previous arrows in DayPickerView.

Bug: 20630417
Bug: 20641013
Bug: 20641879
Change-Id: Icdaf02a3b57ec162169c31b8a27ebea908552321
parent e658285b
Loading
Loading
Loading
Loading
+1 −5
Original line number Diff line number Diff line
@@ -286,14 +286,10 @@ class DayPickerPagerAdapter extends PagerAdapter {
        return null;
    }

    private boolean isCalendarInRange(Calendar value) {
        return value.compareTo(mMinDate) >= 0 && value.compareTo(mMaxDate) <= 0;
    }

    private final OnDayClickListener mOnDayClickListener = new OnDayClickListener() {
        @Override
        public void onDayClick(SimpleMonthView view, Calendar day) {
            if (day != null && isCalendarInRange(day)) {
            if (day != null) {
                setSelectedDay(day);

                if (mOnDaySelectedListener != null) {
+8 −12
Original line number Diff line number Diff line
@@ -178,6 +178,13 @@ class DayPickerView extends ViewGroup {
        });
    }

    private void updateButtonVisibility(int position) {
        final boolean hasPrev = position > 0;
        final boolean hasNext = position < (mAdapter.getCount() - 1);
        mPrevButton.setVisibility(hasPrev ? View.VISIBLE : View.INVISIBLE);
        mNextButton.setVisibility(hasNext ? View.VISIBLE : View.INVISIBLE);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        final ViewPager viewPager = mViewPager;
@@ -218,12 +225,6 @@ class DayPickerView extends ViewGroup {
        final int height = bottom - top;
        mViewPager.layout(0, 0, width, height);

        if (mViewPager.getChildCount() < 1) {
            leftButton.setVisibility(View.INVISIBLE);
            rightButton.setVisibility(View.INVISIBLE);
            return;
        }

        final SimpleMonthView monthView = (SimpleMonthView) mViewPager.getChildAt(0);
        final int monthHeight = monthView.getMonthHeight();
        final int cellWidth = monthView.getCellWidth();
@@ -235,7 +236,6 @@ class DayPickerView extends ViewGroup {
        final int leftIconTop = monthView.getPaddingTop() + (monthHeight - leftDH) / 2;
        final int leftIconLeft = monthView.getPaddingLeft() + (cellWidth - leftDW) / 2;
        leftButton.layout(leftIconLeft, leftIconTop, leftIconLeft + leftDW, leftIconTop + leftDH);
        leftButton.setVisibility(View.VISIBLE);

        final int rightDW = rightButton.getMeasuredWidth();
        final int rightDH = rightButton.getMeasuredHeight();
@@ -243,7 +243,6 @@ class DayPickerView extends ViewGroup {
        final int rightIconRight = width - monthView.getPaddingRight() - (cellWidth - rightDW) / 2;
        rightButton.layout(rightIconRight - rightDW, rightIconTop,
                rightIconRight, rightIconTop + rightDH);
        rightButton.setVisibility(View.VISIBLE);
    }

    public void setDayOfWeekTextAppearance(int resId) {
@@ -399,10 +398,7 @@ class DayPickerView extends ViewGroup {

        @Override
        public void onPageSelected(int position) {
            mPrevButton.setVisibility(
                    position > 0 ? View.VISIBLE : View.INVISIBLE);
            mNextButton.setVisibility(
                    position < (mAdapter.getCount() - 1) ? View.VISIBLE : View.INVISIBLE);
            updateButtonVisibility(position);
        }
    };

+32 −17
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import android.text.TextPaint;
import android.text.format.DateFormat;
import android.util.AttributeSet;
import android.util.IntArray;
import android.util.MathUtils;
import android.util.StateSet;
import android.view.MotionEvent;
import android.view.View;
@@ -422,7 +423,8 @@ class SimpleMonthView extends View {

            int stateMask = 0;

            if (day >= mEnabledDayStart && day <= mEnabledDayEnd) {
            final boolean isDayEnabled = isDayEnabled(day);
            if (isDayEnabled) {
                stateMask |= StateSet.VIEW_STATE_ENABLED;
            }

@@ -435,8 +437,11 @@ class SimpleMonthView extends View {
            } else if (mTouchedItem == day) {
                stateMask |= StateSet.VIEW_STATE_PRESSED;

                if (isDayEnabled) {
                    // Adjust the circle to be centered on the row.
                canvas.drawCircle(colCenterRtl, rowCenter, mDaySelectorRadius, mDayHighlightPaint);
                    canvas.drawCircle(colCenterRtl, rowCenter,
                            mDaySelectorRadius, mDayHighlightPaint);
                }
            }

            final boolean isDayToday = mToday == day;
@@ -460,6 +465,14 @@ class SimpleMonthView extends View {
        }
    }

    private boolean isDayEnabled(int day) {
        return day >= mEnabledDayStart && day <= mEnabledDayEnd;
    }

    private boolean isValidDayOfMonth(int day) {
        return day >= 1 && day <= mDaysInMonth;
    }

    private static boolean isValidDayOfWeek(int day) {
        return day >= Calendar.SUNDAY && day <= Calendar.SATURDAY;
    }
@@ -536,13 +549,6 @@ class SimpleMonthView extends View {
            mWeekStart = mCalendar.getFirstDayOfWeek();
        }

        if (enabledDayStart > 0 && enabledDayEnd < 32) {
            mEnabledDayStart = enabledDayStart;
        }
        if (enabledDayEnd > 0 && enabledDayEnd < 32 && enabledDayEnd >= enabledDayStart) {
            mEnabledDayEnd = enabledDayEnd;
        }

        // Figure out what day today is.
        final Calendar today = Calendar.getInstance();
        mToday = -1;
@@ -554,6 +560,9 @@ class SimpleMonthView extends View {
            }
        }

        mEnabledDayStart = MathUtils.constrain(enabledDayStart, 1, mDaysInMonth);
        mEnabledDayEnd = MathUtils.constrain(enabledDayEnd, mEnabledDayStart, mDaysInMonth);

        // Invalidate the old title.
        mTitle = null;

@@ -694,7 +703,7 @@ class SimpleMonthView extends View {
        final int col = (paddedXRtl * DAYS_IN_WEEK) / mPaddedWidth;
        final int index = col + row * DAYS_IN_WEEK;
        final int day = index + 1 - findDayOffset();
        if (day < 1 || day > mDaysInMonth) {
        if (!isValidDayOfMonth(day)) {
            return -1;
        }

@@ -708,7 +717,7 @@ class SimpleMonthView extends View {
     * @param outBounds the rect to populate with bounds
     */
    private boolean getBoundsForDay(int id, Rect outBounds) {
        if (id < 1 || id > mDaysInMonth) {
        if (!isValidDayOfMonth(id)) {
            return false;
        }

@@ -742,7 +751,7 @@ class SimpleMonthView extends View {
     * @param day the day that was clicked
     */
    private boolean onDayClicked(int day) {
        if (day < 0 || day > mDaysInMonth) {
        if (!isValidDayOfMonth(day) || !isDayEnabled(day)) {
            return false;
        }

@@ -774,7 +783,7 @@ class SimpleMonthView extends View {
        @Override
        protected int getVirtualViewAt(float x, float y) {
            final int day = getDayAtLocation((int) (x + 0.5f), (int) (y + 0.5f));
            if (day >= 0) {
            if (day != -1) {
                return day;
            }
            return ExploreByTouchHelper.INVALID_ID;
@@ -808,7 +817,13 @@ class SimpleMonthView extends View {
            node.setText(getDayText(virtualViewId));
            node.setContentDescription(getDayDescription(virtualViewId));
            node.setBoundsInParent(mTempRect);

            final boolean isDayEnabled = isDayEnabled(virtualViewId);
            if (isDayEnabled) {
                node.addAction(AccessibilityAction.ACTION_CLICK);
            }

            node.setEnabled(isDayEnabled);

            if (virtualViewId == mActivatedDay) {
                // TODO: This should use activated once that's supported.
@@ -835,7 +850,7 @@ class SimpleMonthView extends View {
         * @return a description of the virtual view
         */
        private CharSequence getDayDescription(int id) {
            if (id >= 1 && id <= mDaysInMonth) {
            if (isValidDayOfMonth(id)) {
                mTempCalendar.set(mYear, mMonth, id);
                return DateFormat.format(DATE_FORMAT, mTempCalendar.getTimeInMillis());
            }
@@ -850,7 +865,7 @@ class SimpleMonthView extends View {
         * @return the visible text of the virtual view
         */
        private CharSequence getDayText(int id) {
            if (id >= 1 && id <= mDaysInMonth) {
            if (isValidDayOfMonth(id)) {
                return Integer.toString(id);
            }

+15 −4
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2014 The Android Open Source Project
<!-- Copyright (C) 2015 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
@@ -15,7 +15,18 @@
-->

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_activated="true"
          android:color="@color/primary_text_default_material_light"/>
    <item android:color="@color/primary_text_default_material_dark"/>
    <item
        android:state_enabled="false"
        android:state_activated="true"
        android:color="?attr/textColorPrimaryInverse"
        android:alpha="?attr/disabledAlpha" />
    <item
        android:state_enabled="false"
        android:color="?attr/textColorPrimary"
        android:alpha="?attr/disabledAlpha" />
    <item
        android:state_activated="true"
        android:color="?attr/textColorPrimaryInverse" />
    <item
        android:color="?attr/textColorPrimary" />
</selector>
+0 −21
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2014 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_activated="true"
          android:color="@color/secondary_text_default_material_light"/>
    <item android:color="@color/secondary_text_default_material_dark"/>
</selector>
Loading