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

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

Merge "Clean up encapsulation in date picker classes" into lmp-mr1-dev

automerge: c0bf068b

* commit 'c0bf068b':
  Clean up encapsulation in date picker classes
parents eba923cc c0bf068b
Loading
Loading
Loading
Loading
+25 −16
Original line number Diff line number Diff line
@@ -183,8 +183,11 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate i
                mHeaderYearTextView.getTextColors(), R.attr.state_selected,
                headerSelectedTextColor));

        mDayPickerView = new DayPickerView(mContext, this);
        mDayPickerView = new DayPickerView(mContext);
        mDayPickerView.setFirstDayOfWeek(mFirstDayOfWeek);
        mDayPickerView.setRange(mMinDate, mMaxDate);
        mDayPickerView.setDay(mCurrentDate);
        mDayPickerView.setOnDaySelectedListener(mOnDaySelectedListener);

        mYearPickerView = new YearPickerView(mContext);
        mYearPickerView.init(this);
@@ -333,7 +336,7 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate i

        switch (viewIndex) {
            case MONTH_AND_DAY_VIEW:
                mDayPickerView.onDateChanged();
                mDayPickerView.setDay(getSelectedDay());
                if (mCurrentView != viewIndex) {
                    mMonthAndDayLayout.setSelected(true);
                    mHeaderYearTextView.setSelected(false);
@@ -445,6 +448,8 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate i
    @Override
    public void setFirstDayOfWeek(int firstDayOfWeek) {
        mFirstDayOfWeek = firstDayOfWeek;

        mDayPickerView.setFirstDayOfWeek(firstDayOfWeek);
    }

    @Override
@@ -606,19 +611,12 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate i
        }
    }

    @Override
    public void onDayOfMonthSelected(int year, int month, int day) {
        mCurrentDate.set(Calendar.YEAR, year);
        mCurrentDate.set(Calendar.MONTH, month);
        mCurrentDate.set(Calendar.DAY_OF_MONTH, day);
        updatePickers();
        updateDisplay(true);
    }

    private void updatePickers() {
        for (OnDateChangedListener listener : mListeners) {
            listener.onDateChanged();
        }

        mDayPickerView.setDay(getSelectedDay());
    }

    @Override
@@ -626,11 +624,6 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate i
        mListeners.add(listener);
    }

    @Override
    public void unregisterOnDateChangedListener(OnDateChangedListener listener) {
        mListeners.remove(listener);
    }

    @Override
    public Calendar getSelectedDay() {
        return mCurrentDate;
@@ -651,6 +644,22 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate i
        }
    }

    /**
     * Listener called when the user selects a day in the day picker view.
     */
    private final DayPickerView.OnDaySelectedListener
            mOnDaySelectedListener = new DayPickerView.OnDaySelectedListener() {
        @Override
        public void onDaySelected(DayPickerView view, Calendar day) {
            mCurrentDate.setTimeInMillis(day.getTimeInMillis());

            updatePickers();
            updateDisplay(true);

            tryVibrate();
        }
    };

    /**
     * Class for managing state storing/restoring.
     */
+0 −7
Original line number Diff line number Diff line
@@ -27,16 +27,9 @@ interface DatePickerController {

    void onYearSelected(int year);

    void onDayOfMonthSelected(int year, int month, int day);

    void registerOnDateChangedListener(OnDateChangedListener listener);

    void unregisterOnDateChangedListener(OnDateChangedListener listener);

    Calendar getSelectedDay();

    void setFirstDayOfWeek(int firstDayOfWeek);
    int getFirstDayOfWeek();

    void tryVibrate();
}
+42 −79
Original line number Diff line number Diff line
@@ -16,14 +16,10 @@

package android.widget;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import android.util.MathUtils;
import android.view.View;
@@ -38,9 +34,7 @@ import java.util.Locale;
/**
 * This displays a list of months in a calendar format with selectable days.
 */
