New DynamicDialogFragment abstract class for dialogs

New fragment extending DynamicDialogFragment for Task Form
New fragment extending DynamicDialogFragment for Today Form (WIP)
Bug corrections related to the above
This commit is contained in:
bg45
2017-03-21 17:41:42 -04:00
parent 428de8e2b1
commit 51439ac8b7
19 changed files with 718 additions and 26 deletions

View File

@@ -28,7 +28,7 @@ import com.wismna.geoffroy.donext.adapters.TaskRecyclerViewAdapter;
import com.wismna.geoffroy.donext.dao.Task; import com.wismna.geoffroy.donext.dao.Task;
import com.wismna.geoffroy.donext.dao.TaskList; import com.wismna.geoffroy.donext.dao.TaskList;
import com.wismna.geoffroy.donext.database.TaskListDataAccess; import com.wismna.geoffroy.donext.database.TaskListDataAccess;
import com.wismna.geoffroy.donext.fragments.TaskDialogFragment; import com.wismna.geoffroy.donext.fragments.TaskFormDialogFragment;
import com.wismna.geoffroy.donext.fragments.TasksFragment; import com.wismna.geoffroy.donext.fragments.TasksFragment;
import java.util.List; import java.util.List;
@@ -183,20 +183,24 @@ public class MainActivity extends AppCompatActivity implements TasksFragment.Tas
/** Called when user clicks on the New Task floating button */ /** Called when user clicks on the New Task floating button */
public void onNewTaskClick(View view) { public void onNewTaskClick(View view) {
int currentTabPosition = mViewPager.getCurrentItem(); int currentTabPosition = mViewPager.getCurrentItem();
TaskDialogFragment taskDialogFragment = TaskDialogFragment.newInstance(null, TaskFormDialogFragment taskDialogFragment = TaskFormDialogFragment.newInstance(null,
mSectionsPagerAdapter.getAllItems(), mSectionsPagerAdapter.getAllItems(),
(TasksFragment) mSectionsPagerAdapter.getRegisteredFragment(currentTabPosition)); (TasksFragment) mSectionsPagerAdapter.getRegisteredFragment(currentTabPosition));
FragmentManager fragmentManager = getSupportFragmentManager(); // Set some configuration values for the tab
// Set current tab value to new task dialog
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putInt("list", currentTabPosition); args.putInt("list", currentTabPosition);
args.putBoolean("layout", mIsLargeLayout); args.putBoolean("layout", mIsLargeLayout);
args.putBoolean("today", sharedPref.getBoolean("pref_conf_today_enable", false)); args.putBoolean("today", sharedPref.getBoolean("pref_conf_today_enable", false));
args.putBoolean("neutral", false);
args.putString("button_positive", getString(R.string.new_task_save));
args.putString("button_negative", getString(R.string.new_task_cancel));
args.putString("button_neutral", getString(R.string.new_task_delete));
taskDialogFragment.setArguments(args); taskDialogFragment.setArguments(args);
String title = getString(R.string.action_new_task); String title = getString(R.string.action_new_task);
FragmentManager fragmentManager = getSupportFragmentManager();
if (mIsLargeLayout) if (mIsLargeLayout)
taskDialogFragment.show(fragmentManager, title); taskDialogFragment.show(fragmentManager, title);
else { else {

View File

@@ -1,15 +1,25 @@
package com.wismna.geoffroy.donext.activities; package com.wismna.geoffroy.donext.activities;
import android.os.Bundle; import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.view.View; import android.view.View;
import com.wismna.geoffroy.donext.R; import com.wismna.geoffroy.donext.R;
import com.wismna.geoffroy.donext.dao.Task;
import com.wismna.geoffroy.donext.database.TaskDataAccess;
import com.wismna.geoffroy.donext.fragments.TodayFormDialogFragment;
public class TodayActivity extends AppCompatActivity { import java.util.List;
public class TodayActivity extends AppCompatActivity
implements TodayFormDialogFragment.TodayTaskListener {
private boolean mIsLargeLayout;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@@ -24,8 +34,43 @@ public class TodayActivity extends AppCompatActivity {
// Enable the Up button // Enable the Up button
ab.setDisplayHomeAsUpEnabled(true); ab.setDisplayHomeAsUpEnabled(true);
} }
mIsLargeLayout = getResources().getBoolean(R.bool.large_layout);
} }
public void onNewTaskClick(View view) { public void onNewTaskClick(View view) {
List<Task> tasks;
try(TaskDataAccess taskDataAccess = new TaskDataAccess(this)) {
tasks = taskDataAccess.getAllTasks();
}
TodayFormDialogFragment taskDialogFragment =
TodayFormDialogFragment.newInstance(tasks, TodayActivity.this);
// Set some configuration values for the dialog
Bundle args = new Bundle();
args.putBoolean("layout", mIsLargeLayout);
args.putString("button_positive", getString(R.string.new_task_save));
args.putString("button_negative", getString(R.string.new_task_cancel));
taskDialogFragment.setArguments(args);
String title = getString(R.string.action_today_select);
FragmentManager fragmentManager = getSupportFragmentManager();
if (mIsLargeLayout)
taskDialogFragment.show(fragmentManager, title);
else {
// The device is smaller, so show the fragment fullscreen
FragmentTransaction transaction = fragmentManager.beginTransaction();
// For a little polish, specify a transition animation
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
// To make it fullscreen, use the 'content' root view as the container
// for the fragment, which is always the root view for the activity
transaction.add(android.R.id.content, taskDialogFragment, title)
.addToBackStack(null).commit();
}
}
@Override
public void onTodayTaskDialogPositiveClick(DialogFragment dialog, View dialogView) {
} }
} }

View File

@@ -114,7 +114,7 @@ public class Task {
} }
public boolean isToday() { public boolean isToday() {
return todayDate!= null && todayDate.isEqual(LocalDate.now()); return todayDate != null && todayDate.isEqual(LocalDate.now());
} }
// Will be used by the ArrayAdapter in the ListView // Will be used by the ArrayAdapter in the ListView

