Deprecated the repeat after completion flag

pull/14/head
Sam Bosley 13 years ago
parent b707c33742
commit e30b71d416

@ -187,7 +187,7 @@ public final class Task extends RemoteModel {
// --- flags // --- flags
/** whether repeat occurs relative to completion date instead of due date */ /** whether repeat occurs relative to completion date instead of due date */
public static final int FLAG_REPEAT_AFTER_COMPLETION = 1 << 1; @Deprecated public static final int FLAG_REPEAT_AFTER_COMPLETION = 1 << 1;
/** whether task is read-only */ /** whether task is read-only */
@Deprecated public static final int FLAG_IS_READONLY = 1 << 2; @Deprecated public static final int FLAG_IS_READONLY = 1 << 2;
@ -505,6 +505,14 @@ public final class Task extends RemoteModel {
!(getValue(Task.IS_PUBLIC) == 1 && getValue(Task.USER_ID) != Task.USER_ID_SELF); !(getValue(Task.IS_PUBLIC) == 1 && getValue(Task.USER_ID) != Task.USER_ID_SELF);
} }
public boolean repeatAfterCompletion() {
return getValue(Task.RECURRENCE).contains("FROM=COMPLETION");
}
public String sanitizedRecurrence() {
return getValue(Task.RECURRENCE).replaceAll(";?FROM=[^;]*", ""); //$NON-NLS-1$//$NON-NLS-2$
}
/** /**
* Checks whether provided due date has a due time or only a date * Checks whether provided due date has a due time or only a date
*/ */

