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;
232da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wangimport android.provider.ContactsContract.CommonDataKinds.Event;
24e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.text.TextUtils;
25e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.util.AttributeSet;
26e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.view.View;
27e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.widget.Button;
28e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng
29392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport com.android.contacts.R;
30392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport com.android.contacts.datepicker.DatePicker;
31392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport com.android.contacts.datepicker.DatePickerDialog;
32392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport com.android.contacts.datepicker.DatePickerDialog.OnDateSetListener;
3369c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.RawContactDelta;
3469c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.ValuesDelta;
3569c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.account.AccountType.EditField;
3669c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.account.AccountType.EventEditType;
3769c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.dataitem.DataKind;
3869c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.util.CommonDateUtils;
3969c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.util.DateUtils;
40392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
41392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport java.text.ParsePosition;
42392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport java.util.Calendar;
43392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport java.util.Date;
444b648485346462dc26c3a469caeae8589f5fbd58Daniel Lehmannimport java.util.Locale;
45392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
46392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann/**
47392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * Editor that allows editing Events using a {@link DatePickerDialog}
48392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann */
49392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannpublic class EventFieldEditorView extends LabeledEditorView {
50392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
51fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan    /**
52fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan     * Default string to show when there is no date selected yet.
53fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan     */
54fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan    private String mNoDateString;
55fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan    private int mPrimaryTextColor;
56d690dff231dd5a81b9bd7563838455f24e49c75cBrian Attwell    private int mHintTextColor;
57fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan
58135b44c8604e375699e22594e65f0daec14f5bbeDmitri Plotnikov    private Button mDateView;
59392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
60392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public EventFieldEditorView(Context context) {
61392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super(context);
62392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
63392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
64392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public EventFieldEditorView(Context context, AttributeSet attrs) {
65392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super(context, attrs);
66392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
67392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
68392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public EventFieldEditorView(Context context, AttributeSet attrs, int defStyle) {
69392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super(context, attrs, defStyle);
70392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
71392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
7263ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan    /** {@inheritDoc} */
73392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
7463ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan    protected void onFinishInflate() {
7563ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan        super.onFinishInflate();
7663ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan
77f140227beb6d9e78955a7676dc0dd3f793f72017Brian Attwell        Resources resources = getContext().getResources();
78fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan        mPrimaryTextColor = resources.getColor(R.color.primary_text_color);
79d690dff231dd5a81b9bd7563838455f24e49c75cBrian Attwell        mHintTextColor = resources.getColor(R.color.editor_disabled_text_color);
80f140227beb6d9e78955a7676dc0dd3f793f72017Brian Attwell        mNoDateString = getContext().getString(R.string.event_edit_field_hint_text);
81fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan
8263ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan        mDateView = (Button) findViewById(R.id.date_view);
8363ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan        mDateView.setOnClickListener(new OnClickListener() {
8463ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan            @Override
8563ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan            public void onClick(View v) {
8663ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan                showDialog(R.id.dialog_event_date_picker);
8763ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan            }
8863ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan        });
89392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
90392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
91392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
9226918da1650c1ff7b6f92deb978ab976525c811aJosh Gargus    public void editNewlyAddedField() {
9326918da1650c1ff7b6f92deb978ab976525c811aJosh Gargus        showDialog(R.id.dialog_event_date_picker);
9426918da1650c1ff7b6f92deb978ab976525c811aJosh Gargus    }
9526918da1650c1ff7b6f92deb978ab976525c811aJosh Gargus
9626918da1650c1ff7b6f92deb978ab976525c811aJosh Gargus    @Override
97392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    protected void requestFocusForFirstEditField() {
9863ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan        mDateView.requestFocus();
99392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
100392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
101392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
102392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public void setEnabled(boolean enabled) {
103392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super.setEnabled(enabled);
104392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
10563ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan        mDateView.setEnabled(!isReadOnly() && enabled);
106392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
107392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
108392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
109851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public void setValues(DataKind kind, ValuesDelta entry, RawContactDelta state, boolean readOnly,
110392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            ViewIdGenerator vig) {
111392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (kind.fieldList.size() != 1) throw new IllegalStateException("kind must have 1 field");
112392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super.setValues(kind, entry, state, readOnly, vig);
113392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
11463ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan        mDateView.setEnabled(isEnabled() && !readOnly);
115392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
116392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        rebuildDateView();
1178f9d84fffbc32b50cf3133b2340b18d0510a6c6eBrian Attwell        updateEmptiness();
118392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
119392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
120392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private void rebuildDateView() {
121392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final EditField editField = getKind().fieldList.get(0);
122392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final String column = editField.column;
1234b294d6c96c4865b64338e5d222ff9dc87bad5b9Yorke Lee        String data = DateUtils.formatDate(getContext(), getEntry().getAsString(column),
1244b294d6c96c4865b64338e5d222ff9dc87bad5b9Yorke Lee                false /*Use the short DateFormat to ensure that it fits inside the EditText*/);
125135b44c8604e375699e22594e65f0daec14f5bbeDmitri Plotnikov        if (TextUtils.isEmpty(data)) {
126fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan            mDateView.setText(mNoDateString);
127d690dff231dd5a81b9bd7563838455f24e49c75cBrian Attwell            mDateView.setTextColor(mHintTextColor);
1285e330ed98f1c2711b4cd3b375a1c0f76bedaf3e1Katherine Kuan            setDeleteButtonVisible(false);
1295e330ed98f1c2711b4cd3b375a1c0f76bedaf3e1Katherine Kuan        } else {
130fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan            mDateView.setText(data);
131fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan            mDateView.setTextColor(mPrimaryTextColor);
1325e330ed98f1c2711b4cd3b375a1c0f76bedaf3e1Katherine Kuan            setDeleteButtonVisible(true);
133135b44c8604e375699e22594e65f0daec14f5bbeDmitri Plotnikov        }
134392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
135392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
1362591436971bad3050c85929c8e0c5a8d48111f88Katherine Kuan    @Override
1372591436971bad3050c85929c8e0c5a8d48111f88Katherine Kuan    public boolean isEmpty() {
138296cca5522815fc51829203d326c335f9824f118Josh Gargus        final EditField editField = getKind().fieldList.get(0);
139296cca5522815fc51829203d326c335f9824f118Josh Gargus        final String column = editField.column;
140296cca5522815fc51829203d326c335f9824f118Josh Gargus        return TextUtils.isEmpty(getEntry().getAsString(column));
1411b22073590c1801c3e6c7bde2f4636632a049f6cKatherine Kuan    }
1421b22073590c1801c3e6c7bde2f4636632a049f6cKatherine Kuan
143392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
144392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public Dialog createDialog(Bundle bundle) {
145392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (bundle == null) throw new IllegalArgumentException("bundle must not be null");
146392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        int dialogId = bundle.getInt(DIALOG_ID_KEY);
147b697ed768fb817f94524f6c3992547665df331c4Marcus Hagerott        if (dialogId == R.id.dialog_event_date_picker) {
148b697ed768fb817f94524f6c3992547665df331c4Marcus Hagerott            return createDatePickerDialog();
149b697ed768fb817f94524f6c3992547665df331c4Marcus Hagerott        } else {
150b697ed768fb817f94524f6c3992547665df331c4Marcus Hagerott            return super.createDialog(bundle);
151392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
152392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
153392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
154392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
155392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    protected EventEditType getType() {
156392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        return (EventEditType) super.getType();
157392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
158392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
159392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
160392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    protected void onLabelRebuilt() {
161392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        // if we changed to a type that requires a year, ensure that it is actually set
162392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final String column = getKind().fieldList.get(0).column;
163392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final String oldValue = getEntry().getAsString(column);
164392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final DataKind kind = getKind();
165392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
1664b648485346462dc26c3a469caeae8589f5fbd58Daniel Lehmann        final Calendar calendar = Calendar.getInstance(DateUtils.UTC_TIMEZONE, Locale.US);
167392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final int defaultYear = calendar.get(Calendar.YEAR);
168392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
169392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        // Check whether the year is optional
1707bcdf5149804d766f3b3205143f78ac401fb38deJay Shrauner        final boolean isYearOptional = getType() != null && getType().isYearOptional();
171392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
17217e6f9d6c0dab8bb02f4f7e2f9f43f8b8449f55aDmitri Plotnikov        if (!isYearOptional && !TextUtils.isEmpty(oldValue)) {
173392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            final ParsePosition position = new ParsePosition(0);
1745f8932def1e28419908cd8ccf53129914bda82b4Walter Jang            final Date date2 = kind.dateFormatWithoutYear == null
1755f8932def1e28419908cd8ccf53129914bda82b4Walter Jang                    ? null : kind.dateFormatWithoutYear.parse(oldValue, position);
176392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
177392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            // Don't understand the date, lets not change it
178392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            if (date2 == null) return;
179392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
180392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            // This value is missing the year. Add it now
181392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            calendar.setTime(date2);
182392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            calendar.set(defaultYear, calendar.get(Calendar.MONTH),
183cd321f65f1e50409812976380ad1f0fdb3fa35cbYorke Lee                    calendar.get(Calendar.DAY_OF_MONTH), CommonDateUtils.DEFAULT_HOUR, 0, 0);
184392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
1855f8932def1e28419908cd8ccf53129914bda82b4Walter Jang            final String formattedDate = kind.dateFormatWithYear == null
1865f8932def1e28419908cd8ccf53129914bda82b4Walter Jang                    ? null : kind.dateFormatWithYear.format(calendar.getTime());
1875f8932def1e28419908cd8ccf53129914bda82b4Walter Jang            if (formattedDate == null) return;
1885f8932def1e28419908cd8ccf53129914bda82b4Walter Jang
1895f8932def1e28419908cd8ccf53129914bda82b4Walter Jang            onFieldChanged(column, formattedDate);
190392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            rebuildDateView();
191392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
192392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
193392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
194392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    /**
195392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     * Prepare dialog for entering a date
196392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     */
197392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private Dialog createDatePickerDialog() {
198392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final String column = getKind().fieldList.get(0).column;
199392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final String oldValue = getEntry().getAsString(column);
200392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final DataKind kind = getKind();
201392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
2024b648485346462dc26c3a469caeae8589f5fbd58Daniel Lehmann        final Calendar calendar = Calendar.getInstance(DateUtils.UTC_TIMEZONE, Locale.US);
203392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final int defaultYear = calendar.get(Calendar.YEAR);
204392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
205392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        // Check whether the year is optional
206392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final boolean isYearOptional = getType().isYearOptional();
207392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
208392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final int oldYear, oldMonth, oldDay;
209ec6bfa0ce4a94edbafb97c7ae2b573abf2aa4a85Yorke Lee
210392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (TextUtils.isEmpty(oldValue)) {
21178253a9e7e8dc5724333fa6a61e537249adac90bYorke Lee            // Default to the current date
212392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            oldYear = defaultYear;
21378253a9e7e8dc5724333fa6a61e537249adac90bYorke Lee            oldMonth = calendar.get(Calendar.MONTH);
21478253a9e7e8dc5724333fa6a61e537249adac90bYorke Lee            oldDay = calendar.get(Calendar.DAY_OF_MONTH);
215392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        } else {
216392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            // Try parsing with year
217ec6bfa0ce4a94edbafb97c7ae2b573abf2aa4a85Yorke Lee            Calendar cal = DateUtils.parseDate(oldValue, false);
218ec6bfa0ce4a94edbafb97c7ae2b573abf2aa4a85Yorke Lee            if (cal != null) {
219ec6bfa0ce4a94edbafb97c7ae2b573abf2aa4a85Yorke Lee                if (DateUtils.isYearSet(cal)) {
220ec6bfa0ce4a94edbafb97c7ae2b573abf2aa4a85Yorke Lee                    oldYear = cal.get(Calendar.YEAR);
2215a7a26962cc781d675280c790789e2dea28a7b34Daniel Lehmann                } else {
222ec6bfa0ce4a94edbafb97c7ae2b573abf2aa4a85Yorke Lee                    //cal.set(Calendar.YEAR, 0);
2235a7a26962cc781d675280c790789e2dea28a7b34Daniel Lehmann                    oldYear = isYearOptional ? DatePickerDialog.NO_YEAR : defaultYear;
2245a7a26962cc781d675280c790789e2dea28a7b34Daniel Lehmann                }
225ec6bfa0ce4a94edbafb97c7ae2b573abf2aa4a85Yorke Lee                oldMonth = cal.get(Calendar.MONTH);
226ec6bfa0ce4a94edbafb97c7ae2b573abf2aa4a85Yorke Lee                oldDay = cal.get(Calendar.DAY_OF_MONTH);
227ec6bfa0ce4a94edbafb97c7ae2b573abf2aa4a85Yorke Lee            } else {
228ec6bfa0ce4a94edbafb97c7ae2b573abf2aa4a85Yorke Lee                return null;
229392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            }
230392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
231392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final OnDateSetListener callBack = new OnDateSetListener() {
232392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            @Override
233392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
234392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                if (year == 0 && !isYearOptional) throw new IllegalStateException();
2354b648485346462dc26c3a469caeae8589f5fbd58Daniel Lehmann                final Calendar outCalendar =
2364b648485346462dc26c3a469caeae8589f5fbd58Daniel Lehmann                        Calendar.getInstance(DateUtils.UTC_TIMEZONE, Locale.US);
237392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
23811812c59ee140d62eaf3a8d826d2018767d490c5Daniel Lehmann                // If no year specified, set it to 2000 (we could pick any leap year here).
23911812c59ee140d62eaf3a8d826d2018767d490c5Daniel Lehmann                // The format string will ignore that year.
240392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                // For formats other than Exchange, the time of the day is ignored
241392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                outCalendar.clear();
2425a7a26962cc781d675280c790789e2dea28a7b34Daniel Lehmann                outCalendar.set(year == DatePickerDialog.NO_YEAR ? 2000 : year, monthOfYear,
243cd321f65f1e50409812976380ad1f0fdb3fa35cbYorke Lee                        dayOfMonth, CommonDateUtils.DEFAULT_HOUR, 0, 0);
244392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
245392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                final String resultString;
246392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                if (year == 0) {
2475f8932def1e28419908cd8ccf53129914bda82b4Walter Jang                    resultString = kind.dateFormatWithoutYear == null
2485f8932def1e28419908cd8ccf53129914bda82b4Walter Jang                            ? null : kind.dateFormatWithoutYear.format(outCalendar.getTime());
249392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                } else {
2505f8932def1e28419908cd8ccf53129914bda82b4Walter Jang                    resultString = kind.dateFormatWithYear == null
2515f8932def1e28419908cd8ccf53129914bda82b4Walter Jang                            ? null : kind.dateFormatWithYear.format(outCalendar.getTime());
252392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                }
2535f8932def1e28419908cd8ccf53129914bda82b4Walter Jang                if (resultString == null) return;
2545f8932def1e28419908cd8ccf53129914bda82b4Walter Jang
255392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                onFieldChanged(column, resultString);
256392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                rebuildDateView();
257392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            }
258392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        };
259392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final DatePickerDialog resultDialog = new DatePickerDialog(getContext(), callBack,
260392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                oldYear, oldMonth, oldDay, isYearOptional);
261392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        return resultDialog;
262392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
263d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa
2642293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan    @Override
2652293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan    public void clearAllFields() {
2662293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan        // Update UI
267fd70903236883f47b21f23b8cb49a1ccacdfcdf1Katherine Kuan        mDateView.setText(mNoDateString);
268d690dff231dd5a81b9bd7563838455f24e49c75cBrian Attwell        mDateView.setTextColor(mHintTextColor);
2692293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan
2702293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan        // Update state
2712293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan        final String column = getKind().fieldList.get(0).column;
2722293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan        onFieldChanged(column, "");
2732293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan    }
2742da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang
2752da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang    /**
2762da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang     * Sets the typeColumn of entry as TYPE_BIRTHDAY and calls rebuildValues() to refresh the view.
2772da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang     */
2782da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang    public void restoreBirthday() {
2792da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang        saveValue(getKind().typeColumn, Integer.toString(Event.TYPE_BIRTHDAY));
2802da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang        rebuildValues();
2812da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang    }
2822da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang
2832da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang    /**
2842da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang     * EventEditType Birthday:
2852da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang     * rawValue=3 labelRes=17039911 secondary=false specificMax=1 customColumn=null
2862da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang     * mYearOptional=true
2872da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang     */
2882da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang    public boolean isBirthdayType(){
2892da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang        final EventEditType eventType = getType();
2902da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang        return eventType.rawValue == Event.TYPE_BIRTHDAY && !eventType.secondary
2912da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang                && eventType.specificMax == 1 && eventType.customColumn == null
2922da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang                && eventType.isYearOptional();
2932da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang    }
294392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann}
295