View File

@@ -87,10 +87,19 @@ public class TaskDataAccess implements AutoCloseable {
contentValues.put(column, 1); contentValues.put(column, 1);
return database.update(DatabaseHelper.TASKS_TABLE_NAME, contentValues, return database.update(DatabaseHelper.TASKS_TABLE_NAME, contentValues,
DatabaseHelper.TASKS_COLUMN_DUEDATE + " <= date('now','-1 day')" + DatabaseHelper.TASKS_COLUMN_DUEDATE + " <= date('now','-1 day')" +
" AND " + DatabaseHelper.TASKS_COLUMN_LIST + " = " + taskListId, null); " AND " + DatabaseHelper.TASKS_COLUMN_LIST + " = " + taskListId, null);
} }
public List<Task> getAllTasks(long id) { public List<Task> getAllTasks() {
Cursor cursor = database.query(DatabaseHelper.TASKS_TABLE_NAME, taskColumns,
DatabaseHelper.TASKS_COLUMN_DONE + " = " + 0 +
" AND " + DatabaseHelper.TASKS_COLUMN_DELETED + " = " + 0,
null, null, null,
DatabaseHelper.TASKS_COLUMN_CYCLE + ", " + DatabaseHelper.COLUMN_ID + " DESC");
return getTasksFromCursor(cursor);
}
public List<Task> getAllTasksFromList(long id) {
Cursor cursor = database.query(DatabaseHelper.TASKS_TABLE_NAME, taskColumns, Cursor cursor = database.query(DatabaseHelper.TASKS_TABLE_NAME, taskColumns,
DatabaseHelper.TASKS_COLUMN_LIST + " = " + id + DatabaseHelper.TASKS_COLUMN_LIST + " = " + id +
" AND " + DatabaseHelper.TASKS_COLUMN_DONE + " = " + 0 + " AND " + DatabaseHelper.TASKS_COLUMN_DONE + " = " + 0 +

View File

@@ -0,0 +1,184 @@
package com.wismna.geoffroy.donext.fragments;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import com.wismna.geoffroy.donext.R;
/**
* Created by wismna on 2017-03-21.
* Sub-class this class to create a dynamic fragment that will act as a Dialog in large layouts and
* a full screen fragment in smaller layouts.
*/
public abstract class DynamicDialogFragment extends DialogFragment {
private View mDialogView = null;
protected boolean mHasNeutralButton = false;
protected boolean mIsLargeLayout = false;
protected Fragment mContentFragment = new Fragment();
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// This part is only needed on small layouts (large layouts use onCreateDialog)
if (!mIsLargeLayout) {
View view = inflater.inflate(R.layout.fragment_dynamic_dialog, container, false);
AppCompatActivity activity = (AppCompatActivity) getActivity();
activity.setSupportActionBar(setToolbarTitle(view));
ActionBar actionBar = activity.getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
actionBar.setHomeAsUpIndicator(android.R.drawable.ic_menu_close_clear_cancel);
}
setHasOptionsMenu(true);
setContentFragment();
return view;
}
//return super.onCreateView(inflater, container, savedInstanceState);
// Returns the saved view from Dialog Builder on large screens
return mDialogView;
}
@Override
@NonNull
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Inflate and set the layout for the dialog
LayoutInflater inflater = getActivity().getLayoutInflater();
// As it is a Dialog, the root ViewGroup can be null without issues
@SuppressLint("InflateParams") final View view = inflater.inflate(R.layout.fragment_dynamic_dialog, null);
setToolbarTitle(view);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
Bundle args = getArguments();
// Pass null as the parent view because its going in the dialog layout
builder.setView(view)
// Add action buttons
.setPositiveButton(args.getString("button_positive"), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
onPositiveButtonClick(view);
}
})
.setNegativeButton(args.getString("button_negative"), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// Send the negative button event back to the host activity
// Canceled creation, nothing to do
//dialog.cancel();
onNegativeButtonClick();
}
});
if (mHasNeutralButton) {
builder.setNeutralButton(args.getString("button_neutral"), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
onNeutralButtonClick(view);
}
});
}
setContentFragment();
// Save the View so that it can returned by onCreateView
// (otherwise it is null and it poses problems when committing child fragment transactions)
mDialogView = view;
return builder.create();
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
//super.onCreateOptionsMenu(menu, inflater);
menu.clear();
getActivity().getMenuInflater().inflate(R.menu.menu_dynamic_fragment, menu);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
// Show the neutral button if needed
if (!mHasNeutralButton) {
menu.removeItem(R.id.menu_neutral_button);
}
super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Determine which menu item was clicked
int id = item.getItemId();
View view = getView();
// Hide the keyboard if present
if (view != null) {
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
}
if (id == R.id.menu_positive_button) {
// Handle positive button click here
onPositiveButtonClick(view);
return true;
}
else if (id == R.id.menu_neutral_button) {
// Handle neutral button click here
onNeutralButtonClick(view);
return true;
}
else if (id == android.R.id.home) {
// Handle negative button click here
onNegativeButtonClick();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onDestroyView() {
Dialog dialog = getDialog();
// Stop the dialog from being dismissed on rotation, due to a bug with the compatibility library
// https://code.google.com/p/android/issues/detail?id=17423
if (dialog != null && getRetainInstance()) {
dialog.setDismissMessage(null);
}
super.onDestroyView();
}
private void setContentFragment() {
// Get the child fragment manager (and not the "normal" one)
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
// Set the actual content of the fragment
transaction.replace(R.id.dynamic_fragment_content, mContentFragment);
// Commit the transaction instantly
transaction.commitNow();
}
/** Sets the title of the Fragment from the Tag */
private Toolbar setToolbarTitle(View view) {
Toolbar toolbar = (Toolbar) view.findViewById(R.id.dialog_toolbar);
toolbar.setTitle(getTag());
return toolbar;
}
protected abstract void onPositiveButtonClick(View view);
protected abstract void onNeutralButtonClick(View view);
protected abstract void onNegativeButtonClick();
}

