Fix crash when clearing 1000+ completed tasks

gtask_related_email
Alex Baker 6 years ago
parent 4fa9ae48a9
commit 1c99a94906

@ -5,6 +5,7 @@ import static com.todoroo.astrid.dao.TaskDao.TaskCriteria.includeHidden;
import static com.todoroo.astrid.dao.TaskDao.TaskCriteria.isVisible;
import static com.todoroo.astrid.dao.TaskDao.TaskCriteria.notCompleted;
import static org.tasks.db.DbUtils.batch;
import static org.tasks.db.DbUtils.collect;
import com.google.common.collect.ImmutableList;
import com.todoroo.astrid.api.Filter;
@ -68,13 +69,13 @@ public class TaskDeleter {
public List<Task> markDeleted(List<Long> taskIds) {
Set<Long> ids = new HashSet<>(taskIds);
batch(taskIds, i -> ids.addAll(googleTaskDao.getChildren(i)));
batch(taskIds, i -> ids.addAll(caldavDao.getChildren(i)));
ids.addAll(collect(taskIds, googleTaskDao::getChildren));
ids.addAll(collect(taskIds, caldavDao::getChildren));
deletionDao.markDeleted(ids);
workManager.cleanup(taskIds);
workManager.cleanup(ids);
workManager.sync(false);
localBroadcastManager.broadcastRefresh();
return taskDao.fetch(taskIds);
return collect(ids, taskDao::fetch);
}
public void delete(Task task) {

@ -1,10 +1,12 @@
package org.tasks.db;
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Lists.partition;
import com.google.common.base.Function;
import com.google.common.collect.Iterables;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.tasks.Callback;
@ -12,9 +14,9 @@ public class DbUtils {
private static final int MAX_SQLITE_ARGS = 990;
public static <F, T> List<T> collect(List<F> items, Function<List<F>, List<T>> func) {
public static <F, T> List<T> collect(Collection<F> items, Function<List<F>, List<T>> func) {
if (items.size() < MAX_SQLITE_ARGS) {
return func.apply(items);
return func.apply(items instanceof List ? (List<F>) items : newArrayList(items));
}
List<T> result = new ArrayList<>();
batch(items, b -> result.addAll(func.apply(b)));

@ -87,7 +87,7 @@ public class WorkManager {
.build());
}
public void cleanup(List<Long> ids) {
public void cleanup(Iterable<Long> ids) {
batch(
ids,
MAX_CLEANUP_LENGTH,

Loading…
Cancel
Save