diff --git a/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java b/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java index d61fda02b..5aecff766 100644 --- a/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java +++ b/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java @@ -133,6 +133,13 @@ public class TaskListActivity extends InjectingAppCompatActivity implements navigationDrawer = getNavigationDrawerFragment(); navigationDrawer.setUp(drawerLayout); + drawerLayout.addDrawerListener(new DrawerLayout.SimpleDrawerListener() { + @Override + public void onDrawerStateChanged(int newState) { + finishActionMode(); + } + }); + handleIntent(); } diff --git a/src/main/java/org/tasks/tasklist/TaskListRecyclerAdapter.java b/src/main/java/org/tasks/tasklist/TaskListRecyclerAdapter.java index 8f1cb332f..7e3d91081 100644 --- a/src/main/java/org/tasks/tasklist/TaskListRecyclerAdapter.java +++ b/src/main/java/org/tasks/tasklist/TaskListRecyclerAdapter.java @@ -15,7 +15,6 @@ import android.view.ViewGroup; import com.bignerdranch.android.multiselector.ModalMultiSelectorCallback; import com.bignerdranch.android.multiselector.MultiSelector; -import com.google.common.collect.Ordering; import com.google.common.primitives.Longs; import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.astrid.activity.TaskListActivity; @@ -54,6 +53,7 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter im private final ItemTouchHelper itemTouchHelper; private ActionMode mode = null; + private boolean dragging; public TaskListRecyclerAdapter(Activity activity, TaskAdapter adapter, ViewHolderFactory viewHolderFactory, @@ -109,6 +109,7 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter im Cursor cursor = adapter.getCursor(); cursor.moveToPosition(position); holder.bindView((TodorooCursor) cursor); + holder.setMoving(false); holder.setIndent(adapter.getIndent(holder.task)); } @@ -124,42 +125,40 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter im @Override public void onClick(ViewHolder viewHolder) { - if (multiSelector.tapSelection(viewHolder)) { - viewHolder.setMoving(false); - updateActionMode(); - } else { + if (mode == null) { Task task = viewHolder.task; taskList.onTaskListItemClicked(task.getId()); + } else { + toggle(viewHolder); } } @Override public boolean onLongPress(ViewHolder viewHolder) { - multiSelector.setSelectable(true); - if (adapter.isManuallySorted()) { - viewHolder.setMoving(true); - Flags.set(Flags.TLFP_NO_INTERCEPT_TOUCH); - return false; - } - - multiSelector.tapSelection(viewHolder); - updateActionMode(); + toggle(viewHolder); return true; } - private void updateActionMode() { - if (mode == null) { - mode = ((TaskListActivity) activity).startSupportActionMode(actionModeCallback); - } - afterSelect(); - } - - private void afterSelect() { + private void toggle(ViewHolder viewHolder) { + multiSelector.setSelectable(true); + multiSelector.tapSelection(viewHolder); if (multiSelector.getSelectedPositions().isEmpty()) { + dragging = false; if (mode != null) { mode.finish(); } } else { + if (mode == null) { + mode = ((TaskListActivity) activity).startSupportActionMode(actionModeCallback); + if (adapter.isManuallySorted()) { + dragging = true; + Flags.set(Flags.TLFP_NO_INTERCEPT_TOUCH); + } else { + dragging = false; + } + } else { + dragging = false; + } updateModeTitle(); } } @@ -171,17 +170,17 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter im private void deleteSelectedItems() { tracker.reportEvent(Tracking.Events.MULTISELECT_DELETE); List tasks = getTasks(); + mode.finish(); int result = taskDeleter.delete(tasks); taskList.onTaskDelete(tasks); - for (int position : Ordering.natural().reverse().sortedCopy(multiSelector.getSelectedPositions())) { - notifyItemRemoved(position); - } taskList.makeSnackbar(activity.getString(R.string.delete_multiple_tasks_confirmation, Integer.toString(result))).show(); } private void copySelectedItems() { tracker.reportEvent(Tracking.Events.MULTISELECT_CLONE); - List duplicates = taskDuplicator.duplicate(getTasks()); + List tasks = getTasks(); + mode.finish(); + List duplicates = taskDuplicator.duplicate(tasks); taskList.onTaskCreated(duplicates); taskList.makeSnackbar(activity.getString(R.string.copy_multiple_tasks_confirmation, Integer.toString(duplicates.size()))).show(); } @@ -206,19 +205,13 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter im switch (item.getItemId()) { case R.id.delete: dialogBuilder.newMessageDialog(R.string.delete_selected_tasks) - .setPositiveButton(android.R.string.ok, (dialogInterface, i) -> { - deleteSelectedItems(); - mode.finish(); - }) + .setPositiveButton(android.R.string.ok, (dialogInterface, i) -> deleteSelectedItems()) .setNegativeButton(android.R.string.cancel, null) .show(); return true; case R.id.copy_tasks: dialogBuilder.newMessageDialog(R.string.copy_selected_tasks) - .setPositiveButton(android.R.string.ok, ((dialogInterface, i) -> { - copySelectedItems(); - mode.finish(); - })) + .setPositiveButton(android.R.string.ok, ((dialogInterface, i) -> copySelectedItems())) .setNegativeButton(android.R.string.cancel, null) .show(); return true; @@ -240,26 +233,42 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter im private int from = -1; private int to = -1; + @Override + public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { + super.onSelectedChanged(viewHolder, actionState); + if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) { + ((ViewHolder) viewHolder).setMoving(true); + } + } + @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { - if (!adapter.isManuallySorted() || mode != null) { + if (!adapter.isManuallySorted()) { return makeMovementFlags(0, 0); } - ViewHolder vh = (ViewHolder) viewHolder; - int indentFlags = 0; - if (vh.isIndented()) { - indentFlags |= ItemTouchHelper.LEFT; + if (mode == null) { + int indentFlags = 0; + if (vh.isIndented()) { + indentFlags |= ItemTouchHelper.LEFT; + } + int position = vh.getAdapterPosition(); + if (position > 0 && adapter.canIndent(position, vh.task)) { + indentFlags |= ItemTouchHelper.RIGHT; + } + return makeMovementFlags(0, indentFlags); } - int position = vh.getAdapterPosition(); - if (position > 0 && adapter.canIndent(position, vh.task)) { - indentFlags |= ItemTouchHelper.RIGHT; + if (dragging) { + return makeMovementFlags(ItemTouchHelper.UP | ItemTouchHelper.DOWN, 0); } - return makeMovementFlags(ItemTouchHelper.UP | ItemTouchHelper.DOWN, indentFlags); + return makeMovementFlags(0, 0); } @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) { + if (mode != null) { + mode.finish(); + } int fromPosition = source.getAdapterPosition(); int toPosition = target.getAdapterPosition(); if (from == -1) { @@ -288,14 +297,10 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter im public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { super.clearView(recyclerView, viewHolder); ViewHolder vh = (ViewHolder) viewHolder; - vh.setMoving(false); - if (multiSelector.isSelectable()) { - if (from == -1) { - multiSelector.setSelected(vh, true); - updateActionMode(); - } else { - multiSelector.clearSelections(); - multiSelector.setSelectable(false); + if (dragging) { + vh.setMoving(false); + dragging = false; + if (from != -1) { if (from >= 0 && from != to) { if (from < to) { to++; diff --git a/src/main/java/org/tasks/ui/NavigationDrawerFragment.java b/src/main/java/org/tasks/ui/NavigationDrawerFragment.java index 559b37825..16bcce731 100644 --- a/src/main/java/org/tasks/ui/NavigationDrawerFragment.java +++ b/src/main/java/org/tasks/ui/NavigationDrawerFragment.java @@ -115,10 +115,10 @@ public class NavigationDrawerFragment extends InjectingFragment { } mDrawerListView = (ListView) layout.findViewById(android.R.id.list); mDrawerListView.setOnItemClickListener((parent, view, position, id) -> { - mDrawerLayout.setDrawerListener(new DrawerLayout.SimpleDrawerListener() { + mDrawerLayout.addDrawerListener(new DrawerLayout.SimpleDrawerListener() { @Override public void onDrawerClosed(View drawerView) { - mDrawerLayout.setDrawerListener(null); + mDrawerLayout.removeDrawerListener(this); selectItem(position); } });