DatePicker.java revision c49a8be0d2aee5a3d1ff50015a0c0758b0988cfb
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; 333fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganovimport android.view.accessibility.AccessibilityManager; 348a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganovimport android.view.accessibility.AccessibilityNodeInfo; 35a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganovimport android.view.inputmethod.EditorInfo; 366304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganovimport android.view.inputmethod.InputMethodManager; 37cedc446684e94c9971c38c3206f1f224314bda2aSvetoslav Ganovimport android.widget.NumberPicker.OnValueChangeListener; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganovimport com.android.internal.R; 40f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 41e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganovimport java.text.ParseException; 4203a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischerimport java.text.SimpleDateFormat; 43156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganovimport java.util.Arrays; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Calendar; 45dddda8d188408ff18935b1b0e15a00fe012a03daKenny Rootimport java.util.Locale; 46e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganovimport java.util.TimeZone; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 49e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * This class is a widget for selecting a date. The date can be selected by a 50e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * year, month, and day spinners or a {@link CalendarView}. The set of spinners 51e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * and the calendar view are automatically synchronized. The client can 52e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * customize whether only the spinners, or only the calendar view, or both to be 53e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * displayed. Also the minimal and maximal date from which dates to be selected 54e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * can be customized. 5550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * <p> 569a143e6641fa4a5942e7341007d916601402e8dfDirk Dougherty * See the <a href="{@docRoot}resources/tutorials/views/hello-datepicker.html">Date 579a143e6641fa4a5942e7341007d916601402e8dfDirk Dougherty * Picker tutorial</a>. 5850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * </p> 59e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * <p> 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For a dialog using this view, see {@link android.app.DatePickerDialog}. 61e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * </p> 62e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 63e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @attr ref android.R.styleable#DatePicker_startYear 64e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @attr ref android.R.styleable#DatePicker_endYear 65e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @attr ref android.R.styleable#DatePicker_maxDate 66e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @attr ref android.R.styleable#DatePicker_minDate 67e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @attr ref android.R.styleable#DatePicker_spinnersShown 68e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @attr ref android.R.styleable#DatePicker_calendarViewShown 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@Widget 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class DatePicker extends FrameLayout { 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 73e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private static final String LOG_TAG = DatePicker.class.getSimpleName(); 74e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 75e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private static final String DATE_FORMAT = "MM/dd/yyyy"; 76e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int DEFAULT_START_YEAR = 1900; 78dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root 7950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private static final int DEFAULT_END_YEAR = 2100; 80dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root 81e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private static final boolean DEFAULT_CALENDAR_VIEW_SHOWN = true; 82e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 83e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private static final boolean DEFAULT_SPINNERS_SHOWN = true; 8450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 8525f84f323c607bbd9133432fd789ba29b2dcd4d4Svetoslav Ganov private static final boolean DEFAULT_ENABLED_STATE = true; 8625f84f323c607bbd9133432fd789ba29b2dcd4d4Svetoslav Ganov 87e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private final LinearLayout mSpinners; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 89a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov private final NumberPicker mDaySpinner; 90a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov 91e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private final NumberPicker mMonthSpinner; 92e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 93e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private final NumberPicker mYearSpinner; 94e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 956304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov private final EditText mDaySpinnerInput; 966304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov 976304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov private final EditText mMonthSpinnerInput; 986304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov 996304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov private final EditText mYearSpinnerInput; 1006304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov 101e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private final CalendarView mCalendarView; 10250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 103f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov private Locale mCurrentLocale; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 105f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov private OnDateChangedListener mOnDateChangedListener; 10650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 107f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov private String[] mShortMonths; 10850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 109f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov private final java.text.DateFormat mDateFormat = new SimpleDateFormat(DATE_FORMAT); 11050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 111f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov private int mNumberOfMonths; 112dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root 113f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov private Calendar mTempDate; 114e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 115f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov private Calendar mMinDate; 116e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 117f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov private Calendar mMaxDate; 118e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 119f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov private Calendar mCurrentDate; 120e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 12125f84f323c607bbd9133432fd789ba29b2dcd4d4Svetoslav Ganov private boolean mIsEnabled = DEFAULT_ENABLED_STATE; 12251c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 124e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * The callback used to indicate the user changes\d the date. 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface OnDateChangedListener { 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 129e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Called upon a date change. 130e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param view The view associated with this listener. 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param year The year that was set. 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param monthOfYear The month that was set (0-11) for compatibility 13450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * with {@link java.util.Calendar}. 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dayOfMonth The day of the month that was set. 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DatePicker(Context context) { 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, null); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DatePicker(Context context, AttributeSet attrs) { 1454243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov this(context, attrs, R.attr.datePickerStyle); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DatePicker(Context context, AttributeSet attrs, int defStyle) { 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs, defStyle); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 151f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov // initialization based on locale 152f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov setCurrentLocale(Locale.getDefault()); 153f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 1544243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov TypedArray attributesArray = context.obtainStyledAttributes(attrs, R.styleable.DatePicker, 1554243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov defStyle, 0); 156e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov boolean spinnersShown = attributesArray.getBoolean(R.styleable.DatePicker_spinnersShown, 157e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov DEFAULT_SPINNERS_SHOWN); 158e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov boolean calendarViewShown = attributesArray.getBoolean( 159e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov R.styleable.DatePicker_calendarViewShown, DEFAULT_CALENDAR_VIEW_SHOWN); 1604243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov int startYear = attributesArray.getInt(R.styleable.DatePicker_startYear, 1614243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov DEFAULT_START_YEAR); 162e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov int endYear = attributesArray.getInt(R.styleable.DatePicker_endYear, DEFAULT_END_YEAR); 163e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov String minDate = attributesArray.getString(R.styleable.DatePicker_minDate); 164e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov String maxDate = attributesArray.getString(R.styleable.DatePicker_maxDate); 165c49a8be0d2aee5a3d1ff50015a0c0758b0988cfbSvetoslav Ganov int layoutResourceId = attributesArray.getResourceId(R.styleable.DatePicker_internalLayout, 1664243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov R.layout.date_picker); 167e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov attributesArray.recycle(); 168e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 16950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov LayoutInflater inflater = (LayoutInflater) context 17050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 1714243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov inflater.inflate(layoutResourceId, this, true); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 173cedc446684e94c9971c38c3206f1f224314bda2aSvetoslav Ganov OnValueChangeListener onChangeListener = new OnValueChangeListener() { 174e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public void onValueChange(NumberPicker picker, int oldVal, int newVal) { 1756304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov updateInputState(); 176156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mTempDate.setTimeInMillis(mCurrentDate.getTimeInMillis()); 177156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov // take care of wrapping of days and months to update greater fields 178156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov if (picker == mDaySpinner) { 179156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov int maxDayOfMonth = mTempDate.getActualMaximum(Calendar.DAY_OF_MONTH); 180156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov if (oldVal == maxDayOfMonth && newVal == 1) { 181156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mTempDate.add(Calendar.DAY_OF_MONTH, 1); 182156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } else if (oldVal == 1 && newVal == maxDayOfMonth) { 183156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mTempDate.add(Calendar.DAY_OF_MONTH, -1); 184156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } else { 185156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mTempDate.add(Calendar.DAY_OF_MONTH, newVal - oldVal); 186156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } 187156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } else if (picker == mMonthSpinner) { 188156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov if (oldVal == 11 && newVal == 0) { 189156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mTempDate.add(Calendar.MONTH, 1); 190156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } else if (oldVal == 0 && newVal == 11) { 191156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mTempDate.add(Calendar.MONTH, -1); 192156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } else { 193156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mTempDate.add(Calendar.MONTH, newVal - oldVal); 194156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } 195156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } else if (picker == mYearSpinner) { 196156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mTempDate.set(Calendar.YEAR, newVal); 197156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } else { 198156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov throw new IllegalArgumentException(); 199156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } 200156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov // now set the date to the adjusted one 201156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov setDate(mTempDate.get(Calendar.YEAR), mTempDate.get(Calendar.MONTH), 202156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mTempDate.get(Calendar.DAY_OF_MONTH)); 20358f51255eb20f9c4d16c11554f372ff92d45fcc7Svetoslav Ganov updateSpinners(); 20458f51255eb20f9c4d16c11554f372ff92d45fcc7Svetoslav Ganov updateCalendarView(); 205156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov notifyDateChanged(); 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov }; 2085fe1e6221ea3bab3120f5b9c0ceacaf59d116c05Eric Fischer 209e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mSpinners = (LinearLayout) findViewById(R.id.pickers); 210e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 211e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov // calendar view day-picker 212e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mCalendarView = (CalendarView) findViewById(R.id.calendar_view); 213e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mCalendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() { 214e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public void onSelectedDayChange(CalendarView view, int year, int month, int monthDay) { 215156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov setDate(year, month, monthDay); 21658f51255eb20f9c4d16c11554f372ff92d45fcc7Svetoslav Ganov updateSpinners(); 217156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov notifyDateChanged(); 21828104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov } 21928104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov }); 22028104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov 22150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov // day 222e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mDaySpinner = (NumberPicker) findViewById(R.id.day); 223e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mDaySpinner.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER); 224e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mDaySpinner.setOnLongPressUpdateInterval(100); 225e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mDaySpinner.setOnValueChangedListener(onChangeListener); 2266304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov mDaySpinnerInput = (EditText) mDaySpinner.findViewById(R.id.numberpicker_input); 2275fe1e6221ea3bab3120f5b9c0ceacaf59d116c05Eric Fischer 22850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov // month 229e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mMonthSpinner = (NumberPicker) findViewById(R.id.month); 230e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mMonthSpinner.setMinValue(0); 231e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mMonthSpinner.setMaxValue(mNumberOfMonths - 1); 232f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov mMonthSpinner.setDisplayedValues(mShortMonths); 233e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mMonthSpinner.setOnLongPressUpdateInterval(200); 234e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mMonthSpinner.setOnValueChangedListener(onChangeListener); 2356304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov mMonthSpinnerInput = (EditText) mMonthSpinner.findViewById(R.id.numberpicker_input); 23650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 23750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov // year 238e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mYearSpinner = (NumberPicker) findViewById(R.id.year); 239e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mYearSpinner.setOnLongPressUpdateInterval(100); 240e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mYearSpinner.setOnValueChangedListener(onChangeListener); 2416304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov mYearSpinnerInput = (EditText) mYearSpinner.findViewById(R.id.numberpicker_input); 242e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 243e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov // show only what the user required but make sure we 244e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov // show something and the spinners have higher priority 245e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov if (!spinnersShown && !calendarViewShown) { 246e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov setSpinnersShown(true); 247e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } else { 248e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov setSpinnersShown(spinnersShown); 249e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov setCalendarViewShown(calendarViewShown); 25013427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov } 251e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 25213427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov // set the min date giving priority of the minDate over startYear 25313427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov mTempDate.clear(); 25413427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov if (!TextUtils.isEmpty(minDate)) { 25513427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov if (!parseDate(minDate, mTempDate)) { 256e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mTempDate.set(startYear, 0, 1); 257e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 25813427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov } else { 25913427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov mTempDate.set(startYear, 0, 1); 26013427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov } 26113427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov setMinDate(mTempDate.getTimeInMillis()); 26213427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov 26313427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov // set the max date giving priority of the maxDate over endYear 26413427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov mTempDate.clear(); 26513427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov if (!TextUtils.isEmpty(maxDate)) { 26613427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov if (!parseDate(maxDate, mTempDate)) { 267e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mTempDate.set(endYear, 11, 31); 268e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 26913427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov } else { 27013427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov mTempDate.set(endYear, 11, 31); 271e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 27213427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov setMaxDate(mTempDate.getTimeInMillis()); 27313427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov 27413427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov // initialize to current date 27513427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov mCurrentDate.setTimeInMillis(System.currentTimeMillis()); 27613427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov init(mCurrentDate.get(Calendar.YEAR), mCurrentDate.get(Calendar.MONTH), mCurrentDate 27713427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov .get(Calendar.DAY_OF_MONTH), null); 278e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 279e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov // re-order the number spinners to match the current date format 280e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov reorderSpinners(); 2813fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov 2823fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov // set content descriptions 2833fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov if (AccessibilityManager.getInstance(mContext).isEnabled()) { 2843fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov setContentDescriptions(); 2853fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov } 286e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 287e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 288e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /** 289e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Gets the minimal date supported by this {@link DatePicker} in 290e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * milliseconds since January 1, 1970 00:00:00 in 291e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * {@link TimeZone#getDefault()} time zone. 292e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * <p> 293e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Note: The default minimal date is 01/01/1900. 294e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * <p> 295e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 296e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @return The minimal supported date. 297e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov */ 298e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public long getMinDate() { 299e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov return mCalendarView.getMinDate(); 300e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 301e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 302e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /** 303e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Sets the minimal date supported by this {@link NumberPicker} in 304e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * milliseconds since January 1, 1970 00:00:00 in 305e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * {@link TimeZone#getDefault()} time zone. 306e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 307e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @param minDate The minimal supported date. 308e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov */ 309e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public void setMinDate(long minDate) { 310e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mTempDate.setTimeInMillis(minDate); 311e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov if (mTempDate.get(Calendar.YEAR) == mMinDate.get(Calendar.YEAR) 312e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov && mTempDate.get(Calendar.DAY_OF_YEAR) != mMinDate.get(Calendar.DAY_OF_YEAR)) { 313e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov return; 314e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 315e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mMinDate.setTimeInMillis(minDate); 316e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mCalendarView.setMinDate(minDate); 317156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov if (mCurrentDate.before(mMinDate)) { 318156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis()); 319156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov updateCalendarView(); 320156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } 321156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov updateSpinners(); 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 32428104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov /** 325e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Gets the maximal date supported by this {@link DatePicker} in 326e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * milliseconds since January 1, 1970 00:00:00 in 327e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * {@link TimeZone#getDefault()} time zone. 328e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * <p> 329e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Note: The default maximal date is 12/31/2100. 33028104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov * <p> 33128104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov * 332e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @return The maximal supported date. 333e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov */ 334e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public long getMaxDate() { 335e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov return mCalendarView.getMaxDate(); 336e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 337e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 338e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /** 339e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Sets the maximal date supported by this {@link DatePicker} in 340e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * milliseconds since January 1, 1970 00:00:00 in 341e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * {@link TimeZone#getDefault()} time zone. 342e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 343e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @param maxDate The maximal supported date. 34428104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov */ 345e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public void setMaxDate(long maxDate) { 346e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mTempDate.setTimeInMillis(maxDate); 347e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov if (mTempDate.get(Calendar.YEAR) == mMaxDate.get(Calendar.YEAR) 348e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov && mTempDate.get(Calendar.DAY_OF_YEAR) != mMaxDate.get(Calendar.DAY_OF_YEAR)) { 349e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov return; 35028104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov } 351e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mMaxDate.setTimeInMillis(maxDate); 352e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mCalendarView.setMaxDate(maxDate); 353156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov if (mCurrentDate.after(mMaxDate)) { 354156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis()); 355156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov updateCalendarView(); 356156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } 357156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov updateSpinners(); 35828104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov } 35928104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setEnabled(boolean enabled) { 36251c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov if (mIsEnabled == enabled) { 36351c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov return; 36451c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov } 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setEnabled(enabled); 366e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mDaySpinner.setEnabled(enabled); 367e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mMonthSpinner.setEnabled(enabled); 368e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mYearSpinner.setEnabled(enabled); 369e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mCalendarView.setEnabled(enabled); 37051c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov mIsEnabled = enabled; 37151c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov } 37251c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov 37351c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov @Override 37451c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov public boolean isEnabled() { 37551c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov return mIsEnabled; 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3788a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov @Override 3793fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { 3803fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov onPopulateAccessibilityEvent(event); 3813fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov return true; 3823fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov } 3833fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov 3843fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov @Override 385736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov public void onPopulateAccessibilityEvent(AccessibilityEvent event) { 386736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov super.onPopulateAccessibilityEvent(event); 387736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov 3883fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov final int flags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR; 3898a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov String selectedDateUtterance = DateUtils.formatDateTime(mContext, 3908a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov mCurrentDate.getTimeInMillis(), flags); 3918a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov event.getText().add(selectedDateUtterance); 3928a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov } 3938a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov 394f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov @Override 3958a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov public void onInitializeAccessibilityEvent(AccessibilityEvent event) { 3968a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov super.onInitializeAccessibilityEvent(event); 3978a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov event.setClassName(DatePicker.class.getName()); 3988a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov } 3998a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov 4008a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov @Override 4018a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { 4028a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov super.onInitializeAccessibilityNodeInfo(info); 4038a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov info.setClassName(DatePicker.class.getName()); 4048a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov } 4058a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov 4068a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov @Override 407f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov protected void onConfigurationChanged(Configuration newConfig) { 408f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov super.onConfigurationChanged(newConfig); 409f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov setCurrentLocale(newConfig.locale); 410f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov } 411f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 41250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 413e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Gets whether the {@link CalendarView} is shown. 414e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 415e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @return True if the calendar view is shown. 4165f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov * @see #getCalendarView() 417e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov */ 418e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public boolean getCalendarViewShown() { 419e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov return mCalendarView.isShown(); 420e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 421e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 422e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /** 4235f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov * Gets the {@link CalendarView}. 4245f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov * 4255f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov * @return The calendar view. 4265f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov * @see #getCalendarViewShown() 4275f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov */ 4285f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov public CalendarView getCalendarView () { 4295f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov return mCalendarView; 4305f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov } 4315f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov 4325f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov /** 433e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Sets whether the {@link CalendarView} is shown. 434e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 435e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @param shown True if the calendar view is to be shown. 436e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov */ 437e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public void setCalendarViewShown(boolean shown) { 438e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mCalendarView.setVisibility(shown ? VISIBLE : GONE); 439e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 440e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 441e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /** 442e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Gets whether the spinners are shown. 443e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 444e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @return True if the spinners are shown. 44550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 446e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public boolean getSpinnersShown() { 447e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov return mSpinners.isShown(); 448e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 449e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 450e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /** 451e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Sets whether the spinners are shown. 452e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 453e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @param shown True if the spinners are to be shown. 454e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov */ 455e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public void setSpinnersShown(boolean shown) { 456e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mSpinners.setVisibility(shown ? VISIBLE : GONE); 457e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 458e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 459e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /** 460f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov * Sets the current locale. 461f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov * 462f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov * @param locale The current locale. 463f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov */ 464f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov private void setCurrentLocale(Locale locale) { 465f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov if (locale.equals(mCurrentLocale)) { 466f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov return; 467f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov } 468f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 469f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov mCurrentLocale = locale; 470f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 471f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov mTempDate = getCalendarForLocale(mTempDate, locale); 472f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov mMinDate = getCalendarForLocale(mMinDate, locale); 473f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov mMaxDate = getCalendarForLocale(mMaxDate, locale); 474f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov mCurrentDate = getCalendarForLocale(mCurrentDate, locale); 475f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 476f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov mNumberOfMonths = mTempDate.getActualMaximum(Calendar.MONTH) + 1; 477f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov mShortMonths = new String[mNumberOfMonths]; 478f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov for (int i = 0; i < mNumberOfMonths; i++) { 479f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov mShortMonths[i] = DateUtils.getMonthString(Calendar.JANUARY + i, 480f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov DateUtils.LENGTH_MEDIUM); 481f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov } 482f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov } 483f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 484f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov /** 485f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov * Gets a calendar for locale bootstrapped with the value of a given calendar. 486f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov * 487f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov * @param oldCalendar The old calendar. 488f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov * @param locale The locale. 489f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov */ 490f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov private Calendar getCalendarForLocale(Calendar oldCalendar, Locale locale) { 491f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov if (oldCalendar == null) { 492f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov return Calendar.getInstance(locale); 493f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov } else { 494f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov final long currentTimeMillis = oldCalendar.getTimeInMillis(); 495f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov Calendar newCalendar = Calendar.getInstance(locale); 496f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov newCalendar.setTimeInMillis(currentTimeMillis); 497f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov return newCalendar; 498f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov } 499f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov } 500f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 501f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov /** 502f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov * Reorders the spinners according to the date format that is 503f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov * explicitly set by the user and if no such is set fall back 504f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov * to the current locale's default format. 505e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov */ 506e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private void reorderSpinners() { 507f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov mSpinners.removeAllViews(); 508f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov char[] order = DateFormat.getDateFormatOrder(getContext()); 509a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov final int spinnerCount = order.length; 510a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov for (int i = 0; i < spinnerCount; i++) { 511f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov switch (order[i]) { 512f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov case DateFormat.DATE: 513f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov mSpinners.addView(mDaySpinner); 514a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov setImeOptions(mDaySpinner, spinnerCount, i); 515f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov break; 516f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov case DateFormat.MONTH: 517f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov mSpinners.addView(mMonthSpinner); 518a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov setImeOptions(mMonthSpinner, spinnerCount, i); 519f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov break; 520f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov case DateFormat.YEAR: 521f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov mSpinners.addView(mYearSpinner); 522a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov setImeOptions(mYearSpinner, spinnerCount, i); 523f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov break; 524f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov default: 525f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov throw new IllegalArgumentException(); 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 53150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * Updates the current date. 53250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * 53350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * @param year The year. 53450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * @param month The month which is <strong>starting from zero</strong>. 53550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * @param dayOfMonth The day of the month. 53650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 53750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov public void updateDate(int year, int month, int dayOfMonth) { 538156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov if (!isNewDate(year, month, dayOfMonth)) { 539156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov return; 540dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root } 541156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov setDate(year, month, dayOfMonth); 54258f51255eb20f9c4d16c11554f372ff92d45fcc7Svetoslav Ganov updateSpinners(); 54358f51255eb20f9c4d16c11554f372ff92d45fcc7Svetoslav Ganov updateCalendarView(); 544156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov notifyDateChanged(); 545dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root } 546dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root 54750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov // Override so we are in complete control of save / restore for this widget. 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dispatchRestoreInstanceState(SparseArray<Parcelable> container) { 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dispatchThawSelfOnly(container); 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected Parcelable onSaveInstanceState() { 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcelable superState = super.onSaveInstanceState(); 556156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov return new SavedState(superState, getYear(), getMonth(), getDayOfMonth()); 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onRestoreInstanceState(Parcelable state) { 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SavedState ss = (SavedState) state; 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onRestoreInstanceState(ss.getSuperState()); 563156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov setDate(ss.mYear, ss.mMonth, ss.mDay); 56458f51255eb20f9c4d16c11554f372ff92d45fcc7Svetoslav Ganov updateSpinners(); 56558f51255eb20f9c4d16c11554f372ff92d45fcc7Svetoslav Ganov updateCalendarView(); 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 56950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * Initialize the state. If the provided values designate an inconsistent 570e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * date the values are normalized before updating the spinners. 57150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param year The initial year. 57350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * @param monthOfYear The initial month <strong>starting from zero</strong>. 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dayOfMonth The initial day of the month. 57550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * @param onDateChangedListener How user is notified date is changed by 57650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * user, can be null. 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void init(int year, int monthOfYear, int dayOfMonth, 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OnDateChangedListener onDateChangedListener) { 580156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov setDate(year, monthOfYear, dayOfMonth); 58158f51255eb20f9c4d16c11554f372ff92d45fcc7Svetoslav Ganov updateSpinners(); 58258f51255eb20f9c4d16c11554f372ff92d45fcc7Svetoslav Ganov updateCalendarView(); 5832f136a874d240cc7e85e8de9c7644a7daa9532daSvetoslav Ganov mOnDateChangedListener = onDateChangedListener; 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 58650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 587e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Parses the given <code>date</code> and in case of success sets the result 588e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * to the <code>outDate</code>. 589a911d4a2b1be7e9ea909a579167826e4a5bac1a3Svetoslav Ganov * 590e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @return True if the date was parsed. 591a911d4a2b1be7e9ea909a579167826e4a5bac1a3Svetoslav Ganov */ 592e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private boolean parseDate(String date, Calendar outDate) { 593e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov try { 594e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov outDate.setTime(mDateFormat.parse(date)); 595e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov return true; 596e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } catch (ParseException e) { 597e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov Log.w(LOG_TAG, "Date: " + date + " not in format: " + DATE_FORMAT); 598e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov return false; 599e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 600a911d4a2b1be7e9ea909a579167826e4a5bac1a3Svetoslav Ganov } 601a911d4a2b1be7e9ea909a579167826e4a5bac1a3Svetoslav Ganov 602156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov private boolean isNewDate(int year, int month, int dayOfMonth) { 603156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov return (mCurrentDate.get(Calendar.YEAR) != year 604156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov || mCurrentDate.get(Calendar.MONTH) != dayOfMonth 605156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov || mCurrentDate.get(Calendar.DAY_OF_MONTH) != month); 606156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } 607e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 608156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov private void setDate(int year, int month, int dayOfMonth) { 609156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mCurrentDate.set(year, month, dayOfMonth); 610e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov if (mCurrentDate.before(mMinDate)) { 611e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis()); 612e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } else if (mCurrentDate.after(mMaxDate)) { 613e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis()); 614e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 615e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 616e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 617156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov private void updateSpinners() { 618156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov // set the spinner ranges respecting the min and max dates 619156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov if (mCurrentDate.equals(mMinDate)) { 620156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setMinValue(mCurrentDate.get(Calendar.DAY_OF_MONTH)); 621156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.DAY_OF_MONTH)); 622156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setWrapSelectorWheel(false); 623156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setDisplayedValues(null); 624156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setMinValue(mCurrentDate.get(Calendar.MONTH)); 625156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.MONTH)); 626156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setWrapSelectorWheel(false); 627156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } else if (mCurrentDate.equals(mMaxDate)) { 628156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setMinValue(mCurrentDate.getActualMinimum(Calendar.DAY_OF_MONTH)); 629156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setMaxValue(mCurrentDate.get(Calendar.DAY_OF_MONTH)); 630156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setWrapSelectorWheel(false); 631156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setDisplayedValues(null); 632156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setMinValue(mCurrentDate.getActualMinimum(Calendar.MONTH)); 633156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setMaxValue(mCurrentDate.get(Calendar.MONTH)); 634156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setWrapSelectorWheel(false); 635156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } else { 636156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setMinValue(1); 637156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.DAY_OF_MONTH)); 638156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setWrapSelectorWheel(true); 639156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setDisplayedValues(null); 640156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setMinValue(0); 641156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setMaxValue(11); 642156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setWrapSelectorWheel(true); 643e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 644e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 645156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov // make sure the month names are a zero based array 646156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov // with the months in the month spinner 647f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov String[] displayedValues = Arrays.copyOfRange(mShortMonths, 648156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.getMinValue(), mMonthSpinner.getMaxValue() + 1); 649156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setDisplayedValues(displayedValues); 650156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov 651156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov // year spinner range does not change based on the current date 652156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mYearSpinner.setMinValue(mMinDate.get(Calendar.YEAR)); 653156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mYearSpinner.setMaxValue(mMaxDate.get(Calendar.YEAR)); 654156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mYearSpinner.setWrapSelectorWheel(false); 655156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov 656156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov // set the spinner values 657156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mYearSpinner.setValue(mCurrentDate.get(Calendar.YEAR)); 658156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setValue(mCurrentDate.get(Calendar.MONTH)); 659156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setValue(mCurrentDate.get(Calendar.DAY_OF_MONTH)); 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 66250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 663156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov * Updates the calendar view with the current date. 66450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 665e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private void updateCalendarView() { 666156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mCalendarView.setDate(mCurrentDate.getTimeInMillis(), false, false); 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 66950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 67050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * @return The selected year. 67150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getYear() { 673156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov return mCurrentDate.get(Calendar.YEAR); 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 67650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 67750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * @return The selected month. 67850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getMonth() { 680156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov return mCurrentDate.get(Calendar.MONTH); 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 68350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 68450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * @return The selected day of month. 68550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getDayOfMonth() { 687156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov return mCurrentDate.get(Calendar.DAY_OF_MONTH); 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6892bf761c20253222a763bce9a63d14c48ab08a556Suchi Amalapurapu 69050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 69150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * Notifies the listener, if such, for a change in the selected date. 69250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 69350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private void notifyDateChanged() { 6948a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); 69550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov if (mOnDateChangedListener != null) { 696156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mOnDateChangedListener.onDateChanged(this, getYear(), getMonth(), getDayOfMonth()); 6972bf761c20253222a763bce9a63d14c48ab08a556Suchi Amalapurapu } 6982bf761c20253222a763bce9a63d14c48ab08a556Suchi Amalapurapu } 699e3491b6b5f1d3fb871074766597b275d9f682faaKenneth Andersson 70050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 701a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov * Sets the IME options for a spinner based on its ordering. 702a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov * 703a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov * @param spinner The spinner. 704a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov * @param spinnerCount The total spinner count. 705a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov * @param spinnerIndex The index of the given spinner. 706a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov */ 707a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov private void setImeOptions(NumberPicker spinner, int spinnerCount, int spinnerIndex) { 708a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov final int imeOptions; 709a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov if (spinnerIndex < spinnerCount - 1) { 710a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov imeOptions = EditorInfo.IME_ACTION_NEXT; 711a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov } else { 712a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov imeOptions = EditorInfo.IME_ACTION_DONE; 713a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov } 714a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov TextView input = (TextView) spinner.findViewById(R.id.numberpicker_input); 715a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov input.setImeOptions(imeOptions); 716a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov } 717a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov 718a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov private void setContentDescriptions() { 719a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov // Day 720a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov String text = mContext.getString(R.string.date_picker_increment_day_button); 721a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov mDaySpinner.findViewById(R.id.increment).setContentDescription(text); 722a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov text = mContext.getString(R.string.date_picker_decrement_day_button); 723a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov mDaySpinner.findViewById(R.id.decrement).setContentDescription(text); 724a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov // Month 725a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov text = mContext.getString(R.string.date_picker_increment_month_button); 726a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov mMonthSpinner.findViewById(R.id.increment).setContentDescription(text); 727a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov text = mContext.getString(R.string.date_picker_decrement_month_button); 728a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov mMonthSpinner.findViewById(R.id.decrement).setContentDescription(text); 729a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov // Year 730a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov text = mContext.getString(R.string.date_picker_increment_year_button); 731a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov mYearSpinner.findViewById(R.id.increment).setContentDescription(text); 732a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov text = mContext.getString(R.string.date_picker_decrement_year_button); 733a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov mYearSpinner.findViewById(R.id.decrement).setContentDescription(text); 734a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov } 735a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov 7366304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov private void updateInputState() { 7376304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov // Make sure that if the user changes the value and the IME is active 7386304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov // for one of the inputs if this widget, the IME is closed. If the user 7396304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov // changed the value via the IME and there is a next input the IME will 7406304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov // be shown, otherwise the user chose another means of changing the 7416304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov // value and having the IME up makes no sense. 7426304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov InputMethodManager inputMethodManager = InputMethodManager.peekInstance(); 7436304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov if (inputMethodManager != null) { 7446304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov if (inputMethodManager.isActive(mYearSpinnerInput)) { 7456304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov mYearSpinnerInput.clearFocus(); 7466304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0); 7476304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov } else if (inputMethodManager.isActive(mMonthSpinnerInput)) { 7486304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov mMonthSpinnerInput.clearFocus(); 7496304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0); 7506304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov } else if (inputMethodManager.isActive(mDaySpinnerInput)) { 7516304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov mDaySpinnerInput.clearFocus(); 7526304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0); 7536304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov } 7546304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov } 7556304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov } 7566304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov 757a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov /** 75850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * Class for managing state storing/restoring. 75950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 76050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private static class SavedState extends BaseSavedState { 76150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 76250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private final int mYear; 76350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 76450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private final int mMonth; 76550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 76650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private final int mDay; 76750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 76850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 76950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * Constructor called from {@link DatePicker#onSaveInstanceState()} 77050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 77150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private SavedState(Parcelable superState, int year, int month, int day) { 77250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov super(superState); 77350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov mYear = year; 77450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov mMonth = month; 77550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov mDay = day; 77650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov } 77750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 77850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 77950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * Constructor called from {@link #CREATOR} 78050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 78150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private SavedState(Parcel in) { 78250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov super(in); 78350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov mYear = in.readInt(); 78450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov mMonth = in.readInt(); 78550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov mDay = in.readInt(); 786e3491b6b5f1d3fb871074766597b275d9f682faaKenneth Andersson } 78750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 78850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov @Override 78950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov public void writeToParcel(Parcel dest, int flags) { 79050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov super.writeToParcel(dest, flags); 79150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov dest.writeInt(mYear); 79250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov dest.writeInt(mMonth); 79350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov dest.writeInt(mDay); 79450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov } 79550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 79650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov @SuppressWarnings("all") 79750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov // suppress unused and hiding 79850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov public static final Parcelable.Creator<SavedState> CREATOR = new Creator<SavedState>() { 79950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 80050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov public SavedState createFromParcel(Parcel in) { 80150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov return new SavedState(in); 80250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov } 80350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 80450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov public SavedState[] newArray(int size) { 80550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov return new SavedState[size]; 80650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov } 80750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov }; 808e3491b6b5f1d3fb871074766597b275d9f682faaKenneth Andersson } 8093fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov} 810