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

Commit 5a01fcd1 authored by Alan Viverette's avatar Alan Viverette Committed by android-build-merger
Browse files

Merge "Fix min/max date range in DatePicker calendar mode" into lmp-mr1-dev

automerge: 38475523

* commit '38475523':
  Fix min/max date range in DatePicker calendar mode
parents e1c6d898 38475523
Loading
Loading
Loading
Loading
+6 −34
Original line number Diff line number Diff line
@@ -21,13 +21,11 @@ import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.format.DateFormat;
import android.text.format.DateUtils;
import android.util.AttributeSet;
import android.util.SparseArray;
import android.view.HapticFeedbackConstants;
import android.view.LayoutInflater;
import android.view.View;
@@ -186,6 +184,8 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate i
                headerSelectedTextColor));

        mDayPickerView = new DayPickerView(mContext, this);
        mDayPickerView.setRange(mMinDate, mMaxDate);

        mYearPickerView = new YearPickerView(mContext);
        mYearPickerView.init(this);

@@ -411,7 +411,8 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate i
            updateDisplay(false);
        }
        mMinDate.setTimeInMillis(minDate);
        mDayPickerView.goTo(getSelectedDay(), false, true, true);
        mDayPickerView.setRange(mMinDate, mMaxDate);
        mYearPickerView.setRange(mMinDate, mMaxDate);
    }

    @Override
@@ -432,7 +433,8 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate i
            updateDisplay(false);
        }
        mMaxDate.setTimeInMillis(maxDate);
        mDayPickerView.goTo(getSelectedDay(), false, true, true);
        mDayPickerView.setRange(mMinDate, mMaxDate);
        mYearPickerView.setRange(mMinDate, mMaxDate);
    }

    @Override
