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