diff --git a/app/src/androidTest/java/com/todoroo/astrid/service/TaskCreatorTest.kt b/app/src/androidTest/java/com/todoroo/astrid/service/TaskCreatorTest.kt new file mode 100644 index 000000000..16193d49d --- /dev/null +++ b/app/src/androidTest/java/com/todoroo/astrid/service/TaskCreatorTest.kt @@ -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 + ) + } +} \ No newline at end of file diff --git a/app/src/commonTest/java/org/tasks/SuspendFreeze.kt b/app/src/commonTest/java/org/tasks/SuspendFreeze.kt index 0234eaee5..67b20b0aa 100644 --- a/app/src/commonTest/java/org/tasks/SuspendFreeze.kt +++ b/app/src/commonTest/java/org/tasks/SuspendFreeze.kt @@ -5,9 +5,9 @@ import org.tasks.time.DateTimeUtils class SuspendFreeze { - suspend fun thawAfter(run: suspend () -> Unit) { + suspend fun thawAfter(run: suspend () -> T): T { try { - run() + return run() } finally { thaw() } @@ -15,16 +15,16 @@ class SuspendFreeze { companion object { - suspend fun freezeClock(run: suspend () -> Unit) { - freezeAt(DateTimeUtils.currentTimeMillis()).thawAfter(run) + suspend fun freezeClock(run: suspend () -> T): T { + return freezeAt(DateTimeUtils.currentTimeMillis()).thawAfter(run) } - suspend fun freezeAt(dateTime: DateTime, run: suspend () -> Unit) { - freezeAt(dateTime.millis, run) + suspend fun freezeAt(dateTime: DateTime, run: suspend () -> T): T { + return freezeAt(dateTime.millis, run) } - suspend fun freezeAt(timestamp: Long, run: suspend () -> Unit) { - freezeAt(timestamp).thawAfter(run) + suspend fun freezeAt(timestamp: Long, run: suspend () -> T): T { + return freezeAt(timestamp).thawAfter(run) } fun freezeAt(dateTime: DateTime): SuspendFreeze { 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 a6f6edafe..fbab312cd 100644 --- a/app/src/main/java/com/todoroo/astrid/service/TaskCreator.kt +++ b/app/src/main/java/com/todoroo/astrid/service/TaskCreator.kt @@ -7,7 +7,10 @@ import com.todoroo.astrid.api.GtasksFilter import com.todoroo.astrid.api.PermaSql import com.todoroo.astrid.dao.TaskDao 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.IMPORTANCE import com.todoroo.astrid.data.Task.Companion.createDueDate import com.todoroo.astrid.gcal.GCalHelper import com.todoroo.astrid.helper.UUIDHelper @@ -17,6 +20,7 @@ import org.tasks.Strings.isNullOrEmpty import org.tasks.data.* import org.tasks.preferences.DefaultFilterProvider import org.tasks.preferences.Preferences +import org.tasks.time.DateTimeUtils.startOfDay import timber.log.Timber import java.util.* 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 * base task model. */ - private suspend fun create(values: Map?, title: String?): Task { + internal suspend fun create(values: Map?, title: String?): Task { val task = Task() task.creationDate = DateUtilities.now() task.modificationDate = DateUtilities.now() @@ -93,13 +97,6 @@ class TaskCreator @Inject constructor( } task.uuid = UUIDHelper.newUUID() 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) ?.takeIf { it.isNotBlank() } ?.let { @@ -112,27 +109,27 @@ class TaskCreator @Inject constructor( ?.let { task.putTransitory(Place.KEY, it) } setDefaultReminders(preferences, task) val tags = ArrayList() - if (values != null && values.isNotEmpty()) { - for (item in values.entries) { - val key = item.key - var value: Any? = item.value - when (key) { - Tag.KEY -> tags.add(value as String) - GoogleTask.KEY, CaldavTask.KEY, Place.KEY -> task.putTransitory(key, value!!) - else -> { - 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 -> { - } - } - } - } + values?.entries?.forEach { (key, value) -> + when (key) { + Tag.KEY -> tags.add(value as String) + GoogleTask.KEY, CaldavTask.KEY, Place.KEY -> task.putTransitory(key, value) + DUE_DATE.name -> value.substitute()?.toLongOrNull()?.let { task.dueDate = it } + IMPORTANCE.name -> value.substitute()?.toIntOrNull()?.let { task.priority = it } + HIDE_UNTIL.name -> + value.substitute()?.toLongOrNull()?.let { task.hideUntil = it.startOfDay() } } } + 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()) { preferences.getStringValue(R.string.p_default_tags) ?.split(",") @@ -167,5 +164,8 @@ class TaskCreator @Inject constructor( * preferences.getIntegerFromString(R.string.p_rmd_default_random_hours, 0)) task.reminderFlags = preferences.defaultReminders or preferences.defaultRingMode } + + private fun Any?.substitute(): String? = + (this as? String)?.let { PermaSql.replacePlaceholdersForNewTask(it) } } } \ No newline at end of file diff --git a/app/src/main/java/com/todoroo/astrid/ui/StartDateControlSet.kt b/app/src/main/java/com/todoroo/astrid/ui/StartDateControlSet.kt index 98c5e849f..9326e2c37 100644 --- a/app/src/main/java/com/todoroo/astrid/ui/StartDateControlSet.kt +++ b/app/src/main/java/com/todoroo/astrid/ui/StartDateControlSet.kt @@ -92,7 +92,7 @@ class StartDateControlSet : TaskEditControlFragment() { selectedDay = savedInstanceState.getLong(EXTRA_DAY) selectedTime = savedInstanceState.getInt(EXTRA_TIME) } - refreshDisplayView() + applySelectionToHideUntil() } override val layout = R.layout.control_set_hide