Fix start date initialization

pull/1352/head
Alex Baker 5 years ago
parent 0496ea457e
commit 3c9fc2d176

@ -0,0 +1,100 @@
package com.todoroo.astrid.service
import com.todoroo.astrid.api.PermaSql.*
import com.todoroo.astrid.data.Task
import com.todoroo.astrid.data.Task.Companion.DUE_DATE
import com.todoroo.astrid.data.Task.Companion.HIDE_UNTIL
import com.todoroo.astrid.data.Task.Companion.URGENCY_SPECIFIC_DAY
import dagger.hilt.android.testing.HiltAndroidTest
import dagger.hilt.android.testing.UninstallModules
import kotlinx.coroutines.runBlocking
import org.junit.Assert.assertEquals
import org.junit.Test
import org.tasks.R
import org.tasks.SuspendFreeze.Companion.freezeAt
import org.tasks.injection.InjectingTestCase
import org.tasks.injection.ProductionModule
import org.tasks.preferences.Preferences
import org.tasks.time.DateTime
import javax.inject.Inject
@UninstallModules(ProductionModule::class)
@HiltAndroidTest
class TaskCreatorTest : InjectingTestCase() {
@Inject lateinit var preferences: Preferences
@Inject lateinit var taskCreator: TaskCreator
@Test
fun setStartAndDueFromFilter() = runBlocking {
val task = freezeAt(DateTime(2021, 2, 4, 14, 56, 34, 126)) {
taskCreator.create(mapOf(
HIDE_UNTIL.name!! to VALUE_EOD,
DUE_DATE.name!! to VALUE_EOD_TOMORROW
), null)
}
assertEquals(DateTime(2021, 2, 4).millis, task.hideUntil)
assertEquals(
Task.createDueDate(URGENCY_SPECIFIC_DAY, DateTime(2021, 2, 5).millis),
task.dueDate
)
}
@Test
fun setDefaultStartWithFilterDue() = runBlocking {
preferences.setString(R.string.p_default_hideUntil_key, Task.HIDE_UNTIL_DUE.toString())
val task = freezeAt(DateTime(2021, 2, 4, 14, 56, 34, 126)) {
taskCreator.create(mapOf(
DUE_DATE.name!! to VALUE_EOD
), null)
}
assertEquals(DateTime(2021, 2, 4).millis, task.hideUntil)
}
@Test
fun setStartAndDueFromPreferences() = runBlocking {
preferences.setString(R.string.p_default_urgency_key, Task.URGENCY_TODAY.toString())
preferences.setString(R.string.p_default_hideUntil_key, Task.HIDE_UNTIL_DUE.toString())
val task = freezeAt(DateTime(2021, 2, 4, 14, 56, 34, 126)) {
taskCreator.create(null, "test")
}
assertEquals(DateTime(2021, 2, 4).millis, task.hideUntil)
assertEquals(
Task.createDueDate(URGENCY_SPECIFIC_DAY, DateTime(2021, 2, 4).millis),
task.dueDate
)
}
@Test
fun filterStartOverridesDefaultStart() = runBlocking {
preferences.setString(R.string.p_default_urgency_key, Task.URGENCY_TODAY.toString())
preferences.setString(R.string.p_default_hideUntil_key, Task.HIDE_UNTIL_DUE.toString())
val task = freezeAt(DateTime(2021, 2, 4, 14, 56, 34, 126)) {
taskCreator.create(mapOf(
HIDE_UNTIL.name!! to VALUE_EOD_NEXT_WEEK
), null)
}
assertEquals(DateTime(2021, 2, 11).millis, task.hideUntil)
}
@Test
fun filterDueOverridesDefaultDue() = runBlocking {
preferences.setString(R.string.p_default_urgency_key, Task.URGENCY_TODAY.toString())
val task = freezeAt(DateTime(2021, 2, 4, 14, 56, 34, 126)) {
taskCreator.create(mapOf(
DUE_DATE.name!! to VALUE_EOD_TOMORROW
), null)
}
assertEquals(
Task.createDueDate(URGENCY_SPECIFIC_DAY, DateTime(2021, 2, 5).millis),
task.dueDate
)
}
}

@ -5,9 +5,9 @@ import org.tasks.time.DateTimeUtils
class SuspendFreeze { class SuspendFreeze {
suspend fun thawAfter(run: suspend () -> Unit) { suspend fun <T> thawAfter(run: suspend () -> T): T {
try { try {
run() return run()
} finally { } finally {
thaw() thaw()
} }
@ -15,16 +15,16 @@ class SuspendFreeze {
companion object { companion object {
suspend fun freezeClock(run: suspend () -> Unit) { suspend fun <T> freezeClock(run: suspend () -> T): T {
freezeAt(DateTimeUtils.currentTimeMillis()).thawAfter(run) return freezeAt(DateTimeUtils.currentTimeMillis()).thawAfter(run)
} }
suspend fun freezeAt(dateTime: DateTime, run: suspend () -> Unit) { suspend fun <T> freezeAt(dateTime: DateTime, run: suspend () -> T): T {
freezeAt(dateTime.millis, run) return freezeAt(dateTime.millis, run)
} }
suspend fun freezeAt(timestamp: Long, run: suspend () -> Unit) { suspend fun <T> freezeAt(timestamp: Long, run: suspend () -> T): T {
freezeAt(timestamp).thawAfter(run) return freezeAt(timestamp).thawAfter(run)
} }
fun freezeAt(dateTime: DateTime): SuspendFreeze { fun freezeAt(dateTime: DateTime): SuspendFreeze {

@ -7,7 +7,10 @@ import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.api.PermaSql import com.todoroo.astrid.api.PermaSql
import com.todoroo.astrid.dao.TaskDao import com.todoroo.astrid.dao.TaskDao
import com.todoroo.astrid.data.Task import com.todoroo.astrid.data.Task
import com.todoroo.astrid.data.Task.Companion.DUE_DATE
import com.todoroo.astrid.data.Task.Companion.HIDE_UNTIL
import com.todoroo.astrid.data.Task.Companion.HIDE_UNTIL_NONE import com.todoroo.astrid.data.Task.Companion.HIDE_UNTIL_NONE
import com.todoroo.astrid.data.Task.Companion.IMPORTANCE
import com.todoroo.astrid.data.Task.Companion.createDueDate import com.todoroo.astrid.data.Task.Companion.createDueDate
import com.todoroo.astrid.gcal.GCalHelper import com.todoroo.astrid.gcal.GCalHelper
import com.todoroo.astrid.helper.UUIDHelper import com.todoroo.astrid.helper.UUIDHelper
@ -17,6 +20,7 @@ import org.tasks.Strings.isNullOrEmpty
import org.tasks.data.* import org.tasks.data.*
import org.tasks.preferences.DefaultFilterProvider import org.tasks.preferences.DefaultFilterProvider
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import org.tasks.time.DateTimeUtils.startOfDay
import timber.log.Timber import timber.log.Timber
import java.util.* import java.util.*
import javax.inject.Inject import javax.inject.Inject
@ -84,7 +88,7 @@ class TaskCreator @Inject constructor(
* Create task from the given content values, saving it. This version doesn't need to start with a * Create task from the given content values, saving it. This version doesn't need to start with a
* base task model. * base task model.
*/ */
private suspend fun create(values: Map<String, Any>?, title: String?): Task { internal suspend fun create(values: Map<String, Any>?, title: String?): Task {
val task = Task() val task = Task()
task.creationDate = DateUtilities.now() task.creationDate = DateUtilities.now()
task.modificationDate = DateUtilities.now() task.modificationDate = DateUtilities.now()
@ -93,13 +97,6 @@ class TaskCreator @Inject constructor(
} }
task.uuid = UUIDHelper.newUUID() task.uuid = UUIDHelper.newUUID()
task.priority = preferences.defaultPriority task.priority = preferences.defaultPriority
task.hideUntil = task.createHideUntil(
preferences.getIntegerFromString(R.string.p_default_hideUntil_key, HIDE_UNTIL_NONE),
0
)
task.dueDate = createDueDate(
preferences.getIntegerFromString(R.string.p_default_urgency_key, Task.URGENCY_NONE),
0)
preferences.getStringValue(R.string.p_default_recurrence) preferences.getStringValue(R.string.p_default_recurrence)
?.takeIf { it.isNotBlank() } ?.takeIf { it.isNotBlank() }
?.let { ?.let {
@ -112,27 +109,27 @@ class TaskCreator @Inject constructor(
?.let { task.putTransitory(Place.KEY, it) } ?.let { task.putTransitory(Place.KEY, it) }
setDefaultReminders(preferences, task) setDefaultReminders(preferences, task)
val tags = ArrayList<String>() val tags = ArrayList<String>()
if (values != null && values.isNotEmpty()) { values?.entries?.forEach { (key, value) ->
for (item in values.entries) { when (key) {
val key = item.key Tag.KEY -> tags.add(value as String)
var value: Any? = item.value GoogleTask.KEY, CaldavTask.KEY, Place.KEY -> task.putTransitory(key, value)
when (key) { DUE_DATE.name -> value.substitute()?.toLongOrNull()?.let { task.dueDate = it }
Tag.KEY -> tags.add(value as String) IMPORTANCE.name -> value.substitute()?.toIntOrNull()?.let { task.priority = it }
GoogleTask.KEY, CaldavTask.KEY, Place.KEY -> task.putTransitory(key, value!!) HIDE_UNTIL.name ->
else -> { value.substitute()?.toLongOrNull()?.let { task.hideUntil = it.startOfDay() }
if (value is String) {
value = PermaSql.replacePlaceholdersForNewTask(value as String?)
}
when (key) {
"dueDate" -> task.dueDate = java.lang.Long.valueOf((value as String?)!!)
"importance" -> task.priority = Integer.valueOf((value as String?)!!)
else -> {
}
}
}
}
} }
} }
if (values?.containsKey(DUE_DATE.name) != true) {
task.dueDate = createDueDate(
preferences.getIntegerFromString(R.string.p_default_urgency_key, Task.URGENCY_NONE),
0)
}
if (values?.containsKey(HIDE_UNTIL.name) != true) {
task.hideUntil = task.createHideUntil(
preferences.getIntegerFromString(R.string.p_default_hideUntil_key, HIDE_UNTIL_NONE),
0
)
}
if (tags.isEmpty()) { if (tags.isEmpty()) {
preferences.getStringValue(R.string.p_default_tags) preferences.getStringValue(R.string.p_default_tags)
?.split(",") ?.split(",")
@ -167,5 +164,8 @@ class TaskCreator @Inject constructor(
* preferences.getIntegerFromString(R.string.p_rmd_default_random_hours, 0)) * preferences.getIntegerFromString(R.string.p_rmd_default_random_hours, 0))
task.reminderFlags = preferences.defaultReminders or preferences.defaultRingMode task.reminderFlags = preferences.defaultReminders or preferences.defaultRingMode
} }
private fun Any?.substitute(): String? =
(this as? String)?.let { PermaSql.replacePlaceholdersForNewTask(it) }
} }
} }

@ -92,7 +92,7 @@ class StartDateControlSet : TaskEditControlFragment() {
selectedDay = savedInstanceState.getLong(EXTRA_DAY) selectedDay = savedInstanceState.getLong(EXTRA_DAY)
selectedTime = savedInstanceState.getInt(EXTRA_TIME) selectedTime = savedInstanceState.getInt(EXTRA_TIME)
} }
refreshDisplayView() applySelectionToHideUntil()
} }
override val layout = R.layout.control_set_hide override val layout = R.layout.control_set_hide

Loading…
Cancel
Save