Loading core/java/android/widget/DatePickerCalendarDelegate.java +25 −16 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); Loading Loading @@ -445,6 +448,8 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate i @Override public void setFirstDayOfWeek(int firstDayOfWeek) { mFirstDayOfWeek = firstDayOfWeek; mDayPickerView.setFirstDayOfWeek(firstDayOfWeek); } @Override Loading Loading @@ -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 Loading @@ -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; Loading @@ -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. */ Loading core/java/android/widget/DatePickerController.java +0 −7 Original line number Diff line number Diff line Loading @@ -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(); } core/java/android/widget/DayPickerView.java +42 −79 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading @@ -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(); Loading @@ -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; Loading @@ -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) { Loading @@ -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 Loading @@ -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) { Loading Loading @@ -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) { Loading Loading @@ -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. * Loading Loading @@ -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); } } }; } core/java/android/widget/SimpleMonthAdapter.java +40 −37 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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); Loading Loading @@ -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); Loading Loading @@ -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(); Loading @@ -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); } } Loading
core/java/android/widget/DatePickerCalendarDelegate.java +25 −16 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); Loading Loading @@ -445,6 +448,8 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate i @Override public void setFirstDayOfWeek(int firstDayOfWeek) { mFirstDayOfWeek = firstDayOfWeek; mDayPickerView.setFirstDayOfWeek(firstDayOfWeek); } @Override Loading Loading @@ -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 Loading @@ -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; Loading @@ -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. */ Loading
core/java/android/widget/DatePickerController.java +0 −7 Original line number Diff line number Diff line Loading @@ -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(); }
core/java/android/widget/DayPickerView.java +42 −79 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading @@ -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(); Loading @@ -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; Loading @@ -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) { Loading @@ -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 Loading @@ -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) { Loading Loading @@ -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) { Loading Loading @@ -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. * Loading Loading @@ -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); } } }; }
core/java/android/widget/SimpleMonthAdapter.java +40 −37 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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); Loading Loading @@ -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); Loading Loading @@ -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(); Loading @@ -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); } }