diff --git a/DoNExt/app/src/main/AndroidManifest.xml b/DoNExt/app/src/main/AndroidManifest.xml index c602e48..2f858af 100644 --- a/DoNExt/app/src/main/AndroidManifest.xml +++ b/DoNExt/app/src/main/AndroidManifest.xml @@ -14,7 +14,6 @@ android:theme="@style/AppTheme.NoActionBar"> - @@ -28,20 +27,12 @@ - - - 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 new file mode 100644 index 0000000..9fe04dc --- /dev/null +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/ItemTouchHelpers/TaskListTouchHelper.java @@ -0,0 +1,37 @@ +package com.wismna.geoffroy.donext.ItemTouchHelpers; + +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.helper.ItemTouchHelper; + +/** + * Created by geoffroy on 15-12-30. + * Helper class that handles all drags events on a TaskList + */ +public class TaskListTouchHelper extends ItemTouchHelper.SimpleCallback { + + public interface TaskListTouchHelperAdapter { + boolean onItemMove (int fromPosition, int toPosition); + } + + private final TaskListTouchHelperAdapter mAdapter; + + public TaskListTouchHelper(TaskListTouchHelperAdapter adapter) { + super(ItemTouchHelper.UP | ItemTouchHelper.DOWN, 0); + mAdapter = adapter; + } + + @Override + public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { + return mAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition()); + } + + @Override + public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { + // No swipe moves + } + + @Override + public boolean isLongPressDragEnabled() { + return true; + } +} 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 2db199b..f8c9b86 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 @@ -11,7 +11,7 @@ import android.support.v7.widget.helper.ItemTouchHelper; import android.view.View; import com.wismna.geoffroy.donext.activities.MainActivity; -import com.wismna.geoffroy.donext.adapters.TaskAdapter; +import com.wismna.geoffroy.donext.adapters.TaskRecyclerViewAdapter; import com.wismna.geoffroy.donext.database.TaskDataAccess; import com.wismna.geoffroy.donext.fragments.ConfirmDialogFragment; @@ -20,16 +20,16 @@ import com.wismna.geoffroy.donext.fragments.ConfirmDialogFragment; * Helper class that handles all swipe events on a Task */ public class TaskTouchHelper extends ItemTouchHelper.SimpleCallback { - private TaskAdapter taskAdapter; + private TaskRecyclerViewAdapter taskRecyclerViewAdapter; private TaskDataAccess taskDataAccess; private FragmentManager fragmentManager; private RecyclerView recyclerView; - public TaskTouchHelper(TaskAdapter taskAdapter, TaskDataAccess taskDataAccess, + public TaskTouchHelper(TaskRecyclerViewAdapter taskRecyclerViewAdapter, TaskDataAccess taskDataAccess, FragmentManager fragmentManager, RecyclerView recyclerView){ // No drag moves, only left swipes (except for 1st element, see getSwipeDirs method) super(0, ItemTouchHelper.LEFT); - this.taskAdapter = taskAdapter; + this.taskRecyclerViewAdapter = taskRecyclerViewAdapter; this.taskDataAccess = taskDataAccess; this.fragmentManager = fragmentManager; this.recyclerView = recyclerView; @@ -70,14 +70,14 @@ public class TaskTouchHelper extends ItemTouchHelper.SimpleCallback { } if (showDialog) { ConfirmDialogFragment confirmDialogFragment = - ConfirmDialogFragment.newInstance(taskAdapter, title, recyclerView); + 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, taskAdapter, itemPosition, direction, recyclerView); + else MainActivity.PerformSwipeAction(taskDataAccess, taskRecyclerViewAdapter, itemPosition, direction, recyclerView); } @Override 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 013e1d7..a3313ca 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 @@ -5,6 +5,7 @@ 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; @@ -26,7 +27,7 @@ import android.widget.Spinner; import com.wismna.geoffroy.donext.R; import com.wismna.geoffroy.donext.adapters.SmartFragmentStatePagerAdapter; -import com.wismna.geoffroy.donext.adapters.TaskAdapter; +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; @@ -39,7 +40,6 @@ import java.util.List; public class MainActivity extends AppCompatActivity implements TaskDialogFragment.NewTaskListener, - TasksFragment.OnListFragmentInteractionListener, ConfirmDialogFragment.ConfirmDialogListener { @@ -52,7 +52,7 @@ public class MainActivity extends AppCompatActivity implements * may be best to switch to a * {@link android.support.v4.app.FragmentStatePagerAdapter}. */ - + private SectionsPagerAdapter mSectionsPagerAdapter; /** * The {@link ViewPager} that will host the section contents. */ @@ -69,7 +69,7 @@ public class MainActivity extends AppCompatActivity implements // Create the adapter that will return a fragment for each of the three // primary sections of the activity. - SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); + mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); // Access database to retrieve tasks taskDataAccess = new TaskDataAccess(this); @@ -81,6 +81,7 @@ public class MainActivity extends AppCompatActivity implements taskLists = taskListDataAccess.getAllTaskLists(); mSectionsPagerAdapter.notifyDataSetChanged(); + taskListDataAccess.close(); // Set up the ViewPager with the sections adapter. mViewPager = (ViewPager) findViewById(R.id.container); @@ -89,16 +90,10 @@ public class MainActivity extends AppCompatActivity implements TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); tabLayout.setupWithViewPager(mViewPager); - // Add Task floating button - // TODO: disable or hide button when no lists exist - /*FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); - fab.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) - .setAction("Action", null).show(); - } - });*/ + // Hide or show new task floating button + FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); + if (taskLists.size() == 0) fab.hide(); + else fab.show(); } @Override @@ -115,12 +110,8 @@ public class MainActivity extends AppCompatActivity implements // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); - //noinspection SimplifiableIfStatement - if (id == R.id.action_settings) { - return true; - } + return id == R.id.action_settings || super.onOptionsItemSelected(item); - return super.onOptionsItemSelected(item); } @Override @@ -145,8 +136,10 @@ public class MainActivity extends AppCompatActivity implements public void onNewTaskDialogPositiveClick(DialogFragment dialog) { // Get the dialog fragment Dialog dialogView = dialog.getDialog(); - Bundle args = dialog.getArguments(); - long id = args.getLong("id"); + 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); @@ -154,22 +147,40 @@ public class MainActivity extends AppCompatActivity implements 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 task = taskDataAccess.createOrUpdateTask(id, + Task newTask = taskDataAccess.createOrUpdateTask(id, nameText.getText().toString(), descText.getText().toString(), priorityRadio.getText().toString(), taskList.getId()); taskDataAccess.close(); // Update the corresponding tab adapter - TaskAdapter taskAdapter = ((TaskDialogFragment)dialog).getTaskAdapter(); + + 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 (id == 0) - taskAdapter.add(task, taskAdapter.getItemCount()); + if (task == null) + taskRecyclerViewAdapter.add(newTask, taskRecyclerViewAdapter.getItemCount()); // Update the task - else - taskAdapter.update(task, args.getInt("position")); + 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 @@ -177,30 +188,39 @@ public class MainActivity extends AppCompatActivity implements SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); String title = getResources().getString(R.string.task_confirmation_delete_text); boolean showDialog = sharedPref.getBoolean("pref_conf_del", true); - TaskDialogFragment taskDialogFragment = (TaskDialogFragment) dialog; Bundle args = dialog.getArguments(); // Delete task from Adapter final int itemPosition = args.getInt("position"); - final TaskAdapter taskAdapter = taskDialogFragment.getTaskAdapter(); - final RecyclerView view = taskDialogFragment.getRecyclerView(); + final RecyclerView view = getSpecificTabRecyclerView(args.getInt("list")); + final TaskRecyclerViewAdapter taskRecyclerViewAdapter = (TaskRecyclerViewAdapter) view.getAdapter(); if (showDialog) { ConfirmDialogFragment confirmDialogFragment = - ConfirmDialogFragment.newInstance(taskAdapter, title, view); + 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, taskAdapter, itemPosition, -1, view); + else PerformSwipeAction(taskDataAccess, taskRecyclerViewAdapter, itemPosition, -1, view); } /** Called when user clicks on the New Task floating button */ public void onNewTaskClick(View view) { - OpenNewTaskDialog(); + FragmentManager manager = getSupportFragmentManager(); + TaskDialogFragment taskDialogFragment = TaskDialogFragment.newInstance(null, + mSectionsPagerAdapter.getAllItems()); + + // Set current tab value to new task dialog + Bundle args = new Bundle(); + args.putInt("list", mViewPager.getCurrentItem()); + taskDialogFragment.setArguments(args); + + taskDialogFragment.show(manager, "Create new task"); } + /** Called when the user clicks the Settings button */ public void openSettings(MenuItem menuItem) { Intent intent = new Intent(this, SettingsActivity.class); @@ -212,19 +232,14 @@ public class MainActivity extends AppCompatActivity implements startActivity(intent); } - @Override - public void onListFragmentInteraction(Task item) { - - } - @Override public void onConfirmDialogPositiveClick(DialogFragment dialog) { Bundle args = dialog.getArguments(); int itemPosition = args.getInt("ItemPosition"); int direction = args.getInt("Direction"); - TaskAdapter taskAdapter = ((ConfirmDialogFragment)dialog).getTaskAdapter(); - PerformSwipeAction(taskDataAccess, taskAdapter, itemPosition, direction, ((ConfirmDialogFragment) dialog).getRecyclerView()); + TaskRecyclerViewAdapter taskRecyclerViewAdapter = ((ConfirmDialogFragment)dialog).getTaskRecyclerViewAdapter(); + PerformSwipeAction(taskDataAccess, taskRecyclerViewAdapter, itemPosition, direction, ((ConfirmDialogFragment) dialog).getRecyclerView()); } @Override @@ -235,7 +250,6 @@ public class MainActivity extends AppCompatActivity implements SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); SharedPreferences.Editor editor = sharedPref.edit(); - //editor.putBoolean("pref_conf_next", false); switch (direction) { @@ -252,31 +266,19 @@ public class MainActivity extends AppCompatActivity implements break; } editor.apply(); - TaskAdapter taskAdapter = ((ConfirmDialogFragment)dialog).getTaskAdapter(); - PerformSwipeAction(taskDataAccess, taskAdapter, itemPosition, direction, ((ConfirmDialogFragment) dialog).getRecyclerView()); - } - - private void OpenNewTaskDialog() { - FragmentManager manager = getSupportFragmentManager(); - TaskDialogFragment taskDialogFragment = new TaskDialogFragment(); - - // Set current tab value to new task dialog - Bundle args = new Bundle(); - args.putInt("list", mViewPager.getCurrentItem()); - taskDialogFragment.setArguments(args); - - taskDialogFragment.show(manager, "Create new task"); + TaskRecyclerViewAdapter taskRecyclerViewAdapter = ((ConfirmDialogFragment)dialog).getTaskRecyclerViewAdapter(); + PerformSwipeAction(taskDataAccess, taskRecyclerViewAdapter, itemPosition, direction, ((ConfirmDialogFragment) dialog).getRecyclerView()); } public static void PerformSwipeAction(final TaskDataAccess taskDataAccess, - final TaskAdapter taskAdapter, + final TaskRecyclerViewAdapter taskRecyclerViewAdapter, final int itemPosition, final int direction, final View view) { - final long itemId = taskAdapter.getItemId(itemPosition); - final Task task = taskAdapter.getItem(itemPosition); + final long itemId = taskRecyclerViewAdapter.getItemId(itemPosition); + final Task task = taskRecyclerViewAdapter.getItem(itemPosition); String action = ""; - taskAdapter.remove(itemPosition); + taskRecyclerViewAdapter.remove(itemPosition); switch (direction) { @@ -288,11 +290,10 @@ public class MainActivity extends AppCompatActivity implements case ItemTouchHelper.RIGHT: action = "nexted"; task.setCycle(task.getCycle() + 1); - taskAdapter.add(task, taskAdapter.getItemCount()); + taskRecyclerViewAdapter.add(task, taskRecyclerViewAdapter.getItemCount()); break; case -1: action = "deleted"; - taskAdapter.remove(itemPosition); break; } @@ -309,7 +310,7 @@ public class MainActivity extends AppCompatActivity implements break; // Remove the last item case ItemTouchHelper.RIGHT: - taskAdapter.remove(taskAdapter.getItemCount() - 1); + taskRecyclerViewAdapter.remove(taskRecyclerViewAdapter.getItemCount() - 1); task.setCycle(task.getCycle() - 1); break; // Nothing special to do for delete @@ -317,7 +318,7 @@ public class MainActivity extends AppCompatActivity implements break; } // Reset the first item - taskAdapter.add(task, itemPosition); + taskRecyclerViewAdapter.add(task, itemPosition); ((RecyclerView)view).scrollToPosition(0); } }).setCallback(new Snackbar.Callback() { @@ -348,6 +349,21 @@ public class MainActivity extends AppCompatActivity implements } }).show(); } + + private RecyclerView getSpecificTabRecyclerView(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(); + } + /** * A {@link FragmentPagerAdapter} that returns a fragment corresponding to * one of the sections/tabs/pages. @@ -379,5 +395,9 @@ public class MainActivity extends AppCompatActivity implements if (taskLists == null) return "N/A"; return taskLists.get(position).getName(); } + + public List getAllItems(){ + return taskLists; + } } } diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/TaskActivity.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/TaskActivity.java deleted file mode 100644 index be6cd18..0000000 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/TaskActivity.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.wismna.geoffroy.donext.activities; - -import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; - -import com.wismna.geoffroy.donext.R; - -public class TaskActivity extends AppCompatActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_task); - } -} diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/TaskListActivity.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/TaskListActivity.java index 1df4b42..ef80965 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/TaskListActivity.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/TaskListActivity.java @@ -1,91 +1,15 @@ package com.wismna.geoffroy.donext.activities; -import android.content.SharedPreferences; -import android.database.Cursor; import android.os.Bundle; -import android.preference.PreferenceManager; import android.support.v7.app.AppCompatActivity; -import android.view.View; -import android.widget.EditText; -import android.widget.ListView; -import android.widget.RelativeLayout; import com.wismna.geoffroy.donext.R; -import com.wismna.geoffroy.donext.adapters.TaskListCursorAdapter; -import com.wismna.geoffroy.donext.database.TaskListDataAccess; - -// TODO: create a fragment -// TODO: replace ListView with RecycleView -public class TaskListActivity extends AppCompatActivity { - private TaskListDataAccess dataAccess; - private TaskListCursorAdapter adapter; - private ListView listView; +public class TaskListActivity extends AppCompatActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_task_list); - - listView = (ListView) findViewById(android.R.id.list); - dataAccess = new TaskListDataAccess(this); - dataAccess.open(); - - adapter = new TaskListCursorAdapter( - this, R.layout.item_task_list, dataAccess.getAllTaskListsCursor(), 0); - listView.setAdapter(adapter); - - updateCreateButtonEnabled(); - } - - /** Will be called when the create Task List button is clicked */ - public void onCreateTaskList(View view) { - @SuppressWarnings("unchecked") - EditText editText = (EditText) findViewById(R.id.new_task_list_name); - - Cursor cursor = dataAccess.createTaskList(editText.getText().toString()); - adapter.changeCursor(cursor); - editText.setText(""); - updateCreateButtonEnabled(); - } - - /** Will be called when the delete Task List button is clicked */ - public void onDeleteTaskList(View view) { - @SuppressWarnings("unchecked") - final int position = listView.getPositionForView((View) view.getParent()); - Cursor cursor = dataAccess.deleteTaskList((Cursor) adapter.getItem(position)); - adapter.changeCursor(cursor); - updateCreateButtonEnabled(); - } - - @Override - protected void onResume() { - dataAccess.open(); - super.onResume(); - } - - @Override - protected void onPause() { - dataAccess.close(); - super.onPause(); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - dataAccess.close(); - } - private void updateCreateButtonEnabled() { - //Button createButton = (Button) findViewById(R.id.new_task_list_button); - //EditText editText = (EditText) findViewById(R.id.new_task_list_name); - RelativeLayout layout = (RelativeLayout) findViewById(R.id.new_task_list_layout); - int taskListCount = adapter.getCount(); - SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); - String maxTaskListsString = sharedPref.getString("pref_conf_max_lists", "3"); - int maxTaskLists = Integer.valueOf(maxTaskListsString); - //createButton.setEnabled(taskListCount < maxTaskLists); - //editText.setEnabled(taskListCount < maxTaskLists); - if (taskListCount >= maxTaskLists) layout.setVisibility(View.GONE); - else layout.setVisibility(View.VISIBLE); + setContentView(R.layout.activity_tasklists); } } diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/adapters/TaskListCursorAdapter.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/adapters/TaskListCursorAdapter.java deleted file mode 100644 index f4d76cc..0000000 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/adapters/TaskListCursorAdapter.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.wismna.geoffroy.donext.adapters; - -import android.content.Context; -import android.database.Cursor; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ResourceCursorAdapter; -import android.widget.TextView; - -import com.wismna.geoffroy.donext.R; -import com.wismna.geoffroy.donext.database.DatabaseHelper; - -/** - * Created by geoffroy on 15-11-25. - * DEPRECATED - */ -public class TaskListCursorAdapter extends ResourceCursorAdapter { - public TaskListCursorAdapter(Context context, int layout, Cursor cursor, int flags) { - super(context, layout, cursor, flags); - } - - // The newView method is used to inflate a new view and return it, - // you don't bind any data to the view at this point. - @Override - public View newView(Context context, Cursor cursor, ViewGroup parent) { - return LayoutInflater.from(context).inflate(R.layout.item_task_list, parent, false); - } - - // The bindView method is used to bind all data to a given view - // such as setting the text on a TextView. - @Override - public void bindView(View view, Context context, Cursor cursor) { - // Find fields to populate in inflated template - TextView taskListCount = (TextView) view.findViewById(R.id.task_list_count); - TextView taskListName = (TextView) view.findViewById(R.id.task_list_name); - // Extract properties from cursor - String name = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.TASKLIST_COLUMN_NAME)); - long count = cursor.getLong(cursor.getColumnIndexOrThrow(DatabaseHelper.TASKLIST_COLUMN_TASK_COUNT)); - // Populate fields with extracted properties - taskListCount.setText(String.valueOf(count)); - taskListName.setText(name); - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - return super.getView(position, convertView, parent); - } -} 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 new file mode 100644 index 0000000..db653a8 --- /dev/null +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/adapters/TaskListRecyclerViewAdapter.java @@ -0,0 +1,153 @@ +package com.wismna.geoffroy.donext.adapters; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; + +import com.wismna.geoffroy.donext.ItemTouchHelpers.TaskListTouchHelper; +import com.wismna.geoffroy.donext.R; +import com.wismna.geoffroy.donext.dao.TaskList; +import com.wismna.geoffroy.donext.database.TaskListDataAccess; + +import java.util.Collections; +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 { + + private final List mValues; + private Context mContext; + + public TaskListRecyclerViewAdapter(List items, Context context) { + mValues = items; + mContext = context; + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.fragment_tasklist, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(final ViewHolder holder, final int position) { + holder.mItem = mValues.get(position); + holder.mTaskCountView.setText(String.valueOf(mValues.get(position).getTaskCount())); + holder.mTaskNameView.setText(mValues.get(position).getName()); + + // Handle inline name change + holder.mTaskNameView.setOnFocusChangeListener(new View.OnFocusChangeListener() { + @Override + public void onFocusChange(View v, boolean hasFocus) { + if (!hasFocus) + { + EditText editText = (EditText) v; + holder.mItem.setName(editText.getText().toString()); + + TaskListDataAccess taskListDataAccess = new TaskListDataAccess(mContext); + taskListDataAccess.open(); + + update(holder.mItem, position); + taskListDataAccess.updateName(holder.mItem.getId(), holder.mItem.getName()); + + taskListDataAccess.close(); + } + } + }); + + // 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) { + TaskListDataAccess taskListDataAccess = new TaskListDataAccess(mContext); + taskListDataAccess.open(); + + taskListDataAccess.deleteTaskList(holder.mItem.getId()); + remove(position); + + taskListDataAccess.close(); + } + }); + } + + @Override + public int getItemCount() { + return mValues.size(); + } + + public void add(TaskList item, int position) { + mValues.add(position, item); + notifyItemInserted(position); + } + + public void remove(int position) { + mValues.remove(position); + notifyItemRemoved(position); + } + + public void update(TaskList item, int position) { + mValues.set(position, item); + notifyItemChanged(position); + } + + @Override + public boolean onItemMove(int fromPosition, int toPosition) { + TaskListDataAccess taskListDataAccess = new TaskListDataAccess(mContext); + taskListDataAccess.open(); + long fromTaskId = mValues.get(fromPosition).getId(); + long toTaskId = mValues.get(toPosition).getId(); + + if (fromPosition < toPosition) { + for (int i = fromPosition; i < toPosition; i++) { + + Collections.swap(mValues, i, i + 1); + } + } + else { + for (int i = fromPosition; i > toPosition; i--) { + Collections.swap(mValues, i, i - 1); + } + } + + taskListDataAccess.updateOrder(fromTaskId, toPosition); + taskListDataAccess.updateOrder(toTaskId, fromPosition); + // Update the adapter on the fly + notifyItemMoved(fromPosition, toPosition); + + taskListDataAccess.close(); + return true; + } + + public class ViewHolder extends RecyclerView.ViewHolder { + public final View mView; + public final TextView mTaskCountView; + public final TextView mTaskNameView; + public final Button mTaskDeleteButton; + public TaskList mItem; + + public ViewHolder(View view) { + super(view); + mView = view; + mTaskCountView = (TextView) view.findViewById(R.id.task_list_count); + mTaskNameView = (TextView) view.findViewById(R.id.task_list_name); + mTaskDeleteButton = (Button) view.findViewById(R.id.task_list_delete); + } + + @Override + public String toString() { + return super.toString() + " '" + mTaskNameView.getText() + "'"; + } + } +} diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/adapters/TaskAdapter.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/adapters/TaskRecyclerViewAdapter.java similarity index 85% rename from DoNExt/app/src/main/java/com/wismna/geoffroy/donext/adapters/TaskAdapter.java rename to DoNExt/app/src/main/java/com/wismna/geoffroy/donext/adapters/TaskRecyclerViewAdapter.java index 7b589fa..94dcff4 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/adapters/TaskAdapter.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/adapters/TaskRecyclerViewAdapter.java @@ -10,22 +10,22 @@ import android.widget.TextView; import com.wismna.geoffroy.donext.R; import com.wismna.geoffroy.donext.dao.Task; -import com.wismna.geoffroy.donext.fragments.TasksFragment.OnListFragmentInteractionListener; import java.util.List; +//import com.wismna.geoffroy.donext.fragments.TasksFragment.OnListFragmentInteractionListener; + /** - * {@link RecyclerView.Adapter} that can display a {@link Task} and makes a call to the - * specified {@link OnListFragmentInteractionListener}. + * {@link RecyclerView.Adapter} that can display a {@link Task}. */ -public class TaskAdapter extends RecyclerView.Adapter { +public class TaskRecyclerViewAdapter extends RecyclerView.Adapter { private final List mValues; - private final OnListFragmentInteractionListener mListener; + //private final OnListFragmentInteractionListener mListener; - public TaskAdapter(List items, OnListFragmentInteractionListener listener) { + public TaskRecyclerViewAdapter(List items/*, OnListFragmentInteractionListener listener*/) { mValues = items; - mListener = listener; + //mListener = listener; } @Override @@ -59,7 +59,7 @@ public class TaskAdapter extends RecyclerView.Adapter { break; } - holder.mView.setOnClickListener(new View.OnClickListener() { + /*holder.mView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (null != mListener) { @@ -68,7 +68,7 @@ public class TaskAdapter extends RecyclerView.Adapter { mListener.onListFragmentInteraction(holder.mItem); } } - }); + });*/ } @Override diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/dao/Task.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/dao/Task.java index 677e81c..a35ee6d 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/dao/Task.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/dao/Task.java @@ -71,7 +71,7 @@ public class Task { this.deleted = deleted; } - public long getTaskList() { + public long getTaskListId() { return taskList; } diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/dao/TaskList.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/dao/TaskList.java index b8933d7..cd0ffa1 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/dao/TaskList.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/dao/TaskList.java @@ -8,6 +8,7 @@ public class TaskList { private long id; private String name; private long taskCount; + private int order; public long getId() { return id; @@ -25,10 +26,24 @@ public class TaskList { this.name = comment; } - // Will be used by the ArrayAdapter in the ListView + public long getTaskCount() { + return taskCount; + } + + public void setTaskCount(long taskCount) { + this.taskCount = taskCount; + } + + public int getOrder() { + return order; + } + + public void setOrder(int order) { + this.order = order; + } + @Override public String toString() { return name; } - } diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/database/DatabaseHelper.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/database/DatabaseHelper.java index f37ab66..5ab235f 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/database/DatabaseHelper.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/database/DatabaseHelper.java @@ -9,9 +9,10 @@ import android.database.sqlite.SQLiteOpenHelper; * Database helper class that contains table and column names as well as handles database creation */ public class DatabaseHelper extends SQLiteOpenHelper { - private static final int DATABASE_VERSION = 1; + private static final int DATABASE_VERSION = 2; private static final String DATABASE_NAME = "donext.db"; public static final String COLUMN_ID = "_id"; + public static final String COLUMN_ORDER = "displayorder"; public static final String TASKLIST_TABLE_NAME = "tasklist"; public static final String TASKLIST_COLUMN_NAME = "name"; @@ -19,7 +20,8 @@ public class DatabaseHelper extends SQLiteOpenHelper { private static final String TASKLIST_TABLE_CREATE = "CREATE TABLE " + TASKLIST_TABLE_NAME + " (" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + - TASKLIST_COLUMN_NAME + " TEXT NOT NULL);"; + TASKLIST_COLUMN_NAME + " TEXT NOT NULL, " + + COLUMN_ORDER + " INTEGER);"; public static final String TASKS_TABLE_NAME = "tasks"; public static final String TASKS_COLUMN_NAME = "name"; @@ -38,6 +40,7 @@ public class DatabaseHelper extends SQLiteOpenHelper { TASKS_COLUMN_CYCLE + " INTEGER DEFAULT 0, " + TASKS_COLUMN_DONE + " INTEGER DEFAULT 0, " + TASKS_COLUMN_DELETED + " INTEGER DEFAULT 0, " + + COLUMN_ORDER + " INTEGER, " + TASKS_COLUMN_LIST + " INTEGER NOT NULL, " + "FOREIGN KEY(" + TASKS_COLUMN_LIST + ") REFERENCES " + TASKLIST_TABLE_NAME + "(" + COLUMN_ID + ")" + @@ -55,6 +58,10 @@ public class DatabaseHelper extends SQLiteOpenHelper { @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - + if (oldVersion == 1) + { + // Add new Order column + db.execSQL("ALTER TABLE " + TASKLIST_TABLE_NAME + " ADD COLUMN " + COLUMN_ORDER + " INTEGER"); + } } } diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/database/TaskDataAccess.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/database/TaskDataAccess.java index 5ffe93a..87d3439 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/database/TaskDataAccess.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/database/TaskDataAccess.java @@ -71,15 +71,6 @@ public class TaskDataAccess { DatabaseHelper.COLUMN_ID + " = " + taskId, null); } - /*public Cursor deleteTask(Cursor taskCursor) { - Task task = cursorToTask(taskCursor); - long id = task.getId(); - //System.out.println("Task deleted with id: " + id); - database.delete(DatabaseHelper.TASKS_TABLE_NAME, DatabaseHelper.COLUMN_ID - + " = " + id, null); - return getAllTasksCursor(); - }*/ - public Task getTask(long id) { Cursor cursor = getTaskCursor(id); diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/database/TaskListDataAccess.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/database/TaskListDataAccess.java index 57b9d2c..f4709cc 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/database/TaskListDataAccess.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/database/TaskListDataAccess.java @@ -19,7 +19,8 @@ public class TaskListDataAccess { // Database fields private SQLiteDatabase database; private DatabaseHelper dbHelper; - //private String[] taskListColumns = {DatabaseHelper.COLUMN_ID, DatabaseHelper.TASKLIST_COLUMN_NAME}; + private String[] taskListColumns = + {DatabaseHelper.COLUMN_ID, DatabaseHelper.TASKLIST_COLUMN_NAME, DatabaseHelper.COLUMN_ORDER}; public TaskListDataAccess(Context context) { dbHelper = new DatabaseHelper(context); @@ -33,9 +34,10 @@ public class TaskListDataAccess { dbHelper.close(); } - /*public TaskList createTaskList(String name) { + public TaskList createTaskList(String name, int order) { ContentValues values = new ContentValues(); values.put(DatabaseHelper.TASKLIST_COLUMN_NAME, name); + values.put(DatabaseHelper.COLUMN_ORDER, order); long insertId = database.insert(DatabaseHelper.TASKLIST_TABLE_NAME, null, values); Cursor cursor = database.query(DatabaseHelper.TASKLIST_TABLE_NAME, @@ -45,31 +47,27 @@ public class TaskListDataAccess { TaskList newTaskList = cursorToTaskList(cursor); cursor.close(); return newTaskList; - }*/ - - public Cursor createTaskList(String name) { - ContentValues values = new ContentValues(); - values.put(DatabaseHelper.TASKLIST_COLUMN_NAME, name); - database.insert(DatabaseHelper.TASKLIST_TABLE_NAME, null, values); - return getAllTaskListsCursor(); } - /*public void deleteTaskList(TaskList comment) { - long id = comment.getId(); - System.out.println("Comment deleted with id: " + id); - database.delete(DatabaseHelper.TASKLIST_TABLE_NAME, DatabaseHelper.COLUMN_ID - + " = " + id, null); - }*/ - - public Cursor deleteTaskList(Cursor taskListCursor) { - TaskList taskList = cursorToTaskList(taskListCursor); - long id = taskList.getId(); - System.out.println("Task list deleted with id: " + id); + public void deleteTaskList(long id) { + // Delete all related tasks database.delete(DatabaseHelper.TASKS_TABLE_NAME, DatabaseHelper.TASKS_COLUMN_LIST + " = " + id, null); + // Delete list database.delete(DatabaseHelper.TASKLIST_TABLE_NAME, DatabaseHelper.COLUMN_ID + " = " + id, null); - return getAllTaskListsCursor(); + } + + public void updateOrder(long id, int order) { + ContentValues contentValues = new ContentValues(); + contentValues.put(DatabaseHelper.COLUMN_ORDER, order); + database.update(DatabaseHelper.TASKLIST_TABLE_NAME, contentValues, DatabaseHelper.COLUMN_ID + " = " + id, null); + } + + public void updateName(long id, String name) { + ContentValues contentValues = new ContentValues(); + contentValues.put(DatabaseHelper.TASKLIST_COLUMN_NAME, name); + database.update(DatabaseHelper.TASKLIST_TABLE_NAME, contentValues, DatabaseHelper.COLUMN_ID + " = " + id, null); } public List getAllTaskLists() { @@ -96,7 +94,8 @@ public class TaskListDataAccess { " FROM " + DatabaseHelper.TASKS_TABLE_NAME + " WHERE " + DatabaseHelper.TASKS_TABLE_NAME + "." + DatabaseHelper.TASKS_COLUMN_LIST + " = " + DatabaseHelper.TASKLIST_TABLE_NAME + "." + DatabaseHelper.COLUMN_ID + ") AS " + DatabaseHelper.TASKLIST_COLUMN_TASK_COUNT + - " FROM " + DatabaseHelper.TASKLIST_TABLE_NAME, + " FROM " + DatabaseHelper.TASKLIST_TABLE_NAME + + " ORDER BY " + DatabaseHelper.COLUMN_ORDER + " ASC ", null); } @@ -104,6 +103,9 @@ public class TaskListDataAccess { TaskList taskList = new TaskList(); taskList.setId(cursor.getLong(0)); taskList.setName(cursor.getString(1)); + taskList.setOrder(cursor.getInt(2)); + if (cursor.getColumnCount() == 4) + taskList.setTaskCount(cursor.getLong(3)); return taskList; } } diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/ConfirmDialogFragment.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/ConfirmDialogFragment.java index 86291dc..79bcc4e 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/ConfirmDialogFragment.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/ConfirmDialogFragment.java @@ -11,7 +11,7 @@ import android.support.v7.widget.RecyclerView; import android.view.KeyEvent; import com.wismna.geoffroy.donext.R; -import com.wismna.geoffroy.donext.adapters.TaskAdapter; +import com.wismna.geoffroy.donext.adapters.TaskRecyclerViewAdapter; public class ConfirmDialogFragment extends DialogFragment { public interface ConfirmDialogListener { @@ -20,25 +20,26 @@ public class ConfirmDialogFragment extends DialogFragment { } private ConfirmDialogListener confirmDialogListener; - private TaskAdapter taskAdapter; + //private TaskRecyclerViewAdapter taskRecyclerViewAdapter; private RecyclerView recyclerView; private String message; public static ConfirmDialogFragment newInstance( - TaskAdapter taskAdapter, String message, RecyclerView recyclerView) { + /*TaskRecyclerViewAdapter taskRecyclerViewAdapter, */String message, RecyclerView recyclerView) { - Bundle args = new Bundle(); + //Bundle args = new Bundle(); ConfirmDialogFragment fragment = new ConfirmDialogFragment(); - fragment.taskAdapter = taskAdapter; + //fragment.taskRecyclerViewAdapter = taskRecyclerViewAdapter; fragment.message = message; fragment.recyclerView = recyclerView; - fragment.setArguments(args); + //fragment.setArguments(args); return fragment; } - public TaskAdapter getTaskAdapter() { - return taskAdapter; + public TaskRecyclerViewAdapter getTaskRecyclerViewAdapter() { + //return taskRecyclerViewAdapter; + return (TaskRecyclerViewAdapter) recyclerView.getAdapter(); } public RecyclerView getRecyclerView() { @@ -53,7 +54,7 @@ public class ConfirmDialogFragment extends DialogFragment { Bundle args = getArguments(); int itemPosition = args.getInt("ItemPosition"); - getTaskAdapter().notifyItemChanged(itemPosition); + getTaskRecyclerViewAdapter().notifyItemChanged(itemPosition); } @Override @@ -93,7 +94,6 @@ public class ConfirmDialogFragment extends DialogFragment { .setOnKeyListener(new DialogInterface.OnKeyListener() { @Override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { - //return false; return keyCode != KeyEvent.KEYCODE_BACK; } }); diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TaskDialogFragment.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TaskDialogFragment.java index d363bf1..e222a7c 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TaskDialogFragment.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TaskDialogFragment.java @@ -7,7 +7,6 @@ import android.content.DialogInterface; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.DialogFragment; -import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.widget.ArrayAdapter; @@ -16,9 +15,8 @@ import android.widget.RadioGroup; import android.widget.Spinner; import com.wismna.geoffroy.donext.R; -import com.wismna.geoffroy.donext.adapters.TaskAdapter; +import com.wismna.geoffroy.donext.dao.Task; import com.wismna.geoffroy.donext.dao.TaskList; -import com.wismna.geoffroy.donext.database.TaskListDataAccess; import java.util.List; @@ -28,20 +26,8 @@ import java.util.List; */ public class TaskDialogFragment extends DialogFragment { - public TaskAdapter getTaskAdapter() { - return taskAdapter; - } - - public void setTaskAdapter(TaskAdapter taskAdapter) { - this.taskAdapter = taskAdapter; - } - - public RecyclerView getRecyclerView() { - return recyclerView; - } - - public void setRecyclerView(RecyclerView recyclerView) { - this.recyclerView = recyclerView; + public Task getTask() { + return task; } /** The activity that creates an instance of this dialog fragment must @@ -50,22 +36,20 @@ public class TaskDialogFragment extends DialogFragment { public interface NewTaskListener { void onNewTaskDialogPositiveClick(DialogFragment dialog); void onNewTaskDialogNeutralClick(DialogFragment dialog); - //void onDialogNegativeClick(DialogFragment dialog); } - private TaskAdapter taskAdapter; - private RecyclerView recyclerView; // Use this instance of the interface to deliver action events private NewTaskListener mListener; + private Task task; + private List taskLists; - public static TaskDialogFragment newInstance(TaskAdapter taskAdapter, RecyclerView recyclerView) { + public static TaskDialogFragment newInstance(Task task, List taskLists) { Bundle args = new Bundle(); - TaskDialogFragment fragment = new TaskDialogFragment(); - fragment.setTaskAdapter(taskAdapter); - fragment.setRecyclerView(recyclerView); fragment.setArguments(args); + fragment.task = task; + fragment.taskLists = taskLists; return fragment; } @@ -90,7 +74,7 @@ public class TaskDialogFragment extends DialogFragment { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); // Get the layout inflater LayoutInflater inflater = getActivity().getLayoutInflater(); - View view = inflater.inflate(R.layout.new_task, null); + View view = inflater.inflate(R.layout.fragment_task_details, null); // Inflate and set the layout for the dialog // Pass null as the parent view because its going in the dialog layout @@ -106,26 +90,19 @@ public class TaskDialogFragment extends DialogFragment { .setNegativeButton(R.string.new_task_cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // Send the negative button event back to the host activity - //mListener.onDialogNegativeClick(NoticeDialogFragment.this); // Canceled creation, nothing to do TaskDialogFragment.this.getDialog().cancel(); } }); - // Access database to retrieve task lists - TaskListDataAccess dataAccess = new TaskListDataAccess(getActivity()); - dataAccess.open(); - // Populate spinner with task lists Spinner spinner = (Spinner) view.findViewById(R.id.new_task_list); // Create an ArrayAdapter using the string array and a default spinner layout - List taskLists = dataAccess.getAllTaskLists(); ArrayAdapter adapter = new ArrayAdapter<>( getActivity(), android.R.layout.simple_spinner_item, taskLists); // Specify the layout to use when the list of choices appears adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); - dataAccess.close(); // Auto set list value to current tab Bundle args = getArguments(); @@ -133,33 +110,32 @@ public class TaskDialogFragment extends DialogFragment { spinner.setSelection(id); // Set other properties if they exist - EditText titleText = (EditText) view.findViewById(R.id.new_task_name); - titleText.setText(args.getString("title")); - EditText descText = (EditText) view.findViewById(R.id.new_task_description); - descText.setText(args.getString("description")); - RadioGroup priorityGroup = (RadioGroup) view.findViewById(R.id.new_task_priority); - int priority = args.getInt("priority"); - switch (priority) - { - case 0: - priorityGroup.check(R.id.new_task_priority_low); - break; - case 1: - priorityGroup.check(R.id.new_task_priority_normal); - break; - case 2: - priorityGroup.check(R.id.new_task_priority_high); - break; - } - // Add a Delete button in Edit mode - if (args.getLong("id") != 0) + if (task != null) { + EditText titleText = (EditText) view.findViewById(R.id.new_task_name); + titleText.setText(task.getName()); + EditText descText = (EditText) view.findViewById(R.id.new_task_description); + descText.setText(task.getDescription()); + RadioGroup priorityGroup = (RadioGroup) view.findViewById(R.id.new_task_priority); + switch (task.getPriority()) { + case 0: + priorityGroup.check(R.id.new_task_priority_low); + break; + case 1: + priorityGroup.check(R.id.new_task_priority_normal); + break; + case 2: + priorityGroup.check(R.id.new_task_priority_high); + break; + } + builder.setNeutralButton(R.string.new_task_delete, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mListener.onNewTaskDialogNeutralClick(TaskDialogFragment.this); } }); - setStyle(DialogFragment.STYLE_NO_TITLE, android.R.style.Theme_Holo_Light); + setStyle(DialogFragment.STYLE_NO_TITLE, android.R.style.Theme_Holo_Light); + } return builder.create(); } } 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 new file mode 100644 index 0000000..ba9804f --- /dev/null +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TaskListsFragment.java @@ -0,0 +1,99 @@ +package com.wismna.geoffroy.donext.fragments; + +import android.content.Context; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.support.v4.app.Fragment; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.helper.ItemTouchHelper; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.EditText; +import android.widget.RelativeLayout; + +import com.wismna.geoffroy.donext.ItemTouchHelpers.TaskListTouchHelper; +import com.wismna.geoffroy.donext.R; +import com.wismna.geoffroy.donext.adapters.TaskListRecyclerViewAdapter; +import com.wismna.geoffroy.donext.dao.TaskList; +import com.wismna.geoffroy.donext.database.TaskListDataAccess; + +/** + * A fragment representing a list of Items. + */ +public class TaskListsFragment extends Fragment { + private TaskListRecyclerViewAdapter taskListRecyclerViewAdapter; + private TaskListDataAccess taskListDataAccess; + + /** + * Mandatory empty constructor for the fragment manager to instantiate the + * fragment (e.g. upon screen orientation changes). + */ + public TaskListsFragment() { + } + + @Override + 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(); + } + + @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); + createTaskListButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + EditText editText = (EditText) view.findViewById(R.id.new_task_list_name); + String text = editText.getText().toString(); + if (text.matches("")) return; + int position = taskListRecyclerViewAdapter.getItemCount(); + + taskListDataAccess.open(); + TaskList taskList = taskListDataAccess.createTaskList(text, position); + taskListDataAccess.close(); + taskListRecyclerViewAdapter.add(taskList, position); + + editText.setText(""); + toggleVisibleCreateNewTaskListLayout(view); + } + }); + + // 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; + } + + private void toggleVisibleCreateNewTaskListLayout(View view) { + RelativeLayout layout = (RelativeLayout) 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"); + int maxTaskLists = Integer.valueOf(maxTaskListsString); + if (taskListCount >= maxTaskLists) layout.setVisibility(View.GONE); + else layout.setVisibility(View.VISIBLE); + } + +} 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 f887d2d..48d6407 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,6 @@ package com.wismna.geoffroy.donext.fragments; import android.content.Context; -import android.graphics.Color; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; @@ -15,28 +14,18 @@ import android.widget.TextView; import com.wismna.geoffroy.donext.ItemTouchHelpers.TaskTouchHelper; import com.wismna.geoffroy.donext.R; -import com.wismna.geoffroy.donext.adapters.TaskAdapter; -import com.wismna.geoffroy.donext.dao.Task; +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.listeners.RecyclerItemClickListener; import com.wismna.geoffroy.donext.widgets.NoScrollingLayoutManager; /** * A fragment representing a list of Items. - *

- * Activities containing this fragment MUST implement the {@link OnListFragmentInteractionListener} - * interface. */ public class TasksFragment extends Fragment { - - /*public interface TasksFragmentListener { - void onItemClick(View view, int position); - }*/ - private static final String TASK_LIST_ID = "task_list_id"; private long taskListId = -1; - //private TasksFragmentListener tasksFragmentListener; - private OnListFragmentInteractionListener mListener; /** * Mandatory empty constructor for the fragment manager to instantiate the @@ -65,12 +54,11 @@ public class TasksFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_task_list, container, false); + View 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.setLayoutManager(new LinearLayoutManager(context)); recyclerView.setLayoutManager(new NoScrollingLayoutManager(context)); TaskDataAccess taskDataAccess = new TaskDataAccess(view.getContext()); @@ -85,89 +73,39 @@ public class TasksFragment extends Fragment { totalTasksView.setText(String.valueOf(taskDataAccess.getTaskCount(taskListId) + " tasks")); // Set RecyclerView Adapter - final TaskAdapter taskAdapter = new TaskAdapter(taskDataAccess.getAllTasks(taskListId), mListener); - recyclerView.setAdapter(taskAdapter); + final TaskRecyclerViewAdapter 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( - taskAdapter, taskDataAccess, getFragmentManager(), recyclerView); + taskRecyclerViewAdapter, taskDataAccess, getFragmentManager(), recyclerView); ItemTouchHelper helper = new ItemTouchHelper(callback); helper.attachToRecyclerView(recyclerView); // Implements touch listener to add click detection - //final Toast mToast = Toast.makeText(getActivity(), "", Toast.LENGTH_SHORT); recyclerView.addOnItemTouchListener( - new RecyclerItemClickListener(context, new RecyclerItemClickListener.OnItemClickListener() { - @Override - public void onItemClick(View view, int position) { - //tasksFragmentListener.onItemClick(view, position); + new RecyclerItemClickListener(context, new RecyclerItemClickListener.OnItemClickListener() { + @Override + public void onItemClick(View view, int position) { + Bundle args = new Bundle(); + args.putInt("position", position); - TextView idTextView = (TextView) view.findViewById(R.id.task_id); - //mToast.setText("Item " + idTextView.getText() + " clicked!"); - //mToast.show(); + // Set current tab value to new task dialog + ViewPager viewPager = (ViewPager) getActivity().findViewById(R.id.container); + args.putInt("list", viewPager.getCurrentItem()); - FragmentManager manager = getFragmentManager(); - TaskDialogFragment taskDialogFragment = TaskDialogFragment.newInstance(taskAdapter, recyclerView); + FragmentManager manager = getFragmentManager(); + TaskDialogFragment taskDialogFragment = TaskDialogFragment.newInstance(/*taskRecyclerViewAdapter, recyclerView,*/ + taskRecyclerViewAdapter.getItem(position), + ((MainActivity.SectionsPagerAdapter)viewPager.getAdapter()).getAllItems()); - Bundle args = new Bundle(); - args.putLong("id", Long.valueOf(idTextView.getText().toString())); - args.putInt("position", position); - - // Set current tab value to new task dialog - ViewPager viewPager =(ViewPager) getActivity().findViewById(R.id.container); - args.putInt("list", viewPager.getCurrentItem()); - - // Set title - TextView titleTextView = (TextView) view.findViewById(R.id.task_name); - args.putString("title", titleTextView.getText().toString()); - // Set description - TextView descTextView = (TextView) view.findViewById(R.id.task_description); - args.putString("description", descTextView.getText().toString()); - // Set priority - int priority = 1; - if (titleTextView.getCurrentTextColor() == Color.LTGRAY) priority = 0; - else if (titleTextView.getTypeface().isBold()) priority = 2; - args.putInt("priority", priority); - - taskDialogFragment.setArguments(args); - taskDialogFragment.show(manager, "Edit task"); - } - }) + taskDialogFragment.setArguments(args); + taskDialogFragment.show(manager, "Edit task"); + } + }) ); return view; } - - - @Override - public void onAttach(Context context) { - super.onAttach(context); - if (context instanceof OnListFragmentInteractionListener) { - mListener = (OnListFragmentInteractionListener) context; - } else { - throw new RuntimeException(context.toString() - + " must implement OnListFragmentInteractionListener"); - } - } - - @Override - public void onDetach() { - super.onDetach(); - mListener = null; - } - - /** - * This interface must be implemented by activities that contain this - * fragment to allow an interaction in this fragment to be communicated - * to the activity and potentially other fragments contained in that - * activity. - *

- * See the Android Training lesson Communicating with Other Fragments for more information. - */ - public interface OnListFragmentInteractionListener { - void onListFragmentInteraction(Task item); - } } diff --git a/DoNExt/app/src/main/res/layout/activity_task.xml b/DoNExt/app/src/main/res/layout/activity_task.xml deleted file mode 100644 index 87f2538..0000000 --- a/DoNExt/app/src/main/res/layout/activity_task.xml +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - - - - - - - - - -