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