View File

@@ -38,6 +38,7 @@ import java.util.List;
* Created by geoffroy on 15-11-26. * Created by geoffroy on 15-11-26.
* Represents a New or Edit Task dialog * Represents a New or Edit Task dialog
*/ */
@Deprecated
public class TaskDialogFragment extends DialogFragment { public class TaskDialogFragment extends DialogFragment {
public Task getTask() { public Task getTask() {
@@ -128,13 +129,13 @@ public class TaskDialogFragment extends DialogFragment {
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
//super.onCreateOptionsMenu(menu, inflater); //super.onCreateOptionsMenu(menu, inflater);
menu.clear(); menu.clear();
getActivity().getMenuInflater().inflate(R.menu.menu_new_task, menu); getActivity().getMenuInflater().inflate(R.menu.menu_dynamic_fragment, menu);
} }
@Override @Override
public void onPrepareOptionsMenu(Menu menu) { public void onPrepareOptionsMenu(Menu menu) {
if (task == null) { if (task == null) {
menu.removeItem(R.id.menu_new_task_delete); menu.removeItem(R.id.menu_neutral_button);
} }
super.onPrepareOptionsMenu(menu); super.onPrepareOptionsMenu(menu);
} }
@@ -150,12 +151,12 @@ public class TaskDialogFragment extends DialogFragment {
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE); InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getView().getWindowToken(), 0); imm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
} }
if (id == R.id.menu_new_task_save) { if (id == R.id.menu_positive_button) {
// handle save button click here // handle save button click here
onPositiveButtonClick(view); onPositiveButtonClick(view);
return true; return true;
} }
else if (id == R.id.menu_new_task_delete) { else if (id == R.id.menu_neutral_button) {
// handle delete button click here // handle delete button click here
onNeutralButtonClick(); onNeutralButtonClick();
return true; return true;
@@ -227,7 +228,7 @@ public class TaskDialogFragment extends DialogFragment {
} }
private Toolbar setToolbarTitle(View view) { private Toolbar setToolbarTitle(View view) {
Toolbar toolbar = (Toolbar) view.findViewById(R.id.new_task_toolbar); Toolbar toolbar = (Toolbar) view.findViewById(R.id.dialog_toolbar);
toolbar.setTitle(getTag()); toolbar.setTitle(getTag());
return toolbar; return toolbar;
} }

View File

@@ -0,0 +1,23 @@
package com.wismna.geoffroy.donext.fragments;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.wismna.geoffroy.donext.R;
/**
* Created by bg45 on 2017-03-21.
* Content fragment for the Task Form Dialog fragment.
*/
public class TaskFormContentFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.content_task_form, container, false);
}
}

