From 5c33949d0272c4dfc313cf8b56d28597e2ec2c62 Mon Sep 17 00:00:00 2001 From: Alan Viverette Date: Tue, 28 Apr 2015 14:07:36 -0700 Subject: [PATCH] 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 --- .../android/widget/DayPickerPagerAdapter.java | 6 +-- core/java/android/widget/DayPickerView.java | 20 +++----- core/java/android/widget/SimpleMonthView.java | 49 ++++++++++++------- ..._text_inverse_when_activated_material.xml} | 19 +++++-- ...secondary_text_activated_material_dark.xml | 21 -------- ...econdary_text_activated_material_light.xml | 21 -------- ..._text_inverse_when_activated_material.xml} | 19 +++++-- core/res/res/values/themes_material.xml | 12 ++--- 8 files changed, 75 insertions(+), 92 deletions(-) rename core/res/res/color/{primary_text_activated_material_dark.xml => primary_text_inverse_when_activated_material.xml} (55%) delete mode 100644 core/res/res/color/secondary_text_activated_material_dark.xml delete mode 100644 core/res/res/color/secondary_text_activated_material_light.xml rename core/res/res/color/{primary_text_activated_material_light.xml => secondary_text_inverse_when_activated_material.xml} (55%) diff --git a/core/java/android/widget/DayPickerPagerAdapter.java b/core/java/android/widget/DayPickerPagerAdapter.java index 478fa00d46070..d271af28b0379 100644 --- a/core/java/android/widget/DayPickerPagerAdapter.java +++ b/core/java/android/widget/DayPickerPagerAdapter.java @@ -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) { diff --git a/core/java/android/widget/DayPickerView.java b/core/java/android/widget/DayPickerView.java index 113e597bedfdc..334afab6edd3e 100644 --- a/core/java/android/widget/DayPickerView.java +++ b/core/java/android/widget/DayPickerView.java @@ -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); } }; diff --git a/core/java/android/widget/SimpleMonthView.java b/core/java/android/widget/SimpleMonthView.java index 2778f0f9df7db..acf1df9317981 100644 --- a/core/java/android/widget/SimpleMonthView.java +++ b/core/java/android/widget/SimpleMonthView.java @@ -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; - // Adjust the circle to be centered on the row. - canvas.drawCircle(colCenterRtl, rowCenter, mDaySelectorRadius, mDayHighlightPaint); + if (isDayEnabled) { + // Adjust the circle to be centered on the row. + 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); - node.addAction(AccessibilityAction.ACTION_CLICK); + + 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); } diff --git a/core/res/res/color/primary_text_activated_material_dark.xml b/core/res/res/color/primary_text_inverse_when_activated_material.xml similarity index 55% rename from core/res/res/color/primary_text_activated_material_dark.xml rename to core/res/res/color/primary_text_inverse_when_activated_material.xml index f1b742ac48347..0f7f9cdf9bef9 100644 --- a/core/res/res/color/primary_text_activated_material_dark.xml +++ b/core/res/res/color/primary_text_inverse_when_activated_material.xml @@ -1,5 +1,5 @@ - - - + + + + diff --git a/core/res/res/color/secondary_text_activated_material_dark.xml b/core/res/res/color/secondary_text_activated_material_dark.xml deleted file mode 100644 index 7a8428a03d8a4..0000000000000 --- a/core/res/res/color/secondary_text_activated_material_dark.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - diff --git a/core/res/res/color/secondary_text_activated_material_light.xml b/core/res/res/color/secondary_text_activated_material_light.xml deleted file mode 100644 index 36ff408a79ac4..0000000000000 --- a/core/res/res/color/secondary_text_activated_material_light.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - diff --git a/core/res/res/color/primary_text_activated_material_light.xml b/core/res/res/color/secondary_text_inverse_when_activated_material.xml similarity index 55% rename from core/res/res/color/primary_text_activated_material_light.xml rename to core/res/res/color/secondary_text_inverse_when_activated_material.xml index d92da631c9376..5b259de560f14 100644 --- a/core/res/res/color/primary_text_activated_material_light.xml +++ b/core/res/res/color/secondary_text_inverse_when_activated_material.xml @@ -1,5 +1,5 @@ - - - + + + + diff --git a/core/res/res/values/themes_material.xml b/core/res/res/values/themes_material.xml index b0f673c7e631a..0f81424f23209 100644 --- a/core/res/res/values/themes_material.xml +++ b/core/res/res/values/themes_material.xml @@ -56,11 +56,11 @@ please see themes_device_defaults.xml. @color/primary_text_material_dark @color/primary_text_material_light - @color/primary_text_activated_material_dark + @color/primary_text_inverse_when_activated_material @color/primary_text_disable_only_material_dark @color/secondary_text_material_dark @color/secondary_text_material_light - @color/secondary_text_activated_material_dark + @color/secondary_text_inverse_when_activated_material @color/secondary_text_material_dark @color/secondary_text_material_light @color/hint_foreground_material_dark @@ -410,10 +410,10 @@ please see themes_device_defaults.xml. @color/primary_text_material_light @color/primary_text_material_dark - @color/primary_text_activated_material_light + @color/primary_text_inverse_when_activated_material @color/secondary_text_material_light @color/secondary_text_material_dark - @color/secondary_text_activated_material_light + @color/secondary_text_inverse_when_activated_material @color/secondary_text_material_light @color/secondary_text_material_dark @color/primary_text_disable_only_material_light @@ -777,10 +777,8 @@ please see themes_device_defaults.xml. @color/primary_text_material_light @color/primary_text_material_dark - @color/primary_text_activated_material_light @color/secondary_text_material_light @color/secondary_text_material_dark - @color/secondary_text_activated_material_light @color/secondary_text_material_light @color/secondary_text_material_dark @color/primary_text_disable_only_material_light @@ -814,11 +812,9 @@ please see themes_device_defaults.xml. @color/primary_text_material_dark @color/primary_text_material_light - @color/primary_text_activated_material_dark @color/primary_text_disable_only_material_dark @color/secondary_text_material_dark @color/secondary_text_material_light - @color/secondary_text_activated_material_dark @color/secondary_text_material_dark @color/secondary_text_material_light @color/hint_foreground_material_dark