Update widget when tasks unhidden or overdue

Closes #65
Closes #63
pull/120/head
Alex Baker 12 years ago
parent e4f5e62dde
commit 2e31283cbc

@ -27,7 +27,7 @@ public class TaskApiDao {
/** @return tasks that are not hidden at current time */ /** @return tasks that are not hidden at current time */
public static Criterion isVisible() { public static Criterion isVisible() {
return Task.HIDE_UNTIL.lt(Functions.now()); return Task.HIDE_UNTIL.lte(Functions.now());
} }
} }

@ -201,6 +201,8 @@
<receiver android:name="com.todoroo.astrid.reminders.Notifications" /> <receiver android:name="com.todoroo.astrid.reminders.Notifications" />
<receiver android:name="org.tasks.scheduling.RefreshScheduler" />
<receiver android:name="com.todoroo.astrid.reminders.Notifications$ShowNotificationReceiver"> <receiver android:name="com.todoroo.astrid.reminders.Notifications$ShowNotificationReceiver">
<intent-filter> <intent-filter>
<action android:name="org.tasks.IN_APP_NOTIFY" /> <action android:name="org.tasks.IN_APP_NOTIFY" />

@ -10,10 +10,14 @@ import android.content.Intent;
import android.os.IBinder; import android.os.IBinder;
import android.util.Log; import android.util.Log;
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.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.alarms.AlarmService; import com.todoroo.astrid.alarms.AlarmService;
import org.tasks.scheduling.RefreshScheduler;
/** /**
* Schedules reminders in the background to prevent ANR's * Schedules reminders in the background to prevent ANR's
* *
@ -22,6 +26,13 @@ import com.todoroo.astrid.alarms.AlarmService;
*/ */
public class ReminderSchedulingService extends Service { public class ReminderSchedulingService extends Service {
@Autowired
private RefreshScheduler refreshScheduler;
public ReminderSchedulingService() {
DependencyInjectionService.getInstance().inject(this);
}
/** Receive the alarm - start the synchronize service! */ /** Receive the alarm - start the synchronize service! */
@Override @Override
public int onStartCommand(Intent intent, int flags, int startId) { public int onStartCommand(Intent intent, int flags, int startId) {
@ -32,7 +43,6 @@ public class ReminderSchedulingService extends Service {
public void run() { public void run() {
delaySchedulingToPreventANRs(); delaySchedulingToPreventANRs();
scheduleReminders(); scheduleReminders();
stopSelf(); stopSelf();
} }
}).start(); }).start();
@ -44,10 +54,13 @@ public class ReminderSchedulingService extends Service {
try { try {
ReminderService.getInstance().scheduleAllAlarms(); ReminderService.getInstance().scheduleAllAlarms();
AlarmService.getInstance().scheduleAllAlarms(); AlarmService.getInstance().scheduleAllAlarms();
refreshScheduler.scheduleAllAlarms();
} catch (Exception e) { } catch (Exception e) {
Log.e("reminder-scheduling", "reminder-startup", e); Log.e("reminder-scheduling", "reminder-startup", e);
} }
} }
private void delaySchedulingToPreventANRs() { private void delaySchedulingToPreventANRs() {
AndroidUtilities.sleepDeep(5000L); AndroidUtilities.sleepDeep(5000L);
} }
@ -56,5 +69,4 @@ public class ReminderSchedulingService extends Service {
public IBinder onBind(Intent intent) { public IBinder onBind(Intent intent) {
return null; return null;
} }
} }