View File

@@ -0,0 +1,142 @@
package com.wismna.geoffroy.donext.fragments;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.SeekBar;
import android.widget.Spinner;
import android.widget.TextView;
import com.wismna.geoffroy.donext.R;
import com.wismna.geoffroy.donext.dao.Task;
import com.wismna.geoffroy.donext.dao.TaskList;
import org.joda.time.LocalDate;
import java.util.List;
/**
* Created by bg45 on 2017-03-21.
* This is Task Form dynamic dialog fragment
*/
public class TaskFormDialogFragment extends DynamicDialogFragment {
public Task getTask() {
return task;
}
/** The activity that creates an instance of this dialog fragment must
* implement this interface in order to receive event callbacks.
* Each method passes the DialogFragment in case the host needs to query it. */
interface NewTaskListener {
void onNewTaskDialogPositiveClick(DialogFragment dialog, View dialogView);
void onNewTaskDialogNeutralClick(DialogFragment dialog);
}
private TaskFormDialogFragment.NewTaskListener mListener;
private Task task;
private List<TaskList> taskLists;
public static TaskFormDialogFragment newInstance(Task task, List<TaskList> taskLists, NewTaskListener newTaskListener) {
TaskFormDialogFragment fragment = new TaskFormDialogFragment();
fragment.task = task;
fragment.taskLists = taskLists;
fragment.mListener = newTaskListener;
fragment.setRetainInstance(true);
return fragment;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContentFragment = new TaskFormContentFragment();
Bundle args = getArguments();
if (args != null) {
mIsLargeLayout = args.getBoolean("layout");
mHasNeutralButton = args.getBoolean("neutral");
}
}
@Override
public void onStart() {
super.onStart();
// Set Task Form specific information at that point because we are sure that the view is
// entirely inflated (with the content fragment)
setTaskValues(getView());
}
@Override
protected void onPositiveButtonClick(View view) {
if (view == null) return;
EditText titleText = (EditText) view.findViewById(R.id.new_task_name);
// handle confirmation button click hereEditText titleText = (EditText) d.findViewById(R.id.new_task_name);
if (titleText.getText().toString().matches(""))
titleText.setError(getResources().getString(R.string.new_task_name_error));
else {
// Send the positive button event back to the host activity
mListener.onNewTaskDialogPositiveClick(TaskFormDialogFragment.this, view);
dismiss();
}
}
@Override
protected void onNeutralButtonClick(View view) {
mListener.onNewTaskDialogNeutralClick(TaskFormDialogFragment.this);
}
@Override
protected void onNegativeButtonClick() {
dismiss();
}
private void setTaskValues(View view) {
// Get date picker
final DatePicker dueDatePicker = (DatePicker) view.findViewById(R.id.new_task_due_date);
// 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
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);
// Auto set list value to current tab
Bundle args = getArguments();
int id = args.getInt("list");
spinner.setSelection(id);
CheckBox checkBox = (CheckBox) view.findViewById(R.id.new_task_today);
TextView todayLabel = (TextView) view.findViewById(R.id.new_task_today_label);
boolean isTodayActive = args.getBoolean("today");
checkBox.setVisibility(isTodayActive ? View.VISIBLE : View.GONE);
todayLabel.setVisibility(isTodayActive ? View.VISIBLE : View.GONE);
// Set other properties if they exist
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());
SeekBar seekBar = (SeekBar) view.findViewById(R.id.new_task_priority);
seekBar.setProgress(task.getPriority());
// Set Due Date
LocalDate dueDate = task.getDueDate();
dueDatePicker.updateDate(dueDate.getYear(), dueDate.getMonthOfYear() - 1, dueDate.getDayOfMonth());
checkBox.setChecked(task.isToday());
}
else {
// Disallow past dates on new tasks
dueDatePicker.setMinDate(LocalDate.now().toDate().getTime());
}
}
}

