From 82bf5598d5ebd940d9accece2b9c6728539a2d78 Mon Sep 17 00:00:00 2001 From: Tim Su Date: Tue, 29 Jun 2010 22:23:41 -0700 Subject: [PATCH] Alright, task editing is working for tags and alarms and all goodies. Also got rid of preferred due date. --- .../com/todoroo/andlib/sql/Field.java | 4 + .../todoroo/andlib/utility/DateUtilities.java | 92 +++++++++++++- ...AlarmsDatabase.java => AlarmDatabase.java} | 2 +- .../todoroo/astrid/alarms/AlarmService.java | 38 +++++- .../astrid/filters/ExtendedFilterExposer.java | 4 +- .../todoroo/astrid/tags/DetailExposer.java | 2 +- .../todoroo/astrid/tags/FilterExposer.java | 2 +- .../com/todoroo/astrid/tags/TagService.java | 6 +- astrid/res/drawable/filter_untagged.png | Bin 780 -> 695 bytes astrid/res/layout/task_row.xml | 2 +- astrid/res/values/strings-3.0.xml | 2 +- .../astrid/activity/TaskEditActivity.java | 113 ++++++++---------- .../astrid/activity/TaskListActivity.java | 6 +- .../todoroo/astrid/adapter/FilterAdapter.java | 8 +- astrid/src/com/todoroo/astrid/model/Task.java | 3 - .../service/Astrid2To3UpgradeHelper.java | 36 +++++- .../todoroo/astrid/test/DatabaseTestCase.java | 8 +- 17 files changed, 233 insertions(+), 95 deletions(-) rename astrid/plugin-src/com/todoroo/astrid/alarms/{AlarmsDatabase.java => AlarmDatabase.java} (97%) diff --git a/astrid/common-src/com/todoroo/andlib/sql/Field.java b/astrid/common-src/com/todoroo/andlib/sql/Field.java index 99501e85d..5131ba000 100644 --- a/astrid/common-src/com/todoroo/andlib/sql/Field.java +++ b/astrid/common-src/com/todoroo/andlib/sql/Field.java @@ -18,10 +18,14 @@ public class Field extends DBObject { } public Criterion eq(Object value) { + if(value == null) + return UnaryCriterion.isNull(this); return UnaryCriterion.eq(this, value); } public Criterion neq(Object value) { + if(value == null) + return UnaryCriterion.isNotNull(this); return UnaryCriterion.neq(this, value); } diff --git a/astrid/common-src/com/todoroo/andlib/utility/DateUtilities.java b/astrid/common-src/com/todoroo/andlib/utility/DateUtilities.java index 17893516d..e3ccc1196 100644 --- a/astrid/common-src/com/todoroo/andlib/utility/DateUtilities.java +++ b/astrid/common-src/com/todoroo/andlib/utility/DateUtilities.java @@ -5,8 +5,11 @@ */ package com.todoroo.andlib.utility; +import java.text.SimpleDateFormat; import java.util.Date; +import java.util.Locale; +import android.content.Context; import android.content.res.Resources; import com.todoroo.andlib.service.Autowired; @@ -51,7 +54,7 @@ public class DateUtilities { } /* ====================================================================== - * ============================================================ unix time + * ============================================================ long time * ====================================================================== */ /** Convert unixtime into date */ @@ -83,6 +86,93 @@ public class DateUtilities { * =========================================================== formatters * ====================================================================== */ + @SuppressWarnings("nls") + public static boolean is24HourFormat(Context context) { + String value = android.provider.Settings.System.getString(context.getContentResolver(), + android.provider.Settings.System.TIME_12_24); + boolean b24 = !(value == null || value.equals("12")); + return b24; + } + + /** + * @return time format (hours and minutes) + */ + public static SimpleDateFormat getTimeFormat(Context context) { + String value = getTimeFormatString(context); + return new SimpleDateFormat(value); + } + + /** + * @return string used for time formatting + */ + @SuppressWarnings("nls") + private static String getTimeFormatString(Context context) { + String value; + if (is24HourFormat(context)) { + value = "H:mm"; + } else { + value = "h:mm a"; + } + return value; + } + + /** + * @return string used for date formatting + */ + @SuppressWarnings("nls") + private static String getDateFormatString(Context context) { + String value = android.provider.Settings.System.getString(context.getContentResolver(), + android.provider.Settings.System.DATE_FORMAT); + if (value == null) { + // united states, you are special + if (Locale.US.equals(Locale.getDefault()) + || Locale.CANADA.equals(Locale.getDefault())) + value = "MMM d yyyy"; + else + value = "d MMM yyyy"; + } + return value; + } + + /** + * @return date format (month, day, year) + */ + public static SimpleDateFormat getDateFormat(Context context) { + return new SimpleDateFormat(getDateFormatString(context)); + } + + /** + * @return date format as getDateFormat with weekday + */ + @SuppressWarnings("nls") + public static SimpleDateFormat getDateFormatWithWeekday(Context context) { + return new SimpleDateFormat("EEE, " + getDateFormatString(context)); + + } + + /** + * @return date with time at the end + */ + @SuppressWarnings("nls") + public static SimpleDateFormat getDateWithTimeFormat(Context context) { + return new SimpleDateFormat(getDateFormatString(context) + " " + + getTimeFormatString(context)); + + } + private static final String ISO_8601_FORMAT = "yyyy-MM-dd'T'HH:mm:ssz"; + + /** + * @return formatted date (will contain month, day, year) + */ + public static String getFormattedDate(Context context, Date date) { + return getDateFormat(context).format(date); + } + + + /* ====================================================================== + * ============================================================= duration + * ====================================================================== */ + /** * Convenience method for dropping the preposition argument. */ diff --git a/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmsDatabase.java b/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmDatabase.java similarity index 97% rename from astrid/plugin-src/com/todoroo/astrid/alarms/AlarmsDatabase.java rename to astrid/plugin-src/com/todoroo/astrid/alarms/AlarmDatabase.java index 667dcdb0e..9600358f1 100644 --- a/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmsDatabase.java +++ b/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmDatabase.java @@ -16,7 +16,7 @@ import com.todoroo.andlib.data.Table; * */ @SuppressWarnings("nls") -public class AlarmsDatabase extends AbstractDatabase { +public class AlarmDatabase extends AbstractDatabase { // --- constants diff --git a/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmService.java b/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmService.java index 015c7ba48..9e9975d53 100644 --- a/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmService.java +++ b/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmService.java @@ -1,8 +1,11 @@ package com.todoroo.astrid.alarms; -import android.content.Context; +import java.util.ArrayList; +import com.todoroo.andlib.data.GenericDao; +import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.service.DependencyInjectionService; +import com.todoroo.andlib.sql.Query; /** * Provides operations for working with alerts @@ -13,13 +16,44 @@ import com.todoroo.andlib.service.DependencyInjectionService; @SuppressWarnings("nls") public class AlarmService { + AlarmDatabase database = new AlarmDatabase(); + + GenericDao dao = new GenericDao(Alarm.class, database); + /** * Metadata key for # of alarms */ public static final String ALARM_COUNT = "alarms-count"; - public AlarmService(@SuppressWarnings("unused") Context context) { + public AlarmService() { DependencyInjectionService.getInstance().inject(this); } + + /** + * Return alarms for the given task + * + * @param taskId + */ + public TodorooCursor getAlarms(long taskId) { + database.openForReading(); + Query query = Query.select(Alarm.PROPERTIES).where(Alarm.TASK.eq(taskId)); + return dao.query(query); + } + + /** + * Save the given array of tags into the database + * @param taskId + * @param tags + */ + public void synchronizeAlarms(long taskId, ArrayList alarms) { + database.openForWriting(); + dao.deleteWhere(Alarm.TASK.eq(taskId)); + + for(Alarm alarm : alarms) { + alarm.setId(Alarm.NO_ID); + alarm.setValue(Alarm.TASK, taskId); + dao.saveItem(alarm); + } + } } diff --git a/astrid/plugin-src/com/todoroo/astrid/filters/ExtendedFilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/filters/ExtendedFilterExposer.java index d24a233fb..1e9f23d5d 100644 --- a/astrid/plugin-src/com/todoroo/astrid/filters/ExtendedFilterExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/filters/ExtendedFilterExposer.java @@ -40,8 +40,8 @@ public final class ExtendedFilterExposer extends BroadcastReceiver { "Extended"); Filter alphabetical = new Filter(ExtendedPlugin.pluginIdentifier, - "Inbox (sorted by name)", - "Inbox (sorted by name)", + "Alphabetical", + "Alphabetical", new QueryTemplate().where(Criterion.and(TaskCriteria.isActive(), TaskCriteria.isVisible(DateUtilities.now()))). orderBy(Order.asc(Task.TITLE)), diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/DetailExposer.java b/astrid/plugin-src/com/todoroo/astrid/tags/DetailExposer.java index 88b374435..d1399a05e 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/DetailExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/DetailExposer.java @@ -29,7 +29,7 @@ public class DetailExposer extends BroadcastReceiver { return; if(tagService == null) - tagService = new TagService(context); + tagService = new TagService(); String tagList = tagService.getTagsAsString(taskId); if(tagList.length() == 0) diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/FilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/tags/FilterExposer.java index fe9aa9e71..333086f64 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/FilterExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/FilterExposer.java @@ -57,7 +57,7 @@ public class FilterExposer extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { - tagService = new TagService(context); + tagService = new TagService(); Tag[] tagsByAlpha = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_ALPHA); // If user does not have any tags, don't show this section at all diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java index e10b171ca..c523155c3 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java @@ -2,8 +2,6 @@ package com.todoroo.astrid.tags; import java.util.ArrayList; -import android.content.Context; - import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.Property.CountProperty; import com.todoroo.andlib.service.Autowired; @@ -40,7 +38,7 @@ public class TagService { @Autowired private MetadataService metadataService; - public TagService(@SuppressWarnings("unused") Context context) { + public TagService() { DependencyInjectionService.getInstance().inject(this); } @@ -84,7 +82,7 @@ public class TagService { return new QueryTemplate().join(Join.inner(Metadata.TABLE, Task.ID.eq(Metadata.TASK))).where(Criterion.and( TaskCriteria.isActive(), MetadataCriteria.withKey(KEY), - Metadata.VALUE.eq(null))); + Metadata.VALUE.isNull())); } /** diff --git a/astrid/res/drawable/filter_untagged.png b/astrid/res/drawable/filter_untagged.png index d29ec7831cbe22c68af6933cff8eff602b87fe07..c726d679450c1c0ed2ca28c311ae8609831c9f16 100644 GIT binary patch delta 609 zcmV-n0-pVh2Db%}VSfZI9COv~nE(I+H%UZ6R5;6(kBGe9;$^x;oIW%^_70V&uBEV_kZ^G=0Z%ZH2}R{kNf+3 zy4@}SsZ@$&GKo^Ee06mdnF|mR0N&o-*xA{sd7k$t3`0bOOeQmhTwY#Aegwqhac*vI zDk2iGEQ>G9zHQEWUOb9Z;gcsxdH&HDN} zBEs|YbNT%I+-ESi;J4#AlfhtsQVQSqnM@`ahJk6CM5ECuWNmGYY&MH!S!LU{BLD`#_4Rc^L`wO5 zUL})BJkO)mY7vXYP)Z>pgkeZJohF~p^YrwD>$(hwLx0-@*x%nDh{&(U$H$51c`Pk0 zQ79A$!*H5LDMhc>Lu-v`nwX}Eh$v&W(MF?@&{~%^Ha67C$_k$6(QG!cEDNO+ySuw| zyIow@B?y9grBVruuWz}yxJZadX>)T^rBW&S{XU&ehhnivr_;f8U3}lK9~~V9(+1kYReXzZ~tv)_Jrm<(uKLP+wPEO(? vauAJ1mGArYYPA~hzdAlXj@N3n*u4E;e#t%BFG^dN00000NkvXXu0mjfCf6e) delta 695 zcmV;o0!aP01&jueVSfNK2)akD=Kuf#j7da6R5;6(l1)n+VHAbWJMS1tLMbJQ(Zt#W zaiOIuT0wBtS`fM^LLvmZ>#ETHfUf!rT9DFR*A-$xOfkEF3td!DkPs>%j$cVbK9Hu) z#7t)9-Y(ioXo=9Xxo{8n;c_@4m&-9TgNT-y8O+>AM2X+K=zq-2%rUN!$Y!%VHa4~l zKm}m`ndNf%ZlzLrWLehj+1c4*H-N&-DF7&yO7{N#zC1fSvjJdWU?3L=1d>w9*IQd# zk*)wDY5-7cwHl_Tre0R7RcHI3(GR%9Ma$uk8{%6F${nvz zPEJmyi^Za5n&$I`g@s1v2ln~-xgP+C2qq+MNr#8LfWzP+51e|7?PxT*7Yc={s;Yk2 z*w~140-hEM1*=}Kla!J?@|V#jNC1)<@JI;9aoWSf!+#hY94x7-dbGa29svLW0NdN! zkBR8P$jC_8@AqG{ZMp;?7*H$%={ERA4^+W$yuFh1`Fv2*w1=i?PAdQ~H#e6iqAv#r z2k~01cG=q_QEGx6hU1oCmjbvY?7HbF#DJnG4MkB_h{zV5iDojH7&EVoj*hAstrid: %s - You Have No Tasks! + No Tasks! Add Task diff --git a/astrid/src/com/todoroo/astrid/activity/TaskEditActivity.java b/astrid/src/com/todoroo/astrid/activity/TaskEditActivity.java index de6554798..74fe52085 100644 --- a/astrid/src/com/todoroo/astrid/activity/TaskEditActivity.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskEditActivity.java @@ -19,11 +19,10 @@ */ package com.todoroo.astrid.activity; +import java.util.ArrayList; import java.util.Date; -import java.util.HashSet; import java.util.LinkedList; import java.util.List; -import java.util.Set; import android.app.AlertDialog; import android.content.ContentValues; @@ -54,7 +53,6 @@ import android.widget.ToggleButton; import com.flurry.android.FlurryAgent; import com.timsu.astrid.R; import com.timsu.astrid.data.enums.RepeatInterval; -import com.timsu.astrid.data.tag.TagIdentifier; import com.timsu.astrid.data.task.TaskModelForEdit; import com.timsu.astrid.data.task.AbstractTaskModel.RepeatInfo; import com.timsu.astrid.utilities.AstridUtilities; @@ -70,6 +68,8 @@ import com.timsu.astrid.widget.TimeDurationControlSet.TimeDurationType; import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.utility.DateUtilities; +import com.todoroo.astrid.alarms.Alarm; +import com.todoroo.astrid.alarms.AlarmService; import com.todoroo.astrid.model.Metadata; import com.todoroo.astrid.model.Task; import com.todoroo.astrid.service.TaskService; @@ -112,7 +112,7 @@ public final class TaskEditActivity extends AbstractModelTabActivity { private static final String TAB_ALERTS = "alerts"; //$NON-NLS-1$ private static final int DEFAULT_CAL_TIME = 3600; - // --- autowired + // --- services @Autowired TaskService taskService; @@ -120,6 +120,10 @@ public final class TaskEditActivity extends AbstractModelTabActivity { @Autowired DateUtilities dateUtilities; + TagService tagService = new TagService(); + + AlarmService alarmService = new AlarmService(); + // --- UI components EditText title; ImportanceControlSet importance; @@ -146,7 +150,7 @@ public final class TaskEditActivity extends AbstractModelTabActivity { boolean repeatHelpShown = false; /** list of all tags */ - Tag[] tags; + Tag[] allTags; /* ====================================================================== * ======================================================= initialization @@ -239,8 +243,7 @@ public final class TaskEditActivity extends AbstractModelTabActivity { repeatInterval.setAdapter(repeatAdapter); // load tags - TagService tagService = new TagService(this); - tags = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE); + allTags = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE); // read data populateFields(); @@ -310,7 +313,7 @@ public final class TaskEditActivity extends AbstractModelTabActivity { }; /** Set up the repeat value button */ - private void setRepeatValue(int value) { + void setRepeatValue(int value) { if(value == 0) repeatValue.setText(R.string.repeat_value_unset); else @@ -319,7 +322,7 @@ public final class TaskEditActivity extends AbstractModelTabActivity { } private RepeatInfo getRepeatValue() { - if(repeatValue.getTag().equals(0)) + if(repeatValue.getTag() == null || repeatValue.getTag().equals(0)) return null; return new RepeatInfo(RepeatInterval.values() [repeatInterval.getSelectedItemPosition()], @@ -380,28 +383,34 @@ public final class TaskEditActivity extends AbstractModelTabActivity { // tags (only configure if not already set) if(tagsContainer.getChildCount() == 0) { - TagService tagService = new TagService(this); TodorooCursor cursor = tagService.getTags(model.getId()); - for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) - addTag(cursor.get(Metadata.VALUE)); + try { + for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) + addTag(cursor.get(Metadata.VALUE)); + } finally { + cursor.close(); + } addTag(""); //$NON-NLS-1$ } - /* // alerts - if(model.getTaskIdentifier() != null) { - List alerts = alertController.getTaskAlerts(model.getTaskIdentifier()); - for(Date alert : alerts) { - addAlert(alert); + /// alarms + if(alertsContainer.getChildCount() == 0) { + TodorooCursor cursor = alarmService.getAlarms(model.getId()); + try { + for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) + addAlert(new Date(cursor.get(Alarm.TIME))); + } finally { + cursor.close(); } } // repeats - RepeatInfo repeatInfo = model.getRepeat(); + RepeatInfo repeatInfo = RepeatInfo.fromSingleField(model.getValue(Task.REPEAT)); if(repeatInfo != null) { setRepeatValue(repeatInfo.getValue()); repeatInterval.setSelection(repeatInfo.getInterval().ordinal()); } else - setRepeatValue(0);*/ // TODO + setRepeatValue(0); } @@ -426,6 +435,8 @@ public final class TaskEditActivity extends AbstractModelTabActivity { model.setValue(Task.REPEAT, RepeatInfo.toSingleField(getRepeatValue())); taskService.save(model, false); + saveTags(); + saveAlerts(); long due = model.getValue(Task.DUE_DATE); if (due != 0) { @@ -438,20 +449,19 @@ public final class TaskEditActivity extends AbstractModelTabActivity { /** * Displays a Toast reporting that the selected task has been saved and is * due in 'x' amount of time, to 2 time-units of precision (e.g. Days + Hours). - * @param dueDate the Date when the task is due + * @param due the Date when the task is due */ - private void showSaveToast(long dueDate) { + private void showSaveToast(long due) { int stringResource; - int timeInSeconds = (int)((dueDate - System.currentTimeMillis())/1000L); + long dueFromNow = due - System.currentTimeMillis(); - if (timeInSeconds < 0) { - timeInSeconds *= -1; // DateUtilities.getDurationString() requires positive integer + if (dueFromNow < 0) { stringResource = R.string.taskEdit_onTaskSave_Overdue; } else { stringResource = R.string.taskEdit_onTaskSave_Due; } - String formattedDate = dateUtilities.getDurationString(timeInSeconds, 2); + String formattedDate = dateUtilities.getDurationString(dueFromNow, 2); Toast.makeText(this, getResources().getString(stringResource, formattedDate), Toast.LENGTH_SHORT).show(); @@ -467,57 +477,31 @@ public final class TaskEditActivity extends AbstractModelTabActivity { /** Save task tags. Must be called after task already has an ID */ private void saveTags() { - Set tagsToDelete; - Set tagsToAdd; + ArrayList tags = new ArrayList(); - HashSet tagNames = new HashSet(); for(int i = 0; i < tagsContainer.getChildCount(); i++) { TextView tagName = (TextView)tagsContainer.getChildAt(i).findViewById(R.id.text1); if(tagName.getText().length() == 0) continue; - tagNames.add(tagName.getText().toString()); - } - - // map names to tag identifiers, creating them if necessary - /*HashSet tagIds = new HashSet(); - HashMap tagsByName = new HashMap(); - for(TagModelForView tag : tags) - tagsByName.put(tag.getName(), tag.getTagIdentifier()); - for(String tagName : tagNames) { - if(tagsByName.containsKey(tagName)) - tagIds.add(tagsByName.get(tagName)); - else { - TagIdentifier newTagId = tagController.createTag(tagName); - tagIds.add(newTagId); - } + tags.add(tagName.getText().toString()); } - // intersect tags to figure out which we need to add / remove - tagsToDelete = new HashSet(taskTags); - tagsToDelete.removeAll(tagIds); - tagsToAdd = tagIds; - tagsToAdd.removeAll(taskTags); - - // perform the database updates - for(TagIdentifier tagId : tagsToDelete) - tagController.removeTag(model.getTaskIdentifier(), tagId); - for(TagIdentifier tagId : tagsToAdd) - tagController.addTag(model.getTaskIdentifier(), tagId); - - if(tagsToDelete.size() > 0 || tagsToAdd.size() > 0) - SyncDataController.taskUpdated(this, model);*/ + tagService.synchronizeTags(model.getId(), tags); } /** Helper method to save alerts for this task */ private void saveAlerts() { - /*alertController.removeAlerts(model.getTaskIdentifier()); + ArrayList alarms = new ArrayList(); for(int i = 0; i < alertsContainer.getChildCount(); i++) { DateControlSet dateControlSet = (DateControlSet)alertsContainer. getChildAt(i).getTag(); Date date = dateControlSet.getDate(); - alertController.addAlert(model.getTaskIdentifier(), date); - }*/ + Alarm alarm = new Alarm(); + alarm.setValue(Alarm.TIME, date.getTime()); + } + + alarmService.synchronizeAlarms(model.getId(), alarms); } @@ -536,7 +520,7 @@ public final class TaskEditActivity extends AbstractModelTabActivity { textView.setText(tagName); ArrayAdapter tagsAdapter = new ArrayAdapter(this, - android.R.layout.simple_dropdown_item_1line, tags); + android.R.layout.simple_dropdown_item_1line, allTags); textView.setAdapter(tagsAdapter); textView.addTextChangedListener(new TextWatcher() { public void onTextChanged(CharSequence s, int start, int before, @@ -693,6 +677,7 @@ public final class TaskEditActivity extends AbstractModelTabActivity { * @param estimatedSeconds estimated duration or null * @param values */ + @SuppressWarnings("nls") public static void createCalendarStartEndTimes(Date preferred, Date definite, Integer estimatedSeconds, ContentValues values) { FlurryAgent.onEvent("create-calendar-event"); @@ -740,12 +725,12 @@ public final class TaskEditActivity extends AbstractModelTabActivity { } catch (IllegalArgumentException e) { Log.e("astrid", "Error creating calendar event!", e); } - } + } */ if(shouldSaveState) save(); - if(addToCalendar.isChecked() && model.getCalendarUri() != null) { + /* if(addToCalendar.isChecked() && model.getCalendarUri() != null) { Uri result = Uri.parse(model.getCalendarUri()); Intent intent = new Intent(Intent.ACTION_EDIT, result); @@ -758,7 +743,7 @@ public final class TaskEditActivity extends AbstractModelTabActivity { intent.putExtra("endTime", values.getAsLong("dtend")); startActivity(intent); - }*/ + } */ super.onPause(); } diff --git a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java index 803f285bf..8dad9e28e 100644 --- a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java @@ -215,7 +215,7 @@ public class TaskListActivity extends ListActivity implements OnScrollListener { public void onClick(View v) { TextView quickAdd = (TextView)findViewById(R.id.quickAddText); if(quickAdd.getText().length() > 0) { - Task task = quickAddTask(quickAdd.getText().toString()); + quickAddTask(quickAdd.getText().toString()); quickAdd.setText(""); //$NON-NLS-1$ loadTaskListContent(true); } else { @@ -484,8 +484,8 @@ public class TaskListActivity extends ListActivity implements OnScrollListener { case MENU_PLUGINS_ID: dialogUtilities.okDialog( this, - "if this were real life, I would display the Android " + //$NON-NLS-1$ - "market with a search for plugins that you could install.", //$NON-NLS-1$ + "if this were real life, I would display your " + //$NON-NLS-1$ + "plugins so you could enable/disable/rearrange them.", //$NON-NLS-1$ null); return true; case MENU_SETTINGS_ID: diff --git a/astrid/src/com/todoroo/astrid/adapter/FilterAdapter.java b/astrid/src/com/todoroo/astrid/adapter/FilterAdapter.java index 46df5bf79..0354f8e1a 100644 --- a/astrid/src/com/todoroo/astrid/adapter/FilterAdapter.java +++ b/astrid/src/com/todoroo/astrid/adapter/FilterAdapter.java @@ -137,7 +137,7 @@ public class FilterAdapter extends BaseExpandableListAdapter { textView.setTextAppearance(activity, R.style.TextAppearance_FLA_Category); View view = augmentView(textView, filter); - view.setPadding(40, 2, 0, 2); + view.setPadding(60, 2, 0, 2); view.setLayoutParams(llp); layout.addView(view); @@ -159,7 +159,7 @@ public class FilterAdapter extends BaseExpandableListAdapter { ImageView icon = new ImageView(activity); icon.setImageBitmap(filter.listingIcon); - icon.setPadding(0, 0, 20, 0); + icon.setPadding(0, 0, 15, 0); layout.addView(icon); layout.addView(textView); return layout; @@ -180,7 +180,7 @@ public class FilterAdapter extends BaseExpandableListAdapter { View view = augmentView(textView, filter); view.setBackgroundDrawable(null); view.setLayoutParams(lp); - view.setPadding(isChild ? 40 : 10, 0, 0, 0); + view.setPadding(isChild ? 50 : 10, 0, 0, 0); return view; } @@ -197,7 +197,7 @@ public class FilterAdapter extends BaseExpandableListAdapter { View view = augmentView(textView, header); view.setBackgroundResource(R.drawable.edit_titlebar); view.setLayoutParams(lp); - view.setPadding(isChild ? 40 : 10, 0, 0, 0); + view.setPadding(isChild ? 50 : 10, 0, 0, 0); return view; } diff --git a/astrid/src/com/todoroo/astrid/model/Task.java b/astrid/src/com/todoroo/astrid/model/Task.java index 75bf345b6..eee140614 100644 --- a/astrid/src/com/todoroo/astrid/model/Task.java +++ b/astrid/src/com/todoroo/astrid/model/Task.java @@ -89,9 +89,6 @@ public final class Task extends AbstractModel { public static final IntegerProperty TIMER_START = new IntegerProperty( TABLE, "timerStart"); - public static final IntegerProperty PREFERRED_DUE_DATE = new IntegerProperty( - TABLE, "preferredDueDate"); - public static final IntegerProperty POSTPONE_COUNT = new IntegerProperty( TABLE, "postponeCount"); diff --git a/astrid/src/com/todoroo/astrid/service/Astrid2To3UpgradeHelper.java b/astrid/src/com/todoroo/astrid/service/Astrid2To3UpgradeHelper.java index 1861770e5..64c064a05 100644 --- a/astrid/src/com/todoroo/astrid/service/Astrid2To3UpgradeHelper.java +++ b/astrid/src/com/todoroo/astrid/service/Astrid2To3UpgradeHelper.java @@ -1,5 +1,6 @@ package com.todoroo.astrid.service; +import java.util.Date; import java.util.HashMap; import java.util.Map.Entry; @@ -21,8 +22,9 @@ import com.todoroo.andlib.data.Property.PropertyVisitor; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.DependencyInjectionService; +import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.alarms.Alarm; -import com.todoroo.astrid.alarms.AlarmsDatabase; +import com.todoroo.astrid.alarms.AlarmDatabase; import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.TaskDao; @@ -114,7 +116,6 @@ public class Astrid2To3UpgradeHelper { propertyMap.put(AbstractTaskModel.ELAPSED_SECONDS, Task.ELAPSED_SECONDS); propertyMap.put(AbstractTaskModel.TIMER_START, Task.TIMER_START); propertyMap.put(AbstractTaskModel.DEFINITE_DUE_DATE, Task.DUE_DATE); - propertyMap.put(AbstractTaskModel.PREFERRED_DUE_DATE, Task.PREFERRED_DUE_DATE); propertyMap.put(AbstractTaskModel.HIDDEN_UNTIL, Task.HIDE_UNTIL); propertyMap.put(AbstractTaskModel.POSTPONE_COUNT, Task.POSTPONE_COUNT); propertyMap.put(AbstractTaskModel.NOTIFICATIONS, Task.NOTIFICATIONS); @@ -132,7 +133,7 @@ public class Astrid2To3UpgradeHelper { migrateTagsToMetadata(); // --- upgrade alerts - AlarmsDatabase alarmsDatabase = new AlarmsDatabase(); + AlarmDatabase alarmsDatabase = new AlarmDatabase(); alarmsDatabase.openForWriting(); propertyMap.clear(); propertyMap.put(AbstractController.KEY_ROWID, Alarm.ID); @@ -156,6 +157,7 @@ public class Astrid2To3UpgradeHelper { public int columnIndex; public Cursor cursor; public AbstractModel model; + public StringBuilder upgradeNotes; } /** @@ -184,6 +186,23 @@ public class Astrid2To3UpgradeHelper { @Override public Void visitLong(Property property, UpgradeVisitorContainer data) { long value = data.cursor.getLong(data.columnIndex); + + // special handling for due date + if(property == Task.DUE_DATE) { + long preferredDueDate = data.cursor.getLong(data.cursor.getColumnIndex(AbstractTaskModel.PREFERRED_DUE_DATE)); + if(value == 0) + value = preferredDueDate; + else if(preferredDueDate != 0) { + // had both absolute and preferred due dates. write + // preferred due date into notes field + if(data.upgradeNotes == null) + data.upgradeNotes = new StringBuilder(); + data.upgradeNotes.append("Goal Deadline: " + + DateUtilities.getFormattedDate(ContextManager.getContext(), + new Date(preferredDueDate))); + } + } + data.model.setValue(property, value); Log.d("upgrade", "wrote " + value + " to -> " + property + " of model id " + data.cursor.getLong(1)); return null; @@ -230,6 +249,17 @@ public class Astrid2To3UpgradeHelper { container.columnIndex = cursor.getColumnIndex(entry.getKey()); entry.getValue().accept(visitor, container); } + + // special tweak for adding upgrade notes to tasks + if(container.upgradeNotes != null) { + if(container.model.getValue(Task.NOTES).length() == 0) + container.model.setValue(Task.NOTES, container.upgradeNotes.toString()); + else { + container.model.setValue(Task.NOTES, + container.model.getValue(Task.NOTES) + "\n\n" + + container.upgradeNotes); + } + } dao.createItem(container.model); } diff --git a/tests/src/com/todoroo/astrid/test/DatabaseTestCase.java b/tests/src/com/todoroo/astrid/test/DatabaseTestCase.java index 7fce23a25..dedce0b8e 100644 --- a/tests/src/com/todoroo/astrid/test/DatabaseTestCase.java +++ b/tests/src/com/todoroo/astrid/test/DatabaseTestCase.java @@ -5,7 +5,7 @@ import java.io.File; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.TestDependencyInjector; import com.todoroo.andlib.test.TodorooTestCase; -import com.todoroo.astrid.alarms.AlarmsDatabase; +import com.todoroo.astrid.alarms.AlarmDatabase; import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.service.AstridDependencyInjector; @@ -25,7 +25,7 @@ public class DatabaseTestCase extends TodorooTestCase { public static Database database = new TestDatabase(); - public AlarmsDatabase alarmsDatabase; + public AlarmDatabase alarmsDatabase; static { AstridDependencyInjector.initialize(); @@ -53,7 +53,7 @@ public class DatabaseTestCase extends TodorooTestCase { deleteDatabase(TAG_TASK_TEST); deleteDatabase(ALERTS_TEST); deleteDatabase(SYNC_TEST); - alarmsDatabase = new AlarmsDatabase(); + alarmsDatabase = new AlarmDatabase(); alarmsDatabase.clear(); @@ -78,7 +78,7 @@ public class DatabaseTestCase extends TodorooTestCase { } } - public static class TestAlarmsDatabase extends AlarmsDatabase { + public static class TestAlarmsDatabase extends AlarmDatabase { @Override protected String getName() { return "alarmstest";