From 58a2b166629d85987ab359007fce7cebf0968e41 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Sat, 8 Jan 2022 23:37:38 -0600 Subject: [PATCH] Group overdue tasks together --- .../java/org/tasks/tasklist/AdapterSection.kt | 3 ++- .../org/tasks/tasklist/SectionedDataSource.kt | 21 +++++++++++++++++-- .../java/org/tasks/tasklist/TaskViewHolder.kt | 6 ++++-- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/tasks/tasklist/AdapterSection.kt b/app/src/main/java/org/tasks/tasklist/AdapterSection.kt index fd88ead53..8669f7223 100644 --- a/app/src/main/java/org/tasks/tasklist/AdapterSection.kt +++ b/app/src/main/java/org/tasks/tasklist/AdapterSection.kt @@ -18,7 +18,7 @@ data class AdapterSection( ) { fun headerColor(context: Context, sortMode: Int, textColor: Int = R.color.text_secondary) = ContextCompat.getColor(context, if ((sortMode == SORT_DUE || sortMode == SORT_START) - && value > 0 + && (value > 0 || value == -1L) && value.toDateTime().plusDays(1).startOfDay().isBeforeNow) { R.color.overdue } else { @@ -35,6 +35,7 @@ data class AdapterSection( ): String = when { sortMode == SORT_IMPORTANCE -> context.getString(priorityToString()) + value == -1L -> context.getString(R.string.filter_overdue) value == 0L -> context.getString(when (sortMode) { SORT_DUE -> R.string.no_due_date SORT_START -> R.string.no_start_date diff --git a/app/src/main/java/org/tasks/tasklist/SectionedDataSource.kt b/app/src/main/java/org/tasks/tasklist/SectionedDataSource.kt index b7c77f09c..c3422b62e 100644 --- a/app/src/main/java/org/tasks/tasklist/SectionedDataSource.kt +++ b/app/src/main/java/org/tasks/tasklist/SectionedDataSource.kt @@ -2,9 +2,9 @@ package org.tasks.tasklist import android.util.SparseArray import androidx.core.util.forEach +import com.todoroo.andlib.utility.DateUtilities.now import com.todoroo.astrid.core.SortHelper import org.tasks.data.TaskContainer -import org.tasks.date.DateTimeUtils import org.tasks.time.DateTimeUtils.startOfDay import java.util.* @@ -58,11 +58,18 @@ class SectionedDataSource constructor( private fun getSections(): SparseArray { val sections = ArrayList() + val startOfToday = now().startOfDay() for (i in tasks.indices) { val task = tasks[i] val sortGroup = task.sortGroup ?: continue val header = if (sortMode == SortHelper.SORT_IMPORTANCE || sortGroup == 0L) { sortGroup + } else if (sortMode == SortHelper.SORT_DUE) { + when { + sortGroup == 0L -> 0 + sortGroup < startOfToday -> -1 + else -> sortGroup.startOfDay() + } } else { sortGroup.startOfDay() } @@ -75,7 +82,17 @@ class SectionedDataSource constructor( SortHelper.SORT_IMPORTANCE -> if (header != previous) { sections.add(AdapterSection(i, header, 0, isCollapsed)) } - else -> if (previous > 0 && header != DateTimeUtils.newDateTime(previous).startOfDay().millis) { + SortHelper.SORT_DUE -> { + val previousOverdue = previous < startOfToday + val currentOverdue = header == -1L + if (previous > 0 && + ((currentOverdue != previousOverdue) || + (!currentOverdue && header != previous.startOfDay())) + ) { + sections.add(AdapterSection(i, header, 0, isCollapsed)) + } + } + else -> if (previous > 0 && header != previous.startOfDay()) { sections.add(AdapterSection(i, header, 0, isCollapsed)) } } diff --git a/app/src/main/java/org/tasks/tasklist/TaskViewHolder.kt b/app/src/main/java/org/tasks/tasklist/TaskViewHolder.kt index a82916b9d..abde59993 100644 --- a/app/src/main/java/org/tasks/tasklist/TaskViewHolder.kt +++ b/app/src/main/java/org/tasks/tasklist/TaskViewHolder.kt @@ -10,6 +10,7 @@ import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.google.android.material.chip.ChipGroup import com.todoroo.andlib.utility.DateUtilities +import com.todoroo.andlib.utility.DateUtilities.now import com.todoroo.astrid.api.Filter import com.todoroo.astrid.core.SortHelper.SORT_DUE import com.todoroo.astrid.core.SortHelper.SORT_START @@ -193,8 +194,9 @@ class TaskViewHolder internal constructor( dueDate.setTextColor(textColorSecondary) } val dateValue: String? = if (sortByDueDate - && task.sortGroup?.startOfDay() == task.dueDate.startOfDay() - && preferences.showGroupHeaders()) { + && task.sortGroup >= now().startOfDay() + && preferences.showGroupHeaders() + ) { task.takeIf { it.hasDueTime() }?.let { DateUtilities.getTimeString(context, newDateTime(task.dueDate)) }