diff options
Diffstat (limited to 'src/com/android/datetimepicker/date/DayPickerView.java')
-rw-r--r-- | src/com/android/datetimepicker/date/DayPickerView.java | 146 |
1 files changed, 51 insertions, 95 deletions
diff --git a/src/com/android/datetimepicker/date/DayPickerView.java b/src/com/android/datetimepicker/date/DayPickerView.java index 76dcf4f..1b0e871 100644 --- a/src/com/android/datetimepicker/date/DayPickerView.java +++ b/src/com/android/datetimepicker/date/DayPickerView.java @@ -17,9 +17,7 @@ package com.android.datetimepicker.date; import android.content.Context; -import android.database.DataSetObserver; import android.os.Handler; -import android.text.format.Time; import android.util.Log; import android.view.View; import android.view.ViewConfiguration; @@ -27,15 +25,13 @@ import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.ListView; +import com.android.datetimepicker.date.DatePickerDialog.OnDateChangedListener; import com.android.datetimepicker.date.SimpleMonthAdapter.CalendarDay; -import java.util.Calendar; -import java.util.Locale; - /** * This displays a list of months in a calendar format with selectable days. */ -public class DayPickerView extends ListView implements OnScrollListener { +public class DayPickerView extends ListView implements OnScrollListener, OnDateChangedListener { private static final String TAG = "MonthFragment"; @@ -61,8 +57,6 @@ public class DayPickerView extends ListView implements OnScrollListener { protected Context mContext; protected Handler mHandler; - protected float mMinimumFlingVelocity; - // highlighted time protected CalendarDay mSelectedDay = new CalendarDay(); protected SimpleMonthAdapter mAdapter; @@ -72,8 +66,6 @@ public class DayPickerView extends ListView implements OnScrollListener { private static float mScale = 0; // When the week starts; numbered like Time.<WEEKDAY> (e.g. SUNDAY=0). protected int mFirstDayOfWeek; - // The first day that is visible in the view - protected Time mFirstVisibleDay = new Time(); // The last name announced by accessibility protected CharSequence mPrevMonthName; // which month should be displayed/highlighted [0-11] @@ -87,61 +79,19 @@ public class DayPickerView extends ListView implements OnScrollListener { private final DatePickerController mController; - // This causes an update of the view at midnight - protected Runnable mTodayUpdater = new Runnable() { - @Override - public void run() { - Time midnight = new Time(mFirstVisibleDay.timezone); - midnight.setToNow(); - long currentMillis = midnight.toMillis(true); - - midnight.hour = 0; - midnight.minute = 0; - midnight.second = 0; - midnight.monthDay++; - long millisToMidnight = midnight.normalize(true) - currentMillis; - mHandler.postDelayed(this, millisToMidnight); - - if (mAdapter != null) { - mAdapter.notifyDataSetChanged(); - } - } - }; - - // This allows us to update our position when a day is tapped - protected DataSetObserver mObserver = new DataSetObserver() { - @Override - public void onChanged() { - CalendarDay day = mAdapter.getSelectedDay(); - if (day.year != mSelectedDay.year || day.day != mSelectedDay.day) { - goTo(day, true, true, false); - } - } - }; - public DayPickerView(Context context, DatePickerController controller) { super(context); mHandler = new Handler(); mController = controller; + mController.registerOnDateChangedListener(this); setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); setDrawSelectorOnTop(false); init(context); - setCalendarDate(controller.getSelectedDay()); - } - - public void setCalendarDate(CalendarDay day) { - goTo(day, false, true, true); + onDateChanged(); } public void init(Context context) { mContext = context; - String tz = Time.getCurrentTimezone(); - ViewConfiguration viewConfig = ViewConfiguration.get(context); - mMinimumFlingVelocity = viewConfig.getScaledMinimumFlingVelocity(); - - mFirstVisibleDay.timezone = tz; - mFirstVisibleDay.normalize(true); - setUpListView(); setUpAdapter(); setAdapter(mAdapter); @@ -159,7 +109,6 @@ public class DayPickerView extends ListView implements OnScrollListener { protected void setUpAdapter() { if (mAdapter == null) { mAdapter = new SimpleMonthAdapter(getContext(), mController); - mAdapter.registerDataSetObserver(mObserver); } else { mAdapter.setSelectedDay(mSelectedDay); mAdapter.notifyDataSetChanged(); @@ -188,41 +137,6 @@ public class DayPickerView extends ListView implements OnScrollListener { setFriction(ViewConfiguration.getScrollFriction() * mFriction); } - @Override - public void onAttachedToWindow() { - super.onAttachedToWindow(); - setUpAdapter(); - doResumeUpdates(); - } - - @Override - public void onDetachedFromWindow() { - super.onDetachedFromWindow(); - mHandler.removeCallbacks(mTodayUpdater); - } - - // @Override - // public void onSaveInstanceState(Bundle outState) { - // outState.putLong(KEY_CURRENT_TIME, mSelectedDay.toMillis(true)); - // } - - /** - * Updates the user preference fields. Override this to use a different - * preference space. - */ - protected void doResumeUpdates() { - // Get default week start based on locale, subtracting one for use with - // android Time. - Calendar cal = Calendar.getInstance(Locale.getDefault()); - mFirstDayOfWeek = cal.getFirstDayOfWeek() - 1; - - mShowWeekNumber = false; - - goTo(mSelectedDay, false, false, false); - mAdapter.setSelectedDay(mSelectedDay); - mTodayUpdater.run(); - } - /** * This moves to the specified time in the view. If the time is not already * in range it will move the list so that the first of the month containing @@ -246,10 +160,9 @@ public class DayPickerView extends ListView implements OnScrollListener { } mTempDay.set(day); - // Get the week we're going to - // TODO push Util function into Calendar public api. - int position = (day.year - mController.getMinYear()) + final int position = (day.year - mController.getMinYear()) * SimpleMonthAdapter.MONTHS_IN_YEAR + day.month; + Log.d(TAG, "Year: " + day.year); View child; int i = 0; @@ -291,8 +204,7 @@ public class DayPickerView extends ListView implements OnScrollListener { position, LIST_TOP_OFFSET, GOTO_SCROLL_DURATION); return true; } else { - setSelectionFromTop(position, LIST_TOP_OFFSET); - onScrollStateChanged(this, OnScrollListener.SCROLL_STATE_IDLE); + postSetSelection(position); } } else if (setSelected) { setMonthDisplayed(mSelectedDay); @@ -300,6 +212,18 @@ public class DayPickerView extends ListView implements OnScrollListener { return false; } + public void postSetSelection(final int position) { + clearFocus(); + post(new Runnable() { + + @Override + public void run() { + setSelection(position); + } + }); + onScrollStateChanged(this, OnScrollListener.SCROLL_STATE_IDLE); + } + /** * Updates the title and selected month if the view has moved to a new * month. @@ -391,4 +315,36 @@ public class DayPickerView extends ListView implements OnScrollListener { } } } + + /** + * Gets the position of the view that is most prominently displayed within the list view. + */ + public int getMostVisiblePosition() { + final int firstPosition = getFirstVisiblePosition(); + final int height = getHeight(); + + int maxDisplayedHeight = 0; + int mostVisibleIndex = 0; + int i=0; + int bottom = 0; + while (bottom < height) { + View child = getChildAt(i); + if (child == null) { + break; + } + bottom = child.getBottom(); + int displayedHeight = Math.min(bottom, height) - Math.max(0, child.getTop()); + if (displayedHeight > maxDisplayedHeight) { + mostVisibleIndex = i; + maxDisplayedHeight = displayedHeight; + } + i++; + } + return firstPosition + mostVisibleIndex; + } + + @Override + public void onDateChanged() { + goTo(mController.getSelectedDay(), false, true, true); + } } |