View File

@@ -44,7 +44,7 @@ import java.util.List;
* A fragment representing a list of Items. * A fragment representing a list of Items.
*/ */
public class TasksFragment extends Fragment implements public class TasksFragment extends Fragment implements
TaskDialogFragment.NewTaskListener, TaskFormDialogFragment.NewTaskListener,
ConfirmDialogFragment.ConfirmDialogListener, ConfirmDialogFragment.ConfirmDialogListener,
TaskTouchHelper.TaskTouchHelperAdapter { TaskTouchHelper.TaskTouchHelperAdapter {
@@ -106,7 +106,7 @@ public class TasksFragment extends Fragment implements
// Get all tasks // Get all tasks
try (TaskDataAccess taskDataAccess = new TaskDataAccess(view.getContext())) { try (TaskDataAccess taskDataAccess = new TaskDataAccess(view.getContext())) {
taskRecyclerViewAdapter = new TaskRecyclerViewAdapter( taskRecyclerViewAdapter = new TaskRecyclerViewAdapter(
isTodayView? taskDataAccess.getTodayTasks() : taskDataAccess.getAllTasks(taskListId), isTodayView? taskDataAccess.getTodayTasks() : taskDataAccess.getAllTasksFromList(taskListId),
Integer.valueOf(sharedPref.getString("pref_conf_task_layout", "1"))); Integer.valueOf(sharedPref.getString("pref_conf_task_layout", "1")));
} }
recyclerView.setAdapter(taskRecyclerViewAdapter); recyclerView.setAdapter(taskRecyclerViewAdapter);
@@ -126,6 +126,10 @@ public class TasksFragment extends Fragment implements
args.putInt("position", position); args.putInt("position", position);
args.putBoolean("layout", mIsLargeLayout); args.putBoolean("layout", mIsLargeLayout);
args.putBoolean("today", sharedPref.getBoolean("pref_conf_today_enable", false)); args.putBoolean("today", sharedPref.getBoolean("pref_conf_today_enable", false));
args.putBoolean("neutral", true);
args.putString("button_positive", getString(R.string.new_task_save));
args.putString("button_negative", getString(R.string.new_task_cancel));
args.putString("button_neutral", getString(R.string.new_task_delete));
// Set current tab value to new task dialog // Set current tab value to new task dialog
ViewPager viewPager = (ViewPager) getActivity().findViewById(R.id.container); ViewPager viewPager = (ViewPager) getActivity().findViewById(R.id.container);
@@ -149,7 +153,7 @@ public class TasksFragment extends Fragment implements
} }
FragmentManager manager = getFragmentManager(); FragmentManager manager = getFragmentManager();
TaskDialogFragment taskDialogFragment = TaskDialogFragment.newInstance( TaskFormDialogFragment taskDialogFragment = TaskFormDialogFragment.newInstance(
task, taskLists, TasksFragment.this); task, taskLists, TasksFragment.this);
taskDialogFragment.setArguments(args); taskDialogFragment.setArguments(args);
@@ -335,7 +339,7 @@ public class TasksFragment extends Fragment implements
// Get the dialog fragment // Get the dialog fragment
if (dialogView == null) return; if (dialogView == null) return;
long id = 0; long id = 0;
Task task = ((TaskDialogFragment)dialog).getTask(); Task task = ((TaskFormDialogFragment)dialog).getTask();
if (task != null) id = task.getId(); if (task != null) id = task.getId();
// Get the controls // Get the controls
@@ -346,7 +350,7 @@ public class TasksFragment extends Fragment implements
DatePicker dueDatePicker = (DatePicker) dialogView.findViewById(R.id.new_task_due_date); DatePicker dueDatePicker = (DatePicker) dialogView.findViewById(R.id.new_task_due_date);
TaskList taskList = (TaskList) listSpinner.getSelectedItem(); TaskList taskList = (TaskList) listSpinner.getSelectedItem();
CheckBox todayList = (CheckBox) dialogView.findViewById(R.id.new_task_today); CheckBox todayList = (CheckBox) dialogView.findViewById(R.id.new_task_today);
boolean isToday = todayList.isChecked();
// Add the task to the database // Add the task to the database
try (TaskDataAccess taskDataAccess = new TaskDataAccess(view.getContext(), TaskDataAccess.MODE.WRITE)) { try (TaskDataAccess taskDataAccess = new TaskDataAccess(view.getContext(), TaskDataAccess.MODE.WRITE)) {
Task newTask = taskDataAccess.createOrUpdateTask(id, Task newTask = taskDataAccess.createOrUpdateTask(id,
@@ -355,7 +359,7 @@ public class TasksFragment extends Fragment implements
seekBar.getProgress(), seekBar.getProgress(),
taskList.getId(), taskList.getId(),
new LocalDate(dueDatePicker.getYear(), dueDatePicker.getMonth() + 1, dueDatePicker.getDayOfMonth()), new LocalDate(dueDatePicker.getYear(), dueDatePicker.getMonth() + 1, dueDatePicker.getDayOfMonth()),
todayList.isChecked()); isToday);
Bundle args = dialog.getArguments(); Bundle args = dialog.getArguments();
// Should never happen because we will have to be on this tab to open the dialog // Should never happen because we will have to be on this tab to open the dialog
@@ -377,15 +381,16 @@ public class TasksFragment extends Fragment implements
else { else {
int position = args.getInt("position"); int position = args.getInt("position");
// Check if task list was changed // Check if task list was changed
if (mAdapter != null && task.getTaskListId() != taskList.getId()) if ((isTodayView && !isToday) || (!isTodayView && task.getTaskListId() != taskList.getId()))
{ {
// Remove item from current tab // Remove item from current tab
taskRecyclerViewAdapter.remove(position); taskRecyclerViewAdapter.remove(position);
//UpdateCycleCount();
// Add it to the corresponding tab provided it is already instantiated // Add it to the corresponding tab provided it is already instantiated
mAdapter.onTaskListChanged(newTask, listSpinner.getSelectedItemPosition()); if (mAdapter != null) mAdapter.onTaskListChanged(newTask, listSpinner.getSelectedItemPosition());
} else taskRecyclerViewAdapter.update(newTask, position); } else {
taskRecyclerViewAdapter.update(newTask, position);
}
} }
} }
} }

