EventFieldEditorView.java revision 4b648485346462dc26c3a469caeae8589f5fbd58
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.DataKind;
244597c92d655d45447780b32c7572acef110b6ed1Dmitri Plotnikovimport com.android.contacts.model.AccountType.EditField;
254597c92d655d45447780b32c7572acef110b6ed1Dmitri Plotnikovimport com.android.contacts.model.AccountType.EventEditType;
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;
32392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.os.Bundle;
33392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.text.TextUtils;
34392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.util.AttributeSet;
35135b44c8604e375699e22594e65f0daec14f5bbeDmitri Plotnikovimport android.view.Gravity;
36392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.view.View;
37135b44c8604e375699e22594e65f0daec14f5bbeDmitri Plotnikovimport android.widget.Button;
38392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.widget.LinearLayout;
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     */
52392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private final int DEFAULT_HOUR = 8;
53392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
54135b44c8604e375699e22594e65f0daec14f5bbeDmitri Plotnikov    private Button mDateView;
55392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
56392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public EventFieldEditorView(Context context) {
57392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super(context);
58392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
59392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
60392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public EventFieldEditorView(Context context, AttributeSet attrs) {
61392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super(context, attrs);
62392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
63392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
64392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public EventFieldEditorView(Context context, AttributeSet attrs, int defStyle) {
65392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super(context, attrs, defStyle);
66392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
67392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
68392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
6991d8e892d549bbeba721cb434163a83bc99330a9Dmitri Plotnikov    public int getBaseline(int row) {
7091d8e892d549bbeba721cb434163a83bc99330a9Dmitri Plotnikov        int baseline = super.getBaseline(row);
7191d8e892d549bbeba721cb434163a83bc99330a9Dmitri Plotnikov        if (mDateView != null) {
7291d8e892d549bbeba721cb434163a83bc99330a9Dmitri Plotnikov            // The date view will be centered vertically in the corresponding line item
7391d8e892d549bbeba721cb434163a83bc99330a9Dmitri Plotnikov            int lineItemHeight = getLineItemHeight(row);
7491d8e892d549bbeba721cb434163a83bc99330a9Dmitri Plotnikov            int offset = (lineItemHeight - mDateView.getMeasuredHeight()) / 2;
7591d8e892d549bbeba721cb434163a83bc99330a9Dmitri Plotnikov            baseline = Math.max(baseline, offset + mDateView.getBaseline());
7691d8e892d549bbeba721cb434163a83bc99330a9Dmitri Plotnikov        }
7791d8e892d549bbeba721cb434163a83bc99330a9Dmitri Plotnikov        return baseline;
7891d8e892d549bbeba721cb434163a83bc99330a9Dmitri Plotnikov    }
7991d8e892d549bbeba721cb434163a83bc99330a9Dmitri Plotnikov
8091d8e892d549bbeba721cb434163a83bc99330a9Dmitri Plotnikov    @Override
81392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    protected void onLayout(boolean changed, int l, int t, int r, int b) {
82392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super.onLayout(changed, l, t, r, b);
83392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
84392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        int l1 = getPaddingLeft();
85392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        int t1 = getPaddingTop();
86392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        int r1 = getMeasuredWidth() - getPaddingRight();
87392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
88392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        // Fields
89392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        // Subtract buttons left and right if necessary
90cfb525b3f18d71d6cc5d4ef36d704b3ba9e9a6f3Daniel Lehmann        final int labelWidth = (getLabel() != null) ? getLabel().getMeasuredWidth() : 0;
91cfb525b3f18d71d6cc5d4ef36d704b3ba9e9a6f3Daniel Lehmann        final int deleteWidth = (getDelete() != null) ? getDelete().getMeasuredWidth() : 0;
92cfb525b3f18d71d6cc5d4ef36d704b3ba9e9a6f3Daniel Lehmann        final int r2 = r1 - deleteWidth - labelWidth;
9391d8e892d549bbeba721cb434163a83bc99330a9Dmitri Plotnikov        if (mDateView != null) {
9491d8e892d549bbeba721cb434163a83bc99330a9Dmitri Plotnikov            int height = mDateView.getMeasuredHeight();
9591d8e892d549bbeba721cb434163a83bc99330a9Dmitri Plotnikov            int baseline = getBaseline(0);
9691d8e892d549bbeba721cb434163a83bc99330a9Dmitri Plotnikov            int top = t1 + baseline - mDateView.getBaseline();
9791d8e892d549bbeba721cb434163a83bc99330a9Dmitri Plotnikov            mDateView.layout(
9891d8e892d549bbeba721cb434163a83bc99330a9Dmitri Plotnikov                    l1, top,
9991d8e892d549bbeba721cb434163a83bc99330a9Dmitri Plotnikov                    r2, top + height);
10091d8e892d549bbeba721cb434163a83bc99330a9Dmitri Plotnikov        }
101392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
102392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
103392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
10491d8e892d549bbeba721cb434163a83bc99330a9Dmitri Plotnikov    protected int getLineItemHeight(int row) {
10591d8e892d549bbeba721cb434163a83bc99330a9Dmitri Plotnikov        int height = mDateView == null ? 0 : mDateView.getMeasuredHeight();
10691d8e892d549bbeba721cb434163a83bc99330a9Dmitri Plotnikov        return Math.max(height, super.getLineItemHeight(row));
107392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
108392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
109392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
110392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    protected void requestFocusForFirstEditField() {
111392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (mDateView != null) mDateView.requestFocus();
112392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
113392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
114392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
115392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public void setEnabled(boolean enabled) {
116392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super.setEnabled(enabled);
117392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
11802bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov        if (mDateView != null) mDateView.setEnabled(!isReadOnly() && enabled);
119392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
120392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
121392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
122392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public void setValues(DataKind kind, ValuesDelta entry, EntityDelta state, boolean readOnly,
123392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            ViewIdGenerator vig) {
124392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (kind.fieldList.size() != 1) throw new IllegalStateException("kind must have 1 field");
125392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super.setValues(kind, entry, state, readOnly, vig);
126392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
127392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (mDateView == null) {
12891d8e892d549bbeba721cb434163a83bc99330a9Dmitri Plotnikov
129c69a9ccb6c6440127f75b51aca123afa6946474aDmitri Plotnikov            mDateView = new Button(getContext(), null, android.R.attr.spinnerStyle);
130392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            mDateView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,
131392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    LayoutParams.WRAP_CONTENT));
13202bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov            mDateView.setEnabled(isEnabled() && !readOnly);
133392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            mDateView.setOnClickListener(new OnClickListener() {
134392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                @Override
135392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                public void onClick(View v) {
136392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    showDialog(R.id.dialog_event_date_picker);
137392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                }
138392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            });
139392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            addView(mDateView);
140392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
141392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
142392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        rebuildDateView();
143392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
144392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
145392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private void rebuildDateView() {
146392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final EditField editField = getKind().fieldList.get(0);
147392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final String column = editField.column;
148135b44c8604e375699e22594e65f0daec14f5bbeDmitri Plotnikov        String data = DateUtils.formatDate(getContext(), getEntry().getAsString(column));
149135b44c8604e375699e22594e65f0daec14f5bbeDmitri Plotnikov        if (TextUtils.isEmpty(data)) {
150135b44c8604e375699e22594e65f0daec14f5bbeDmitri Plotnikov            data = " ";
151135b44c8604e375699e22594e65f0daec14f5bbeDmitri Plotnikov        }
152392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        mDateView.setText(data);
153392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
154392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
155392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
156392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public Dialog createDialog(Bundle bundle) {
157392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (bundle == null) throw new IllegalArgumentException("bundle must not be null");
158392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        int dialogId = bundle.getInt(DIALOG_ID_KEY);
159392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        switch (dialogId) {
160392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            case R.id.dialog_event_date_picker:
161392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                return createDatePickerDialog();
162392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            default:
163392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                return super.createDialog(bundle);
164392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
165392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
166392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
167392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
168392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    protected EventEditType getType() {
169392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        return (EventEditType) super.getType();
170392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
171392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
172392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
173392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    protected void onLabelRebuilt() {
174392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        // if we changed to a type that requires a year, ensure that it is actually set
175392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final String column = getKind().fieldList.get(0).column;
176392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final String oldValue = getEntry().getAsString(column);
177392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final DataKind kind = getKind();
178392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
1794b648485346462dc26c3a469caeae8589f5fbd58Daniel Lehmann        final Calendar calendar = Calendar.getInstance(DateUtils.UTC_TIMEZONE, Locale.US);
180392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final int defaultYear = calendar.get(Calendar.YEAR);
181392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
182392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        // Check whether the year is optional
183392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final boolean isYearOptional = getType().isYearOptional();
184392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
18517e6f9d6c0dab8bb02f4f7e2f9f43f8b8449f55aDmitri Plotnikov        if (!isYearOptional && !TextUtils.isEmpty(oldValue)) {
186392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            final ParsePosition position = new ParsePosition(0);
187392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            final Date date2 = kind.dateFormatWithoutYear.parse(oldValue, position);
188392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
189392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            // Don't understand the date, lets not change it
190392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            if (date2 == null) return;
191392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
192392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            // This value is missing the year. Add it now
193392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            calendar.setTime(date2);
194392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            calendar.set(defaultYear, calendar.get(Calendar.MONTH),
195392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    calendar.get(Calendar.DAY_OF_MONTH), DEFAULT_HOUR, 0, 0);
196392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
197392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            onFieldChanged(column, kind.dateFormatWithYear.format(calendar.getTime()));
198392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            rebuildDateView();
199392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
200392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
201392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
202392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    /**
203392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     * Prepare dialog for entering a date
204392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     */
205392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private Dialog createDatePickerDialog() {
206392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final String column = getKind().fieldList.get(0).column;
207392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final String oldValue = getEntry().getAsString(column);
208392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final DataKind kind = getKind();
209392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
2104b648485346462dc26c3a469caeae8589f5fbd58Daniel Lehmann        final Calendar calendar = Calendar.getInstance(DateUtils.UTC_TIMEZONE, Locale.US);
211392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final int defaultYear = calendar.get(Calendar.YEAR);
212392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
213392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        // Check whether the year is optional
214392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final boolean isYearOptional = getType().isYearOptional();
215392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
216392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final int oldYear, oldMonth, oldDay;
217392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (TextUtils.isEmpty(oldValue)) {
218392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            // Default to January first, 30 years ago
219392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            oldYear = defaultYear;
220392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            oldMonth = 0;
221392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            oldDay = 1;
222392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        } else {
223392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            final ParsePosition position = new ParsePosition(0);
224392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            // Try parsing with year
2252b3f95cc12b76523410782d4178562ce241410efDmitri Plotnikov            Date date1 = kind.dateFormatWithYear.parse(oldValue, position);
2262b3f95cc12b76523410782d4178562ce241410efDmitri Plotnikov            if (date1 == null) {
2272b3f95cc12b76523410782d4178562ce241410efDmitri Plotnikov                // If that format does not fit, try guessing the right format
2282b3f95cc12b76523410782d4178562ce241410efDmitri Plotnikov                date1 = DateUtils.parseDate(oldValue);
2292b3f95cc12b76523410782d4178562ce241410efDmitri Plotnikov            }
230392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            if (date1 != null) {
231392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                calendar.setTime(date1);
232392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                oldYear = calendar.get(Calendar.YEAR);
233392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                oldMonth = calendar.get(Calendar.MONTH);
234392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                oldDay = calendar.get(Calendar.DAY_OF_MONTH);
235392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            } else {
236392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                final Date date2 = kind.dateFormatWithoutYear.parse(oldValue, position);
237392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                // Don't understand the date, lets not change it
238392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                if (date2 == null) return null;
239392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                calendar.setTime(date2);
240392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                oldYear = isYearOptional ? 0 : defaultYear;
241392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                oldMonth = calendar.get(Calendar.MONTH);
242392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                oldDay = calendar.get(Calendar.DAY_OF_MONTH);
243392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            }
244392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
245392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final OnDateSetListener callBack = new OnDateSetListener() {
246392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            @Override
247392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
248392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                if (year == 0 && !isYearOptional) throw new IllegalStateException();
2494b648485346462dc26c3a469caeae8589f5fbd58Daniel Lehmann                final Calendar outCalendar =
2504b648485346462dc26c3a469caeae8589f5fbd58Daniel Lehmann                        Calendar.getInstance(DateUtils.UTC_TIMEZONE, Locale.US);
251392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
252392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                // If no year specified, set it to 1900. The format string will ignore that year
253392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                // For formats other than Exchange, the time of the day is ignored
254392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                outCalendar.clear();
255392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                outCalendar.set(year == 0 ? 1900 : year, monthOfYear, dayOfMonth,
256392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                        DEFAULT_HOUR, 0, 0);
257392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
258392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                final String resultString;
259392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                if (year == 0) {
260392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    resultString = kind.dateFormatWithoutYear.format(outCalendar.getTime());
261392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                } else {
262392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    resultString = kind.dateFormatWithYear.format(outCalendar.getTime());
263392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                }
264392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                onFieldChanged(column, resultString);
265392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                rebuildDateView();
266392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            }
267392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        };
268392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final DatePickerDialog resultDialog = new DatePickerDialog(getContext(), callBack,
269392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                oldYear, oldMonth, oldDay, isYearOptional);
270392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        return resultDialog;
271392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
272392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann}
273