From 4f2d676ae4516322776f285f0abaed7f137d9a66 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Fri, 21 Jun 2024 01:44:47 -0500 Subject: [PATCH] Move SectionedDataSource to kmp --- .../java/org/tasks/compose/edit/SubtaskRow.kt | 5 +-- .../java/org/tasks/tasklist/AdapterSection.kt | 23 ------------ .../tasklist/AdapterSectionExtensions.kt | 24 +++++++++++++ .../java/org/tasks/tasklist/DiffCallback.kt | 6 ++-- .../tasklist/DragAndDropRecyclerAdapter.kt | 1 - .../java/org/tasks/ui/TaskListViewModel.kt | 9 ++--- .../tasks/widget/TasksWidgetViewFactory.kt | 1 + .../org/tasks/tasklist/AdapterSection.kt | 8 +++++ .../org/tasks/tasklist/SectionedDataSource.kt | 36 ++++++++----------- .../kotlin/org/tasks/tasklist/UiItem.kt | 8 +++++ 10 files changed, 63 insertions(+), 58 deletions(-) delete mode 100644 app/src/main/java/org/tasks/tasklist/AdapterSection.kt create mode 100644 app/src/main/java/org/tasks/tasklist/AdapterSectionExtensions.kt create mode 100644 kmp/src/commonMain/kotlin/org/tasks/tasklist/AdapterSection.kt rename {app/src/main/java => kmp/src/commonMain/kotlin}/org/tasks/tasklist/SectionedDataSource.kt (88%) create mode 100644 kmp/src/commonMain/kotlin/org/tasks/tasklist/UiItem.kt diff --git a/app/src/main/java/org/tasks/compose/edit/SubtaskRow.kt b/app/src/main/java/org/tasks/compose/edit/SubtaskRow.kt index b2d9108cb..285de34ca 100644 --- a/app/src/main/java/org/tasks/compose/edit/SubtaskRow.kt +++ b/app/src/main/java/org/tasks/compose/edit/SubtaskRow.kt @@ -33,7 +33,6 @@ import androidx.compose.ui.text.input.KeyboardCapitalization import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import org.tasks.filters.GtasksFilter import org.tasks.compose.CheckBox import org.tasks.compose.ClearButton import org.tasks.compose.DisabledText @@ -44,7 +43,9 @@ import org.tasks.data.TaskContainer import org.tasks.data.entity.Task import org.tasks.data.isHidden import org.tasks.filters.Filter +import org.tasks.filters.GtasksFilter import org.tasks.tasklist.SectionedDataSource +import org.tasks.tasklist.UiItem import org.tasks.themes.TasksTheme import org.tasks.ui.TaskListViewModel @@ -94,7 +95,7 @@ fun SubtaskRow( if (existingSubtasks is TaskListViewModel.TasksResults.Results) { existingSubtasks .tasks - .filterIsInstance() + .filterIsInstance() .map { it.task } .forEach { task -> ExistingSubtaskRow( diff --git a/app/src/main/java/org/tasks/tasklist/AdapterSection.kt b/app/src/main/java/org/tasks/tasklist/AdapterSection.kt deleted file mode 100644 index 07b141d36..000000000 --- a/app/src/main/java/org/tasks/tasklist/AdapterSection.kt +++ /dev/null @@ -1,23 +0,0 @@ -package org.tasks.tasklist - -import android.content.Context -import androidx.core.content.ContextCompat -import com.todoroo.astrid.core.SortHelper.SORT_START -import org.tasks.R -import org.tasks.date.DateTimeUtils.toDateTime - -data class AdapterSection( - var firstPosition: Int, - val value: Long, - var sectionedPosition: Int = 0, - var collapsed: Boolean = false -) { - fun headerColor(context: Context, groupMode: Int, textColor: Int = R.color.text_secondary) = - ContextCompat.getColor(context, if (groupMode == SORT_START - && value > 0 - && value.toDateTime().plusDays(1).startOfDay().isBeforeNow) { - R.color.overdue - } else { - textColor - }) -} \ No newline at end of file diff --git a/app/src/main/java/org/tasks/tasklist/AdapterSectionExtensions.kt b/app/src/main/java/org/tasks/tasklist/AdapterSectionExtensions.kt new file mode 100644 index 000000000..1a4ccec83 --- /dev/null +++ b/app/src/main/java/org/tasks/tasklist/AdapterSectionExtensions.kt @@ -0,0 +1,24 @@ +package org.tasks.tasklist + +import android.content.Context +import androidx.core.content.ContextCompat +import com.todoroo.astrid.core.SortHelper.SORT_START +import org.tasks.R +import org.tasks.date.DateTimeUtils.toDateTime + +fun AdapterSection.headerColor( + context: Context, + groupMode: Int, + textColor: Int = R.color.text_secondary +) = + ContextCompat.getColor( + context, + if (groupMode == SORT_START + && value > 0 + && value.toDateTime().plusDays(1).startOfDay().isBeforeNow + ) { + R.color.overdue + } else { + textColor + } + ) \ No newline at end of file diff --git a/app/src/main/java/org/tasks/tasklist/DiffCallback.kt b/app/src/main/java/org/tasks/tasklist/DiffCallback.kt index a004fe85f..673a129d3 100644 --- a/app/src/main/java/org/tasks/tasklist/DiffCallback.kt +++ b/app/src/main/java/org/tasks/tasklist/DiffCallback.kt @@ -6,9 +6,9 @@ import com.todoroo.astrid.core.SortHelper.SORT_DUE import com.todoroo.astrid.core.SortHelper.SORT_START internal class DiffCallback( - private val old: SectionedDataSource, - private val new: SectionedDataSource, - @Deprecated("") private val adapter: TaskAdapter + private val old: SectionedDataSource, + private val new: SectionedDataSource, + @Deprecated("") private val adapter: TaskAdapter ) : DiffUtil.Callback() { private val refreshDates = when (old.groupMode) { diff --git a/app/src/main/java/org/tasks/tasklist/DragAndDropRecyclerAdapter.kt b/app/src/main/java/org/tasks/tasklist/DragAndDropRecyclerAdapter.kt index 50e08b410..646dea3b4 100644 --- a/app/src/main/java/org/tasks/tasklist/DragAndDropRecyclerAdapter.kt +++ b/app/src/main/java/org/tasks/tasklist/DragAndDropRecyclerAdapter.kt @@ -23,7 +23,6 @@ import kotlinx.coroutines.runBlocking import org.tasks.activities.DragAndDropDiffer import org.tasks.data.TaskContainer import org.tasks.preferences.Preferences -import org.tasks.ui.TaskListViewModel.UiItem import java.util.LinkedList import java.util.Queue import java.util.concurrent.Executors diff --git a/app/src/main/java/org/tasks/ui/TaskListViewModel.kt b/app/src/main/java/org/tasks/ui/TaskListViewModel.kt index c6044b627..f819068f4 100644 --- a/app/src/main/java/org/tasks/ui/TaskListViewModel.kt +++ b/app/src/main/java/org/tasks/ui/TaskListViewModel.kt @@ -6,8 +6,6 @@ import android.content.Context import android.content.Intent import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import org.tasks.filters.EmptyFilter -import org.tasks.filters.SearchFilter import com.todoroo.astrid.core.BuiltInFilterExposer import com.todoroo.astrid.service.TaskDeleter import dagger.hilt.android.lifecycle.HiltViewModel @@ -35,8 +33,10 @@ import org.tasks.data.entity.Task import org.tasks.data.fetchTasks import org.tasks.db.QueryUtils import org.tasks.filters.AstridOrderingFilter +import org.tasks.filters.EmptyFilter import org.tasks.filters.Filter import org.tasks.filters.FilterImpl +import org.tasks.filters.SearchFilter import org.tasks.preferences.Preferences import org.tasks.preferences.QueryPreferences import org.tasks.tasklist.SectionedDataSource @@ -56,11 +56,6 @@ class TaskListViewModel @Inject constructor( private val firebase: Firebase, ) : ViewModel() { - sealed class UiItem { - data class Header(val value: Long): UiItem() - data class Task(val task: TaskContainer): UiItem() - } - sealed interface TasksResults { data object Loading : TasksResults data class Results(val tasks: SectionedDataSource) : TasksResults diff --git a/app/src/main/java/org/tasks/widget/TasksWidgetViewFactory.kt b/app/src/main/java/org/tasks/widget/TasksWidgetViewFactory.kt index 050fa7cb7..1af5c5b71 100644 --- a/app/src/main/java/org/tasks/widget/TasksWidgetViewFactory.kt +++ b/app/src/main/java/org/tasks/widget/TasksWidgetViewFactory.kt @@ -28,6 +28,7 @@ import org.tasks.filters.Filter import org.tasks.markdown.Markdown import org.tasks.tasklist.HeaderFormatter import org.tasks.tasklist.SectionedDataSource +import org.tasks.tasklist.headerColor import org.tasks.themes.ColorProvider.Companion.priorityColor import org.tasks.time.DateTimeUtils2.currentTimeMillis import org.tasks.time.startOfDay diff --git a/kmp/src/commonMain/kotlin/org/tasks/tasklist/AdapterSection.kt b/kmp/src/commonMain/kotlin/org/tasks/tasklist/AdapterSection.kt new file mode 100644 index 000000000..5d3d0552a --- /dev/null +++ b/kmp/src/commonMain/kotlin/org/tasks/tasklist/AdapterSection.kt @@ -0,0 +1,8 @@ +package org.tasks.tasklist + +data class AdapterSection( + var firstPosition: Int, + val value: Long, + var sectionedPosition: Int = 0, + var collapsed: Boolean = false +) \ No newline at end of file diff --git a/app/src/main/java/org/tasks/tasklist/SectionedDataSource.kt b/kmp/src/commonMain/kotlin/org/tasks/tasklist/SectionedDataSource.kt similarity index 88% rename from app/src/main/java/org/tasks/tasklist/SectionedDataSource.kt rename to kmp/src/commonMain/kotlin/org/tasks/tasklist/SectionedDataSource.kt index 09dcceed9..33aeafbbc 100644 --- a/app/src/main/java/org/tasks/tasklist/SectionedDataSource.kt +++ b/kmp/src/commonMain/kotlin/org/tasks/tasklist/SectionedDataSource.kt @@ -1,12 +1,10 @@ package org.tasks.tasklist -import android.util.SparseArray -import androidx.core.util.forEach import com.todoroo.astrid.core.SortHelper import org.tasks.data.TaskContainer import org.tasks.time.DateTimeUtils2.currentTimeMillis import org.tasks.time.startOfDay -import org.tasks.ui.TaskListViewModel.UiItem +import java.util.TreeMap class SectionedDataSource( tasks: List = emptyList(), @@ -19,7 +17,7 @@ class SectionedDataSource( private val tasks = tasks.toMutableList() private val sections = if (disableHeaders || groupMode == SortHelper.GROUP_NONE) { - SparseArray() + TreeMap() } else { getSections() } @@ -32,14 +30,13 @@ class SectionedDataSource( private fun sectionedPositionToPosition(sectionedPosition: Int): Int { if (isHeader(sectionedPosition)) { - return sections[sectionedPosition].firstPosition + return getSection(sectionedPosition).firstPosition } var offset = 0 - for (i in 0 until sections.size()) { - val section = sections.valueAt(i) + sections.forEach { (_, section) -> if (section.sectionedPosition > sectionedPosition) { - break + return@forEach } --offset } @@ -50,7 +47,7 @@ class SectionedDataSource( get() = tasks.size override val size: Int - get() = tasks.size + sections.size() + get() = tasks.size + sections.size override fun get(index: Int) = sections[index] @@ -95,13 +92,13 @@ class SectionedDataSource( TODO("Not yet implemented") } - fun getSection(position: Int): AdapterSection = sections[position] + fun getSection(position: Int): AdapterSection = sections[position]!! fun add(position: Int, task: TaskContainer) = tasks.add(sectionedPositionToPosition(position), task) fun removeAt(position: Int): TaskContainer = tasks.removeAt(sectionedPositionToPosition(position)) - private fun getSections(): SparseArray { + private fun getSections(): TreeMap { val sections = ArrayList() val startOfToday = currentTimeMillis().startOfDay() for (i in tasks.indices) { @@ -174,23 +171,22 @@ class SectionedDataSource( return setSections(sections) } - private fun setSections(newSections: List): SparseArray { - val sections = SparseArray() + private fun setSections(newSections: List): TreeMap { + val sections = TreeMap() newSections.forEachIndexed { index, section -> section.sectionedPosition = section.firstPosition + index - sections.append(section.sectionedPosition, section) + sections[section.sectionedPosition] = section } return sections } fun moveSection(toPosition: Int, offset: Int) { - val old = sections[toPosition] - sections.remove(toPosition) + val old = sections.remove(toPosition)!! val newSectionedPosition = old.sectionedPosition + offset val previousSection = if (isHeader(newSectionedPosition - 1)) sections[newSectionedPosition - 1] else null val newFirstPosition = previousSection?.firstPosition ?: (old.firstPosition + offset) val new = AdapterSection(newFirstPosition, old.value, newSectionedPosition, old.collapsed) - sections.append(new.sectionedPosition, new) + sections[new.sectionedPosition] = new } tailrec fun getNearestHeader(sectionedPosition: Int): Long = @@ -202,11 +198,7 @@ class SectionedDataSource( getNearestHeader(sectionedPosition - 1) } - fun getSectionValues(): List { - val values = ArrayList() - sections.forEach { _, header -> values.add(header.value) } - return values - } + fun getSectionValues(): List = sections.map { (_, header) -> header.value } companion object { const val HEADER_OVERDUE = -1L diff --git a/kmp/src/commonMain/kotlin/org/tasks/tasklist/UiItem.kt b/kmp/src/commonMain/kotlin/org/tasks/tasklist/UiItem.kt new file mode 100644 index 000000000..754b7f7fb --- /dev/null +++ b/kmp/src/commonMain/kotlin/org/tasks/tasklist/UiItem.kt @@ -0,0 +1,8 @@ +package org.tasks.tasklist + +import org.tasks.data.TaskContainer + +sealed class UiItem { + data class Header(val value: Long): UiItem() + data class Task(val task: TaskContainer): UiItem() +}