summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanny Baumann <dannybaumann@web.de>2011-07-21 10:56:34 +0200
committerDanny Baumann <dannybaumann@web.de>2011-08-05 17:29:26 +0200
commitf08ab00868174b6da63b82d51d65240722a17805 (patch)
tree428a17618f1f13013b33302dd2a7148a4bab6932
parent8979aa470468e0827bc5eeb71f8fed1feed78fda (diff)
downloadandroid_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.pngbin0 -> 1892 bytes
-rw-r--r--res/drawable-mdpi/sym_action_event.pngbin0 -> 2084 bytes
-rw-r--r--res/values-de/strings.xml1
-rw-r--r--res/values/strings.xml3
-rw-r--r--src/com/android/contacts/model/ContactsSource.java13
-rw-r--r--src/com/android/contacts/model/FallbackSource.java154
-rw-r--r--src/com/android/contacts/ui/widget/GenericEditorView.java14
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
new file mode 100644
index 000000000..10e3bacba
--- /dev/null
+++ b/res/drawable-hdpi/sym_action_event.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_action_event.png b/res/drawable-mdpi/sym_action_event.png
new file mode 100644
index 000000000..6a89bb40c
--- /dev/null
+++ b/res/drawable-mdpi/sym_action_event.png
Binary files differ
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) {