New Undo system via a snackbar after swiping task

Correct text on confirmation dialog
Code cleanup
This commit is contained in:
2015-12-11 21:55:21 -05:00
parent f4f2ce6f73
commit ddf83fa1f4
5 changed files with 99 additions and 39 deletions

View File

@@ -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

View File

@@ -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,12 +253,61 @@ 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:
title = "Done";
break;
// Increase task cycle count
case ItemTouchHelper.RIGHT:
title = "Nexted";
task.setCycle(task.getCycle() + 1);
taskAdapter.add(task, taskAdapter.getItemCount());
break;
}
// 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
@@ -266,15 +316,13 @@ public class MainActivity extends AppCompatActivity implements
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);
taskDataAccess.increaseCycle(task.getCycle(), itemId);
break;
}
taskDataAccess.close();
}
}).show();
}
/**
* A {@link FragmentPagerAdapter} that returns a fragment corresponding to
* one of the sections/tabs/pages.

View File

@@ -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,7 +61,8 @@ 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)
// 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);

View File

@@ -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);

View File

@@ -38,6 +38,7 @@
<string name="task_swipe_confirmation_never">Never ask again</string>
<!-- Strings related to Settings -->
<string name="settings_confirm_message">Mark task as</string>
<string name="settings_confirm_donext">Confirm on DoNext?</string>
<string name="settings_confirm_markdone">Confirm on mark Done?</string>
<string name="settings_confirm_delete">Confirm on delete?</string>