Alarm values auto-adjust when task repeats

pull/14/head
Tim Su 14 years ago
parent 017dc5c0c3
commit d54567c035

@ -165,6 +165,15 @@
</intent-filter>
</activity>
<!-- alarms -->
<receiver android:name="com.todoroo.astrid.alarms.AlarmTaskRepeatListener">
<intent-filter>
<action android:name="com.todoroo.astrid.TASK_REPEATED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<!-- tags -->
<receiver android:name="com.todoroo.astrid.tags.TagsPlugin">
<intent-filter>

@ -52,6 +52,16 @@ public class AstridApiConstants {
*/
public static final String EXTRAS_EXTENDED = "extended";
/**
* Extras name for old task due date
*/
public static final String EXTRAS_OLD_DUE_DATE= "oldDueDate";
/**
* Extras name for new task due date
*/
public static final String EXTRAS_NEW_DUE_DATE = "newDueDate";
// --- Add-ons API
/**
@ -177,10 +187,12 @@ public class AstridApiConstants {
public static final String BROADCAST_EVENT_TASK_COMPLETED = PACKAGE + ".TASK_COMPLETED";
/**
* Action name for broadcast intent notifying that task was created
* Action name for broadcast intent notifying that task was created from repeating template
* @extra EXTRAS_TASK_ID id of the task
* @extra EXTRAS_OLD_DUE_DATE task old due date (could be 0)
* @extra EXTRAS_NEW_DUE_DATE task new due date (will not be 0)
*/
public static final String BROADCAST_EVENT_TASK_CREATED = PACKAGE + ".TASK_CREATED";
public static final String BROADCAST_EVENT_TASK_REPEATED = PACKAGE + ".TASK_REPEATED";
// --- SQL Constants

@ -64,6 +64,10 @@ public class AlarmService {
*/
public void synchronizeAlarms(long taskId, LinkedHashSet<Long> alarms) {
MetadataService service = PluginServices.getMetadataService();
if(alarmsIdentical(taskId, alarms))
return;
service.deleteWhere(Criterion.and(MetadataCriteria.byTask(taskId),
MetadataCriteria.withKey(Alarm.METADATA_KEY)));
@ -79,6 +83,23 @@ public class AlarmService {
}
}
private boolean alarmsIdentical(long taskId, LinkedHashSet<Long> alarms) {
TodorooCursor<Metadata> cursor = getAlarms(taskId);
try {
if(cursor.getCount() != alarms.size())
return false;
for(Long alarm : alarms) {
cursor.moveToNext();
if(alarm != cursor.get(Alarm.TIME))
return false;
}
} finally {
cursor.close();
}
return true;
}
// --- alarm scheduling
/**

@ -0,0 +1,47 @@
package com.todoroo.astrid.alarms;
import java.util.LinkedHashSet;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.model.Metadata;
public class AlarmTaskRepeatListener extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
long taskId = intent.getLongExtra(AstridApiConstants.EXTRAS_TASK_ID, -1);
if(taskId == -1)
return;
long oldDueDate = intent.getLongExtra(AstridApiConstants.EXTRAS_OLD_DUE_DATE, 0);
if(oldDueDate == 0)
oldDueDate = DateUtilities.now();
long newDueDate = intent.getLongExtra(AstridApiConstants.EXTRAS_NEW_DUE_DATE, -1);
if(newDueDate <= 0 || newDueDate <= oldDueDate)
return;
TodorooCursor<Metadata> cursor = AlarmService.getInstance().getAlarms(taskId);
try {
if(cursor.getCount() == 0)
return;
Metadata metadata = new Metadata();
LinkedHashSet<Long> alarms = new LinkedHashSet<Long>(cursor.getCount());
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
metadata.readFromCursor(cursor);
alarms.add(metadata.getValue(Alarm.TIME) + (newDueDate - oldDueDate));
}
AlarmService.getInstance().synchronizeAlarms(taskId, alarms);
} finally {
cursor.close();
}
}
}

@ -18,31 +18,20 @@ import com.google.ical.values.DateValueImpl;
import com.google.ical.values.Frequency;
import com.google.ical.values.RRule;
import com.google.ical.values.WeekdayNum;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.service.ExceptionService;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.core.PluginServices;
import com.todoroo.astrid.model.Task;
import com.todoroo.astrid.service.TaskService;
public class RepeatTaskCompleteListener extends BroadcastReceiver {
@Autowired
private TaskService taskService;
@Autowired
private ExceptionService exceptionService;
@Override
public void onReceive(Context context, Intent intent) {
long taskId = intent.getLongExtra(AstridApiConstants.EXTRAS_TASK_ID, -1);
if(taskId == -1)
return;
DependencyInjectionService.getInstance().inject(this);
Task task = taskService.fetchById(taskId, Task.ID, Task.RECURRENCE,
Task task = PluginServices.getTaskService().fetchById(taskId, Task.ID, Task.RECURRENCE,
Task.DUE_DATE, Task.FLAGS, Task.HIDE_UNTIL);
if(task == null)
return;
@ -55,7 +44,7 @@ public class RepeatTaskCompleteListener extends BroadcastReceiver {
if(newDueDate == -1)
return;
} catch (ParseException e) {
exceptionService.reportError("repeat-parse", e); //$NON-NLS-1$
PluginServices.getExceptionService().reportError("repeat-parse", e); //$NON-NLS-1$
return;
}
@ -65,17 +54,24 @@ public class RepeatTaskCompleteListener extends BroadcastReceiver {
}
// clone to create new task
Task clone = taskService.clone(task);
Task clone = PluginServices.getTaskService().clone(task);
clone.setValue(Task.DUE_DATE, newDueDate);
clone.setValue(Task.HIDE_UNTIL, hideUntil);
clone.setValue(Task.COMPLETION_DATE, 0L);
clone.setValue(Task.TIMER_START, 0L);
clone.setValue(Task.ELAPSED_SECONDS, 0);
taskService.save(clone, false);
PluginServices.getTaskService().save(clone, false);
// clear recurrence from completed task so it can be re-completed
task.setValue(Task.RECURRENCE, ""); //$NON-NLS-1$
taskService.save(task, false);
PluginServices.getTaskService().save(task, false);
// send a broadcast
Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_EVENT_TASK_REPEATED);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, clone.getId());
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_OLD_DUE_DATE, task.getValue(Task.DUE_DATE));
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_NEW_DUE_DATE, newDueDate);
context.sendOrderedBroadcast(broadcastIntent, null);
}
}

Loading…
Cancel
Save