View File

@@ -0,0 +1,23 @@
package com.wismna.geoffroy.donext.fragments;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.wismna.geoffroy.donext.R;
/**
* Created by bg45 on 2017-03-21.
* Contains the Today Form contents.
*/
public class TodayFormContentFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.content_today_form, container, false);
}
}

View File

@@ -0,0 +1,105 @@
package com.wismna.geoffroy.donext.fragments;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import com.wismna.geoffroy.donext.R;
import com.wismna.geoffroy.donext.dao.Task;
import java.util.List;
/**
* Created by bg45 on 2017-03-21.
* This is the Today Form dynamic dialog fragment
*/
public class TodayFormDialogFragment extends DynamicDialogFragment {
/** The activity that creates an instance of this dialog fragment must
* implement this interface in order to receive event callbacks.
* Each method passes the DialogFragment in case the host needs to query it. */
public interface TodayTaskListener {
void onTodayTaskDialogPositiveClick(DialogFragment dialog, View dialogView);
}
private TodayFormDialogFragment.TodayTaskListener mListener;
private List<Task> tasks;
public static TodayFormDialogFragment newInstance(List<Task> tasks, TodayTaskListener todayTaskListener) {
TodayFormDialogFragment fragment = new TodayFormDialogFragment();
fragment.tasks = tasks;
fragment.mListener = todayTaskListener;
fragment.setRetainInstance(true);
return fragment;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContentFragment = new TodayFormContentFragment();
Bundle args = getArguments();
if (args != null) {
mIsLargeLayout = args.getBoolean("layout");
}
}
@Override
public void onStart() {
super.onStart();
setLayoutValues(getView());
}
private void setLayoutValues(View view) {
EditText editText = (EditText) view.findViewById(R.id.today_search);
ListView listView = (ListView) view.findViewById(R.id.today_tasks);
final ArrayAdapter<Task> adapter = new ArrayAdapter<>(getActivity(), R.layout.list_task_item, tasks);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// Set as selected
Task task = tasks.get(position);
view.setSelected(!view.isSelected());
}
});
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
adapter.getFilter().filter(s);
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
@Override
protected void onPositiveButtonClick(View view) {
mListener.onTodayTaskDialogPositiveClick(TodayFormDialogFragment.this, view);
}
@Override
protected void onNeutralButtonClick(View view) {
}
@Override
protected void onNegativeButtonClick() {
dismiss();
}
}

