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