DatePicker.java revision f5926962cc665d4a2e6464f9ba9e3e9788496a6f
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.widget; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.Widget; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 21f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganovimport android.content.res.Configuration; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 25e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganovimport android.text.TextUtils; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.format.DateFormat; 27dddda8d188408ff18935b1b0e15a00fe012a03daKenny Rootimport android.text.format.DateUtils; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 29e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganovimport android.util.Log; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater; 328a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganovimport android.view.accessibility.AccessibilityEvent; 33cedc446684e94c9971c38c3206f1f224314bda2aSvetoslav Ganovimport android.widget.NumberPicker.OnValueChangeListener; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganovimport com.android.internal.R; 36f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 37e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganovimport java.text.ParseException; 3803a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischerimport java.text.SimpleDateFormat; 39156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganovimport java.util.Arrays; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Calendar; 41dddda8d188408ff18935b1b0e15a00fe012a03daKenny Rootimport java.util.Locale; 42e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganovimport java.util.TimeZone; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 45e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * This class is a widget for selecting a date. The date can be selected by a 46e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * year, month, and day spinners or a {@link CalendarView}. The set of spinners 47e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * and the calendar view are automatically synchronized. The client can 48e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * customize whether only the spinners, or only the calendar view, or both to be 49e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * displayed. Also the minimal and maximal date from which dates to be selected 50e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * can be customized. 5150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * <p> 529a143e6641fa4a5942e7341007d916601402e8dfDirk Dougherty * See the <a href="{@docRoot}resources/tutorials/views/hello-datepicker.html">Date 539a143e6641fa4a5942e7341007d916601402e8dfDirk Dougherty * Picker tutorial</a>. 5450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * </p> 55e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * <p> 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For a dialog using this view, see {@link android.app.DatePickerDialog}. 57e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * </p> 58e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 59e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @attr ref android.R.styleable#DatePicker_startYear 60e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @attr ref android.R.styleable#DatePicker_endYear 61e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @attr ref android.R.styleable#DatePicker_maxDate 62e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @attr ref android.R.styleable#DatePicker_minDate 63e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @attr ref android.R.styleable#DatePicker_spinnersShown 64e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @attr ref android.R.styleable#DatePicker_calendarViewShown 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@Widget 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class DatePicker extends FrameLayout { 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 69e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private static final String LOG_TAG = DatePicker.class.getSimpleName(); 70e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 71e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private static final String DATE_FORMAT = "MM/dd/yyyy"; 72e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int DEFAULT_START_YEAR = 1900; 74dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root 7550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private static final int DEFAULT_END_YEAR = 2100; 76dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root 77e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private static final boolean DEFAULT_CALENDAR_VIEW_SHOWN = true; 78e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 79e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private static final boolean DEFAULT_SPINNERS_SHOWN = true; 8050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 8125f84f323c607bbd9133432fd789ba29b2dcd4d4Svetoslav Ganov private static final boolean DEFAULT_ENABLED_STATE = true; 8225f84f323c607bbd9133432fd789ba29b2dcd4d4Svetoslav Ganov 83e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private final NumberPicker mDaySpinner; 8450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 85e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private final LinearLayout mSpinners; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 87e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private final NumberPicker mMonthSpinner; 88e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 89e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private final NumberPicker mYearSpinner; 90e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 91e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private final CalendarView mCalendarView; 9250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 93f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov private Locale mCurrentLocale; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 95f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov private OnDateChangedListener mOnDateChangedListener; 9650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 97f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov private String[] mShortMonths; 9850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 99f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov private final java.text.DateFormat mDateFormat = new SimpleDateFormat(DATE_FORMAT); 10050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 101f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov private int mNumberOfMonths; 102dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root 103f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov private Calendar mTempDate; 104e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 105f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov private Calendar mMinDate; 106e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 107f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov private Calendar mMaxDate; 108e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 109f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov private Calendar mCurrentDate; 110e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 11125f84f323c607bbd9133432fd789ba29b2dcd4d4Svetoslav Ganov private boolean mIsEnabled = DEFAULT_ENABLED_STATE; 11251c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 114e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * The callback used to indicate the user changes\d the date. 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface OnDateChangedListener { 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 119e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Called upon a date change. 120e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param view The view associated with this listener. 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param year The year that was set. 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param monthOfYear The month that was set (0-11) for compatibility 12450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * with {@link java.util.Calendar}. 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dayOfMonth The day of the month that was set. 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DatePicker(Context context) { 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, null); 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DatePicker(Context context, AttributeSet attrs) { 1354243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov this(context, attrs, R.attr.datePickerStyle); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DatePicker(Context context, AttributeSet attrs, int defStyle) { 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs, defStyle); 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 141f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov // initialization based on locale 142f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov setCurrentLocale(Locale.getDefault()); 143f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 1444243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov TypedArray attributesArray = context.obtainStyledAttributes(attrs, R.styleable.DatePicker, 1454243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov defStyle, 0); 146e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov boolean spinnersShown = attributesArray.getBoolean(R.styleable.DatePicker_spinnersShown, 147e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov DEFAULT_SPINNERS_SHOWN); 148e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov boolean calendarViewShown = attributesArray.getBoolean( 149e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov R.styleable.DatePicker_calendarViewShown, DEFAULT_CALENDAR_VIEW_SHOWN); 1504243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov int startYear = attributesArray.getInt(R.styleable.DatePicker_startYear, 1514243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov DEFAULT_START_YEAR); 152e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov int endYear = attributesArray.getInt(R.styleable.DatePicker_endYear, DEFAULT_END_YEAR); 153e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov String minDate = attributesArray.getString(R.styleable.DatePicker_minDate); 154e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov String maxDate = attributesArray.getString(R.styleable.DatePicker_maxDate); 1554243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov int layoutResourceId = attributesArray.getResourceId(R.styleable.DatePicker_layout, 1564243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov R.layout.date_picker); 157e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov attributesArray.recycle(); 158e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 15950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov LayoutInflater inflater = (LayoutInflater) context 16050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 1614243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov inflater.inflate(layoutResourceId, this, true); 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 163cedc446684e94c9971c38c3206f1f224314bda2aSvetoslav Ganov OnValueChangeListener onChangeListener = new OnValueChangeListener() { 164e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public void onValueChange(NumberPicker picker, int oldVal, int newVal) { 165156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mTempDate.setTimeInMillis(mCurrentDate.getTimeInMillis()); 166156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov // take care of wrapping of days and months to update greater fields 167156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov if (picker == mDaySpinner) { 168156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov int maxDayOfMonth = mTempDate.getActualMaximum(Calendar.DAY_OF_MONTH); 169156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov if (oldVal == maxDayOfMonth && newVal == 1) { 170156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mTempDate.add(Calendar.DAY_OF_MONTH, 1); 171156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } else if (oldVal == 1 && newVal == maxDayOfMonth) { 172156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mTempDate.add(Calendar.DAY_OF_MONTH, -1); 173156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } else { 174156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mTempDate.add(Calendar.DAY_OF_MONTH, newVal - oldVal); 175156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } 176156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } else if (picker == mMonthSpinner) { 177156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov if (oldVal == 11 && newVal == 0) { 178156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mTempDate.add(Calendar.MONTH, 1); 179156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } else if (oldVal == 0 && newVal == 11) { 180156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mTempDate.add(Calendar.MONTH, -1); 181156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } else { 182156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mTempDate.add(Calendar.MONTH, newVal - oldVal); 183156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } 184156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } else if (picker == mYearSpinner) { 185156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mTempDate.set(Calendar.YEAR, newVal); 186156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } else { 187156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov throw new IllegalArgumentException(); 188156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } 189156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov // now set the date to the adjusted one 190156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov setDate(mTempDate.get(Calendar.YEAR), mTempDate.get(Calendar.MONTH), 191156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mTempDate.get(Calendar.DAY_OF_MONTH)); 19258f51255eb20f9c4d16c11554f372ff92d45fcc7Svetoslav Ganov updateSpinners(); 19358f51255eb20f9c4d16c11554f372ff92d45fcc7Svetoslav Ganov updateCalendarView(); 194156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov notifyDateChanged(); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov }; 1975fe1e6221ea3bab3120f5b9c0ceacaf59d116c05Eric Fischer 198e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mSpinners = (LinearLayout) findViewById(R.id.pickers); 199e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 200e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov // calendar view day-picker 201e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mCalendarView = (CalendarView) findViewById(R.id.calendar_view); 202e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mCalendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() { 203e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public void onSelectedDayChange(CalendarView view, int year, int month, int monthDay) { 204156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov setDate(year, month, monthDay); 20558f51255eb20f9c4d16c11554f372ff92d45fcc7Svetoslav Ganov updateSpinners(); 206156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov notifyDateChanged(); 20728104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov } 20828104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov }); 20928104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov 21050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov // day 211e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mDaySpinner = (NumberPicker) findViewById(R.id.day); 212e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mDaySpinner.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER); 213e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mDaySpinner.setOnLongPressUpdateInterval(100); 214e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mDaySpinner.setOnValueChangedListener(onChangeListener); 2155fe1e6221ea3bab3120f5b9c0ceacaf59d116c05Eric Fischer 21650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov // month 217e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mMonthSpinner = (NumberPicker) findViewById(R.id.month); 218e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mMonthSpinner.setMinValue(0); 219e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mMonthSpinner.setMaxValue(mNumberOfMonths - 1); 220f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov mMonthSpinner.setDisplayedValues(mShortMonths); 221e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mMonthSpinner.setOnLongPressUpdateInterval(200); 222e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mMonthSpinner.setOnValueChangedListener(onChangeListener); 22350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 22450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov // year 225e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mYearSpinner = (NumberPicker) findViewById(R.id.year); 226e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mYearSpinner.setOnLongPressUpdateInterval(100); 227e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mYearSpinner.setOnValueChangedListener(onChangeListener); 228e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 229e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov // show only what the user required but make sure we 230e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov // show something and the spinners have higher priority 231e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov if (!spinnersShown && !calendarViewShown) { 232e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov setSpinnersShown(true); 233e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } else { 234e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov setSpinnersShown(spinnersShown); 235e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov setCalendarViewShown(calendarViewShown); 23613427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov } 237e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 23813427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov // set the min date giving priority of the minDate over startYear 23913427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov mTempDate.clear(); 24013427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov if (!TextUtils.isEmpty(minDate)) { 24113427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov if (!parseDate(minDate, mTempDate)) { 242e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mTempDate.set(startYear, 0, 1); 243e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 24413427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov } else { 24513427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov mTempDate.set(startYear, 0, 1); 24613427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov } 24713427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov setMinDate(mTempDate.getTimeInMillis()); 24813427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov 24913427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov // set the max date giving priority of the maxDate over endYear 25013427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov mTempDate.clear(); 25113427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov if (!TextUtils.isEmpty(maxDate)) { 25213427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov if (!parseDate(maxDate, mTempDate)) { 253e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mTempDate.set(endYear, 11, 31); 254e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 25513427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov } else { 25613427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov mTempDate.set(endYear, 11, 31); 257e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 25813427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov setMaxDate(mTempDate.getTimeInMillis()); 25913427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov 26013427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov // initialize to current date 26113427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov mCurrentDate.setTimeInMillis(System.currentTimeMillis()); 26213427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov init(mCurrentDate.get(Calendar.YEAR), mCurrentDate.get(Calendar.MONTH), mCurrentDate 26313427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov .get(Calendar.DAY_OF_MONTH), null); 264e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 265e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov // re-order the number spinners to match the current date format 266e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov reorderSpinners(); 267e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 268e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 269e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /** 270e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Gets the minimal date supported by this {@link DatePicker} in 271e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * milliseconds since January 1, 1970 00:00:00 in 272e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * {@link TimeZone#getDefault()} time zone. 273e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * <p> 274e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Note: The default minimal date is 01/01/1900. 275e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * <p> 276e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 277e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @return The minimal supported date. 278e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov */ 279e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public long getMinDate() { 280e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov return mCalendarView.getMinDate(); 281e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 282e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 283e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /** 284e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Sets the minimal date supported by this {@link NumberPicker} in 285e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * milliseconds since January 1, 1970 00:00:00 in 286e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * {@link TimeZone#getDefault()} time zone. 287e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 288e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @param minDate The minimal supported date. 289e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov */ 290e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public void setMinDate(long minDate) { 291e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mTempDate.setTimeInMillis(minDate); 292e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov if (mTempDate.get(Calendar.YEAR) == mMinDate.get(Calendar.YEAR) 293e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov && mTempDate.get(Calendar.DAY_OF_YEAR) != mMinDate.get(Calendar.DAY_OF_YEAR)) { 294e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov return; 295e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 296e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mMinDate.setTimeInMillis(minDate); 297e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mCalendarView.setMinDate(minDate); 298156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov if (mCurrentDate.before(mMinDate)) { 299156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis()); 300156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov updateCalendarView(); 301156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } 302156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov updateSpinners(); 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 30528104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov /** 306e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Gets the maximal date supported by this {@link DatePicker} in 307e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * milliseconds since January 1, 1970 00:00:00 in 308e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * {@link TimeZone#getDefault()} time zone. 309e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * <p> 310e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Note: The default maximal date is 12/31/2100. 31128104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov * <p> 31228104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov * 313e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @return The maximal supported date. 314e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov */ 315e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public long getMaxDate() { 316e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov return mCalendarView.getMaxDate(); 317e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 318e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 319e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /** 320e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Sets the maximal date supported by this {@link DatePicker} in 321e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * milliseconds since January 1, 1970 00:00:00 in 322e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * {@link TimeZone#getDefault()} time zone. 323e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 324e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @param maxDate The maximal supported date. 32528104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov */ 326e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public void setMaxDate(long maxDate) { 327e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mTempDate.setTimeInMillis(maxDate); 328e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov if (mTempDate.get(Calendar.YEAR) == mMaxDate.get(Calendar.YEAR) 329e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov && mTempDate.get(Calendar.DAY_OF_YEAR) != mMaxDate.get(Calendar.DAY_OF_YEAR)) { 330e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov return; 33128104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov } 332e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mMaxDate.setTimeInMillis(maxDate); 333e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mCalendarView.setMaxDate(maxDate); 334156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov if (mCurrentDate.after(mMaxDate)) { 335156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis()); 336156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov updateCalendarView(); 337156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } 338156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov updateSpinners(); 33928104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov } 34028104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setEnabled(boolean enabled) { 34351c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov if (mIsEnabled == enabled) { 34451c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov return; 34551c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov } 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setEnabled(enabled); 347e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mDaySpinner.setEnabled(enabled); 348e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mMonthSpinner.setEnabled(enabled); 349e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mYearSpinner.setEnabled(enabled); 350e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mCalendarView.setEnabled(enabled); 35151c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov mIsEnabled = enabled; 35251c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov } 35351c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov 35451c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov @Override 35551c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov public boolean isEnabled() { 35651c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov return mIsEnabled; 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3598a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov @Override 360736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov public void onPopulateAccessibilityEvent(AccessibilityEvent event) { 361736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov super.onPopulateAccessibilityEvent(event); 362736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov 363736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov final int flags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_WEEKDAY 3648a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov | DateUtils.FORMAT_SHOW_YEAR; 3658a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov String selectedDateUtterance = DateUtils.formatDateTime(mContext, 3668a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov mCurrentDate.getTimeInMillis(), flags); 3678a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov event.getText().add(selectedDateUtterance); 3688a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov } 3698a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov 370f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov @Override 371f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov protected void onConfigurationChanged(Configuration newConfig) { 372f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov super.onConfigurationChanged(newConfig); 373f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov setCurrentLocale(newConfig.locale); 374f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov } 375f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 37650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 377e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Gets whether the {@link CalendarView} is shown. 378e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 379e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @return True if the calendar view is shown. 3805f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov * @see #getCalendarView() 381e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov */ 382e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public boolean getCalendarViewShown() { 383e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov return mCalendarView.isShown(); 384e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 385e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 386e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /** 3875f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov * Gets the {@link CalendarView}. 3885f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov * 3895f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov * @return The calendar view. 3905f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov * @see #getCalendarViewShown() 3915f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov */ 3925f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov public CalendarView getCalendarView () { 3935f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov return mCalendarView; 3945f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov } 3955f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov 3965f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov /** 397e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Sets whether the {@link CalendarView} is shown. 398e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 399e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @param shown True if the calendar view is to be shown. 400e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov */ 401e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public void setCalendarViewShown(boolean shown) { 402e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mCalendarView.setVisibility(shown ? VISIBLE : GONE); 403e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 404e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 405e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /** 406e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Gets whether the spinners are shown. 407e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 408e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @return True if the spinners are shown. 40950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 410e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public boolean getSpinnersShown() { 411e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov return mSpinners.isShown(); 412e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 413e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 414e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /** 415e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Sets whether the spinners are shown. 416e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 417e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @param shown True if the spinners are to be shown. 418e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov */ 419e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public void setSpinnersShown(boolean shown) { 420e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mSpinners.setVisibility(shown ? VISIBLE : GONE); 421e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 422e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 423e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /** 424f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov * Sets the current locale. 425f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov * 426f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov * @param locale The current locale. 427f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov */ 428f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov private void setCurrentLocale(Locale locale) { 429f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov if (locale.equals(mCurrentLocale)) { 430f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov return; 431f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov } 432f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 433f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov mCurrentLocale = locale; 434f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 435f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov mTempDate = getCalendarForLocale(mTempDate, locale); 436f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov mMinDate = getCalendarForLocale(mMinDate, locale); 437f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov mMaxDate = getCalendarForLocale(mMaxDate, locale); 438f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov mCurrentDate = getCalendarForLocale(mCurrentDate, locale); 439f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 440f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov mNumberOfMonths = mTempDate.getActualMaximum(Calendar.MONTH) + 1; 441f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov mShortMonths = new String[mNumberOfMonths]; 442f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov for (int i = 0; i < mNumberOfMonths; i++) { 443f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov mShortMonths[i] = DateUtils.getMonthString(Calendar.JANUARY + i, 444f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov DateUtils.LENGTH_MEDIUM); 445f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov } 446f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov } 447f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 448f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov /** 449f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov * Gets a calendar for locale bootstrapped with the value of a given calendar. 450f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov * 451f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov * @param oldCalendar The old calendar. 452f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov * @param locale The locale. 453f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov */ 454f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov private Calendar getCalendarForLocale(Calendar oldCalendar, Locale locale) { 455f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov if (oldCalendar == null) { 456f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov return Calendar.getInstance(locale); 457f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov } else { 458f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov final long currentTimeMillis = oldCalendar.getTimeInMillis(); 459f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov Calendar newCalendar = Calendar.getInstance(locale); 460f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov newCalendar.setTimeInMillis(currentTimeMillis); 461f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov return newCalendar; 462f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov } 463f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov } 464f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 465f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov /** 466f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov * Reorders the spinners according to the date format that is 467f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov * explicitly set by the user and if no such is set fall back 468f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov * to the current locale's default format. 469e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov */ 470e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private void reorderSpinners() { 471f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov mSpinners.removeAllViews(); 472f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov char[] order = DateFormat.getDateFormatOrder(getContext()); 473f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov for (int i = 0; i < order.length; i++) { 474f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov switch (order[i]) { 475f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov case DateFormat.DATE: 476f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov mSpinners.addView(mDaySpinner); 477f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov break; 478f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov case DateFormat.MONTH: 479f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov mSpinners.addView(mMonthSpinner); 480f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov break; 481f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov case DateFormat.YEAR: 482f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov mSpinners.addView(mYearSpinner); 483f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov break; 484f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov default: 485f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov throw new IllegalArgumentException(); 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 49050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 49150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * Updates the current date. 49250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * 49350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * @param year The year. 49450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * @param month The month which is <strong>starting from zero</strong>. 49550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * @param dayOfMonth The day of the month. 49650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 49750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov public void updateDate(int year, int month, int dayOfMonth) { 498156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov if (!isNewDate(year, month, dayOfMonth)) { 499156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov return; 500dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root } 501156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov setDate(year, month, dayOfMonth); 50258f51255eb20f9c4d16c11554f372ff92d45fcc7Svetoslav Ganov updateSpinners(); 50358f51255eb20f9c4d16c11554f372ff92d45fcc7Svetoslav Ganov updateCalendarView(); 504156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov notifyDateChanged(); 505dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root } 506dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root 50750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov // Override so we are in complete control of save / restore for this widget. 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dispatchRestoreInstanceState(SparseArray<Parcelable> container) { 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dispatchThawSelfOnly(container); 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected Parcelable onSaveInstanceState() { 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcelable superState = super.onSaveInstanceState(); 516156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov return new SavedState(superState, getYear(), getMonth(), getDayOfMonth()); 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onRestoreInstanceState(Parcelable state) { 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SavedState ss = (SavedState) state; 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onRestoreInstanceState(ss.getSuperState()); 523156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov setDate(ss.mYear, ss.mMonth, ss.mDay); 52458f51255eb20f9c4d16c11554f372ff92d45fcc7Svetoslav Ganov updateSpinners(); 52558f51255eb20f9c4d16c11554f372ff92d45fcc7Svetoslav Ganov updateCalendarView(); 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 52950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * Initialize the state. If the provided values designate an inconsistent 530e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * date the values are normalized before updating the spinners. 53150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param year The initial year. 53350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * @param monthOfYear The initial month <strong>starting from zero</strong>. 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dayOfMonth The initial day of the month. 53550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * @param onDateChangedListener How user is notified date is changed by 53650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * user, can be null. 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void init(int year, int monthOfYear, int dayOfMonth, 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OnDateChangedListener onDateChangedListener) { 540156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov setDate(year, monthOfYear, dayOfMonth); 54158f51255eb20f9c4d16c11554f372ff92d45fcc7Svetoslav Ganov updateSpinners(); 54258f51255eb20f9c4d16c11554f372ff92d45fcc7Svetoslav Ganov updateCalendarView(); 5432f136a874d240cc7e85e8de9c7644a7daa9532daSvetoslav Ganov mOnDateChangedListener = onDateChangedListener; 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 547e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Parses the given <code>date</code> and in case of success sets the result 548e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * to the <code>outDate</code>. 549a911d4a2b1be7e9ea909a579167826e4a5bac1a3Svetoslav Ganov * 550e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @return True if the date was parsed. 551a911d4a2b1be7e9ea909a579167826e4a5bac1a3Svetoslav Ganov */ 552e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private boolean parseDate(String date, Calendar outDate) { 553e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov try { 554e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov outDate.setTime(mDateFormat.parse(date)); 555e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov return true; 556e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } catch (ParseException e) { 557e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov Log.w(LOG_TAG, "Date: " + date + " not in format: " + DATE_FORMAT); 558e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov return false; 559e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 560a911d4a2b1be7e9ea909a579167826e4a5bac1a3Svetoslav Ganov } 561a911d4a2b1be7e9ea909a579167826e4a5bac1a3Svetoslav Ganov 562156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov private boolean isNewDate(int year, int month, int dayOfMonth) { 563156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov return (mCurrentDate.get(Calendar.YEAR) != year 564156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov || mCurrentDate.get(Calendar.MONTH) != dayOfMonth 565156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov || mCurrentDate.get(Calendar.DAY_OF_MONTH) != month); 566156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } 567e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 568156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov private void setDate(int year, int month, int dayOfMonth) { 569156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mCurrentDate.set(year, month, dayOfMonth); 570e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov if (mCurrentDate.before(mMinDate)) { 571e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis()); 572e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } else if (mCurrentDate.after(mMaxDate)) { 573e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis()); 574e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 575e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 576e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 577156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov private void updateSpinners() { 578156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov // set the spinner ranges respecting the min and max dates 579156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov if (mCurrentDate.equals(mMinDate)) { 580156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setMinValue(mCurrentDate.get(Calendar.DAY_OF_MONTH)); 581156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.DAY_OF_MONTH)); 582156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setWrapSelectorWheel(false); 583156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setDisplayedValues(null); 584156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setMinValue(mCurrentDate.get(Calendar.MONTH)); 585156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.MONTH)); 586156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setWrapSelectorWheel(false); 587156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } else if (mCurrentDate.equals(mMaxDate)) { 588156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setMinValue(mCurrentDate.getActualMinimum(Calendar.DAY_OF_MONTH)); 589156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setMaxValue(mCurrentDate.get(Calendar.DAY_OF_MONTH)); 590156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setWrapSelectorWheel(false); 591156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setDisplayedValues(null); 592156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setMinValue(mCurrentDate.getActualMinimum(Calendar.MONTH)); 593156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setMaxValue(mCurrentDate.get(Calendar.MONTH)); 594156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setWrapSelectorWheel(false); 595156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } else { 596156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setMinValue(1); 597156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.DAY_OF_MONTH)); 598156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setWrapSelectorWheel(true); 599156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setDisplayedValues(null); 600156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setMinValue(0); 601156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setMaxValue(11); 602156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setWrapSelectorWheel(true); 603e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 604e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 605156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov // make sure the month names are a zero based array 606156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov // with the months in the month spinner 607f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov String[] displayedValues = Arrays.copyOfRange(mShortMonths, 608156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.getMinValue(), mMonthSpinner.getMaxValue() + 1); 609156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setDisplayedValues(displayedValues); 610156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov 611156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov // year spinner range does not change based on the current date 612156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mYearSpinner.setMinValue(mMinDate.get(Calendar.YEAR)); 613156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mYearSpinner.setMaxValue(mMaxDate.get(Calendar.YEAR)); 614156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mYearSpinner.setWrapSelectorWheel(false); 615156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov 616156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov // set the spinner values 617156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mYearSpinner.setValue(mCurrentDate.get(Calendar.YEAR)); 618156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setValue(mCurrentDate.get(Calendar.MONTH)); 619156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setValue(mCurrentDate.get(Calendar.DAY_OF_MONTH)); 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 62250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 623156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov * Updates the calendar view with the current date. 62450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 625e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private void updateCalendarView() { 626156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mCalendarView.setDate(mCurrentDate.getTimeInMillis(), false, false); 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 62950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 63050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * @return The selected year. 63150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getYear() { 633156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov return mCurrentDate.get(Calendar.YEAR); 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 63650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 63750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * @return The selected month. 63850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getMonth() { 640156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov return mCurrentDate.get(Calendar.MONTH); 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 64350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 64450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * @return The selected day of month. 64550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getDayOfMonth() { 647156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov return mCurrentDate.get(Calendar.DAY_OF_MONTH); 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6492bf761c20253222a763bce9a63d14c48ab08a556Suchi Amalapurapu 65050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 65150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * Notifies the listener, if such, for a change in the selected date. 65250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 65350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private void notifyDateChanged() { 6548a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); 65550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov if (mOnDateChangedListener != null) { 656156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mOnDateChangedListener.onDateChanged(this, getYear(), getMonth(), getDayOfMonth()); 6572bf761c20253222a763bce9a63d14c48ab08a556Suchi Amalapurapu } 6582bf761c20253222a763bce9a63d14c48ab08a556Suchi Amalapurapu } 659e3491b6b5f1d3fb871074766597b275d9f682faaKenneth Andersson 66050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 66150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * Class for managing state storing/restoring. 66250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 66350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private static class SavedState extends BaseSavedState { 66450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 66550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private final int mYear; 66650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 66750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private final int mMonth; 66850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 66950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private final int mDay; 67050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 67150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 67250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * Constructor called from {@link DatePicker#onSaveInstanceState()} 67350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 67450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private SavedState(Parcelable superState, int year, int month, int day) { 67550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov super(superState); 67650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov mYear = year; 67750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov mMonth = month; 67850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov mDay = day; 67950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov } 68050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 68150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 68250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * Constructor called from {@link #CREATOR} 68350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 68450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private SavedState(Parcel in) { 68550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov super(in); 68650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov mYear = in.readInt(); 68750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov mMonth = in.readInt(); 68850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov mDay = in.readInt(); 689e3491b6b5f1d3fb871074766597b275d9f682faaKenneth Andersson } 69050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 69150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov @Override 69250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov public void writeToParcel(Parcel dest, int flags) { 69350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov super.writeToParcel(dest, flags); 69450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov dest.writeInt(mYear); 69550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov dest.writeInt(mMonth); 69650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov dest.writeInt(mDay); 69750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov } 69850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 69950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov @SuppressWarnings("all") 70050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov // suppress unused and hiding 70150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov public static final Parcelable.Creator<SavedState> CREATOR = new Creator<SavedState>() { 70250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 70350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov public SavedState createFromParcel(Parcel in) { 70450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov return new SavedState(in); 70550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov } 70650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 70750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov public SavedState[] newArray(int size) { 70850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov return new SavedState[size]; 70950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov } 71050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov }; 711e3491b6b5f1d3fb871074766597b275d9f682faaKenneth Andersson } 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 713f114809031c5e5017bf69ab7a6d01024f1745fc8Svetoslav Ganov 714