List edition activity redone with a RecyclerView

Lists are now editable and swappable
Lots of code simplification (TaskDialogFragment...)
This commit is contained in:
2015-12-30 19:02:27 -05:00
parent 27884add9e
commit c8dbcb1aff
26 changed files with 547 additions and 523 deletions

View File

@@ -14,7 +14,6 @@
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
@@ -28,20 +27,12 @@
</activity>
<activity
android:name=".activities.TaskListActivity"
android:label="@string/task_list_activity_title"
android:label="@string/action_editTabs"
android:parentActivityName=".activities.MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activities.MainActivity" />
</activity>
<activity
android:name=".activities.TaskActivity"
android:label="@string/task_details_activity_title"
android:theme="@android:style/Theme.Holo.DialogWhenLarge" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activities.MainActivity" />
</activity>
</application>
</manifest>

View File

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

View File

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

View File

@@ -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<TaskList> getAllItems(){
return taskLists;
}
}
}

View File

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

View File

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

View File

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

View File

@@ -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<TaskListRecyclerViewAdapter.ViewHolder>
implements TaskListTouchHelper.TaskListTouchHelperAdapter {
private final List<TaskList> mValues;
private Context mContext;
public TaskListRecyclerViewAdapter(List<TaskList> 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() + "'";
}
}
}

View File

@@ -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<TaskAdapter.ViewHolder> {
public class TaskRecyclerViewAdapter extends RecyclerView.Adapter<TaskRecyclerViewAdapter.ViewHolder> {
private final List<Task> mValues;
private final OnListFragmentInteractionListener mListener;
//private final OnListFragmentInteractionListener mListener;
public TaskAdapter(List<Task> items, OnListFragmentInteractionListener listener) {
public TaskRecyclerViewAdapter(List<Task> items/*, OnListFragmentInteractionListener listener*/) {
mValues = items;
mListener = listener;
//mListener = listener;
}
@Override
@@ -59,7 +59,7 @@ public class TaskAdapter extends RecyclerView.Adapter<TaskAdapter.ViewHolder> {
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<TaskAdapter.ViewHolder> {
mListener.onListFragmentInteraction(holder.mItem);
}
}
});
});*/
}
@Override

View File

@@ -71,7 +71,7 @@ public class Task {
this.deleted = deleted;
}
public long getTaskList() {
public long getTaskListId() {
return taskList;
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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<TaskList> taskLists;
public static TaskDialogFragment newInstance(TaskAdapter taskAdapter, RecyclerView recyclerView) {
public static TaskDialogFragment newInstance(Task task, List<TaskList> 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<TaskList> taskLists = dataAccess.getAllTaskLists();
ArrayAdapter<TaskList> 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();
}
}

View File

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

View File

@@ -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.
* <p/>
* 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.
* <p/>
* See the Android Training lesson <a href=
* "http://developer.android.com/training/basics/fragments/communicating.html"
* >Communicating with Other Fragments</a> for more information.
*/
public interface OnListFragmentInteractionListener {
void onListFragmentInteraction(Task item);
}
}

View File

@@ -1,83 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="16dp"
android:orientation="vertical"
tools:context=".activities.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/new_task_list"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Spinner
android:id="@+id/new_task_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</Spinner>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/new_task_name"
android:textAppearance="?android:attr/textAppearanceLarge" />
<EditText
android:id="@+id/new_task_name"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/new_task_description"
android:textAppearance="?android:attr/textAppearanceLarge" />
<EditText
android:id="@+id/new_task_description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lines="3"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/new_task_priority"
android:textAppearance="?android:attr/textAppearanceLarge" />
<RadioGroup
android:id="@+id/new_task_priority"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RadioButton
android:id="@+id/new_task_priority_low"
android:text="@string/new_task_priority_low"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</RadioButton>
<RadioButton
android:id="@+id/new_task_priority_normal"
android:text="@string/new_task_priority_normal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:checked="true">
</RadioButton>
<RadioButton
android:id="@+id/new_task_priority_high"
android:text="@string/new_task_priority_high"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</RadioButton>
</RadioGroup>
<LinearLayout
android:padding="20dp"
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal" >
<Button
android:id="@+id/new_task_save"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="@string/new_task_save" />
<Button
android:id="@+id/new_task_cancel"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="@string/new_task_cancel"/>
</LinearLayout>
</LinearLayout>

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".activities.TaskListActivity">
<fragment
android:name="com.wismna.geoffroy.donext.fragments.TaskListsFragment"
android:id="@+id/fragment_task_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:layout="@layout/fragment_tasklists" />
</LinearLayout>

View File

@@ -1,29 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:padding="6dip">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:foreground="?selectableItemBackground" >
<TextView
android:id="@+id/task_list_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="test"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:padding="10dp"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<TextView
<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_centerVertical="true"
android:text="Name"
android:layout_toEndOf="@id/task_list_count"
android:inputType="text"
android:textAppearance="?android:attr/textAppearanceLarge"/>
<Button
android:id="@+id/task_list_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:padding="10dp"
android:text="@string/task_list_delete"
android:onClick="onDeleteTaskList" />
</RelativeLayout>
</RelativeLayout>

View File

@@ -23,12 +23,22 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:onClick="onCreateTaskList"
android:layout_alignParentEnd="true"
android:text="@string/task_list_new_list_create"/>
</RelativeLayout>
<ListView
android:id="@android:id/list"
<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/task_lists_view"
android:name="com.wismna.geoffroy.donext.fragments.TaskListFragment"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
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" />
</LinearLayout>

View File

@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/task_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>

View File

@@ -6,9 +6,7 @@
<string name="action_editTabs">Edit lists</string>
<string name="action_about">About</string>
<string name="action_new_task">New task</string>
<string name="section_format">Hello World from section: %1$d</string>
<string name="settings_activity_title">Settings</string>
<string name="task_list_activity_title">List edition</string>
<!-- Strings related to Task List edition -->
<string name="task_list_new_list_hint">New list name</string>