diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/ItemTouchHelpers/TaskListTouchHelper.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/ItemTouchHelpers/TaskListTouchHelper.java index 9fe04dc..a2f7182 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/ItemTouchHelpers/TaskListTouchHelper.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/ItemTouchHelpers/TaskListTouchHelper.java @@ -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); + } } 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 f8c9b86..e7e4513 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 @@ -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); + } } 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 a3313ca..e9584b7 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 @@ -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 diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/adapters/TaskListRecyclerViewAdapter.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/adapters/TaskListRecyclerViewAdapter.java index db653a8..8fa13f4 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/adapters/TaskListRecyclerViewAdapter.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/adapters/TaskListRecyclerViewAdapter.java @@ -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 implements TaskListTouchHelper.TaskListTouchHelperAdapter { + public interface TaskListRecyclerViewAdapterListener { + void notifyOnDeleteButtonClicked(); + } + private final List mValues; private Context mContext; + private TaskListRecyclerViewAdapterListener mListener; - public TaskListRecyclerViewAdapter(List items, Context context) { + public TaskListRecyclerViewAdapter(List items, Context context, TaskListRecyclerViewAdapterListener listener) { mValues = items; mContext = context; + mListener = listener; } @Override @@ -48,12 +53,15 @@ public class TaskListRecyclerViewAdapter extends RecyclerView.Adapter { private final List mValues; - //private final OnListFragmentInteractionListener mListener; - public TaskRecyclerViewAdapter(List items/*, OnListFragmentInteractionListener listener*/) { + public TaskRecyclerViewAdapter(List items) { mValues = items; - //mListener = listener; } @Override @@ -58,17 +55,6 @@ public class TaskRecyclerViewAdapter extends RecyclerView.Adapter taskLists; - public static TaskDialogFragment newInstance(Task task, List taskLists) { + public static TaskDialogFragment newInstance(Task task, List 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) { diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TaskListsFragment.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TaskListsFragment.java index ba9804f..d5c1a2c 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TaskListsFragment.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TaskListsFragment.java @@ -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> { + @Override + protected List doInBackground(TaskListDataAccess... params) { + TaskListDataAccess taskListDataAccess = params[0]; + taskListDataAccess.open(); + List taskLists = taskListDataAccess.getAllTaskLists(); + taskListDataAccess.close(); + return taskLists; + } + + @Override + protected void onPostExecute(List 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); + } + } } 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 48d6407..51e0f3b 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 @@ -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); + } } diff --git a/DoNExt/app/src/main/res/layout/fragment_task.xml b/DoNExt/app/src/main/res/layout/fragment_task.xml index e66c3ca..c2947fe 100644 --- a/DoNExt/app/src/main/res/layout/fragment_task.xml +++ b/DoNExt/app/src/main/res/layout/fragment_task.xml @@ -2,8 +2,7 @@ + android:orientation="horizontal" > - + android:orientation="horizontal" >