Update widget when tasks unhidden or overdue

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

@ -27,7 +27,7 @@ public class TaskApiDao {
/** @return tasks that are not hidden at current time */
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="org.tasks.scheduling.RefreshScheduler" />
<receiver android:name="com.todoroo.astrid.reminders.Notifications$ShowNotificationReceiver">
<intent-filter>
<action android:name="org.tasks.IN_APP_NOTIFY" />

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

@ -28,6 +28,7 @@ import com.todoroo.astrid.utility.Constants;
import org.tasks.Broadcaster;
import org.tasks.filters.FilterCounter;
import org.tasks.scheduling.RefreshScheduler;
/**
* 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("filterCounter", FilterCounter.class);
injectables.put("refreshScheduler", RefreshScheduler.class);
// these make reference to fields defined above
injectables.put("errorReporters", new ErrorReporter[] {

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

@ -9,8 +9,12 @@ public class Broadcaster {
public void sendOrderedBroadcast(Intent intent) {
Context context = ContextManager.getContext();
if(context != null) {
context.sendOrderedBroadcast(intent, null);
if (context != 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