View File

@@ -0,0 +1,96 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
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:layout_marginTop="?attr/actionBarSize"
android:background="@android:color/background_light">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/text_margin"
android:orientation="vertical"
android:focusable="true"
android:focusableInTouchMode="true"
tools:context=".activities.MainActivity">
<TextView
android:id="@+id/new_task_list_label"
android:text="@string/new_task_list"
android:textAppearance="?android:attr/textAppearanceSmall"
android:layout_marginTop="3dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Spinner
android:id="@+id/new_task_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:layout_toEndOf="@id/new_task_list_label">
</Spinner>
<EditText
android:id="@+id/new_task_name"
android:hint="@string/new_task_name_hint"
android:maxLines="1"
android:inputType="text"
android:textSize="30sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/new_task_list"/>
<EditText
android:id="@+id/new_task_description"
android:hint="@string/new_task_description_hint"
android:gravity="top|start"
android:lines="3"
android:layout_marginTop="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/new_task_name" />
<TextView
android:id="@+id/new_task_priority_label"
android:text="@string/new_task_priority"
android:textAppearance="?android:attr/textAppearanceSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:layout_below="@id/new_task_description" />
<SeekBar
android:id="@+id/new_task_priority"
android:max="2"
android:progress="1"
android:layout_width="300dp"
android:layout_height="30dp"
android:layout_toEndOf="@id/new_task_priority_label"
android:layout_below="@id/new_task_description" />
<TextView
android:id="@+id/new_task_today_label"
android:text="@string/new_task_today"
android:textAppearance="?android:attr/textAppearanceSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_below="@id/new_task_priority" />
<CheckBox
android:id="@+id/new_task_today"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toEndOf="@id/new_task_today_label"
android:layout_below="@id/new_task_priority" />
<TextView
android:id="@+id/new_task_due_date_label"
android:text="@string/new_task_due_date"
android:textAppearance="?android:attr/textAppearanceSmall"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_below="@id/new_task_today" />
<DatePicker
android:id="@+id/new_task_due_date"
android:datePickerMode="spinner"
android:calendarViewShown="false"
android:spinnersShown="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/new_task_due_date_label" />
</RelativeLayout>
</ScrollView>

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize"
android:background="@android:color/background_light" >
<EditText
android:id="@+id/today_search"
android:hint="@string/today_search_hint"
android:maxLines="1"
android:inputType="text"
android:textSize="30sp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ListView
android:id="@+id/today_tasks"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textFilterEnabled="true">
</ListView>
</LinearLayout>

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<include layout="@layout/toolbar" android:id="@+id/dialog_toolbar" />
</android.support.design.widget.AppBarLayout>
<FrameLayout
android:id="@+id/dynamic_fragment_content"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.design.widget.CoordinatorLayout>

