Move refresh into TaskDao

pull/467/head
Alex Baker 9 years ago
parent 7348ea881a
commit c6a3ff3604

@ -21,20 +21,18 @@ import android.widget.LinearLayout;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.dao.UserActivityDao; import com.todoroo.astrid.dao.UserActivityDao;
import com.todoroo.astrid.data.SyncFlags;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.UserActivity; import com.todoroo.astrid.data.UserActivity;
import com.todoroo.astrid.files.FilesControlSet; import com.todoroo.astrid.files.FilesControlSet;
import com.todoroo.astrid.gtasks.GtasksList; import com.todoroo.astrid.gtasks.GtasksList;
import com.todoroo.astrid.notes.CommentsController; import com.todoroo.astrid.notes.CommentsController;
import com.todoroo.astrid.service.TaskDeleter; import com.todoroo.astrid.service.TaskDeleter;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.timers.TimerPlugin; import com.todoroo.astrid.timers.TimerPlugin;
import com.todoroo.astrid.ui.EditTitleControlSet; import com.todoroo.astrid.ui.EditTitleControlSet;
import com.todoroo.astrid.utility.Flags; import com.todoroo.astrid.utility.Flags;
import org.tasks.Broadcaster;
import org.tasks.R; import org.tasks.R;
import org.tasks.analytics.Tracker; import org.tasks.analytics.Tracker;
import org.tasks.dialogs.DialogBuilder; import org.tasks.dialogs.DialogBuilder;
@ -76,7 +74,7 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar
private static final String EXTRA_TASK = "extra_task"; private static final String EXTRA_TASK = "extra_task";
private static final String EXTRA_IS_NEW_TASK = "extra_is_new_task"; private static final String EXTRA_IS_NEW_TASK = "extra_is_new_task";
@Inject TaskService taskService; @Inject TaskDao taskDao;
@Inject UserActivityDao userActivityDao; @Inject UserActivityDao userActivityDao;
@Inject TaskDeleter taskDeleter; @Inject TaskDeleter taskDeleter;
@Inject NotificationManager notificationManager; @Inject NotificationManager notificationManager;
@ -86,7 +84,6 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar
@Inject CommentsController commentsController; @Inject CommentsController commentsController;
@Inject Preferences preferences; @Inject Preferences preferences;
@Inject Tracker tracker; @Inject Tracker tracker;
@Inject Broadcaster broadcaster;
@Inject TimerPlugin timerPlugin; @Inject TimerPlugin timerPlugin;
@BindView(R.id.toolbar) Toolbar toolbar; @BindView(R.id.toolbar) Toolbar toolbar;
@ -210,10 +207,7 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar
for (TaskEditControlFragment fragment : fragments) { for (TaskEditControlFragment fragment : fragments) {
fragment.apply(model); fragment.apply(model);
} }
boolean databaseChanged = taskService.save(model); taskDao.save(model);
if (!databaseChanged && model.checkTransitory(SyncFlags.FORCE_SYNC)) {
broadcaster.taskUpdated(model, null);
}
boolean tagsChanged = Flags.check(Flags.TAGS_CHANGED); boolean tagsChanged = Flags.check(Flags.TAGS_CHANGED);

