Merge "Clean up encapsulation in date picker classes" into lmp-mr1-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
c0bf068bbf
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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,20 +43,22 @@ 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 final SimpleMonthAdapter mAdapter = new SimpleMonthAdapter(getContext());
|
||||
|
||||
private final ScrollStateRunnable mScrollStateChangedRunnable = new ScrollStateRunnable(this);
|
||||
|
||||
private SimpleDateFormat mYearFormat = new SimpleDateFormat("yyyy", Locale.getDefault());
|
||||
|
||||
// These affect the scroll speed and feel
|
||||
private float mFriction = 1.0f;
|
||||
|
||||
// highlighted time
|
||||
private Calendar mSelectedDay = Calendar.getInstance();
|
||||
private Calendar mTempDay = Calendar.getInstance();
|
||||
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
|
||||
* @param listener The listener to call.
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
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);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
private int mFirstDayOfWeek;
|
||||
|
||||
public SimpleMonthAdapter(Context context) {
|
||||
mContext = context;
|
||||
mController = controller;
|
||||
|
||||
init();
|
||||
setSelectedDay(mController.getSelectedDay());
|
||||
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();
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDayClick(SimpleMonthView view, Calendar day) {
|
||||
if (day != null && isCalendarInRange(day)) {
|
||||
onDaySelected(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));
|
||||
private final OnDayClickListener mOnDayClickListener = new OnDayClickListener() {
|
||||
@Override
|
||||
public void onDayClick(SimpleMonthView view, Calendar day) {
|
||||
if (day != null && isCalendarInRange(day)) {
|
||||
setSelectedDay(day);
|
||||
|
||||
setSelectedDay(day);
|
||||
if (mOnDaySelectedListener != null) {
|
||||
mOnDaySelectedListener.onDaySelected(SimpleMonthAdapter.this, day);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
public interface OnDaySelectedListener {
|
||||
public void onDaySelected(SimpleMonthAdapter view, Calendar day);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user