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
19e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.app.Dialog;
20e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.content.Context;
21e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.content.res.Resources;
22e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.os.Bundle;
23e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.text.TextUtils;
24e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.util.AttributeSet;
25e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.View;
26e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.widget.Button;
27e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng
28392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport com.android.contacts.R;
29392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport com.android.contacts.datepicker.DatePicker;
30392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport com.android.contacts.datepicker.DatePickerDialog;
31392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport com.android.contacts.datepicker.DatePickerDialog.OnDateSetListener;
32cd321f65f1e50409812976380ad1f0fdb3fa35cbYorke Leeimport com.android.contacts.common.model.RawContactDelta;
33738ff8623dc77dd91a1b9023861e924ba5e4c27eChiao Chengimport com.android.contacts.common.model.ValuesDelta;
34428f008513d1591cc08fcfe2cf0c9237fb313241Chiao Chengimport com.android.contacts.common.model.account.AccountType.EditField;
35428f008513d1591cc08fcfe2cf0c9237fb313241Chiao Chengimport com.android.contacts.common.model.account.AccountType.EventEditType;
36428f008513d1591cc08fcfe2cf0c9237fb313241Chiao Chengimport com.android.contacts.common.model.dataitem.DataKind;
37cd321f65f1e50409812976380ad1f0fdb3fa35cbYorke Leeimport com.android.contacts.common.util.CommonDateUtils;
38cd321f65f1e50409812976380ad1f0fdb3fa35cbYorke Leeimport com.android.contacts.common.util.DateUtils;
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
50fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan    /**
51fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan     * Default string to show when there is no date selected yet.
52fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan     */
53fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan    private String mNoDateString;
54fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan    private int mPrimaryTextColor;
55fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan    private int mSecondaryTextColor;
56fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan
57135b44c8604e375699e22594e65f0daec14f5bbeDmitri Plotnikov    private Button mDateView;
58392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
59392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public EventFieldEditorView(Context context) {
60392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super(context);
61392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
62392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
63392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public EventFieldEditorView(Context context, AttributeSet attrs) {
64392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super(context, attrs);
65392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
66392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
67392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public EventFieldEditorView(Context context, AttributeSet attrs, int defStyle) {
68392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super(context, attrs, defStyle);
69392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
70392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
7163ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan    /** {@inheritDoc} */
72392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
7363ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan    protected void onFinishInflate() {
7463ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan        super.onFinishInflate();
7563ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan
76fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan        Resources resources = mContext.getResources();
77fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan        mPrimaryTextColor = resources.getColor(R.color.primary_text_color);
78fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan        mSecondaryTextColor = resources.getColor(R.color.secondary_text_color);
799574314dd24a045761453b51244fa75a1da36f6eKatherine Kuan        mNoDateString = mContext.getString(R.string.event_edit_field_hint_text);
80fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan
8163ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan        mDateView = (Button) findViewById(R.id.date_view);
8263ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan        mDateView.setOnClickListener(new OnClickListener() {
8363ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan            @Override
8463ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan            public void onClick(View v) {
8563ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan                showDialog(R.id.dialog_event_date_picker);
8663ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan            }
8763ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan        });
88392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
89392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
90392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
9126918da1650c1ff7b6f92deb978ab976525c811aJosh Gargus    public void editNewlyAddedField() {
9226918da1650c1ff7b6f92deb978ab976525c811aJosh Gargus        showDialog(R.id.dialog_event_date_picker);
9326918da1650c1ff7b6f92deb978ab976525c811aJosh Gargus    }
9426918da1650c1ff7b6f92deb978ab976525c811aJosh Gargus
9526918da1650c1ff7b6f92deb978ab976525c811aJosh Gargus    @Override
96392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    protected void requestFocusForFirstEditField() {
9763ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan        mDateView.requestFocus();
98392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
99392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
100392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
101392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public void setEnabled(boolean enabled) {
102392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super.setEnabled(enabled);
103392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
10463ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan        mDateView.setEnabled(!isReadOnly() && enabled);
105392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
106392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
107392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
108851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public void setValues(DataKind kind, ValuesDelta entry, RawContactDelta state, boolean readOnly,
109392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            ViewIdGenerator vig) {
110392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (kind.fieldList.size() != 1) throw new IllegalStateException("kind must have 1 field");
111392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super.setValues(kind, entry, state, readOnly, vig);
112392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
11363ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan        mDateView.setEnabled(isEnabled() && !readOnly);
114392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
115392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        rebuildDateView();
116392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
117392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
118392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private void rebuildDateView() {
119392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final EditField editField = getKind().fieldList.get(0);
120392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final String column = editField.column;
1214b294d6c96c4865b64338e5d222ff9dc87bad5b9Yorke Lee        String data = DateUtils.formatDate(getContext(), getEntry().getAsString(column),
1224b294d6c96c4865b64338e5d222ff9dc87bad5b9Yorke Lee                false /*Use the short DateFormat to ensure that it fits inside the EditText*/);
123135b44c8604e375699e22594e65f0daec14f5bbeDmitri Plotnikov        if (TextUtils.isEmpty(data)) {
124fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan            mDateView.setText(mNoDateString);
125fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan            mDateView.setTextColor(mSecondaryTextColor);
1265e330ed98f1c2711b4cd3b375a1c0f76bedaf3e1Katherine Kuan            setDeleteButtonVisible(false);
1275e330ed98f1c2711b4cd3b375a1c0f76bedaf3e1Katherine Kuan        } else {
128fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan            mDateView.setText(data);
129fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan            mDateView.setTextColor(mPrimaryTextColor);
1305e330ed98f1c2711b4cd3b375a1c0f76bedaf3e1Katherine Kuan            setDeleteButtonVisible(true);
131135b44c8604e375699e22594e65f0daec14f5bbeDmitri Plotnikov        }
132392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
133392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
1342591436971bad3050c85929c8e0c5a8d48111f88Katherine Kuan    @Override
1352591436971bad3050c85929c8e0c5a8d48111f88Katherine Kuan    public boolean isEmpty() {
136296cca5522815fc51829203d326c335f9824f118Josh Gargus        final EditField editField = getKind().fieldList.get(0);
137296cca5522815fc51829203d326c335f9824f118Josh Gargus        final String column = editField.column;
138296cca5522815fc51829203d326c335f9824f118Josh Gargus        return TextUtils.isEmpty(getEntry().getAsString(column));
1391b22073590c1801c3e6c7bde2f4636632a049f6cKatherine Kuan    }
1401b22073590c1801c3e6c7bde2f4636632a049f6cKatherine Kuan
141392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
142392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public Dialog createDialog(Bundle bundle) {
143392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (bundle == null) throw new IllegalArgumentException("bundle must not be null");
144392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        int dialogId = bundle.getInt(DIALOG_ID_KEY);
145392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        switch (dialogId) {
146392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            case R.id.dialog_event_date_picker:
147392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                return createDatePickerDialog();
148392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            default:
149392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                return super.createDialog(bundle);
150392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
151392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
152392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
153392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
154392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    protected EventEditType getType() {
155392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        return (EventEditType) super.getType();
156392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
157392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
158392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
159392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    protected void onLabelRebuilt() {
160392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        // if we changed to a type that requires a year, ensure that it is actually set
161392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final String column = getKind().fieldList.get(0).column;
162392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final String oldValue = getEntry().getAsString(column);
163392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final DataKind kind = getKind();
164392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
1654b648485346462dc26c3a469caeae8589f5fbd58Daniel Lehmann        final Calendar calendar = Calendar.getInstance(DateUtils.UTC_TIMEZONE, Locale.US);
166392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final int defaultYear = calendar.get(Calendar.YEAR);
167392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
168392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        // Check whether the year is optional
169392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final boolean isYearOptional = getType().isYearOptional();
170392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
17117e6f9d6c0dab8bb02f4f7e2f9f43f8b8449f55aDmitri Plotnikov        if (!isYearOptional && !TextUtils.isEmpty(oldValue)) {
172392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            final ParsePosition position = new ParsePosition(0);
173392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            final Date date2 = kind.dateFormatWithoutYear.parse(oldValue, position);
174392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
175392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            // Don't understand the date, lets not change it
176392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            if (date2 == null) return;
177392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
178392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            // This value is missing the year. Add it now
179392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            calendar.setTime(date2);
180392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            calendar.set(defaultYear, calendar.get(Calendar.MONTH),
181cd321f65f1e50409812976380ad1f0fdb3fa35cbYorke Lee                    calendar.get(Calendar.DAY_OF_MONTH), CommonDateUtils.DEFAULT_HOUR, 0, 0);
182392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
183392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            onFieldChanged(column, kind.dateFormatWithYear.format(calendar.getTime()));
184392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            rebuildDateView();
185392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
186392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
187392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
188392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    /**
189392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     * Prepare dialog for entering a date
190392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     */
191392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private Dialog createDatePickerDialog() {
192392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final String column = getKind().fieldList.get(0).column;
193392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final String oldValue = getEntry().getAsString(column);
194392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final DataKind kind = getKind();
195392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
1964b648485346462dc26c3a469caeae8589f5fbd58Daniel Lehmann        final Calendar calendar = Calendar.getInstance(DateUtils.UTC_TIMEZONE, Locale.US);
197392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final int defaultYear = calendar.get(Calendar.YEAR);
198392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
199392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        // Check whether the year is optional
200392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final boolean isYearOptional = getType().isYearOptional();
201392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
202392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final int oldYear, oldMonth, oldDay;
203ec6bfa0ce4a94edbafb97c7ae2b573abf2aa4a85Yorke Lee
204392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (TextUtils.isEmpty(oldValue)) {
20578253a9e7e8dc5724333fa6a61e537249adac90bYorke Lee            // Default to the current date
206392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            oldYear = defaultYear;
20778253a9e7e8dc5724333fa6a61e537249adac90bYorke Lee            oldMonth = calendar.get(Calendar.MONTH);
20878253a9e7e8dc5724333fa6a61e537249adac90bYorke Lee            oldDay = calendar.get(Calendar.DAY_OF_MONTH);
209392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        } else {
210392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            // Try parsing with year
211ec6bfa0ce4a94edbafb97c7ae2b573abf2aa4a85Yorke Lee            Calendar cal = DateUtils.parseDate(oldValue, false);
212ec6bfa0ce4a94edbafb97c7ae2b573abf2aa4a85Yorke Lee            if (cal != null) {
213ec6bfa0ce4a94edbafb97c7ae2b573abf2aa4a85Yorke Lee                if (DateUtils.isYearSet(cal)) {
214ec6bfa0ce4a94edbafb97c7ae2b573abf2aa4a85Yorke Lee                    oldYear = cal.get(Calendar.YEAR);
2155a7a26962cc781d675280c790789e2dea28a7b34Daniel Lehmann                } else {
216ec6bfa0ce4a94edbafb97c7ae2b573abf2aa4a85Yorke Lee                    //cal.set(Calendar.YEAR, 0);
2175a7a26962cc781d675280c790789e2dea28a7b34Daniel Lehmann                    oldYear = isYearOptional ? DatePickerDialog.NO_YEAR : defaultYear;
2185a7a26962cc781d675280c790789e2dea28a7b34Daniel Lehmann                }
219ec6bfa0ce4a94edbafb97c7ae2b573abf2aa4a85Yorke Lee                oldMonth = cal.get(Calendar.MONTH);
220ec6bfa0ce4a94edbafb97c7ae2b573abf2aa4a85Yorke Lee                oldDay = cal.get(Calendar.DAY_OF_MONTH);
221ec6bfa0ce4a94edbafb97c7ae2b573abf2aa4a85Yorke Lee            } else {
222ec6bfa0ce4a94edbafb97c7ae2b573abf2aa4a85Yorke Lee                return null;
223392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            }
224392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
225392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final OnDateSetListener callBack = new OnDateSetListener() {
226392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            @Override
227392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
228392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                if (year == 0 && !isYearOptional) throw new IllegalStateException();
2294b648485346462dc26c3a469caeae8589f5fbd58Daniel Lehmann                final Calendar outCalendar =
2304b648485346462dc26c3a469caeae8589f5fbd58Daniel Lehmann                        Calendar.getInstance(DateUtils.UTC_TIMEZONE, Locale.US);
231392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
23211812c59ee140d62eaf3a8d826d2018767d490c5Daniel Lehmann                // If no year specified, set it to 2000 (we could pick any leap year here).
23311812c59ee140d62eaf3a8d826d2018767d490c5Daniel Lehmann                // The format string will ignore that year.
234392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                // For formats other than Exchange, the time of the day is ignored
235392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                outCalendar.clear();
2365a7a26962cc781d675280c790789e2dea28a7b34Daniel Lehmann                outCalendar.set(year == DatePickerDialog.NO_YEAR ? 2000 : year, monthOfYear,
237cd321f65f1e50409812976380ad1f0fdb3fa35cbYorke Lee                        dayOfMonth, CommonDateUtils.DEFAULT_HOUR, 0, 0);
238392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
239392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                final String resultString;
240392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                if (year == 0) {
241392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    resultString = kind.dateFormatWithoutYear.format(outCalendar.getTime());
242392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                } else {
243392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    resultString = kind.dateFormatWithYear.format(outCalendar.getTime());
244392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                }
245392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                onFieldChanged(column, resultString);
246392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                rebuildDateView();
247392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            }
248392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        };
249392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final DatePickerDialog resultDialog = new DatePickerDialog(getContext(), callBack,
250392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                oldYear, oldMonth, oldDay, isYearOptional);
251392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        return resultDialog;
252392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
253d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa
2542293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan    @Override
2552293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan    public void clearAllFields() {
2562293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan        // Update UI
257fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan        mDateView.setText(mNoDateString);
258fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan        mDateView.setTextColor(mSecondaryTextColor);
2592293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan
2602293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan        // Update state
2612293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan        final String column = getKind().fieldList.get(0).column;
2622293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan        onFieldChanged(column, "");
2632293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan    }
264392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann}
265