From cf5a420ead56916cb3e8886574e1447cf17c8e19 Mon Sep 17 00:00:00 2001 From: Andrei Stingaceanu Date: Tue, 6 Jun 2017 17:30:45 +0100 Subject: [PATCH] Fix unexpected DatePicker validation Remove throwing an error and instead clamp the selected date to min/max when changing ranges. Bug: 36636681 Test: manually verified that the case in the bug does not happen again Change-Id: If540f58d21375d2320df5215504d4569e5c2be2e --- core/java/android/widget/DayPickerView.java | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/core/java/android/widget/DayPickerView.java b/core/java/android/widget/DayPickerView.java index cfd1445ea3f85..1e8207a2e7b33 100644 --- a/core/java/android/widget/DayPickerView.java +++ b/core/java/android/widget/DayPickerView.java @@ -16,8 +16,6 @@ package android.widget; -import static android.os.Build.VERSION_CODES.O; - import android.annotation.Nullable; import android.content.Context; import android.content.res.ColorStateList; @@ -293,22 +291,10 @@ class DayPickerView extends ViewGroup { * @param timeInMillis the target day in milliseconds * @param animate whether to smooth scroll to the new position * @param setSelected whether to set the specified day as selected - * - * @throws IllegalArgumentException if the build version is greater than - * {@link android.os.Build.VERSION_CODES#N_MR1} and the provided timeInMillis is before - * the range start or after the range end. */ private void setDate(long timeInMillis, boolean animate, boolean setSelected) { getTempCalendarForTime(timeInMillis); - final int targetSdkVersion = mContext.getApplicationInfo().targetSdkVersion; - if (targetSdkVersion >= O) { - if (mTempCalendar.before(mMinDate) || mTempCalendar.after(mMaxDate)) { - throw new IllegalArgumentException("timeInMillis must be between the values of " - + "getMinDate() and getMaxDate()"); - } - } - if (setSelected) { mSelectedDay.setTimeInMillis(timeInMillis); } @@ -367,6 +353,13 @@ class DayPickerView extends ViewGroup { public void onRangeChanged() { mAdapter.setRange(mMinDate, mMaxDate); + // Clamp the selected day to the new min/max. + if (mSelectedDay.before(mMinDate)) { + mSelectedDay.setTimeInMillis(mMinDate.getTimeInMillis()); + } else if (mSelectedDay.after(mMaxDate)) { + mSelectedDay.setTimeInMillis(mMaxDate.getTimeInMillis()); + } + // Changing the min/max date changes the selection position since we // don't really have stable IDs. Jumps immediately to the new position. setDate(mSelectedDay.getTimeInMillis(), false, false);