diff options
author | Danny Baumann <dannybaumann@web.de> | 2011-07-21 10:56:34 +0200 |
---|---|---|
committer | Danny Baumann <dannybaumann@web.de> | 2011-08-05 17:29:26 +0200 |
commit | f08ab00868174b6da63b82d51d65240722a17805 (patch) | |
tree | 428a17618f1f13013b33302dd2a7148a4bab6932 | |
parent | 8979aa470468e0827bc5eeb71f8fed1feed78fda (diff) | |
download | android_packages_apps_Contacts-f08ab00868174b6da63b82d51d65240722a17805.tar.gz android_packages_apps_Contacts-f08ab00868174b6da63b82d51d65240722a17805.tar.bz2 android_packages_apps_Contacts-f08ab00868174b6da63b82d51d65240722a17805.zip |
Make event fields (birthday, anniversary) editable.
Change-Id: I9afe1f5a4019597153c7eb13051fb2e7f2f01937
-rw-r--r-- | res/drawable-hdpi/sym_action_event.png | bin | 0 -> 1892 bytes | |||
-rw-r--r-- | res/drawable-mdpi/sym_action_event.png | bin | 0 -> 2084 bytes | |||
-rw-r--r-- | res/values-de/strings.xml | 1 | ||||
-rw-r--r-- | res/values/strings.xml | 3 | ||||
-rw-r--r-- | src/com/android/contacts/model/ContactsSource.java | 13 | ||||
-rw-r--r-- | src/com/android/contacts/model/FallbackSource.java | 154 | ||||
-rw-r--r-- | src/com/android/contacts/ui/widget/GenericEditorView.java | 14 |
7 files changed, 177 insertions, 8 deletions
diff --git a/res/drawable-hdpi/sym_action_event.png b/res/drawable-hdpi/sym_action_event.png Binary files differnew file mode 100644 index 000000000..10e3bacba --- /dev/null +++ b/res/drawable-hdpi/sym_action_event.png diff --git a/res/drawable-mdpi/sym_action_event.png b/res/drawable-mdpi/sym_action_event.png Binary files differnew file mode 100644 index 000000000..6a89bb40c --- /dev/null +++ b/res/drawable-mdpi/sym_action_event.png diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 8e9789b57..44112f810 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -83,6 +83,7 @@ <string name="label_notes" msgid="8337354953278341042">"Notizen"</string> <string name="label_sip_address" msgid="124073911714324974">"Internetanruf"</string> <string name="label_ringtone" msgid="8833166825330686244">"Klingelton"</string> + <string name="label_date">Datum</string> <string name="ghostData_name" msgid="6490954238641157585">"Vor- und Nachname"</string> <string name="ghostData_phonetic_name" msgid="7852749081984070902">"Phonetischer Name"</string> <string name="ghostData_company" msgid="5414421120553765775">"Unternehmen"</string> diff --git a/res/values/strings.xml b/res/values/strings.xml index 852c30274..76bd9803f 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1116,6 +1116,9 @@ <!-- Field title for the phonetic family name of a contact --> <string name="name_phonetic_family">Phonetic family name</string> + <!-- Field title for the date for an event --> + <string name="label_date">Date</string> + <!-- String describing which account type a contact came from when editing it --> <string name="account_type_format"><xliff:g id="source" example="Gmail">%1$s</xliff:g> contact</string> diff --git a/src/com/android/contacts/model/ContactsSource.java b/src/com/android/contacts/model/ContactsSource.java index d008482de..dc65d5cf3 100644 --- a/src/com/android/contacts/model/ContactsSource.java +++ b/src/com/android/contacts/model/ContactsSource.java @@ -30,6 +30,7 @@ import android.provider.ContactsContract.Data; import android.provider.ContactsContract.RawContacts; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.CommonDataKinds.StructuredPostal; +import android.view.View; import android.widget.EditText; import java.util.ArrayList; @@ -312,6 +313,18 @@ public abstract class ContactsSource { this.optional = optional; return this; } + + public CharSequence fromValue(Context context, CharSequence value) { + return value; + } + + public CharSequence toValue(Context context, CharSequence text) { + return text; + } + + public View.OnClickListener getOnClickListener() { + return null; + } } /** diff --git a/src/com/android/contacts/model/FallbackSource.java b/src/com/android/contacts/model/FallbackSource.java index a57e4c692..cb604e80b 100644 --- a/src/com/android/contacts/model/FallbackSource.java +++ b/src/com/android/contacts/model/FallbackSource.java @@ -19,6 +19,7 @@ package com.android.contacts.model; import com.android.contacts.R; import com.google.android.collect.Lists; +import android.app.DatePickerDialog; import android.content.ContentValues; import android.content.Context; import android.content.res.Resources; @@ -36,8 +37,16 @@ import android.provider.ContactsContract.CommonDataKinds.SipAddress; import android.provider.ContactsContract.CommonDataKinds.StructuredName; import android.provider.ContactsContract.CommonDataKinds.StructuredPostal; import android.provider.ContactsContract.CommonDataKinds.Website; +import android.text.format.DateFormat; import android.view.inputmethod.EditorInfo; - +import android.view.View; +import android.widget.DatePicker; +import android.widget.EditText; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; import java.util.Locale; public class FallbackSource extends ContactsSource { @@ -60,6 +69,8 @@ public class FallbackSource extends ContactsSource { protected static final int FLAGS_SIP_ADDRESS = EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS; // since SIP addresses have the same // basic format as email addresses + protected static final int FLAGS_DATE = EditorInfo.TYPE_CLASS_DATETIME + | EditorInfo.TYPE_DATETIME_VARIATION_DATE; public FallbackSource() { this.accountType = null; @@ -107,6 +118,10 @@ public class FallbackSource extends ContactsSource { return new EditType(type, Organization.getTypeLabelResource(type)); } + protected EditType buildEventType(int type) { + return new EditType(type, Event.getTypeResource(type)); + } + protected DataKind inflateStructuredName(Context context, int inflateLevel) { DataKind kind = getKindForMimetype(StructuredName.CONTENT_ITEM_TYPE); if (kind == null) { @@ -432,14 +447,25 @@ public class FallbackSource extends ContactsSource { return kind; } - protected DataKind inflateEvent(Context context, int inflateLevel) { + protected DataKind inflateEvent(final Context context, int inflateLevel) { DataKind kind = getKindForMimetype(Event.CONTENT_ITEM_TYPE); if (kind == null) { kind = addKind(new DataKind(Event.CONTENT_ITEM_TYPE, - R.string.eventLabelsGroup, -1, 150, false)); + R.string.eventLabelsGroup, R.drawable.sym_action_event, 150, true)); kind.secondary = true; kind.actionHeader = new EventActionInflater(); - kind.actionBody = new SimpleInflater(Event.START_DATE); + kind.actionBody = new EventDateInflater(); + } + + if (inflateLevel >= ContactsSource.LEVEL_CONSTRAINTS) { + kind.typeColumn = Event.TYPE; + kind.typeList = Lists.newArrayList(); + kind.typeList.add(buildEventType(Event.TYPE_BIRTHDAY)); + kind.typeList.add(buildEventType(Event.TYPE_ANNIVERSARY)); + kind.typeList.add(buildEventType(Event.TYPE_OTHER)); + + kind.fieldList = Lists.newArrayList(); + kind.fieldList.add(new EventDateEditField()); } return kind; @@ -481,7 +507,7 @@ public class FallbackSource extends ContactsSource { */ public static class SimpleInflater implements StringInflater { private final int mStringRes; - private final String mColumnName; + protected final String mColumnName; public SimpleInflater(int stringRes) { this(stringRes, null); @@ -706,6 +732,124 @@ public class FallbackSource extends ContactsSource { } } + public static class EventDateInflater extends SimpleInflater { + private static SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + + public EventDateInflater() { + super(Event.START_DATE); + } + + private CharSequence parseDate(Context context, CharSequence value) { + Date date = EventDateConverter.parseDateFromDb(value); + if (date != null) { + return DateFormat.getLongDateFormat(context).format(date); + } + return value; + } + + public CharSequence inflateUsing(Context context, Cursor cursor) { + final int index = mColumnName != null ? cursor.getColumnIndex(mColumnName) : -1; + final CharSequence columnValue = index != -1 ? cursor.getString(index) : null; + + return parseDate(context, columnValue); + } + + public CharSequence inflateUsing(Context context, ContentValues values) { + final boolean validColumn = values.containsKey(mColumnName); + final CharSequence columnValue = validColumn ? values.getAsString(mColumnName) : null; + + return parseDate(context, columnValue); + } + } + + private static class EventDateConverter { + private static SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + + public static Date parseDateFromDb(CharSequence value) { + if (value != null) { + try { + return sDateFormat.parse(value.toString()); + } catch (ParseException e) { + } + } + return null; + } + + public static CharSequence formatDateForDb(Date date) { + return sDateFormat.format(date); + } + } + + private static class EventDateEditField extends EditField { + private View.OnClickListener mListener; + + public EventDateEditField() { + super(Event.START_DATE, R.string.label_date, FLAGS_DATE); + + mListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + final EditText edit = (EditText) v; + openDatePicker(edit); + } + }; + } + + private void openDatePicker(final EditText edit) { + final Context context = edit.getContext(); + String value = edit.getText().toString(); + final Calendar cal = Calendar.getInstance(); + + try { + Date date = DateFormat.getDateFormat(context).parse(value); + cal.setTime(date); + } catch (ParseException e) { + /* use today in that case */ + } + + final DatePickerDialog.OnDateSetListener dateListener = + new DatePickerDialog.OnDateSetListener() { + @Override + public void onDateSet(DatePicker view, int year, int month, int day) { + final Context c = view.getContext(); + cal.set(year, month, day); + edit.setText(DateFormat.getDateFormat(c).format(cal.getTime())); + } + }; + + DatePickerDialog dp = new DatePickerDialog(context, dateListener, + cal.get(Calendar.YEAR), + cal.get(Calendar.MONTH), + cal.get(Calendar.DAY_OF_MONTH)); + dp.show(); + } + + @Override + public CharSequence fromValue(Context context, CharSequence value) { + Date date = EventDateConverter.parseDateFromDb(value); + if (date != null) { + return DateFormat.getDateFormat(context).format(date); + } + return null; + } + + @Override + public CharSequence toValue(Context context, CharSequence value) { + try { + Date date = DateFormat.getDateFormat(context).parse(value.toString()); + return EventDateConverter.formatDateForDb(date); + } catch (ParseException e) { + } + return null; + } + + @Override + public View.OnClickListener getOnClickListener() { + return mListener; + } + } + + @Override public int getHeaderColor(Context context) { return 0xff7f93bc; diff --git a/src/com/android/contacts/ui/widget/GenericEditorView.java b/src/com/android/contacts/ui/widget/GenericEditorView.java index e4b985d07..960992dec 100644 --- a/src/com/android/contacts/ui/widget/GenericEditorView.java +++ b/src/com/android/contacts/ui/widget/GenericEditorView.java @@ -221,7 +221,7 @@ public class GenericEditorView extends RelativeLayout implements Editor, View.On mFields.removeAllViews(); boolean hidePossible = false; int n = 0; - for (EditField field : kind.fieldList) { + for (final EditField field : kind.fieldList) { // Inflate field from definition EditText fieldView = (EditText)mInflater.inflate(RES_FIELD, mFields, false); fieldView.setId(vig.getId(state, kind, entry, n++)); @@ -235,16 +235,24 @@ public class GenericEditorView extends RelativeLayout implements Editor, View.On } fieldView.setMinLines(field.minLines); + if (field.getOnClickListener() != null) { + fieldView.setFocusable(false); + fieldView.setOnClickListener(field.getOnClickListener()); + } + // Read current value from state final String column = field.column; final String value = entry.getAsString(column); - fieldView.setText(value); + fieldView.setText(field.fromValue(getContext(), value)); // Prepare listener for writing changes fieldView.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) { // Trigger event for newly changed value - onFieldChanged(column, s.toString()); + CharSequence value = field.toValue(getContext(), s); + if (value != null) { + onFieldChanged(column, value.toString()); + } } public void beforeTextChanged(CharSequence s, int start, int count, int after) { |