1392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann/*
2392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * Copyright (C) 2007 The Android Open Source Project
3392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann *
4392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * Licensed under the Apache License, Version 2.0 (the "License");
5392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * you may not use this file except in compliance with the License.
6392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * You may obtain a copy of the License at
7392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann *
8392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann *      http://www.apache.org/licenses/LICENSE-2.0
9392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann *
10392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * Unless required by applicable law or agreed to in writing, software
11392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * distributed under the License is distributed on an "AS IS" BASIS,
12392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * See the License for the specific language governing permissions and
14392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * limitations under the License.
15392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann */
16392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
17392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannpackage com.android.contacts.datepicker;
18392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
19392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann// This is a fork of the standard Android DatePicker that additionally allows toggling the year
20392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann// on/off. It uses some private API so that not everything has to be copied.
21392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
22392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport com.android.contacts.R;
23392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
24392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.annotation.Widget;
25392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.content.Context;
26392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.content.res.TypedArray;
27392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.os.Parcel;
28392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.os.Parcelable;
29392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.text.format.DateFormat;
30392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.util.AttributeSet;
31392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.util.SparseArray;
32392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.view.LayoutInflater;
33392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.view.View;
34392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.widget.CheckBox;
35392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.widget.CompoundButton;
36392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.widget.CompoundButton.OnCheckedChangeListener;
37392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.widget.FrameLayout;
38392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.widget.LinearLayout;
39392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.widget.NumberPicker;
40537af4ff5837ea172602793326594dccc057bbbfSvetoslav Ganovimport android.widget.NumberPicker.OnValueChangeListener;
41392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
42392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport java.text.DateFormatSymbols;
43392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport java.text.SimpleDateFormat;
44392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport java.util.Calendar;
45392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
46392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann/**
47392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * A view for selecting a month / year / day based on a calendar like layout.
48392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann *
49392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * <p>See the <a href="{@docRoot}resources/tutorials/views/hello-datepicker.html">Date Picker
50392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * tutorial</a>.</p>
51392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann *
52392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * For a dialog using this view, see {@link android.app.DatePickerDialog}.
53392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann */
54392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann@Widget
55392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannpublic class DatePicker extends FrameLayout {
56392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
57392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private static final int DEFAULT_START_YEAR = 1900;
58392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private static final int DEFAULT_END_YEAR = 2100;
59392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
60392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    /* UI Components */
61392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private final CheckBox mYearToggle;
62392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private final NumberPicker mDayPicker;
63392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private final NumberPicker mMonthPicker;
64392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private final NumberPicker mYearPicker;
65392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
66392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    /**
67392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     * How we notify users the date has changed.
68392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     */
69392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private OnDateChangedListener mOnDateChangedListener;
70392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
71392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private int mDay;
72392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private int mMonth;
73392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private int mYear;
74392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private boolean mYearOptional;
75392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private boolean mHasYear;
76392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
77392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    /**
78392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     * The callback used to indicate the user changes the date.
79392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     */
80392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public interface OnDateChangedListener {
81392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
82392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        /**
83392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann         * @param view The view associated with this listener.
84392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann         * @param year The year that was set.
85392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann         * @param monthOfYear The month that was set (0-11) for compatibility
86392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann         *  with {@link java.util.Calendar}.
87392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann         * @param dayOfMonth The day of the month that was set.
88392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann         */
89392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth);
90392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
91392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
92392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public DatePicker(Context context) {
93392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        this(context, null);
94392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
95392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
96392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public DatePicker(Context context, AttributeSet attrs) {
97392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        this(context, attrs, 0);
98392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
99392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
100392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public DatePicker(Context context, AttributeSet attrs, int defStyle) {
101392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super(context, attrs, defStyle);
102392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
103392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        LayoutInflater inflater = (LayoutInflater) context.getSystemService(
104392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                Context.LAYOUT_INFLATER_SERVICE);
105392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        inflater.inflate(R.layout.date_picker, this, true);
106392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
107392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        mDayPicker = (NumberPicker) findViewById(R.id.day);
108392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        mDayPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
1099a0519f4f765c3039fc6e6a9e231f1437a9750d6Svetoslav Ganov        mDayPicker.setOnLongPressUpdateInterval(100);
110537af4ff5837ea172602793326594dccc057bbbfSvetoslav Ganov        mDayPicker.setOnValueChangedListener(new OnValueChangeListener() {
11121c3897231d5650fe86ad3223d76b3a55411ac64Svetoslav Ganov            public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
112392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                mDay = newVal;
113392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                notifyDateChanged();
114392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            }
115392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        });
116392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        mMonthPicker = (NumberPicker) findViewById(R.id.month);
117392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        mMonthPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
118392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        DateFormatSymbols dfs = new DateFormatSymbols();
119392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        String[] months = dfs.getShortMonths();
120392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
121392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        /*
122392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann         * If the user is in a locale where the month names are numeric,
123392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann         * use just the number instead of the "month" character for
124392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann         * consistency with the other fields.
125392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann         */
126392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (months[0].startsWith("1")) {
127392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            for (int i = 0; i < months.length; i++) {
128392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                months[i] = String.valueOf(i + 1);
129392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            }
13021c3897231d5650fe86ad3223d76b3a55411ac64Svetoslav Ganov            mMonthPicker.setMinValue(1);
13121c3897231d5650fe86ad3223d76b3a55411ac64Svetoslav Ganov            mMonthPicker.setMaxValue(12);
132392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        } else {
13321c3897231d5650fe86ad3223d76b3a55411ac64Svetoslav Ganov            mMonthPicker.setMinValue(1);
13421c3897231d5650fe86ad3223d76b3a55411ac64Svetoslav Ganov            mMonthPicker.setMaxValue(12);
13521c3897231d5650fe86ad3223d76b3a55411ac64Svetoslav Ganov            mMonthPicker.setDisplayedValues(months);
136392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
137392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
1389a0519f4f765c3039fc6e6a9e231f1437a9750d6Svetoslav Ganov        mMonthPicker.setOnLongPressUpdateInterval(200);
139537af4ff5837ea172602793326594dccc057bbbfSvetoslav Ganov        mMonthPicker.setOnValueChangedListener(new OnValueChangeListener() {
14021c3897231d5650fe86ad3223d76b3a55411ac64Svetoslav Ganov            public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
141392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
142392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                /* We display the month 1-12 but store it 0-11 so always
143392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                 * subtract by one to ensure our internal state is always 0-11
144392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                 */
145392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                mMonth = newVal - 1;
146392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                // Adjust max day of the month
147392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                adjustMaxDay();
148392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                notifyDateChanged();
149392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                updateDaySpinner();
150392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            }
151392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        });
152392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        mYearPicker = (NumberPicker) findViewById(R.id.year);
1539a0519f4f765c3039fc6e6a9e231f1437a9750d6Svetoslav Ganov        mYearPicker.setOnLongPressUpdateInterval(100);
154537af4ff5837ea172602793326594dccc057bbbfSvetoslav Ganov        mYearPicker.setOnValueChangedListener(new OnValueChangeListener() {
15521c3897231d5650fe86ad3223d76b3a55411ac64Svetoslav Ganov            public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
156392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                mYear = newVal;
157392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                // Adjust max day for leap years if needed
158392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                adjustMaxDay();
159392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                notifyDateChanged();
160392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                updateDaySpinner();
161392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            }
162392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        });
163392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
164392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        mYearToggle = (CheckBox) findViewById(R.id.yearToggle);
165392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        mYearToggle.setOnCheckedChangeListener(new OnCheckedChangeListener() {
166392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            @Override
167392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
168392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                mHasYear = isChecked;
169392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                adjustMaxDay();
170392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                notifyDateChanged();
171392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                updateSpinners();
172392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            }
173392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        });
174392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
175392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        // attributes
176392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        TypedArray a = context.obtainStyledAttributes(attrs,
177392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                com.android.internal.R.styleable.DatePicker);
178392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
179392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        int mStartYear =
180392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                a.getInt(com.android.internal.R.styleable.DatePicker_startYear, DEFAULT_START_YEAR);
181392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        int mEndYear =
182392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                a.getInt(com.android.internal.R.styleable.DatePicker_endYear, DEFAULT_END_YEAR);
18321c3897231d5650fe86ad3223d76b3a55411ac64Svetoslav Ganov        mYearPicker.setMinValue(mStartYear);
18421c3897231d5650fe86ad3223d76b3a55411ac64Svetoslav Ganov        mYearPicker.setMaxValue(mEndYear);
185392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
186392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        a.recycle();
187392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
188392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        // initialize to current date
189392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        Calendar cal = Calendar.getInstance();
190392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        init(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), null);
191392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
192392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        // re-order the number pickers to match the current date format
193392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        reorderPickers(months);
194392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
195392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (!isEnabled()) {
196392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            setEnabled(false);
197392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
198392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
199392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
200392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
201392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public void setEnabled(boolean enabled) {
202392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super.setEnabled(enabled);
203392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        mDayPicker.setEnabled(enabled);
204392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        mMonthPicker.setEnabled(enabled);
205392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        mYearPicker.setEnabled(enabled);
206392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
207392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
208392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private void reorderPickers(String[] months) {
209392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        java.text.DateFormat format;
210392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        String order;
211392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
212392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        /*
213392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann         * If the user is in a locale where the medium date format is
214392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann         * still numeric (Japanese and Czech, for example), respect
215392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann         * the date format order setting.  Otherwise, use the order
216392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann         * that the locale says is appropriate for a spelled-out date.
217392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann         */
218392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
219392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (months[0].startsWith("1")) {
220392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            format = DateFormat.getDateFormat(getContext());
221392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        } else {
222392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            format = DateFormat.getMediumDateFormat(getContext());
223392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
224392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
225392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (format instanceof SimpleDateFormat) {
226392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            order = ((SimpleDateFormat) format).toPattern();
227392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        } else {
228392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            // Shouldn't happen, but just in case.
229392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            order = new String(DateFormat.getDateFormatOrder(getContext()));
230392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
231392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
232392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        /* Remove the 3 pickers from their parent and then add them back in the
233392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann         * required order.
234392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann         */
235392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        LinearLayout parent = (LinearLayout) findViewById(R.id.parent);
236392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        parent.removeAllViews();
237392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
238392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        boolean quoted = false;
239392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        boolean didDay = false, didMonth = false, didYear = false;
240392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
241392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        for (int i = 0; i < order.length(); i++) {
242392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            char c = order.charAt(i);
243392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
244392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            if (c == '\'') {
245392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                quoted = !quoted;
246392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            }
247392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
248392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            if (!quoted) {
249392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                if (c == DateFormat.DATE && !didDay) {
250392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    parent.addView(mDayPicker);
251392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    didDay = true;
252392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                } else if ((c == DateFormat.MONTH || c == 'L') && !didMonth) {
253392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    parent.addView(mMonthPicker);
254392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    didMonth = true;
255392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                } else if (c == DateFormat.YEAR && !didYear) {
256392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    parent.addView (mYearPicker);
257392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    didYear = true;
258392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                }
259392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            }
260392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
261392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
262392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        // Shouldn't happen, but just in case.
263392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (!didMonth) {
264392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            parent.addView(mMonthPicker);
265392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
266392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (!didDay) {
267392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            parent.addView(mDayPicker);
268392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
269392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (!didYear) {
270392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            parent.addView(mYearPicker);
271392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
272392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
273392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
274392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public void updateDate(int year, int monthOfYear, int dayOfMonth) {
275392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (mYear != year || mMonth != monthOfYear || mDay != dayOfMonth) {
276392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            mYear = (mYearOptional && year == 0) ? getCurrentYear() : year;
277392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            mMonth = monthOfYear;
278392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            mDay = dayOfMonth;
279392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            updateSpinners();
280392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            reorderPickers(new DateFormatSymbols().getShortMonths());
281392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            notifyDateChanged();
282392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
283392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
284392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
285392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private int getCurrentYear() {
286392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        return Calendar.getInstance().get(Calendar.YEAR);
287392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
288392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
289392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private static class SavedState extends BaseSavedState {
290392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
291392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        private final int mYear;
292392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        private final int mMonth;
293392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        private final int mDay;
294392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        private final boolean mHasYear;
295392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        private final boolean mYearOptional;
296392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
297392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        /**
298392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann         * Constructor called from {@link DatePicker#onSaveInstanceState()}
299392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann         */
300392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        private SavedState(Parcelable superState, int year, int month, int day, boolean hasYear,
301392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                boolean yearOptional) {
302392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            super(superState);
303392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            mYear = year;
304392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            mMonth = month;
305392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            mDay = day;
306392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            mHasYear = hasYear;
307392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            mYearOptional = yearOptional;
308392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
309392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
310392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        /**
311392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann         * Constructor called from {@link #CREATOR}
312392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann         */
313392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        private SavedState(Parcel in) {
314392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            super(in);
315392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            mYear = in.readInt();
316392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            mMonth = in.readInt();
317392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            mDay = in.readInt();
318392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            mHasYear = in.readInt() != 0;
319392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            mYearOptional = in.readInt() != 0;
320392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
321392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
322392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        public int getYear() {
323392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            return mYear;
324392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
325392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
326392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        public int getMonth() {
327392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            return mMonth;
328392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
329392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
330392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        public int getDay() {
331392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            return mDay;
332392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
333392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
334392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        public boolean hasYear() {
335392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            return mHasYear;
336392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
337392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
338392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        public boolean isYearOptional() {
339392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            return mYearOptional;
340392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
341392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
342392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        @Override
343392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        public void writeToParcel(Parcel dest, int flags) {
344392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            super.writeToParcel(dest, flags);
345392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            dest.writeInt(mYear);
346392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            dest.writeInt(mMonth);
347392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            dest.writeInt(mDay);
348392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            dest.writeInt(mHasYear ? 1 : 0);
349392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            dest.writeInt(mYearOptional ? 1 : 0);
350392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
351392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
35221c3897231d5650fe86ad3223d76b3a55411ac64Svetoslav Ganov        @SuppressWarnings("unused")
353392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        public static final Parcelable.Creator<SavedState> CREATOR =
354392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                new Creator<SavedState>() {
355392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
356392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    public SavedState createFromParcel(Parcel in) {
357392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                        return new SavedState(in);
358392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    }
359392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
360392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    public SavedState[] newArray(int size) {
361392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                        return new SavedState[size];
362392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    }
363392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                };
364392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
365392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
366392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
367392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    /**
368392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     * Override so we are in complete control of save / restore for this widget.
369392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     */
370392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
371392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    protected void dispatchRestoreInstanceState(SparseArray<Parcelable> container) {
372392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        dispatchThawSelfOnly(container);
373392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
374392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
375392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
376392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    protected Parcelable onSaveInstanceState() {
377392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        Parcelable superState = super.onSaveInstanceState();
378392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
379392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        return new SavedState(superState, mYear, mMonth, mDay, mHasYear, mYearOptional);
380392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
381392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
382392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
383392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    protected void onRestoreInstanceState(Parcelable state) {
384392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        SavedState ss = (SavedState) state;
385392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super.onRestoreInstanceState(ss.getSuperState());
386392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        mYear = ss.getYear();
387392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        mMonth = ss.getMonth();
388392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        mDay = ss.getDay();
389392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        mHasYear = ss.hasYear();
390392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        mYearOptional = ss.isYearOptional();
391392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        updateSpinners();
392392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
393392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
394392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    /**
395392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     * Initialize the state.
396392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     * @param year The initial year.
397392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     * @param monthOfYear The initial month.
398392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     * @param dayOfMonth The initial day of the month.
399392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     * @param onDateChangedListener How user is notified date is changed by user, can be null.
400392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     */
401392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public void init(int year, int monthOfYear, int dayOfMonth,
402392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            OnDateChangedListener onDateChangedListener) {
403392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        init(year, monthOfYear, dayOfMonth, false, onDateChangedListener);
404392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
405392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
406392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    /**
407392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     * Initialize the state.
408392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     * @param year The initial year or 0 if no year has been specified
409392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     * @param monthOfYear The initial month.
410392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     * @param dayOfMonth The initial day of the month.
411392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     * @param yearOptional True if the user can toggle the year
412392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     * @param onDateChangedListener How user is notified date is changed by user, can be null.
413392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     */
414392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public void init(int year, int monthOfYear, int dayOfMonth, boolean yearOptional,
415392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            OnDateChangedListener onDateChangedListener) {
416392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        mYear = (yearOptional && year == 0) ? getCurrentYear() : year;
417392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        mMonth = monthOfYear;
418392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        mDay = dayOfMonth;
419392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        mYearOptional = yearOptional;
420392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        mHasYear = yearOptional ? (year != 0) : true;
421392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        mOnDateChangedListener = onDateChangedListener;
422392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        updateSpinners();
423392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
424392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
425392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private void updateSpinners() {
426392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        updateDaySpinner();
427392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        mYearToggle.setChecked(mHasYear);
428392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        mYearToggle.setVisibility(mYearOptional ? View.VISIBLE : View.GONE);
42921c3897231d5650fe86ad3223d76b3a55411ac64Svetoslav Ganov        mYearPicker.setValue(mYear);
430392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        mYearPicker.setVisibility(mHasYear ? View.VISIBLE : View.GONE);
431392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
432392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        /* The month display uses 1-12 but our internal state stores it
433392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann         * 0-11 so add one when setting the display.
434392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann         */
43521c3897231d5650fe86ad3223d76b3a55411ac64Svetoslav Ganov        mMonthPicker.setValue(mMonth + 1);
436392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
437392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
438392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private void updateDaySpinner() {
439392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        Calendar cal = Calendar.getInstance();
440392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        // if year was not set, use 2000 as it was a leap year
441392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        cal.set(mHasYear ? mYear : 2000, mMonth, 1);
442392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        int max = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
44321c3897231d5650fe86ad3223d76b3a55411ac64Svetoslav Ganov        mDayPicker.setMinValue(1);
44421c3897231d5650fe86ad3223d76b3a55411ac64Svetoslav Ganov        mDayPicker.setMaxValue(max);
44521c3897231d5650fe86ad3223d76b3a55411ac64Svetoslav Ganov        mDayPicker.setValue(mDay);
446392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
447392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
448392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public int getYear() {
449392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        return (mYearOptional && !mHasYear) ? 0 : mYear;
450392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
451392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
452392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public boolean isYearOptional() {
453392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        return mYearOptional;
454392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
455392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
456392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public int getMonth() {
457392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        return mMonth;
458392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
459392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
460392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public int getDayOfMonth() {
461392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        return mDay;
462392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
463392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
464392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private void adjustMaxDay(){
465392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        Calendar cal = Calendar.getInstance();
466392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        // if year was not set, use 2000 as it was a leap year
467392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        cal.set(Calendar.YEAR, mHasYear ? mYear : 2000);
468392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        cal.set(Calendar.MONTH, mMonth);
469392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        int max = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
470392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (mDay > max) {
471392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            mDay = max;
472392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
473392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
474392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
475392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private void notifyDateChanged() {
476392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (mOnDateChangedListener != null) {
477392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            int year = (mYearOptional && !mHasYear) ? 0 : mYear;
478392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            mOnDateChangedListener.onDateChanged(DatePicker.this, year, mMonth, mDay);
479392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
480392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
481392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann}
482