mirror of
https://github.com/wismna/DoNext.git
synced 2025-10-03 07:30:13 -04:00
Greatly improved code with interfaces
Task and cycle count are now updating List edition rendering is better List names can be edited inline
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
package com.wismna.geoffroy.donext.ItemTouchHelpers;
|
||||
|
||||
import android.graphics.Color;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.support.v7.widget.helper.ItemTouchHelper;
|
||||
|
||||
@@ -34,4 +35,22 @@ public class TaskListTouchHelper extends ItemTouchHelper.SimpleCallback {
|
||||
public boolean isLongPressDragEnabled() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
|
||||
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE)
|
||||
{
|
||||
viewHolder.itemView.setBackgroundColor(Color.LTGRAY);
|
||||
}
|
||||
|
||||
super.onSelectedChanged(viewHolder, actionState);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
|
||||
super.clearView(recyclerView, viewHolder);
|
||||
|
||||
viewHolder.itemView.setAlpha(1.0f);
|
||||
viewHolder.itemView.setBackgroundColor(0);
|
||||
}
|
||||
}
|
||||
|
@@ -1,38 +1,27 @@
|
||||
package com.wismna.geoffroy.donext.ItemTouchHelpers;
|
||||
|
||||
import android.content.SharedPreferences;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Paint;
|
||||
import android.os.Bundle;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.support.v4.app.FragmentManager;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.support.v7.widget.helper.ItemTouchHelper;
|
||||
import android.view.View;
|
||||
|
||||
import com.wismna.geoffroy.donext.activities.MainActivity;
|
||||
import com.wismna.geoffroy.donext.adapters.TaskRecyclerViewAdapter;
|
||||
import com.wismna.geoffroy.donext.database.TaskDataAccess;
|
||||
import com.wismna.geoffroy.donext.fragments.ConfirmDialogFragment;
|
||||
|
||||
/**
|
||||
* Created by geoffroy on 15-12-04.
|
||||
* Helper class that handles all swipe events on a Task
|
||||
*/
|
||||
public class TaskTouchHelper extends ItemTouchHelper.SimpleCallback {
|
||||
private TaskRecyclerViewAdapter taskRecyclerViewAdapter;
|
||||
private TaskDataAccess taskDataAccess;
|
||||
private FragmentManager fragmentManager;
|
||||
private RecyclerView recyclerView;
|
||||
public interface TaskTouchHelperAdapter {
|
||||
void onItemSwiped(int position, int direction);
|
||||
}
|
||||
|
||||
public TaskTouchHelper(TaskRecyclerViewAdapter taskRecyclerViewAdapter, TaskDataAccess taskDataAccess,
|
||||
FragmentManager fragmentManager, RecyclerView recyclerView){
|
||||
private TaskTouchHelperAdapter mAdapter;
|
||||
|
||||
public TaskTouchHelper(TaskTouchHelperAdapter adapter){
|
||||
// No drag moves, only left swipes (except for 1st element, see getSwipeDirs method)
|
||||
super(0, ItemTouchHelper.LEFT);
|
||||
this.taskRecyclerViewAdapter = taskRecyclerViewAdapter;
|
||||
this.taskDataAccess = taskDataAccess;
|
||||
this.fragmentManager = fragmentManager;
|
||||
this.recyclerView = recyclerView;
|
||||
this.mAdapter = adapter;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -50,34 +39,7 @@ 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();
|
||||
String title = "";
|
||||
boolean showDialog = false;
|
||||
|
||||
switch (direction)
|
||||
{
|
||||
// Mark item as Done
|
||||
case ItemTouchHelper.LEFT:
|
||||
title = "Mark task as done?";
|
||||
showDialog = sharedPref.getBoolean("pref_conf_done", true);
|
||||
break;
|
||||
// Increase task cycle count
|
||||
case ItemTouchHelper.RIGHT:
|
||||
title = "Go to next task?";
|
||||
showDialog = sharedPref.getBoolean("pref_conf_next", true);
|
||||
break;
|
||||
}
|
||||
if (showDialog) {
|
||||
ConfirmDialogFragment confirmDialogFragment =
|
||||
ConfirmDialogFragment.newInstance(/*taskRecyclerViewAdapter, */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, taskRecyclerViewAdapter, itemPosition, direction, recyclerView);
|
||||
mAdapter.onItemSwiped(viewHolder.getAdapterPosition(), direction);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -107,4 +69,22 @@ public class TaskTouchHelper extends ItemTouchHelper.SimpleCallback {
|
||||
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
|
||||
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE)
|
||||
{
|
||||
viewHolder.itemView.setBackgroundColor(Color.LTGRAY);
|
||||
}
|
||||
|
||||
super.onSelectedChanged(viewHolder, actionState);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
|
||||
super.clearView(recyclerView, viewHolder);
|
||||
|
||||
viewHolder.itemView.setAlpha(1.0f);
|
||||
viewHolder.itemView.setBackgroundColor(0);
|
||||
}
|
||||
}
|
||||
|
@@ -1,14 +1,9 @@
|
||||
package com.wismna.geoffroy.donext.activities;
|
||||
|
||||
import android.app.Dialog;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Bundle;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.support.design.widget.FloatingActionButton;
|
||||
import android.support.design.widget.Snackbar;
|
||||
import android.support.design.widget.TabLayout;
|
||||
import android.support.v4.app.DialogFragment;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.app.FragmentManager;
|
||||
import android.support.v4.app.FragmentPagerAdapter;
|
||||
@@ -16,34 +11,23 @@ import android.support.v4.view.ViewPager;
|
||||
import android.support.v7.app.AppCompatActivity;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
import android.support.v7.widget.helper.ItemTouchHelper;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.EditText;
|
||||
import android.widget.RadioButton;
|
||||
import android.widget.RadioGroup;
|
||||
import android.widget.Spinner;
|
||||
|
||||
import com.wismna.geoffroy.donext.R;
|
||||
import com.wismna.geoffroy.donext.adapters.SmartFragmentStatePagerAdapter;
|
||||
import com.wismna.geoffroy.donext.adapters.TaskRecyclerViewAdapter;
|
||||
import com.wismna.geoffroy.donext.dao.Task;
|
||||
import com.wismna.geoffroy.donext.dao.TaskList;
|
||||
import com.wismna.geoffroy.donext.database.TaskDataAccess;
|
||||
import com.wismna.geoffroy.donext.database.TaskListDataAccess;
|
||||
import com.wismna.geoffroy.donext.fragments.ConfirmDialogFragment;
|
||||
import com.wismna.geoffroy.donext.fragments.TaskDialogFragment;
|
||||
import com.wismna.geoffroy.donext.fragments.TasksFragment;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class MainActivity extends AppCompatActivity implements
|
||||
TaskDialogFragment.NewTaskListener,
|
||||
ConfirmDialogFragment.ConfirmDialogListener
|
||||
{
|
||||
public class MainActivity extends AppCompatActivity implements TasksFragment.TaskChangedAdapter {
|
||||
|
||||
protected TaskDataAccess taskDataAccess;
|
||||
/**
|
||||
* The {@link android.support.v4.view.PagerAdapter} that will provide
|
||||
* fragments for each of the sections. We use a
|
||||
@@ -71,10 +55,6 @@ public class MainActivity extends AppCompatActivity implements
|
||||
// primary sections of the activity.
|
||||
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
|
||||
|
||||
// Access database to retrieve tasks
|
||||
taskDataAccess = new TaskDataAccess(this);
|
||||
taskDataAccess.open();
|
||||
|
||||
// Access database to retrieve Tabs
|
||||
TaskListDataAccess taskListDataAccess = new TaskListDataAccess(this);
|
||||
taskListDataAccess.open();
|
||||
@@ -115,107 +95,22 @@ public class MainActivity extends AppCompatActivity implements
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
taskDataAccess.open();
|
||||
super.onResume();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
taskDataAccess.close();
|
||||
super.onPause();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
taskDataAccess.close();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNewTaskDialogPositiveClick(DialogFragment dialog) {
|
||||
// Get the dialog fragment
|
||||
Dialog dialogView = dialog.getDialog();
|
||||
long id = 0;
|
||||
Task task = ((TaskDialogFragment)dialog).getTask();
|
||||
if (task != null) id = task.getId();
|
||||
|
||||
// Get the controls
|
||||
Spinner listSpinner = (Spinner) dialogView.findViewById(R.id.new_task_list);
|
||||
EditText nameText = (EditText) dialogView.findViewById(R.id.new_task_name);
|
||||
EditText descText = (EditText) dialogView.findViewById(R.id.new_task_description);
|
||||
RadioGroup priorityGroup = (RadioGroup) dialogView.findViewById(R.id.new_task_priority);
|
||||
RadioButton priorityRadio = (RadioButton) dialogView.findViewById(priorityGroup.getCheckedRadioButtonId());
|
||||
TaskList taskList = (TaskList) listSpinner.getSelectedItem();
|
||||
|
||||
// Add the task to the database
|
||||
taskDataAccess.open();
|
||||
Task newTask = taskDataAccess.createOrUpdateTask(id,
|
||||
nameText.getText().toString(),
|
||||
descText.getText().toString(),
|
||||
priorityRadio.getText().toString(),
|
||||
taskList.getId());
|
||||
taskDataAccess.close();
|
||||
// Update the corresponding tab adapter
|
||||
|
||||
Bundle args = dialog.getArguments();
|
||||
TaskRecyclerViewAdapter taskRecyclerViewAdapter = getSpecificTabAdapter(args.getInt("list"));
|
||||
// Should never happen because we will have to be on this tab to open the dialog
|
||||
if (taskRecyclerViewAdapter == null) return;
|
||||
|
||||
// Add the task
|
||||
if (task == null)
|
||||
taskRecyclerViewAdapter.add(newTask, taskRecyclerViewAdapter.getItemCount());
|
||||
// Update the task
|
||||
else {
|
||||
int position = args.getInt("position");
|
||||
// Check if task list was changed
|
||||
if (task.getTaskListId() != taskList.getId())
|
||||
{
|
||||
// Remove item from current tab
|
||||
taskRecyclerViewAdapter.remove(position);
|
||||
|
||||
// Add it to the corresponding tab provided it is already instanciated
|
||||
TaskRecyclerViewAdapter destinationTaskAdapter = getSpecificTabAdapter(listSpinner.getSelectedItemPosition());
|
||||
if (destinationTaskAdapter != null) destinationTaskAdapter.add(newTask, destinationTaskAdapter.getItemCount());
|
||||
}
|
||||
else taskRecyclerViewAdapter.update(newTask, position);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNewTaskDialogNeutralClick(DialogFragment dialog) {
|
||||
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
String title = getResources().getString(R.string.task_confirmation_delete_text);
|
||||
boolean showDialog = sharedPref.getBoolean("pref_conf_del", true);
|
||||
Bundle args = dialog.getArguments();
|
||||
|
||||
// Delete task from Adapter
|
||||
final int itemPosition = args.getInt("position");
|
||||
final RecyclerView view = getSpecificTabRecyclerView(args.getInt("list"));
|
||||
final TaskRecyclerViewAdapter taskRecyclerViewAdapter = (TaskRecyclerViewAdapter) view.getAdapter();
|
||||
|
||||
if (showDialog) {
|
||||
ConfirmDialogFragment confirmDialogFragment =
|
||||
ConfirmDialogFragment.newInstance(title, view);
|
||||
Bundle confirmArgs = new Bundle();
|
||||
confirmArgs.putInt("ItemPosition", itemPosition);
|
||||
confirmArgs.putInt("Direction", -1);
|
||||
confirmDialogFragment.setArguments(confirmArgs);
|
||||
confirmDialogFragment.show(getSupportFragmentManager(), title);
|
||||
}
|
||||
else PerformSwipeAction(taskDataAccess, taskRecyclerViewAdapter, itemPosition, -1, view);
|
||||
public void onTaskListChanged(Task task, int tabPosition) {
|
||||
TaskRecyclerViewAdapter destinationTaskAdapter = getSpecificTabAdapter(tabPosition);
|
||||
if (destinationTaskAdapter != null) destinationTaskAdapter.add(task, destinationTaskAdapter.getItemCount());
|
||||
}
|
||||
|
||||
/** Called when user clicks on the New Task floating button */
|
||||
public void onNewTaskClick(View view) {
|
||||
int currentTabPosition = mViewPager.getCurrentItem();
|
||||
FragmentManager manager = getSupportFragmentManager();
|
||||
TaskDialogFragment taskDialogFragment = TaskDialogFragment.newInstance(null,
|
||||
mSectionsPagerAdapter.getAllItems());
|
||||
mSectionsPagerAdapter.getAllItems(),
|
||||
(TasksFragment) mSectionsPagerAdapter.getRegisteredFragment(currentTabPosition));
|
||||
|
||||
// Set current tab value to new task dialog
|
||||
Bundle args = new Bundle();
|
||||
args.putInt("list", mViewPager.getCurrentItem());
|
||||
args.putInt("list", currentTabPosition);
|
||||
taskDialogFragment.setArguments(args);
|
||||
|
||||
taskDialogFragment.show(manager, "Create new task");
|
||||
@@ -232,136 +127,14 @@ public class MainActivity extends AppCompatActivity implements
|
||||
startActivity(intent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfirmDialogPositiveClick(DialogFragment dialog) {
|
||||
Bundle args = dialog.getArguments();
|
||||
int itemPosition = args.getInt("ItemPosition");
|
||||
int direction = args.getInt("Direction");
|
||||
|
||||
TaskRecyclerViewAdapter taskRecyclerViewAdapter = ((ConfirmDialogFragment)dialog).getTaskRecyclerViewAdapter();
|
||||
PerformSwipeAction(taskDataAccess, taskRecyclerViewAdapter, itemPosition, direction, ((ConfirmDialogFragment) dialog).getRecyclerView());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfirmDialogNeutralClick(DialogFragment dialog) {
|
||||
Bundle args = dialog.getArguments();
|
||||
int itemPosition = args.getInt("ItemPosition");
|
||||
int direction = args.getInt("Direction");
|
||||
|
||||
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
SharedPreferences.Editor editor = sharedPref.edit();
|
||||
|
||||
switch (direction)
|
||||
{
|
||||
// Mark item as Done
|
||||
case ItemTouchHelper.LEFT:
|
||||
editor.putBoolean("pref_conf_done", false);
|
||||
break;
|
||||
// Increase task cycle count
|
||||
case ItemTouchHelper.RIGHT:
|
||||
editor.putBoolean("pref_conf_next", false);
|
||||
break;
|
||||
case -1:
|
||||
editor.putBoolean("pref_conf_del", false);
|
||||
break;
|
||||
}
|
||||
editor.apply();
|
||||
TaskRecyclerViewAdapter taskRecyclerViewAdapter = ((ConfirmDialogFragment)dialog).getTaskRecyclerViewAdapter();
|
||||
PerformSwipeAction(taskDataAccess, taskRecyclerViewAdapter, itemPosition, direction, ((ConfirmDialogFragment) dialog).getRecyclerView());
|
||||
}
|
||||
|
||||
public static void PerformSwipeAction(final TaskDataAccess taskDataAccess,
|
||||
final TaskRecyclerViewAdapter taskRecyclerViewAdapter,
|
||||
final int itemPosition,
|
||||
final int direction,
|
||||
final View view) {
|
||||
final long itemId = taskRecyclerViewAdapter.getItemId(itemPosition);
|
||||
final Task task = taskRecyclerViewAdapter.getItem(itemPosition);
|
||||
String action = "";
|
||||
taskRecyclerViewAdapter.remove(itemPosition);
|
||||
|
||||
switch (direction)
|
||||
{
|
||||
// Mark item as Done
|
||||
case ItemTouchHelper.LEFT:
|
||||
action = "done";
|
||||
break;
|
||||
// Increase task cycle count
|
||||
case ItemTouchHelper.RIGHT:
|
||||
action = "nexted";
|
||||
task.setCycle(task.getCycle() + 1);
|
||||
taskRecyclerViewAdapter.add(task, taskRecyclerViewAdapter.getItemCount());
|
||||
break;
|
||||
case -1:
|
||||
action = "deleted";
|
||||
break;
|
||||
}
|
||||
|
||||
// Setup the snack bar
|
||||
Snackbar.make(view, "Task " + action, Snackbar.LENGTH_LONG)
|
||||
.setAction("Undo", new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
// Undo adapter changes
|
||||
switch (direction)
|
||||
{
|
||||
// Nothing special to do for done
|
||||
case ItemTouchHelper.LEFT:
|
||||
break;
|
||||
// Remove the last item
|
||||
case ItemTouchHelper.RIGHT:
|
||||
taskRecyclerViewAdapter.remove(taskRecyclerViewAdapter.getItemCount() - 1);
|
||||
task.setCycle(task.getCycle() - 1);
|
||||
break;
|
||||
// Nothing special to do for delete
|
||||
case -1:
|
||||
break;
|
||||
}
|
||||
// Reset the first item
|
||||
taskRecyclerViewAdapter.add(task, itemPosition);
|
||||
((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;
|
||||
case -1:
|
||||
// Commit the changes to DB
|
||||
taskDataAccess.deleteTask(itemId);
|
||||
}
|
||||
taskDataAccess.close();
|
||||
}
|
||||
}).show();
|
||||
}
|
||||
|
||||
private RecyclerView getSpecificTabRecyclerView(int position) {
|
||||
private TaskRecyclerViewAdapter getSpecificTabAdapter(int position) {
|
||||
TasksFragment taskFragment = (TasksFragment) mSectionsPagerAdapter.getRegisteredFragment(position);
|
||||
if (taskFragment == null) return null;
|
||||
View view = taskFragment.getView();
|
||||
if (view == null) return null;
|
||||
return ((RecyclerView) view.findViewById(R.id.task_list_view));
|
||||
}
|
||||
|
||||
private TaskRecyclerViewAdapter getSpecificTabAdapter(int position) {
|
||||
RecyclerView view = getSpecificTabRecyclerView(position);
|
||||
if (view == null) return null;
|
||||
return (TaskRecyclerViewAdapter) view.getAdapter();
|
||||
RecyclerView recyclerView = ((RecyclerView) view.findViewById(R.id.task_list_view));
|
||||
if (recyclerView == null) return null;
|
||||
return (TaskRecyclerViewAdapter) recyclerView.getAdapter();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -378,7 +151,7 @@ public class MainActivity extends AppCompatActivity implements
|
||||
public Fragment getItem(int position) {
|
||||
// getItem is called to instantiate the fragment for the given page.
|
||||
// Return a PlaceholderFragment (defined as a static inner class below).
|
||||
return TasksFragment.newInstance(taskLists.get(position).getId());
|
||||
return TasksFragment.newInstance(taskLists.get(position).getId(), MainActivity.this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@@ -21,16 +21,21 @@ import java.util.List;
|
||||
* {@link RecyclerView.Adapter} that can display a {@link TaskList}.
|
||||
*/
|
||||
|
||||
// TODO: implement inline edit
|
||||
public class TaskListRecyclerViewAdapter extends RecyclerView.Adapter<TaskListRecyclerViewAdapter.ViewHolder>
|
||||
implements TaskListTouchHelper.TaskListTouchHelperAdapter {
|
||||
|
||||
public interface TaskListRecyclerViewAdapterListener {
|
||||
void notifyOnDeleteButtonClicked();
|
||||
}
|
||||
|
||||
private final List<TaskList> mValues;
|
||||
private Context mContext;
|
||||
private TaskListRecyclerViewAdapterListener mListener;
|
||||
|
||||
public TaskListRecyclerViewAdapter(List<TaskList> items, Context context) {
|
||||
public TaskListRecyclerViewAdapter(List<TaskList> items, Context context, TaskListRecyclerViewAdapterListener listener) {
|
||||
mValues = items;
|
||||
mContext = context;
|
||||
mListener = listener;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -48,12 +53,15 @@ public class TaskListRecyclerViewAdapter extends RecyclerView.Adapter<TaskListRe
|
||||
|
||||
// Handle inline name change
|
||||
holder.mTaskNameView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
|
||||
// TODO: handle exception when onFocus is lost after click on Delete
|
||||
@Override
|
||||
public void onFocusChange(View v, boolean hasFocus) {
|
||||
if (!hasFocus)
|
||||
{
|
||||
EditText editText = (EditText) v;
|
||||
holder.mItem.setName(editText.getText().toString());
|
||||
|
||||
EditText editText = (EditText) v;
|
||||
String name = editText.getText().toString();
|
||||
|
||||
if (!hasFocus && !holder.mItem.getName().matches(name)) {
|
||||
holder.mItem.setName(name);
|
||||
|
||||
TaskListDataAccess taskListDataAccess = new TaskListDataAccess(mContext);
|
||||
taskListDataAccess.open();
|
||||
@@ -67,7 +75,6 @@ public class TaskListRecyclerViewAdapter extends RecyclerView.Adapter<TaskListRe
|
||||
});
|
||||
|
||||
// Handle click on delete button
|
||||
// TODO: find a way to call TaskListsFragment.toggleVisibleCreateNewTaskListLayout
|
||||
holder.mTaskDeleteButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
@@ -78,6 +85,9 @@ public class TaskListRecyclerViewAdapter extends RecyclerView.Adapter<TaskListRe
|
||||
remove(position);
|
||||
|
||||
taskListDataAccess.close();
|
||||
|
||||
// Notify parent fragment that a task list was deleted
|
||||
mListener.notifyOnDeleteButtonClicked();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@@ -13,7 +13,6 @@ import com.wismna.geoffroy.donext.dao.Task;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
//import com.wismna.geoffroy.donext.fragments.TasksFragment.OnListFragmentInteractionListener;
|
||||
|
||||
/**
|
||||
* {@link RecyclerView.Adapter} that can display a {@link Task}.
|
||||
@@ -21,11 +20,9 @@ import java.util.List;
|
||||
public class TaskRecyclerViewAdapter extends RecyclerView.Adapter<TaskRecyclerViewAdapter.ViewHolder> {
|
||||
|
||||
private final List<Task> mValues;
|
||||
//private final OnListFragmentInteractionListener mListener;
|
||||
|
||||
public TaskRecyclerViewAdapter(List<Task> items/*, OnListFragmentInteractionListener listener*/) {
|
||||
public TaskRecyclerViewAdapter(List<Task> items) {
|
||||
mValues = items;
|
||||
//mListener = listener;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -58,17 +55,6 @@ public class TaskRecyclerViewAdapter extends RecyclerView.Adapter<TaskRecyclerVi
|
||||
holder.mTitleView.setTypeface(holder.mTitleView.getTypeface(), Typeface.BOLD);
|
||||
break;
|
||||
}
|
||||
|
||||
/*holder.mView.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (null != mListener) {
|
||||
// Notify the active callbacks interface (the activity, if the
|
||||
// fragment is attached to one) that an item has been selected.
|
||||
mListener.onListFragmentInteraction(holder.mItem);
|
||||
}
|
||||
}
|
||||
});*/
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@@ -71,16 +71,6 @@ public class TaskDataAccess {
|
||||
DatabaseHelper.COLUMN_ID + " = " + taskId, null);
|
||||
}
|
||||
|
||||
public Task getTask(long id)
|
||||
{
|
||||
Cursor cursor = getTaskCursor(id);
|
||||
|
||||
cursor.moveToFirst();
|
||||
Task task = cursorToTask(cursor);
|
||||
cursor.close();
|
||||
return task;
|
||||
}
|
||||
|
||||
public List<Task> getAllTasks(long id) {
|
||||
List<Task> tasks = new ArrayList<>();
|
||||
|
||||
@@ -98,7 +88,7 @@ public class TaskDataAccess {
|
||||
}
|
||||
|
||||
public int getTaskCount(long id) {
|
||||
int taskCount = 0;
|
||||
int taskCount;
|
||||
Cursor cursor = database.rawQuery(
|
||||
"SELECT COUNT(*) " +
|
||||
" FROM " + DatabaseHelper.TASKS_TABLE_NAME +
|
||||
@@ -111,7 +101,7 @@ public class TaskDataAccess {
|
||||
return taskCount;
|
||||
}
|
||||
public int getTotalCycles(long id) {
|
||||
int totalCycles = 0;
|
||||
int totalCycles;
|
||||
Cursor cursor = database.rawQuery(
|
||||
"SELECT SUM(" + DatabaseHelper.TASKS_COLUMN_CYCLE + ") " +
|
||||
" FROM " + DatabaseHelper.TASKS_TABLE_NAME +
|
||||
@@ -124,10 +114,6 @@ public class TaskDataAccess {
|
||||
return totalCycles;
|
||||
}
|
||||
|
||||
public Cursor getTaskCursor(long id) {
|
||||
return database.query(DatabaseHelper.TASKS_TABLE_NAME,
|
||||
taskColumns, DatabaseHelper.COLUMN_ID + " = " + id, null, null, null, null);
|
||||
}
|
||||
public Cursor getAllTasksCursor(long id) {
|
||||
return database.query(DatabaseHelper.TASKS_TABLE_NAME, taskColumns,
|
||||
DatabaseHelper.TASKS_COLUMN_LIST + " = " + id +
|
||||
@@ -143,9 +129,9 @@ public class TaskDataAccess {
|
||||
return database.update(DatabaseHelper.TASKS_TABLE_NAME, contentValues, DatabaseHelper.COLUMN_ID + " = " + id, null);
|
||||
}
|
||||
|
||||
public int increaseCycle(int currentCycle, long id) {
|
||||
public int increaseCycle(int newCycle, long id) {
|
||||
ContentValues contentValues = new ContentValues();
|
||||
contentValues.put(DatabaseHelper.TASKS_COLUMN_CYCLE, currentCycle + 1);
|
||||
contentValues.put(DatabaseHelper.TASKS_COLUMN_CYCLE, newCycle);
|
||||
return database.update(DatabaseHelper.TASKS_TABLE_NAME, contentValues, DatabaseHelper.COLUMN_ID + " = " + id, null);
|
||||
}
|
||||
|
||||
|
@@ -1,74 +1,39 @@
|
||||
package com.wismna.geoffroy.donext.fragments;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.Dialog;
|
||||
import android.content.DialogInterface;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.v4.app.DialogFragment;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.view.KeyEvent;
|
||||
|
||||
import com.wismna.geoffroy.donext.R;
|
||||
import com.wismna.geoffroy.donext.adapters.TaskRecyclerViewAdapter;
|
||||
|
||||
public class ConfirmDialogFragment extends DialogFragment {
|
||||
public interface ConfirmDialogListener {
|
||||
void onConfirmDialogPositiveClick(DialogFragment dialog);
|
||||
void onConfirmDialogNeutralClick(DialogFragment dialog);
|
||||
void onConfirmDialogCancel(int position);
|
||||
}
|
||||
|
||||
private ConfirmDialogListener confirmDialogListener;
|
||||
//private TaskRecyclerViewAdapter taskRecyclerViewAdapter;
|
||||
private RecyclerView recyclerView;
|
||||
private String message;
|
||||
|
||||
public static ConfirmDialogFragment newInstance(
|
||||
/*TaskRecyclerViewAdapter taskRecyclerViewAdapter, */String message, RecyclerView recyclerView) {
|
||||
|
||||
//Bundle args = new Bundle();
|
||||
|
||||
public static ConfirmDialogFragment newInstance(String message, ConfirmDialogListener confirmDialogListener) {
|
||||
ConfirmDialogFragment fragment = new ConfirmDialogFragment();
|
||||
//fragment.taskRecyclerViewAdapter = taskRecyclerViewAdapter;
|
||||
fragment.message = message;
|
||||
fragment.recyclerView = recyclerView;
|
||||
//fragment.setArguments(args);
|
||||
fragment.confirmDialogListener = confirmDialogListener;
|
||||
return fragment;
|
||||
}
|
||||
|
||||
public TaskRecyclerViewAdapter getTaskRecyclerViewAdapter() {
|
||||
//return taskRecyclerViewAdapter;
|
||||
return (TaskRecyclerViewAdapter) recyclerView.getAdapter();
|
||||
}
|
||||
|
||||
public RecyclerView getRecyclerView() {
|
||||
return recyclerView;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCancel(DialogInterface dialog) {
|
||||
super.onCancel(dialog);
|
||||
|
||||
// Allows refreshing the first item of the adapter
|
||||
Bundle args = getArguments();
|
||||
int itemPosition = args.getInt("ItemPosition");
|
||||
|
||||
getTaskRecyclerViewAdapter().notifyItemChanged(itemPosition);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAttach(Activity activity) {
|
||||
super.onAttach(activity);
|
||||
// Verify that the host activity implements the callback interface
|
||||
try {
|
||||
// Instantiate the NoticeDialogListener so we can send events to the host
|
||||
confirmDialogListener = (ConfirmDialogListener) activity;
|
||||
} catch (ClassCastException e) {
|
||||
// The activity doesn't implement the interface, throw exception
|
||||
throw new ClassCastException(activity.toString()
|
||||
+ " must implement NewTaskListener");
|
||||
}
|
||||
confirmDialogListener.onConfirmDialogCancel(args.getInt("ItemPosition"));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@@ -1,6 +1,5 @@
|
||||
package com.wismna.geoffroy.donext.fragments;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.AlertDialog;
|
||||
import android.app.Dialog;
|
||||
import android.content.DialogInterface;
|
||||
@@ -43,31 +42,17 @@ public class TaskDialogFragment extends DialogFragment {
|
||||
private Task task;
|
||||
private List<TaskList> taskLists;
|
||||
|
||||
public static TaskDialogFragment newInstance(Task task, List<TaskList> taskLists) {
|
||||
public static TaskDialogFragment newInstance(Task task, List<TaskList> taskLists, NewTaskListener newTaskListener) {
|
||||
|
||||
Bundle args = new Bundle();
|
||||
TaskDialogFragment fragment = new TaskDialogFragment();
|
||||
fragment.setArguments(args);
|
||||
fragment.task = task;
|
||||
fragment.taskLists = taskLists;
|
||||
fragment.mListener = newTaskListener;
|
||||
return fragment;
|
||||
}
|
||||
|
||||
/** Override the Fragment.onAttach() method to instantiate the NoticeDialogListener */
|
||||
@Override
|
||||
public void onAttach(Activity activity) {
|
||||
super.onAttach(activity);
|
||||
// Verify that the host activity implements the callback interface
|
||||
try {
|
||||
// Instantiate the NoticeDialogListener so we can send events to the host
|
||||
mListener = (NewTaskListener) activity;
|
||||
} catch (ClassCastException e) {
|
||||
// The activity doesn't implement the interface, throw exception
|
||||
throw new ClassCastException(activity.toString()
|
||||
+ " must implement NewTaskListener");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||
|
@@ -2,6 +2,7 @@ package com.wismna.geoffroy.donext.fragments;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Bundle;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.support.v4.app.Fragment;
|
||||
@@ -13,7 +14,7 @@ import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.RelativeLayout;
|
||||
import android.widget.LinearLayout;
|
||||
|
||||
import com.wismna.geoffroy.donext.ItemTouchHelpers.TaskListTouchHelper;
|
||||
import com.wismna.geoffroy.donext.R;
|
||||
@@ -21,12 +22,15 @@ import com.wismna.geoffroy.donext.adapters.TaskListRecyclerViewAdapter;
|
||||
import com.wismna.geoffroy.donext.dao.TaskList;
|
||||
import com.wismna.geoffroy.donext.database.TaskListDataAccess;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* A fragment representing a list of Items.
|
||||
*/
|
||||
public class TaskListsFragment extends Fragment {
|
||||
public class TaskListsFragment extends Fragment implements TaskListRecyclerViewAdapter.TaskListRecyclerViewAdapterListener {
|
||||
private TaskListRecyclerViewAdapter taskListRecyclerViewAdapter;
|
||||
private TaskListDataAccess taskListDataAccess;
|
||||
private View mView;
|
||||
|
||||
/**
|
||||
* Mandatory empty constructor for the fragment manager to instantiate the
|
||||
@@ -39,24 +43,21 @@ public class TaskListsFragment extends Fragment {
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
// Get all task lists
|
||||
taskListDataAccess = new TaskListDataAccess(getContext());
|
||||
taskListDataAccess.open();
|
||||
taskListRecyclerViewAdapter =
|
||||
new TaskListRecyclerViewAdapter(taskListDataAccess.getAllTaskLists(), getContext());
|
||||
taskListDataAccess.close();
|
||||
new GetTaskListsTask().execute(taskListDataAccess);
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
final View view = inflater.inflate(R.layout.fragment_tasklists, container, false);
|
||||
|
||||
Button createTaskListButton = (Button) view.findViewById(R.id.new_task_list_button);
|
||||
mView = inflater.inflate(R.layout.fragment_tasklists, container, false);
|
||||
|
||||
Button createTaskListButton = (Button) mView.findViewById(R.id.new_task_list_button);
|
||||
createTaskListButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
EditText editText = (EditText) view.findViewById(R.id.new_task_list_name);
|
||||
EditText editText = (EditText) mView.findViewById(R.id.new_task_list_name);
|
||||
String text = editText.getText().toString();
|
||||
if (text.matches("")) return;
|
||||
int position = taskListRecyclerViewAdapter.getItemCount();
|
||||
@@ -67,27 +68,15 @@ public class TaskListsFragment extends Fragment {
|
||||
taskListRecyclerViewAdapter.add(taskList, position);
|
||||
|
||||
editText.setText("");
|
||||
toggleVisibleCreateNewTaskListLayout(view);
|
||||
toggleVisibleCreateNewTaskListLayout(mView);
|
||||
}
|
||||
});
|
||||
|
||||
// Set the adapter
|
||||
Context context = view.getContext();
|
||||
RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.task_lists_view);
|
||||
recyclerView.setLayoutManager(new LinearLayoutManager(context));
|
||||
recyclerView.setAdapter(taskListRecyclerViewAdapter);
|
||||
|
||||
// Set the Touch Helper
|
||||
ItemTouchHelper.Callback callback = new TaskListTouchHelper(taskListRecyclerViewAdapter);
|
||||
ItemTouchHelper helper = new ItemTouchHelper(callback);
|
||||
helper.attachToRecyclerView(recyclerView);
|
||||
|
||||
toggleVisibleCreateNewTaskListLayout(view);
|
||||
return view;
|
||||
return mView;
|
||||
}
|
||||
|
||||
private void toggleVisibleCreateNewTaskListLayout(View view) {
|
||||
RelativeLayout layout = (RelativeLayout) view.findViewById(R.id.new_task_list_layout);
|
||||
LinearLayout layout = (LinearLayout) view.findViewById(R.id.new_task_list_layout);
|
||||
int taskListCount = taskListRecyclerViewAdapter.getItemCount();
|
||||
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getContext());
|
||||
String maxTaskListsString = sharedPref.getString("pref_conf_max_lists", "3");
|
||||
@@ -96,4 +85,46 @@ public class TaskListsFragment extends Fragment {
|
||||
else layout.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void notifyOnDeleteButtonClicked() {
|
||||
toggleVisibleCreateNewTaskListLayout(mView);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
// TODO: persist changes in DB here
|
||||
|
||||
super.onPause();
|
||||
}
|
||||
|
||||
public class GetTaskListsTask extends AsyncTask<TaskListDataAccess, Void, List<TaskList>> {
|
||||
@Override
|
||||
protected List<TaskList> doInBackground(TaskListDataAccess... params) {
|
||||
TaskListDataAccess taskListDataAccess = params[0];
|
||||
taskListDataAccess.open();
|
||||
List<TaskList> taskLists = taskListDataAccess.getAllTaskLists();
|
||||
taskListDataAccess.close();
|
||||
return taskLists;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(List<TaskList> taskLists) {
|
||||
super.onPostExecute(taskLists);
|
||||
taskListRecyclerViewAdapter =
|
||||
new TaskListRecyclerViewAdapter(taskLists, getContext(), TaskListsFragment.this);
|
||||
|
||||
// Set the adapter
|
||||
Context context = mView.getContext();
|
||||
RecyclerView recyclerView = (RecyclerView) mView.findViewById(R.id.task_lists_view);
|
||||
recyclerView.setLayoutManager(new LinearLayoutManager(context));
|
||||
recyclerView.setAdapter(taskListRecyclerViewAdapter);
|
||||
|
||||
// Set the Touch Helper
|
||||
ItemTouchHelper.Callback callback = new TaskListTouchHelper(taskListRecyclerViewAdapter);
|
||||
ItemTouchHelper helper = new ItemTouchHelper(callback);
|
||||
helper.attachToRecyclerView(recyclerView);
|
||||
|
||||
toggleVisibleCreateNewTaskListLayout(mView);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,7 +1,12 @@
|
||||
package com.wismna.geoffroy.donext.fragments;
|
||||
|
||||
import android.app.Dialog;
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Bundle;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.support.design.widget.Snackbar;
|
||||
import android.support.v4.app.DialogFragment;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.app.FragmentManager;
|
||||
import android.support.v4.view.ViewPager;
|
||||
@@ -10,12 +15,18 @@ import android.support.v7.widget.helper.ItemTouchHelper;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.EditText;
|
||||
import android.widget.RadioButton;
|
||||
import android.widget.RadioGroup;
|
||||
import android.widget.Spinner;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.wismna.geoffroy.donext.ItemTouchHelpers.TaskTouchHelper;
|
||||
import com.wismna.geoffroy.donext.R;
|
||||
import com.wismna.geoffroy.donext.activities.MainActivity;
|
||||
import com.wismna.geoffroy.donext.adapters.TaskRecyclerViewAdapter;
|
||||
import com.wismna.geoffroy.donext.dao.Task;
|
||||
import com.wismna.geoffroy.donext.dao.TaskList;
|
||||
import com.wismna.geoffroy.donext.database.TaskDataAccess;
|
||||
import com.wismna.geoffroy.donext.listeners.RecyclerItemClickListener;
|
||||
import com.wismna.geoffroy.donext.widgets.NoScrollingLayoutManager;
|
||||
@@ -23,9 +34,21 @@ import com.wismna.geoffroy.donext.widgets.NoScrollingLayoutManager;
|
||||
/**
|
||||
* A fragment representing a list of Items.
|
||||
*/
|
||||
public class TasksFragment extends Fragment {
|
||||
public class TasksFragment extends Fragment implements
|
||||
TaskDialogFragment.NewTaskListener,
|
||||
ConfirmDialogFragment.ConfirmDialogListener,
|
||||
TaskTouchHelper.TaskTouchHelperAdapter {
|
||||
public interface TaskChangedAdapter {
|
||||
void onTaskListChanged(Task task, int tabPosition);
|
||||
}
|
||||
|
||||
private static final String TASK_LIST_ID = "task_list_id";
|
||||
private long taskListId = -1;
|
||||
private TaskDataAccess taskDataAccess;
|
||||
private TaskRecyclerViewAdapter taskRecyclerViewAdapter;
|
||||
private View view;
|
||||
private RecyclerView recyclerView;
|
||||
private TaskChangedAdapter mAdapter;
|
||||
|
||||
/**
|
||||
* Mandatory empty constructor for the fragment manager to instantiate the
|
||||
@@ -34,11 +57,12 @@ public class TasksFragment extends Fragment {
|
||||
public TasksFragment() {
|
||||
}
|
||||
|
||||
public static TasksFragment newInstance(long taskListId) {
|
||||
public static TasksFragment newInstance(long taskListId, TaskChangedAdapter taskChangedAdapter) {
|
||||
TasksFragment fragment = new TasksFragment();
|
||||
Bundle args = new Bundle();
|
||||
args.putLong(TASK_LIST_ID, taskListId);
|
||||
fragment.setArguments(args);
|
||||
fragment.mAdapter = taskChangedAdapter;
|
||||
return fragment;
|
||||
}
|
||||
|
||||
@@ -54,33 +78,30 @@ public class TasksFragment extends Fragment {
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
View view = inflater.inflate(R.layout.fragment_tasks, container, false);
|
||||
view = inflater.inflate(R.layout.fragment_tasks, container, false);
|
||||
final Context context = view.getContext();
|
||||
|
||||
// Set the Recycler view
|
||||
final RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.task_list_view);
|
||||
recyclerView = (RecyclerView) view.findViewById(R.id.task_list_view);
|
||||
recyclerView.setLayoutManager(new NoScrollingLayoutManager(context));
|
||||
|
||||
TaskDataAccess taskDataAccess = new TaskDataAccess(view.getContext());
|
||||
taskDataAccess = new TaskDataAccess(view.getContext());
|
||||
taskDataAccess.open();
|
||||
|
||||
// Set total cycles
|
||||
TextView totalCyclesView = (TextView) view.findViewById(R.id.total_task_cycles);
|
||||
totalCyclesView.setText(String.valueOf(taskDataAccess.getTotalCycles(taskListId) + " cycles"));
|
||||
UpdateCycleCount();
|
||||
|
||||
// Set total count
|
||||
TextView totalTasksView = (TextView) view.findViewById(R.id.total_task_count);
|
||||
totalTasksView.setText(String.valueOf(taskDataAccess.getTaskCount(taskListId) + " tasks"));
|
||||
UpdateTaskCount();
|
||||
|
||||
// Set RecyclerView Adapter
|
||||
final TaskRecyclerViewAdapter taskRecyclerViewAdapter = new TaskRecyclerViewAdapter(taskDataAccess.getAllTasks(taskListId));
|
||||
taskRecyclerViewAdapter = new TaskRecyclerViewAdapter(taskDataAccess.getAllTasks(taskListId));
|
||||
recyclerView.setAdapter(taskRecyclerViewAdapter);
|
||||
|
||||
taskDataAccess.close();
|
||||
|
||||
// Set ItemTouch helper in RecyclerView to handle swipe move on elements
|
||||
ItemTouchHelper.Callback callback = new TaskTouchHelper(
|
||||
taskRecyclerViewAdapter, taskDataAccess, getFragmentManager(), recyclerView);
|
||||
ItemTouchHelper.Callback callback = new TaskTouchHelper(this);
|
||||
ItemTouchHelper helper = new ItemTouchHelper(callback);
|
||||
helper.attachToRecyclerView(recyclerView);
|
||||
|
||||
@@ -97,9 +118,9 @@ public class TasksFragment extends Fragment {
|
||||
args.putInt("list", viewPager.getCurrentItem());
|
||||
|
||||
FragmentManager manager = getFragmentManager();
|
||||
TaskDialogFragment taskDialogFragment = TaskDialogFragment.newInstance(/*taskRecyclerViewAdapter, recyclerView,*/
|
||||
TaskDialogFragment taskDialogFragment = TaskDialogFragment.newInstance(
|
||||
taskRecyclerViewAdapter.getItem(position),
|
||||
((MainActivity.SectionsPagerAdapter)viewPager.getAdapter()).getAllItems());
|
||||
((MainActivity.SectionsPagerAdapter)viewPager.getAdapter()).getAllItems(), TasksFragment.this);
|
||||
|
||||
taskDialogFragment.setArguments(args);
|
||||
taskDialogFragment.show(manager, "Edit task");
|
||||
@@ -108,4 +129,239 @@ public class TasksFragment extends Fragment {
|
||||
);
|
||||
return view;
|
||||
}
|
||||
|
||||
private void UpdateCycleCount() {
|
||||
TextView totalCyclesView = (TextView) view.findViewById(R.id.total_task_cycles);
|
||||
totalCyclesView.setText(String.valueOf(taskDataAccess.getTotalCycles(taskListId) + " cycles"));
|
||||
}
|
||||
|
||||
private void UpdateTaskCount() {
|
||||
TextView totalTasksView = (TextView) view.findViewById(R.id.total_task_count);
|
||||
totalTasksView.setText(String.valueOf(taskDataAccess.getTaskCount(taskListId) + " tasks"));
|
||||
}
|
||||
|
||||
/** Performs an action on a task: done, next or delete */
|
||||
public void PerformTaskAction(final int itemPosition, final int direction) {
|
||||
final long itemId = taskRecyclerViewAdapter.getItemId(itemPosition);
|
||||
final Task task = taskRecyclerViewAdapter.getItem(itemPosition);
|
||||
String action = "";
|
||||
taskRecyclerViewAdapter.remove(itemPosition);
|
||||
|
||||
switch (direction)
|
||||
{
|
||||
// Mark item as Done
|
||||
case ItemTouchHelper.LEFT:
|
||||
action = "done";
|
||||
break;
|
||||
// Increase task cycle count
|
||||
case ItemTouchHelper.RIGHT:
|
||||
action = "nexted";
|
||||
task.setCycle(task.getCycle() + 1);
|
||||
taskRecyclerViewAdapter.add(task, taskRecyclerViewAdapter.getItemCount());
|
||||
break;
|
||||
case -1:
|
||||
action = "deleted";
|
||||
break;
|
||||
}
|
||||
|
||||
// Setup the snack bar
|
||||
Snackbar.make(view, "Task " + action, Snackbar.LENGTH_LONG)
|
||||
.setAction("Undo", new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
// Undo adapter changes
|
||||
switch (direction)
|
||||
{
|
||||
// Nothing special to do for done
|
||||
case ItemTouchHelper.LEFT:
|
||||
break;
|
||||
// Remove the last item
|
||||
case ItemTouchHelper.RIGHT:
|
||||
taskRecyclerViewAdapter.remove(taskRecyclerViewAdapter.getItemCount() - 1);
|
||||
task.setCycle(task.getCycle() - 1);
|
||||
break;
|
||||
// Nothing special to do for delete
|
||||
case -1:
|
||||
break;
|
||||
}
|
||||
// Reset the first item
|
||||
taskRecyclerViewAdapter.add(task, itemPosition);
|
||||
recyclerView.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;
|
||||
case -1:
|
||||
// Commit the changes to DB
|
||||
taskDataAccess.deleteTask(itemId);
|
||||
}
|
||||
|
||||
UpdateCycleCount();
|
||||
UpdateTaskCount();
|
||||
|
||||
taskDataAccess.close();
|
||||
}
|
||||
}).show();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfirmDialogPositiveClick(DialogFragment dialog) {
|
||||
Bundle args = dialog.getArguments();
|
||||
int itemPosition = args.getInt("ItemPosition");
|
||||
int direction = args.getInt("Direction");
|
||||
|
||||
PerformTaskAction(itemPosition, direction);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfirmDialogNeutralClick(DialogFragment dialog) {
|
||||
Bundle args = dialog.getArguments();
|
||||
int itemPosition = args.getInt("ItemPosition");
|
||||
int direction = args.getInt("Direction");
|
||||
|
||||
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getContext());
|
||||
SharedPreferences.Editor editor = sharedPref.edit();
|
||||
|
||||
// Set system settings
|
||||
switch (direction)
|
||||
{
|
||||
case ItemTouchHelper.LEFT:
|
||||
editor.putBoolean("pref_conf_done", false);
|
||||
break;
|
||||
case ItemTouchHelper.RIGHT:
|
||||
editor.putBoolean("pref_conf_next", false);
|
||||
break;
|
||||
case -1:
|
||||
editor.putBoolean("pref_conf_del", false);
|
||||
break;
|
||||
}
|
||||
editor.apply();
|
||||
PerformTaskAction(itemPosition, direction);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfirmDialogCancel(int position) {
|
||||
taskRecyclerViewAdapter.notifyItemChanged(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNewTaskDialogPositiveClick(DialogFragment dialog) {
|
||||
// Get the dialog fragment
|
||||
Dialog dialogView = dialog.getDialog();
|
||||
long id = 0;
|
||||
Task task = ((TaskDialogFragment)dialog).getTask();
|
||||
if (task != null) id = task.getId();
|
||||
|
||||
// Get the controls
|
||||
Spinner listSpinner = (Spinner) dialogView.findViewById(R.id.new_task_list);
|
||||
EditText nameText = (EditText) dialogView.findViewById(R.id.new_task_name);
|
||||
EditText descText = (EditText) dialogView.findViewById(R.id.new_task_description);
|
||||
RadioGroup priorityGroup = (RadioGroup) dialogView.findViewById(R.id.new_task_priority);
|
||||
RadioButton priorityRadio = (RadioButton) dialogView.findViewById(priorityGroup.getCheckedRadioButtonId());
|
||||
TaskList taskList = (TaskList) listSpinner.getSelectedItem();
|
||||
|
||||
// Add the task to the database
|
||||
taskDataAccess.open();
|
||||
Task newTask = taskDataAccess.createOrUpdateTask(id,
|
||||
nameText.getText().toString(),
|
||||
descText.getText().toString(),
|
||||
priorityRadio.getText().toString(),
|
||||
taskList.getId());
|
||||
|
||||
UpdateTaskCount();
|
||||
taskDataAccess.close();
|
||||
// Update the corresponding tab adapter
|
||||
|
||||
Bundle args = dialog.getArguments();
|
||||
// Should never happen because we will have to be on this tab to open the dialog
|
||||
if (taskRecyclerViewAdapter == null) return;
|
||||
|
||||
// Add the task
|
||||
if (task == null)
|
||||
taskRecyclerViewAdapter.add(newTask, taskRecyclerViewAdapter.getItemCount());
|
||||
// Update the task
|
||||
else {
|
||||
int position = args.getInt("position");
|
||||
// Check if task list was changed
|
||||
if (task.getTaskListId() != taskList.getId())
|
||||
{
|
||||
// Remove item from current tab
|
||||
taskRecyclerViewAdapter.remove(position);
|
||||
|
||||
// Add it to the corresponding tab provided it is already instanciated
|
||||
mAdapter.onTaskListChanged(newTask, listSpinner.getSelectedItemPosition());
|
||||
}
|
||||
else taskRecyclerViewAdapter.update(newTask, position);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNewTaskDialogNeutralClick(DialogFragment dialog) {
|
||||
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getContext());
|
||||
String title = getResources().getString(R.string.task_confirmation_delete_text);
|
||||
boolean showDialog = sharedPref.getBoolean("pref_conf_del", true);
|
||||
Bundle args = dialog.getArguments();
|
||||
|
||||
// Delete task from Adapter
|
||||
final int itemPosition = args.getInt("position");
|
||||
|
||||
if (showDialog) {
|
||||
ConfirmDialogFragment confirmDialogFragment =
|
||||
ConfirmDialogFragment.newInstance(title, this);
|
||||
Bundle confirmArgs = new Bundle();
|
||||
confirmArgs.putInt("ItemPosition", itemPosition);
|
||||
confirmArgs.putInt("Direction", -1);
|
||||
confirmDialogFragment.setArguments(confirmArgs);
|
||||
confirmDialogFragment.show(getFragmentManager(), title);
|
||||
}
|
||||
else PerformTaskAction(itemPosition, -1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onItemSwiped(int itemPosition, int direction) {
|
||||
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getContext());
|
||||
String title = "";
|
||||
boolean showDialog = false;
|
||||
|
||||
switch (direction)
|
||||
{
|
||||
// Mark item as Done
|
||||
case ItemTouchHelper.LEFT:
|
||||
title = "Mark task as done?";
|
||||
showDialog = sharedPref.getBoolean("pref_conf_done", true);
|
||||
break;
|
||||
// Increase task cycle count
|
||||
case ItemTouchHelper.RIGHT:
|
||||
title = "Go to next task?";
|
||||
showDialog = sharedPref.getBoolean("pref_conf_next", true);
|
||||
break;
|
||||
}
|
||||
if (showDialog) {
|
||||
ConfirmDialogFragment confirmDialogFragment =
|
||||
ConfirmDialogFragment.newInstance(title, this);
|
||||
Bundle args = new Bundle();
|
||||
args.putInt("ItemPosition", itemPosition);
|
||||
args.putInt("Direction", direction);
|
||||
confirmDialogFragment.setArguments(args);
|
||||
confirmDialogFragment.show(getFragmentManager(), title);
|
||||
}
|
||||
else PerformTaskAction(itemPosition, direction);
|
||||
}
|
||||
}
|
||||
|
@@ -2,8 +2,7 @@
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="70dp"
|
||||
android:orientation="horizontal"
|
||||
android:foreground="?selectableItemBackground" >
|
||||
android:orientation="horizontal" >
|
||||
<TextView
|
||||
android:id="@+id/task_cycle"
|
||||
android:layout_width="56dp"
|
||||
|
@@ -1,34 +1,23 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:foreground="?selectableItemBackground" >
|
||||
android:orientation="horizontal" >
|
||||
<TextView
|
||||
android:id="@+id/task_list_count"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_width="50dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_alignParentStart="true"
|
||||
android:padding="10dp"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"/>
|
||||
<EditText
|
||||
android:id="@+id/task_list_name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="10dp"
|
||||
android:layout_marginStart="10dp"
|
||||
android:layout_toRightOf="@id/task_list_count"
|
||||
android:layout_toEndOf="@id/task_list_count"
|
||||
android:layout_width="200dp"
|
||||
android:layout_height="?listPreferredItemHeight"
|
||||
android:inputType="text"
|
||||
android:textAppearance="?android:attr/textAppearanceLarge"/>
|
||||
<Button
|
||||
android:id="@+id/task_list_delete"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_width="80dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:padding="10dp"
|
||||
android:text="@string/task_list_delete"
|
||||
android:onClick="onDeleteTaskList" />
|
||||
</RelativeLayout>
|
||||
android:text="@string/task_list_delete" />
|
||||
</LinearLayout>
|
||||
|
@@ -9,23 +9,23 @@
|
||||
android:paddingTop="@dimen/activity_vertical_margin"
|
||||
android:orientation="vertical"
|
||||
tools:context=".activities.TaskListActivity">
|
||||
<RelativeLayout
|
||||
<LinearLayout
|
||||
android:id="@+id/new_task_list_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="50dp"
|
||||
android:layout_marginStart="50dp">
|
||||
<EditText
|
||||
android:id="@+id/new_task_list_name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_width="200dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:hint="@string/task_list_new_list_hint"/>
|
||||
<Button
|
||||
android:id="@+id/new_task_list_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_width="80dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:text="@string/task_list_new_list_create"/>
|
||||
</RelativeLayout>
|
||||
</LinearLayout>
|
||||
<android.support.v7.widget.RecyclerView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
@@ -34,8 +34,6 @@
|
||||
android:name="com.wismna.geoffroy.donext.fragments.TaskListFragment"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:layout_marginRight="16dp"
|
||||
app:layoutManager="LinearLayoutManager"
|
||||
tools:context=".fragments.TaskListsFragment"
|
||||
tools:listitem="@layout/fragment_tasklist" />
|
||||
|
Reference in New Issue
Block a user