View File

@@ -11,7 +11,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay"> android:theme="@style/AppTheme.AppBarOverlay">
<include layout="@layout/toolbar" android:id="@+id/new_task_toolbar" /> <include layout="@layout/toolbar" android:id="@+id/dialog_toolbar" />
</android.support.design.widget.AppBarLayout> </android.support.design.widget.AppBarLayout>
<ScrollView <ScrollView

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="20dp"
android:textSize="20sp" />

View File

@@ -2,12 +2,12 @@
<menu xmlns:app="http://schemas.android.com/apk/res-auto" <menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"> xmlns:android="http://schemas.android.com/apk/res/android">
<item <item
android:id="@+id/menu_new_task_save" android:id="@+id/menu_positive_button"
android:orderInCategory="100" android:orderInCategory="100"
android:title="@string/new_task_save" android:title="@string/new_task_save"
app:showAsAction="always"/> app:showAsAction="always"/>
<item <item
android:id="@+id/menu_new_task_delete" android:id="@+id/menu_neutral_button"
android:orderInCategory="50" android:orderInCategory="50"
android:title="@string/new_task_delete" android:title="@string/new_task_delete"
app:showAsAction="ifRoom"/> app:showAsAction="ifRoom"/>

View File

@@ -70,4 +70,6 @@
<string name="action_todayList">Vue Aujourd\'hui</string> <string name="action_todayList">Vue Aujourd\'hui</string>
<string name="title_activity_today">Aujourd\'hui</string> <string name="title_activity_today">Aujourd\'hui</string>
<string name="new_task_today">Ajouter la tâche à la vue Aujourd\'hui?</string> <string name="new_task_today">Ajouter la tâche à la vue Aujourd\'hui?</string>
<string name="today_search_hint">Rechercher...</string>
<string name="action_today_select">Choisissez des tâches</string>
</resources> </resources>

View File

@@ -89,4 +89,9 @@
<string name="title_activity_today">Today</string> <string name="title_activity_today">Today</string>
<string name="new_task_today">Add task to Today View?</string> <string name="new_task_today">Add task to Today View?</string>
<string name="title_activity_main2">Main2Activity</string> <string name="title_activity_main2">Main2Activity</string>
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
<string name="today_search_hint">Search...</string>
<string name="action_today_select">Select tasks</string>
</resources> </resources>