diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml index bc8736c..6d7c648 100644 --- a/.idea/assetWizardSettings.xml +++ b/.idea/assetWizardSettings.xml @@ -18,7 +18,7 @@ @@ -28,8 +28,7 @@ diff --git a/app/src/main/java/com/wismna/geoffroy/donext/adapters/SmartFragmentStatePagerAdapter.java b/app/src/main/java/com/wismna/geoffroy/donext/adapters/SmartFragmentStatePagerAdapter.java index 09bb5c7..1bbdde9 100644 --- a/app/src/main/java/com/wismna/geoffroy/donext/adapters/SmartFragmentStatePagerAdapter.java +++ b/app/src/main/java/com/wismna/geoffroy/donext/adapters/SmartFragmentStatePagerAdapter.java @@ -30,7 +30,7 @@ public abstract class SmartFragmentStatePagerAdapter extends FragmentStatePagerA // Register the fragment when the item is instantiated @NonNull @Override - public Object instantiateItem(ViewGroup container, int position) { + public Object instantiateItem(@NonNull ViewGroup container, int position) { Fragment fragment = (Fragment) super.instantiateItem(container, position); registeredFragments.put(position, fragment); return fragment; @@ -38,7 +38,7 @@ public abstract class SmartFragmentStatePagerAdapter extends FragmentStatePagerA // Unregister when the item is inactive @Override - public void destroyItem(ViewGroup container, int position, Object object) { + public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { registeredFragments.remove(position); super.destroyItem(container, position, object); } diff --git a/app/src/main/java/com/wismna/geoffroy/donext/adapters/TaskListRecyclerViewAdapter.java b/app/src/main/java/com/wismna/geoffroy/donext/adapters/TaskListRecyclerViewAdapter.java index 4af73c6..b6229e4 100644 --- a/app/src/main/java/com/wismna/geoffroy/donext/adapters/TaskListRecyclerViewAdapter.java +++ b/app/src/main/java/com/wismna/geoffroy/donext/adapters/TaskListRecyclerViewAdapter.java @@ -1,5 +1,6 @@ package com.wismna.geoffroy.donext.adapters; +import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.MotionEvent; @@ -40,15 +41,16 @@ public class TaskListRecyclerViewAdapter extends RecyclerView.Adapter getAllTasksFromList(long id, boolean isHistory) { + + // REMOVE THIS + /*ContentValues contentValues = new ContentValues(); + contentValues.put(DatabaseHelper.COLUMN_ORDER, 0); + database.update(DatabaseHelper.TASKS_TABLE_NAME, contentValues, + null, null);*/ + // -- + int history = isHistory ? 1 : 0; Cursor cursor = database.query(DatabaseHelper.TASKS_TABLE_NAME, taskColumns, DatabaseHelper.TASKS_COLUMN_LIST + " = " + id + " AND (" + DatabaseHelper.TASKS_COLUMN_DONE + " = " + history + (isHistory ? " OR " : " AND ") + DatabaseHelper.TASKS_COLUMN_DELETED + " = " + history + ")", null, null, null, - DatabaseHelper.TASKS_COLUMN_PRIORITY + " DESC"); - return getTasksFromCursor(cursor); + DatabaseHelper.COLUMN_ORDER); + List tasks = getTasksFromCursor(cursor); + + // Update orders for database migration + int count = tasks.size(); + if (getMaxOrder(id) == 0 && count > 1) { + for (int i = 1; i < count; i++) { + update(tasks.get(i).getId(), DatabaseHelper.COLUMN_ORDER, i); + tasks.get(i).setOrder(i); + } + } + return tasks; } public List getTodayTasks() { @@ -129,20 +150,28 @@ public class TaskDataAccess implements AutoCloseable { DatabaseHelper.TASKS_COLUMN_DONE + " = 0" + " AND " + DatabaseHelper.TASKS_COLUMN_DELETED + " = 0", null, null, null, - DatabaseHelper.TASKS_COLUMN_CYCLE + ", " + DatabaseHelper.COLUMN_ID + " DESC"); + DatabaseHelper.TASKS_COLUMN_TODAYORDER); return getTasksFromCursor(cursor); } - public void setDone(long id) { + public void increaseCycle(Task task, boolean isToday) { + String orderColumn = isToday ? DatabaseHelper.TASKS_COLUMN_TODAYORDER : DatabaseHelper.COLUMN_ORDER; + updateRemainingRowsOrder(task.getId(), orderColumn); + ContentValues contentValues = new ContentValues(); + contentValues.put(DatabaseHelper.TASKS_COLUMN_CYCLE, task.getCycle()); + contentValues.put(orderColumn, getMaxOrder(task.getTaskListId()) + 1); + database.update(DatabaseHelper.TASKS_TABLE_NAME, contentValues, + DatabaseHelper.COLUMN_ID + " == " + task.getId(), null); + } + + public void setDone(long id, boolean isToday) { update(id, DatabaseHelper.TASKS_COLUMN_DONE, 1); + updateRemainingRowsOrder(id, isToday ? DatabaseHelper.TASKS_COLUMN_TODAYORDER : DatabaseHelper.COLUMN_ORDER); } - public void increaseCycle(int newCycle, long id) { - update(id, DatabaseHelper.TASKS_COLUMN_CYCLE, newCycle); - } - - public void deleteTask(long id) { + public void deleteTask(long id, boolean isToday) { update(id, DatabaseHelper.TASKS_COLUMN_DELETED, 1); + updateRemainingRowsOrder(id, isToday ? DatabaseHelper.TASKS_COLUMN_TODAYORDER : DatabaseHelper.COLUMN_ORDER); } private void update(long id, String column, Object value) { @@ -164,6 +193,8 @@ public class TaskDataAccess implements AutoCloseable { task.setTaskList(cursor.getLong(7)); task.setDueDate(cursor.getString(8)); task.setTodayDate(cursor.getString(9)); + task.setOrder(cursor.getInt(10)); + task.setTodayOrder(cursor.getInt(11)); return task; } @@ -180,4 +211,25 @@ public class TaskDataAccess implements AutoCloseable { cursor.close(); return tasks; } + + private int getMaxOrder(long listId) { + try (Cursor maxOrderCursor = database.query(DatabaseHelper.TASKS_TABLE_NAME, new String[]{"MAX(" + DatabaseHelper.COLUMN_ORDER + ")"}, + DatabaseHelper.TASKS_COLUMN_LIST + " = " + listId, null, null, null, null)) { + maxOrderCursor.moveToFirst(); + + return maxOrderCursor.getInt(0); + } + } + + private void updateRemainingRowsOrder(long id, String orderColumn) { + try (Cursor cursor = database.rawQuery("UPDATE " + DatabaseHelper.TASKS_TABLE_NAME + + " SET " + orderColumn + " = " + orderColumn + " - 1" + + " WHERE " + orderColumn + " > " + + "(SELECT " + orderColumn + + " FROM " + DatabaseHelper.TASKS_TABLE_NAME + + " WHERE " + DatabaseHelper.COLUMN_ID + " = " + id + ")", + null)) { + cursor.moveToFirst(); + } + } } diff --git a/app/src/main/java/com/wismna/geoffroy/donext/database/TaskListDataAccess.java b/app/src/main/java/com/wismna/geoffroy/donext/database/TaskListDataAccess.java index c5dbaa3..b7d1b5a 100644 --- a/app/src/main/java/com/wismna/geoffroy/donext/database/TaskListDataAccess.java +++ b/app/src/main/java/com/wismna/geoffroy/donext/database/TaskListDataAccess.java @@ -3,7 +3,6 @@ package com.wismna.geoffroy.donext.database; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; -import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import com.wismna.geoffroy.donext.dao.TaskList; diff --git a/app/src/main/java/com/wismna/geoffroy/donext/fragments/ConfirmDialogFragment.java b/app/src/main/java/com/wismna/geoffroy/donext/fragments/ConfirmDialogFragment.java index ebd4596..b339e24 100644 --- a/app/src/main/java/com/wismna/geoffroy/donext/fragments/ConfirmDialogFragment.java +++ b/app/src/main/java/com/wismna/geoffroy/donext/fragments/ConfirmDialogFragment.java @@ -12,6 +12,8 @@ import android.view.View; import com.wismna.geoffroy.donext.R; +import java.util.Objects; + public class ConfirmDialogFragment extends DialogFragment { interface ConfirmDialogListener { void onConfirmDialogClick(DialogFragment dialog, ButtonEvent event); @@ -41,7 +43,7 @@ public class ConfirmDialogFragment extends DialogFragment { @Override @NonNull public Dialog onCreateDialog(Bundle savedInstanceState) { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + AlertDialog.Builder builder = new AlertDialog.Builder(Objects.requireNonNull(getActivity())); Bundle args = getArguments(); LayoutInflater inflater = getActivity().getLayoutInflater(); diff --git a/app/src/main/java/com/wismna/geoffroy/donext/fragments/DynamicDialogFragment.java b/app/src/main/java/com/wismna/geoffroy/donext/fragments/DynamicDialogFragment.java index cce3b8b..69d4ed3 100644 --- a/app/src/main/java/com/wismna/geoffroy/donext/fragments/DynamicDialogFragment.java +++ b/app/src/main/java/com/wismna/geoffroy/donext/fragments/DynamicDialogFragment.java @@ -25,6 +25,8 @@ import android.widget.FrameLayout; import com.wismna.geoffroy.donext.R; +import java.util.Objects; + /** * 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 @@ -104,7 +106,7 @@ public abstract class DynamicDialogFragment extends DialogFragment { @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { menu.clear(); - getActivity().getMenuInflater().inflate(R.menu.menu_dynamic_fragment, menu); + Objects.requireNonNull(getActivity()).getMenuInflater().inflate(R.menu.menu_dynamic_fragment, menu); } @Override @@ -146,7 +148,7 @@ public abstract class DynamicDialogFragment extends DialogFragment { // Hide the keyboard if present if (view != null) { - InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE); + InputMethodManager imm = (InputMethodManager) Objects.requireNonNull(getActivity()).getSystemService(Activity.INPUT_METHOD_SERVICE); assert imm != null; imm.hideSoftInputFromWindow(getView().getWindowToken(), 0); } @@ -199,7 +201,7 @@ public abstract class DynamicDialogFragment extends DialogFragment { /** Helper function to get a View, without having to worry about the fact that is a Dialog or not*/ protected T findViewById(int id) { if (getShowsDialog()) return getDialog().findViewById(id); - return getView().findViewById(id); + return Objects.requireNonNull(getView()).findViewById(id); } @@ -210,8 +212,8 @@ public abstract class DynamicDialogFragment extends DialogFragment { view.requestFocus(); // Hide keyboard - InputMethodManager inputMethodManager = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); - inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0); + InputMethodManager inputMethodManager = (InputMethodManager) Objects.requireNonNull(getContext()).getSystemService(Context.INPUT_METHOD_SERVICE); + Objects.requireNonNull(inputMethodManager).hideSoftInputFromWindow(view.getWindowToken(), 0); } } diff --git a/app/src/main/java/com/wismna/geoffroy/donext/fragments/TaskListsDialogFragment.java b/app/src/main/java/com/wismna/geoffroy/donext/fragments/TaskListsDialogFragment.java index 0cab0fb..57c7700 100644 --- a/app/src/main/java/com/wismna/geoffroy/donext/fragments/TaskListsDialogFragment.java +++ b/app/src/main/java/com/wismna/geoffroy/donext/fragments/TaskListsDialogFragment.java @@ -23,6 +23,7 @@ import com.wismna.geoffroy.donext.helpers.TaskListTouchHelper; import java.lang.ref.WeakReference; import java.util.List; +import java.util.Objects; /** * A fragment representing a list of Items. @@ -151,7 +152,7 @@ public class TaskListsDialogFragment extends DynamicDialogFragment implements args.putInt("ItemPosition", position); args.putLong("ItemId", id); confirmDialogFragment.setArguments(args); - confirmDialogFragment.show(getFragmentManager(), title); + confirmDialogFragment.show(Objects.requireNonNull(getFragmentManager()), title); } else deleteTaskList(position, id); } diff --git a/app/src/main/java/com/wismna/geoffroy/donext/fragments/TasksFragment.java b/app/src/main/java/com/wismna/geoffroy/donext/fragments/TasksFragment.java index af78849..069fe3e 100644 --- a/app/src/main/java/com/wismna/geoffroy/donext/fragments/TasksFragment.java +++ b/app/src/main/java/com/wismna/geoffroy/donext/fragments/TasksFragment.java @@ -416,8 +416,7 @@ public class TasksFragment extends Fragment implements break; case -1: FragmentManager manager = getFragmentManager(); - assert manager != null; - DialogFragment dialog = (DialogFragment) manager.findFragmentByTag(getString(R.string.action_edit_task)); + DialogFragment dialog = (DialogFragment) Objects.requireNonNull(manager).findFragmentByTag(getString(R.string.action_edit_task)); if (dialog != null) dialog.dismiss(); action = resources.getString(R.string.snackabar_action_deleted); break; @@ -460,15 +459,16 @@ public class TasksFragment extends Fragment implements switch (direction) { // Mark item as Done case ItemTouchHelper.LEFT: - taskDataAccess.setDone(itemId); + taskDataAccess.setDone(itemId, isTodayView); break; // Increase task cycle count case ItemTouchHelper.RIGHT: - taskDataAccess.increaseCycle(task.getCycle(), itemId); + taskDataAccess.increaseCycle(task, isTodayView); + taskRecyclerViewAdapter.notifyItemChanged(taskRecyclerViewAdapter.getItemCount() - 1); break; case -1: // Delete the task - taskDataAccess.deleteTask(itemId); + taskDataAccess.deleteTask(itemId, isTodayView); } } } diff --git a/app/src/main/java/com/wismna/geoffroy/donext/fragments/TodayFormDialogFragment.java b/app/src/main/java/com/wismna/geoffroy/donext/fragments/TodayFormDialogFragment.java index 3e8fc76..14dec8d 100644 --- a/app/src/main/java/com/wismna/geoffroy/donext/fragments/TodayFormDialogFragment.java +++ b/app/src/main/java/com/wismna/geoffroy/donext/fragments/TodayFormDialogFragment.java @@ -21,6 +21,7 @@ import org.joda.time.LocalDate; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; +import java.util.Objects; /** * Created by bg45 on 2017-03-21. @@ -60,7 +61,7 @@ public class TodayFormDialogFragment extends DynamicDialogFragment { private void setLayoutValues(List tasks) { EditText editText = findViewById(R.id.today_search); final ListView listView = findViewById(R.id.today_tasks); - final TodayArrayAdapter adapter = new TodayArrayAdapter(getActivity(), tasks); + final TodayArrayAdapter adapter = new TodayArrayAdapter(Objects.requireNonNull(getActivity()), tasks); listView.setAdapter(adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override @@ -98,7 +99,7 @@ public class TodayFormDialogFragment extends DynamicDialogFragment { protected void onPositiveButtonClick(View view) { mListener.onTodayTaskDialogPositiveClick(view); // Only commit the updated tasks to DB - new UpdateTasks(this).execute(mUpdatedTasks.toArray(new Task[mUpdatedTasks.size()])); + new UpdateTasks(this).execute(mUpdatedTasks.toArray(new Task[0])); dismiss(); } @@ -142,15 +143,14 @@ public class TodayFormDialogFragment extends DynamicDialogFragment { @Override protected Integer doInBackground(Task... params) { - int elementsUpdated = 0; + int position; try (TaskDataAccess taskDataAccess = new TaskDataAccess(fragmentReference.get().getActivity(), TaskDataAccess.MODE.WRITE)) { - for (Task task : - params) { - taskDataAccess.updateTodayTasks(task.getId(), task.isToday()); - elementsUpdated++; + for (position = 0; position < params.length; position ++) { + Task task = params[position]; + taskDataAccess.updateTodayTasks(task.getId(), task.isToday(), position); } } - return elementsUpdated; + return position; } @Override diff --git a/app/src/main/java/com/wismna/geoffroy/donext/helpers/TaskListTouchHelper.java b/app/src/main/java/com/wismna/geoffroy/donext/helpers/TaskListTouchHelper.java index 80553d6..3e7e34d 100644 --- a/app/src/main/java/com/wismna/geoffroy/donext/helpers/TaskListTouchHelper.java +++ b/app/src/main/java/com/wismna/geoffroy/donext/helpers/TaskListTouchHelper.java @@ -1,6 +1,7 @@ package com.wismna.geoffroy.donext.helpers; import android.graphics.Color; +import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.helper.ItemTouchHelper; @@ -22,12 +23,12 @@ public class TaskListTouchHelper extends ItemTouchHelper.SimpleCallback { } @Override - public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { + public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) { return mAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition()); } @Override - public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { + public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { // No swipe moves } @@ -47,7 +48,7 @@ public class TaskListTouchHelper extends ItemTouchHelper.SimpleCallback { } @Override - public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { + public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) { super.clearView(recyclerView, viewHolder); viewHolder.itemView.setAlpha(1.0f); diff --git a/app/src/main/res/drawable/ic_refresh_black_24dp.xml b/app/src/main/res/drawable/ic_refresh_black_24dp.xml new file mode 100644 index 0000000..be94b09 --- /dev/null +++ b/app/src/main/res/drawable/ic_refresh_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/fragment_task_detailed.xml b/app/src/main/res/layout/fragment_task_detailed.xml index eb22d2c..a6aa105 100644 --- a/app/src/main/res/layout/fragment_task_detailed.xml +++ b/app/src/main/res/layout/fragment_task_detailed.xml @@ -1,18 +1,11 @@ - - - + - - - - + android:layout_height="wrap_content" + android:layout_toEndOf="@id/task_icon" + android:textSize="18sp" + android:textAppearance="?attr/textAppearanceListItem" /> + + + + diff --git a/app/src/main/res/layout/fragment_task_first.xml b/app/src/main/res/layout/fragment_task_first.xml index d1a476c..bce15d2 100644 --- a/app/src/main/res/layout/fragment_task_first.xml +++ b/app/src/main/res/layout/fragment_task_first.xml @@ -1,18 +1,11 @@ - - + android:background="@color/colorPrimaryLight"> - + - - - - + android:layout_height="wrap_content" + android:layout_toEndOf="@id/task_icon" + android:textSize="20sp" + android:textStyle="bold" + android:textColor="@color/colorAccent" + android:textAppearance="?attr/textAppearanceListItem" /> + + + + + diff --git a/app/src/main/res/layout/fragment_tasks.xml b/app/src/main/res/layout/fragment_tasks.xml index 415f8e1..f334e8a 100644 --- a/app/src/main/res/layout/fragment_tasks.xml +++ b/app/src/main/res/layout/fragment_tasks.xml @@ -82,15 +82,17 @@ android:orientation="horizontal" android:focusable="true" android:background="?android:attr/selectableItemBackground" > - + android:layout_height="wrap_content" + android:layout_marginStart="30dp" /> + \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/27.txt b/fastlane/metadata/android/en-US/changelogs/27.txt index 568cc39..8eca212 100644 --- a/fastlane/metadata/android/en-US/changelogs/27.txt +++ b/fastlane/metadata/android/en-US/changelogs/27.txt @@ -1,3 +1,5 @@ Emphasis is made on the first task +Correct task order handling +Order in Today view is different from order in Main view Bug corrections Design improvements