diff --git a/astrid/plugin-src/com/todoroo/astrid/backup/TasksXmlImporter.java b/astrid/plugin-src/com/todoroo/astrid/backup/TasksXmlImporter.java index 3409da542..f25e10811 100644 --- a/astrid/plugin-src/com/todoroo/astrid/backup/TasksXmlImporter.java +++ b/astrid/plugin-src/com/todoroo/astrid/backup/TasksXmlImporter.java @@ -249,7 +249,7 @@ public class TasksXmlImporter { currentTask.setId(Task.NO_ID); // Save the task to the database. - taskService.save(currentTask, false); + taskService.save(currentTask); importCount++; } @@ -461,7 +461,7 @@ public class TasksXmlImporter { } // Save the task to the database. - taskService.save(task, false); + taskService.save(task); importCount++; return task; } diff --git a/astrid/plugin-src/com/todoroo/astrid/producteev/sync/ProducteevDataService.java b/astrid/plugin-src/com/todoroo/astrid/producteev/sync/ProducteevDataService.java index f089b0c4d..086da27c6 100644 --- a/astrid/plugin-src/com/todoroo/astrid/producteev/sync/ProducteevDataService.java +++ b/astrid/plugin-src/com/todoroo/astrid/producteev/sync/ProducteevDataService.java @@ -138,7 +138,7 @@ public final class ProducteevDataService { * @param task */ public void saveTaskAndMetadata(ProducteevTaskContainer task) { - taskDao.save(task.task, true); + taskDao.save(task.task); task.metadata.add(task.pdvTask); metadataService.synchronizeMetadata(task.task.getId(), task.metadata, diff --git a/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatTaskCompleteListener.java b/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatTaskCompleteListener.java index 4742a493a..3d9248a57 100644 --- a/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatTaskCompleteListener.java +++ b/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatTaskCompleteListener.java @@ -58,11 +58,11 @@ public class RepeatTaskCompleteListener extends BroadcastReceiver { clone.setValue(Task.COMPLETION_DATE, 0L); clone.setValue(Task.TIMER_START, 0L); clone.setValue(Task.ELAPSED_SECONDS, 0); - PluginServices.getTaskService().save(clone, false); + PluginServices.getTaskService().save(clone); // clear recurrence from completed task so it can be re-completed task.setValue(Task.RECURRENCE, ""); //$NON-NLS-1$ - PluginServices.getTaskService().save(task, false); + PluginServices.getTaskService().save(task); // send a broadcast Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_EVENT_TASK_REPEATED); diff --git a/astrid/plugin-src/com/todoroo/astrid/rmilk/data/MilkDataService.java b/astrid/plugin-src/com/todoroo/astrid/rmilk/data/MilkDataService.java index 06887c257..06fa05e83 100644 --- a/astrid/plugin-src/com/todoroo/astrid/rmilk/data/MilkDataService.java +++ b/astrid/plugin-src/com/todoroo/astrid/rmilk/data/MilkDataService.java @@ -139,7 +139,7 @@ public final class MilkDataService { * @param task */ public void saveTaskAndMetadata(RTMTaskContainer task) { - taskDao.save(task.task, true); + taskDao.save(task.task); metadataDao.deleteWhere(Criterion.and(MetadataCriteria.byTask(task.task.getId()), Criterion.or(MetadataCriteria.withKey(MilkTask.METADATA_KEY), diff --git a/astrid/plugin-src/com/todoroo/astrid/timers/TimerPlugin.java b/astrid/plugin-src/com/todoroo/astrid/timers/TimerPlugin.java index 461c38216..9a437ee2d 100644 --- a/astrid/plugin-src/com/todoroo/astrid/timers/TimerPlugin.java +++ b/astrid/plugin-src/com/todoroo/astrid/timers/TimerPlugin.java @@ -52,7 +52,7 @@ public class TimerPlugin extends BroadcastReceiver { task.getValue(Task.ELAPSED_SECONDS) + newElapsed); } } - PluginServices.getTaskService().save(task, true); + PluginServices.getTaskService().save(task); TimerDecorationExposer.removeFromCache(task.getId()); // transmit new intents diff --git a/astrid/src/com/todoroo/astrid/activity/EditPreferences.java b/astrid/src/com/todoroo/astrid/activity/EditPreferences.java index eafe8f226..824216e24 100644 --- a/astrid/src/com/todoroo/astrid/activity/EditPreferences.java +++ b/astrid/src/com/todoroo/astrid/activity/EditPreferences.java @@ -130,7 +130,7 @@ public class EditPreferences extends TodorooPreferences { for(int i = 0; i < 100; i++) { task.clear(); task.setValue(Task.TITLE, Integer.toString(i)); - taskService.save(task, false); + taskService.save(task); } dialogUtilities.okDialog(EditPreferences.this, "done", null); return false; diff --git a/astrid/src/com/todoroo/astrid/activity/ShortcutActivity.java b/astrid/src/com/todoroo/astrid/activity/ShortcutActivity.java index 25fcf42cc..aad0405de 100644 --- a/astrid/src/com/todoroo/astrid/activity/ShortcutActivity.java +++ b/astrid/src/com/todoroo/astrid/activity/ShortcutActivity.java @@ -26,10 +26,12 @@ import android.content.ContentValues; import android.content.Intent; import android.os.Bundle; +import com.timsu.astrid.R; import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.sql.QueryTemplate; import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.astrid.api.Filter; +import com.todoroo.astrid.model.Task; /** * This activity is launched when a user opens up a notification from the @@ -42,6 +44,9 @@ public class ShortcutActivity extends Activity { // --- constants + /** token for passing a task id through extras for viewing a single task */ + public static final String TOKEN_SINGLE_TASK = "id"; //$NON-NLS-1$ + /** token for passing a {@link Filter}'s title through extras */ public static final String TOKEN_FILTER_TITLE = "title"; //$NON-NLS-1$ @@ -105,13 +110,20 @@ public class ShortcutActivity extends Activity { } } - Filter filter = new Filter("", title, new QueryTemplate(), values); //$NON-NLS-1$ - filter.sqlQuery = sql; + Filter filter = new Filter("", title, sql, values); //$NON-NLS-1$ + Intent taskListIntent = new Intent(this, TaskListActivity.class); + taskListIntent.putExtra(TaskListActivity.TOKEN_FILTER, filter); + startActivity(taskListIntent); + } else if(extras != null && extras.containsKey(TOKEN_SINGLE_TASK)) { + Filter filter = new Filter("", getString(R.string.TLA_custom), //$NON-NLS-1$ + new QueryTemplate().where(Task.ID.eq(extras.getLong(TOKEN_SINGLE_TASK, -1))), null); Intent taskListIntent = new Intent(this, TaskListActivity.class); taskListIntent.putExtra(TaskListActivity.TOKEN_FILTER, filter); startActivity(taskListIntent); } + + finish(); } diff --git a/astrid/src/com/todoroo/astrid/activity/TaskEditActivity.java b/astrid/src/com/todoroo/astrid/activity/TaskEditActivity.java index bccaf3285..f52d5020b 100644 --- a/astrid/src/com/todoroo/astrid/activity/TaskEditActivity.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskEditActivity.java @@ -104,7 +104,7 @@ public final class TaskEditActivity extends TabActivity { /** * Task ID */ - public static final String TOKEN_ID = "i"; //$NON-NLS-1$ + public static final String TOKEN_ID = "id"; //$NON-NLS-1$ /** * Content Values to set @@ -195,7 +195,6 @@ public final class TaskEditActivity extends TabActivity { if(savedInstanceState != null && savedInstanceState.containsKey(TASK_IN_PROGRESS)) { Task task = savedInstanceState.getParcelable(TASK_IN_PROGRESS); if(task != null) { - System.err.println("TASK being un-bundled"); model = task; } } @@ -348,7 +347,6 @@ public final class TaskEditActivity extends TabActivity { // set deletion date until task gets a title model.setValue(Task.DELETION_DATE, DateUtilities.now()); - System.err.println("new task. deletion date set"); } else { FlurryAgent.onEvent("edit-task"); } @@ -383,8 +381,7 @@ public final class TaskEditActivity extends TabActivity { if(title.getText().length() > 0) model.setValue(Task.DELETION_DATE, 0L); - System.err.println("TASK being saved. " + model.getMergedValues()); - if(taskService.save(model, false) && title.getText().length() > 0) + if(taskService.save(model) && title.getText().length() > 0) showSaveToast(); } @@ -392,8 +389,6 @@ public final class TaskEditActivity extends TabActivity { public void finish() { super.finish(); - System.err.println("FINISH. " + title.getText()); - // abandon editing and delete the newly created task if // no title was entered @@ -578,8 +573,6 @@ public final class TaskEditActivity extends TabActivity { protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); - System.err.println("bundling. " + title.getText()); - // stick our task into the outState outState.putParcelable(TASK_IN_PROGRESS, model); } diff --git a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java index 37863d774..2bbba4b56 100644 --- a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java @@ -290,7 +290,7 @@ public class TaskListActivity extends ListActivity implements OnScrollListener, int importance = event.getNumber() - '1'; Task task = ((ViewHolder)selected.getTag()).task; task.setValue(Task.IMPORTANCE, importance); - taskService.save(task, false); + taskService.save(task); taskAdapter.setFieldContentsAndVisibility(selected); } // filter @@ -687,7 +687,7 @@ public class TaskListActivity extends ListActivity implements OnScrollListener, } task.mergeWith(forTask); } - taskService.save(task, false); + taskService.save(task); if(forMetadata != null && forMetadata.size() > 0) { Metadata metadata = new Metadata(); metadata.setValue(Metadata.TASK, task.getId()); @@ -831,7 +831,7 @@ public class TaskListActivity extends ListActivity implements OnScrollListener, Task task = new Task(); task.setId(itemId); task.setValue(Task.DELETION_DATE, 0L); - taskService.save(task, false); + taskService.save(task); loadTaskListContent(true); return true; } diff --git a/astrid/src/com/todoroo/astrid/dao/TaskDao.java b/astrid/src/com/todoroo/astrid/dao/TaskDao.java index 5ef9e3c65..6298f9af6 100644 --- a/astrid/src/com/todoroo/astrid/dao/TaskDao.java +++ b/astrid/src/com/todoroo/astrid/dao/TaskDao.java @@ -146,12 +146,9 @@ public class TaskDao extends GenericDao { * exist. Returns true on success. * * @param task - * @param skipHooks - * Whether pre and post hooks should run. This should be set - * to true if tasks are created as part of synchronization * @return true if save occurred, false otherwise (i.e. nothing changed) */ - public boolean save(Task task, boolean skipHooks) { + public boolean save(Task task) { boolean saveSuccessful; ContentValues values = task.getSetValues(); diff --git a/astrid/src/com/todoroo/astrid/service/TaskService.java b/astrid/src/com/todoroo/astrid/service/TaskService.java index e8a1bd746..96ef546a9 100644 --- a/astrid/src/com/todoroo/astrid/service/TaskService.java +++ b/astrid/src/com/todoroo/astrid/service/TaskService.java @@ -67,7 +67,7 @@ public class TaskService { item.setValue(Task.COMPLETION_DATE, DateUtilities.now()); else item.setValue(Task.COMPLETION_DATE, 0L); - taskDao.save(item, false); + taskDao.save(item); } /** @@ -78,8 +78,8 @@ public class TaskService { * Whether pre and post hooks should run. This should be set * to true if tasks are created as part of synchronization */ - public boolean save(Task item, boolean runHooks) { - return taskDao.save(item, runHooks); + public boolean save(Task item) { + return taskDao.save(item); } /** @@ -128,7 +128,7 @@ public class TaskService { item.clear(); item.setId(id); item.setValue(Task.DELETION_DATE, DateUtilities.now()); - taskDao.save(item, false); + taskDao.save(item); } } @@ -225,7 +225,7 @@ public class TaskService { try { for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { taskValues.setValue(Task.ID, cursor.get(Task.ID)); - taskDao.save(taskValues, false); + taskDao.save(taskValues); } return cursor.getCount(); } finally { diff --git a/tests/src/com/todoroo/astrid/dao/TaskDaoTests.java b/tests/src/com/todoroo/astrid/dao/TaskDaoTests.java index a9bcb45ea..6478fb845 100644 --- a/tests/src/com/todoroo/astrid/dao/TaskDaoTests.java +++ b/tests/src/com/todoroo/astrid/dao/TaskDaoTests.java @@ -32,7 +32,7 @@ public class TaskDaoTests extends DatabaseTestCase { // create task "happy" Task task = new Task(); task.setValue(Task.TITLE, "happy"); - assertTrue(taskDao.save(task, false)); + assertTrue(taskDao.save(task)); cursor = taskDao.query( Query.select(IDS)); assertEquals(1, cursor.getCount()); @@ -45,7 +45,7 @@ public class TaskDaoTests extends DatabaseTestCase { // create task "sad" task = new Task(); task.setValue(Task.TITLE, "sad"); - assertTrue(taskDao.save(task, false)); + assertTrue(taskDao.save(task)); cursor = taskDao.query( Query.select(IDS)); assertEquals(2, cursor.getCount()); @@ -55,7 +55,7 @@ public class TaskDaoTests extends DatabaseTestCase { long sadId = task.getId(); assertNotSame(Task.NO_ID, sadId); task.setValue(Task.TITLE, "melancholy"); - assertTrue(taskDao.save(task, false)); + assertTrue(taskDao.save(task)); cursor = taskDao.query( Query.select(IDS)); assertEquals(2, cursor.getCount()); @@ -75,35 +75,35 @@ public class TaskDaoTests extends DatabaseTestCase { // create normal task Task task = new Task(); task.setValue(Task.TITLE, "normal"); - assertTrue(taskDao.save(task, false)); + assertTrue(taskDao.save(task)); // create blank task task = new Task(); task.setValue(Task.TITLE, ""); - assertTrue(taskDao.save(task, false)); + assertTrue(taskDao.save(task)); // create hidden task task = new Task(); task.setValue(Task.TITLE, "hidden"); task.setValue(Task.HIDE_UNTIL, DateUtilities.now() + 10000); - assertTrue(taskDao.save(task, false)); + assertTrue(taskDao.save(task)); // create task with deadlines task = new Task(); task.setValue(Task.TITLE, "deadlineInFuture"); task.setValue(Task.DUE_DATE, DateUtilities.now() + 10000); - assertTrue(taskDao.save(task, false)); + assertTrue(taskDao.save(task)); task = new Task(); task.setValue(Task.TITLE, "deadlineInPast"); task.setValue(Task.DUE_DATE, DateUtilities.now() - 10000); - assertTrue(taskDao.save(task, false)); + assertTrue(taskDao.save(task)); // create completed task task = new Task(); task.setValue(Task.TITLE, "completed"); task.setValue(Task.COMPLETION_DATE, DateUtilities.now() - 10000); - assertTrue(taskDao.save(task, false)); + assertTrue(taskDao.save(task)); // check has no name TodorooCursor cursor = taskDao.query( @@ -165,7 +165,7 @@ public class TaskDaoTests extends DatabaseTestCase { // create task "happy" Task task = new Task(); task.setValue(Task.TITLE, "happy"); - assertTrue(taskDao.save(task, false)); + assertTrue(taskDao.save(task)); cursor = taskDao.query( Query.select(IDS)); assertEquals(1, cursor.getCount()); @@ -191,7 +191,7 @@ public class TaskDaoTests extends DatabaseTestCase { task.setValue(Task.TITLE, "happy"); task.setValue(Task.ID, 1L); - assertFalse(taskDao.save(task, false)); + assertFalse(taskDao.save(task)); cursor = taskDao.query( Query.select(IDS)); diff --git a/tests/src/com/todoroo/astrid/model/TaskTests.java b/tests/src/com/todoroo/astrid/model/TaskTests.java index 1b99ebcd2..ee2498e99 100644 --- a/tests/src/com/todoroo/astrid/model/TaskTests.java +++ b/tests/src/com/todoroo/astrid/model/TaskTests.java @@ -46,7 +46,7 @@ public class TaskTests extends DatabaseTestCase { /** Check task gets a creation date at some point */ public void checkCreationDate() { Task task = new Task(); - taskService.save(task, false); + taskService.save(task); assertTrue(task.getValue(Task.CREATION_DATE) > 0); } diff --git a/tests/src/com/todoroo/astrid/reminders/ReminderServiceTests.java b/tests/src/com/todoroo/astrid/reminders/ReminderServiceTests.java index a4c2cc0a3..9ddb7d6ae 100644 --- a/tests/src/com/todoroo/astrid/reminders/ReminderServiceTests.java +++ b/tests/src/com/todoroo/astrid/reminders/ReminderServiceTests.java @@ -37,7 +37,7 @@ public class ReminderServiceTests extends DatabaseTestCase { Task task = new Task(); task.setValue(Task.TITLE, "water"); task.setValue(Task.REMINDER_FLAGS, 0); - taskDao.save(task, false); + taskDao.save(task); service.scheduleAlarm(task); } @@ -49,7 +49,7 @@ public class ReminderServiceTests extends DatabaseTestCase { task.setValue(Task.TITLE, "water"); task.setValue(Task.DUE_DATE, DateUtilities.now() - DateUtilities.ONE_DAY); task.setValue(Task.REMINDER_FLAGS, Task.NOTIFY_AT_DEADLINE); - taskDao.save(task, false); + taskDao.save(task); // test due date in the future task.setValue(Task.DUE_DATE, DateUtilities.now() + DateUtilities.ONE_DAY); @@ -61,7 +61,7 @@ public class ReminderServiceTests extends DatabaseTestCase { assertEquals(type, ReminderService.TYPE_DUE); } }); - taskDao.save(task, false); + taskDao.save(task); assertTrue(((AlarmExpected)service.getScheduler()).alarmCreated); } @@ -80,7 +80,7 @@ public class ReminderServiceTests extends DatabaseTestCase { assertEquals(type, ReminderService.TYPE_RANDOM); } }); - taskDao.save(task, false); + taskDao.save(task); assertTrue(((AlarmExpected)service.getScheduler()).alarmCreated); } @@ -92,7 +92,7 @@ public class ReminderServiceTests extends DatabaseTestCase { task.setValue(Task.TITLE, "water"); task.setValue(Task.DUE_DATE, DateUtilities.now() + DateUtilities.ONE_DAY); task.setValue(Task.REMINDER_FLAGS, Task.NOTIFY_AFTER_DEADLINE); - taskDao.save(task, false); + taskDao.save(task); // test due date in the past task.setValue(Task.DUE_DATE, DateUtilities.now() - DateUtilities.ONE_DAY); @@ -105,7 +105,7 @@ public class ReminderServiceTests extends DatabaseTestCase { assertEquals(type, ReminderService.TYPE_OVERDUE); } }); - taskDao.save(task, false); + taskDao.save(task); assertTrue(((AlarmExpected)service.getScheduler()).alarmCreated); } @@ -126,7 +126,7 @@ public class ReminderServiceTests extends DatabaseTestCase { assertEquals(type, ReminderService.TYPE_RANDOM); } }); - taskDao.save(task, false); + taskDao.save(task); assertTrue(((AlarmExpected)service.getScheduler()).alarmCreated); // now set the due date in the past @@ -145,7 +145,7 @@ public class ReminderServiceTests extends DatabaseTestCase { assertEquals(type, ReminderService.TYPE_DUE); } }); - taskDao.save(task, false); + taskDao.save(task); assertTrue(((AlarmExpected)service.getScheduler()).alarmCreated); } diff --git a/tests/src/com/todoroo/astrid/repeats/RepeatTests.java b/tests/src/com/todoroo/astrid/repeats/RepeatTests.java index ddaefe750..7b485e0f3 100644 --- a/tests/src/com/todoroo/astrid/repeats/RepeatTests.java +++ b/tests/src/com/todoroo/astrid/repeats/RepeatTests.java @@ -36,10 +36,10 @@ public class RepeatTests extends DatabaseTestCase { public void testNoRepeats() throws Exception{ Task task = new Task(); task.setValue(Task.TITLE, "nothing"); - taskDao.save(task, false); + taskDao.save(task); task.setValue(Task.COMPLETION_DATE, DateUtilities.now()); - taskDao.save(task, false); + taskDao.save(task); // wait for repeat handler Thread.sleep(REPEAT_WAIT); @@ -60,10 +60,10 @@ public class RepeatTests extends DatabaseTestCase { rrule.setInterval(5); rrule.setFreq(Frequency.DAILY); task.setValue(Task.RECURRENCE, rrule.toIcal()); - taskDao.save(task, false); + taskDao.save(task); task.setValue(Task.COMPLETION_DATE, DateUtilities.now()); - taskDao.save(task, false); + taskDao.save(task); // wait for repeat handler Thread.sleep(REPEAT_WAIT); @@ -102,10 +102,10 @@ public class RepeatTests extends DatabaseTestCase { task.setValue(Task.RECURRENCE, rrule.toIcal()); long originalDueDate = (DateUtilities.now() - 3 * DateUtilities.ONE_DAY) / 1000L * 1000L; task.setValue(Task.DUE_DATE, task.createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME, originalDueDate)); - taskDao.save(task, false); + taskDao.save(task); task.setValue(Task.COMPLETION_DATE, DateUtilities.now()); - taskDao.save(task, false); + taskDao.save(task); // wait for repeat handler Thread.sleep(REPEAT_WAIT); @@ -144,10 +144,10 @@ public class RepeatTests extends DatabaseTestCase { task.setValue(Task.RECURRENCE, rrule.toIcal()); long originalDueDate = (DateUtilities.now() + DateUtilities.ONE_DAY) / 1000L * 1000L; task.setValue(Task.DUE_DATE, task.createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME, originalDueDate)); - taskDao.save(task, false); + taskDao.save(task); task.setValue(Task.COMPLETION_DATE, DateUtilities.now()); - taskDao.save(task, false); + taskDao.save(task); // wait for repeat handler Thread.sleep(2 * REPEAT_WAIT); @@ -187,10 +187,10 @@ public class RepeatTests extends DatabaseTestCase { long originalDueDate = (DateUtilities.now() - 3 * DateUtilities.ONE_DAY) / 1000L * 1000L; task.setValue(Task.DUE_DATE, task.createDueDate(Task.URGENCY_SPECIFIC_DAY, originalDueDate)); task.setFlag(Task.FLAGS, Task.FLAG_REPEAT_AFTER_COMPLETION, true); - taskDao.save(task, false); + taskDao.save(task); task.setValue(Task.COMPLETION_DATE, DateUtilities.now()); - taskDao.save(task, false); + taskDao.save(task); // wait for repeat handler Thread.sleep(REPEAT_WAIT); @@ -226,7 +226,7 @@ public class RepeatTests extends DatabaseTestCase { rrule.setInterval(5); rrule.setFreq(Frequency.DAILY); task.setValue(Task.RECURRENCE, rrule.toIcal()); - taskDao.save(task, false); + taskDao.save(task); Metadata metadata = new Metadata(); metadata.setValue(Metadata.KEY, "special"); @@ -235,7 +235,7 @@ public class RepeatTests extends DatabaseTestCase { metadataDao.persist(metadata); task.setValue(Task.COMPLETION_DATE, DateUtilities.now()); - taskDao.save(task, false); + taskDao.save(task); // wait for repeat handler Thread.sleep(REPEAT_WAIT); @@ -266,10 +266,10 @@ public class RepeatTests extends DatabaseTestCase { task.setValue(Task.RECURRENCE, rrule.toIcal()); task.setValue(Task.DUE_DATE, task.createDueDate(Task.URGENCY_TODAY, 0)); task.setValue(Task.HIDE_UNTIL, task.createHideUntil(Task.HIDE_UNTIL_DAY_BEFORE, 0)); - taskDao.save(task, false); + taskDao.save(task); task.setValue(Task.COMPLETION_DATE, DateUtilities.now()); - taskDao.save(task, false); + taskDao.save(task); // wait for repeat handler Thread.sleep(REPEAT_WAIT);