Alright, task editing is working for tags and alarms and all goodies. Also got rid of preferred due date.

pull/14/head
Tim Su 14 years ago
parent e06f60b95f
commit 82bf5598d5

@ -18,10 +18,14 @@ public class Field extends DBObject<Field> {
} }
public Criterion eq(Object value) { public Criterion eq(Object value) {
if(value == null)
return UnaryCriterion.isNull(this);
return UnaryCriterion.eq(this, value); return UnaryCriterion.eq(this, value);
} }
public Criterion neq(Object value) { public Criterion neq(Object value) {
if(value == null)
return UnaryCriterion.isNotNull(this);
return UnaryCriterion.neq(this, value); return UnaryCriterion.neq(this, value);
} }

@ -5,8 +5,11 @@
*/ */
package com.todoroo.andlib.utility; package com.todoroo.andlib.utility;
import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.Locale;
import android.content.Context;
import android.content.res.Resources; import android.content.res.Resources;
import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.Autowired;
@ -51,7 +54,7 @@ public class DateUtilities {
} }
/* ====================================================================== /* ======================================================================
* ============================================================ unix time * ============================================================ long time
* ====================================================================== */ * ====================================================================== */
/** Convert unixtime into date */ /** Convert unixtime into date */
@ -83,6 +86,93 @@ public class DateUtilities {
* =========================================================== formatters * =========================================================== 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. * Convenience method for dropping the preposition argument.
*/ */

@ -16,7 +16,7 @@ import com.todoroo.andlib.data.Table;
* *
*/ */
@SuppressWarnings("nls") @SuppressWarnings("nls")
public class AlarmsDatabase extends AbstractDatabase { public class AlarmDatabase extends AbstractDatabase {
// --- constants // --- constants

@ -1,8 +1,11 @@
package com.todoroo.astrid.alarms; 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.service.DependencyInjectionService;
import com.todoroo.andlib.sql.Query;
/** /**
* Provides operations for working with alerts * Provides operations for working with alerts
@ -13,13 +16,44 @@ import com.todoroo.andlib.service.DependencyInjectionService;
@SuppressWarnings("nls") @SuppressWarnings("nls")
public class AlarmService { public class AlarmService {
AlarmDatabase database = new AlarmDatabase();
GenericDao<Alarm> dao = new GenericDao<Alarm>(Alarm.class, database);
/** /**
* Metadata key for # of alarms * Metadata key for # of alarms
*/ */
public static final String ALARM_COUNT = "alarms-count"; public static final String ALARM_COUNT = "alarms-count";
public AlarmService(@SuppressWarnings("unused") Context context) { public AlarmService() {
DependencyInjectionService.getInstance().inject(this); DependencyInjectionService.getInstance().inject(this);
} }
/**
* Return alarms for the given task
*
* @param taskId
*/
public TodorooCursor<Alarm> 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<Alarm> 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);
}
}
} }

