Merge "Fix unexpected DatePicker validation" into oc-dev
diff --git a/core/java/android/widget/DayPickerView.java b/core/java/android/widget/DayPickerView.java
index cfd1445..1e8207a 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 @@
      * @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 @@
     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);