@ -20,6 +20,7 @@ import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.PermaSql; import com.todoroo.astrid.api.PermaSql;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.data.RemoteModel; import com.todoroo.astrid.data.RemoteModel;
import com.todoroo.astrid.data.SyncFlags;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.TaskApiDao; import com.todoroo.astrid.data.TaskApiDao;
import com.todoroo.astrid.reminders.ReminderService; import com.todoroo.astrid.reminders.ReminderService;
@ -30,6 +31,7 @@ import org.tasks.injection.ApplicationScope;
import org.tasks.location.GeofenceService; import org.tasks.location.GeofenceService;
import org.tasks.notifications.NotificationManager; import org.tasks.notifications.NotificationManager;
import org.tasks.preferences.Preferences; import org.tasks.preferences.Preferences;
import org.tasks.scheduling.RefreshScheduler;
import java.util.List; import java.util.List;
@ -49,6 +51,7 @@ public class TaskDao {
public static final String TRANS_SUPPRESS_REFRESH = "suppress-refresh"; public static final String TRANS_SUPPRESS_REFRESH = "suppress-refresh";
private final RemoteModelDao<Task> dao; private final RemoteModelDao<Task> dao;
private final RefreshScheduler refreshScheduler;
private final MetadataDao metadataDao; private final MetadataDao metadataDao;
private final Broadcaster broadcaster; private final Broadcaster broadcaster;
@ -60,7 +63,7 @@ public class TaskDao {
@Inject @Inject
public TaskDao(Database database, MetadataDao metadataDao, final Broadcaster broadcaster, public TaskDao(Database database, MetadataDao metadataDao, final Broadcaster broadcaster,
ReminderService reminderService, NotificationManager notificationManager, ReminderService reminderService, NotificationManager notificationManager,
Preferences preferences, GeofenceService geofenceService) { Preferences preferences, GeofenceService geofenceService, RefreshScheduler refreshScheduler) {
this.geofenceService = geofenceService; this.geofenceService = geofenceService;
this.preferences = preferences; this.preferences = preferences;
this.metadataDao = metadataDao; this.metadataDao = metadataDao;
@ -68,6 +71,7 @@ public class TaskDao {
this.reminderService = reminderService; this.reminderService = reminderService;
this.notificationManager = notificationManager; this.notificationManager = notificationManager;
dao = new RemoteModelDao<>(database, Task.class); dao = new RemoteModelDao<>(database, Task.class);
this.refreshScheduler = refreshScheduler;
} }
public TodorooCursor<Task> query(Query query) { public TodorooCursor<Task> query(Query query) {
@ -206,7 +210,16 @@ public class TaskDao {
* exist. Returns true on success. * exist. Returns true on success.
* *
*/ */
public boolean save(Task task) { public void save(Task task) {
ContentValues modifiedValues = createOrUpdate(task);
if (modifiedValues != null) {
afterSave(task, modifiedValues);
} else if (task.checkTransitory(SyncFlags.FORCE_SYNC)) {
broadcaster.taskUpdated(task, null);
}
}
private ContentValues createOrUpdate(Task task) {
if (task.getId() == Task.NO_ID) { if (task.getId() == Task.NO_ID) {
try { try {
return createNew(task); return createNew(task);
@ -219,7 +232,7 @@ public class TaskDao {
} }
} }
private boolean handleSQLiteConstraintException(Task task) { private ContentValues handleSQLiteConstraintException(Task task) {
TodorooCursor<Task> cursor = dao.query(Query.select(Task.ID).where( TodorooCursor<Task> cursor = dao.query(Query.select(Task.ID).where(
Task.UUID.eq(task.getUUID()))); Task.UUID.eq(task.getUUID())));
if (cursor.getCount() > 0) { if (cursor.getCount() > 0) {
@ -227,10 +240,10 @@ public class TaskDao {
task.setId(cursor.get(Task.ID)); task.setId(cursor.get(Task.ID));
return saveExisting(task); return saveExisting(task);
} }
return false; return null;
} }
public boolean createNew(Task item) { public ContentValues createNew(Task item) {
if(!item.containsValue(Task.CREATION_DATE)) { if(!item.containsValue(Task.CREATION_DATE)) {
item.setCreationDate(DateUtilities.now()); item.setCreationDate(DateUtilities.now());
} }
@ -252,10 +265,9 @@ public class TaskDao {
ContentValues values = item.getSetValues(); ContentValues values = item.getSetValues();
if(dao.createNew(item)) { if(dao.createNew(item)) {
afterSave(item, values); return values;
return true;
} }
return false; return null;
} }
private static void createDefaultHideUntil(Preferences preferences, Task item) { private static void createDefaultHideUntil(Preferences preferences, Task item) {
@ -280,10 +292,10 @@ public class TaskDao {
} }
} }
public boolean saveExisting(Task item) { public ContentValues saveExisting(Task item) {
ContentValues values = item.getSetValues(); ContentValues values = item.getSetValues();
if(values == null || values.size() == 0) { if(values == null || values.size() == 0) {
return false; return null;
} }
if(!TaskApiDao.insignificantChange(values)) { if(!TaskApiDao.insignificantChange(values)) {
if(!values.containsKey(Task.MODIFICATION_DATE.name)) { if(!values.containsKey(Task.MODIFICATION_DATE.name)) {
@ -291,10 +303,9 @@ public class TaskDao {
} }
} }
if(dao.saveExisting(item)) { if(dao.saveExisting(item)) {
afterSave(item, values); return values;
return true;
} }
return false; return null;
} }
private static final Property<?>[] SQL_CONSTRAINT_MERGE_PROPERTIES = new Property<?>[] { private static final Property<?>[] SQL_CONSTRAINT_MERGE_PROPERTIES = new Property<?>[] {
@ -373,10 +384,6 @@ public class TaskDao {
* Astrid. Order matters here! * Astrid. Order matters here!
*/ */
private void afterSave(Task task, ContentValues values) { private void afterSave(Task task, ContentValues values) {
if(values == null) {
return;
}
task.markSaved(); task.markSaved();
boolean completionDateModified = values.containsKey(Task.COMPLETION_DATE.name); boolean completionDateModified = values.containsKey(Task.COMPLETION_DATE.name);
boolean deletionDateModified = values.containsKey(Task.DELETION_DATE.name); boolean deletionDateModified = values.containsKey(Task.DELETION_DATE.name);
@ -416,6 +423,7 @@ public class TaskDao {
} }
broadcaster.taskUpdated(task, values); broadcaster.taskUpdated(task, values);
refreshScheduler.scheduleRefresh(task);
broadcastRefresh(task); broadcastRefresh(task);
} }

@ -15,9 +15,7 @@ import com.todoroo.astrid.api.PermaSql;
import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import org.tasks.Broadcaster;
import org.tasks.injection.ApplicationScope; import org.tasks.injection.ApplicationScope;
import org.tasks.scheduling.RefreshScheduler;
import javax.inject.Inject; import javax.inject.Inject;
@ -32,14 +30,10 @@ import javax.inject.Inject;
public class TaskService { public class TaskService {
private final TaskDao taskDao; private final TaskDao taskDao;
private final Broadcaster broadcaster;
private final RefreshScheduler refreshScheduler;
@Inject @Inject
public TaskService(TaskDao taskDao, Broadcaster broadcaster, RefreshScheduler refreshScheduler) { public TaskService(TaskDao taskDao) {
this.taskDao = taskDao; this.taskDao = taskDao;
this.broadcaster = broadcaster;
this.refreshScheduler = refreshScheduler;
} }
// --- service layer // --- service layer
@ -67,11 +61,8 @@ public class TaskService {
/** /**
* Create or save the given action item * Create or save the given action item
*/ */
public boolean save(Task item) { public void save(Task item) {
boolean databaseChanged = taskDao.save(item); taskDao.save(item);
broadcaster.refresh();
refreshScheduler.scheduleRefresh(item);
return databaseChanged;
} }
/** /**

@ -4,8 +4,6 @@ import android.app.PendingIntent;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import org.tasks.injection.ForApplication; import org.tasks.injection.ForApplication;
@ -23,26 +21,15 @@ import static org.tasks.time.DateTimeUtils.printTimestamp;
public class RefreshScheduler { public class RefreshScheduler {
private final TaskDao taskDao;
private final Context context; private final Context context;
private final AlarmManager alarmManager; private final AlarmManager alarmManager;
@Inject @Inject
public RefreshScheduler(TaskDao taskDao, @ForApplication Context context, AlarmManager alarmManager) { public RefreshScheduler(@ForApplication Context context, AlarmManager alarmManager) {
this.taskDao = taskDao;
this.context = context; this.context = context;
this.alarmManager = alarmManager; this.alarmManager = alarmManager;
} }
public void scheduleApplicationRefreshes() {
long now = currentTimeMillis();
long midnight = nextMidnight(now);
Criterion criterion = Criterion.or(
Criterion.and(Task.HIDE_UNTIL.gt(now), Task.HIDE_UNTIL.lt(midnight)),
Criterion.and(Task.DUE_DATE.gt(now), Task.DUE_DATE.lt(midnight)));
taskDao.selectActive(criterion, this::scheduleRefresh);
}
public void scheduleRefresh(Task task) { public void scheduleRefresh(Task task) {
if (task.isCompleted()) { if (task.isCompleted()) {
scheduleRefresh(task.getCompletionDate() + ONE_MINUTE); scheduleRefresh(task.getCompletionDate() + ONE_MINUTE);

@ -1,14 +1,22 @@
package org.tasks.scheduling; package org.tasks.scheduling;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Task;
import org.tasks.Broadcaster; import org.tasks.Broadcaster;
import org.tasks.injection.IntentServiceComponent; import org.tasks.injection.IntentServiceComponent;
import javax.inject.Inject; import javax.inject.Inject;
import static org.tasks.time.DateTimeUtils.currentTimeMillis;
import static org.tasks.time.DateTimeUtils.nextMidnight;
public class RefreshSchedulerIntentService extends MidnightIntentService { public class RefreshSchedulerIntentService extends MidnightIntentService {
@Inject Broadcaster broadcaster; @Inject Broadcaster broadcaster;
@Inject RefreshScheduler refreshScheduler; @Inject RefreshScheduler refreshScheduler;
@Inject TaskDao taskDao;
public RefreshSchedulerIntentService() { public RefreshSchedulerIntentService() {
super(RefreshSchedulerIntentService.class.getSimpleName()); super(RefreshSchedulerIntentService.class.getSimpleName());
@ -16,10 +24,19 @@ public class RefreshSchedulerIntentService extends MidnightIntentService {
@Override @Override
void run() { void run() {
refreshScheduler.scheduleApplicationRefreshes(); scheduleApplicationRefreshes();
broadcaster.refresh(); broadcaster.refresh();
} }
public void scheduleApplicationRefreshes() {
long now = currentTimeMillis();
long midnight = nextMidnight(now);
Criterion criterion = Criterion.or(
Criterion.and(Task.HIDE_UNTIL.gt(now), Task.HIDE_UNTIL.lt(midnight)),
Criterion.and(Task.DUE_DATE.gt(now), Task.DUE_DATE.lt(midnight)));
taskDao.selectActive(criterion, refreshScheduler::scheduleRefresh);
}
@Override @Override
protected void inject(IntentServiceComponent component) { protected void inject(IntentServiceComponent component) {
component.inject(this); component.inject(this);

Loading…
Cancel
Save