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