class DayPickerView extends ListView implements AbsListView.OnScrollListener,
        OnDateChangedListener {

class DayPickerView extends ListView implements AbsListView.OnScrollListener {
    private static final String TAG = "DayPickerView";

    // How long the GoTo fling animation should last
@@ -49,12 +43,14 @@ class DayPickerView extends ListView implements AbsListView.OnScrollListener,
    // How long to wait after receiving an onScrollStateChanged notification before acting on it
    private static final int SCROLL_CHANGE_DELAY = 40;

    private static int LIST_TOP_OFFSET = -1; // so that the top line will be under the separator
    // so that the top line will be under the separator
    private static final int LIST_TOP_OFFSET = -1;

    private SimpleDateFormat mYearFormat = new SimpleDateFormat("yyyy", Locale.getDefault());
    private final SimpleMonthAdapter mAdapter = new SimpleMonthAdapter(getContext());

    private final ScrollStateRunnable mScrollStateChangedRunnable = new ScrollStateRunnable(this);

    // These affect the scroll speed and feel
    private float mFriction = 1.0f;
    private SimpleDateFormat mYearFormat = new SimpleDateFormat("yyyy", Locale.getDefault());

    // highlighted time
    private Calendar mSelectedDay = Calendar.getInstance();
@@ -62,7 +58,7 @@ class DayPickerView extends ListView implements AbsListView.OnScrollListener,
    private Calendar mMinDate = Calendar.getInstance();
    private Calendar mMaxDate = Calendar.getInstance();

    private SimpleMonthAdapter mAdapter;
    private OnDaySelectedListener mOnDaySelectedListener;

    // which month should be displayed/highlighted [0-11]
    private int mCurrentMonthDisplayed;
@@ -71,34 +67,27 @@ class DayPickerView extends ListView implements AbsListView.OnScrollListener,
    // used for tracking what state listview is in
    private int mCurrentScrollState = OnScrollListener.SCROLL_STATE_IDLE;

    private DatePickerController mController;
    private boolean mPerformingScroll;

    private ScrollStateRunnable mScrollStateChangedRunnable = new ScrollStateRunnable(this);

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

        init();
        setController(controller);
    }

    public void setController(DatePickerController controller) {
        if (mController != null) {
            mController.unregisterOnDateChangedListener(this);
        }
        mController = controller;
        mController.registerOnDateChangedListener(this);
        setUpAdapter();
        setAdapter(mAdapter);
        onDateChanged();
    }

    public void init() {
        setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        setDrawSelectorOnTop(false);

        setUpListView();

        goTo(mSelectedDay, false, true, true);

        mAdapter.setOnDaySelectedListener(mProxyOnDaySelectedListener);
    }

    public void setDay(Calendar day) {
        goTo(day, false, true, true);
    }

    public void setFirstDayOfWeek(int firstDayOfWeek) {
        mAdapter.setFirstDayOfWeek(firstDayOfWeek);
    }

    public void setRange(Calendar minDate, Calendar maxDate) {
@@ -113,54 +102,19 @@ class DayPickerView extends ListView implements AbsListView.OnScrollListener,
    }

    /**
     * Constrains the supplied calendar to stay within the min and max
     * calendars, returning <code>true</code> if the supplied calendar
     * was modified.
     * Sets the listener to call when the user selects a day.
     *
     * @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);
    }

    /**
     * Creates a new adapter if necessary and sets up its parameters. Override
     * this method to provide a custom adapter.
     * @param listener The listener to call.
     */
    protected void setUpAdapter() {
        if (mAdapter == null) {
            mAdapter = new SimpleMonthAdapter(getContext(), mController);
        } else {
            mAdapter.setSelectedDay(mSelectedDay);
            mAdapter.notifyDataSetChanged();
        }
        // refresh the view with the new parameters
        mAdapter.notifyDataSetChanged();
    public void setOnDaySelectedListener(OnDaySelectedListener listener) {
        mOnDaySelectedListener = listener;
    }

    /*
     * Sets all the required fields for the list view. Override this method to
     * set a different list view behavior.
     */
    protected void setUpListView() {
    private void setUpListView() {
        // Transparent background on scroll
        setCacheColorHint(0);
        // No dividers
@@ -173,7 +127,7 @@ class DayPickerView extends ListView implements AbsListView.OnScrollListener,
        setOnScrollListener(this);
        setFadingEdgeLength(0);
        // Make the scrolling behavior nicer
        setFriction(ViewConfiguration.getScrollFriction() * mFriction);
        setFriction(ViewConfiguration.getScrollFriction());
    }

    private int getDiffMonths(Calendar start, Calendar end) {
@@ -203,7 +157,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) {
    private boolean goTo(Calendar day, boolean animate, boolean setSelected, boolean forceScroll) {

        // Set the selected day
        if (setSelected) {
@@ -392,11 +346,6 @@ class DayPickerView extends ListView implements AbsListView.OnScrollListener,
        return firstPosition + mostVisibleIndex;
    }

    @Override
    public void onDateChanged() {
        goTo(mController.getSelectedDay(), false, true, true);
    }

    /**
     * Attempts to return the date that has accessibility focus.
     *
@@ -529,4 +478,18 @@ class DayPickerView extends ListView implements AbsListView.OnScrollListener,
        mPerformingScroll = true;
        return true;
    }

    public interface OnDaySelectedListener {
        public void onDaySelected(DayPickerView view, Calendar day);
    }

    private final SimpleMonthAdapter.OnDaySelectedListener
            mProxyOnDaySelectedListener = new SimpleMonthAdapter.OnDaySelectedListener() {
        @Override
        public void onDaySelected(SimpleMonthAdapter adapter, Calendar day) {
            if (mOnDaySelectedListener != null) {
                mOnDaySelectedListener.onDaySelected(DayPickerView.this, day);
            }
        }
    };
}
+40 −37
Original line number Diff line number Diff line
@@ -20,29 +20,28 @@ import android.content.Context;
import android.content.res.ColorStateList;
import android.view.View;
import android.view.ViewGroup;
import android.widget.SimpleMonthView.OnDayClickListener;

import java.util.Calendar;
import java.util.HashMap;

/**
 * An adapter for a list of {@link android.widget.SimpleMonthView} items.
 */
class SimpleMonthAdapter extends BaseAdapter implements SimpleMonthView.OnDayClickListener {
class SimpleMonthAdapter extends BaseAdapter {
    private final Calendar mMinDate = Calendar.getInstance();
    private final Calendar mMaxDate = Calendar.getInstance();

    private final Context mContext;
    private final DatePickerController mController;

    private Calendar mSelectedDay;
    private ColorStateList mCalendarTextColors;
    private OnDaySelectedListener mOnDaySelectedListener;

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

        init();
        setSelectedDay(mController.getSelectedDay());
    public SimpleMonthAdapter(Context context) {
        mContext = context;
        mSelectedDay = Calendar.getInstance();
    }

    public void setRange(Calendar min, Calendar max) {
@@ -52,29 +51,36 @@ class SimpleMonthAdapter extends BaseAdapter implements SimpleMonthView.OnDayCli
        notifyDataSetInvalidated();
    }

    public void setFirstDayOfWeek(int firstDayOfWeek) {
        mFirstDayOfWeek = firstDayOfWeek;

        notifyDataSetInvalidated();
    }

    /**
     * Updates the selected day and related parameters.
     *
     * @param day The day to highlight
     */
    public void setSelectedDay(Calendar day) {
        if (mSelectedDay != day) {
        mSelectedDay = day;

        notifyDataSetChanged();
    }

    /**
     * Sets the listener to call when the user selects a day.
     *
     * @param listener The listener to call.
     */
    public void setOnDaySelectedListener(OnDaySelectedListener listener) {
        mOnDaySelectedListener = listener;
    }

    void setCalendarTextColor(ColorStateList colors) {
        mCalendarTextColors = colors;
    }

    /**
     * Set up the gesture detector and selected time
     */
    protected void init() {
        mSelectedDay = Calendar.getInstance();
    }

    @Override
    public int getCount() {
        final int diffYear = mMaxDate.get(Calendar.YEAR) - mMinDate.get(Calendar.YEAR);
@@ -111,7 +117,7 @@ class SimpleMonthAdapter extends BaseAdapter implements SimpleMonthView.OnDayCli
                    AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.MATCH_PARENT);
            v.setLayoutParams(params);
            v.setClickable(true);
            v.setOnDayClickListener(this);
            v.setOnDayClickListener(mOnDayClickListener);

            if (mCalendarTextColors != null) {
                v.setTextColor(mCalendarTextColors);
@@ -148,7 +154,7 @@ class SimpleMonthAdapter extends BaseAdapter implements SimpleMonthView.OnDayCli
            enabledDayRangeEnd = 31;
        }

        v.setMonthParams(selectedDay, month, year, mController.getFirstDayOfWeek(),
        v.setMonthParams(selectedDay, month, year, mFirstDayOfWeek,
                enabledDayRangeStart, enabledDayRangeEnd);
        v.invalidate();

@@ -159,27 +165,24 @@ class SimpleMonthAdapter extends BaseAdapter implements SimpleMonthView.OnDayCli
        return mSelectedDay.get(Calendar.YEAR) == year && mSelectedDay.get(Calendar.MONTH) == month;
    }

    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)) {
            onDaySelected(day);
                setSelectedDay(day);

                if (mOnDaySelectedListener != null) {
                    mOnDaySelectedListener.onDaySelected(SimpleMonthAdapter.this, day);
                }
            }

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

    /**
     * Maintains the same hour/min/sec but moves the day to the tapped day.
     *
     * @param day The day that was tapped
     */
    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);
    public interface OnDaySelectedListener {
        public void onDaySelected(SimpleMonthAdapter view, Calendar day);
    }
}