@ -508,7 +508,7 @@ public class ProducteevSyncProvider extends SyncProvider<ProducteevTaskContainer
remote.pdvTask.getValue(ProducteevTask.REPEATING_SETTING).length()>0)); remote.pdvTask.getValue(ProducteevTask.REPEATING_SETTING).length()>0));
boolean isAstridRepeating = local.task.containsNonNullValue(Task.RECURRENCE) && boolean isAstridRepeating = local.task.containsNonNullValue(Task.RECURRENCE) &&
local.task.getValue(Task.RECURRENCE).length() > 0; !TextUtils.isEmpty(local.task.getValue(Task.RECURRENCE));
if (isAstridRepeating && isPDVRepeating) { if (isAstridRepeating && isPDVRepeating) {
// Astrid-repeat overrides PDV-repeat // Astrid-repeat overrides PDV-repeat
@ -609,8 +609,7 @@ public class ProducteevSyncProvider extends SyncProvider<ProducteevTaskContainer
@Override @Override
protected void write(ProducteevTaskContainer task) throws IOException { protected void write(ProducteevTaskContainer task) throws IOException {
if(task.task.isSaved()) { if(task.task.isSaved()) {
Task local = PluginServices.getTaskService().fetchById(task.task.getId(), Task.COMPLETION_DATE, Task.FLAGS); Task local = PluginServices.getTaskService().fetchById(task.task.getId(), Task.COMPLETION_DATE);
task.task.setFlag(Task.FLAGS, Task.FLAG_REPEAT_AFTER_COMPLETION, local.getFlag(Task.FLAGS, Task.FLAG_REPEAT_AFTER_COMPLETION));
if(task.task.isCompleted() && !local.isCompleted()) if(task.task.isCompleted() && !local.isCompleted())
StatisticsService.reportEvent(StatisticsConstants.PDV_TASK_COMPLETED); StatisticsService.reportEvent(StatisticsConstants.PDV_TASK_COMPLETED);
} else { // Set default reminders for remotely created tasks } else { // Set default reminders for remotely created tasks

@ -164,7 +164,7 @@ public class RepeatControlSet extends PopupControlSet {
@Override @Override
public void readFromTask(Task task) { public void readFromTask(Task task) {
super.readFromTask(task); super.readFromTask(task);
recurrence = model.getValue(Task.RECURRENCE); recurrence = model.sanitizedRecurrence();
if(recurrence == null) if(recurrence == null)
recurrence = ""; recurrence = "";
@ -251,7 +251,7 @@ public class RepeatControlSet extends PopupControlSet {
doRepeat = recurrence.length() > 0; doRepeat = recurrence.length() > 0;
// read flag // read flag
if(model.getFlag(Task.FLAGS, Task.FLAG_REPEAT_AFTER_COMPLETION)) if(model.repeatAfterCompletion())
type.setSelection(TYPE_COMPLETION_DATE); type.setSelection(TYPE_COMPLETION_DATE);
else else
type.setSelection(TYPE_DUE_DATE); type.setSelection(TYPE_DUE_DATE);
@ -367,21 +367,18 @@ public class RepeatControlSet extends PopupControlSet {
result = rrule.toIcal(); result = rrule.toIcal();
} }
if (type.getSelectedItemPosition() == TYPE_COMPLETION_DATE) {
result = result + ";FROM=COMPLETION"; //$NON-NLS-1$
}
if (!result.equals(task.getValue(Task.RECURRENCE))) if (!result.equals(task.getValue(Task.RECURRENCE)))
task.putTransitory(TaskService.TRANS_REPEAT_CHANGED, true); task.putTransitory(TaskService.TRANS_REPEAT_CHANGED, true);
task.setValue(Task.RECURRENCE, result); task.setValue(Task.RECURRENCE, result);
task.setValue(Task.REPEAT_UNTIL, repeatUntilValue); task.setValue(Task.REPEAT_UNTIL, repeatUntilValue);
switch(type.getSelectedItemPosition()) { if(task.repeatAfterCompletion())
case TYPE_DUE_DATE:
task.setFlag(Task.FLAGS, Task.FLAG_REPEAT_AFTER_COMPLETION, false);
break;
case TYPE_COMPLETION_DATE:
task.setFlag(Task.FLAGS, Task.FLAG_REPEAT_AFTER_COMPLETION, true);
}
if(task.getFlag(Task.FLAGS, Task.FLAG_REPEAT_AFTER_COMPLETION))
type.setSelection(1); type.setSelection(1);
return null; return null;
} }

@ -50,13 +50,13 @@ public class RepeatDetailExposer extends BroadcastReceiver {
} }
public String getTaskDetails(Context context, long id) { public String getTaskDetails(Context context, long id) {
Task task = PluginServices.getTaskService().fetchById(id, Task.FLAGS, Task.RECURRENCE); Task task = PluginServices.getTaskService().fetchById(id, Task.RECURRENCE);
if(task == null) if(task == null)
return null; return null;
Resources r = context.getResources(); Resources r = context.getResources();
String recurrence = task.getValue(Task.RECURRENCE); String recurrence = task.sanitizedRecurrence();
if(recurrence != null && recurrence.length() > 0) { if(recurrence != null && recurrence.length() > 0) {
RRule rrule; RRule rrule;
try { try {
@ -86,7 +86,7 @@ public class RepeatDetailExposer extends BroadcastReceiver {
} }
String detail; String detail;
if(task.getFlag(Task.FLAGS, Task.FLAG_REPEAT_AFTER_COMPLETION)) if(task.repeatAfterCompletion())
detail = context.getString(R.string.repeat_detail_completion, interval); detail = context.getString(R.string.repeat_detail_completion, interval);
else else
detail = context.getString(R.string.repeat_detail_duedate, interval); detail = context.getString(R.string.repeat_detail_duedate, interval);

@ -56,11 +56,13 @@ public class RepeatTaskCompleteListener extends BroadcastReceiver {
if(task == null || !task.isCompleted()) if(task == null || !task.isCompleted())
return; return;
String recurrence = task.getValue(Task.RECURRENCE); String recurrence = task.sanitizedRecurrence();
boolean repeatAfterCompletion = task.repeatAfterCompletion();
if(recurrence != null && recurrence.length() > 0) { if(recurrence != null && recurrence.length() > 0) {
long newDueDate; long newDueDate;
try { try {
newDueDate = computeNextDueDate(task, recurrence); newDueDate = computeNextDueDate(task, recurrence, repeatAfterCompletion);
if(newDueDate == -1) if(newDueDate == -1)
return; return;
} catch (ParseException e) { } catch (ParseException e) {
@ -114,8 +116,7 @@ public class RepeatTaskCompleteListener extends BroadcastReceiver {
} }
/** Compute next due date */ /** Compute next due date */
public static long computeNextDueDate(Task task, String recurrence) throws ParseException { public static long computeNextDueDate(Task task, String recurrence, boolean repeatAfterCompletion) throws ParseException {
boolean repeatAfterCompletion = task.getFlag(Task.FLAGS, Task.FLAG_REPEAT_AFTER_COMPLETION);
RRule rrule = initRRule(recurrence); RRule rrule = initRRule(recurrence);
// initialize startDateAsDV // initialize startDateAsDV

@ -1,5 +1,6 @@
package com.todoroo.astrid.tags; package com.todoroo.astrid.tags;
import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import com.todoroo.andlib.data.DatabaseDao; import com.todoroo.andlib.data.DatabaseDao;
@ -17,6 +18,7 @@ import com.todoroo.astrid.dao.UpdateDao;
import com.todoroo.astrid.dao.UserDao; import com.todoroo.astrid.dao.UserDao;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.RemoteModel; import com.todoroo.astrid.data.RemoteModel;
import com.todoroo.astrid.data.SyncFlags;
import com.todoroo.astrid.data.TagData; import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.Update; import com.todoroo.astrid.data.Update;
@ -76,11 +78,11 @@ public class AstridNewSyncMigrator {
// -------------- // --------------
// Then ensure that every remote model has a remote id, by generating one using the uuid generator for all those without one // Then ensure that every remote model has a remote id, by generating one using the uuid generator for all those without one
// -------------- // --------------
Query tagsWithoutUUIDQuery = Query.select(TagData.ID, TagData.REMOTE_ID).where(Criterion.all); Query tagsQuery = Query.select(TagData.ID, TagData.REMOTE_ID).where(Criterion.all);
assertUUIDsExist(tagsWithoutUUIDQuery, new TagData(), tagDataDao, null); assertUUIDsExist(tagsQuery, new TagData(), tagDataDao, null);
Query tasksWithoutUUIDQuery = Query.select(Task.ID, Task.REMOTE_ID, Task.FLAGS).where(Criterion.all); Query tasksQuery = Query.select(Task.ID, Task.REMOTE_ID, Task.RECURRENCE, Task.FLAGS).where(Criterion.all);
assertUUIDsExist(tasksWithoutUUIDQuery, new Task(), taskDao, new UUIDAssertionExtras<Task>() { assertUUIDsExist(tasksQuery, new Task(), taskDao, new UUIDAssertionExtras<Task>() {
@Override @Override
public void beforeSave(Task instance) { public void beforeSave(Task instance) {
if (instance.getFlag(Task.FLAGS, Task.FLAG_IS_READONLY)) { if (instance.getFlag(Task.FLAGS, Task.FLAG_IS_READONLY)) {
@ -92,6 +94,17 @@ public class AstridNewSyncMigrator {
instance.setFlag(Task.FLAGS, Task.FLAG_PUBLIC, false); instance.setFlag(Task.FLAGS, Task.FLAG_PUBLIC, false);
instance.setValue(Task.IS_PUBLIC, 1); instance.setValue(Task.IS_PUBLIC, 1);
} }
String recurrence = instance.getValue(Task.RECURRENCE);
if (!TextUtils.isEmpty(recurrence)) {
boolean repeatAfterCompletion = instance.getFlag(Task.FLAGS, Task.FLAG_REPEAT_AFTER_COMPLETION);
instance.setFlag(Task.FLAGS, Task.FLAG_REPEAT_AFTER_COMPLETION, false);
recurrence = recurrence.replaceAll("BYDAY=;", "");
if (repeatAfterCompletion)
recurrence = recurrence + ";FROM=COMPLETION";
instance.setValue(Task.RECURRENCE, recurrence);
}
} }
}); });
@ -147,7 +160,6 @@ public class AstridNewSyncMigrator {
} }
Preferences.setBoolean(PREF_SYNC_MIGRATION, true); Preferences.setBoolean(PREF_SYNC_MIGRATION, true);
} }
@ -170,6 +182,7 @@ public class AstridNewSyncMigrator {
if (extras != null) if (extras != null)
extras.beforeSave(instance); extras.beforeSave(instance);
instance.putTransitory(SyncFlags.ACTFM_SUPPRESS_OUTSTANDING_ENTRIES, true);
dao.saveExisting(instance); dao.saveExisting(instance);
} }
} finally { } finally {

@ -309,7 +309,7 @@ public class DateChangedAlerts {
@SuppressWarnings("nls") @SuppressWarnings("nls")
private static String getRecurrenceString(Context context, Task task) { private static String getRecurrenceString(Context context, Task task) {
try { try {
RRule rrule = new RRule(task.getValue(Task.RECURRENCE)); RRule rrule = new RRule(task.sanitizedRecurrence());
String[] dateAbbrev = context.getResources().getStringArray( String[] dateAbbrev = context.getResources().getStringArray(
R.array.repeat_interval); R.array.repeat_interval);

@ -123,8 +123,6 @@ abstract public class AbstractSyncRepeatTests<REMOTE_MODEL> extends DatabaseTest
t.setValue(Task.TITLE, title); t.setValue(Task.TITLE, title);
long dueDate = DateUtilities.now() + ((completeBefore ? -1 : 1) * DateUtilities.ONE_DAY * 3); long dueDate = DateUtilities.now() + ((completeBefore ? -1 : 1) * DateUtilities.ONE_DAY * 3);
dueDate = Task.createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME, (dueDate / 1000L) * 1000L); // Strip milliseconds dueDate = Task.createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME, (dueDate / 1000L) * 1000L); // Strip milliseconds
if (fromCompletion)
t.setFlag(Task.FLAGS, Task.FLAG_REPEAT_AFTER_COMPLETION, true);
t.setValue(Task.DUE_DATE, dueDate); t.setValue(Task.DUE_DATE, dueDate);
@ -134,6 +132,11 @@ abstract public class AbstractSyncRepeatTests<REMOTE_MODEL> extends DatabaseTest
int interval = frequency.equals(Frequency.MINUTELY) ? 100: 2; int interval = frequency.equals(Frequency.MINUTELY) ? 100: 2;
rrule.setInterval(interval); rrule.setInterval(interval);
} }
String result = rrule.toIcal();
if (fromCompletion)
result = result + ";FROM=COMPLETION";
t.setValue(Task.RECURRENCE, rrule.toIcal()); t.setValue(Task.RECURRENCE, rrule.toIcal());
taskDao.save(t); taskDao.save(t);

@ -140,8 +140,6 @@ public class RepeatTestsActFmSync extends AbstractSyncRepeatTests<Task> {
t.setValue(Task.TITLE, title); t.setValue(Task.TITLE, title);
long dueDate = DateUtilities.now() + ((completeBefore ? -1 : 1) * DateUtilities.ONE_DAY * 3); long dueDate = DateUtilities.now() + ((completeBefore ? -1 : 1) * DateUtilities.ONE_DAY * 3);
dueDate = Task.createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME, (dueDate / 1000L) * 1000L); // Strip milliseconds dueDate = Task.createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME, (dueDate / 1000L) * 1000L); // Strip milliseconds
if (fromCompletion)
t.setFlag(Task.FLAGS, Task.FLAG_REPEAT_AFTER_COMPLETION, true);
t.setValue(Task.DUE_DATE, dueDate); t.setValue(Task.DUE_DATE, dueDate);
@ -151,6 +149,11 @@ public class RepeatTestsActFmSync extends AbstractSyncRepeatTests<Task> {
int interval = 5; int interval = 5;
rrule.setInterval(interval); rrule.setInterval(interval);
} }
String result = rrule.toIcal();
if (fromCompletion)
result = result + ";FROM=COMPLETION";
t.setValue(Task.RECURRENCE, rrule.toIcal()); t.setValue(Task.RECURRENCE, rrule.toIcal());
taskDao.save(t); taskDao.save(t);

@ -42,7 +42,6 @@ public class AdvancedRepeatTests extends TodorooTestCase {
// --- date with time tests // --- date with time tests
public void testDueDateSpecificTime() throws ParseException { public void testDueDateSpecificTime() throws ParseException {
task.setFlag(Task.FLAGS, Task.FLAG_REPEAT_AFTER_COMPLETION, false);
buildRRule(1, Frequency.DAILY); buildRRule(1, Frequency.DAILY);
// test specific day & time // test specific day & time
@ -50,12 +49,11 @@ public class AdvancedRepeatTests extends TodorooTestCase {
task.setValue(Task.DUE_DATE, dayWithTime); task.setValue(Task.DUE_DATE, dayWithTime);
long nextDayWithTime = dayWithTime + DateUtilities.ONE_DAY; long nextDayWithTime = dayWithTime + DateUtilities.ONE_DAY;
nextDueDate = RepeatTaskCompleteListener.computeNextDueDate(task, rrule.toIcal()); nextDueDate = RepeatTaskCompleteListener.computeNextDueDate(task, rrule.toIcal(), false);
assertDateTimeEquals(nextDayWithTime, nextDueDate); assertDateTimeEquals(nextDayWithTime, nextDueDate);
} }
public void testCompletionDateSpecificTime() throws ParseException { public void testCompletionDateSpecificTime() throws ParseException {
task.setFlag(Task.FLAGS, Task.FLAG_REPEAT_AFTER_COMPLETION, true);
buildRRule(1, Frequency.DAILY); buildRRule(1, Frequency.DAILY);
// test specific day & time // test specific day & time
@ -70,7 +68,7 @@ public class AdvancedRepeatTests extends TodorooTestCase {
nextDayWithTimeLong += DateUtilities.ONE_DAY; nextDayWithTimeLong += DateUtilities.ONE_DAY;
nextDayWithTimeLong = nextDayWithTimeLong / 1000L * 1000; nextDayWithTimeLong = nextDayWithTimeLong / 1000L * 1000;
nextDueDate = RepeatTaskCompleteListener.computeNextDueDate(task, rrule.toIcal()); nextDueDate = RepeatTaskCompleteListener.computeNextDueDate(task, rrule.toIcal(), true);
assertDateTimeEquals(nextDayWithTimeLong, nextDueDate); assertDateTimeEquals(nextDayWithTimeLong, nextDueDate);
} }
@ -78,89 +76,85 @@ public class AdvancedRepeatTests extends TodorooTestCase {
/** test multiple days per week - DUE DATE */ /** test multiple days per week - DUE DATE */
public void testDueDateInPastSingleWeekMultiDay() throws Exception { public void testDueDateInPastSingleWeekMultiDay() throws Exception {
task.setFlag(Task.FLAGS, Task.FLAG_REPEAT_AFTER_COMPLETION, false);
buildRRule(1, Frequency.WEEKLY, Weekday.MO, Weekday.WE, Weekday.FR); buildRRule(1, Frequency.WEEKLY, Weekday.MO, Weekday.WE, Weekday.FR);
setTaskDueDate(THIS, Calendar.SUNDAY); setTaskDueDate(THIS, Calendar.SUNDAY);
computeNextDueDate(); computeNextDueDate(false);
assertDueDate(nextDueDate, THIS, Calendar.MONDAY); assertDueDate(nextDueDate, THIS, Calendar.MONDAY);
setTaskDueDate(THIS, Calendar.MONDAY); setTaskDueDate(THIS, Calendar.MONDAY);
computeNextDueDate(); computeNextDueDate(false);
assertDueDate(nextDueDate, THIS, Calendar.WEDNESDAY); assertDueDate(nextDueDate, THIS, Calendar.WEDNESDAY);
setTaskDueDate(THIS, Calendar.FRIDAY); setTaskDueDate(THIS, Calendar.FRIDAY);
computeNextDueDate(); computeNextDueDate(false);
assertDueDate(nextDueDate, THIS, Calendar.MONDAY); assertDueDate(nextDueDate, THIS, Calendar.MONDAY);
} }
/** test single day repeats - DUE DATE */ /** test single day repeats - DUE DATE */
public void testDueDateSingleDay() throws Exception { public void testDueDateSingleDay() throws Exception {
task.setFlag(Task.FLAGS, Task.FLAG_REPEAT_AFTER_COMPLETION, false);
buildRRule(1, Frequency.WEEKLY, Weekday.MO); buildRRule(1, Frequency.WEEKLY, Weekday.MO);
setTaskDueDate(PREV_PREV, Calendar.MONDAY); setTaskDueDate(PREV_PREV, Calendar.MONDAY);
computeNextDueDate(); computeNextDueDate(false);
assertDueDate(nextDueDate, NEXT, Calendar.MONDAY); assertDueDate(nextDueDate, NEXT, Calendar.MONDAY);
setTaskDueDate(PREV_PREV, Calendar.FRIDAY); setTaskDueDate(PREV_PREV, Calendar.FRIDAY);
computeNextDueDate(); computeNextDueDate(false);
assertDueDate(nextDueDate, THIS, Calendar.MONDAY); assertDueDate(nextDueDate, THIS, Calendar.MONDAY);
setTaskDueDate(PREV, Calendar.MONDAY); setTaskDueDate(PREV, Calendar.MONDAY);
computeNextDueDate(); computeNextDueDate(false);
assertDueDate(nextDueDate, NEXT, Calendar.MONDAY); assertDueDate(nextDueDate, NEXT, Calendar.MONDAY);
setTaskDueDate(PREV, Calendar.FRIDAY); setTaskDueDate(PREV, Calendar.FRIDAY);
computeNextDueDate(); computeNextDueDate(false);
assertDueDate(nextDueDate, THIS, Calendar.MONDAY); assertDueDate(nextDueDate, THIS, Calendar.MONDAY);
setTaskDueDate(THIS, Calendar.SUNDAY); setTaskDueDate(THIS, Calendar.SUNDAY);
computeNextDueDate(); computeNextDueDate(false);
assertDueDate(nextDueDate, THIS, Calendar.MONDAY); assertDueDate(nextDueDate, THIS, Calendar.MONDAY);
setTaskDueDate(THIS, Calendar.MONDAY); setTaskDueDate(THIS, Calendar.MONDAY);
computeNextDueDate(); computeNextDueDate(false);
assertDueDate(nextDueDate, NEXT, Calendar.MONDAY); assertDueDate(nextDueDate, NEXT, Calendar.MONDAY);
} }
/** test multiple days per week - DUE DATE */ /** test multiple days per week - DUE DATE */
public void testDueDateSingleWeekMultiDay() throws Exception { public void testDueDateSingleWeekMultiDay() throws Exception {
task.setFlag(Task.FLAGS, Task.FLAG_REPEAT_AFTER_COMPLETION, false);
buildRRule(1, Frequency.WEEKLY, Weekday.MO, Weekday.WE, Weekday.FR); buildRRule(1, Frequency.WEEKLY, Weekday.MO, Weekday.WE, Weekday.FR);
setTaskDueDate(THIS, Calendar.SUNDAY); setTaskDueDate(THIS, Calendar.SUNDAY);
computeNextDueDate(); computeNextDueDate(false);
assertDueDate(nextDueDate, THIS, Calendar.MONDAY); assertDueDate(nextDueDate, THIS, Calendar.MONDAY);
setTaskDueDate(THIS, Calendar.MONDAY); setTaskDueDate(THIS, Calendar.MONDAY);
computeNextDueDate(); computeNextDueDate(false);
assertDueDate(nextDueDate, THIS, Calendar.WEDNESDAY); assertDueDate(nextDueDate, THIS, Calendar.WEDNESDAY);
setTaskDueDate(THIS, Calendar.FRIDAY); setTaskDueDate(THIS, Calendar.FRIDAY);
computeNextDueDate(); computeNextDueDate(false);
assertDueDate(nextDueDate, THIS, Calendar.MONDAY); assertDueDate(nextDueDate, THIS, Calendar.MONDAY);
} }
/** test multiple days per week, multiple intervals - DUE DATE */ /** test multiple days per week, multiple intervals - DUE DATE */
public void testDueDateMultiWeekMultiDay() throws Exception { public void testDueDateMultiWeekMultiDay() throws Exception {
task.setFlag(Task.FLAGS, Task.FLAG_REPEAT_AFTER_COMPLETION, false);
buildRRule(2, Frequency.WEEKLY, Weekday.MO, Weekday.WE, Weekday.FR); buildRRule(2, Frequency.WEEKLY, Weekday.MO, Weekday.WE, Weekday.FR);
setTaskDueDate(THIS, Calendar.SUNDAY); setTaskDueDate(THIS, Calendar.SUNDAY);
computeNextDueDate(); computeNextDueDate(false);
assertDueDate(nextDueDate, NEXT, Calendar.MONDAY); assertDueDate(nextDueDate, NEXT, Calendar.MONDAY);
setTaskDueDate(THIS, Calendar.MONDAY); setTaskDueDate(THIS, Calendar.MONDAY);
computeNextDueDate(); computeNextDueDate(false);
assertDueDate(nextDueDate, THIS, Calendar.WEDNESDAY); assertDueDate(nextDueDate, THIS, Calendar.WEDNESDAY);
setTaskDueDate(THIS, Calendar.FRIDAY); setTaskDueDate(THIS, Calendar.FRIDAY);
computeNextDueDate(); computeNextDueDate(false);
assertDueDate(nextDueDate, NEXT, Calendar.MONDAY); assertDueDate(nextDueDate, NEXT, Calendar.MONDAY);
} }
@ -168,11 +162,10 @@ public class AdvancedRepeatTests extends TodorooTestCase {
/** test multiple days per week - COMPLETE DATE */ /** test multiple days per week - COMPLETE DATE */
public void testCompleteDateSingleWeek() throws Exception { public void testCompleteDateSingleWeek() throws Exception {
task.setFlag(Task.FLAGS, Task.FLAG_REPEAT_AFTER_COMPLETION, true);
for(Weekday wday : Weekday.values()) { for(Weekday wday : Weekday.values()) {
buildRRule(1, Frequency.WEEKLY, wday); buildRRule(1, Frequency.WEEKLY, wday);
computeNextDueDate(); computeNextDueDate(true);
long expected = getDate(DateUtilities.now() + DateUtilities.ONE_DAY, THIS, wday.javaDayNum); long expected = getDate(DateUtilities.now() + DateUtilities.ONE_DAY, THIS, wday.javaDayNum);
nextDueDate = Task.createDueDate(Task.URGENCY_SPECIFIC_DAY, nextDueDate); nextDueDate = Task.createDueDate(Task.URGENCY_SPECIFIC_DAY, nextDueDate);
assertDateEquals(nextDueDate, expected); assertDateEquals(nextDueDate, expected);
@ -186,7 +179,7 @@ public class AdvancedRepeatTests extends TodorooTestCase {
buildRRule(1, Frequency.WEEKLY, wday1, wday2); buildRRule(1, Frequency.WEEKLY, wday1, wday2);
long nextOne = getDate(DateUtilities.now() + DateUtilities.ONE_DAY, THIS, wday1.javaDayNum); long nextOne = getDate(DateUtilities.now() + DateUtilities.ONE_DAY, THIS, wday1.javaDayNum);
long nextTwo = getDate(DateUtilities.now() + DateUtilities.ONE_DAY, THIS, wday2.javaDayNum); long nextTwo = getDate(DateUtilities.now() + DateUtilities.ONE_DAY, THIS, wday2.javaDayNum);
computeNextDueDate(); computeNextDueDate(true);
nextDueDate = Task.createDueDate(Task.URGENCY_SPECIFIC_DAY, nextDueDate); nextDueDate = Task.createDueDate(Task.URGENCY_SPECIFIC_DAY, nextDueDate);
assertDateEquals(nextDueDate, Math.min(nextOne, nextTwo)); assertDateEquals(nextDueDate, Math.min(nextOne, nextTwo));
} }
@ -195,11 +188,10 @@ public class AdvancedRepeatTests extends TodorooTestCase {
/** test multiple days per week, multiple intervals - COMPLETE DATE */ /** test multiple days per week, multiple intervals - COMPLETE DATE */
public void testCompleteDateMultiWeek() throws Exception { public void testCompleteDateMultiWeek() throws Exception {
task.setFlag(Task.FLAGS, Task.FLAG_REPEAT_AFTER_COMPLETION, true);
for(Weekday wday : Weekday.values()) { for(Weekday wday : Weekday.values()) {
buildRRule(2, Frequency.WEEKLY, wday); buildRRule(2, Frequency.WEEKLY, wday);
computeNextDueDate(); computeNextDueDate(true);
long expected = getDate(DateUtilities.now() + DateUtilities.ONE_DAY, NEXT, wday.javaDayNum); long expected = getDate(DateUtilities.now() + DateUtilities.ONE_DAY, NEXT, wday.javaDayNum);
nextDueDate = Task.createDueDate(Task.URGENCY_SPECIFIC_DAY, nextDueDate); nextDueDate = Task.createDueDate(Task.URGENCY_SPECIFIC_DAY, nextDueDate);
assertDateEquals(nextDueDate, expected); assertDateEquals(nextDueDate, expected);
@ -213,7 +205,7 @@ public class AdvancedRepeatTests extends TodorooTestCase {
buildRRule(2, Frequency.WEEKLY, wday1, wday2); buildRRule(2, Frequency.WEEKLY, wday1, wday2);
long nextOne = getDate(DateUtilities.now() + DateUtilities.ONE_DAY, NEXT, wday1.javaDayNum); long nextOne = getDate(DateUtilities.now() + DateUtilities.ONE_DAY, NEXT, wday1.javaDayNum);
long nextTwo = getDate(DateUtilities.now() + DateUtilities.ONE_DAY, NEXT, wday2.javaDayNum); long nextTwo = getDate(DateUtilities.now() + DateUtilities.ONE_DAY, NEXT, wday2.javaDayNum);
computeNextDueDate(); computeNextDueDate(true);
nextDueDate = Task.createDueDate(Task.URGENCY_SPECIFIC_DAY, nextDueDate); nextDueDate = Task.createDueDate(Task.URGENCY_SPECIFIC_DAY, nextDueDate);
assertDateEquals(nextDueDate, Math.min(nextOne, nextTwo)); assertDateEquals(nextDueDate, Math.min(nextOne, nextTwo));
} }
@ -222,8 +214,8 @@ public class AdvancedRepeatTests extends TodorooTestCase {
// --- helpers // --- helpers
private void computeNextDueDate() throws ParseException{ private void computeNextDueDate(boolean fromComplete) throws ParseException{
nextDueDate = RepeatTaskCompleteListener.computeNextDueDate(task, rrule.toIcal()); nextDueDate = RepeatTaskCompleteListener.computeNextDueDate(task, rrule.toIcal(), fromComplete);
} }
private void buildRRule(int interval, Frequency freq, Weekday... weekdays) { private void buildRRule(int interval, Frequency freq, Weekday... weekdays) {

@ -133,8 +133,6 @@ public class NewRepeatTests<REMOTE_MODEL> extends DatabaseTestCase {
adjustDate.setSeconds(1); adjustDate.setSeconds(1);
dueDate = adjustDate.getTime(); dueDate = adjustDate.getTime();
dueDate = (dueDate / 1000L) * 1000L; // Strip milliseconds dueDate = (dueDate / 1000L) * 1000L; // Strip milliseconds
if (fromCompletion)
t.setFlag(Task.FLAGS, Task.FLAG_REPEAT_AFTER_COMPLETION, true);
t.setValue(Task.DUE_DATE, dueDate); t.setValue(Task.DUE_DATE, dueDate);
@ -144,6 +142,10 @@ public class NewRepeatTests<REMOTE_MODEL> extends DatabaseTestCase {
int interval = 2; int interval = 2;
rrule.setInterval(interval); rrule.setInterval(interval);
} }
String result = rrule.toIcal();
if (fromCompletion)
result = result + ";FROM=COMPLETION";
t.setValue(Task.RECURRENCE, rrule.toIcal()); t.setValue(Task.RECURRENCE, rrule.toIcal());
taskDao.save(t); taskDao.save(t);

@ -36,7 +36,6 @@ public class RepeatAfterCompleteTests extends TodorooTestCase {
public void testSubDailyFreqs() throws ParseException { public void testSubDailyFreqs() throws ParseException {
task.setValue(Task.DUE_DATE, DateUtilities.now() - DateUtilities.ONE_WEEK); task.setValue(Task.DUE_DATE, DateUtilities.now() - DateUtilities.ONE_WEEK);
task.setFlag(Task.FLAGS, Task.FLAG_REPEAT_AFTER_COMPLETION, true);
for(Frequency freq : Frequency.values()) { for(Frequency freq : Frequency.values()) {
long interval = -1; long interval = -1;
@ -50,10 +49,10 @@ public class RepeatAfterCompleteTests extends TodorooTestCase {
} }
buildRRule(1, freq); buildRRule(1, freq);
nextDueDate = RepeatTaskCompleteListener.computeNextDueDate(task, rrule.toIcal()); nextDueDate = RepeatTaskCompleteListener.computeNextDueDate(task, rrule.toIcal(), true);
buildRRule(6, freq); buildRRule(6, freq);
nextDueDate = RepeatTaskCompleteListener.computeNextDueDate(task, rrule.toIcal()); nextDueDate = RepeatTaskCompleteListener.computeNextDueDate(task, rrule.toIcal(), true);
assertDateTimeEquals(freq.toString() + "x6", DateUtilities.now() + 6 * interval, nextDueDate); assertDateTimeEquals(freq.toString() + "x6", DateUtilities.now() + 6 * interval, nextDueDate);
task.setValue(Task.DUE_DATE, nextDueDate); task.setValue(Task.DUE_DATE, nextDueDate);
assertTrue(task.hasDueTime()); assertTrue(task.hasDueTime());
@ -64,7 +63,6 @@ public class RepeatAfterCompleteTests extends TodorooTestCase {
task.setValue(Task.DUE_DATE, task.setValue(Task.DUE_DATE,
Task.createDueDate(Task.URGENCY_SPECIFIC_DAY, Task.createDueDate(Task.URGENCY_SPECIFIC_DAY,
DateUtilities.now() - DateUtilities.ONE_WEEK)); DateUtilities.now() - DateUtilities.ONE_WEEK));
task.setFlag(Task.FLAGS, Task.FLAG_REPEAT_AFTER_COMPLETION, true);
for(int interval = 1; interval < 7; interval++) { for(int interval = 1; interval < 7; interval++) {
for(Frequency freq : Frequency.values()) { for(Frequency freq : Frequency.values()) {
@ -83,7 +81,7 @@ public class RepeatAfterCompleteTests extends TodorooTestCase {
} }
buildRRule(interval, freq); buildRRule(interval, freq);
nextDueDate = RepeatTaskCompleteListener.computeNextDueDate(task, rrule.toIcal()); nextDueDate = RepeatTaskCompleteListener.computeNextDueDate(task, rrule.toIcal(), true);
assertDateEquals(freq.toString() + "x" + interval, next, nextDueDate); assertDateEquals(freq.toString() + "x" + interval, next, nextDueDate);
task.setValue(Task.DUE_DATE, nextDueDate); task.setValue(Task.DUE_DATE, nextDueDate);
assertFalse(task.hasDueTime()); assertFalse(task.hasDueTime());
@ -94,8 +92,7 @@ public class RepeatAfterCompleteTests extends TodorooTestCase {
public void testTimeZoneLate() throws ParseException { public void testTimeZoneLate() throws ParseException {
TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles")); TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));
task.setValue(Task.DUE_DATE, DateUtilities.now() + DateUtilities.ONE_WEEK); task.setValue(Task.DUE_DATE, DateUtilities.now() + DateUtilities.ONE_WEEK);
task.setFlag(Task.FLAGS, Task.FLAG_REPEAT_AFTER_COMPLETION, true); nextDueDate = RepeatTaskCompleteListener.computeNextDueDate(task, rrule.toIcal(), true);
nextDueDate = RepeatTaskCompleteListener.computeNextDueDate(task, rrule.toIcal());
long expected = Task.createDueDate(Task.URGENCY_TOMORROW, 0); long expected = Task.createDueDate(Task.URGENCY_TOMORROW, 0);
assertDateEquals("tomorrow", expected, nextDueDate); assertDateEquals("tomorrow", expected, nextDueDate);

Loading…
Cancel
Save