@ -28,6 +28,7 @@ import com.todoroo.astrid.utility.Constants;
import org.tasks.Broadcaster; import org.tasks.Broadcaster;
import org.tasks.filters.FilterCounter; import org.tasks.filters.FilterCounter;
import org.tasks.scheduling.RefreshScheduler;
/** /**
* Astrid application dependency injector loads classes in Astrid with the * Astrid application dependency injector loads classes in Astrid with the
@ -88,6 +89,7 @@ public class AstridDependencyInjector extends AbstractDependencyInjector {
injectables.put("broadcaster", Broadcaster.class); injectables.put("broadcaster", Broadcaster.class);
injectables.put("filterCounter", FilterCounter.class); injectables.put("filterCounter", FilterCounter.class);
injectables.put("refreshScheduler", RefreshScheduler.class);
// these make reference to fields defined above // these make reference to fields defined above
injectables.put("errorReporters", new ErrorReporter[] { injectables.put("errorReporters", new ErrorReporter[] {

@ -41,6 +41,7 @@ import com.todoroo.astrid.utility.TitleParser;
import org.tasks.Broadcaster; import org.tasks.Broadcaster;
import org.tasks.filters.FilterCounter; import org.tasks.filters.FilterCounter;
import org.tasks.scheduling.RefreshScheduler;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -82,6 +83,9 @@ public class TaskService {
@Autowired @Autowired
private FilterCounter filterCounter; private FilterCounter filterCounter;
@Autowired
private RefreshScheduler refreshScheduler;
public TaskService() { public TaskService() {
DependencyInjectionService.getInstance().inject(this); DependencyInjectionService.getInstance().inject(this);
} }
@ -121,6 +125,7 @@ public class TaskService {
public void save(Task item) { public void save(Task item) {
taskDao.save(item); taskDao.save(item);
broadcastFilterListUpdated(); broadcastFilterListUpdated();
refreshScheduler.scheduleRefresh(item);
} }
private void saveWithoutPublishingFilterUpdate(Task item) { private void saveWithoutPublishingFilterUpdate(Task item) {

@ -10,7 +10,11 @@ public class Broadcaster {
public void sendOrderedBroadcast(Intent intent) { public void sendOrderedBroadcast(Intent intent) {
Context context = ContextManager.getContext(); Context context = ContextManager.getContext();
if (context != null) { if (context != null) {
context.sendOrderedBroadcast(intent, null); sendOrderedBroadcast(context, intent);
}
} }
public void sendOrderedBroadcast(Context context, Intent intent) {
context.sendOrderedBroadcast(intent, null);
} }
} }

@ -0,0 +1,91 @@
package org.tasks.scheduling;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Query;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Task;
import org.joda.time.DateTime;
import org.tasks.Broadcaster;
import static android.app.PendingIntent.FLAG_UPDATE_CURRENT;
import static org.tasks.date.DateTimeUtils.currentTimeMillis;
public class RefreshScheduler extends BroadcastReceiver {
private static final String TAG = "RefreshScheduler";
@Autowired
private TaskDao taskDao;
@Autowired
private Broadcaster broadcaster;
private static final Property<?>[] REFRESH_PROPERTIES = new Property<?>[]{
Task.DUE_DATE,
Task.HIDE_UNTIL
};
public RefreshScheduler() {
DependencyInjectionService.getInstance().inject(this);
}
@Override
public void onReceive(Context context, Intent intent) {
broadcaster.sendOrderedBroadcast(context, new Intent(AstridApiConstants.BROADCAST_EVENT_TASK_LIST_UPDATED));
broadcaster.sendOrderedBroadcast(context, new Intent(AstridApiConstants.BROADCAST_EVENT_FILTER_LIST_UPDATED));
}
public void scheduleAllAlarms() {
TodorooCursor<Task> cursor = getTasks();
try {
Task task = new Task();
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
task.readFromCursor(cursor);
scheduleRefresh(task);
}
} finally {
cursor.close();
}
}
public void scheduleRefresh(Task task) {
if (task.containsValue(Task.DUE_DATE)) {
scheduleRefresh(task.getDueDate());
}
if (task.containsValue(Task.HIDE_UNTIL)) {
scheduleRefresh(task.getHideUntil());
}
}
private void scheduleRefresh(Long dueDate) {
dueDate += 1000; // this is ghetto
Context context = ContextManager.getContext();
Intent intent = new Intent(context, RefreshScheduler.class);
intent.setAction(Long.toString(dueDate));
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, FLAG_UPDATE_CURRENT);
am.set(AlarmManager.RTC, dueDate, pendingIntent);
}
private TodorooCursor<Task> getTasks() {
long now = currentTimeMillis();
return taskDao.query(Query.select(REFRESH_PROPERTIES).where(Criterion.and(
TaskDao.TaskCriteria.isActive(),
TaskDao.TaskCriteria.ownedByMe(),
Criterion.or(Task.HIDE_UNTIL.gt(now), Task.DUE_DATE.gt(now)))));
}
}
Loading…
Cancel
Save