diff --git a/app/src/androidTest/java/com/todoroo/astrid/sync/NewSyncTestCase.kt b/app/src/androidTest/java/com/todoroo/astrid/sync/NewSyncTestCase.kt index 053b9fa31..81839a18c 100644 --- a/app/src/androidTest/java/com/todoroo/astrid/sync/NewSyncTestCase.kt +++ b/app/src/androidTest/java/com/todoroo/astrid/sync/NewSyncTestCase.kt @@ -12,9 +12,10 @@ open class NewSyncTestCase : InjectingTestCase() { @Inject lateinit var tagDataDao: TagDataDao suspend fun createTask(): Task { - val task = Task() - task.title = SYNC_TASK_TITLE - task.priority = SYNC_TASK_IMPORTANCE + val task = Task( + title = SYNC_TASK_TITLE, + priority = SYNC_TASK_IMPORTANCE, + ) taskDao.createNew(task) return task } diff --git a/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.kt b/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.kt index 134730848..e745c55bc 100644 --- a/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.kt +++ b/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.kt @@ -210,9 +210,7 @@ open class TaskAdapter( SORT_IMPORTANCE -> { val newPriority = dataSource.nearestHeader(if (pos == 0) 1 else pos).toInt() if (newPriority != task.priority) { - val t = task.task - t.priority = newPriority - taskDao.save(t) + taskDao.save(task.task.copy(priority = newPriority)) } } SORT_LIST -> taskMover.move(task.id, dataSource.nearestHeader(if (pos == 0) 1 else pos)) diff --git a/app/src/main/java/com/todoroo/astrid/service/TaskCreator.kt b/app/src/main/java/com/todoroo/astrid/service/TaskCreator.kt index 013d1590f..92615fa79 100644 --- a/app/src/main/java/com/todoroo/astrid/service/TaskCreator.kt +++ b/app/src/main/java/com/todoroo/astrid/service/TaskCreator.kt @@ -135,14 +135,13 @@ class TaskCreator @Inject constructor( * base task model. */ internal suspend fun create(values: Map?, title: String?): Task { - val task = Task() - task.creationDate = DateUtilities.now() - task.modificationDate = DateUtilities.now() - if (title != null) { - task.title = title.trim { it <= ' ' } - } - task.uuid = UUIDHelper.newUUID() - task.priority = preferences.defaultPriority + val task = Task( + title = title?.trim { it <= ' ' }, + creationDate = DateUtilities.now(), + modificationDate = DateUtilities.now(), + remoteId = UUIDHelper.newUUID(), + priority = preferences.defaultPriority, + ) preferences.getStringValue(R.string.p_default_recurrence) ?.takeIf { it.isNotBlank() } ?.let { diff --git a/app/src/main/java/com/todoroo/astrid/service/TaskDuplicator.kt b/app/src/main/java/com/todoroo/astrid/service/TaskDuplicator.kt index b958e705b..f8b913bd8 100644 --- a/app/src/main/java/com/todoroo/astrid/service/TaskDuplicator.kt +++ b/app/src/main/java/com/todoroo/astrid/service/TaskDuplicator.kt @@ -3,6 +3,7 @@ package com.todoroo.astrid.service import com.todoroo.andlib.utility.DateUtilities import com.todoroo.astrid.dao.TaskDao import com.todoroo.astrid.data.Task +import com.todoroo.astrid.data.Task.Companion.NO_ID import com.todoroo.astrid.gcal.GCalHelper import org.tasks.LocalBroadcastManager import org.tasks.data.Alarm @@ -47,25 +48,25 @@ class TaskDuplicator @Inject constructor( .also { localBroadcastManager.broadcastRefresh() } } - private suspend fun clone(clone: Task, parentId: Long): Task { - val originalId = clone.id - with(clone) { - creationDate = DateUtilities.now() - modificationDate = DateUtilities.now() - reminderLast = 0 - completionDate = 0L - calendarURI = "" - parent = parentId - uuid = Task.NO_UUID - suppressSync() - suppressRefresh() - } + private suspend fun clone(task: Task, parentId: Long): Task { + val clone = task.copy( + id = NO_ID, + creationDate = DateUtilities.now(), + modificationDate = DateUtilities.now(), + reminderLast = 0, + completionDate = 0L, + calendarURI = "", + parent = parentId, + remoteId = Task.NO_UUID, + ) + clone.suppressSync() + clone.suppressRefresh() val newId = taskDao.createNew(clone) - val tags = tagDataDao.getTagDataForTask(originalId) + val tags = tagDataDao.getTagDataForTask(task.id) if (tags.isNotEmpty()) { tagDao.insert(tags.map { Tag(clone, it) }) } - val googleTask = googleTaskDao.getByTaskId(originalId) + val googleTask = googleTaskDao.getByTaskId(task.id) val addToTop = preferences.addTasksToTop() if (googleTask != null) { googleTaskDao.insertAndShift( @@ -78,7 +79,7 @@ class TaskDuplicator @Inject constructor( addToTop ) } - val caldavTask = caldavDao.getTask(originalId) + val caldavTask = caldavDao.getTask(task.id) if (caldavTask != null) { val newDavTask = CaldavTask( task = clone.id, @@ -90,18 +91,18 @@ class TaskDuplicator @Inject constructor( } caldavDao.insert(clone, newDavTask, addToTop) } - for (g in locationDao.getGeofencesForTask(originalId)) { + for (g in locationDao.getGeofencesForTask(task.id)) { locationDao.insert( Geofence(clone.id, g.place, g.isArrival, g.isDeparture)) } - val alarms = alarmDao.getAlarms(originalId) + val alarms = alarmDao.getAlarms(task.id) if (alarms.isNotEmpty()) { alarmDao.insert(alarms.map { Alarm(clone.id, it.time, it.type) }) } gcalHelper.createTaskEventIfEnabled(clone) taskDao.save(clone, null) // TODO: delete me taskAttachmentDao - .getAttachmentsForTask(originalId) + .getAttachmentsForTask(task.id) .map { Attachment( task = clone.id, @@ -110,7 +111,7 @@ class TaskDuplicator @Inject constructor( ) } .let { taskAttachmentDao.insert(it) } - getDirectChildren(originalId).forEach { subtask -> + getDirectChildren(task.id).forEach { subtask -> clone(subtask, newId) } return clone diff --git a/app/src/main/java/org/tasks/dialogs/PriorityPicker.kt b/app/src/main/java/org/tasks/dialogs/PriorityPicker.kt index ef67caa41..e3e266f9c 100644 --- a/app/src/main/java/org/tasks/dialogs/PriorityPicker.kt +++ b/app/src/main/java/org/tasks/dialogs/PriorityPicker.kt @@ -69,8 +69,7 @@ class PriorityPicker : DialogFragment() { taskDao .fetch(taskIds.toList()) .forEach { - it.priority = priorityPickerViewModel.priority.value - taskDao.save(it) + taskDao.save(it.copy(priority = priorityPickerViewModel.priority.value)) } } dismiss() diff --git a/app/src/test/java/com/todoroo/astrid/alarms/AlarmCalculatorTest.kt b/app/src/test/java/com/todoroo/astrid/alarms/AlarmCalculatorTest.kt index 76670cdc9..7d275bde0 100644 --- a/app/src/test/java/com/todoroo/astrid/alarms/AlarmCalculatorTest.kt +++ b/app/src/test/java/com/todoroo/astrid/alarms/AlarmCalculatorTest.kt @@ -145,18 +145,20 @@ class AlarmCalculatorTest { @Test fun scheduleRelativeAfterDue() { - val alarm = alarmCalculator.toAlarmEntry( - newTask(with(DUE_DATE, now)), - Alarm(0L, DAYS.toMillis(1), TYPE_REL_END) - ) + freezeAt(DateTime(2023, 11, 3, 17, 13)) { + val alarm = alarmCalculator.toAlarmEntry( + newTask(with(DUE_DATE, newDateTime())), + Alarm(0L, DAYS.toMillis(1), TYPE_REL_END) + ) - assertEquals( - newAlarmEntry( - with(TIME, now.plusDays(1).startOfDay().withHourOfDay(13)), - with(TYPE, TYPE_REL_END) - ), - alarm - ) + assertEquals( + newAlarmEntry( + with(TIME, DateTime(2023, 11, 4, 13, 0, 0)), + with(TYPE, TYPE_REL_END) + ), + alarm + ) + } } @Test @@ -177,18 +179,20 @@ class AlarmCalculatorTest { @Test fun scheduleRelativeAfterStart() = runBlocking { - val alarm = alarmCalculator.toAlarmEntry( - newTask(with(DUE_DATE, now), with(HIDE_TYPE, HIDE_UNTIL_DUE)), - Alarm(0, DAYS.toMillis(1), TYPE_REL_START) - ) + freezeAt(DateTime(2023, 11, 3, 17, 13)) { + val alarm = alarmCalculator.toAlarmEntry( + newTask(with(DUE_DATE, newDateTime()), with(HIDE_TYPE, HIDE_UNTIL_DUE)), + Alarm(0, DAYS.toMillis(1), TYPE_REL_START) + ) - assertEquals( - newAlarmEntry( - with(TIME, now.plusDays(1).startOfDay().withHourOfDay(13)), - with(TYPE, TYPE_REL_START) - ), - alarm - ) + assertEquals( + newAlarmEntry( + with(TIME, DateTime(2023, 11, 4, 13, 0)), + with(TYPE, TYPE_REL_START) + ), + alarm + ) + } } @Test diff --git a/app/src/test/java/org/tasks/makers/TaskMaker.kt b/app/src/test/java/org/tasks/makers/TaskMaker.kt index a64ff52c2..510db42b8 100644 --- a/app/src/test/java/org/tasks/makers/TaskMaker.kt +++ b/app/src/test/java/org/tasks/makers/TaskMaker.kt @@ -8,7 +8,6 @@ import com.natpryce.makeiteasy.PropertyValue import com.todoroo.astrid.data.Task import com.todoroo.astrid.data.Task.Companion.HIDE_UNTIL_SPECIFIC_DAY import com.todoroo.astrid.data.Task.Companion.NO_UUID -import org.tasks.Strings import org.tasks.date.DateTimeUtils import org.tasks.makers.Maker.make import org.tasks.repeats.RecurrenceUtils.newRecur @@ -21,7 +20,6 @@ object TaskMaker { val START_DATE: Property = newProperty() val REMINDER_LAST: Property = newProperty() val HIDE_TYPE: Property = newProperty() - val REMINDERS: Property = newProperty() val MODIFICATION_TIME: Property = newProperty() val CREATION_TIME: Property = newProperty() val COMPLETION_TIME: Property = newProperty() @@ -37,35 +35,32 @@ object TaskMaker { val ORDER: Property = newProperty() private val instantiator = Instantiator { lookup: PropertyLookup -> - val task = Task() - val title = lookup.valueOf(TITLE, null as String?) - if (!Strings.isNullOrEmpty(title)) { - task.title = title!! - } - val id = lookup.valueOf(ID, Task.NO_ID) - if (id != Task.NO_ID) { - task.id = id - } - val priority = lookup.valueOf(PRIORITY, -1) - if (priority >= 0) { - task.priority = priority - } - val dueDate = lookup.valueOf(DUE_DATE, null as DateTime?) - if (dueDate != null) { - task.dueDate = Task.createDueDate(Task.URGENCY_SPECIFIC_DAY, dueDate.millis) - } - val dueTime = lookup.valueOf(DUE_TIME, null as DateTime?) - if (dueTime != null) { - task.dueDate = Task.createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME, dueTime.millis) - } - val completionTime = lookup.valueOf(COMPLETION_TIME, null as DateTime?) - if (completionTime != null) { - task.completionDate = completionTime.millis - } - val deletedTime = lookup.valueOf(DELETION_TIME, null as DateTime?) - if (deletedTime != null) { - task.deletionDate = deletedTime.millis - } + val creationTime = lookup.valueOf(CREATION_TIME, DateTimeUtils.newDateTime()) + val task = Task( + id = lookup.valueOf(ID, Task.NO_ID), + title = lookup.valueOf(TITLE, null as String?), + priority = lookup.valueOf(PRIORITY, Task.Priority.NONE), + dueDate = lookup.valueOf(DUE_DATE, null as DateTime?) + ?.let { Task.createDueDate(Task.URGENCY_SPECIFIC_DAY, it.millis) } + ?: lookup.valueOf(DUE_TIME, null as DateTime?) + ?.let { Task.createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME, it.millis) } + ?: 0L, + completionDate = lookup.valueOf(COMPLETION_TIME, null as DateTime?)?.millis ?: 0L, + deletionDate = lookup.valueOf(DELETION_TIME, null as DateTime?)?.millis ?: 0L, + reminderLast = lookup.valueOf(REMINDER_LAST, null as DateTime?)?.millis ?: 0L, + recurrence = lookup.valueOf(RECUR, null as String?)?.let { newRecur(it).toString() }, + repeatFrom = if (lookup.valueOf(AFTER_COMPLETE, false)) + Task.RepeatFrom.COMPLETION_DATE + else + Task.RepeatFrom.DUE_DATE, + notes = lookup.valueOf(DESCRIPTION, null as String?), + isCollapsed = lookup.valueOf(COLLAPSED, false), + remoteId = lookup.valueOf(UUID, NO_UUID), + parent = lookup.valueOf(PARENT, 0L), + order = lookup.valueOf(ORDER, null as Long?), + creationDate = creationTime.millis, + modificationDate = lookup.valueOf(MODIFICATION_TIME, creationTime).millis, + ) lookup.valueOf(START_DATE, null as DateTime?)?.let { task.hideUntil = task.createHideUntil(HIDE_UNTIL_SPECIFIC_DAY, it.millis) } @@ -73,30 +68,6 @@ object TaskMaker { if (hideType >= 0) { task.hideUntil = task.createHideUntil(hideType, 0) } - val reminderFlags = lookup.valueOf(REMINDERS, -1) - if (reminderFlags >= 0) { - task.ringFlags = reminderFlags - } - val reminderLast = lookup.valueOf(REMINDER_LAST, null as DateTime?) - if (reminderLast != null) { - task.reminderLast = reminderLast.millis - } - lookup.valueOf(RECUR, null as String?)?.let { - task.setRecurrence(newRecur(it)) - } - task.repeatFrom = if (lookup.valueOf(AFTER_COMPLETE, false)) { - Task.RepeatFrom.COMPLETION_DATE - } else { - Task.RepeatFrom.DUE_DATE - } - task.notes = lookup.valueOf(DESCRIPTION, null as String?) - task.isCollapsed = lookup.valueOf(COLLAPSED, false) - task.uuid = lookup.valueOf(UUID, NO_UUID) - val creationTime = lookup.valueOf(CREATION_TIME, DateTimeUtils.newDateTime()) - task.creationDate = creationTime.millis - task.modificationDate = lookup.valueOf(MODIFICATION_TIME, creationTime).millis - task.parent = lookup.valueOf(PARENT, 0L) - task.order = lookup.valueOf(ORDER, null as Long?) task }