summaryrefslogtreecommitdiffstats
path: root/core/java/android/widget/DayPickerView.java
diff options
context:
space:
mode:
authorAlan Viverette <alanv@google.com>2014-10-24 14:34:26 -0700
committerAlan Viverette <alanv@google.com>2014-10-24 14:37:29 -0700
commit50eb025c2fea7e364e0be951ce8ba6ca605f901a (patch)
tree2c61860100aafc3adfef66a5912fa2204aa6e892 /core/java/android/widget/DayPickerView.java
parentcc66a236f90cbef7f9562b4179c3aec517f4f082 (diff)
downloadframeworks_base-50eb025c2fea7e364e0be951ce8ba6ca605f901a.zip
frameworks_base-50eb025c2fea7e364e0be951ce8ba6ca605f901a.tar.gz
frameworks_base-50eb025c2fea7e364e0be951ce8ba6ca605f901a.tar.bz2
Fix min/max date range in DatePicker calendar mode
Also cleans abstraction of various day/year pickers and adapters. BUG: 18104457 Change-Id: Ifde664788d8123a3123303940bac63c1350c2cd7
Diffstat (limited to 'core/java/android/widget/DayPickerView.java')
-rw-r--r--core/java/android/widget/DayPickerView.java69
1 files changed, 50 insertions, 19 deletions
diff --git a/core/java/android/widget/DayPickerView.java b/core/java/android/widget/DayPickerView.java
index ca4095e..fcf66f6 100644
--- a/core/java/android/widget/DayPickerView.java
+++ b/core/java/android/widget/DayPickerView.java
@@ -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);
@@ -137,23 +176,16 @@ class DayPickerView extends ListView implements AbsListView.OnScrollListener,
setFriction(ViewConfiguration.getScrollFriction() * mFriction);
}
- private int getDiffMonths(Calendar start, Calendar end){
+ private int getDiffMonths(Calendar start, Calendar end) {
final int diffYears = end.get(Calendar.YEAR) - start.get(Calendar.YEAR);
final int diffMonths = end.get(Calendar.MONTH) - start.get(Calendar.MONTH) + 12 * diffYears;
return diffMonths;
}
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.