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