diff --git a/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java b/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java index 9fd36a001..f5afb1784 100755 --- a/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java +++ b/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java @@ -6,6 +6,9 @@ package com.todoroo.astrid.activity; +import static com.google.common.base.Predicates.not; +import static com.google.common.collect.Iterables.filter; +import static com.todoroo.andlib.utility.AndroidUtilities.assertNotMainThread; import static org.tasks.date.DateTimeUtils.newDateTime; import static org.tasks.files.FileHelper.copyToUri; @@ -36,6 +39,9 @@ import com.todoroo.astrid.repeats.RepeatControlSet; import com.todoroo.astrid.service.TaskDeleter; import com.todoroo.astrid.timers.TimerPlugin; import com.todoroo.astrid.ui.EditTitleControlSet; +import io.reactivex.Completable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; import java.util.List; import javax.inject.Inject; import org.tasks.R; @@ -56,7 +62,7 @@ import org.tasks.ui.TaskEditControlFragment; public final class TaskEditFragment extends InjectingFragment implements Toolbar.OnMenuItemClickListener { - public static final String TAG_TASKEDIT_FRAGMENT = "taskedit_fragment"; + static final String TAG_TASKEDIT_FRAGMENT = "taskedit_fragment"; private static final String EXTRA_TASK = "extra_task"; @Inject TaskDao taskDao; @Inject UserActivityDao userActivityDao; @@ -82,7 +88,7 @@ public final class TaskEditFragment extends InjectingFragment Task model = null; private TaskEditFragmentCallbackHandler callback; - public static TaskEditFragment newTaskEditFragment(Task task) { + static TaskEditFragment newTaskEditFragment(Task task) { TaskEditFragment taskEditFragment = new TaskEditFragment(); Bundle arguments = new Bundle(); arguments.putParcelable(EXTRA_TASK, task); @@ -165,16 +171,15 @@ public final class TaskEditFragment extends InjectingFragment public boolean onMenuItemClick(MenuItem item) { AndroidUtilities.hideKeyboard(getActivity()); - switch (item.getItemId()) { - case R.id.menu_delete: - deleteButtonClick(); - return true; + if (item.getItemId() == R.id.menu_delete) { + deleteButtonClick(); + return true; } return false; } - public Task stopTimer() { + Task stopTimer() { timerPlugin.stopTimer(model); String elapsedTime = DateUtils.formatElapsedTime(model.getElapsedSeconds()); addComment( @@ -188,7 +193,7 @@ public final class TaskEditFragment extends InjectingFragment return model; } - public Task startTimer() { + Task startTimer() { timerPlugin.startTimer(model); addComment( String.format( @@ -205,19 +210,34 @@ public final class TaskEditFragment extends InjectingFragment taskEditControlSetFragmentManager.getFragmentsInPersistOrder(getChildFragmentManager()); if (hasChanges(fragments)) { boolean isNewTask = model.isNew(); - if (isNewTask) { - taskDao.createNew(model); - } - for (TaskEditControlFragment fragment : fragments) { + TaskListFragment taskListFragment = ((MainActivity) getActivity()).getTaskListFragment(); + for (TaskEditControlFragment fragment : + filter(fragments, not(TaskEditControlFragment::requiresId))) { fragment.apply(model); } - taskDao.save(model, null); - if (isNewTask) { - ((MainActivity) getActivity()).getTaskListFragment().onTaskCreated(model.getUuid()); - } else { - ((MainActivity) getActivity()).getTaskListFragment().loadTaskListContent(); - } + Completable.fromAction( + () -> { + assertNotMainThread(); + + if (isNewTask) { + taskDao.createNew(model); + } + + for (TaskEditControlFragment fragment : + filter(fragments, TaskEditControlFragment::requiresId)) { + fragment.apply(model); + } + + taskDao.save(model, null); + + if (isNewTask) { + taskListFragment.onTaskCreated(model.getUuid()); + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(); callback.removeTaskEditFragment(); } else { discard(); @@ -266,7 +286,7 @@ public final class TaskEditFragment extends InjectingFragment * ====================================================================== */ - public void discardButtonClick() { + void discardButtonClick() { if (hasChanges( taskEditControlSetFragmentManager.getFragmentsInPersistOrder(getChildFragmentManager()))) { dialogBuilder diff --git a/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java b/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java index 3e2926f2a..983f6595c 100644 --- a/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java +++ b/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java @@ -518,19 +518,19 @@ public final class TaskListFragment extends InjectingFragment return getArguments().getParcelable(EXTRA_FILTER); } - public void onTaskCreated(List tasks) { + private void onTaskCreated(List tasks) { for (Task task : tasks) { onTaskCreated(task.getUuid()); } syncAdapters.sync(); + loadTaskListContent(); } void onTaskCreated(String uuid) { taskAdapter.onTaskCreated(uuid); - loadTaskListContent(); } - public void onTaskDelete(Task task) { + private void onTaskDelete(Task task) { MainActivity activity = (MainActivity) getActivity(); if (activity != null) { TaskEditFragment tef = activity.getTaskEditFragment(); diff --git a/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.java b/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.java index afebcfeec..782bae742 100644 --- a/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.java +++ b/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.java @@ -193,6 +193,11 @@ public class ReminderControlSet extends TaskEditControlFragment { || !newHashSet(currentAlarms()).equals(alarms); } + @Override + public boolean requiresId() { + return true; + } + @Override public void apply(Task task) { task.setReminderFlags(getFlags()); diff --git a/app/src/main/java/org/tasks/ui/LocationControlSet.java b/app/src/main/java/org/tasks/ui/LocationControlSet.java index 2b797dbe6..c8cc08909 100644 --- a/app/src/main/java/org/tasks/ui/LocationControlSet.java +++ b/app/src/main/java/org/tasks/ui/LocationControlSet.java @@ -250,6 +250,11 @@ public class LocationControlSet extends TaskEditControlFragment { || original.getRadius() != location.getRadius(); } + @Override + public boolean requiresId() { + return true; + } + @Override public void apply(Task task) { if (original != null) { diff --git a/app/src/main/java/org/tasks/ui/RemoteListFragment.java b/app/src/main/java/org/tasks/ui/RemoteListFragment.java index 5819255d5..caca18627 100644 --- a/app/src/main/java/org/tasks/ui/RemoteListFragment.java +++ b/app/src/main/java/org/tasks/ui/RemoteListFragment.java @@ -156,6 +156,11 @@ public class RemoteListFragment extends TaskEditControlFragment { .show(getFragmentManager(), FRAG_TAG_GOOGLE_TASK_LIST_SELECTION); } + @Override + public boolean requiresId() { + return true; + } + @Override public void apply(Task task) { taskMover.move(task.getId(), selectedList); diff --git a/app/src/main/java/org/tasks/ui/SubtaskControlSet.java b/app/src/main/java/org/tasks/ui/SubtaskControlSet.java index e8af66fcc..6363922ff 100644 --- a/app/src/main/java/org/tasks/ui/SubtaskControlSet.java +++ b/app/src/main/java/org/tasks/ui/SubtaskControlSet.java @@ -158,6 +158,11 @@ public class SubtaskControlSet extends TaskEditControlFragment implements Callba return TAG; } + @Override + public boolean requiresId() { + return true; + } + @Override public void apply(Task task) { for (Task subtask: getNewSubtasks()) { diff --git a/app/src/main/java/org/tasks/ui/TaskEditControlFragment.java b/app/src/main/java/org/tasks/ui/TaskEditControlFragment.java index 6300680d8..bbbbe8f32 100644 --- a/app/src/main/java/org/tasks/ui/TaskEditControlFragment.java +++ b/app/src/main/java/org/tasks/ui/TaskEditControlFragment.java @@ -48,6 +48,10 @@ public abstract class TaskEditControlFragment extends InjectingFragment { public abstract int controlId(); + public boolean requiresId() { + return false; + } + public abstract void apply(Task task); public boolean hasChanges(Task original) {