DatePicker.java revision 039a784ea3c24625b74084be18530f81dabd4bbb
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; 26e9a74a1a31f82391d44840aa17293021fcab6837Hyejin Kimimport android.text.InputType; 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 41949e9df25bccb736675f950591d3a286ae4052fcElliott Hughesimport java.text.DateFormatSymbols; 42e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganovimport java.text.ParseException; 4303a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischerimport java.text.SimpleDateFormat; 44156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganovimport java.util.Arrays; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Calendar; 46dddda8d188408ff18935b1b0e15a00fe012a03daKenny Rootimport java.util.Locale; 47e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganovimport java.util.TimeZone; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 49659f145278ffd85f934a435dbec47ead685caf59Elliott Hughesimport libcore.icu.ICU; 50659f145278ffd85f934a435dbec47ead685caf59Elliott Hughes 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 52e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * This class is a widget for selecting a date. The date can be selected by a 53e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * year, month, and day spinners or a {@link CalendarView}. The set of spinners 54e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * and the calendar view are automatically synchronized. The client can 55e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * customize whether only the spinners, or only the calendar view, or both to be 56e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * displayed. Also the minimal and maximal date from which dates to be selected 57e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * can be customized. 5850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * <p> 594c359b76f9a030f92a302ba74a528faa170bad4eScott Main * See the <a href="{@docRoot}guide/topics/ui/controls/pickers.html">Pickers</a> 604c359b76f9a030f92a302ba74a528faa170bad4eScott Main * guide. 6150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * </p> 62e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * <p> 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For a dialog using this view, see {@link android.app.DatePickerDialog}. 64e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * </p> 65e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 66e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @attr ref android.R.styleable#DatePicker_startYear 67e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @attr ref android.R.styleable#DatePicker_endYear 68e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @attr ref android.R.styleable#DatePicker_maxDate 69e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @attr ref android.R.styleable#DatePicker_minDate 70e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @attr ref android.R.styleable#DatePicker_spinnersShown 71e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @attr ref android.R.styleable#DatePicker_calendarViewShown 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@Widget 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class DatePicker extends FrameLayout { 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 76e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private static final String LOG_TAG = DatePicker.class.getSimpleName(); 77e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 78039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private DatePickerDelegate mDelegate; 7951c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 81e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * The callback used to indicate the user changes\d the date. 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface OnDateChangedListener { 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 86e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Called upon a date change. 87e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param view The view associated with this listener. 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param year The year that was set. 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param monthOfYear The month that was set (0-11) for compatibility 9150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * with {@link java.util.Calendar}. 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dayOfMonth The day of the month that was set. 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DatePicker(Context context) { 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, null); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DatePicker(Context context, AttributeSet attrs) { 1024243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov this(context, attrs, R.attr.datePickerStyle); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 105617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette public DatePicker(Context context, AttributeSet attrs, int defStyleAttr) { 106617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette this(context, attrs, defStyleAttr, 0); 107617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette } 108617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette 109617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette public DatePicker(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 110617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette super(context, attrs, defStyleAttr, defStyleRes); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 112039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDelegate = new LegacyDatePickerDelegate(this, context, attrs, defStyleAttr, defStyleRes); 113039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 11413427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov 115039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /** 116039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * Initialize the state. If the provided values designate an inconsistent 117039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * date the values are normalized before updating the spinners. 118039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * 119039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * @param year The initial year. 120039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * @param monthOfYear The initial month <strong>starting from zero</strong>. 121039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * @param dayOfMonth The initial day of the month. 122039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * @param onDateChangedListener How user is notified date is changed by 123039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * user, can be null. 124039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio */ 125039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public void init(int year, int monthOfYear, int dayOfMonth, 126039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio OnDateChangedListener onDateChangedListener) { 127039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDelegate.init(year, monthOfYear, dayOfMonth, onDateChangedListener); 128039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 12913427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov 130039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /** 131039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * Updates the current date. 132039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * 133039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * @param year The year. 134039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * @param month The month which is <strong>starting from zero</strong>. 135039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * @param dayOfMonth The day of the month. 136039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio */ 137039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public void updateDate(int year, int month, int dayOfMonth) { 138039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDelegate.updateDate(year, month, dayOfMonth); 139039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 140e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 141039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /** 142039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * @return The selected year. 143039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio */ 144039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public int getYear() { 145039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return mDelegate.getYear(); 146039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 1473fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov 148039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /** 149039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * @return The selected month. 150039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio */ 151039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public int getMonth() { 152039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return mDelegate.getMonth(); 153039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 1544213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov 155039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /** 156039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * @return The selected day of month. 157039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio */ 158039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public int getDayOfMonth() { 159039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return mDelegate.getDayOfMonth(); 160e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 161e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 162e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /** 163e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Gets the minimal date supported by this {@link DatePicker} in 164e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * milliseconds since January 1, 1970 00:00:00 in 165e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * {@link TimeZone#getDefault()} time zone. 166e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * <p> 167e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Note: The default minimal date is 01/01/1900. 168e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * <p> 169e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 170e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @return The minimal supported date. 171e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov */ 172e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public long getMinDate() { 173039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return mDelegate.getMinDate(); 174e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 175e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 176e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /** 177e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Sets the minimal date supported by this {@link NumberPicker} in 178e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * milliseconds since January 1, 1970 00:00:00 in 179e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * {@link TimeZone#getDefault()} time zone. 180e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 181e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @param minDate The minimal supported date. 182e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov */ 183e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public void setMinDate(long minDate) { 184039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDelegate.setMinDate(minDate); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 18728104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov /** 188e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Gets the maximal date supported by this {@link DatePicker} in 189e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * milliseconds since January 1, 1970 00:00:00 in 190e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * {@link TimeZone#getDefault()} time zone. 191e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * <p> 192e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Note: The default maximal date is 12/31/2100. 19328104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov * <p> 19428104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov * 195e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @return The maximal supported date. 196e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov */ 197e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public long getMaxDate() { 198039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return mDelegate.getMaxDate(); 199e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 200e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 201e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /** 202e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Sets the maximal date supported by this {@link DatePicker} in 203e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * milliseconds since January 1, 1970 00:00:00 in 204e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * {@link TimeZone#getDefault()} time zone. 205e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 206e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @param maxDate The maximal supported date. 20728104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov */ 208e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public void setMaxDate(long maxDate) { 209039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDelegate.setMaxDate(maxDate); 21028104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov } 21128104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setEnabled(boolean enabled) { 214039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (mDelegate.isEnabled() == enabled) { 21551c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov return; 21651c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov } 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setEnabled(enabled); 218039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDelegate.setEnabled(enabled); 21951c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov } 22051c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov 22151c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov @Override 22251c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov public boolean isEnabled() { 223039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return mDelegate.isEnabled(); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2268a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov @Override 2273fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { 228039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return mDelegate.dispatchPopulateAccessibilityEvent(event); 2293fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov } 2303fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov 2313fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov @Override 232736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov public void onPopulateAccessibilityEvent(AccessibilityEvent event) { 233736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov super.onPopulateAccessibilityEvent(event); 234039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDelegate.onPopulateAccessibilityEvent(event); 2358a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov } 2368a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov 237f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov @Override 2388a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov public void onInitializeAccessibilityEvent(AccessibilityEvent event) { 2398a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov super.onInitializeAccessibilityEvent(event); 240039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDelegate.onInitializeAccessibilityEvent(event); 2418a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov } 2428a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov 2438a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov @Override 2448a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { 2458a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov super.onInitializeAccessibilityNodeInfo(info); 246039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDelegate.onInitializeAccessibilityNodeInfo(info); 2478a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov } 2488a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov 2498a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov @Override 250f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov protected void onConfigurationChanged(Configuration newConfig) { 251f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov super.onConfigurationChanged(newConfig); 252039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDelegate.onConfigurationChanged(newConfig); 253f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov } 254f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 25550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 256e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Gets whether the {@link CalendarView} is shown. 257e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 258e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @return True if the calendar view is shown. 2595f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov * @see #getCalendarView() 260e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov */ 261e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public boolean getCalendarViewShown() { 262039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return mDelegate.getCalendarViewShown(); 263e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 264e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 265e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /** 2665f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov * Gets the {@link CalendarView}. 2675f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov * 2685f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov * @return The calendar view. 2695f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov * @see #getCalendarViewShown() 2705f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov */ 2715f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov public CalendarView getCalendarView () { 272039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return mDelegate.getCalendarView(); 2735f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov } 2745f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov 2755f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov /** 276e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Sets whether the {@link CalendarView} is shown. 277e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 278e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @param shown True if the calendar view is to be shown. 279e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov */ 280e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public void setCalendarViewShown(boolean shown) { 281039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDelegate.setCalendarViewShown(shown); 282e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 283e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 284e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /** 285e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Gets whether the spinners are shown. 286e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 287e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @return True if the spinners are shown. 28850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 289e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public boolean getSpinnersShown() { 290039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return mDelegate.getSpinnersShown(); 291e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 292e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 293e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /** 294e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * Sets whether the spinners are shown. 295e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * 296e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov * @param shown True if the spinners are to be shown. 297e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov */ 298e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public void setSpinnersShown(boolean shown) { 299039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDelegate.setSpinnersShown(shown); 300039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 301039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 302039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // Override so we are in complete control of save / restore for this widget. 303039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio @Override 304039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio protected void dispatchRestoreInstanceState(SparseArray<Parcelable> container) { 305039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDelegate.dispatchRestoreInstanceState(container); 306039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 307039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 308039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio @Override 309039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio protected Parcelable onSaveInstanceState() { 310039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Parcelable superState = super.onSaveInstanceState(); 311039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return mDelegate.onSaveInstanceState(superState); 312039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 313039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 314039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio @Override 315039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio protected void onRestoreInstanceState(Parcelable state) { 316039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio SavedState ss = (SavedState) state; 317039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio super.onRestoreInstanceState(ss.getSuperState()); 318039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDelegate.onRestoreInstanceState(ss); 319e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 320e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 321e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /** 322039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * A delegate interface that defined the public API of the DatePicker. Allows different 323039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * DatePicker implementations. This would need to be implemented by the DatePicker delegates 324039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * for the real behavior. 325f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov */ 326039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio interface DatePickerDelegate { 327039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio void init(int year, int monthOfYear, int dayOfMonth, 328039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio OnDateChangedListener onDateChangedListener); 329f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 330039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio void updateDate(int year, int month, int dayOfMonth); 331f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 332039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio int getYear(); 333039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio int getMonth(); 334039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio int getDayOfMonth(); 335f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 336039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio void setMinDate(long minDate); 337039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio long getMinDate(); 338949e9df25bccb736675f950591d3a286ae4052fcElliott Hughes 339039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio void setMaxDate(long maxDate); 340039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio long getMaxDate(); 341f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 342039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio void setEnabled(boolean enabled); 343039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio boolean isEnabled(); 344039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 345039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio CalendarView getCalendarView (); 346039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 347039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio void setCalendarViewShown(boolean shown); 348039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio boolean getCalendarViewShown(); 349039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 350039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio void setSpinnersShown(boolean shown); 351039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio boolean getSpinnersShown(); 352039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 353039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio void onConfigurationChanged(Configuration newConfig); 354039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 355039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio void dispatchRestoreInstanceState(SparseArray<Parcelable> container); 356039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Parcelable onSaveInstanceState(Parcelable superState); 357039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio void onRestoreInstanceState(Parcelable state); 358039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 359039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event); 360039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio void onPopulateAccessibilityEvent(AccessibilityEvent event); 361039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio void onInitializeAccessibilityEvent(AccessibilityEvent event); 362039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info); 363949e9df25bccb736675f950591d3a286ae4052fcElliott Hughes } 364949e9df25bccb736675f950591d3a286ae4052fcElliott Hughes 365949e9df25bccb736675f950591d3a286ae4052fcElliott Hughes /** 366039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * An abstract class which can be used as a start for DatePicker implementations 367f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov */ 368039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio abstract static class AbstractTimePickerDelegate implements DatePickerDelegate { 369039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // The delegator 370039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio protected DatePicker mDelegator; 371039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 372039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // The context 373039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio protected Context mContext; 374039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 375039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // The current locale 376039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio protected Locale mCurrentLocale; 377039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 378039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // Callbacks 379039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio protected OnDateChangedListener mOnDateChangedListener; 380039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 381039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public AbstractTimePickerDelegate(DatePicker delegator, Context context) { 382039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDelegator = delegator; 383039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mContext = context; 384039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 385039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // initialization based on locale 386039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio setCurrentLocale(Locale.getDefault()); 387f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov } 388f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 389039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio protected void setCurrentLocale(Locale locale) { 390039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (locale.equals(mCurrentLocale)) { 391039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return; 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 393039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mCurrentLocale = locale; 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 398039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * A delegate implementing the basic DatePicker 39950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 400039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private static class LegacyDatePickerDelegate extends AbstractTimePickerDelegate { 401039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 402039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private static final String DATE_FORMAT = "MM/dd/yyyy"; 403039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 404039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private static final int DEFAULT_START_YEAR = 1900; 405039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 406039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private static final int DEFAULT_END_YEAR = 2100; 407039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 408039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private static final boolean DEFAULT_CALENDAR_VIEW_SHOWN = true; 409039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 410039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private static final boolean DEFAULT_SPINNERS_SHOWN = true; 411039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 412039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private static final boolean DEFAULT_ENABLED_STATE = true; 413039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 414039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private final LinearLayout mSpinners; 415039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 416039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private final NumberPicker mDaySpinner; 417039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 418039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private final NumberPicker mMonthSpinner; 419039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 420039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private final NumberPicker mYearSpinner; 421039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 422039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private final EditText mDaySpinnerInput; 423039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 424039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private final EditText mMonthSpinnerInput; 425039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 426039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private final EditText mYearSpinnerInput; 427039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 428039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private final CalendarView mCalendarView; 429039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 430039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private String[] mShortMonths; 431039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 432039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private final java.text.DateFormat mDateFormat = new SimpleDateFormat(DATE_FORMAT); 433039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 434039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private int mNumberOfMonths; 435039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 436039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private Calendar mTempDate; 437039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 438039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private Calendar mMinDate; 439039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 440039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private Calendar mMaxDate; 441039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 442039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private Calendar mCurrentDate; 443039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 444039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private boolean mIsEnabled = DEFAULT_ENABLED_STATE; 445039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 446039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio LegacyDatePickerDelegate(DatePicker delegator, Context context, AttributeSet attrs, 447039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio int defStyleAttr, int defStyleRes) { 448039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio super(delegator, context); 449039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 450039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDelegator = delegator; 451039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mContext = context; 452039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 453039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // initialization based on locale 454039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio setCurrentLocale(Locale.getDefault()); 455039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 456039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio final TypedArray attributesArray = context.obtainStyledAttributes(attrs, 457039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio R.styleable.DatePicker, defStyleAttr, defStyleRes); 458039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio boolean spinnersShown = attributesArray.getBoolean(R.styleable.DatePicker_spinnersShown, 459039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio DEFAULT_SPINNERS_SHOWN); 460039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio boolean calendarViewShown = attributesArray.getBoolean( 461039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio R.styleable.DatePicker_calendarViewShown, DEFAULT_CALENDAR_VIEW_SHOWN); 462039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio int startYear = attributesArray.getInt(R.styleable.DatePicker_startYear, 463039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio DEFAULT_START_YEAR); 464039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio int endYear = attributesArray.getInt(R.styleable.DatePicker_endYear, DEFAULT_END_YEAR); 465039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio String minDate = attributesArray.getString(R.styleable.DatePicker_minDate); 466039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio String maxDate = attributesArray.getString(R.styleable.DatePicker_maxDate); 467039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio int layoutResourceId = attributesArray.getResourceId( 468039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio R.styleable.DatePicker_internalLayout, R.layout.date_picker); 469039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio attributesArray.recycle(); 470039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 471039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio LayoutInflater inflater = (LayoutInflater) context 472039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 473039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio inflater.inflate(layoutResourceId, mDelegator, true); 474039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 475039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio OnValueChangeListener onChangeListener = new OnValueChangeListener() { 476039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public void onValueChange(NumberPicker picker, int oldVal, int newVal) { 477039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio updateInputState(); 478039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mTempDate.setTimeInMillis(mCurrentDate.getTimeInMillis()); 479039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // take care of wrapping of days and months to update greater fields 480039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (picker == mDaySpinner) { 481039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio int maxDayOfMonth = mTempDate.getActualMaximum(Calendar.DAY_OF_MONTH); 482039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (oldVal == maxDayOfMonth && newVal == 1) { 483039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mTempDate.add(Calendar.DAY_OF_MONTH, 1); 484039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } else if (oldVal == 1 && newVal == maxDayOfMonth) { 485039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mTempDate.add(Calendar.DAY_OF_MONTH, -1); 486039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } else { 487039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mTempDate.add(Calendar.DAY_OF_MONTH, newVal - oldVal); 488039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 489039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } else if (picker == mMonthSpinner) { 490039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (oldVal == 11 && newVal == 0) { 491039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mTempDate.add(Calendar.MONTH, 1); 492039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } else if (oldVal == 0 && newVal == 11) { 493039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mTempDate.add(Calendar.MONTH, -1); 494039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } else { 495039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mTempDate.add(Calendar.MONTH, newVal - oldVal); 496039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 497039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } else if (picker == mYearSpinner) { 498039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mTempDate.set(Calendar.YEAR, newVal); 499039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } else { 500039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio throw new IllegalArgumentException(); 501039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 502039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // now set the date to the adjusted one 503039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio setDate(mTempDate.get(Calendar.YEAR), mTempDate.get(Calendar.MONTH), 504039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mTempDate.get(Calendar.DAY_OF_MONTH)); 505039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio updateSpinners(); 506039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio updateCalendarView(); 507039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio notifyDateChanged(); 508039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 509039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio }; 510039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 511039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mSpinners = (LinearLayout) mDelegator.findViewById(R.id.pickers); 512039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 513039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // calendar view day-picker 514039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mCalendarView = (CalendarView) mDelegator.findViewById(R.id.calendar_view); 515039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mCalendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() { 516039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public void onSelectedDayChange(CalendarView view, int year, int month, int monthDay) { 517039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio setDate(year, month, monthDay); 518039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio updateSpinners(); 519039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio notifyDateChanged(); 520039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 521039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio }); 522039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 523039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // day 524039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDaySpinner = (NumberPicker) mDelegator.findViewById(R.id.day); 525039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDaySpinner.setFormatter(NumberPicker.getTwoDigitFormatter()); 526039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDaySpinner.setOnLongPressUpdateInterval(100); 527039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDaySpinner.setOnValueChangedListener(onChangeListener); 528039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDaySpinnerInput = (EditText) mDaySpinner.findViewById(R.id.numberpicker_input); 529039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 530039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // month 531039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMonthSpinner = (NumberPicker) mDelegator.findViewById(R.id.month); 532039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMonthSpinner.setMinValue(0); 533039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMonthSpinner.setMaxValue(mNumberOfMonths - 1); 534039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMonthSpinner.setDisplayedValues(mShortMonths); 535039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMonthSpinner.setOnLongPressUpdateInterval(200); 536039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMonthSpinner.setOnValueChangedListener(onChangeListener); 537039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMonthSpinnerInput = (EditText) mMonthSpinner.findViewById(R.id.numberpicker_input); 538039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 539039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // year 540039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mYearSpinner = (NumberPicker) mDelegator.findViewById(R.id.year); 541039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mYearSpinner.setOnLongPressUpdateInterval(100); 542039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mYearSpinner.setOnValueChangedListener(onChangeListener); 543039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mYearSpinnerInput = (EditText) mYearSpinner.findViewById(R.id.numberpicker_input); 544039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 545039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // show only what the user required but make sure we 546039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // show something and the spinners have higher priority 547039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (!spinnersShown && !calendarViewShown) { 548039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio setSpinnersShown(true); 549039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } else { 550039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio setSpinnersShown(spinnersShown); 551039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio setCalendarViewShown(calendarViewShown); 552039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 553039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 554039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // set the min date giving priority of the minDate over startYear 555039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mTempDate.clear(); 556039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (!TextUtils.isEmpty(minDate)) { 557039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (!parseDate(minDate, mTempDate)) { 558039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mTempDate.set(startYear, 0, 1); 559039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 560039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } else { 561039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mTempDate.set(startYear, 0, 1); 562039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 563039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio setMinDate(mTempDate.getTimeInMillis()); 564039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 565039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // set the max date giving priority of the maxDate over endYear 566039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mTempDate.clear(); 567039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (!TextUtils.isEmpty(maxDate)) { 568039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (!parseDate(maxDate, mTempDate)) { 569039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mTempDate.set(endYear, 11, 31); 570039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 571039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } else { 572039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mTempDate.set(endYear, 11, 31); 573039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 574039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio setMaxDate(mTempDate.getTimeInMillis()); 575039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 576039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // initialize to current date 577039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mCurrentDate.setTimeInMillis(System.currentTimeMillis()); 578039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio init(mCurrentDate.get(Calendar.YEAR), mCurrentDate.get(Calendar.MONTH), mCurrentDate 579039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio .get(Calendar.DAY_OF_MONTH), null); 580039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 581039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // re-order the number spinners to match the current date format 582039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio reorderSpinners(); 583039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 584039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // accessibility 585039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio setContentDescriptions(); 586039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 587039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // If not explicitly specified this view is important for accessibility. 588039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (mDelegator.getImportantForAccessibility() == IMPORTANT_FOR_ACCESSIBILITY_AUTO) { 589039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDelegator.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES); 590039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 591dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root } 592dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root 593039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio @Override 594039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public void init(int year, int monthOfYear, int dayOfMonth, 595039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio OnDateChangedListener onDateChangedListener) { 596039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio setDate(year, monthOfYear, dayOfMonth); 597039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio updateSpinners(); 598039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio updateCalendarView(); 599039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mOnDateChangedListener = onDateChangedListener; 600039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 602039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio @Override 603039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public void updateDate(int year, int month, int dayOfMonth) { 604039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (!isNewDate(year, month, dayOfMonth)) { 605039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return; 606039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 607039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio setDate(year, month, dayOfMonth); 608039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio updateSpinners(); 609039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio updateCalendarView(); 610039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio notifyDateChanged(); 611039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 613039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio @Override 614039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public int getYear() { 615039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return mCurrentDate.get(Calendar.YEAR); 616039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 618039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio @Override 619039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public int getMonth() { 620039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return mCurrentDate.get(Calendar.MONTH); 621039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 623039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio @Override 624039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public int getDayOfMonth() { 625039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return mCurrentDate.get(Calendar.DAY_OF_MONTH); 626039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 627039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 628039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio @Override 629039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public void setMinDate(long minDate) { 630039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mTempDate.setTimeInMillis(minDate); 631039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (mTempDate.get(Calendar.YEAR) == mMinDate.get(Calendar.YEAR) 632039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio && mTempDate.get(Calendar.DAY_OF_YEAR) != mMinDate.get(Calendar.DAY_OF_YEAR)) { 633039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return; 634039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 635039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMinDate.setTimeInMillis(minDate); 636039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mCalendarView.setMinDate(minDate); 637039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (mCurrentDate.before(mMinDate)) { 638039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis()); 639039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio updateCalendarView(); 640039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 641039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio updateSpinners(); 642039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 643039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 644039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio @Override 645039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public long getMinDate() { 646039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return mCalendarView.getMinDate(); 647039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 648039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 649039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio @Override 650039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public void setMaxDate(long maxDate) { 651039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mTempDate.setTimeInMillis(maxDate); 652039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (mTempDate.get(Calendar.YEAR) == mMaxDate.get(Calendar.YEAR) 653039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio && mTempDate.get(Calendar.DAY_OF_YEAR) != mMaxDate.get(Calendar.DAY_OF_YEAR)) { 654039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return; 655039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 656039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMaxDate.setTimeInMillis(maxDate); 657039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mCalendarView.setMaxDate(maxDate); 658039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (mCurrentDate.after(mMaxDate)) { 659039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis()); 660039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio updateCalendarView(); 661039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 662039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio updateSpinners(); 663039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 664039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 665039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio @Override 666039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public long getMaxDate() { 667039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return mCalendarView.getMaxDate(); 668039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 669039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 670039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio @Override 671039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public void setEnabled(boolean enabled) { 672039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDaySpinner.setEnabled(enabled); 673039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMonthSpinner.setEnabled(enabled); 674039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mYearSpinner.setEnabled(enabled); 675039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mCalendarView.setEnabled(enabled); 676039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mIsEnabled = enabled; 677039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 678039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 679039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio @Override 680039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public boolean isEnabled() { 681039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return mIsEnabled; 682039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 683039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 684039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio @Override 685039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public CalendarView getCalendarView() { 686039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return mCalendarView; 687039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 688039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 689039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio @Override 690039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public void setCalendarViewShown(boolean shown) { 691039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mCalendarView.setVisibility(shown ? VISIBLE : GONE); 692039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 693039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 694039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio @Override 695039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public boolean getCalendarViewShown() { 696039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return (mCalendarView.getVisibility() == View.VISIBLE); 697039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 698039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 699039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio @Override 700039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public void setSpinnersShown(boolean shown) { 701039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mSpinners.setVisibility(shown ? VISIBLE : GONE); 702039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 703039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 704039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio @Override 705039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public boolean getSpinnersShown() { 706039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return mSpinners.isShown(); 707039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 708039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 709039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio @Override 710039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public void onConfigurationChanged(Configuration newConfig) { 711039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio setCurrentLocale(newConfig.locale); 712039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 713039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 714039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio @Override 715039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public void dispatchRestoreInstanceState(SparseArray<Parcelable> container) { 716039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDelegator.dispatchThawSelfOnly(container); 717039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 718039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 719039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio @Override 720039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public Parcelable onSaveInstanceState(Parcelable superState) { 721039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return new SavedState(superState, getYear(), getMonth(), getDayOfMonth()); 722039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 723039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 724039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio @Override 725039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public void onRestoreInstanceState(Parcelable state) { 726039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio SavedState ss = (SavedState) state; 727039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio setDate(ss.mYear, ss.mMonth, ss.mDay); 728039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio updateSpinners(); 729039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio updateCalendarView(); 730039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 731039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 732039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio @Override 733039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { 734039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio onPopulateAccessibilityEvent(event); 735e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov return true; 736e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 737e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 738039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio @Override 739039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public void onPopulateAccessibilityEvent(AccessibilityEvent event) { 740039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio final int flags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR; 741039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio String selectedDateUtterance = DateUtils.formatDateTime(mContext, 742039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mCurrentDate.getTimeInMillis(), flags); 743039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio event.getText().add(selectedDateUtterance); 744039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 745156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov 746039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio @Override 747039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public void onInitializeAccessibilityEvent(AccessibilityEvent event) { 748039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio event.setClassName(DatePicker.class.getName()); 749039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 750156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov 751039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio @Override 752039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { 753039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio info.setClassName(DatePicker.class.getName()); 754039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 755e9a74a1a31f82391d44840aa17293021fcab6837Hyejin Kim 756039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /** 757039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * Sets the current locale. 758039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * 759039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * @param locale The current locale. 760039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio */ 761039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio @Override 762039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio protected void setCurrentLocale(Locale locale) { 763039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio super.setCurrentLocale(locale); 764039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 765039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mTempDate = getCalendarForLocale(mTempDate, locale); 766039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMinDate = getCalendarForLocale(mMinDate, locale); 767039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMaxDate = getCalendarForLocale(mMaxDate, locale); 768039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mCurrentDate = getCalendarForLocale(mCurrentDate, locale); 769039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 770039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mNumberOfMonths = mTempDate.getActualMaximum(Calendar.MONTH) + 1; 771039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mShortMonths = new DateFormatSymbols().getShortMonths(); 772039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 773039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (usingNumericMonths()) { 774039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // We're in a locale where a date should either be all-numeric, or all-text. 775039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // All-text would require custom NumberPicker formatters for day and year. 776039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mShortMonths = new String[mNumberOfMonths]; 777039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio for (int i = 0; i < mNumberOfMonths; ++i) { 778039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mShortMonths[i] = String.format("%d", i + 1); 779039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 780039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 781e9a74a1a31f82391d44840aa17293021fcab6837Hyejin Kim } 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 783039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /** 784039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * Tests whether the current locale is one where there are no real month names, 785039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * such as Chinese, Japanese, or Korean locales. 786039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio */ 787039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private boolean usingNumericMonths() { 788039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return Character.isDigit(mShortMonths[Calendar.JANUARY].charAt(0)); 789039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 791039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /** 792039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * Gets a calendar for locale bootstrapped with the value of a given calendar. 793039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * 794039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * @param oldCalendar The old calendar. 795039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * @param locale The locale. 796039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio */ 797039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private Calendar getCalendarForLocale(Calendar oldCalendar, Locale locale) { 798039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (oldCalendar == null) { 799039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return Calendar.getInstance(locale); 800039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } else { 801039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio final long currentTimeMillis = oldCalendar.getTimeInMillis(); 802039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Calendar newCalendar = Calendar.getInstance(locale); 803039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio newCalendar.setTimeInMillis(currentTimeMillis); 804039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return newCalendar; 805039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 806039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 808039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /** 809039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * Reorders the spinners according to the date format that is 810039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * explicitly set by the user and if no such is set fall back 811039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * to the current locale's default format. 812039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio */ 813039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private void reorderSpinners() { 814039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mSpinners.removeAllViews(); 815039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // We use numeric spinners for year and day, but textual months. Ask icu4c what 816039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // order the user's locale uses for that combination. http://b/7207103. 817039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio String pattern = ICU.getBestDateTimePattern("yyyyMMMdd", 818039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Locale.getDefault().toString()); 819039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio char[] order = ICU.getDateFormatOrder(pattern); 820039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio final int spinnerCount = order.length; 821039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio for (int i = 0; i < spinnerCount; i++) { 822039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio switch (order[i]) { 823039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio case 'd': 824039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mSpinners.addView(mDaySpinner); 825039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio setImeOptions(mDaySpinner, spinnerCount, i); 826039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio break; 827039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio case 'M': 828039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mSpinners.addView(mMonthSpinner); 829039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio setImeOptions(mMonthSpinner, spinnerCount, i); 830039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio break; 831039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio case 'y': 832039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mSpinners.addView(mYearSpinner); 833039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio setImeOptions(mYearSpinner, spinnerCount, i); 834039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio break; 835039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio default: 836039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio throw new IllegalArgumentException(Arrays.toString(order)); 837039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 838039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 839039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 841039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /** 842039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * Parses the given <code>date</code> and in case of success sets the result 843039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * to the <code>outDate</code>. 844039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * 845039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * @return True if the date was parsed. 846039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio */ 847039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private boolean parseDate(String date, Calendar outDate) { 848039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio try { 849039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio outDate.setTime(mDateFormat.parse(date)); 850039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return true; 851039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } catch (ParseException e) { 852039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Log.w(LOG_TAG, "Date: " + date + " not in format: " + DATE_FORMAT); 853039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return false; 854039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 855039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 8562bf761c20253222a763bce9a63d14c48ab08a556Suchi Amalapurapu 857039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private boolean isNewDate(int year, int month, int dayOfMonth) { 858039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio return (mCurrentDate.get(Calendar.YEAR) != year 859039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio || mCurrentDate.get(Calendar.MONTH) != dayOfMonth 860039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio || mCurrentDate.get(Calendar.DAY_OF_MONTH) != month); 8612bf761c20253222a763bce9a63d14c48ab08a556Suchi Amalapurapu } 862e3491b6b5f1d3fb871074766597b275d9f682faaKenneth Andersson 863039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private void setDate(int year, int month, int dayOfMonth) { 864039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mCurrentDate.set(year, month, dayOfMonth); 865039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (mCurrentDate.before(mMinDate)) { 866039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis()); 867039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } else if (mCurrentDate.after(mMaxDate)) { 868039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis()); 869039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 870039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 871039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 872039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private void updateSpinners() { 873039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // set the spinner ranges respecting the min and max dates 874039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (mCurrentDate.equals(mMinDate)) { 875039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDaySpinner.setMinValue(mCurrentDate.get(Calendar.DAY_OF_MONTH)); 876039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDaySpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.DAY_OF_MONTH)); 877039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDaySpinner.setWrapSelectorWheel(false); 878039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMonthSpinner.setDisplayedValues(null); 879039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMonthSpinner.setMinValue(mCurrentDate.get(Calendar.MONTH)); 880039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMonthSpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.MONTH)); 881039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMonthSpinner.setWrapSelectorWheel(false); 882039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } else if (mCurrentDate.equals(mMaxDate)) { 883039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDaySpinner.setMinValue(mCurrentDate.getActualMinimum(Calendar.DAY_OF_MONTH)); 884039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDaySpinner.setMaxValue(mCurrentDate.get(Calendar.DAY_OF_MONTH)); 885039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDaySpinner.setWrapSelectorWheel(false); 886039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMonthSpinner.setDisplayedValues(null); 887039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMonthSpinner.setMinValue(mCurrentDate.getActualMinimum(Calendar.MONTH)); 888039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMonthSpinner.setMaxValue(mCurrentDate.get(Calendar.MONTH)); 889039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMonthSpinner.setWrapSelectorWheel(false); 890039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } else { 891039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDaySpinner.setMinValue(1); 892039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDaySpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.DAY_OF_MONTH)); 893039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDaySpinner.setWrapSelectorWheel(true); 894039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMonthSpinner.setDisplayedValues(null); 895039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMonthSpinner.setMinValue(0); 896039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMonthSpinner.setMaxValue(11); 897039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMonthSpinner.setWrapSelectorWheel(true); 898039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 899039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 900039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // make sure the month names are a zero based array 901039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // with the months in the month spinner 902039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio String[] displayedValues = Arrays.copyOfRange(mShortMonths, 903039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMonthSpinner.getMinValue(), mMonthSpinner.getMaxValue() + 1); 904039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMonthSpinner.setDisplayedValues(displayedValues); 905039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 906039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // year spinner range does not change based on the current date 907039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mYearSpinner.setMinValue(mMinDate.get(Calendar.YEAR)); 908039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mYearSpinner.setMaxValue(mMaxDate.get(Calendar.YEAR)); 909039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mYearSpinner.setWrapSelectorWheel(false); 910039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 911039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // set the spinner values 912039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mYearSpinner.setValue(mCurrentDate.get(Calendar.YEAR)); 913039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMonthSpinner.setValue(mCurrentDate.get(Calendar.MONTH)); 914039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDaySpinner.setValue(mCurrentDate.get(Calendar.DAY_OF_MONTH)); 915039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 916039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (usingNumericMonths()) { 917039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMonthSpinnerInput.setRawInputType(InputType.TYPE_CLASS_NUMBER); 918039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 919039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 920039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 921039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /** 922039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * Updates the calendar view with the current date. 923039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio */ 924039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private void updateCalendarView() { 925039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mCalendarView.setDate(mCurrentDate.getTimeInMillis(), false, false); 926039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 927039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 928039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 929039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /** 930039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * Notifies the listener, if such, for a change in the selected date. 931039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio */ 932039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private void notifyDateChanged() { 933039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDelegator.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); 934039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (mOnDateChangedListener != null) { 935039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mOnDateChangedListener.onDateChanged(mDelegator, getYear(), getMonth(), 936039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio getDayOfMonth()); 937039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 938039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 939039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 940039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /** 941039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * Sets the IME options for a spinner based on its ordering. 942039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * 943039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * @param spinner The spinner. 944039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * @param spinnerCount The total spinner count. 945039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio * @param spinnerIndex The index of the given spinner. 946039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio */ 947039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private void setImeOptions(NumberPicker spinner, int spinnerCount, int spinnerIndex) { 948039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio final int imeOptions; 949039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (spinnerIndex < spinnerCount - 1) { 950039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio imeOptions = EditorInfo.IME_ACTION_NEXT; 951039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } else { 952039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio imeOptions = EditorInfo.IME_ACTION_DONE; 953039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 954039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio TextView input = (TextView) spinner.findViewById(R.id.numberpicker_input); 955039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio input.setImeOptions(imeOptions); 956039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 957039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 958039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private void setContentDescriptions() { 959039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // Day 960039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio trySetContentDescription(mDaySpinner, R.id.increment, 961039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio R.string.date_picker_increment_day_button); 962039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio trySetContentDescription(mDaySpinner, R.id.decrement, 963039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio R.string.date_picker_decrement_day_button); 964039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // Month 965039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio trySetContentDescription(mMonthSpinner, R.id.increment, 966039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio R.string.date_picker_increment_month_button); 967039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio trySetContentDescription(mMonthSpinner, R.id.decrement, 968039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio R.string.date_picker_decrement_month_button); 969039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // Year 970039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio trySetContentDescription(mYearSpinner, R.id.increment, 971039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio R.string.date_picker_increment_year_button); 972039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio trySetContentDescription(mYearSpinner, R.id.decrement, 973039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio R.string.date_picker_decrement_year_button); 974039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 975039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 976039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private void trySetContentDescription(View root, int viewId, int contDescResId) { 977039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio View target = root.findViewById(viewId); 978039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (target != null) { 979039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio target.setContentDescription(mContext.getString(contDescResId)); 980039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 981039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 982039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 983039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio private void updateInputState() { 984039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // Make sure that if the user changes the value and the IME is active 985039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // for one of the inputs if this widget, the IME is closed. If the user 986039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // changed the value via the IME and there is a next input the IME will 987039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // be shown, otherwise the user chose another means of changing the 988039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio // value and having the IME up makes no sense. 989039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio InputMethodManager inputMethodManager = InputMethodManager.peekInstance(); 990039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (inputMethodManager != null) { 991039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (inputMethodManager.isActive(mYearSpinnerInput)) { 992039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mYearSpinnerInput.clearFocus(); 993039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio inputMethodManager.hideSoftInputFromWindow(mDelegator.getWindowToken(), 0); 994039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } else if (inputMethodManager.isActive(mMonthSpinnerInput)) { 995039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mMonthSpinnerInput.clearFocus(); 996039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio inputMethodManager.hideSoftInputFromWindow(mDelegator.getWindowToken(), 0); 997039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } else if (inputMethodManager.isActive(mDaySpinnerInput)) { 998039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mDaySpinnerInput.clearFocus(); 999039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio inputMethodManager.hideSoftInputFromWindow(mDelegator.getWindowToken(), 0); 1000039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 10016304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov } 10026304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov } 10036304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov } 10046304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov 1005a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov /** 100650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * Class for managing state storing/restoring. 100750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 100850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private static class SavedState extends BaseSavedState { 100950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 101050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private final int mYear; 101150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 101250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private final int mMonth; 101350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 101450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private final int mDay; 101550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 101650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 101750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * Constructor called from {@link DatePicker#onSaveInstanceState()} 101850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 101950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private SavedState(Parcelable superState, int year, int month, int day) { 102050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov super(superState); 102150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov mYear = year; 102250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov mMonth = month; 102350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov mDay = day; 102450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov } 102550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 102650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov /** 102750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * Constructor called from {@link #CREATOR} 102850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov */ 102950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov private SavedState(Parcel in) { 103050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov super(in); 103150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov mYear = in.readInt(); 103250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov mMonth = in.readInt(); 103350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov mDay = in.readInt(); 1034e3491b6b5f1d3fb871074766597b275d9f682faaKenneth Andersson } 103550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 103650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov @Override 103750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov public void writeToParcel(Parcel dest, int flags) { 103850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov super.writeToParcel(dest, flags); 103950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov dest.writeInt(mYear); 104050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov dest.writeInt(mMonth); 104150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov dest.writeInt(mDay); 104250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov } 104350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 104450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov @SuppressWarnings("all") 104550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov // suppress unused and hiding 104650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov public static final Parcelable.Creator<SavedState> CREATOR = new Creator<SavedState>() { 104750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 104850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov public SavedState createFromParcel(Parcel in) { 104950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov return new SavedState(in); 105050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov } 105150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 105250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov public SavedState[] newArray(int size) { 105350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov return new SavedState[size]; 105450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov } 105550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov }; 1056e3491b6b5f1d3fb871074766597b275d9f682faaKenneth Andersson } 10573fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov} 1058