diff --git a/app/src/main/java/org/tasks/data/TaskListQueryNonRecursive.kt b/app/src/main/java/org/tasks/data/TaskListQueryNonRecursive.kt
index 15fc85696..bb959fda5 100644
--- a/app/src/main/java/org/tasks/data/TaskListQueryNonRecursive.kt
+++ b/app/src/main/java/org/tasks/data/TaskListQueryNonRecursive.kt
@@ -20,7 +20,6 @@ internal object TaskListQueryNonRecursive {
private val TAGS =
field("group_concat(distinct(${TaskListFragment.TAGS_METADATA_JOIN}.tag_uid))")
.`as`("tags")
- private const val COMPLETION_SORT = "parentComplete ASC, tasks.completed DESC, "
private val FIELDS =
TaskListQuery.FIELDS.plus(listOf(
TAGS,
@@ -32,18 +31,21 @@ internal object TaskListQueryNonRecursive {
val sortMode = preferences.sortMode
val sortGroup = field(SortHelper.getSortGroup(sortMode) ?: "NULL").`as`("sortGroup")
val query = SortHelper.adjustQueryForFlagsAndSort(preferences, joinedQuery, sortMode)
- val completionSort = if (preferences.completedTasksAtBottom) {
- COMPLETION_SORT
- } else {
- ""
- }
+ val completeAtBottom = if (preferences.completedTasksAtBottom) "parentComplete ASC," else ""
+ val completionSort =
+ if (preferences.completedTasksAtBottom && preferences.sortCompletedByCompletionDate) {
+ "tasks.completed DESC,"
+ } else {
+ ""
+ }
+ val orderBy = "$completeAtBottom $completionSort"
val groupedQuery = when {
filter is RecentlyModifiedFilter ->
query.replace("ORDER BY", "GROUP BY ${Task.ID} ORDER BY")
query.contains("ORDER BY") ->
- query.replace("ORDER BY", "GROUP BY ${Task.ID} ORDER BY $completionSort")
+ query.replace("ORDER BY", "GROUP BY ${Task.ID} ORDER BY $orderBy")
preferences.completedTasksAtBottom ->
- "$query GROUP BY ${Task.ID} ORDER BY $completionSort"
+ "$query GROUP BY ${Task.ID} ORDER BY $orderBy"
else ->
"$query GROUP BY ${Task.ID}"
}
diff --git a/app/src/main/java/org/tasks/data/TaskListQueryRecursive.kt b/app/src/main/java/org/tasks/data/TaskListQueryRecursive.kt
index 93c6a2f03..521c199cd 100644
--- a/app/src/main/java/org/tasks/data/TaskListQueryRecursive.kt
+++ b/app/src/main/java/org/tasks/data/TaskListQueryRecursive.kt
@@ -98,16 +98,13 @@ internal object TaskListQueryRecursive {
}
val reverseSort = preferences.isReverseSort && sortMode != SortHelper.SORT_GTASKS && sortMode != SortHelper.SORT_CALDAV
val sortSelect = SortHelper.orderSelectForSortTypeRecursive(sortMode)
- val parentCompleted = if (preferences.completedTasksAtBottom) {
- "tasks.completed > 0"
- } else {
- "0"
- }
- val completionSort = if (preferences.completedTasksAtBottom) {
- "tasks.completed"
- } else {
- "0"
- }
+ val parentCompleted = if (preferences.completedTasksAtBottom) "tasks.completed > 0" else "0"
+ val completionSort =
+ if (preferences.completedTasksAtBottom && preferences.sortCompletedByCompletionDate) {
+ "tasks.completed"
+ } else {
+ "0"
+ }
val withClause ="""
CREATE TEMPORARY TABLE `recursive_tasks` AS
WITH RECURSIVE recursive_tasks (task, parent_complete, subtask_complete, completion_sort, parent, collapsed, hidden, indent, title, sortField, primary_sort, secondary_sort, sort_group) AS (
diff --git a/app/src/main/java/org/tasks/preferences/Preferences.kt b/app/src/main/java/org/tasks/preferences/Preferences.kt
index 866e3ae94..554e629d5 100644
--- a/app/src/main/java/org/tasks/preferences/Preferences.kt
+++ b/app/src/main/java/org/tasks/preferences/Preferences.kt
@@ -361,6 +361,9 @@ class Preferences @JvmOverloads constructor(
override val completedTasksAtBottom: Boolean
get() = getBoolean(R.string.p_completed_tasks_at_bottom, true)
+ override val sortCompletedByCompletionDate: Boolean
+ get() = getBoolean(R.string.p_completed_tasks_sort, true)
+
private fun setPublicPref(key: String, value: Int) {
val edit = publicPrefs.edit()
edit?.putInt(key, value)?.apply()
diff --git a/app/src/main/java/org/tasks/preferences/QueryPreferences.kt b/app/src/main/java/org/tasks/preferences/QueryPreferences.kt
index bc53788b5..58e6e455a 100644
--- a/app/src/main/java/org/tasks/preferences/QueryPreferences.kt
+++ b/app/src/main/java/org/tasks/preferences/QueryPreferences.kt
@@ -17,5 +17,7 @@ interface QueryPreferences {
val completedTasksAtBottom: Boolean
+ val sortCompletedByCompletionDate: Boolean
+
fun usePagedQueries(): Boolean
}
\ No newline at end of file
diff --git a/app/src/main/java/org/tasks/widget/WidgetPreferences.java b/app/src/main/java/org/tasks/widget/WidgetPreferences.java
index e180a8bcd..a930f1912 100644
--- a/app/src/main/java/org/tasks/widget/WidgetPreferences.java
+++ b/app/src/main/java/org/tasks/widget/WidgetPreferences.java
@@ -289,6 +289,11 @@ public class WidgetPreferences implements QueryPreferences {
return preferences.getCompletedTasksAtBottom();
}
+ @Override
+ public boolean getSortCompletedByCompletionDate() {
+ return preferences.getSortCompletedByCompletionDate();
+ }
+
@Override
public boolean usePagedQueries() {
return preferences.usePagedQueries();
diff --git a/app/src/main/res/values/keys.xml b/app/src/main/res/values/keys.xml
index 1c19b897d..c0b215170 100644
--- a/app/src/main/res/values/keys.xml
+++ b/app/src/main/res/values/keys.xml
@@ -448,4 +448,5 @@
app_bar_position
app_bar_collapse
completed_tasks_at_bottom
+ completed_tasks_sort
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 5dbf65da0..53ecc771f 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -714,5 +714,6 @@ File %1$s contained %2$s.\n\n
Completed
Task completed
Move completed tasks to bottom
+ Sort by completion date
%d tasks completed
diff --git a/app/src/main/res/xml/preferences_look_and_feel.xml b/app/src/main/res/xml/preferences_look_and_feel.xml
index 71f8e17e5..92e0941fc 100644
--- a/app/src/main/res/xml/preferences_look_and_feel.xml
+++ b/app/src/main/res/xml/preferences_look_and_feel.xml
@@ -108,9 +108,16 @@
+
+