diff --git a/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatTaskCompleteListener.java b/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatTaskCompleteListener.java index 5c6b7a092..3b03285e5 100644 --- a/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatTaskCompleteListener.java +++ b/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatTaskCompleteListener.java @@ -75,22 +75,26 @@ public class RepeatTaskCompleteListener extends BroadcastReceiver { } else { RecurrenceIterator iterator = RecurrenceIteratorFactory.createRecurrenceIterator(rrule, repeatFrom, TimeZone.getDefault()); - if(repeatFrom.compareTo(today) < 0) - repeatFrom = today; - // go to the latest value and advance one more if needed - iterator.advanceTo(repeatFrom); - if(!iterator.hasNext()) - return; - DateValue nextDate = iterator.next(); - if(nextDate.compareTo(today) == 0) + DateValue nextDate; + if(repeatFrom.compareTo(today) < 0) { + iterator.advanceTo(today); + if(!iterator.hasNext()) + return; nextDate = iterator.next(); + } else { + iterator.advanceTo(repeatFrom); + if(!iterator.hasNext()) + return; + nextDate = iterator.next(); + nextDate = iterator.next(); + } if(nextDate instanceof DateTimeValueImpl) { DateTimeValueImpl newDateTime = (DateTimeValueImpl)nextDate; newDueDate = task.createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME, - new Date(newDateTime.year() - 1900, newDateTime.month() - 1, + Date.UTC(newDateTime.year() - 1900, newDateTime.month() - 1, newDateTime.day(), newDateTime.hour(), - newDateTime.minute(), newDateTime.second()).getTime()); + newDateTime.minute(), newDateTime.second())); } else { newDueDate = task.createDueDate(Task.URGENCY_SPECIFIC_DAY, new Date(nextDate.year() - 1900, nextDate.month() - 1, diff --git a/astrid/src/com/todoroo/astrid/model/Task.java b/astrid/src/com/todoroo/astrid/model/Task.java index aeb9ffbaa..bc0e1256b 100644 --- a/astrid/src/com/todoroo/astrid/model/Task.java +++ b/astrid/src/com/todoroo/astrid/model/Task.java @@ -173,6 +173,7 @@ public final class Task extends AbstractModel { defaultValues.put(ELAPSED_SECONDS.name, 0); defaultValues.put(POSTPONE_COUNT.name, 0); defaultValues.put(NOTES.name, ""); + defaultValues.put(FLAGS.name, 0); defaultValues.put(TIMER_START.name, 0); } diff --git a/tests/src/com/todoroo/astrid/repeats/RepeatTests.java b/tests/src/com/todoroo/astrid/repeats/RepeatTests.java index f8a8de04b..3a1a4e435 100644 --- a/tests/src/com/todoroo/astrid/repeats/RepeatTests.java +++ b/tests/src/com/todoroo/astrid/repeats/RepeatTests.java @@ -33,7 +33,7 @@ public class RepeatTests extends DatabaseTestCase { } /** test that completing a task w/ no repeats does nothing */ - public void xtestNoRepeats() throws Exception{ + public void testNoRepeats() throws Exception{ Task task = new Task(); task.setValue(Task.TITLE, "nothing"); taskDao.save(task, false); @@ -100,7 +100,7 @@ public class RepeatTests extends DatabaseTestCase { rrule.setInterval(1); rrule.setFreq(Frequency.WEEKLY); task.setValue(Task.RECURRENCE, rrule.toIcal()); - long originalDueDate = (DateUtilities.now() - DateUtilities.ONE_DAY) / 1000L * 1000L; + 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); @@ -143,14 +143,14 @@ public class RepeatTests extends DatabaseTestCase { rrule.setFreq(Frequency.HOURLY); 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, originalDueDate)); + task.setValue(Task.DUE_DATE, task.createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME, originalDueDate)); taskDao.save(task, false); task.setValue(Task.COMPLETION_DATE, DateUtilities.now()); taskDao.save(task, false); // wait for repeat handler - Thread.sleep(REPEAT_WAIT); + Thread.sleep(2 * REPEAT_WAIT); TodorooCursor cursor = taskDao.query(Query.select(Task.PROPERTIES)); try { @@ -182,8 +182,9 @@ public class RepeatTests extends DatabaseTestCase { rrule.setInterval(1); rrule.setFreq(Frequency.WEEKLY); task.setValue(Task.RECURRENCE, rrule.toIcal()); - long originalDueDate = DateUtilities.now() - 3 * DateUtilities.ONE_DAY; + 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); task.setValue(Task.COMPLETION_DATE, DateUtilities.now()); @@ -198,7 +199,7 @@ public class RepeatTests extends DatabaseTestCase { cursor.moveToFirst(); task.readFromCursor(cursor); - assertEquals(originalDueDate, (long)task.getValue(Task.DUE_DATE)); + assertTrue(task.hasDueDate()); assertTrue(task.isCompleted()); cursor.moveToNext(); @@ -209,7 +210,7 @@ public class RepeatTests extends DatabaseTestCase { assertTrue("Due date is '" + new Date(dueDate) + "', expected more like '" + new Date(DateUtilities.now() + DateUtilities.ONE_WEEK) + "'", - Math.abs(dueDate - DateUtilities.ONE_WEEK) < DateUtilities.ONE_DAY); + Math.abs(dueDate - DateUtilities.now() - DateUtilities.ONE_WEEK) < DateUtilities.ONE_DAY); } finally { cursor.close(); }