@@ -453,36 +455,6 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate i
        return mCurrentDate.getFirstDayOfWeek();
    }

    @Override
    public int getMinYear() {
        return mMinDate.get(Calendar.YEAR);
    }

    @Override
    public int getMaxYear() {
        return mMaxDate.get(Calendar.YEAR);
    }

    @Override
    public int getMinMonth() {
        return mMinDate.get(Calendar.MONTH);
    }

    @Override
    public int getMaxMonth() {
        return mMaxDate.get(Calendar.MONTH);
    }

    @Override
    public int getMinDay() {
        return mMinDate.get(Calendar.DAY_OF_MONTH);
    }

    @Override
    public int getMaxDay() {
        return mMaxDate.get(Calendar.DAY_OF_MONTH);
    }

    @Override
    public void setEnabled(boolean enabled) {
        mMonthAndDayLayout.setEnabled(enabled);
+0 −15
Original line number Diff line number Diff line
@@ -38,20 +38,5 @@ interface DatePickerController {
    void setFirstDayOfWeek(int firstDayOfWeek);
    int getFirstDayOfWeek();

    int getMinYear();
    int getMaxYear();

    int getMinMonth();
    int getMaxMonth();

    int getMinDay();
    int getMaxDay();

    void setMinDate(long minDate);
    Calendar getMinDate();

    void setMaxDate(long maxDate);
    Calendar getMaxDate();

    void tryVibrate();
}
+50 −19
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.os.Bundle;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import android.util.MathUtils;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.accessibility.AccessibilityEvent;
@@ -57,9 +58,11 @@ class DayPickerView extends ListView implements AbsListView.OnScrollListener,

    // highlighted time
    private Calendar mSelectedDay = Calendar.getInstance();
    private SimpleMonthAdapter mAdapter;

    private Calendar mTempDay = Calendar.getInstance();
    private Calendar mMinDate = Calendar.getInstance();
    private Calendar mMaxDate = Calendar.getInstance();

    private SimpleMonthAdapter mAdapter;

    // which month should be displayed/highlighted [0-11]
    private int mCurrentMonthDisplayed;
@@ -75,6 +78,7 @@ class DayPickerView extends ListView implements AbsListView.OnScrollListener,

    public DayPickerView(Context context, DatePickerController controller) {
        super(context);

        init();
        setController(controller);
    }
@@ -97,6 +101,41 @@ class DayPickerView extends ListView implements AbsListView.OnScrollListener,
        setUpListView();
    }

    public void setRange(Calendar minDate, Calendar maxDate) {
        mMinDate.setTimeInMillis(minDate.getTimeInMillis());
        mMaxDate.setTimeInMillis(maxDate.getTimeInMillis());

        mAdapter.setRange(mMinDate, mMaxDate);

        if (constrainCalendar(mSelectedDay, mMinDate, mMaxDate)) {
            goTo(mSelectedDay, false, true, true);
        }
    }

    /**
     * Constrains the supplied calendar to stay within the min and max
     * calendars, returning <code>true</code> if the supplied calendar
     * was modified.
     *
     * @param value The calendar to constrain
     * @param min The minimum calendar
     * @param max The maximum calendar
     * @return True if <code>value</code> was modified
     */
    private boolean constrainCalendar(Calendar value, Calendar min, Calendar max) {
        if (value.compareTo(min) < 0) {
            value.setTimeInMillis(min.getTimeInMillis());
            return true;
        }

        if (value.compareTo(max) > 0) {
            value.setTimeInMillis(max.getTimeInMillis());
            return true;
        }

        return false;
    }

    public void onChange() {
        setUpAdapter();
        setAdapter(mAdapter);
@@ -144,16 +183,9 @@ class DayPickerView extends ListView implements AbsListView.OnScrollListener,
    }

    private int getPositionFromDay(Calendar day) {
        final int diffMonthMax = getDiffMonths(mController.getMinDate(), mController.getMaxDate());
        int diffMonth = getDiffMonths(mController.getMinDate(), day);

        if (diffMonth < 0 ) {
            diffMonth = 0;
        } else if (diffMonth > diffMonthMax) {
            diffMonth = diffMonthMax;
        }

        return diffMonth;
        final int diffMonthMax = getDiffMonths(mMinDate, mMaxDate);
        final int diffMonth = getDiffMonths(mMinDate, day);
        return MathUtils.constrain(diffMonth, 0, diffMonthMax);
    }

    /**
@@ -171,8 +203,7 @@ class DayPickerView extends ListView implements AbsListView.OnScrollListener,
     *            visible
     * @return Whether or not the view animated to the new location
     */
    public boolean goTo(Calendar day, boolean animate, boolean setSelected,
                        boolean forceScroll) {
    public boolean goTo(Calendar day, boolean animate, boolean setSelected, boolean forceScroll) {

        // Set the selected day
        if (setSelected) {
@@ -464,10 +495,10 @@ class DayPickerView extends ListView implements AbsListView.OnScrollListener,
        }

        // Figure out what month is showing.
        int firstVisiblePosition = getFirstVisiblePosition();
        int month = firstVisiblePosition % 12;
        int year = firstVisiblePosition / 12 + mController.getMinYear();
        Calendar day = Calendar.getInstance();
        final int firstVisiblePosition = getFirstVisiblePosition();
        final int month = firstVisiblePosition % 12;
        final int year = firstVisiblePosition / 12 + mMinDate.get(Calendar.YEAR);
        final Calendar day = Calendar.getInstance();
        day.set(year, month, 1);

        // Scroll either forward or backward one month.
+38 −27
Original line number Diff line number Diff line
@@ -28,21 +28,30 @@ import java.util.HashMap;
 * An adapter for a list of {@link android.widget.SimpleMonthView} items.
 */
class SimpleMonthAdapter extends BaseAdapter implements SimpleMonthView.OnDayClickListener {
    private static final String TAG = "SimpleMonthAdapter";
    private final Calendar mMinDate = Calendar.getInstance();
    private final Calendar mMaxDate = Calendar.getInstance();

    private final Context mContext;
    private final DatePickerController mController;
    private Calendar mSelectedDay;

    private Calendar mSelectedDay;
    private ColorStateList mCalendarTextColors;

    public SimpleMonthAdapter(Context context, DatePickerController controller) {
        mContext = context;
        mController = controller;

        init();
        setSelectedDay(mController.getSelectedDay());
    }

    public void setRange(Calendar min, Calendar max) {
        mMinDate.setTimeInMillis(min.getTimeInMillis());
        mMaxDate.setTimeInMillis(max.getTimeInMillis());

        notifyDataSetInvalidated();
    }

    /**
     * Updates the selected day and related parameters.
     *
@@ -68,10 +77,9 @@ class SimpleMonthAdapter extends BaseAdapter implements SimpleMonthView.OnDayCli

    @Override
    public int getCount() {
        final int diffYear = mController.getMaxYear() - mController.getMinYear();
        final int diffMonth = 1 + mController.getMaxMonth() - mController.getMinMonth()
                + 12 * diffYear;
        return diffMonth;
        final int diffYear = mMaxDate.get(Calendar.YEAR) - mMinDate.get(Calendar.YEAR);
        final int diffMonth = mMaxDate.get(Calendar.MONTH) - mMinDate.get(Calendar.MONTH);
        return diffMonth + 12 * diffYear + 1;
    }

    @Override
@@ -92,36 +100,34 @@ class SimpleMonthAdapter extends BaseAdapter implements SimpleMonthView.OnDayCli
    @SuppressWarnings("unchecked")
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        SimpleMonthView v;
        HashMap<String, Integer> drawingParams = null;
        final SimpleMonthView v;
        if (convertView != null) {
            v = (SimpleMonthView) convertView;
            // We store the drawing parameters in the view so it can be recycled
            drawingParams = (HashMap<String, Integer>) v.getTag();
        } else {
            v = new SimpleMonthView(mContext);

            // Set up the new view
            AbsListView.LayoutParams params = new AbsListView.LayoutParams(
            final AbsListView.LayoutParams params = new AbsListView.LayoutParams(
                    AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.MATCH_PARENT);
            v.setLayoutParams(params);
            v.setClickable(true);
            v.setOnDayClickListener(this);

            if (mCalendarTextColors != null) {
                v.setTextColor(mCalendarTextColors);
            }
        }
        if (drawingParams == null) {
            drawingParams = new HashMap<String, Integer>();
        } else {
            drawingParams.clear();
        }
        final int currentMonth = position + mController.getMinMonth();
        final int month = currentMonth % 12;
        final int year = currentMonth / 12 + mController.getMinYear();

        int selectedDay = -1;
        final int minMonth = mMinDate.get(Calendar.MONTH);
        final int minYear = mMinDate.get(Calendar.YEAR);
        final int currentMonth = position + minMonth;
        final int month = currentMonth % 12;
        final int year = currentMonth / 12 + minYear;
        final int selectedDay;
        if (isSelectedDayInMonth(year, month)) {
            selectedDay = mSelectedDay.get(Calendar.DAY_OF_MONTH);
        } else {
            selectedDay = -1;
        }

        // Invokes requestLayout() to ensure that the recycled view is set with the appropriate
@@ -129,15 +135,15 @@ class SimpleMonthAdapter extends BaseAdapter implements SimpleMonthView.OnDayCli
        v.reuse();

        final int enabledDayRangeStart;
        if (mController.getMinMonth() == month && mController.getMinYear() == year) {
            enabledDayRangeStart = mController.getMinDay();
        if (minMonth == month && minYear == year) {
            enabledDayRangeStart = mMinDate.get(Calendar.DAY_OF_MONTH);
        } else {
            enabledDayRangeStart = 1;
        }

        final int enabledDayRangeEnd;
        if (mController.getMaxMonth() == month && mController.getMaxYear() == year) {
            enabledDayRangeEnd = mController.getMaxDay();
        if (mMaxDate.get(Calendar.MONTH) == month && mMaxDate.get(Calendar.YEAR) == year) {
            enabledDayRangeEnd = mMaxDate.get(Calendar.DAY_OF_MONTH);
        } else {
            enabledDayRangeEnd = 31;
        }
@@ -155,9 +161,13 @@ class SimpleMonthAdapter extends BaseAdapter implements SimpleMonthView.OnDayCli

    @Override
    public void onDayClick(SimpleMonthView view, Calendar day) {
        if (day != null) {
            onDayTapped(day);
        if (day != null && isCalendarInRange(day)) {
            onDaySelected(day);
        }
    }

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

    /**
@@ -165,10 +175,11 @@ class SimpleMonthAdapter extends BaseAdapter implements SimpleMonthView.OnDayCli
     *
     * @param day The day that was tapped
     */
    protected void onDayTapped(Calendar day) {
    private void onDaySelected(Calendar day) {
        mController.tryVibrate();
        mController.onDayOfMonthSelected(day.get(Calendar.YEAR), day.get(Calendar.MONTH),
                day.get(Calendar.DAY_OF_MONTH));

        setSelectedDay(day);
    }
}
+9 −11
Original line number Diff line number Diff line
@@ -52,8 +52,6 @@ import java.util.Locale;
 * within the specified month.
 */
class SimpleMonthView extends View {
    private static final String TAG = "SimpleMonthView";

    private static final int DEFAULT_HEIGHT = 32;
    private static final int MIN_HEIGHT = 10;

@@ -67,15 +65,15 @@ class SimpleMonthView extends View {

    private static final int DAY_SEPARATOR_WIDTH = 1;

    private final Formatter mFormatter;
    private final StringBuilder mStringBuilder;

    private final int mMiniDayNumberTextSize;
    private final int mMonthLabelTextSize;
    private final int mMonthDayLabelTextSize;
    private final int mMonthHeaderSize;
    private final int mDaySelectedCircleSize;

    // used for scaling to the device density
    private static float mScale = 0;

    /** Single-letter (when available) formatter for the day of week label. */
    private SimpleDateFormat mDayFormatter = new SimpleDateFormat("EEEEE", Locale.getDefault());

@@ -92,9 +90,6 @@ class SimpleMonthView extends View {
    private Paint mMonthTitlePaint;
    private Paint mMonthDayLabelPaint;

    private final Formatter mFormatter;
    private final StringBuilder mStringBuilder;

    private int mMonth;
    private int mYear;

@@ -155,11 +150,14 @@ class SimpleMonthView extends View {
        this(context, attrs, R.attr.datePickerStyle);
    }

    public SimpleMonthView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs);
    public SimpleMonthView(Context context, AttributeSet attrs, int defStyleAttr) {
        this(context, attrs, defStyleAttr, 0);
    }

        final Resources res = context.getResources();
    public SimpleMonthView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);

        final Resources res = context.getResources();
        mDayOfWeekTypeface = res.getString(R.string.day_of_week_label_typeface);
        mMonthTitleTypeface = res.getString(R.string.sans_serif);

Loading