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; 32d11e6151fe88314505fa7adca6278de2e772b11cSvetoslav Ganovimport android.view.View; 338a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganovimport android.view.accessibility.AccessibilityEvent; 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> 564c359b76f9a030f92a302ba74a528faa170bad4eScott Main * See the <a href="{@docRoot}guide/topics/ui/controls/pickers.html">Pickers</a> 574c359b76f9a030f92a302ba74a528faa170bad4eScott Main * guide. 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); 223d88e3054d08b1f821bb2e27b2647aa16a60d8742Fabrice Di Meglio mDaySpinner.setFormatter(NumberPicker.getTwoDigitFormatter()); 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 2824213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov // accessibility 283d11e6151fe88314505fa7adca6278de2e772b11cSvetoslav Ganov setContentDescriptions(); 2844213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov 2854213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov // If not explicitly specified this view is important for accessibility. 2864213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov if (getImportantForAccessibility() == IMPORTANT_FOR_ACCESSIBILITY_AUTO) { 2874213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES); 2884213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov } 289e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 290e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 291e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /** 292e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Gets the minimal date supported by this {@link DatePicker} in 293e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * milliseconds since January 1, 1970 00:00:00 in 294e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * {@link TimeZone#getDefault()} time zone. 295e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * <p> 296e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Note: The default minimal date is 01/01/1900. 297e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * <p> 298e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 299e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @return The minimal supported date. 300e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov */ 301e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public long getMinDate() { 302e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov return mCalendarView.getMinDate(); 303e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 304e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 305e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /** 306e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Sets the minimal date supported by this {@link NumberPicker} in 307e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * milliseconds since January 1, 1970 00:00:00 in 308e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * {@link TimeZone#getDefault()} time zone. 309e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 310e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @param minDate The minimal supported date. 311e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov */ 312e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public void setMinDate(long minDate) { 313e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mTempDate.setTimeInMillis(minDate); 314e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov if (mTempDate.get(Calendar.YEAR) == mMinDate.get(Calendar.YEAR) 315e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov && mTempDate.get(Calendar.DAY_OF_YEAR) != mMinDate.get(Calendar.DAY_OF_YEAR)) { 316e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov return; 317e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 318e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mMinDate.setTimeInMillis(minDate); 319e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mCalendarView.setMinDate(minDate); 320156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov if (mCurrentDate.before(mMinDate)) { 321156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis()); 322156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov updateCalendarView(); 323156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } 324156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov updateSpinners(); 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 32728104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov /** 328e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Gets the maximal date supported by this {@link DatePicker} in 329e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * milliseconds since January 1, 1970 00:00:00 in 330e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * {@link TimeZone#getDefault()} time zone. 331e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * <p> 332e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Note: The default maximal date is 12/31/2100. 33328104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov * <p> 33428104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov * 335e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @return The maximal supported date. 336e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov */ 337e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public long getMaxDate() { 338e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov return mCalendarView.getMaxDate(); 339e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 340e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 341e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /** 342e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Sets the maximal date supported by this {@link DatePicker} in 343e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * milliseconds since January 1, 1970 00:00:00 in 344e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * {@link TimeZone#getDefault()} time zone. 345e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 346e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @param maxDate The maximal supported date. 34728104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov */ 348e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public void setMaxDate(long maxDate) { 349e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mTempDate.setTimeInMillis(maxDate); 350e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov if (mTempDate.get(Calendar.YEAR) == mMaxDate.get(Calendar.YEAR) 351e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov && mTempDate.get(Calendar.DAY_OF_YEAR) != mMaxDate.get(Calendar.DAY_OF_YEAR)) { 352e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov return; 35328104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov } 354e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mMaxDate.setTimeInMillis(maxDate); 355e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mCalendarView.setMaxDate(maxDate); 356156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov if (mCurrentDate.after(mMaxDate)) { 357156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis()); 358156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov updateCalendarView(); 359156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } 360156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov updateSpinners(); 36128104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov } 36228104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setEnabled(boolean enabled) { 36551c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov if (mIsEnabled == enabled) { 36651c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov return; 36751c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov } 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setEnabled(enabled); 369e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mDaySpinner.setEnabled(enabled); 370e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mMonthSpinner.setEnabled(enabled); 371e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mYearSpinner.setEnabled(enabled); 372e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mCalendarView.setEnabled(enabled); 37351c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov mIsEnabled = enabled; 37451c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov } 37551c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov 37651c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov @Override 37751c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov public boolean isEnabled() { 37851c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov return mIsEnabled; 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3818a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov @Override 3823fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { 3833fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov onPopulateAccessibilityEvent(event); 3843fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov return true; 3853fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov } 3863fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov 3873fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov @Override 388736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov public void onPopulateAccessibilityEvent(AccessibilityEvent event) { 389736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov super.onPopulateAccessibilityEvent(event); 390736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov 3913fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov final int flags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR; 3928a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov String selectedDateUtterance = DateUtils.formatDateTime(mContext, 3938a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov mCurrentDate.getTimeInMillis(), flags); 3948a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov event.getText().add(selectedDateUtterance); 3958a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov } 3968a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov 397f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov @Override 3988a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov public void onInitializeAccessibilityEvent(AccessibilityEvent event) { 3998a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov super.onInitializeAccessibilityEvent(event); 4008a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov event.setClassName(DatePicker.class.getName()); 4018a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov } 4028a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov 4038a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov @Override 4048a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { 4058a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov super.onInitializeAccessibilityNodeInfo(info); 4068a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov info.setClassName(DatePicker.class.getName()); 4078a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov } 4088a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov 4098a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov @Override 410f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov protected void onConfigurationChanged(Configuration newConfig) { 411f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov super.onConfigurationChanged(newConfig); 412f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov setCurrentLocale(newConfig.locale); 413f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov } 414f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 41550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 416e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Gets whether the {@link CalendarView} is shown. 417e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 418e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @return True if the calendar view is shown. 4195f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov * @see #getCalendarView() 420e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov */ 421e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public boolean getCalendarViewShown() { 422e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov return mCalendarView.isShown(); 423e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 424e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 425e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /** 4265f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov * Gets the {@link CalendarView}. 4275f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov * 4285f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov * @return The calendar view. 4295f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov * @see #getCalendarViewShown() 4305f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov */ 4315f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov public CalendarView getCalendarView () { 4325f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov return mCalendarView; 4335f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov } 4345f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov 4355f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov /** 436e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Sets whether the {@link CalendarView} is shown. 437e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 438e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @param shown True if the calendar view is to be shown. 439e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov */ 440e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public void setCalendarViewShown(boolean shown) { 441e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mCalendarView.setVisibility(shown ? VISIBLE : GONE); 442e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 443e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 444e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /** 445e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Gets whether the spinners are shown. 446e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 447e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @return True if the spinners are shown. 44850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 449e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public boolean getSpinnersShown() { 450e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov return mSpinners.isShown(); 451e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 452e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 453e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /** 454e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Sets whether the spinners are shown. 455e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 456e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @param shown True if the spinners are to be shown. 457e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov */ 458e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public void setSpinnersShown(boolean shown) { 459e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mSpinners.setVisibility(shown ? VISIBLE : GONE); 460e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 461e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 462e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /** 463f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov * Sets the current locale. 464f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov * 465f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov * @param locale The current locale. 466f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov */ 467f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov private void setCurrentLocale(Locale locale) { 468f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov if (locale.equals(mCurrentLocale)) { 469f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov return; 470f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov } 471f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 472f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov mCurrentLocale = locale; 473f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 474f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov mTempDate = getCalendarForLocale(mTempDate, locale); 475f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov mMinDate = getCalendarForLocale(mMinDate, locale); 476f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov mMaxDate = getCalendarForLocale(mMaxDate, locale); 477f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov mCurrentDate = getCalendarForLocale(mCurrentDate, locale); 478f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 479f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov mNumberOfMonths = mTempDate.getActualMaximum(Calendar.MONTH) + 1; 480f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov mShortMonths = new String[mNumberOfMonths]; 481f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov for (int i = 0; i < mNumberOfMonths; i++) { 482f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov mShortMonths[i] = DateUtils.getMonthString(Calendar.JANUARY + i, 483f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov DateUtils.LENGTH_MEDIUM); 484f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov } 485f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov } 486f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 487f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov /** 488f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov * Gets a calendar for locale bootstrapped with the value of a given calendar. 489f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov * 490f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov * @param oldCalendar The old calendar. 491f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov * @param locale The locale. 492f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov */ 493f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov private Calendar getCalendarForLocale(Calendar oldCalendar, Locale locale) { 494f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov if (oldCalendar == null) { 495f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov return Calendar.getInstance(locale); 496f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov } else { 497f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov final long currentTimeMillis = oldCalendar.getTimeInMillis(); 498f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov Calendar newCalendar = Calendar.getInstance(locale); 499f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov newCalendar.setTimeInMillis(currentTimeMillis); 500f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov return newCalendar; 501f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov } 502f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov } 503f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 504f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov /** 505f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov * Reorders the spinners according to the date format that is 506f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov * explicitly set by the user and if no such is set fall back 507f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov * to the current locale's default format. 508e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov */ 509e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private void reorderSpinners() { 510f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov mSpinners.removeAllViews(); 511f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov char[] order = DateFormat.getDateFormatOrder(getContext()); 512a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov final int spinnerCount = order.length; 513a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov for (int i = 0; i < spinnerCount; i++) { 514f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov switch (order[i]) { 515f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov case DateFormat.DATE: 516f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov mSpinners.addView(mDaySpinner); 517a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov setImeOptions(mDaySpinner, spinnerCount, i); 518f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov break; 519f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov case DateFormat.MONTH: 520f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov mSpinners.addView(mMonthSpinner); 521a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov setImeOptions(mMonthSpinner, spinnerCount, i); 522f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov break; 523f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov case DateFormat.YEAR: 524f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov mSpinners.addView(mYearSpinner); 525a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov setImeOptions(mYearSpinner, spinnerCount, i); 526f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov break; 527f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov default: 528f583dd37643f495642cd64e9b8e6a0a9e0836ff1Svetoslav Ganov throw new IllegalArgumentException(); 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 53450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * Updates the current date. 53550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * 53650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * @param year The year. 53750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * @param month The month which is <strong>starting from zero</strong>. 53850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * @param dayOfMonth The day of the month. 53950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 54050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov public void updateDate(int year, int month, int dayOfMonth) { 541156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov if (!isNewDate(year, month, dayOfMonth)) { 542156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov return; 543dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root } 544156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov setDate(year, month, dayOfMonth); 54558f51255eb20f9c4d16c11554f372ff92d45fcc7Svetoslav Ganov updateSpinners(); 54658f51255eb20f9c4d16c11554f372ff92d45fcc7Svetoslav Ganov updateCalendarView(); 547156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov notifyDateChanged(); 548dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root } 549dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root 55050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov // Override so we are in complete control of save / restore for this widget. 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dispatchRestoreInstanceState(SparseArray<Parcelable> container) { 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dispatchThawSelfOnly(container); 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected Parcelable onSaveInstanceState() { 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcelable superState = super.onSaveInstanceState(); 559156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov return new SavedState(superState, getYear(), getMonth(), getDayOfMonth()); 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onRestoreInstanceState(Parcelable state) { 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SavedState ss = (SavedState) state; 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onRestoreInstanceState(ss.getSuperState()); 566156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov setDate(ss.mYear, ss.mMonth, ss.mDay); 56758f51255eb20f9c4d16c11554f372ff92d45fcc7Svetoslav Ganov updateSpinners(); 56858f51255eb20f9c4d16c11554f372ff92d45fcc7Svetoslav Ganov updateCalendarView(); 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 57250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * Initialize the state. If the provided values designate an inconsistent 573e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * date the values are normalized before updating the spinners. 57450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param year The initial year. 57650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * @param monthOfYear The initial month <strong>starting from zero</strong>. 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dayOfMonth The initial day of the month. 57850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * @param onDateChangedListener How user is notified date is changed by 57950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * user, can be null. 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void init(int year, int monthOfYear, int dayOfMonth, 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OnDateChangedListener onDateChangedListener) { 583156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov setDate(year, monthOfYear, dayOfMonth); 58458f51255eb20f9c4d16c11554f372ff92d45fcc7Svetoslav Ganov updateSpinners(); 58558f51255eb20f9c4d16c11554f372ff92d45fcc7Svetoslav Ganov updateCalendarView(); 5862f136a874d240cc7e85e8de9c7644a7daa9532daSvetoslav Ganov mOnDateChangedListener = onDateChangedListener; 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 58950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 590e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Parses the given <code>date</code> and in case of success sets the result 591e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * to the <code>outDate</code>. 592a911d4a2b1be7e9ea909a579167826e4a5bac1a3Svetoslav Ganov * 593e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @return True if the date was parsed. 594a911d4a2b1be7e9ea909a579167826e4a5bac1a3Svetoslav Ganov */ 595e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private boolean parseDate(String date, Calendar outDate) { 596e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov try { 597e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov outDate.setTime(mDateFormat.parse(date)); 598e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov return true; 599e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } catch (ParseException e) { 600e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov Log.w(LOG_TAG, "Date: " + date + " not in format: " + DATE_FORMAT); 601e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov return false; 602e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 603a911d4a2b1be7e9ea909a579167826e4a5bac1a3Svetoslav Ganov } 604a911d4a2b1be7e9ea909a579167826e4a5bac1a3Svetoslav Ganov 605156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov private boolean isNewDate(int year, int month, int dayOfMonth) { 606156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov return (mCurrentDate.get(Calendar.YEAR) != year 607156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov || mCurrentDate.get(Calendar.MONTH) != dayOfMonth 608156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov || mCurrentDate.get(Calendar.DAY_OF_MONTH) != month); 609156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } 610e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 611156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov private void setDate(int year, int month, int dayOfMonth) { 612156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mCurrentDate.set(year, month, dayOfMonth); 613e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov if (mCurrentDate.before(mMinDate)) { 614e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis()); 615e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } else if (mCurrentDate.after(mMaxDate)) { 616e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis()); 617e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 618e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 619e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 620156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov private void updateSpinners() { 621156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov // set the spinner ranges respecting the min and max dates 622156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov if (mCurrentDate.equals(mMinDate)) { 623156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setMinValue(mCurrentDate.get(Calendar.DAY_OF_MONTH)); 624156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.DAY_OF_MONTH)); 625156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setWrapSelectorWheel(false); 626156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setDisplayedValues(null); 627156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setMinValue(mCurrentDate.get(Calendar.MONTH)); 628156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.MONTH)); 629156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setWrapSelectorWheel(false); 630156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } else if (mCurrentDate.equals(mMaxDate)) { 631156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setMinValue(mCurrentDate.getActualMinimum(Calendar.DAY_OF_MONTH)); 632156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setMaxValue(mCurrentDate.get(Calendar.DAY_OF_MONTH)); 633156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setWrapSelectorWheel(false); 634156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setDisplayedValues(null); 635156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setMinValue(mCurrentDate.getActualMinimum(Calendar.MONTH)); 636156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setMaxValue(mCurrentDate.get(Calendar.MONTH)); 637156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setWrapSelectorWheel(false); 638156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov } else { 639156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setMinValue(1); 640156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.DAY_OF_MONTH)); 641156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setWrapSelectorWheel(true); 642156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setDisplayedValues(null); 643156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setMinValue(0); 644156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setMaxValue(11); 645156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setWrapSelectorWheel(true); 646e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 647e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 648156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov // make sure the month names are a zero based array 649156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov // with the months in the month spinner 650f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov String[] displayedValues = Arrays.copyOfRange(mShortMonths, 651156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.getMinValue(), mMonthSpinner.getMaxValue() + 1); 652156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setDisplayedValues(displayedValues); 653156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov 654156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov // year spinner range does not change based on the current date 655156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mYearSpinner.setMinValue(mMinDate.get(Calendar.YEAR)); 656156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mYearSpinner.setMaxValue(mMaxDate.get(Calendar.YEAR)); 657156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mYearSpinner.setWrapSelectorWheel(false); 658156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov 659156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov // set the spinner values 660156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mYearSpinner.setValue(mCurrentDate.get(Calendar.YEAR)); 661156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mMonthSpinner.setValue(mCurrentDate.get(Calendar.MONTH)); 662156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mDaySpinner.setValue(mCurrentDate.get(Calendar.DAY_OF_MONTH)); 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 66550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 666156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov * Updates the calendar view with the current date. 66750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 668e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private void updateCalendarView() { 669156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mCalendarView.setDate(mCurrentDate.getTimeInMillis(), false, false); 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 67250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 67350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * @return The selected year. 67450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getYear() { 676156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov return mCurrentDate.get(Calendar.YEAR); 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 67950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 68050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * @return The selected month. 68150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getMonth() { 683156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov return mCurrentDate.get(Calendar.MONTH); 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 68650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 68750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * @return The selected day of month. 68850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getDayOfMonth() { 690156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov return mCurrentDate.get(Calendar.DAY_OF_MONTH); 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6922bf761c20253222a763bce9a63d14c48ab08a556Suchi Amalapurapu 69350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 69450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * Notifies the listener, if such, for a change in the selected date. 69550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 69650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private void notifyDateChanged() { 6978a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); 69850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov if (mOnDateChangedListener != null) { 699156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov mOnDateChangedListener.onDateChanged(this, getYear(), getMonth(), getDayOfMonth()); 7002bf761c20253222a763bce9a63d14c48ab08a556Suchi Amalapurapu } 7012bf761c20253222a763bce9a63d14c48ab08a556Suchi Amalapurapu } 702e3491b6b5f1d3fb871074766597b275d9f682faaKenneth Andersson 70350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 704a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov * Sets the IME options for a spinner based on its ordering. 705a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov * 706a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov * @param spinner The spinner. 707a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov * @param spinnerCount The total spinner count. 708a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov * @param spinnerIndex The index of the given spinner. 709a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov */ 710a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov private void setImeOptions(NumberPicker spinner, int spinnerCount, int spinnerIndex) { 711a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov final int imeOptions; 712a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov if (spinnerIndex < spinnerCount - 1) { 713a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov imeOptions = EditorInfo.IME_ACTION_NEXT; 714a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov } else { 715a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov imeOptions = EditorInfo.IME_ACTION_DONE; 716a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov } 717a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov TextView input = (TextView) spinner.findViewById(R.id.numberpicker_input); 718a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov input.setImeOptions(imeOptions); 719a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov } 720a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov 721a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov private void setContentDescriptions() { 722a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov // Day 723d11e6151fe88314505fa7adca6278de2e772b11cSvetoslav Ganov trySetContentDescription(mDaySpinner, R.id.increment, 724d11e6151fe88314505fa7adca6278de2e772b11cSvetoslav Ganov R.string.date_picker_increment_day_button); 725d11e6151fe88314505fa7adca6278de2e772b11cSvetoslav Ganov trySetContentDescription(mDaySpinner, R.id.decrement, 726d11e6151fe88314505fa7adca6278de2e772b11cSvetoslav Ganov R.string.date_picker_decrement_day_button); 727a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov // Month 728d11e6151fe88314505fa7adca6278de2e772b11cSvetoslav Ganov trySetContentDescription(mMonthSpinner, R.id.increment, 729d11e6151fe88314505fa7adca6278de2e772b11cSvetoslav Ganov R.string.date_picker_increment_month_button); 730d11e6151fe88314505fa7adca6278de2e772b11cSvetoslav Ganov trySetContentDescription(mMonthSpinner, R.id.decrement, 731d11e6151fe88314505fa7adca6278de2e772b11cSvetoslav Ganov R.string.date_picker_decrement_month_button); 732a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov // Year 733d11e6151fe88314505fa7adca6278de2e772b11cSvetoslav Ganov trySetContentDescription(mYearSpinner, R.id.increment, 734d11e6151fe88314505fa7adca6278de2e772b11cSvetoslav Ganov R.string.date_picker_increment_year_button); 735d11e6151fe88314505fa7adca6278de2e772b11cSvetoslav Ganov trySetContentDescription(mYearSpinner, R.id.decrement, 736d11e6151fe88314505fa7adca6278de2e772b11cSvetoslav Ganov R.string.date_picker_decrement_year_button); 737d11e6151fe88314505fa7adca6278de2e772b11cSvetoslav Ganov } 738d11e6151fe88314505fa7adca6278de2e772b11cSvetoslav Ganov 739d11e6151fe88314505fa7adca6278de2e772b11cSvetoslav Ganov private void trySetContentDescription(View root, int viewId, int contDescResId) { 740d11e6151fe88314505fa7adca6278de2e772b11cSvetoslav Ganov View target = root.findViewById(viewId); 741d11e6151fe88314505fa7adca6278de2e772b11cSvetoslav Ganov if (target != null) { 742d11e6151fe88314505fa7adca6278de2e772b11cSvetoslav Ganov target.setContentDescription(mContext.getString(contDescResId)); 743d11e6151fe88314505fa7adca6278de2e772b11cSvetoslav Ganov } 744a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov } 745a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov 7466304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov private void updateInputState() { 7476304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov // Make sure that if the user changes the value and the IME is active 7486304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov // for one of the inputs if this widget, the IME is closed. If the user 7496304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov // changed the value via the IME and there is a next input the IME will 7506304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov // be shown, otherwise the user chose another means of changing the 7516304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov // value and having the IME up makes no sense. 7526304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov InputMethodManager inputMethodManager = InputMethodManager.peekInstance(); 7536304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov if (inputMethodManager != null) { 7546304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov if (inputMethodManager.isActive(mYearSpinnerInput)) { 7556304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov mYearSpinnerInput.clearFocus(); 7566304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0); 7576304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov } else if (inputMethodManager.isActive(mMonthSpinnerInput)) { 7586304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov mMonthSpinnerInput.clearFocus(); 7596304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0); 7606304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov } else if (inputMethodManager.isActive(mDaySpinnerInput)) { 7616304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov mDaySpinnerInput.clearFocus(); 7626304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0); 7636304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov } 7646304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov } 7656304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov } 7666304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov 767a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov /** 76850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * Class for managing state storing/restoring. 76950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 77050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private static class SavedState extends BaseSavedState { 77150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 77250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private final int mYear; 77350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 77450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private final int mMonth; 77550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 77650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private final int mDay; 77750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 77850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 77950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * Constructor called from {@link DatePicker#onSaveInstanceState()} 78050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 78150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private SavedState(Parcelable superState, int year, int month, int day) { 78250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov super(superState); 78350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov mYear = year; 78450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov mMonth = month; 78550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov mDay = day; 78650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov } 78750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 78850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 78950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * Constructor called from {@link #CREATOR} 79050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 79150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private SavedState(Parcel in) { 79250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov super(in); 79350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov mYear = in.readInt(); 79450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov mMonth = in.readInt(); 79550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov mDay = in.readInt(); 796e3491b6b5f1d3fb871074766597b275d9f682faaKenneth Andersson } 79750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 79850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov @Override 79950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov public void writeToParcel(Parcel dest, int flags) { 80050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov super.writeToParcel(dest, flags); 80150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov dest.writeInt(mYear); 80250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov dest.writeInt(mMonth); 80350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov dest.writeInt(mDay); 80450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov } 80550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 80650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov @SuppressWarnings("all") 80750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov // suppress unused and hiding 80850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov public static final Parcelable.Creator<SavedState> CREATOR = new Creator<SavedState>() { 80950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 81050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov public SavedState createFromParcel(Parcel in) { 81150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov return new SavedState(in); 81250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov } 81350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 81450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov public SavedState[] newArray(int size) { 81550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov return new SavedState[size]; 81650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov } 81750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov }; 818e3491b6b5f1d3fb871074766597b275d9f682faaKenneth Andersson } 8193fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov} 820