|
|
|
@ -18,8 +18,6 @@ import android.view.MenuInflater;
|
|
|
|
|
import android.view.MenuItem;
|
|
|
|
|
import android.view.ViewGroup;
|
|
|
|
|
|
|
|
|
|
import com.bignerdranch.android.multiselector.ModalMultiSelectorCallback;
|
|
|
|
|
import com.bignerdranch.android.multiselector.MultiSelector;
|
|
|
|
|
import com.google.common.primitives.Longs;
|
|
|
|
|
import com.todoroo.astrid.activity.TaskListActivity;
|
|
|
|
|
import com.todoroo.astrid.activity.TaskListFragment;
|
|
|
|
@ -35,12 +33,8 @@ import org.tasks.analytics.Tracking;
|
|
|
|
|
import org.tasks.dialogs.DialogBuilder;
|
|
|
|
|
import org.tasks.ui.MenuColorizer;
|
|
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
|
|
import static com.google.common.collect.Lists.newArrayList;
|
|
|
|
|
import static com.google.common.collect.Lists.transform;
|
|
|
|
|
|
|
|
|
|
public class TaskListRecyclerAdapter extends RecyclerView.Adapter<ViewHolder>
|
|
|
|
|
implements ViewHolder.ViewHolderCallbacks, ListUpdateCallback {
|
|
|
|
|
|
|
|
|
@ -58,8 +52,6 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter<ViewHolder>
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
private final MultiSelector multiSelector = new MultiSelector();
|
|
|
|
|
|
|
|
|
|
private final Activity activity;
|
|
|
|
|
private final TaskAdapter adapter;
|
|
|
|
|
private final ViewHolderFactory viewHolderFactory;
|
|
|
|
@ -99,42 +91,26 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter<ViewHolder>
|
|
|
|
|
|
|
|
|
|
public Bundle getSaveState() {
|
|
|
|
|
Bundle information = new Bundle();
|
|
|
|
|
List<Task> selectedTasks = transform(multiSelector.getSelectedPositions(), adapterHelper::getItem);
|
|
|
|
|
List<Long> selectedTaskIds = transform(selectedTasks, Task::getId);
|
|
|
|
|
List<Long> selectedTaskIds = adapter.getSelected();
|
|
|
|
|
information.putLongArray(EXTRA_SELECTED_TASK_IDS, Longs.toArray(selectedTaskIds));
|
|
|
|
|
return information;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void restoreSaveState(Bundle savedState) {
|
|
|
|
|
long[] longArray = savedState.getLongArray(EXTRA_SELECTED_TASK_IDS);
|
|
|
|
|
if (longArray.length > 0) {
|
|
|
|
|
if (longArray != null && longArray.length > 0) {
|
|
|
|
|
mode = ((TaskListActivity) activity).startSupportActionMode(actionModeCallback);
|
|
|
|
|
multiSelector.setSelectable(true);
|
|
|
|
|
|
|
|
|
|
for (int position : getTaskPositions(Longs.asList(longArray))) {
|
|
|
|
|
multiSelector.setSelected(position, 0L, true);
|
|
|
|
|
}
|
|
|
|
|
adapter.setSelected(longArray);
|
|
|
|
|
|
|
|
|
|
updateModeTitle();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<Integer> getTaskPositions(List<Long> longs) {
|
|
|
|
|
List<Integer> result = new ArrayList<>();
|
|
|
|
|
for (int i = 0 ; i < adapterHelper.getItemCount() ; i++) {
|
|
|
|
|
Task item = adapterHelper.getItem(i);
|
|
|
|
|
if (longs.contains(item.getId())) {
|
|
|
|
|
result.add(i);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
|
|
|
|
ViewGroup view = (ViewGroup) LayoutInflater.from(activity)
|
|
|
|
|
.inflate(R.layout.task_adapter_row_simple, parent, false);
|
|
|
|
|
return viewHolderFactory.newViewHolder(view, this, multiSelector);
|
|
|
|
|
return viewHolderFactory.newViewHolder(view, this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@ -144,6 +120,7 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter<ViewHolder>
|
|
|
|
|
holder.bindView(task);
|
|
|
|
|
holder.setMoving(false);
|
|
|
|
|
holder.setIndent(adapter.getIndent(task));
|
|
|
|
|
holder.setSelected(adapter.isSelected(task));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -173,9 +150,9 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter<ViewHolder>
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void toggle(ViewHolder viewHolder) {
|
|
|
|
|
multiSelector.setSelectable(true);
|
|
|
|
|
multiSelector.tapSelection(viewHolder);
|
|
|
|
|
if (multiSelector.getSelectedPositions().isEmpty()) {
|
|
|
|
|
adapter.toggleSelection(viewHolder.task);
|
|
|
|
|
notifyItemChanged(viewHolder.getAdapterPosition());
|
|
|
|
|
if (adapter.getSelected().isEmpty()) {
|
|
|
|
|
dragging = false;
|
|
|
|
|
if (mode != null) {
|
|
|
|
|
mode.finish();
|
|
|
|
@ -196,22 +173,18 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter<ViewHolder>
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<Task> getSelectedTasks() {
|
|
|
|
|
return newArrayList(transform(multiSelector.getSelectedPositions(), adapterHelper::getItem));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void deleteSelectedItems() {
|
|
|
|
|
tracker.reportEvent(Tracking.Events.MULTISELECT_DELETE);
|
|
|
|
|
List<Task> tasks = getSelectedTasks();
|
|
|
|
|
List<Long> tasks = adapter.getSelected();
|
|
|
|
|
mode.finish();
|
|
|
|
|
int result = taskDeleter.markDeleted(tasks);
|
|
|
|
|
taskList.onTaskDelete(tasks);
|
|
|
|
|
taskList.makeSnackbar(activity.getString(R.string.delete_multiple_tasks_confirmation, Integer.toString(result))).show();
|
|
|
|
|
List<Task> result = taskDeleter.markDeleted(tasks);
|
|
|
|
|
taskList.onTaskDelete(result);
|
|
|
|
|
taskList.makeSnackbar(activity.getString(R.string.delete_multiple_tasks_confirmation, Integer.toString(result.size()))).show();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void copySelectedItems() {
|
|
|
|
|
tracker.reportEvent(Tracking.Events.MULTISELECT_CLONE);
|
|
|
|
|
List<Task> tasks = getSelectedTasks();
|
|
|
|
|
List<Long> tasks = adapter.getSelected();
|
|
|
|
|
mode.finish();
|
|
|
|
|
List<Task> duplicates = taskDuplicator.duplicate(tasks);
|
|
|
|
|
taskList.onTaskCreated(duplicates);
|
|
|
|
@ -220,11 +193,11 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter<ViewHolder>
|
|
|
|
|
|
|
|
|
|
private void updateModeTitle() {
|
|
|
|
|
if (mode != null) {
|
|
|
|
|
mode.setTitle(Integer.toString(multiSelector.getSelectedPositions().size()));
|
|
|
|
|
mode.setTitle(Integer.toString(adapter.getSelected().size()));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private ModalMultiSelectorCallback actionModeCallback = new ModalMultiSelectorCallback(multiSelector) {
|
|
|
|
|
private ActionMode.Callback actionModeCallback = new ActionMode.Callback() {
|
|
|
|
|
@Override
|
|
|
|
|
public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
|
|
|
|
|
MenuInflater inflater = actionMode.getMenuInflater();
|
|
|
|
@ -233,6 +206,11 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter<ViewHolder>
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
|
|
|
|
|
switch (item.getItemId()) {
|
|
|
|
@ -255,9 +233,9 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter<ViewHolder>
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onDestroyActionMode(ActionMode actionMode) {
|
|
|
|
|
super.onDestroyActionMode(actionMode);
|
|
|
|
|
multiSelector.clearSelections();
|
|
|
|
|
adapter.clearSelections();
|
|
|
|
|
TaskListRecyclerAdapter.this.mode = null;
|
|
|
|
|
notifyDataSetChanged();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|