From ddf83fa1f460af5e2b2b7fabddc69a38d4aee781 Mon Sep 17 00:00:00 2001 From: geoffroy Date: Fri, 11 Dec 2015 21:55:21 -0500 Subject: [PATCH] New Undo system via a snackbar after swiping task Correct text on confirmation dialog Code cleanup --- .../ItemTouchHelpers/TaskTouchHelper.java | 33 ++++---- .../donext/activities/MainActivity.java | 76 +++++++++++++++---- .../fragments/ConfirmDialogFragment.java | 25 +++--- .../donext/fragments/TasksFragment.java | 3 +- DoNExt/app/src/main/res/values/strings.xml | 1 + 5 files changed, 99 insertions(+), 39 deletions(-) diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/ItemTouchHelpers/TaskTouchHelper.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/ItemTouchHelpers/TaskTouchHelper.java index f9c534d..bda024d 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/ItemTouchHelpers/TaskTouchHelper.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/ItemTouchHelpers/TaskTouchHelper.java @@ -22,13 +22,16 @@ public class TaskTouchHelper extends ItemTouchHelper.SimpleCallback { private TaskAdapter taskAdapter; private TaskDataAccess taskDataAccess; private FragmentManager fragmentManager; + private RecyclerView recyclerView; - public TaskTouchHelper(TaskAdapter taskAdapter, TaskDataAccess taskDataAccess, FragmentManager fragmentManager){ + public TaskTouchHelper(TaskAdapter taskAdapter, TaskDataAccess taskDataAccess, + FragmentManager fragmentManager, RecyclerView recyclerView){ // No drag moves, only swipes super(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT); this.taskAdapter = taskAdapter; this.taskDataAccess = taskDataAccess; this.fragmentManager = fragmentManager; + this.recyclerView = recyclerView; } @Override @@ -40,33 +43,33 @@ public class TaskTouchHelper extends ItemTouchHelper.SimpleCallback { @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(viewHolder.itemView.getContext()); - int itemPosition = viewHolder.getAdapterPosition(); - - ConfirmDialogFragment confirmDialogFragment = ConfirmDialogFragment.newInstance(taskAdapter); - Bundle args = new Bundle(); - args.putInt("ItemPosition", itemPosition); - args.putInt("Direction", direction); - confirmDialogFragment.setArguments(args); - String title = "Confirm"; + boolean showDialog = false; + switch (direction) { // Mark item as Done case ItemTouchHelper.LEFT: - boolean prefConfDone = sharedPref.getBoolean("pref_conf_done", true); title = "Done"; - if (prefConfDone) confirmDialogFragment.show(fragmentManager, title); - else MainActivity.PerformSwipe(taskDataAccess, taskAdapter, itemPosition, direction); + showDialog = sharedPref.getBoolean("pref_conf_done", true); break; // Increase task cycle count case ItemTouchHelper.RIGHT: title = "Next"; - boolean prefConfNext = sharedPref.getBoolean("pref_conf_next", true); - if (prefConfNext) confirmDialogFragment.show(fragmentManager, title); - else MainActivity.PerformSwipe(taskDataAccess, taskAdapter, itemPosition, direction); + showDialog = sharedPref.getBoolean("pref_conf_next", true); break; } + if (showDialog) { + ConfirmDialogFragment confirmDialogFragment = + ConfirmDialogFragment.newInstance(taskAdapter, title, recyclerView); + Bundle args = new Bundle(); + args.putInt("ItemPosition", itemPosition); + args.putInt("Direction", direction); + confirmDialogFragment.setArguments(args); + confirmDialogFragment.show(fragmentManager, title); + } + else MainActivity.PerformSwipeAction(taskDataAccess, taskAdapter, itemPosition, direction, recyclerView); } @Override diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/MainActivity.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/MainActivity.java index e891d20..14e3d43 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/MainActivity.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/MainActivity.java @@ -6,6 +6,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; +import android.support.design.widget.Snackbar; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; @@ -201,7 +202,7 @@ public class MainActivity extends AppCompatActivity implements int direction = args.getInt("Direction"); TaskAdapter taskAdapter = ((ConfirmDialogFragment)dialog).getTaskAdapter(); - PerformSwipe(taskDataAccess, taskAdapter, itemPosition, direction); + PerformSwipeAction(taskDataAccess, taskAdapter, itemPosition, direction, ((ConfirmDialogFragment) dialog).getRecyclerView()); } @@ -226,9 +227,9 @@ public class MainActivity extends AppCompatActivity implements editor.putBoolean("pref_conf_next", false); break; } - editor.commit(); + editor.apply(); TaskAdapter taskAdapter = ((ConfirmDialogFragment)dialog).getTaskAdapter(); - PerformSwipe(taskDataAccess, taskAdapter, itemPosition, direction); + PerformSwipeAction(taskDataAccess, taskAdapter, itemPosition, direction, ((ConfirmDialogFragment) dialog).getRecyclerView()); } @Override @@ -252,28 +253,75 @@ public class MainActivity extends AppCompatActivity implements newTaskFragment.show(manager, "Create new task"); } - public static void PerformSwipe(TaskDataAccess taskDataAccess, TaskAdapter taskAdapter, int itemPosition, int direction) { - long itemId = taskAdapter.getItemId(itemPosition); - taskDataAccess.open(); - Task task = taskAdapter.getItem(itemPosition); + public static void PerformSwipeAction(final TaskDataAccess taskDataAccess, + final TaskAdapter taskAdapter, + final int itemPosition, + final int direction, + final View view) { + final long itemId = taskAdapter.getItemId(itemPosition); + final Task task = taskAdapter.getItem(itemPosition); + String title = ""; taskAdapter.remove(itemPosition); switch (direction) { // Mark item as Done case ItemTouchHelper.LEFT: - taskDataAccess.setDone(itemId); + title = "Done"; break; // Increase task cycle count case ItemTouchHelper.RIGHT: - int cycle = task.getCycle(); - taskDataAccess.increaseCycle(cycle, itemId); - task.setCycle(cycle + 1); - int lastPosition = taskAdapter.getItemCount(); - taskAdapter.add(task, lastPosition); + title = "Nexted"; + task.setCycle(task.getCycle() + 1); + taskAdapter.add(task, taskAdapter.getItemCount()); break; } - taskDataAccess.close(); + + // Setup the snack bar + Snackbar.make(view, "Task marked as " + title, Snackbar.LENGTH_LONG) + .setAction("Undo", new View.OnClickListener() { + @Override + public void onClick(View v) { + // Undo adapter changes + switch (direction) + { + // Nothing special to do yet + case ItemTouchHelper.LEFT: + break; + // Remove the last item + case ItemTouchHelper.RIGHT: + taskAdapter.remove(taskAdapter.getItemCount() - 1); + task.setCycle(task.getCycle() - 1); + break; + } + // Reset the first item + taskAdapter.add(task, 0); + ((RecyclerView)view).scrollToPosition(0); + } + }).setCallback(new Snackbar.Callback() { + @Override + public void onDismissed(Snackbar snackbar, int event) { + super.onDismissed(snackbar, event); + + // When clicked on undo, do not write to DB + if (event == DISMISS_EVENT_ACTION) return; + + taskDataAccess.open(); + // Commit the changes to DB + switch (direction) + { + // Mark item as Done + case ItemTouchHelper.LEFT: + taskDataAccess.setDone(itemId); + break; + // Increase task cycle count + case ItemTouchHelper.RIGHT: + taskDataAccess.increaseCycle(task.getCycle(), itemId); + break; + } + taskDataAccess.close(); + } + }).show(); } /** * A {@link FragmentPagerAdapter} that returns a fragment corresponding to diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/ConfirmDialogFragment.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/ConfirmDialogFragment.java index 907a02e..bfea945 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/ConfirmDialogFragment.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/ConfirmDialogFragment.java @@ -6,6 +6,7 @@ import android.content.DialogInterface; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.support.v7.app.AlertDialog; +import android.support.v7.widget.RecyclerView; import com.wismna.geoffroy.donext.R; import com.wismna.geoffroy.donext.adapters.TaskAdapter; @@ -18,15 +19,19 @@ public class ConfirmDialogFragment extends DialogFragment { } private ConfirmDialogListener confirmDialogListener; - private TaskAdapter taskAdapter; + private RecyclerView recyclerView; + private String message; - public static ConfirmDialogFragment newInstance(TaskAdapter taskAdapter) { + public static ConfirmDialogFragment newInstance( + TaskAdapter taskAdapter, String message, RecyclerView recyclerView) { Bundle args = new Bundle(); ConfirmDialogFragment fragment = new ConfirmDialogFragment(); fragment.taskAdapter = taskAdapter; + fragment.message = message; + fragment.recyclerView = recyclerView; fragment.setArguments(args); return fragment; } @@ -34,8 +39,9 @@ public class ConfirmDialogFragment extends DialogFragment { public TaskAdapter getTaskAdapter() { return taskAdapter; } - public void setTaskAdapter(TaskAdapter taskAdapter) { - this.taskAdapter = taskAdapter; + + public RecyclerView getRecyclerView() { + return recyclerView; } @Override @@ -55,11 +61,12 @@ public class ConfirmDialogFragment extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - builder.setMessage(R.string.task_swipe_confirmation_done) - .setPositiveButton(R.string.task_swipe_confirmation_yes, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - confirmDialogListener.onDialogPositiveClick(ConfirmDialogFragment.this); - } + // TODO: Handle on dismiss or similar + builder.setMessage(getResources().getString(R.string.settings_confirm_message) + " " + message + "?") + .setPositiveButton(R.string.task_swipe_confirmation_yes, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + confirmDialogListener.onDialogPositiveClick(ConfirmDialogFragment.this); + } }) .setNegativeButton(R.string.task_swipe_confirmation_no, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TasksFragment.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TasksFragment.java index 631950d..a61304e 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TasksFragment.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TasksFragment.java @@ -85,7 +85,8 @@ public class TasksFragment extends Fragment { // Set ItemTouch helper in RecyclerView to handle swipe move on elements // TODO: conflicts with ItemTouchListener, see why - ItemTouchHelper.Callback callback = new TaskTouchHelper(taskAdapter, taskDataAccess, getFragmentManager()); + ItemTouchHelper.Callback callback = new TaskTouchHelper( + taskAdapter, taskDataAccess, getFragmentManager(), recyclerView); ItemTouchHelper helper = new ItemTouchHelper(callback); helper.attachToRecyclerView(recyclerView); diff --git a/DoNExt/app/src/main/res/values/strings.xml b/DoNExt/app/src/main/res/values/strings.xml index 12ae1ba..8e7edce 100644 --- a/DoNExt/app/src/main/res/values/strings.xml +++ b/DoNExt/app/src/main/res/values/strings.xml @@ -38,6 +38,7 @@ Never ask again + Mark task as Confirm on DoNext? Confirm on mark Done? Confirm on delete?