mirror of
https://github.com/wismna/DoNext.git
synced 2025-10-03 15:40:14 -04:00
New Undo system via a snackbar after swiping task
Correct text on confirmation dialog Code cleanup
This commit is contained in:
@@ -22,13 +22,16 @@ public class TaskTouchHelper extends ItemTouchHelper.SimpleCallback {
|
|||||||
private TaskAdapter taskAdapter;
|
private TaskAdapter taskAdapter;
|
||||||
private TaskDataAccess taskDataAccess;
|
private TaskDataAccess taskDataAccess;
|
||||||
private FragmentManager fragmentManager;
|
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
|
// No drag moves, only swipes
|
||||||
super(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);
|
super(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);
|
||||||
this.taskAdapter = taskAdapter;
|
this.taskAdapter = taskAdapter;
|
||||||
this.taskDataAccess = taskDataAccess;
|
this.taskDataAccess = taskDataAccess;
|
||||||
this.fragmentManager = fragmentManager;
|
this.fragmentManager = fragmentManager;
|
||||||
|
this.recyclerView = recyclerView;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -40,33 +43,33 @@ public class TaskTouchHelper extends ItemTouchHelper.SimpleCallback {
|
|||||||
@Override
|
@Override
|
||||||
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
|
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
|
||||||
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(viewHolder.itemView.getContext());
|
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(viewHolder.itemView.getContext());
|
||||||
|
|
||||||
int itemPosition = viewHolder.getAdapterPosition();
|
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";
|
String title = "Confirm";
|
||||||
|
boolean showDialog = false;
|
||||||
|
|
||||||
switch (direction)
|
switch (direction)
|
||||||
{
|
{
|
||||||
// Mark item as Done
|
// Mark item as Done
|
||||||
case ItemTouchHelper.LEFT:
|
case ItemTouchHelper.LEFT:
|
||||||
boolean prefConfDone = sharedPref.getBoolean("pref_conf_done", true);
|
|
||||||
title = "Done";
|
title = "Done";
|
||||||
if (prefConfDone) confirmDialogFragment.show(fragmentManager, title);
|
showDialog = sharedPref.getBoolean("pref_conf_done", true);
|
||||||
else MainActivity.PerformSwipe(taskDataAccess, taskAdapter, itemPosition, direction);
|
|
||||||
break;
|
break;
|
||||||
// Increase task cycle count
|
// Increase task cycle count
|
||||||
case ItemTouchHelper.RIGHT:
|
case ItemTouchHelper.RIGHT:
|
||||||
title = "Next";
|
title = "Next";
|
||||||
boolean prefConfNext = sharedPref.getBoolean("pref_conf_next", true);
|
showDialog = sharedPref.getBoolean("pref_conf_next", true);
|
||||||
if (prefConfNext) confirmDialogFragment.show(fragmentManager, title);
|
|
||||||
else MainActivity.PerformSwipe(taskDataAccess, taskAdapter, itemPosition, direction);
|
|
||||||
break;
|
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
|
@Override
|
||||||
|
@@ -6,6 +6,7 @@ import android.content.Intent;
|
|||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
|
import android.support.design.widget.Snackbar;
|
||||||
import android.support.design.widget.TabLayout;
|
import android.support.design.widget.TabLayout;
|
||||||
import android.support.v4.app.Fragment;
|
import android.support.v4.app.Fragment;
|
||||||
import android.support.v4.app.FragmentManager;
|
import android.support.v4.app.FragmentManager;
|
||||||
@@ -201,7 +202,7 @@ public class MainActivity extends AppCompatActivity implements
|
|||||||
int direction = args.getInt("Direction");
|
int direction = args.getInt("Direction");
|
||||||
|
|
||||||
TaskAdapter taskAdapter = ((ConfirmDialogFragment)dialog).getTaskAdapter();
|
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);
|
editor.putBoolean("pref_conf_next", false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
editor.commit();
|
editor.apply();
|
||||||
TaskAdapter taskAdapter = ((ConfirmDialogFragment)dialog).getTaskAdapter();
|
TaskAdapter taskAdapter = ((ConfirmDialogFragment)dialog).getTaskAdapter();
|
||||||
PerformSwipe(taskDataAccess, taskAdapter, itemPosition, direction);
|
PerformSwipeAction(taskDataAccess, taskAdapter, itemPosition, direction, ((ConfirmDialogFragment) dialog).getRecyclerView());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -252,28 +253,75 @@ public class MainActivity extends AppCompatActivity implements
|
|||||||
newTaskFragment.show(manager, "Create new task");
|
newTaskFragment.show(manager, "Create new task");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void PerformSwipe(TaskDataAccess taskDataAccess, TaskAdapter taskAdapter, int itemPosition, int direction) {
|
public static void PerformSwipeAction(final TaskDataAccess taskDataAccess,
|
||||||
long itemId = taskAdapter.getItemId(itemPosition);
|
final TaskAdapter taskAdapter,
|
||||||
taskDataAccess.open();
|
final int itemPosition,
|
||||||
Task task = taskAdapter.getItem(itemPosition);
|
final int direction,
|
||||||
|
final View view) {
|
||||||
|
final long itemId = taskAdapter.getItemId(itemPosition);
|
||||||
|
final Task task = taskAdapter.getItem(itemPosition);
|
||||||
|
String title = "";
|
||||||
taskAdapter.remove(itemPosition);
|
taskAdapter.remove(itemPosition);
|
||||||
|
|
||||||
switch (direction)
|
switch (direction)
|
||||||
{
|
{
|
||||||
// Mark item as Done
|
// Mark item as Done
|
||||||
case ItemTouchHelper.LEFT:
|
case ItemTouchHelper.LEFT:
|
||||||
taskDataAccess.setDone(itemId);
|
title = "Done";
|
||||||
break;
|
break;
|
||||||
// Increase task cycle count
|
// Increase task cycle count
|
||||||
case ItemTouchHelper.RIGHT:
|
case ItemTouchHelper.RIGHT:
|
||||||
int cycle = task.getCycle();
|
title = "Nexted";
|
||||||
taskDataAccess.increaseCycle(cycle, itemId);
|
task.setCycle(task.getCycle() + 1);
|
||||||
task.setCycle(cycle + 1);
|
taskAdapter.add(task, taskAdapter.getItemCount());
|
||||||
int lastPosition = taskAdapter.getItemCount();
|
|
||||||
taskAdapter.add(task, lastPosition);
|
|
||||||
break;
|
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
|
* A {@link FragmentPagerAdapter} that returns a fragment corresponding to
|
||||||
|
@@ -6,6 +6,7 @@ import android.content.DialogInterface;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v4.app.DialogFragment;
|
import android.support.v4.app.DialogFragment;
|
||||||
import android.support.v7.app.AlertDialog;
|
import android.support.v7.app.AlertDialog;
|
||||||
|
import android.support.v7.widget.RecyclerView;
|
||||||
|
|
||||||
import com.wismna.geoffroy.donext.R;
|
import com.wismna.geoffroy.donext.R;
|
||||||
import com.wismna.geoffroy.donext.adapters.TaskAdapter;
|
import com.wismna.geoffroy.donext.adapters.TaskAdapter;
|
||||||
@@ -18,15 +19,19 @@ public class ConfirmDialogFragment extends DialogFragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private ConfirmDialogListener confirmDialogListener;
|
private ConfirmDialogListener confirmDialogListener;
|
||||||
|
|
||||||
private TaskAdapter taskAdapter;
|
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();
|
Bundle args = new Bundle();
|
||||||
|
|
||||||
ConfirmDialogFragment fragment = new ConfirmDialogFragment();
|
ConfirmDialogFragment fragment = new ConfirmDialogFragment();
|
||||||
fragment.taskAdapter = taskAdapter;
|
fragment.taskAdapter = taskAdapter;
|
||||||
|
fragment.message = message;
|
||||||
|
fragment.recyclerView = recyclerView;
|
||||||
fragment.setArguments(args);
|
fragment.setArguments(args);
|
||||||
return fragment;
|
return fragment;
|
||||||
}
|
}
|
||||||
@@ -34,8 +39,9 @@ public class ConfirmDialogFragment extends DialogFragment {
|
|||||||
public TaskAdapter getTaskAdapter() {
|
public TaskAdapter getTaskAdapter() {
|
||||||
return taskAdapter;
|
return taskAdapter;
|
||||||
}
|
}
|
||||||
public void setTaskAdapter(TaskAdapter taskAdapter) {
|
|
||||||
this.taskAdapter = taskAdapter;
|
public RecyclerView getRecyclerView() {
|
||||||
|
return recyclerView;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -55,11 +61,12 @@ public class ConfirmDialogFragment extends DialogFragment {
|
|||||||
@Override
|
@Override
|
||||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||||
builder.setMessage(R.string.task_swipe_confirmation_done)
|
// TODO: Handle on dismiss or similar
|
||||||
.setPositiveButton(R.string.task_swipe_confirmation_yes, new DialogInterface.OnClickListener() {
|
builder.setMessage(getResources().getString(R.string.settings_confirm_message) + " " + message + "?")
|
||||||
public void onClick(DialogInterface dialog, int id) {
|
.setPositiveButton(R.string.task_swipe_confirmation_yes, new DialogInterface.OnClickListener() {
|
||||||
confirmDialogListener.onDialogPositiveClick(ConfirmDialogFragment.this);
|
public void onClick(DialogInterface dialog, int id) {
|
||||||
}
|
confirmDialogListener.onDialogPositiveClick(ConfirmDialogFragment.this);
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.setNegativeButton(R.string.task_swipe_confirmation_no, new DialogInterface.OnClickListener() {
|
.setNegativeButton(R.string.task_swipe_confirmation_no, new DialogInterface.OnClickListener() {
|
||||||
public void onClick(DialogInterface dialog, int id) {
|
public void onClick(DialogInterface dialog, int id) {
|
||||||
|
@@ -85,7 +85,8 @@ public class TasksFragment extends Fragment {
|
|||||||
|
|
||||||
// Set ItemTouch helper in RecyclerView to handle swipe move on elements
|
// Set ItemTouch helper in RecyclerView to handle swipe move on elements
|
||||||
// TODO: conflicts with ItemTouchListener, see why
|
// 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);
|
ItemTouchHelper helper = new ItemTouchHelper(callback);
|
||||||
helper.attachToRecyclerView(recyclerView);
|
helper.attachToRecyclerView(recyclerView);
|
||||||
|
|
||||||
|
@@ -38,6 +38,7 @@
|
|||||||
<string name="task_swipe_confirmation_never">Never ask again</string>
|
<string name="task_swipe_confirmation_never">Never ask again</string>
|
||||||
|
|
||||||
<!-- Strings related to Settings -->
|
<!-- 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_donext">Confirm on DoNext?</string>
|
||||||
<string name="settings_confirm_markdone">Confirm on mark Done?</string>
|
<string name="settings_confirm_markdone">Confirm on mark Done?</string>
|
||||||
<string name="settings_confirm_delete">Confirm on delete?</string>
|
<string name="settings_confirm_delete">Confirm on delete?</string>
|
||||||
|
Reference in New Issue
Block a user