1392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann/* 2392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * Copyright (C) 2010 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 1718ffaa2561cc7dd2e3ef81737e6537931c0a9a11Dmitri Plotnikovpackage com.android.contacts.editor; 18392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 19392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport com.android.contacts.R; 20392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport com.android.contacts.datepicker.DatePicker; 21392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport com.android.contacts.datepicker.DatePickerDialog; 22392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport com.android.contacts.datepicker.DatePickerDialog.OnDateSetListener; 234597c92d655d45447780b32c7572acef110b6ed1Dmitri Plotnikovimport com.android.contacts.model.AccountType.EditField; 244597c92d655d45447780b32c7572acef110b6ed1Dmitri Plotnikovimport com.android.contacts.model.AccountType.EventEditType; 25405671a7b42d97ebf7ae7c0eeb4721f881139673Daisuke Miyakawaimport com.android.contacts.model.DataKind; 26392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport com.android.contacts.model.EntityDelta; 27392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport com.android.contacts.model.EntityDelta.ValuesDelta; 28392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport com.android.contacts.util.DateUtils; 29392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 30392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.app.Dialog; 31392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.content.Context; 32fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuanimport android.content.res.ColorStateList; 33fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuanimport android.content.res.Resources; 34392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.os.Bundle; 35392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.text.TextUtils; 36392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.util.AttributeSet; 37392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.view.View; 38135b44c8604e375699e22594e65f0daec14f5bbeDmitri Plotnikovimport android.widget.Button; 39392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 40392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport java.text.ParsePosition; 41392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport java.util.Calendar; 42392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport java.util.Date; 434b648485346462dc26c3a469caeae8589f5fbd58Daniel Lehmannimport java.util.Locale; 44392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 45392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann/** 46392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * Editor that allows editing Events using a {@link DatePickerDialog} 47392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann */ 48392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannpublic class EventFieldEditorView extends LabeledEditorView { 49392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann /** 50392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * Exchange requires 8:00 for birthdays 51392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann */ 52d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa private final static int DEFAULT_HOUR = 8; 53392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 54fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan /** 55fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan * Default string to show when there is no date selected yet. 56fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan */ 57fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan private String mNoDateString; 58fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan private int mPrimaryTextColor; 59fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan private int mSecondaryTextColor; 60fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan 61135b44c8604e375699e22594e65f0daec14f5bbeDmitri Plotnikov private Button mDateView; 62392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 63392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann public EventFieldEditorView(Context context) { 64392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann super(context); 65392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 66392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 67392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann public EventFieldEditorView(Context context, AttributeSet attrs) { 68392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann super(context, attrs); 69392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 70392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 71392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann public EventFieldEditorView(Context context, AttributeSet attrs, int defStyle) { 72392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann super(context, attrs, defStyle); 73392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 74392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 7563ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan /** {@inheritDoc} */ 76392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann @Override 7763ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan protected void onFinishInflate() { 7863ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan super.onFinishInflate(); 7963ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan 80fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan Resources resources = mContext.getResources(); 81fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan mPrimaryTextColor = resources.getColor(R.color.primary_text_color); 82fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan mSecondaryTextColor = resources.getColor(R.color.secondary_text_color); 839574314dd24a045761453b51244fa75a1da36f6eKatherine Kuan mNoDateString = mContext.getString(R.string.event_edit_field_hint_text); 84fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan 8563ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan mDateView = (Button) findViewById(R.id.date_view); 8663ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan mDateView.setOnClickListener(new OnClickListener() { 8763ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan @Override 8863ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan public void onClick(View v) { 8963ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan showDialog(R.id.dialog_event_date_picker); 9063ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan } 9163ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan }); 92392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 93392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 94392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann @Override 95392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann protected void requestFocusForFirstEditField() { 9663ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan mDateView.requestFocus(); 97392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 98392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 99392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann @Override 100392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann public void setEnabled(boolean enabled) { 101392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann super.setEnabled(enabled); 102392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 10363ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan mDateView.setEnabled(!isReadOnly() && enabled); 104392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 105392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 106392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann @Override 107392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann public void setValues(DataKind kind, ValuesDelta entry, EntityDelta state, boolean readOnly, 108392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann ViewIdGenerator vig) { 109392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann if (kind.fieldList.size() != 1) throw new IllegalStateException("kind must have 1 field"); 110392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann super.setValues(kind, entry, state, readOnly, vig); 111392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 11263ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan mDateView.setEnabled(isEnabled() && !readOnly); 113392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 114392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann rebuildDateView(); 115392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 116392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 117392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann private void rebuildDateView() { 118392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final EditField editField = getKind().fieldList.get(0); 119392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final String column = editField.column; 120135b44c8604e375699e22594e65f0daec14f5bbeDmitri Plotnikov String data = DateUtils.formatDate(getContext(), getEntry().getAsString(column)); 121135b44c8604e375699e22594e65f0daec14f5bbeDmitri Plotnikov if (TextUtils.isEmpty(data)) { 122fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan mDateView.setText(mNoDateString); 123fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan mDateView.setTextColor(mSecondaryTextColor); 1245e330ed98f1c2711b4cd3b375a1c0f76bedaf3e1Katherine Kuan setDeleteButtonVisible(false); 1255e330ed98f1c2711b4cd3b375a1c0f76bedaf3e1Katherine Kuan } else { 126fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan mDateView.setText(data); 127fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan mDateView.setTextColor(mPrimaryTextColor); 1285e330ed98f1c2711b4cd3b375a1c0f76bedaf3e1Katherine Kuan setDeleteButtonVisible(true); 129135b44c8604e375699e22594e65f0daec14f5bbeDmitri Plotnikov } 130392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 131392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 1322591436971bad3050c85929c8e0c5a8d48111f88Katherine Kuan @Override 1332591436971bad3050c85929c8e0c5a8d48111f88Katherine Kuan public boolean isEmpty() { 1341b22073590c1801c3e6c7bde2f4636632a049f6cKatherine Kuan return TextUtils.isEmpty(mDateView.getText()); 1351b22073590c1801c3e6c7bde2f4636632a049f6cKatherine Kuan } 1361b22073590c1801c3e6c7bde2f4636632a049f6cKatherine Kuan 137392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann @Override 138392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann public Dialog createDialog(Bundle bundle) { 139392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann if (bundle == null) throw new IllegalArgumentException("bundle must not be null"); 140392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann int dialogId = bundle.getInt(DIALOG_ID_KEY); 141392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann switch (dialogId) { 142392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann case R.id.dialog_event_date_picker: 143392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann return createDatePickerDialog(); 144392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann default: 145392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann return super.createDialog(bundle); 146392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 147392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 148392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 149392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann @Override 150392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann protected EventEditType getType() { 151392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann return (EventEditType) super.getType(); 152392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 153392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 154392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann @Override 155392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann protected void onLabelRebuilt() { 156392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann // if we changed to a type that requires a year, ensure that it is actually set 157392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final String column = getKind().fieldList.get(0).column; 158392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final String oldValue = getEntry().getAsString(column); 159392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final DataKind kind = getKind(); 160392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 1614b648485346462dc26c3a469caeae8589f5fbd58Daniel Lehmann final Calendar calendar = Calendar.getInstance(DateUtils.UTC_TIMEZONE, Locale.US); 162392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final int defaultYear = calendar.get(Calendar.YEAR); 163392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 164392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann // Check whether the year is optional 165392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final boolean isYearOptional = getType().isYearOptional(); 166392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 16717e6f9d6c0dab8bb02f4f7e2f9f43f8b8449f55aDmitri Plotnikov if (!isYearOptional && !TextUtils.isEmpty(oldValue)) { 168392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final ParsePosition position = new ParsePosition(0); 169392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final Date date2 = kind.dateFormatWithoutYear.parse(oldValue, position); 170392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 171392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann // Don't understand the date, lets not change it 172392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann if (date2 == null) return; 173392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 174392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann // This value is missing the year. Add it now 175392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann calendar.setTime(date2); 176392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann calendar.set(defaultYear, calendar.get(Calendar.MONTH), 177392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann calendar.get(Calendar.DAY_OF_MONTH), DEFAULT_HOUR, 0, 0); 178392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 179392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann onFieldChanged(column, kind.dateFormatWithYear.format(calendar.getTime())); 180392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann rebuildDateView(); 181392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 182392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 183392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 184392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann /** 185392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * Prepare dialog for entering a date 186392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann */ 187392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann private Dialog createDatePickerDialog() { 188392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final String column = getKind().fieldList.get(0).column; 189392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final String oldValue = getEntry().getAsString(column); 190392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final DataKind kind = getKind(); 191392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 1924b648485346462dc26c3a469caeae8589f5fbd58Daniel Lehmann final Calendar calendar = Calendar.getInstance(DateUtils.UTC_TIMEZONE, Locale.US); 193392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final int defaultYear = calendar.get(Calendar.YEAR); 194392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 195392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann // Check whether the year is optional 196392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final boolean isYearOptional = getType().isYearOptional(); 197392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 198392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final int oldYear, oldMonth, oldDay; 199392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann if (TextUtils.isEmpty(oldValue)) { 200392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann // Default to January first, 30 years ago 201392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann oldYear = defaultYear; 202392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann oldMonth = 0; 203392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann oldDay = 1; 204392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } else { 205392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final ParsePosition position = new ParsePosition(0); 206392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann // Try parsing with year 2072b3f95cc12b76523410782d4178562ce241410efDmitri Plotnikov Date date1 = kind.dateFormatWithYear.parse(oldValue, position); 2082b3f95cc12b76523410782d4178562ce241410efDmitri Plotnikov if (date1 == null) { 2092b3f95cc12b76523410782d4178562ce241410efDmitri Plotnikov // If that format does not fit, try guessing the right format 2102b3f95cc12b76523410782d4178562ce241410efDmitri Plotnikov date1 = DateUtils.parseDate(oldValue); 2112b3f95cc12b76523410782d4178562ce241410efDmitri Plotnikov } 212392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann if (date1 != null) { 213392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann calendar.setTime(date1); 214392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann oldYear = calendar.get(Calendar.YEAR); 215392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann oldMonth = calendar.get(Calendar.MONTH); 216392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann oldDay = calendar.get(Calendar.DAY_OF_MONTH); 217392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } else { 218392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final Date date2 = kind.dateFormatWithoutYear.parse(oldValue, position); 219392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann // Don't understand the date, lets not change it 220392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann if (date2 == null) return null; 221392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann calendar.setTime(date2); 222392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann oldYear = isYearOptional ? 0 : defaultYear; 223392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann oldMonth = calendar.get(Calendar.MONTH); 224392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann oldDay = calendar.get(Calendar.DAY_OF_MONTH); 225392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 226392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 227392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final OnDateSetListener callBack = new OnDateSetListener() { 228392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann @Override 229392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 230392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann if (year == 0 && !isYearOptional) throw new IllegalStateException(); 2314b648485346462dc26c3a469caeae8589f5fbd58Daniel Lehmann final Calendar outCalendar = 2324b648485346462dc26c3a469caeae8589f5fbd58Daniel Lehmann Calendar.getInstance(DateUtils.UTC_TIMEZONE, Locale.US); 233392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 234392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann // If no year specified, set it to 1900. The format string will ignore that year 235392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann // For formats other than Exchange, the time of the day is ignored 236392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann outCalendar.clear(); 237392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann outCalendar.set(year == 0 ? 1900 : year, monthOfYear, dayOfMonth, 238392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann DEFAULT_HOUR, 0, 0); 239392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann 240392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final String resultString; 241392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann if (year == 0) { 242392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann resultString = kind.dateFormatWithoutYear.format(outCalendar.getTime()); 243392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } else { 244392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann resultString = kind.dateFormatWithYear.format(outCalendar.getTime()); 245392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 246392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann onFieldChanged(column, resultString); 247392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann rebuildDateView(); 248392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 249392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann }; 250392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann final DatePickerDialog resultDialog = new DatePickerDialog(getContext(), callBack, 251392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann oldYear, oldMonth, oldDay, isYearOptional); 252392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann return resultDialog; 253392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann } 254d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa 255d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa /** 256d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa * @return Default hour which should be used for birthday field. 257d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa */ 258d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa public static int getDefaultHourForBirthday() { 259d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa return DEFAULT_HOUR; 260d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa } 2612293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan 2622293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan @Override 2632293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan public void clearAllFields() { 2642293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan // Update UI 265fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan mDateView.setText(mNoDateString); 266fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan mDateView.setTextColor(mSecondaryTextColor); 2672293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan 2682293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan // Update state 2692293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan final String column = getKind().fieldList.get(0).column; 2702293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan onFieldChanged(column, ""); 2712293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan } 272392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann} 273