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:
2015-12-31 17:35:14 -05:00
parent c8dbcb1aff
commit 83f37cd98a
13 changed files with 429 additions and 452 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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