From 1c99a94906ffcf7a42180238f38e810f5e33fc4c Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Tue, 10 Dec 2019 15:23:14 -0600 Subject: [PATCH] Fix crash when clearing 1000+ completed tasks --- .../java/com/todoroo/astrid/service/TaskDeleter.java | 9 +++++---- app/src/main/java/org/tasks/db/DbUtils.java | 6 ++++-- app/src/main/java/org/tasks/jobs/WorkManager.java | 2 +- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/todoroo/astrid/service/TaskDeleter.java b/app/src/main/java/com/todoroo/astrid/service/TaskDeleter.java index c234f6370..ca9ccb8b0 100644 --- a/app/src/main/java/com/todoroo/astrid/service/TaskDeleter.java +++ b/app/src/main/java/com/todoroo/astrid/service/TaskDeleter.java @@ -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 markDeleted(List taskIds) { Set 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) { diff --git a/app/src/main/java/org/tasks/db/DbUtils.java b/app/src/main/java/org/tasks/db/DbUtils.java index e4f05f017..26df62ab0 100644 --- a/app/src/main/java/org/tasks/db/DbUtils.java +++ b/app/src/main/java/org/tasks/db/DbUtils.java @@ -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 List collect(List items, Function, List> func) { + public static List collect(Collection items, Function, List> func) { if (items.size() < MAX_SQLITE_ARGS) { - return func.apply(items); + return func.apply(items instanceof List ? (List) items : newArrayList(items)); } List result = new ArrayList<>(); batch(items, b -> result.addAll(func.apply(b))); diff --git a/app/src/main/java/org/tasks/jobs/WorkManager.java b/app/src/main/java/org/tasks/jobs/WorkManager.java index 601f2833f..113dd2c9b 100644 --- a/app/src/main/java/org/tasks/jobs/WorkManager.java +++ b/app/src/main/java/org/tasks/jobs/WorkManager.java @@ -87,7 +87,7 @@ public class WorkManager { .build()); } - public void cleanup(List ids) { + public void cleanup(Iterable ids) { batch( ids, MAX_CLEANUP_LENGTH,