Multi-select improvements

pull/493/head
Alex Baker 9 years ago
parent c7dcf2235d
commit c8fef50fc8

@ -462,7 +462,6 @@ public class TaskListActivity extends InjectingAppCompatActivity implements
@Override
public void taskEditFinished() {
getSupportFragmentManager().popBackStackImmediate(TaskEditFragment.TAG_TASKEDIT_FRAGMENT, FragmentManager.POP_BACK_STACK_INCLUSIVE);
getTaskListFragment().clearSelections();
hideKeyboard();
}

@ -350,8 +350,6 @@ public class TaskListFragment extends InjectingFragment implements
recyclerAdapter.applyToRecyclerView(recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(context));
loadTaskListContent();
}
@Override
@ -418,19 +416,18 @@ public class TaskListFragment extends InjectingFragment implements
* Load or re-load action items and update views
*/
public void loadTaskListContent() {
if (taskAdapter == null) {
setTaskAdapter();
return;
}
Cursor taskCursor = taskAdapter.getCursor();
// stash selected items
Bundle saveState = recyclerAdapter.getSaveState();
taskCursor.requery();
recyclerAdapter.notifyDataSetChanged();
if (recyclerAdapter.getItemCount() == 0) {
if (taskAdapter.getCount() == 0) {
swipeRefreshLayout.setVisibility(View.GONE);
emptyRefreshLayout.setVisibility(View.VISIBLE);
} else {
recyclerAdapter.notifyDataSetChanged();
recyclerAdapter.restoreSaveState(saveState);
swipeRefreshLayout.setVisibility(View.VISIBLE);
emptyRefreshLayout.setVisibility(View.GONE);
}
@ -553,8 +550,4 @@ public class TaskListFragment extends InjectingFragment implements
protected boolean hasDraggableOption() {
return BuiltInFilterExposer.isInbox(context, filter) || BuiltInFilterExposer.isTodayFilter(context, filter);
}
public void clearSelections() {
recyclerAdapter.clearSelections();
}
}

@ -23,6 +23,11 @@ import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.TaskAttachment;
import com.todoroo.astrid.tags.TaskToTagMetadata;
import java.util.ArrayList;
import java.util.List;
import static com.todoroo.andlib.data.AbstractModel.NO_ID;
/**
* Adapter for displaying a user's tasks as a list
*
@ -31,6 +36,17 @@ import com.todoroo.astrid.tags.TaskToTagMetadata;
*/
public class TaskAdapter extends CursorAdapter implements Filterable {
public List<Integer> getTaskPositions(List<Long> longs) {
List<Integer> result = new ArrayList<>();
TodorooCursor<Task> taskCursor = getTaskCursor();
for (taskCursor.moveToFirst() ; !taskCursor.isAfterLast() ; taskCursor.moveToNext()) {
if (longs.contains(taskCursor.get(Task.ID))) {
result.add(taskCursor.getPosition());
}
}
return result;
}
public interface OnCompletedTaskListener {
void onCompletedTask(Task item, boolean newState);
}
@ -99,8 +115,22 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
}
private TodorooCursor<Task> getTaskCursor() {
return (TodorooCursor<Task>) getCursor();
}
public long getTaskId(int position) {
TodorooCursor<Task> c = getTaskCursor();
if (c != null) {
if (c.moveToPosition(position)) {
return c.get(Task.ID);
}
}
return NO_ID;
}
public Task getTask(int position) {
TodorooCursor<Task> c = (TodorooCursor<Task>) getCursor();
TodorooCursor<Task> c = getTaskCursor();
if (c != null) {
if (c.moveToPosition(position)) {
return c.toModel();
@ -110,7 +140,7 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
}
protected String getItemUuid(int position) {
TodorooCursor<Task> c = (TodorooCursor<Task>) getCursor();
TodorooCursor<Task> c = getTaskCursor();
if (c != null) {
if (c.moveToPosition(position)) {
return c.get(Task.UUID);

@ -16,6 +16,7 @@ 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;
import com.todoroo.astrid.activity.TaskListFragment;
@ -32,11 +33,13 @@ import org.tasks.ui.MenuColorizer;
import java.util.List;
import static com.google.common.collect.Iterables.transform;
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 {
private static final String EXTRA_SELECTED_TASK_IDS = "extra_selected_task_ids";
private final MultiSelector multiSelector = new MultiSelector();
private final Activity activity;
@ -70,13 +73,22 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter<ViewHolder> im
}
public Bundle getSaveState() {
return multiSelector.saveSelectionStates();
Bundle information = new Bundle();
List<Long> selectedTaskIds = transform(multiSelector.getSelectedPositions(), adapter::getTaskId);
information.putLongArray(EXTRA_SELECTED_TASK_IDS, Longs.toArray(selectedTaskIds));
return information;
}
public void restoreSaveState(Bundle savedState) {
multiSelector.restoreSelectionStates(savedState);
if (multiSelector.getSelectedPositions().size() > 0) {
long[] longArray = savedState.getLongArray(EXTRA_SELECTED_TASK_IDS);
if (longArray.length > 0) {
mode = ((TaskListActivity) activity).startSupportActionMode(actionModeCallback);
multiSelector.setSelectable(true);
for (int position : adapter.getTaskPositions(Longs.asList(longArray))) {
multiSelector.setSelected(position, 0L, true);
}
updateModeTitle();
}
}
@ -108,11 +120,9 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter<ViewHolder> im
@Override
public void onClick(ViewHolder viewHolder) {
if (viewHolder.isMoving()) {
return;
}
if (multiSelector.tapSelection(viewHolder)) {
afterSelect();
viewHolder.setMoving(false);
updateActionMode();
} else {
Task task = viewHolder.task;
taskList.onTaskListItemClicked(task.getId());
@ -121,21 +131,23 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter<ViewHolder> im
@Override
public boolean onLongPress(ViewHolder viewHolder) {
multiSelector.setSelectable(true);
if (adapter.isManuallySorted()) {
viewHolder.setMoving(true);
Flags.set(Flags.TLFP_NO_INTERCEPT_TOUCH);
return false;
}
select(viewHolder);
multiSelector.tapSelection(viewHolder);
updateActionMode();
return true;
}
private void select(ViewHolder viewHolder) {
if (!multiSelector.isSelectable()) {
multiSelector.setSelectable(true);
private void updateActionMode() {
if (mode == null) {
mode = ((TaskListActivity) activity).startSupportActionMode(actionModeCallback);
}
if (multiSelector.tapSelection(viewHolder)) {
afterSelect();
}
afterSelect();
}
private void afterSelect() {
@ -180,10 +192,6 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter<ViewHolder> im
.show();
}
public void clearSelections() {
multiSelector.clearSelections();
}
private void updateModeTitle() {
if (mode != null) {
mode.setTitle(Integer.toString(multiSelector.getSelectedPositions().size()));
@ -246,19 +254,6 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter<ViewHolder> im
return makeMovementFlags(ItemTouchHelper.UP | ItemTouchHelper.DOWN, indentFlags);
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
super.onSelectedChanged(viewHolder, actionState);
if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) {
if (viewHolder != null) {
ViewHolder vh = (ViewHolder) viewHolder;
vh.setMoving(true);
vh.updateBackground();
Flags.set(Flags.TLFP_NO_INTERCEPT_TOUCH);
}
}
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) {
int fromPosition = source.getAdapterPosition();
@ -289,10 +284,14 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter<ViewHolder> im
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
ViewHolder vh = (ViewHolder) viewHolder;
if (vh.isMoving()) {
vh.setMoving(false);
if (multiSelector.isSelectable()) {
if (from == -1) {
select(vh);
multiSelector.setSelected(vh, true);
updateActionMode();
} else {
multiSelector.clearSelections();
multiSelector.setSelectable(false);
if (from >= 0 && from != to) {
if (from < to) {
to++;
@ -304,8 +303,6 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter<ViewHolder> im
from = -1;
to = -1;
Flags.checkAndClear(Flags.TLFP_NO_INTERCEPT_TOUCH);
vh.setMoving(false);
vh.updateBackground();
}
@Override

@ -69,10 +69,7 @@ class ViewHolder extends MultiSelectorBindingHolder {
void setMoving(boolean moving) {
this.moving = moving;
}
boolean isMoving() {
return moving;
updateBackground();
}
void updateBackground() {

@ -23,7 +23,6 @@
<string name="TLA_menu_settings">إعدادات</string>
<string name="TAd_actionEditTask">تعديل</string>
<string name="TAd_contextCopyTask">نسخ المهمه</string>
<string name="TAd_contextDeleteTask">حذف المهمة</string>
<string name="SSD_sort_drag">ترتيب يدوي مع مهام فرعية</string>
<string name="SSD_sort_auto">ترتيب ذكي</string>
<string name="SSD_sort_alpha">بالعنوان</string>

@ -41,7 +41,6 @@
<string name="TAd_completed">Приключена\n%s</string>
<string name="TAd_actionEditTask">Редактирай</string>
<string name="TAd_contextCopyTask">Копирай задача</string>
<string name="TAd_contextDeleteTask">Изтрий задача</string>
<string name="SSD_sort_drag">Ръчно подреждане с подзадачи</string>
<string name="SSD_sort_auto">Умно сортиране</string>
<string name="SSD_sort_alpha">По име</string>

@ -29,7 +29,6 @@
<string name="TAd_completed">Acabat fa\n%s</string>
<string name="TAd_actionEditTask">Edita</string>
<string name="TAd_contextCopyTask">Copia la tasca</string>
<string name="TAd_contextDeleteTask">Suprimeix la tasca</string>
<string name="SSD_sort_drag">Ordre manual amb subtasques</string>
<string name="SSD_sort_auto">Classificació intel·ligent Tasks</string>
<string name="SSD_sort_alpha">Per títol</string>

@ -33,7 +33,6 @@
<string name="TAd_completed">Dokončeno\n%s</string>
<string name="TAd_actionEditTask">Upravit</string>
<string name="TAd_contextCopyTask">Kopírovat úkol</string>
<string name="TAd_contextDeleteTask">Smazat úkol</string>
<string name="SSD_sort_drag">Ručně nebo s podúkoly</string>
<string name="SSD_sort_auto">Chytré třídění</string>
<string name="SSD_sort_alpha">Podle názvu</string>

@ -36,7 +36,6 @@
<string name="TAd_completed">Abgeschlossen\n%s</string>
<string name="TAd_actionEditTask">Bearbeiten</string>
<string name="TAd_contextCopyTask">Aufgabe kopieren</string>
<string name="TAd_contextDeleteTask">Aufgabe löschen</string>
<string name="SSD_sort_drag">Manuelle Sortierung mit Unteraufgaben</string>
<string name="SSD_sort_auto">Smarte Sortierung</string>
<string name="SSD_sort_alpha">Nach Titel</string>

@ -38,7 +38,6 @@
<string name="TAd_completed">Terminado\n%s</string>
<string name="TAd_actionEditTask">Editar</string>
<string name="TAd_contextCopyTask">Copiar tarea</string>
<string name="TAd_contextDeleteTask">Eliminar tarea</string>
<string name="SSD_sort_drag">Orden manual con subtareas</string>
<string name="SSD_sort_auto">Ordenación inteligente</string>
<string name="SSD_sort_alpha">Por título</string>

@ -27,7 +27,6 @@
<string name="TLA_menu_settings">تنظیمات</string>
<string name="TAd_actionEditTask">ویرایش</string>
<string name="TAd_contextCopyTask">کپی وظایف</string>
<string name="TAd_contextDeleteTask">حذف وظیفه</string>
<string name="SSD_sort_drag">چینش دستی بهمراه زیروظایف</string>
<string name="SSD_sort_auto">چینش هوشمندانه</string>
<string name="SSD_sort_alpha">براساس موضوع</string>

@ -41,7 +41,6 @@
<string name="TAd_completed">Lopetettu\n%s</string>
<string name="TAd_actionEditTask">Muokkaa</string>
<string name="TAd_contextCopyTask">Kopio tehtävä</string>
<string name="TAd_contextDeleteTask">Poista Tasks</string>
<string name="SSD_sort_drag">Manuaalinen järjestys osatehtäviin</string>
<string name="SSD_sort_auto">Älykäs sorttaus</string>
<string name="SSD_sort_alpha">Otsikoittain</string>

@ -38,7 +38,6 @@
<string name="TAd_completed">Accomplie\n%s</string>
<string name="TAd_actionEditTask">Modifier</string>
<string name="TAd_contextCopyTask">Copier la tâche</string>
<string name="TAd_contextDeleteTask">Supprimer la tâche</string>
<string name="SSD_sort_drag">Ordonner manuellement avec les sous-tâches</string>
<string name="SSD_sort_auto">Tri intelligent Tasks</string>
<string name="SSD_sort_alpha">Par titre</string>

@ -41,7 +41,6 @@
<string name="TAd_completed">Befejezve\n%s</string>
<string name="TAd_actionEditTask">Szerkesztés</string>
<string name="TAd_contextCopyTask">Feladat másolása</string>
<string name="TAd_contextDeleteTask">Feladat törlése</string>
<string name="SSD_sort_drag">Manuális sorrend részfeladatokkal</string>
<string name="SSD_sort_auto">Intelligens rendezés</string>
<string name="SSD_sort_alpha">Név alapján</string>

@ -38,7 +38,6 @@
<string name="TAd_completed">Terminata\n%s</string>
<string name="TAd_actionEditTask">Modifica</string>
<string name="TAd_contextCopyTask">Copia Attività</string>
<string name="TAd_contextDeleteTask">Elimina attività</string>
<string name="SSD_sort_drag">Ordinamento manuale con attività correlate</string>
<string name="SSD_sort_auto">Ordinamento Intelligente</string>
<string name="SSD_sort_alpha">Per Titotlo</string>

@ -38,7 +38,6 @@
<string name="TAd_completed">הסתיימה\n%s</string>
<string name="TAd_actionEditTask">עריכה</string>
<string name="TAd_contextCopyTask">העתק משימה</string>
<string name="TAd_contextDeleteTask">מַחֲקֵי משימה</string>
<string name="SSD_sort_drag">סידור ידני עם תתי-משימות</string>
<string name="SSD_sort_auto">מיון חכם</string>
<string name="SSD_sort_alpha">ע״פ כותרת</string>

@ -38,7 +38,6 @@
<string name="TAd_completed">%s\nに完了</string>
<string name="TAd_actionEditTask">編集する</string>
<string name="TAd_contextCopyTask">タスクをコピー</string>
<string name="TAd_contextDeleteTask">タスクを削除</string>
<string name="SSD_sort_drag">サブタスクの手動設定順</string>
<string name="SSD_sort_auto">自動</string>
<string name="SSD_sort_alpha">タイトル順</string>

@ -41,7 +41,6 @@
<string name="TAd_completed">일정 완료\n%s</string>
<string name="TAd_actionEditTask">편집</string>
<string name="TAd_contextCopyTask">일정 복사하기</string>
<string name="TAd_contextDeleteTask">일정 지우기</string>
<string name="SSD_sort_drag">수동 정렬 (하위일정 포함)</string>
<string name="SSD_sort_auto">Tasks 스마트 정렬</string>
<string name="SSD_sort_alpha">제목 순서</string>

@ -26,7 +26,6 @@
<string name="TAd_hiddenFormat">%s [skjult]</string>
<string name="TAd_actionEditTask">Rediger</string>
<string name="TAd_contextCopyTask">Kopier oppgave</string>
<string name="TAd_contextDeleteTask">Slett oppgave</string>
<string name="SSD_sort_auto">Tasks intelligent sortering</string>
<string name="SSD_sort_alpha">Etter tittel</string>
<string name="SSD_sort_due">Etter forfallsdato</string>

@ -38,7 +38,6 @@
<string name="TAd_completed">Afgerond\n%s</string>
<string name="TAd_actionEditTask">Bewerken</string>
<string name="TAd_contextCopyTask">Taak kopiëren</string>
<string name="TAd_contextDeleteTask">Taak wissen</string>
<string name="SSD_sort_drag">Handmatige volgorde met subtaken</string>
<string name="SSD_sort_auto">Slim Sorteren</string>
<string name="SSD_sort_alpha">Op titel</string>

@ -38,7 +38,6 @@
<string name="TAd_completed">Ukończono\n%s</string>
<string name="TAd_actionEditTask">Edytuj</string>
<string name="TAd_contextCopyTask">Kopiuj zadanie</string>
<string name="TAd_contextDeleteTask">Usuń zadanie</string>
<string name="SSD_sort_drag">Ręczne z podzadaniami</string>
<string name="SSD_sort_auto">Automatyczne</string>
<string name="SSD_sort_alpha">Wg tytułu</string>

@ -33,7 +33,6 @@
<string name="TAd_completed">Concluída\n%s</string>
<string name="TAd_actionEditTask">Editar</string>
<string name="TAd_contextCopyTask">Copiar tarefa</string>
<string name="TAd_contextDeleteTask">Excluir tarefa</string>
<string name="SSD_sort_drag">Ordem manual com subtarefas</string>
<string name="SSD_sort_auto">Ordenação inteligente Tasks</string>
<string name="SSD_sort_alpha">Por título</string>

@ -36,7 +36,6 @@
<string name="TAd_completed">Terminada\n%s</string>
<string name="TAd_actionEditTask">Editar</string>
<string name="TAd_contextCopyTask">Copiar tarefa</string>
<string name="TAd_contextDeleteTask">Eliminar tarefa</string>
<string name="SSD_sort_drag">Ordem manual com subtarefas</string>
<string name="SSD_sort_auto">Ordenação Inteligente Tasks</string>
<string name="SSD_sort_alpha">Por Título</string>

@ -38,7 +38,6 @@
<string name="TAd_completed">Завершено\n%s</string>
<string name="TAd_actionEditTask">Редактировать</string>
<string name="TAd_contextCopyTask">Копировать задачу</string>
<string name="TAd_contextDeleteTask">Удалить задачу</string>
<string name="SSD_sort_drag">Ручная сортировка с подзадачами</string>
<string name="SSD_sort_auto">Умная сортировка</string>
<string name="SSD_sort_alpha">По названию</string>

@ -33,7 +33,6 @@
<string name="TAd_completed">Dokončené\n%s</string>
<string name="TAd_actionEditTask">Upraviť</string>
<string name="TAd_contextCopyTask">Kopírovať úlohu</string>
<string name="TAd_contextDeleteTask">Vymazať úlohu</string>
<string name="SSD_sort_drag">Ručne alebo s pdúlohami</string>
<string name="SSD_sort_auto">Chytré triedenie</string>
<string name="SSD_sort_alpha">Podľa názvu</string>

@ -34,7 +34,6 @@
<string name="TAd_completed">Opravljen\n%s</string>
<string name="TAd_actionEditTask">Uredi</string>
<string name="TAd_contextCopyTask">Naredi kopijo opravka</string>
<string name="TAd_contextDeleteTask">Zbriši opravek</string>
<string name="SSD_sort_drag">Ročna nastavitev s podopravki</string>
<string name="SSD_sort_auto">Pametno razvrščanje</string>
<string name="SSD_sort_alpha">Po naslovu</string>

@ -38,7 +38,6 @@
<string name="TAd_completed">Avslutad\n%s</string>
<string name="TAd_actionEditTask">Redigera</string>
<string name="TAd_contextCopyTask">Kopiera uppgift</string>
<string name="TAd_contextDeleteTask">Radera uppgift</string>
<string name="SSD_sort_drag">Manuell sortering med underuppgifter</string>
<string name="SSD_sort_auto">Tasks intelligent sortering</string>
<string name="SSD_sort_alpha">Efter titel</string>

@ -30,7 +30,6 @@
<string name="TAd_completed">Bitti\n%s</string>
<string name="TAd_actionEditTask">Düzenle</string>
<string name="TAd_contextCopyTask">Görevi Kopyala</string>
<string name="TAd_contextDeleteTask">Görevi Sil</string>
<string name="SSD_sort_auto">Tasks Akıllı Sıralama</string>
<string name="SSD_sort_alpha">Başlığa göre</string>
<string name="SSD_sort_due">Bitiş Tarihine Göre</string>

@ -41,7 +41,6 @@
<string name="TAd_completed">Завершено\n%s</string>
<string name="TAd_actionEditTask">Редагувати</string>
<string name="TAd_contextCopyTask">Копіювати завдання</string>
<string name="TAd_contextDeleteTask">Видалити завдання</string>
<string name="SSD_sort_drag">Ручний порядок з підзадачами</string>
<string name="SSD_sort_auto">Розумне сортування</string>
<string name="SSD_sort_alpha">За назвою</string>

@ -35,7 +35,6 @@
<string name="TAd_completed">完成\n%s 项</string>
<string name="TAd_actionEditTask">编辑</string>
<string name="TAd_contextCopyTask">复制任务</string>
<string name="TAd_contextDeleteTask">删除任务</string>
<string name="SSD_sort_auto">清单小助理智能排序</string>
<string name="SSD_sort_alpha">按标题</string>
<string name="SSD_sort_due">按到期日</string>

@ -31,7 +31,6 @@
<string name="TAd_completed">%s\n完成</string>
<string name="TAd_actionEditTask">編輯</string>
<string name="TAd_contextCopyTask">複製任務工作</string>
<string name="TAd_contextDeleteTask">刪除任務工作</string>
<string name="SSD_sort_auto">Tasks智慧排序</string>
<string name="SSD_sort_alpha">依主旨</string>
<string name="SSD_sort_due">依到期日</string>

@ -114,9 +114,6 @@ File %1$s contained %2$s.\n\n
<!-- Context Item: copy task -->
<string name="TAd_contextCopyTask">Copy Task</string>
<!-- Context Item: delete task -->
<string name="TAd_contextDeleteTask">Delete Task</string>
<!-- ============================================== SortSelectionDialog == -->
<!-- Sort Selection: drag with subtasks -->
@ -713,6 +710,7 @@ File %1$s contained %2$s.\n\n
<string name="tag_settings">Tag Settings</string>
<string name="list_settings">List settings</string>
<string name="delete">Delete</string>
<string name="copy">Copy</string>
<string name="filter_settings">Filter Settings</string>
<string name="show_hidden">Show hidden</string>
<string name="show_completed">Show completed</string>

Loading…
Cancel
Save