EventFieldEditorView.java revision 392ccec3b56e8074a5a028af28106134b39f64bc
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
17392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannpackage com.android.contacts.views.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;
23392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport com.android.contacts.model.BaseAccountType.DataKind;
24392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport com.android.contacts.model.BaseAccountType.EditField;
25392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport com.android.contacts.model.BaseAccountType.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;
35392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.view.View;
36392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.widget.LinearLayout;
37392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.widget.TextView;
38392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
39392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport java.text.ParsePosition;
40392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport java.util.Calendar;
41392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport java.util.Date;
42392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
43392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann/**
44392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * Editor that allows editing Events using a {@link DatePickerDialog}
45392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann */
46392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannpublic class EventFieldEditorView extends LabeledEditorView {
47392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    /**
48392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     * Exchange requires 8:00 for birthdays
49392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     */
50392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private final int DEFAULT_HOUR = 8;
51392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
52392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private TextView mDateView;
53392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
54392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public EventFieldEditorView(Context context) {
55392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super(context);
56392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
57392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
58392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public EventFieldEditorView(Context context, AttributeSet attrs) {
59392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super(context, attrs);
60392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
61392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
62392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public EventFieldEditorView(Context context, AttributeSet attrs, int defStyle) {
63392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super(context, attrs, defStyle);
64392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
65392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
66392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
67392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    protected void onLayout(boolean changed, int l, int t, int r, int b) {
68392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super.onLayout(changed, l, t, r, b);
69392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
70392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        int l1 = getPaddingLeft();
71392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        int t1 = getPaddingTop();
72392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        int r1 = getMeasuredWidth() - getPaddingRight();
73392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        int b1 = getMeasuredHeight() - getPaddingBottom();
74392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
75392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        // Fields
76392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        // Subtract buttons left and right if necessary
77392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final int l2 = (getLabel() != null) ? l1 + getLabel().getMeasuredWidth() : l1;
78392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final int r2 = r1 - ((getDelete() != null) ? getDelete().getMeasuredWidth() : 0);
79392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (mDateView != null) mDateView.layout(l2, t1, r2, b1);
80392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
81392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
82392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
83392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    protected int getEditorHeight() {
84392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        return mDateView != null ? mDateView.getMeasuredHeight() : 0;
85392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
86392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
87392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
88392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    protected void requestFocusForFirstEditField() {
89392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (mDateView != null) mDateView.requestFocus();
90392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
91392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
92392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
93392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public void setEnabled(boolean enabled) {
94392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super.setEnabled(enabled);
95392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
96392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (mDateView != null) mDateView.setEnabled(enabled);
97392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
98392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
99392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
100392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public void setValues(DataKind kind, ValuesDelta entry, EntityDelta state, boolean readOnly,
101392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            ViewIdGenerator vig) {
102392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (kind.fieldList.size() != 1) throw new IllegalStateException("kind must have 1 field");
103392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super.setValues(kind, entry, state, readOnly, vig);
104392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
105392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (mDateView == null) {
106392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            mDateView = new TextView(getContext(), null, android.R.attr.textAppearanceMedium);
107392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            mDateView.setFocusable(true);
108392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            mDateView.setBackgroundResource(R.drawable.edit_button_field_background);
109392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            mDateView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,
110392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    LayoutParams.WRAP_CONTENT));
111392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            mDateView.setEnabled(!readOnly);
112392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            mDateView.setOnClickListener(new OnClickListener() {
113392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                @Override
114392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                public void onClick(View v) {
115392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    showDialog(R.id.dialog_event_date_picker);
116392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                }
117392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            });
118392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            addView(mDateView);
119392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
120392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
121392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        rebuildDateView();
122392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
123392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
124392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private void rebuildDateView() {
125392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final EditField editField = getKind().fieldList.get(0);
126392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final String column = editField.column;
127392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final String data = DateUtils.formatDate(getContext(), getEntry().getAsString(column));
128392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        mDateView.setText(data);
129392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
130392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
131392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
132392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public Dialog createDialog(Bundle bundle) {
133392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (bundle == null) throw new IllegalArgumentException("bundle must not be null");
134392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        int dialogId = bundle.getInt(DIALOG_ID_KEY);
135392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        switch (dialogId) {
136392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            case R.id.dialog_event_date_picker:
137392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                return createDatePickerDialog();
138392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            default:
139392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                return super.createDialog(bundle);
140392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
141392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
142392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
143392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
144392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    protected EventEditType getType() {
145392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        return (EventEditType) super.getType();
146392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
147392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
148392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
149392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    protected void onLabelRebuilt() {
150392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        // if we changed to a type that requires a year, ensure that it is actually set
151392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final String column = getKind().fieldList.get(0).column;
152392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final String oldValue = getEntry().getAsString(column);
153392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final DataKind kind = getKind();
154392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
155392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final Calendar calendar = Calendar.getInstance();
156392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final int defaultYear = calendar.get(Calendar.YEAR);
157392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
158392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        // Check whether the year is optional
159392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final boolean isYearOptional = getType().isYearOptional();
160392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
161392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (!isYearOptional) {
162392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            final ParsePosition position = new ParsePosition(0);
163392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            final Date date2 = kind.dateFormatWithoutYear.parse(oldValue, position);
164392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
165392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            // Don't understand the date, lets not change it
166392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            if (date2 == null) return;
167392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
168392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            // This value is missing the year. Add it now
169392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            calendar.setTime(date2);
170392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            calendar.set(defaultYear, calendar.get(Calendar.MONTH),
171392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    calendar.get(Calendar.DAY_OF_MONTH), DEFAULT_HOUR, 0, 0);
172392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
173392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            onFieldChanged(column, kind.dateFormatWithYear.format(calendar.getTime()));
174392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            rebuildDateView();
175392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
176392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
177392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
178392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    /**
179392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     * Prepare dialog for entering a date
180392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     */
181392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private Dialog createDatePickerDialog() {
182392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final String column = getKind().fieldList.get(0).column;
183392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final String oldValue = getEntry().getAsString(column);
184392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final DataKind kind = getKind();
185392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
186392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final Calendar calendar = Calendar.getInstance();
187392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final int defaultYear = calendar.get(Calendar.YEAR);
188392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
189392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        // Check whether the year is optional
190392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final boolean isYearOptional = getType().isYearOptional();
191392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
192392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final int oldYear, oldMonth, oldDay;
193392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (TextUtils.isEmpty(oldValue)) {
194392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            // Default to January first, 30 years ago
195392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            oldYear = defaultYear;
196392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            oldMonth = 0;
197392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            oldDay = 1;
198392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        } else {
199392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            final ParsePosition position = new ParsePosition(0);
200392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            // Try parsing with year
201392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            final Date date1 = kind.dateFormatWithYear.parse(oldValue, position);
202392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            if (date1 != null) {
203392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                calendar.setTime(date1);
204392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                oldYear = calendar.get(Calendar.YEAR);
205392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                oldMonth = calendar.get(Calendar.MONTH);
206392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                oldDay = calendar.get(Calendar.DAY_OF_MONTH);
207392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            } else {
208392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                final Date date2 = kind.dateFormatWithoutYear.parse(oldValue, position);
209392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                // Don't understand the date, lets not change it
210392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                if (date2 == null) return null;
211392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                calendar.setTime(date2);
212392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                oldYear = isYearOptional ? 0 : defaultYear;
213392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                oldMonth = calendar.get(Calendar.MONTH);
214392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                oldDay = calendar.get(Calendar.DAY_OF_MONTH);
215392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            }
216392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
217392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final OnDateSetListener callBack = new OnDateSetListener() {
218392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            @Override
219392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
220392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                if (year == 0 && !isYearOptional) throw new IllegalStateException();
221392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                final Calendar outCalendar = Calendar.getInstance();
222392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
223392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                // If no year specified, set it to 1900. The format string will ignore that year
224392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                // For formats other than Exchange, the time of the day is ignored
225392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                outCalendar.clear();
226392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                outCalendar.set(year == 0 ? 1900 : year, monthOfYear, dayOfMonth,
227392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                        DEFAULT_HOUR, 0, 0);
228392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
229392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                final String resultString;
230392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                if (year == 0) {
231392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    resultString = kind.dateFormatWithoutYear.format(outCalendar.getTime());
232392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                } else {
233392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    resultString = kind.dateFormatWithYear.format(outCalendar.getTime());
234392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                }
235392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                onFieldChanged(column, resultString);
236392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                rebuildDateView();
237392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            }
238392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        };
239392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        final DatePickerDialog resultDialog = new DatePickerDialog(getContext(), callBack,
240392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                oldYear, oldMonth, oldDay, isYearOptional);
241392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        return resultDialog;
242392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
243392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann}
244