@ -40,8 +40,8 @@ public final class ExtendedFilterExposer extends BroadcastReceiver {
"Extended"); "Extended");
Filter alphabetical = new Filter(ExtendedPlugin.pluginIdentifier, Filter alphabetical = new Filter(ExtendedPlugin.pluginIdentifier,
"Inbox (sorted by name)", "Alphabetical",
"Inbox (sorted by name)", "Alphabetical",
new QueryTemplate().where(Criterion.and(TaskCriteria.isActive(), new QueryTemplate().where(Criterion.and(TaskCriteria.isActive(),
TaskCriteria.isVisible(DateUtilities.now()))). TaskCriteria.isVisible(DateUtilities.now()))).
orderBy(Order.asc(Task.TITLE)), orderBy(Order.asc(Task.TITLE)),

@ -29,7 +29,7 @@ public class DetailExposer extends BroadcastReceiver {
return; return;
if(tagService == null) if(tagService == null)
tagService = new TagService(context); tagService = new TagService();
String tagList = tagService.getTagsAsString(taskId); String tagList = tagService.getTagsAsString(taskId);
if(tagList.length() == 0) if(tagList.length() == 0)

@ -57,7 +57,7 @@ public class FilterExposer extends BroadcastReceiver {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
tagService = new TagService(context); tagService = new TagService();
Tag[] tagsByAlpha = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_ALPHA); Tag[] tagsByAlpha = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_ALPHA);
// If user does not have any tags, don't show this section at all // If user does not have any tags, don't show this section at all

@ -2,8 +2,6 @@ package com.todoroo.astrid.tags;
import java.util.ArrayList; import java.util.ArrayList;
import android.content.Context;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.data.Property.CountProperty; import com.todoroo.andlib.data.Property.CountProperty;
import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.Autowired;
@ -40,7 +38,7 @@ public class TagService {
@Autowired @Autowired
private MetadataService metadataService; private MetadataService metadataService;
public TagService(@SuppressWarnings("unused") Context context) { public TagService() {
DependencyInjectionService.getInstance().inject(this); DependencyInjectionService.getInstance().inject(this);
} }
@ -84,7 +82,7 @@ public class TagService {
return new QueryTemplate().join(Join.inner(Metadata.TABLE, return new QueryTemplate().join(Join.inner(Metadata.TABLE,
Task.ID.eq(Metadata.TASK))).where(Criterion.and( Task.ID.eq(Metadata.TASK))).where(Criterion.and(
TaskCriteria.isActive(), MetadataCriteria.withKey(KEY), TaskCriteria.isActive(), MetadataCriteria.withKey(KEY),
Metadata.VALUE.eq(null))); Metadata.VALUE.isNull()));
} }
/** /**

Binary file not shown.

Before

Width:  |  Height:  |  Size: 780 B

After

Width:  |  Height:  |  Size: 695 B

@ -5,7 +5,7 @@
android:orientation="horizontal" android:orientation="horizontal"
android:background="@android:drawable/list_selector_background" android:background="@android:drawable/list_selector_background"
android:focusable="true" android:focusable="true"
android:paddingTop="2px" android:paddingTop="8px"
android:paddingLeft="6dip" android:paddingLeft="6dip"
android:paddingRight="6dip" android:paddingRight="6dip"
android:paddingBottom="2px" android:paddingBottom="2px"

@ -124,7 +124,7 @@
<string name="TLA_title">Astrid: %s</string> <string name="TLA_title">Astrid: %s</string>
<!-- Displayed instead of list when no items present --> <!-- Displayed instead of list when no items present -->
<string name="TLA_no_items">You Have No Tasks!</string> <string name="TLA_no_items">No Tasks!</string>
<!-- Menu: Add Task --> <!-- Menu: Add Task -->
<string name="TLA_menu_add">Add Task</string> <string name="TLA_menu_add">Add Task</string>

@ -19,11 +19,10 @@
*/ */
package com.todoroo.astrid.activity; package com.todoroo.astrid.activity;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.HashSet;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Set;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.ContentValues; import android.content.ContentValues;
@ -54,7 +53,6 @@ import android.widget.ToggleButton;
import com.flurry.android.FlurryAgent; import com.flurry.android.FlurryAgent;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.timsu.astrid.data.enums.RepeatInterval; 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.TaskModelForEdit;
import com.timsu.astrid.data.task.AbstractTaskModel.RepeatInfo; import com.timsu.astrid.data.task.AbstractTaskModel.RepeatInfo;
import com.timsu.astrid.utilities.AstridUtilities; 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.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.utility.DateUtilities; 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.Metadata;
import com.todoroo.astrid.model.Task; import com.todoroo.astrid.model.Task;
import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.service.TaskService;
@ -112,7 +112,7 @@ public final class TaskEditActivity extends AbstractModelTabActivity<Task> {
private static final String TAB_ALERTS = "alerts"; //$NON-NLS-1$ private static final String TAB_ALERTS = "alerts"; //$NON-NLS-1$
private static final int DEFAULT_CAL_TIME = 3600; private static final int DEFAULT_CAL_TIME = 3600;
// --- autowired // --- services
@Autowired @Autowired
TaskService taskService; TaskService taskService;
@ -120,6 +120,10 @@ public final class TaskEditActivity extends AbstractModelTabActivity<Task> {
@Autowired @Autowired
DateUtilities dateUtilities; DateUtilities dateUtilities;
TagService tagService = new TagService();
AlarmService alarmService = new AlarmService();
// --- UI components // --- UI components
EditText title; EditText title;
ImportanceControlSet importance; ImportanceControlSet importance;
@ -146,7 +150,7 @@ public final class TaskEditActivity extends AbstractModelTabActivity<Task> {
boolean repeatHelpShown = false; boolean repeatHelpShown = false;
/** list of all tags */ /** list of all tags */
Tag[] tags; Tag[] allTags;
/* ====================================================================== /* ======================================================================
* ======================================================= initialization * ======================================================= initialization
@ -239,8 +243,7 @@ public final class TaskEditActivity extends AbstractModelTabActivity<Task> {
repeatInterval.setAdapter(repeatAdapter); repeatInterval.setAdapter(repeatAdapter);
// load tags // load tags
TagService tagService = new TagService(this); allTags = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE);
tags = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE);
// read data // read data
populateFields(); populateFields();
@ -310,7 +313,7 @@ public final class TaskEditActivity extends AbstractModelTabActivity<Task> {
}; };
/** Set up the repeat value button */ /** Set up the repeat value button */
private void setRepeatValue(int value) { void setRepeatValue(int value) {
if(value == 0) if(value == 0)
repeatValue.setText(R.string.repeat_value_unset); repeatValue.setText(R.string.repeat_value_unset);
else else
@ -319,7 +322,7 @@ public final class TaskEditActivity extends AbstractModelTabActivity<Task> {
} }
private RepeatInfo getRepeatValue() { private RepeatInfo getRepeatValue() {
if(repeatValue.getTag().equals(0)) if(repeatValue.getTag() == null || repeatValue.getTag().equals(0))
return null; return null;
return new RepeatInfo(RepeatInterval.values() return new RepeatInfo(RepeatInterval.values()
[repeatInterval.getSelectedItemPosition()], [repeatInterval.getSelectedItemPosition()],
@ -380,28 +383,34 @@ public final class TaskEditActivity extends AbstractModelTabActivity<Task> {
// tags (only configure if not already set) // tags (only configure if not already set)
if(tagsContainer.getChildCount() == 0) { if(tagsContainer.getChildCount() == 0) {
TagService tagService = new TagService(this);
TodorooCursor<Metadata> cursor = tagService.getTags(model.getId()); TodorooCursor<Metadata> cursor = tagService.getTags(model.getId());
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) try {
addTag(cursor.get(Metadata.VALUE)); for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext())
addTag(cursor.get(Metadata.VALUE));
} finally {
cursor.close();
}
addTag(""); //$NON-NLS-1$ addTag(""); //$NON-NLS-1$
} }
/* // alerts /// alarms
if(model.getTaskIdentifier() != null) { if(alertsContainer.getChildCount() == 0) {
List<Date> alerts = alertController.getTaskAlerts(model.getTaskIdentifier()); TodorooCursor<Alarm> cursor = alarmService.getAlarms(model.getId());
for(Date alert : alerts) { try {
addAlert(alert); for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext())
addAlert(new Date(cursor.get(Alarm.TIME)));
} finally {
cursor.close();
} }
} }
// repeats // repeats
RepeatInfo repeatInfo = model.getRepeat(); RepeatInfo repeatInfo = RepeatInfo.fromSingleField(model.getValue(Task.REPEAT));
if(repeatInfo != null) { if(repeatInfo != null) {
setRepeatValue(repeatInfo.getValue()); setRepeatValue(repeatInfo.getValue());
repeatInterval.setSelection(repeatInfo.getInterval().ordinal()); repeatInterval.setSelection(repeatInfo.getInterval().ordinal());
} else } else
setRepeatValue(0);*/ // TODO setRepeatValue(0);
} }
@ -426,6 +435,8 @@ public final class TaskEditActivity extends AbstractModelTabActivity<Task> {
model.setValue(Task.REPEAT, RepeatInfo.toSingleField(getRepeatValue())); model.setValue(Task.REPEAT, RepeatInfo.toSingleField(getRepeatValue()));
taskService.save(model, false); taskService.save(model, false);
saveTags();
saveAlerts();
long due = model.getValue(Task.DUE_DATE); long due = model.getValue(Task.DUE_DATE);
if (due != 0) { if (due != 0) {
@ -438,20 +449,19 @@ public final class TaskEditActivity extends AbstractModelTabActivity<Task> {
/** /**
* Displays a Toast reporting that the selected task has been saved and is * 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). * 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 stringResource;
int timeInSeconds = (int)((dueDate - System.currentTimeMillis())/1000L); long dueFromNow = due - System.currentTimeMillis();
if (timeInSeconds < 0) { if (dueFromNow < 0) {
timeInSeconds *= -1; // DateUtilities.getDurationString() requires positive integer
stringResource = R.string.taskEdit_onTaskSave_Overdue; stringResource = R.string.taskEdit_onTaskSave_Overdue;
} else { } else {
stringResource = R.string.taskEdit_onTaskSave_Due; stringResource = R.string.taskEdit_onTaskSave_Due;
} }
String formattedDate = dateUtilities.getDurationString(timeInSeconds, 2); String formattedDate = dateUtilities.getDurationString(dueFromNow, 2);
Toast.makeText(this, Toast.makeText(this,
getResources().getString(stringResource, formattedDate), getResources().getString(stringResource, formattedDate),
Toast.LENGTH_SHORT).show(); Toast.LENGTH_SHORT).show();
@ -467,57 +477,31 @@ public final class TaskEditActivity extends AbstractModelTabActivity<Task> {
/** Save task tags. Must be called after task already has an ID */ /** Save task tags. Must be called after task already has an ID */
private void saveTags() { private void saveTags() {
Set<TagIdentifier> tagsToDelete; ArrayList<String> tags = new ArrayList<String>();
Set<TagIdentifier> tagsToAdd;
HashSet<String> tagNames = new HashSet<String>();
for(int i = 0; i < tagsContainer.getChildCount(); i++) { for(int i = 0; i < tagsContainer.getChildCount(); i++) {
TextView tagName = (TextView)tagsContainer.getChildAt(i).findViewById(R.id.text1); TextView tagName = (TextView)tagsContainer.getChildAt(i).findViewById(R.id.text1);
if(tagName.getText().length() == 0) if(tagName.getText().length() == 0)
continue; continue;
tagNames.add(tagName.getText().toString()); tags.add(tagName.getText().toString());
}
// map names to tag identifiers, creating them if necessary
/*HashSet<TagIdentifier> tagIds = new HashSet<TagIdentifier>();
HashMap<String, TagIdentifier> tagsByName = new HashMap<String, TagIdentifier>();
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);
}
} }
// intersect tags to figure out which we need to add / remove tagService.synchronizeTags(model.getId(), tags);
tagsToDelete = new HashSet<TagIdentifier>(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);*/
} }
/** Helper method to save alerts for this task */ /** Helper method to save alerts for this task */
private void saveAlerts() { private void saveAlerts() {
/*alertController.removeAlerts(model.getTaskIdentifier()); ArrayList<Alarm> alarms = new ArrayList<Alarm>();
for(int i = 0; i < alertsContainer.getChildCount(); i++) { for(int i = 0; i < alertsContainer.getChildCount(); i++) {
DateControlSet dateControlSet = (DateControlSet)alertsContainer. DateControlSet dateControlSet = (DateControlSet)alertsContainer.
getChildAt(i).getTag(); getChildAt(i).getTag();
Date date = dateControlSet.getDate(); 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<Task> {
textView.setText(tagName); textView.setText(tagName);
ArrayAdapter<Tag> tagsAdapter = ArrayAdapter<Tag> tagsAdapter =
new ArrayAdapter<Tag>(this, new ArrayAdapter<Tag>(this,
android.R.layout.simple_dropdown_item_1line, tags); android.R.layout.simple_dropdown_item_1line, allTags);
textView.setAdapter(tagsAdapter); textView.setAdapter(tagsAdapter);
textView.addTextChangedListener(new TextWatcher() { textView.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, public void onTextChanged(CharSequence s, int start, int before,
@ -693,6 +677,7 @@ public final class TaskEditActivity extends AbstractModelTabActivity<Task> {
* @param estimatedSeconds estimated duration or null * @param estimatedSeconds estimated duration or null
* @param values * @param values
*/ */
@SuppressWarnings("nls")
public static void createCalendarStartEndTimes(Date preferred, Date definite, public static void createCalendarStartEndTimes(Date preferred, Date definite,
Integer estimatedSeconds, ContentValues values) { Integer estimatedSeconds, ContentValues values) {
FlurryAgent.onEvent("create-calendar-event"); FlurryAgent.onEvent("create-calendar-event");
@ -740,12 +725,12 @@ public final class TaskEditActivity extends AbstractModelTabActivity<Task> {
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
Log.e("astrid", "Error creating calendar event!", e); Log.e("astrid", "Error creating calendar event!", e);
} }
} } */
if(shouldSaveState) if(shouldSaveState)
save(); save();
if(addToCalendar.isChecked() && model.getCalendarUri() != null) { /* if(addToCalendar.isChecked() && model.getCalendarUri() != null) {
Uri result = Uri.parse(model.getCalendarUri()); Uri result = Uri.parse(model.getCalendarUri());
Intent intent = new Intent(Intent.ACTION_EDIT, result); Intent intent = new Intent(Intent.ACTION_EDIT, result);
@ -758,7 +743,7 @@ public final class TaskEditActivity extends AbstractModelTabActivity<Task> {
intent.putExtra("endTime", values.getAsLong("dtend")); intent.putExtra("endTime", values.getAsLong("dtend"));
startActivity(intent); startActivity(intent);
}*/ } */
super.onPause(); super.onPause();
} }

@ -215,7 +215,7 @@ public class TaskListActivity extends ListActivity implements OnScrollListener {
public void onClick(View v) { public void onClick(View v) {
TextView quickAdd = (TextView)findViewById(R.id.quickAddText); TextView quickAdd = (TextView)findViewById(R.id.quickAddText);
if(quickAdd.getText().length() > 0) { if(quickAdd.getText().length() > 0) {
Task task = quickAddTask(quickAdd.getText().toString()); quickAddTask(quickAdd.getText().toString());
quickAdd.setText(""); //$NON-NLS-1$ quickAdd.setText(""); //$NON-NLS-1$
loadTaskListContent(true); loadTaskListContent(true);
} else { } else {
@ -484,8 +484,8 @@ public class TaskListActivity extends ListActivity implements OnScrollListener {
case MENU_PLUGINS_ID: case MENU_PLUGINS_ID:
dialogUtilities.okDialog( dialogUtilities.okDialog(
this, this,
"if this were real life, I would display the Android " + //$NON-NLS-1$ "if this were real life, I would display your " + //$NON-NLS-1$
"market with a search for plugins that you could install.", //$NON-NLS-1$ "plugins so you could enable/disable/rearrange them.", //$NON-NLS-1$
null); null);
return true; return true;
case MENU_SETTINGS_ID: case MENU_SETTINGS_ID:

@ -137,7 +137,7 @@ public class FilterAdapter extends BaseExpandableListAdapter {
textView.setTextAppearance(activity, R.style.TextAppearance_FLA_Category); textView.setTextAppearance(activity, R.style.TextAppearance_FLA_Category);
View view = augmentView(textView, filter); View view = augmentView(textView, filter);
view.setPadding(40, 2, 0, 2); view.setPadding(60, 2, 0, 2);
view.setLayoutParams(llp); view.setLayoutParams(llp);
layout.addView(view); layout.addView(view);
@ -159,7 +159,7 @@ public class FilterAdapter extends BaseExpandableListAdapter {
ImageView icon = new ImageView(activity); ImageView icon = new ImageView(activity);
icon.setImageBitmap(filter.listingIcon); icon.setImageBitmap(filter.listingIcon);
icon.setPadding(0, 0, 20, 0); icon.setPadding(0, 0, 15, 0);
layout.addView(icon); layout.addView(icon);
layout.addView(textView); layout.addView(textView);
return layout; return layout;
@ -180,7 +180,7 @@ public class FilterAdapter extends BaseExpandableListAdapter {
View view = augmentView(textView, filter); View view = augmentView(textView, filter);
view.setBackgroundDrawable(null); view.setBackgroundDrawable(null);
view.setLayoutParams(lp); view.setLayoutParams(lp);
view.setPadding(isChild ? 40 : 10, 0, 0, 0); view.setPadding(isChild ? 50 : 10, 0, 0, 0);
return view; return view;
} }
@ -197,7 +197,7 @@ public class FilterAdapter extends BaseExpandableListAdapter {
View view = augmentView(textView, header); View view = augmentView(textView, header);
view.setBackgroundResource(R.drawable.edit_titlebar); view.setBackgroundResource(R.drawable.edit_titlebar);
view.setLayoutParams(lp); view.setLayoutParams(lp);
view.setPadding(isChild ? 40 : 10, 0, 0, 0); view.setPadding(isChild ? 50 : 10, 0, 0, 0);
return view; return view;
} }

@ -89,9 +89,6 @@ public final class Task extends AbstractModel {
public static final IntegerProperty TIMER_START = new IntegerProperty( public static final IntegerProperty TIMER_START = new IntegerProperty(
TABLE, "timerStart"); TABLE, "timerStart");
public static final IntegerProperty PREFERRED_DUE_DATE = new IntegerProperty(
TABLE, "preferredDueDate");
public static final IntegerProperty POSTPONE_COUNT = new IntegerProperty( public static final IntegerProperty POSTPONE_COUNT = new IntegerProperty(
TABLE, "postponeCount"); TABLE, "postponeCount");

@ -1,5 +1,6 @@
package com.todoroo.astrid.service; package com.todoroo.astrid.service;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map.Entry; 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.Autowired;
import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.alarms.Alarm; 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.Database;
import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskDao;
@ -114,7 +116,6 @@ public class Astrid2To3UpgradeHelper {
propertyMap.put(AbstractTaskModel.ELAPSED_SECONDS, Task.ELAPSED_SECONDS); propertyMap.put(AbstractTaskModel.ELAPSED_SECONDS, Task.ELAPSED_SECONDS);
propertyMap.put(AbstractTaskModel.TIMER_START, Task.TIMER_START); propertyMap.put(AbstractTaskModel.TIMER_START, Task.TIMER_START);
propertyMap.put(AbstractTaskModel.DEFINITE_DUE_DATE, Task.DUE_DATE); 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.HIDDEN_UNTIL, Task.HIDE_UNTIL);
propertyMap.put(AbstractTaskModel.POSTPONE_COUNT, Task.POSTPONE_COUNT); propertyMap.put(AbstractTaskModel.POSTPONE_COUNT, Task.POSTPONE_COUNT);
propertyMap.put(AbstractTaskModel.NOTIFICATIONS, Task.NOTIFICATIONS); propertyMap.put(AbstractTaskModel.NOTIFICATIONS, Task.NOTIFICATIONS);
@ -132,7 +133,7 @@ public class Astrid2To3UpgradeHelper {
migrateTagsToMetadata(); migrateTagsToMetadata();
// --- upgrade alerts // --- upgrade alerts
AlarmsDatabase alarmsDatabase = new AlarmsDatabase(); AlarmDatabase alarmsDatabase = new AlarmDatabase();
alarmsDatabase.openForWriting(); alarmsDatabase.openForWriting();
propertyMap.clear(); propertyMap.clear();
propertyMap.put(AbstractController.KEY_ROWID, Alarm.ID); propertyMap.put(AbstractController.KEY_ROWID, Alarm.ID);
@ -156,6 +157,7 @@ public class Astrid2To3UpgradeHelper {
public int columnIndex; public int columnIndex;
public Cursor cursor; public Cursor cursor;
public AbstractModel model; public AbstractModel model;
public StringBuilder upgradeNotes;
} }
/** /**
@ -184,6 +186,23 @@ public class Astrid2To3UpgradeHelper {
@Override @Override
public Void visitLong(Property<Long> property, UpgradeVisitorContainer data) { public Void visitLong(Property<Long> property, UpgradeVisitorContainer data) {
long value = data.cursor.getLong(data.columnIndex); 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); data.model.setValue(property, value);
Log.d("upgrade", "wrote " + value + " to -> " + property + " of model id " + data.cursor.getLong(1)); Log.d("upgrade", "wrote " + value + " to -> " + property + " of model id " + data.cursor.getLong(1));
return null; return null;
@ -230,6 +249,17 @@ public class Astrid2To3UpgradeHelper {
container.columnIndex = cursor.getColumnIndex(entry.getKey()); container.columnIndex = cursor.getColumnIndex(entry.getKey());
entry.getValue().accept(visitor, container); 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); dao.createItem(container.model);
} }

@ -5,7 +5,7 @@ import java.io.File;
import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.service.TestDependencyInjector; import com.todoroo.andlib.service.TestDependencyInjector;
import com.todoroo.andlib.test.TodorooTestCase; 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.dao.Database;
import com.todoroo.astrid.service.AstridDependencyInjector; import com.todoroo.astrid.service.AstridDependencyInjector;
@ -25,7 +25,7 @@ public class DatabaseTestCase extends TodorooTestCase {
public static Database database = new TestDatabase(); public static Database database = new TestDatabase();
public AlarmsDatabase alarmsDatabase; public AlarmDatabase alarmsDatabase;
static { static {
AstridDependencyInjector.initialize(); AstridDependencyInjector.initialize();
@ -53,7 +53,7 @@ public class DatabaseTestCase extends TodorooTestCase {
deleteDatabase(TAG_TASK_TEST); deleteDatabase(TAG_TASK_TEST);
deleteDatabase(ALERTS_TEST); deleteDatabase(ALERTS_TEST);
deleteDatabase(SYNC_TEST); deleteDatabase(SYNC_TEST);
alarmsDatabase = new AlarmsDatabase(); alarmsDatabase = new AlarmDatabase();
alarmsDatabase.clear(); alarmsDatabase.clear();
@ -78,7 +78,7 @@ public class DatabaseTestCase extends TodorooTestCase {
} }
} }
public static class TestAlarmsDatabase extends AlarmsDatabase { public static class TestAlarmsDatabase extends AlarmDatabase {
@Override @Override
protected String getName() { protected String getName() {
return "alarmstest"; return "alarmstest";

Loading…
Cancel
Save