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

Commit cf5a420e authored by Andrei Stingaceanu's avatar Andrei Stingaceanu
Browse files

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
parent 1ac325e4
Loading
Loading
Loading
Loading
+7 −14
Original line number Diff line number Diff line
@@ -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);