DatePicker.java revision 50f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5c
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
1950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganovimport com.android.internal.R;
2050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.Widget;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.format.DateFormat;
27dddda8d188408ff18935b1b0e15a00fe012a03daKenny Rootimport android.text.format.DateUtils;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater;
3150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganovimport android.widget.NumberPicker.OnChangeListener;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3303a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischerimport java.text.SimpleDateFormat;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Calendar;
35dddda8d188408ff18935b1b0e15a00fe012a03daKenny Rootimport java.util.Locale;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A view for selecting a month / year / day based on a calendar like layout.
3950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * <p>
4050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * See the <a href="{@docRoot}
4150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * resources/tutorials/views/hello-datepicker.html">Date Picker tutorial</a>.
4250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov * </p>
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For a dialog using this view, see {@link android.app.DatePickerDialog}.
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@Widget
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class DatePicker extends FrameLayout {
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int DEFAULT_START_YEAR = 1900;
49dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root
5050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov    private static final int DEFAULT_END_YEAR = 2100;
51dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final NumberPicker mDayPicker;
5350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final NumberPicker mMonthPicker;
5550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final NumberPicker mYearPicker;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov    private final DayPicker mMiniMonthDayPicker;
5950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private OnDateChangedListener mOnDateChangedListener;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov    private Locale mMonthLocale;
6350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov
6450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov    private final Calendar mTempCalendar = Calendar.getInstance();
6550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov
6650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov    private final int mNumberOfMonths = mTempCalendar.getActualMaximum(Calendar.MONTH) + 1;
6750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov
6850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov    private final String[] mShortMonths = new String[mNumberOfMonths];
69dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The callback used to indicate the user changes the date.
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface OnDateChangedListener {
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param view The view associated with this listener.
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param year The year that was set.
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param monthOfYear The month that was set (0-11) for compatibility
7950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov         *            with {@link java.util.Calendar}.
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param dayOfMonth The day of the month that was set.
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth);
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public DatePicker(Context context) {
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this(context, null);
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public DatePicker(Context context, AttributeSet attrs) {
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this(context, attrs, 0);
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public DatePicker(Context context, AttributeSet attrs, int defStyle) {
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(context, attrs, defStyle);
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        LayoutInflater inflater = (LayoutInflater) context
9750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        inflater.inflate(R.layout.date_picker, this, true);
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        OnChangeListener onChangeListener = new OnChangeListener() {
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void onChanged(NumberPicker picker, int oldVal, int newVal) {
102e3491b6b5f1d3fb871074766597b275d9f682faaKenneth Andersson                notifyDateChanged();
10350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov                updateMiniMonth();
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        };
1065fe1e6221ea3bab3120f5b9c0ceacaf59d116c05Eric Fischer
10750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        // day
10850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        mDayPicker = (NumberPicker) findViewById(R.id.day);
10950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        mDayPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
11050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        mDayPicker.setSpeed(100);
11150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        mDayPicker.setOnChangeListener(onChangeListener);
1125fe1e6221ea3bab3120f5b9c0ceacaf59d116c05Eric Fischer
11350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        // month
11450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        mMonthPicker = (NumberPicker) findViewById(R.id.month);
11550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        mMonthPicker.setRange(0, mNumberOfMonths - 1, getShortMonths());
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMonthPicker.setSpeed(200);
11750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        mMonthPicker.setOnChangeListener(onChangeListener);
11850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov
11950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        // year
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mYearPicker = (NumberPicker) findViewById(R.id.year);
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mYearPicker.setSpeed(100);
12250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        mYearPicker.setOnChangeListener(onChangeListener);
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DatePicker);
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mStartYear = a.getInt(R.styleable.DatePicker_startYear, DEFAULT_START_YEAR);
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mEndYear = a.getInt(R.styleable.DatePicker_endYear, DEFAULT_END_YEAR);
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mYearPicker.setRange(mStartYear, mEndYear);
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.recycle();
12850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov
12950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        // mini-month day-picker
13050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        mMiniMonthDayPicker = (DayPicker) findViewById(R.id.mini_month_day_picker);
13150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        mTempCalendar.clear();
13250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        mTempCalendar.set(mStartYear, 0, 1);
13350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        Calendar endRangeDate = (Calendar) mTempCalendar.clone();
13450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        endRangeDate.set(mEndYear, 11, 31);
13550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        mMiniMonthDayPicker.setRange(mTempCalendar, endRangeDate);
13650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        mMiniMonthDayPicker.setOnDateChangeListener(new DayPicker.OnSelectedDayChangeListener() {
13750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov            public void onSelectedDayChange(DayPicker view, int year, int month, int monthDay) {
13850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov                updateDate(year, month, monthDay);
13950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov            }
14050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        });
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // initialize to current date
14350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        mTempCalendar.setTimeInMillis(System.currentTimeMillis());
14450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        init(mTempCalendar.get(Calendar.YEAR), mTempCalendar.get(Calendar.MONTH),
14550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov                mTempCalendar.get(Calendar.DAY_OF_MONTH), null);
14650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // re-order the number pickers to match the current date format
14850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        reorderPickers();
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setEnabled(boolean enabled) {
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.setEnabled(enabled);
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDayPicker.setEnabled(enabled);
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMonthPicker.setEnabled(enabled);
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mYearPicker.setEnabled(enabled);
15750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        mMiniMonthDayPicker.setEnabled(enabled);
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov    /**
16150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     * Reorders the pickers according to the date format in the current locale.
16250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     */
16350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov    private void reorderPickers() {
16403a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer        java.text.DateFormat format;
16503a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer        String order;
16603a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer
16703a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer        /*
16850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov         * If the user is in a locale where the medium date format is still
16950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov         * numeric (Japanese and Czech, for example), respect the date format
17050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov         * order setting. Otherwise, use the order that the locale says is
17150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov         * appropriate for a spelled-out date.
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
17303a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer
17450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        if (getShortMonths()[0].startsWith("1")) {
17503a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer            format = DateFormat.getDateFormat(getContext());
17603a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer        } else {
17703a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer            format = DateFormat.getMediumDateFormat(getContext());
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17903a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer
18003a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer        if (format instanceof SimpleDateFormat) {
18103a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer            order = ((SimpleDateFormat) format).toPattern();
18203a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer        } else {
18303a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer            // Shouldn't happen, but just in case.
18403a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer            order = new String(DateFormat.getDateFormatOrder(getContext()));
18503a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer        }
18603a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer
18750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        /*
18850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov         * Remove the 3 pickers from their parent and then add them back in the
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * required order.
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
19150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        LinearLayout parent = (LinearLayout) findViewById(R.id.pickers);
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parent.removeAllViews();
19303a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer
19403a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer        boolean quoted = false;
19503a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer        boolean didDay = false, didMonth = false, didYear = false;
19603a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer
19703a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer        for (int i = 0; i < order.length(); i++) {
19803a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer            char c = order.charAt(i);
19903a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer
20003a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer            if (c == '\'') {
20103a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer                quoted = !quoted;
20203a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer            }
20303a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer
20403a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer            if (!quoted) {
20503a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer                if (c == DateFormat.DATE && !didDay) {
20603a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer                    parent.addView(mDayPicker);
20703a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer                    didDay = true;
20803a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer                } else if ((c == DateFormat.MONTH || c == 'L') && !didMonth) {
20903a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer                    parent.addView(mMonthPicker);
21003a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer                    didMonth = true;
21103a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer                } else if (c == DateFormat.YEAR && !didYear) {
21250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov                    parent.addView(mYearPicker);
21303a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer                    didYear = true;
21403a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer                }
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21703a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer
21803a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer        // Shouldn't happen, but just in case.
21903a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer        if (!didMonth) {
22003a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer            parent.addView(mMonthPicker);
22103a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer        }
22203a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer        if (!didDay) {
22303a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer            parent.addView(mDayPicker);
22403a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer        }
22503a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer        if (!didYear) {
22603a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer            parent.addView(mYearPicker);
22703a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer        }
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov    /**
23150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     * Updates the current date.
23250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     *
23350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     * @param year The year.
23450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     * @param month The month which is <strong>starting from zero</strong>.
23550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     * @param dayOfMonth The day of the month.
23650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     */
23750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov    public void updateDate(int year, int month, int dayOfMonth) {
23850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        if (mYearPicker.getCurrent() != year
23950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov                || mDayPicker.getCurrent() != dayOfMonth
24050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov                || mMonthPicker.getCurrent() != month) {
24150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov            updatePickers(year, month, dayOfMonth);
24250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov            updateMiniMonth();
243e3491b6b5f1d3fb871074766597b275d9f682faaKenneth Andersson            notifyDateChanged();
244e3491b6b5f1d3fb871074766597b275d9f682faaKenneth Andersson        }
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov    /**
24850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     * @return The short month abbreviations.
24950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     */
250dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root    private String[] getShortMonths() {
251dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root        final Locale currentLocale = Locale.getDefault();
25250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        if (currentLocale.equals(mMonthLocale)) {
253dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root            return mShortMonths;
254dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root        } else {
25550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov            for (int i = 0; i < mNumberOfMonths; i++) {
25650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov                mShortMonths[i] = DateUtils.getMonthString(Calendar.JANUARY + i,
25750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov                        DateUtils.LENGTH_MEDIUM);
258dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root            }
25950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov            mMonthLocale = currentLocale;
260dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root            return mShortMonths;
261dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root        }
262dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root    }
263dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root
26450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov    // Override so we are in complete control of save / restore for this widget.
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dispatchRestoreInstanceState(SparseArray<Parcelable> container) {
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchThawSelfOnly(container);
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected Parcelable onSaveInstanceState() {
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcelable superState = super.onSaveInstanceState();
27350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        return new SavedState(superState, mYearPicker.getCurrent(), mMonthPicker.getCurrent(),
27450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov                mDayPicker.getCurrent());
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onRestoreInstanceState(Parcelable state) {
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SavedState ss = (SavedState) state;
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onRestoreInstanceState(ss.getSuperState());
28150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        updatePickers(ss.mYear, ss.mMonth, ss.mDay);
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     * Initialize the state. If the provided values designate an inconsistent
28650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     * date the values are normalized before updating the pickers.
28750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     *
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param year The initial year.
28950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     * @param monthOfYear The initial month <strong>starting from zero</strong>.
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dayOfMonth The initial day of the month.
29150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     * @param onDateChangedListener How user is notified date is changed by
29250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     *            user, can be null.
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void init(int year, int monthOfYear, int dayOfMonth,
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            OnDateChangedListener onDateChangedListener) {
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnDateChangedListener = onDateChangedListener;
29750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        updateDate(year, monthOfYear, dayOfMonth);
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov    /**
30150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     * Updates the pickers with the given <code>year</code>, <code>month</code>,
30250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     * and <code>dayOfMonth</code>. If the provided values designate an inconsistent
30350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     * date the values are normalized before updating the pickers.
30450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     */
30550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov    private void updatePickers(int year, int month, int dayOfMonth) {
30650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        // make sure the date is normalized
30750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        mTempCalendar.clear();
30850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        mTempCalendar.set(year, month, dayOfMonth);
30950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        mYearPicker.setCurrent(mTempCalendar.get(Calendar.YEAR));
31050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        mMonthPicker.setCurrent(mTempCalendar.get(Calendar.MONTH));
31150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        mDayPicker.setRange(1, mTempCalendar.getActualMaximum(Calendar.DAY_OF_MONTH));
31250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        mDayPicker.setCurrent(mTempCalendar.get(Calendar.DAY_OF_MONTH));
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov    /**
31650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     * Updates the mini-month with the given year, month, and day selected by the
31750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     * number pickers.
31850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     */
31950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov    private void updateMiniMonth() {
32050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        Calendar selectedDay = mMiniMonthDayPicker.getSelectedDay();
32150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        if (selectedDay.get(Calendar.YEAR) != mYearPicker.getCurrent()
32250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov                || selectedDay.get(Calendar.MONTH) != mMonthPicker.getCurrent()
32350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov                || selectedDay.get(Calendar.DAY_OF_MONTH) != mDayPicker.getCurrent()) {
32450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov            mMiniMonthDayPicker.goTo(mYearPicker.getCurrent(), mMonthPicker.getCurrent(),
32550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov                    mDayPicker.getCurrent(), false, true, false);
32650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        }
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov    /**
33050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     * @return The selected year.
33150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     */
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getYear() {
33350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        return mYearPicker.getCurrent();
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov    /**
33750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     * @return The selected month.
33850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     */
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getMonth() {
34050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        return mMonthPicker.getCurrent();
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov    /**
34450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     * @return The selected day of month.
34550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     */
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getDayOfMonth() {
34750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        return mDayPicker.getCurrent();
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3492bf761c20253222a763bce9a63d14c48ab08a556Suchi Amalapurapu
35050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov    /**
35150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     * Notifies the listener, if such, for a change in the selected date.
35250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     */
35350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov    private void notifyDateChanged() {
35450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        if (mOnDateChangedListener != null) {
35550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov            mOnDateChangedListener.onDateChanged(DatePicker.this, mYearPicker.getCurrent(),
35650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov                    mMonthPicker.getCurrent(), mDayPicker.getCurrent());
3572bf761c20253222a763bce9a63d14c48ab08a556Suchi Amalapurapu        }
3582bf761c20253222a763bce9a63d14c48ab08a556Suchi Amalapurapu    }
359e3491b6b5f1d3fb871074766597b275d9f682faaKenneth Andersson
36050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov    /**
36150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     * Class for managing state storing/restoring.
36250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov     */
36350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov    private static class SavedState extends BaseSavedState {
36450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov
36550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        private final int mYear;
36650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov
36750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        private final int mMonth;
36850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov
36950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        private final int mDay;
37050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov
37150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        /**
37250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov         * Constructor called from {@link DatePicker#onSaveInstanceState()}
37350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov         */
37450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        private SavedState(Parcelable superState, int year, int month, int day) {
37550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov            super(superState);
37650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov            mYear = year;
37750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov            mMonth = month;
37850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov            mDay = day;
37950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        }
38050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov
38150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        /**
38250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov         * Constructor called from {@link #CREATOR}
38350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov         */
38450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        private SavedState(Parcel in) {
38550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov            super(in);
38650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov            mYear = in.readInt();
38750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov            mMonth = in.readInt();
38850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov            mDay = in.readInt();
389e3491b6b5f1d3fb871074766597b275d9f682faaKenneth Andersson        }
39050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov
39150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        @Override
39250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        public void writeToParcel(Parcel dest, int flags) {
39350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov            super.writeToParcel(dest, flags);
39450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov            dest.writeInt(mYear);
39550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov            dest.writeInt(mMonth);
39650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov            dest.writeInt(mDay);
39750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        }
39850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov
39950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        @SuppressWarnings("all")
40050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        // suppress unused and hiding
40150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        public static final Parcelable.Creator<SavedState> CREATOR = new Creator<SavedState>() {
40250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov
40350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov            public SavedState createFromParcel(Parcel in) {
40450f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov                return new SavedState(in);
40550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov            }
40650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov
40750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov            public SavedState[] newArray(int size) {
40850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov                return new SavedState[size];
40950f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov            }
41050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov        };
411e3491b6b5f1d3fb871074766597b275d9f682faaKenneth Andersson    }
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
413