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