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 2b640a396..82ab1d625 100755 --- a/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java +++ b/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java @@ -24,7 +24,6 @@ import butterknife.BindView; import butterknife.ButterKnife; import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.DateUtilities; -import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.files.FilesControlSet; @@ -49,7 +48,6 @@ import org.tasks.injection.InjectingFragment; import org.tasks.notifications.NotificationManager; import org.tasks.preferences.Preferences; import org.tasks.ui.MenuColorizer; -import org.tasks.ui.RemoteListFragment; import org.tasks.ui.TaskEditControlFragment; public final class TaskEditFragment extends InjectingFragment @@ -231,10 +229,6 @@ public final class TaskEditFragment extends InjectingFragment return getFragment(EditTitleControlSet.TAG); } - private RemoteListFragment getRemoteListFragment() { - return getFragment(RemoteListFragment.TAG); - } - private RepeatControlSet getRepeatControlSet() { return getFragment(RepeatControlSet.TAG); } @@ -316,10 +310,6 @@ public final class TaskEditFragment extends InjectingFragment getEditTitleControlSet().repeatChanged(repeat); } - public void onRemoteListChanged(Filter list) { - getRemoteListFragment().setList(list); - } - public void onDueDateChanged(long dueDate) { RepeatControlSet repeatControlSet = getRepeatControlSet(); if (repeatControlSet != null) { diff --git a/app/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java b/app/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java index 25a208655..f3201b304 100644 --- a/app/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java +++ b/app/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java @@ -81,8 +81,7 @@ public class TaskListActivity extends InjectingAppCompatActivity DeadlineControlSet.DueDateChangeListener, TaskEditFragment.TaskEditFragmentCallbackHandler, CommentBarFragment.CommentBarFragmentCallback, - SortDialog.SortDialogCallback, - RemoteListSelectionHandler { + SortDialog.SortDialogCallback { /** For indicating the new list screen should be launched at fragment setup time */ public static final String TOKEN_CREATE_NEW_LIST_NAME = "newListName"; // $NON-NLS-1$ @@ -496,11 +495,6 @@ public class TaskListActivity extends InjectingAppCompatActivity onFilterItemClicked(filter); } - @Override - public void selectedList(Filter list) { - getTaskEditFragment().onRemoteListChanged(list); - } - @Override public void onSupportActionModeStarted(@NonNull ActionMode mode) { super.onSupportActionModeStarted(mode); 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 ce03dc725..803580857 100644 --- a/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java +++ b/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java @@ -5,6 +5,7 @@ */ package com.todoroo.astrid.activity; +import static android.app.Activity.RESULT_OK; import static android.support.v4.content.ContextCompat.getColor; import android.app.Activity; @@ -45,12 +46,14 @@ import com.todoroo.astrid.gtasks.GtasksSubtaskListFragment; import com.todoroo.astrid.service.TaskCreator; import com.todoroo.astrid.service.TaskDeleter; import com.todoroo.astrid.service.TaskDuplicator; +import com.todoroo.astrid.service.TaskMover; import com.todoroo.astrid.timers.TimerPlugin; import java.util.List; import javax.inject.Inject; import org.tasks.LocalBroadcastManager; import org.tasks.R; import org.tasks.activities.FilterSettingsActivity; +import org.tasks.activities.RemoteListSupportPicker; import org.tasks.analytics.Tracker; import org.tasks.analytics.Tracking; import org.tasks.dialogs.DialogBuilder; @@ -84,6 +87,7 @@ public class TaskListFragment extends InjectingFragment // --- instance variables private static final int REQUEST_EDIT_FILTER = 11544; + public static final int REQUEST_MOVE_TASKS = 11545; private final RefreshReceiver refreshReceiver = new RefreshReceiver(); @Inject protected Tracker tracker; protected Filter filter; @@ -100,6 +104,7 @@ public class TaskListFragment extends InjectingFragment @Inject ViewHolderFactory viewHolderFactory; @Inject LocalBroadcastManager localBroadcastManager; @Inject Device device; + @Inject TaskMover taskMover; @BindView(R.id.swipe_layout) SwipeRefreshLayout swipeRefreshLayout; @@ -496,7 +501,7 @@ public class TaskListFragment extends InjectingFragment @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == VOICE_RECOGNITION_REQUEST_CODE) { - if (resultCode == Activity.RESULT_OK) { + if (resultCode == RESULT_OK) { List match = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); if (match != null && match.size() > 0 && match.get(0).length() > 0) { String recognizedSpeech = match.get(0); @@ -508,7 +513,7 @@ public class TaskListFragment extends InjectingFragment } } } else if (requestCode == REQUEST_EDIT_FILTER) { - if (resultCode == Activity.RESULT_OK) { + if (resultCode == RESULT_OK) { String action = data.getAction(); TaskListActivity activity = (TaskListActivity) getActivity(); if (FilterSettingsActivity.ACTION_FILTER_DELETED.equals(action)) { @@ -522,6 +527,13 @@ public class TaskListFragment extends InjectingFragment activity.recreate(); } } + } else if (requestCode == REQUEST_MOVE_TASKS) { + if (resultCode == RESULT_OK) { + taskMover.move( + taskAdapter.getSelected(), + data.getParcelableExtra(RemoteListSupportPicker.EXTRA_SELECTED)); + recyclerAdapter.finishActionMode(); + } } else { super.onActivityResult(requestCode, resultCode, data); } diff --git a/app/src/main/java/com/todoroo/astrid/service/TaskMover.java b/app/src/main/java/com/todoroo/astrid/service/TaskMover.java new file mode 100644 index 000000000..77d3e985b --- /dev/null +++ b/app/src/main/java/com/todoroo/astrid/service/TaskMover.java @@ -0,0 +1,81 @@ +package com.todoroo.astrid.service; + +import static com.todoroo.andlib.utility.DateUtilities.now; + +import com.todoroo.astrid.api.CaldavFilter; +import com.todoroo.astrid.api.Filter; +import com.todoroo.astrid.api.GtasksFilter; +import com.todoroo.astrid.dao.TaskDao; +import com.todoroo.astrid.data.SyncFlags; +import com.todoroo.astrid.data.Task; +import com.todoroo.astrid.helper.UUIDHelper; +import java.util.List; +import javax.inject.Inject; +import org.tasks.data.CaldavDao; +import org.tasks.data.CaldavTask; +import org.tasks.data.GoogleTask; +import org.tasks.data.GoogleTaskDao; +import org.tasks.sync.SyncAdapters; + +public class TaskMover { + private final TaskDao taskDao; + private final CaldavDao caldavDao; + private final GoogleTaskDao googleTaskDao; + private final SyncAdapters syncAdapters; + + @Inject + public TaskMover(TaskDao taskDao, CaldavDao caldavDao, GoogleTaskDao googleTaskDao, SyncAdapters syncAdapters) { + this.taskDao = taskDao; + this.caldavDao = caldavDao; + this.googleTaskDao = googleTaskDao; + this.syncAdapters = syncAdapters; + } + + public void move(List tasks, Filter selectedList) { + List fetch = taskDao.fetch(tasks); + for (Task task : fetch) { + performMove(task, selectedList); + task.putTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC, true); + task.setModificationDate(now()); + taskDao.save(task); + } + syncAdapters.syncNow(); + } + + public void move(Task task, Filter selectedList) { + performMove(task, selectedList); + } + + private void performMove(Task task, Filter selectedList) { + long id = task.getId(); + GoogleTask googleTask = googleTaskDao.getByTaskId(id); + if (googleTask != null + && selectedList instanceof GtasksFilter + && googleTask.getListId().equals(((GtasksFilter) selectedList).getRemoteId())) { + return; + } + CaldavTask caldavTask = caldavDao.getTask(id); + if (caldavTask != null + && selectedList instanceof CaldavFilter + && caldavTask.getCalendar().equals(((CaldavFilter) selectedList).getUuid())) { + return; + } + task.putTransitory(SyncFlags.FORCE_SYNC, true); + if (googleTask != null) { + googleTask.setDeleted(now()); + googleTaskDao.update(googleTask); + } + + if (caldavTask != null) { + caldavTask.setDeleted(now()); + caldavDao.update(caldavTask); + } + + if (selectedList instanceof GtasksFilter) { + googleTaskDao.insert(new GoogleTask(id, ((GtasksFilter) selectedList).getRemoteId())); + } else if (selectedList instanceof CaldavFilter) { + caldavDao.insert( + new CaldavTask(id, ((CaldavFilter) selectedList).getUuid(), UUIDHelper.newUUID())); + } + } +} diff --git a/app/src/main/java/org/tasks/activities/RemoteListSupportPicker.java b/app/src/main/java/org/tasks/activities/RemoteListSupportPicker.java index 7c274702f..ec4fcaa4e 100644 --- a/app/src/main/java/org/tasks/activities/RemoteListSupportPicker.java +++ b/app/src/main/java/org/tasks/activities/RemoteListSupportPicker.java @@ -2,8 +2,10 @@ package org.tasks.activities; import android.app.Activity; import android.app.Dialog; +import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; +import android.support.v4.app.Fragment; import android.support.v7.app.AlertDialog; import com.todoroo.astrid.adapter.FilterAdapter; import com.todoroo.astrid.api.CaldavFilter; @@ -18,18 +20,20 @@ import org.tasks.injection.InjectingDialogFragment; public class RemoteListSupportPicker extends InjectingDialogFragment { - private static final String EXTRA_SELECTED = "extra_selected"; + public static final String EXTRA_SELECTED = "extra_selected"; + @Inject DialogBuilder dialogBuilder; @Inject FilterAdapter filterAdapter; - private RemoteListSelectionHandler handler; - public static RemoteListSupportPicker newRemoteListSupportPicker(Filter selected) { + public static RemoteListSupportPicker newRemoteListSupportPicker( + Filter selected, Fragment targetFragment, int requestCode) { RemoteListSupportPicker dialog = new RemoteListSupportPicker(); Bundle arguments = new Bundle(); if (selected != null) { arguments.putParcelable(EXTRA_SELECTED, selected); } dialog.setArguments(arguments); + dialog.setTargetFragment(targetFragment, requestCode); return dialog; } @@ -64,14 +68,15 @@ public class RemoteListSupportPicker extends InjectingDialogFragment { public Dialog onCreateDialog(Bundle savedInstanceState) { Bundle arguments = getArguments(); Filter selected = arguments == null ? null : arguments.getParcelable(EXTRA_SELECTED); - return createDialog(filterAdapter, dialogBuilder, selected, list -> handler.selectedList(list)); + return createDialog(filterAdapter, dialogBuilder, selected, this::selected); } - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - - handler = (RemoteListSelectionHandler) activity; + private void selected(Filter filter) { + getTargetFragment() + .onActivityResult( + getTargetRequestCode(), + Activity.RESULT_OK, + new Intent().putExtra(EXTRA_SELECTED, filter)); } @Override diff --git a/app/src/main/java/org/tasks/tasklist/TaskListRecyclerAdapter.java b/app/src/main/java/org/tasks/tasklist/TaskListRecyclerAdapter.java index 04fe45628..8f4ecd8c1 100644 --- a/app/src/main/java/org/tasks/tasklist/TaskListRecyclerAdapter.java +++ b/app/src/main/java/org/tasks/tasklist/TaskListRecyclerAdapter.java @@ -1,5 +1,7 @@ package org.tasks.tasklist; +import static org.tasks.activities.RemoteListSupportPicker.newRemoteListSupportPicker; + import android.app.Activity; import android.arch.paging.AsyncPagedListDiffer; import android.arch.paging.PagedList; @@ -34,6 +36,7 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter implements ViewHolder.ViewHolderCallbacks, ListUpdateCallback { private static final String EXTRA_SELECTED_TASK_IDS = "extra_selected_task_ids"; + private static final String FRAG_TAG_REMOTE_LIST_PICKER = "frag_tag_remote_list_picker"; private final Activity activity; private final TaskAdapter adapter; @@ -66,6 +69,10 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId()) { + case R.id.move_tasks: + newRemoteListSupportPicker(null, taskList, TaskListFragment.REQUEST_MOVE_TASKS) + .show(taskList.getFragmentManager(), FRAG_TAG_REMOTE_LIST_PICKER); + return true; case R.id.delete: dialogBuilder .newMessageDialog(R.string.delete_selected_tasks) @@ -243,7 +250,7 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter } } - private void finishActionMode() { + public void finishActionMode() { if (mode != null) { mode.finish(); } diff --git a/app/src/main/java/org/tasks/ui/RemoteListFragment.java b/app/src/main/java/org/tasks/ui/RemoteListFragment.java index dc190055d..e13032bcf 100644 --- a/app/src/main/java/org/tasks/ui/RemoteListFragment.java +++ b/app/src/main/java/org/tasks/ui/RemoteListFragment.java @@ -1,8 +1,9 @@ package org.tasks.ui; -import static com.todoroo.andlib.utility.DateUtilities.now; +import static android.app.Activity.RESULT_OK; import static org.tasks.activities.RemoteListSupportPicker.newRemoteListSupportPicker; +import android.content.Intent; import android.os.Bundle; import android.support.annotation.Nullable; import android.view.LayoutInflater; @@ -14,12 +15,12 @@ import butterknife.OnClick; import com.todoroo.astrid.api.CaldavFilter; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.GtasksFilter; -import com.todoroo.astrid.data.SyncFlags; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.gtasks.GtasksListService; -import com.todoroo.astrid.helper.UUIDHelper; +import com.todoroo.astrid.service.TaskMover; import javax.inject.Inject; import org.tasks.R; +import org.tasks.activities.RemoteListSupportPicker; import org.tasks.data.CaldavCalendar; import org.tasks.data.CaldavDao; import org.tasks.data.CaldavTask; @@ -35,6 +36,7 @@ public class RemoteListFragment extends TaskEditControlFragment { "frag_tag_google_task_list_selection"; private static final String EXTRA_ORIGINAL_LIST = "extra_original_list"; private static final String EXTRA_SELECTED_LIST = "extra_selected_list"; + private static final int REQUEST_CODE_SELECT_LIST = 10101; @BindView(R.id.google_task_list) TextView textView; @@ -43,6 +45,7 @@ public class RemoteListFragment extends TaskEditControlFragment { @Inject GoogleTaskDao googleTaskDao; @Inject CaldavDao caldavDao; @Inject DefaultFilterProvider defaultFilterProvider; + @Inject TaskMover taskMover; @Nullable private Filter originalList; @Nullable private Filter selectedList; @@ -61,7 +64,8 @@ public class RemoteListFragment extends TaskEditControlFragment { originalList = new GtasksFilter(gtasksListService.getList(task.getTransitory(GoogleTask.KEY))); } else if (task.hasTransitory(CaldavTask.KEY)) { - originalList = new CaldavFilter(caldavDao.getCalendarByUuid(task.getTransitory(CaldavTask.KEY))); + originalList = + new CaldavFilter(caldavDao.getCalendarByUuid(task.getTransitory(CaldavTask.KEY))); } else { originalList = defaultFilterProvider.getDefaultRemoteList(); } @@ -114,43 +118,13 @@ public class RemoteListFragment extends TaskEditControlFragment { @OnClick(R.id.google_task_list) void clickGoogleTaskList(View view) { - newRemoteListSupportPicker(selectedList) - .show(getChildFragmentManager(), FRAG_TAG_GOOGLE_TASK_LIST_SELECTION); + newRemoteListSupportPicker(selectedList, this, REQUEST_CODE_SELECT_LIST) + .show(getFragmentManager(), FRAG_TAG_GOOGLE_TASK_LIST_SELECTION); } @Override public void apply(Task task) { - GoogleTask googleTask = googleTaskDao.getByTaskId(task.getId()); - if (googleTask != null - && selectedList instanceof GtasksFilter - && googleTask.getListId().equals(((GtasksFilter) selectedList).getRemoteId())) { - return; - } - CaldavTask caldavTask = caldavDao.getTask(task.getId()); - if (caldavTask != null - && selectedList instanceof CaldavFilter - && caldavTask.getCalendar().equals(((CaldavFilter) selectedList).getUuid())) { - return; - } - task.putTransitory(SyncFlags.FORCE_SYNC, true); - if (googleTask != null) { - googleTask.setDeleted(now()); - googleTaskDao.update(googleTask); - } - - if (caldavTask != null) { - caldavTask.setDeleted(now()); - caldavDao.update(caldavTask); - } - - if (selectedList instanceof GtasksFilter) { - googleTaskDao.insert( - new GoogleTask(task.getId(), ((GtasksFilter) selectedList).getRemoteId())); - } else if (selectedList instanceof CaldavFilter) { - caldavDao.insert( - new CaldavTask( - task.getId(), ((CaldavFilter) selectedList).getUuid(), UUIDHelper.newUUID())); - } + taskMover.move(task, selectedList); } @Override @@ -163,7 +137,18 @@ public class RemoteListFragment extends TaskEditControlFragment { component.inject(this); } - public void setList(Filter list) { + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == REQUEST_CODE_SELECT_LIST) { + if (resultCode == RESULT_OK) { + setList(data.getParcelableExtra(RemoteListSupportPicker.EXTRA_SELECTED)); + } + } else { + super.onActivityResult(requestCode, resultCode, data); + } + } + + private void setList(Filter list) { if (list == null) { this.selectedList = null; } else if (list instanceof GtasksFilter || list instanceof CaldavFilter) { diff --git a/app/src/main/res/menu/menu_multi_select.xml b/app/src/main/res/menu/menu_multi_select.xml index 96c5627c0..9d66b8b33 100644 --- a/app/src/main/res/menu/menu_multi_select.xml +++ b/app/src/main/res/menu/menu_multi_select.xml @@ -2,6 +2,12 @@ + + List settings Delete Copy + Move Filter Settings Show hidden Show completed