Move refresh into TaskDao

pull/467/head
Alex Baker 8 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.DateUtilities;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.dao.UserActivityDao;
import com.todoroo.astrid.data.SyncFlags;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.UserActivity;
import com.todoroo.astrid.files.FilesControlSet;
import com.todoroo.astrid.gtasks.GtasksList;
import com.todoroo.astrid.notes.CommentsController;
import com.todoroo.astrid.service.TaskDeleter;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.timers.TimerPlugin;
import com.todoroo.astrid.ui.EditTitleControlSet;
import com.todoroo.astrid.utility.Flags;
import org.tasks.Broadcaster;
import org.tasks.R;
import org.tasks.analytics.Tracker;
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_IS_NEW_TASK = "extra_is_new_task";
@Inject TaskService taskService;
@Inject TaskDao taskDao;
@Inject UserActivityDao userActivityDao;
@Inject TaskDeleter taskDeleter;
@Inject NotificationManager notificationManager;
@ -86,7 +84,6 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar
@Inject CommentsController commentsController;
@Inject Preferences preferences;
@Inject Tracker tracker;
@Inject Broadcaster broadcaster;
@Inject TimerPlugin timerPlugin;
@BindView(R.id.toolbar) Toolbar toolbar;
@ -210,10 +207,7 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar
for (TaskEditControlFragment fragment : fragments) {
fragment.apply(model);
}
boolean databaseChanged = taskService.save(model);
if (!databaseChanged && model.checkTransitory(SyncFlags.FORCE_SYNC)) {
broadcaster.taskUpdated(model, null);
}
taskDao.save(model);
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.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.data.RemoteModel;
import com.todoroo.astrid.data.SyncFlags;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.TaskApiDao;
import com.todoroo.astrid.reminders.ReminderService;
@ -30,6 +31,7 @@ import org.tasks.injection.ApplicationScope;
import org.tasks.location.GeofenceService;
import org.tasks.notifications.NotificationManager;
import org.tasks.preferences.Preferences;
import org.tasks.scheduling.RefreshScheduler;
import java.util.List;
@ -49,6 +51,7 @@ public class TaskDao {
public static final String TRANS_SUPPRESS_REFRESH = "suppress-refresh";
private final RemoteModelDao<Task> dao;
private final RefreshScheduler refreshScheduler;
private final MetadataDao metadataDao;
private final Broadcaster broadcaster;
@ -60,7 +63,7 @@ public class TaskDao {
@Inject
public TaskDao(Database database, MetadataDao metadataDao, final Broadcaster broadcaster,
ReminderService reminderService, NotificationManager notificationManager,
Preferences preferences, GeofenceService geofenceService) {
Preferences preferences, GeofenceService geofenceService, RefreshScheduler refreshScheduler) {
this.geofenceService = geofenceService;
this.preferences = preferences;
this.metadataDao = metadataDao;
@ -68,6 +71,7 @@ public class TaskDao {
this.reminderService = reminderService;
this.notificationManager = notificationManager;
dao = new RemoteModelDao<>(database, Task.class);
this.refreshScheduler = refreshScheduler;
}
public TodorooCursor<Task> query(Query query) {
@ -206,7 +210,16 @@ public class TaskDao {
* 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) {
try {
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(
Task.UUID.eq(task.getUUID())));
if (cursor.getCount() > 0) {
@ -227,10 +240,10 @@ public class TaskDao {
task.setId(cursor.get(Task.ID));
return saveExisting(task);
}
return false;
return null;
}
public boolean createNew(Task item) {
public ContentValues createNew(Task item) {
if(!item.containsValue(Task.CREATION_DATE)) {
item.setCreationDate(DateUtilities.now());
}
@ -252,10 +265,9 @@ public class TaskDao {
ContentValues values = item.getSetValues();
if(dao.createNew(item)) {
afterSave(item, values);
return true;
return values;
}
return false;
return null;
}
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();
if(values == null || values.size() == 0) {
return false;
return null;
}
if(!TaskApiDao.insignificantChange(values)) {
if(!values.containsKey(Task.MODIFICATION_DATE.name)) {
@ -291,10 +303,9 @@ public class TaskDao {
}
}
if(dao.saveExisting(item)) {
afterSave(item, values);
return true;
return values;
}
return false;
return null;
}
private static final Property<?>[] SQL_CONSTRAINT_MERGE_PROPERTIES = new Property<?>[] {
@ -373,10 +384,6 @@ public class TaskDao {
* Astrid. Order matters here!
*/
private void afterSave(Task task, ContentValues values) {
if(values == null) {
return;
}
task.markSaved();
boolean completionDateModified = values.containsKey(Task.COMPLETION_DATE.name);
boolean deletionDateModified = values.containsKey(Task.DELETION_DATE.name);
@ -416,6 +423,7 @@ public class TaskDao {
}
broadcaster.taskUpdated(task, values);
refreshScheduler.scheduleRefresh(task);
broadcastRefresh(task);
}

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

@ -4,8 +4,6 @@ import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Task;
import org.tasks.injection.ForApplication;
@ -23,26 +21,15 @@ import static org.tasks.time.DateTimeUtils.printTimestamp;
public class RefreshScheduler {
private final TaskDao taskDao;
private final Context context;
private final AlarmManager alarmManager;
@Inject
public RefreshScheduler(TaskDao taskDao, @ForApplication Context context, AlarmManager alarmManager) {
this.taskDao = taskDao;
public RefreshScheduler(@ForApplication Context context, AlarmManager alarmManager) {
this.context = context;
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) {
if (task.isCompleted()) {
scheduleRefresh(task.getCompletionDate() + ONE_MINUTE);

@ -1,14 +1,22 @@
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.injection.IntentServiceComponent;
import javax.inject.Inject;
import static org.tasks.time.DateTimeUtils.currentTimeMillis;
import static org.tasks.time.DateTimeUtils.nextMidnight;
public class RefreshSchedulerIntentService extends MidnightIntentService {
@Inject Broadcaster broadcaster;
@Inject RefreshScheduler refreshScheduler;
@Inject TaskDao taskDao;
public RefreshSchedulerIntentService() {
super(RefreshSchedulerIntentService.class.getSimpleName());
@ -16,10 +24,19 @@ public class RefreshSchedulerIntentService extends MidnightIntentService {
@Override
void run() {
refreshScheduler.scheduleApplicationRefreshes();
scheduleApplicationRefreshes();
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
protected void inject(IntentServiceComponent component) {
component.inject(this);

Loading…
Cancel
Save