Move Room to data module

pull/2884/head
Alex Baker 2 years ago
parent 6118121698
commit 6e14d07d0c

@ -60,12 +60,6 @@ android {
targetSdk = 33 targetSdk = 33
minSdk = 24 minSdk = 24
testInstrumentationRunner = "org.tasks.TestRunner" testInstrumentationRunner = "org.tasks.TestRunner"
ksp {
arg("room.schemaLocation", "$projectDir/schemas")
arg("room.incremental", "true")
arg("room.generateKotlin", "true")
}
} }
signingConfigs { signingConfigs {
@ -175,6 +169,7 @@ val genericImplementation by configurations
val googleplayImplementation by configurations val googleplayImplementation by configurations
dependencies { dependencies {
implementation(project(":data"))
coreLibraryDesugaring(libs.desugar.jdk.libs) coreLibraryDesugaring(libs.desugar.jdk.libs)
implementation(libs.bitfire.dav4jvm) { implementation(libs.bitfire.dav4jvm) {
exclude(group = "junit") exclude(group = "junit")
@ -203,7 +198,6 @@ dependencies {
implementation(libs.androidx.lifecycle.runtime) implementation(libs.androidx.lifecycle.runtime)
implementation(libs.androidx.lifecycle.viewmodel) implementation(libs.androidx.lifecycle.viewmodel)
implementation(libs.androidx.room) implementation(libs.androidx.room)
ksp(libs.androidx.room.compiler)
implementation(libs.androidx.appcompat) implementation(libs.androidx.appcompat)
implementation(libs.markwon) implementation(libs.markwon)
implementation(libs.markwon.editor) implementation(libs.markwon.editor)

@ -10,7 +10,7 @@ import org.junit.Test
import org.tasks.SuspendFreeze.Companion.freezeClock import org.tasks.SuspendFreeze.Companion.freezeClock
import org.tasks.injection.InjectingTestCase import org.tasks.injection.InjectingTestCase
import org.tasks.injection.ProductionModule import org.tasks.injection.ProductionModule
import org.tasks.time.DateTimeUtils import org.tasks.time.DateTimeUtils2.currentTimeMillis
import javax.inject.Inject import javax.inject.Inject
@UninstallModules(ProductionModule::class) @UninstallModules(ProductionModule::class)
@ -23,7 +23,7 @@ class TaskTest : InjectingTestCase() {
freezeClock { freezeClock {
val task = Task() val task = Task()
taskDao.createNew(task) taskDao.createNew(task)
assertEquals(DateTimeUtils.currentTimeMillis(), task.creationDate) assertEquals(currentTimeMillis(), task.creationDate)
} }
} }

@ -1,6 +1,8 @@
package com.todoroo.astrid.service package com.todoroo.astrid.service
import com.todoroo.astrid.api.PermaSql.* import com.todoroo.astrid.api.PermaSql.VALUE_EOD
import com.todoroo.astrid.api.PermaSql.VALUE_EOD_NEXT_WEEK
import com.todoroo.astrid.api.PermaSql.VALUE_EOD_TOMORROW
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.DUE_DATE
import com.todoroo.astrid.data.Task.Companion.HIDE_UNTIL import com.todoroo.astrid.data.Task.Companion.HIDE_UNTIL
@ -12,6 +14,7 @@ import org.junit.Assert.assertEquals
import org.junit.Test import org.junit.Test
import org.tasks.R import org.tasks.R
import org.tasks.SuspendFreeze.Companion.freezeAt import org.tasks.SuspendFreeze.Companion.freezeAt
import org.tasks.data.createDueDate
import org.tasks.injection.InjectingTestCase import org.tasks.injection.InjectingTestCase
import org.tasks.injection.ProductionModule import org.tasks.injection.ProductionModule
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
@ -35,7 +38,7 @@ class TaskCreatorTest : InjectingTestCase() {
assertEquals(DateTime(2021, 2, 4).millis, task.hideUntil) assertEquals(DateTime(2021, 2, 4).millis, task.hideUntil)
assertEquals( assertEquals(
Task.createDueDate(URGENCY_SPECIFIC_DAY, DateTime(2021, 2, 5).millis), createDueDate(URGENCY_SPECIFIC_DAY, DateTime(2021, 2, 5).millis),
task.dueDate task.dueDate
) )
} }
@ -63,7 +66,7 @@ class TaskCreatorTest : InjectingTestCase() {
assertEquals(DateTime(2021, 2, 4).millis, task.hideUntil) assertEquals(DateTime(2021, 2, 4).millis, task.hideUntil)
assertEquals( assertEquals(
Task.createDueDate(URGENCY_SPECIFIC_DAY, DateTime(2021, 2, 4).millis), createDueDate(URGENCY_SPECIFIC_DAY, DateTime(2021, 2, 4).millis),
task.dueDate task.dueDate
) )
} }
@ -93,7 +96,7 @@ class TaskCreatorTest : InjectingTestCase() {
} }
assertEquals( assertEquals(
Task.createDueDate(URGENCY_SPECIFIC_DAY, DateTime(2021, 2, 5).millis), createDueDate(URGENCY_SPECIFIC_DAY, DateTime(2021, 2, 5).millis),
task.dueDate task.dueDate
) )
} }

@ -6,7 +6,9 @@ import com.todoroo.astrid.helper.UUIDHelper
import dagger.hilt.android.testing.HiltAndroidTest import dagger.hilt.android.testing.HiltAndroidTest
import dagger.hilt.android.testing.UninstallModules import dagger.hilt.android.testing.UninstallModules
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import org.junit.Assert.* import org.junit.Assert.assertNotNull
import org.junit.Assert.assertNull
import org.junit.Assert.assertTrue
import org.junit.Test import org.junit.Test
import org.tasks.data.CaldavDao.Companion.LOCAL import org.tasks.data.CaldavDao.Companion.LOCAL
import org.tasks.date.DateTimeUtils.newDateTime import org.tasks.date.DateTimeUtils.newDateTime
@ -16,7 +18,7 @@ import org.tasks.makers.TaskMaker.CREATION_TIME
import org.tasks.makers.TaskMaker.DELETION_TIME import org.tasks.makers.TaskMaker.DELETION_TIME
import org.tasks.makers.TaskMaker.newTask import org.tasks.makers.TaskMaker.newTask
import org.tasks.time.DateTime import org.tasks.time.DateTime
import org.tasks.time.DateTimeUtils import org.tasks.time.DateTimeUtils2.currentTimeMillis
import javax.inject.Inject import javax.inject.Inject
@UninstallModules(ProductionModule::class) @UninstallModules(ProductionModule::class)
@ -43,7 +45,7 @@ class DeletionDaoTests : InjectingTestCase() {
deletionDao.markDeleted(listOf(task.id)) deletionDao.markDeleted(listOf(task.id))
task = taskDao.fetch(task.id)!! task = taskDao.fetch(task.id)!!
assertTrue(task.modificationDate > task.creationDate) assertTrue(task.modificationDate > task.creationDate)
assertTrue(task.modificationDate < DateTimeUtils.currentTimeMillis()) assertTrue(task.modificationDate < currentTimeMillis())
} }
@Test @Test
@ -53,7 +55,7 @@ class DeletionDaoTests : InjectingTestCase() {
deletionDao.markDeleted(listOf(task.id)) deletionDao.markDeleted(listOf(task.id))
task = taskDao.fetch(task.id)!! task = taskDao.fetch(task.id)!!
assertTrue(task.deletionDate > task.creationDate) assertTrue(task.deletionDate > task.creationDate)
assertTrue(task.deletionDate < DateTimeUtils.currentTimeMillis()) assertTrue(task.deletionDate < currentTimeMillis())
} }
@Test @Test

@ -19,6 +19,7 @@ import org.tasks.data.AlarmDao
import org.tasks.data.LocationDao import org.tasks.data.LocationDao
import org.tasks.data.TagDataDao import org.tasks.data.TagDataDao
import org.tasks.data.UserActivityDao import org.tasks.data.UserActivityDao
import org.tasks.data.getLocation
import org.tasks.injection.InjectingTestCase import org.tasks.injection.InjectingTestCase
import org.tasks.location.GeofenceApi import org.tasks.location.GeofenceApi
import org.tasks.preferences.DefaultFilterProvider import org.tasks.preferences.DefaultFilterProvider

@ -4,13 +4,16 @@ import com.todoroo.astrid.data.Task
import dagger.hilt.android.testing.HiltAndroidTest import dagger.hilt.android.testing.HiltAndroidTest
import dagger.hilt.android.testing.UninstallModules import dagger.hilt.android.testing.UninstallModules
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import org.junit.Assert.* import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Test import org.junit.Test
import org.tasks.data.Alarm import org.tasks.data.Alarm
import org.tasks.data.Alarm.Companion.whenOverdue import org.tasks.data.Alarm.Companion.whenOverdue
import org.tasks.data.createDueDate
import org.tasks.injection.ProductionModule import org.tasks.injection.ProductionModule
import org.tasks.makers.TaskMaker.newTask import org.tasks.makers.TaskMaker.newTask
import org.tasks.time.DateTimeUtils.currentTimeMillis import org.tasks.time.DateTimeUtils2.currentTimeMillis
@UninstallModules(ProductionModule::class) @UninstallModules(ProductionModule::class)
@HiltAndroidTest @HiltAndroidTest
@ -22,7 +25,7 @@ class ReminderTests : BaseTaskEditViewModelTest() {
setup(task) setup(task)
viewModel.setStartDate( viewModel.setStartDate(
Task.createDueDate( createDueDate(
Task.URGENCY_SPECIFIC_DAY_TIME, Task.URGENCY_SPECIFIC_DAY_TIME,
currentTimeMillis() currentTimeMillis()
) )
@ -43,7 +46,7 @@ class ReminderTests : BaseTaskEditViewModelTest() {
setup(task) setup(task)
viewModel.setDueDate( viewModel.setDueDate(
Task.createDueDate( createDueDate(
Task.URGENCY_SPECIFIC_DAY_TIME, Task.URGENCY_SPECIFIC_DAY_TIME,
currentTimeMillis() currentTimeMillis()
) )
@ -64,7 +67,7 @@ class ReminderTests : BaseTaskEditViewModelTest() {
setup(task) setup(task)
viewModel.setDueDate( viewModel.setDueDate(
Task.createDueDate( createDueDate(
Task.URGENCY_SPECIFIC_DAY_TIME, Task.URGENCY_SPECIFIC_DAY_TIME,
currentTimeMillis() currentTimeMillis()
) )

@ -7,7 +7,7 @@
package com.todoroo.andlib.utility; package com.todoroo.andlib.utility;
import static org.tasks.date.DateTimeUtils.newDateTime; import static org.tasks.date.DateTimeUtils.newDateTime;
import static org.tasks.time.DateTimeUtils.currentTimeMillis; import static org.tasks.time.DateTimeUtils2.currentTimeMillis;
import android.content.Context; import android.content.Context;
import android.text.format.DateFormat; import android.text.format.DateFormat;

@ -26,7 +26,6 @@ import com.todoroo.astrid.activity.TaskEditFragment.Companion.newTaskEditFragmen
import com.todoroo.astrid.adapter.SubheaderClickHandler import com.todoroo.astrid.adapter.SubheaderClickHandler
import com.todoroo.astrid.api.Filter import com.todoroo.astrid.api.Filter
import com.todoroo.astrid.dao.TaskDao import com.todoroo.astrid.dao.TaskDao
import com.todoroo.astrid.data.Task
import com.todoroo.astrid.service.TaskCreator import com.todoroo.astrid.service.TaskCreator
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -48,6 +47,8 @@ import org.tasks.data.AlarmDao
import org.tasks.data.LocationDao import org.tasks.data.LocationDao
import org.tasks.data.Place import org.tasks.data.Place
import org.tasks.data.TagDataDao import org.tasks.data.TagDataDao
import com.todoroo.astrid.data.Task
import org.tasks.data.getLocation
import org.tasks.databinding.TaskListActivityBinding import org.tasks.databinding.TaskListActivityBinding
import org.tasks.dialogs.NewFilterDialog import org.tasks.dialogs.NewFilterDialog
import org.tasks.dialogs.WhatsNewDialog import org.tasks.dialogs.WhatsNewDialog

@ -11,10 +11,8 @@ import com.todoroo.astrid.activity.MainActivity.Companion.OPEN_FILTER
import com.todoroo.astrid.api.CaldavFilter import com.todoroo.astrid.api.CaldavFilter
import com.todoroo.astrid.api.CustomFilter import com.todoroo.astrid.api.CustomFilter
import com.todoroo.astrid.api.Filter import com.todoroo.astrid.api.Filter
import com.todoroo.astrid.api.Filter.Companion.NO_COUNT
import com.todoroo.astrid.api.GtasksFilter import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.api.TagFilter import com.todoroo.astrid.api.TagFilter
import com.todoroo.astrid.data.Task
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentListOf
@ -31,7 +29,10 @@ import org.tasks.Tasks.Companion.IS_GENERIC
import org.tasks.billing.Inventory import org.tasks.billing.Inventory
import org.tasks.compose.drawer.DrawerItem import org.tasks.compose.drawer.DrawerItem
import org.tasks.data.CaldavDao import org.tasks.data.CaldavDao
import org.tasks.data.NO_COUNT
import com.todoroo.astrid.data.Task
import org.tasks.data.TaskDao import org.tasks.data.TaskDao
import org.tasks.data.count
import org.tasks.filters.FilterProvider import org.tasks.filters.FilterProvider
import org.tasks.filters.NavigationDrawerSubheader import org.tasks.filters.NavigationDrawerSubheader
import org.tasks.filters.PlaceFilter import org.tasks.filters.PlaceFilter

@ -65,9 +65,7 @@ import com.todoroo.astrid.api.FilterImpl
import com.todoroo.astrid.api.GtasksFilter import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.api.TagFilter import com.todoroo.astrid.api.TagFilter
import com.todoroo.astrid.core.BuiltInFilterExposer import com.todoroo.astrid.core.BuiltInFilterExposer
import com.todoroo.astrid.dao.Database
import com.todoroo.astrid.dao.TaskDao import com.todoroo.astrid.dao.TaskDao
import com.todoroo.astrid.data.Task
import com.todoroo.astrid.repeats.RepeatTaskHelper import com.todoroo.astrid.repeats.RepeatTaskHelper
import com.todoroo.astrid.service.TaskCompleter import com.todoroo.astrid.service.TaskCompleter
import com.todoroo.astrid.service.TaskCreator import com.todoroo.astrid.service.TaskCreator
@ -96,9 +94,12 @@ import org.tasks.caldav.BaseCaldavCalendarSettingsActivity
import org.tasks.compose.SubscriptionNagBanner import org.tasks.compose.SubscriptionNagBanner
import org.tasks.compose.collectAsStateLifecycleAware import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.data.CaldavDao import org.tasks.data.CaldavDao
import com.todoroo.astrid.dao.Database
import org.tasks.data.Tag import org.tasks.data.Tag
import org.tasks.data.TagDataDao import org.tasks.data.TagDataDao
import com.todoroo.astrid.data.Task
import org.tasks.data.TaskContainer import org.tasks.data.TaskContainer
import org.tasks.data.listSettingsClass
import org.tasks.databinding.FragmentTaskListBinding import org.tasks.databinding.FragmentTaskListBinding
import org.tasks.db.SuspendDbUtils.chunkedMap import org.tasks.db.SuspendDbUtils.chunkedMap
import org.tasks.dialogs.DateTimePicker.Companion.newDateTimePicker import org.tasks.dialogs.DateTimePicker.Companion.newDateTimePicker

@ -11,16 +11,18 @@ import com.todoroo.astrid.core.SortHelper.SORT_LIST
import com.todoroo.astrid.core.SortHelper.SORT_MANUAL import com.todoroo.astrid.core.SortHelper.SORT_MANUAL
import com.todoroo.astrid.core.SortHelper.SORT_START import com.todoroo.astrid.core.SortHelper.SORT_START
import com.todoroo.astrid.dao.TaskDao import com.todoroo.astrid.dao.TaskDao
import com.todoroo.astrid.data.Task
import com.todoroo.astrid.data.Task.Companion.HIDE_UNTIL_SPECIFIC_DAY
import com.todoroo.astrid.service.TaskMover import com.todoroo.astrid.service.TaskMover
import org.tasks.BuildConfig import org.tasks.BuildConfig
import org.tasks.LocalBroadcastManager import org.tasks.LocalBroadcastManager
import org.tasks.data.CaldavDao import org.tasks.data.CaldavDao
import org.tasks.data.CaldavDao.Companion.toAppleEpoch
import org.tasks.data.CaldavTask import org.tasks.data.CaldavTask
import org.tasks.data.GoogleTaskDao import org.tasks.data.GoogleTaskDao
import com.todoroo.astrid.data.Task
import com.todoroo.astrid.data.Task.Companion.HIDE_UNTIL_SPECIFIC_DAY
import org.tasks.data.TaskContainer import org.tasks.data.TaskContainer
import org.tasks.date.DateTimeUtils.toAppleEpoch import org.tasks.data.createDueDate
import org.tasks.data.createHideUntil
import org.tasks.date.DateTimeUtils.toDateTime import org.tasks.date.DateTimeUtils.toDateTime
import org.tasks.time.DateTimeUtils.millisOfDay import org.tasks.time.DateTimeUtils.millisOfDay
@ -205,7 +207,7 @@ open class TaskAdapter(
task.setDueDateAdjustingHideUntil(when { task.setDueDateAdjustingHideUntil(when {
date == 0L -> 0L date == 0L -> 0L
task.hasDueTime() -> date.toDateTime().withMillisOfDay(original.millisOfDay()).millis task.hasDueTime() -> date.toDateTime().withMillisOfDay(original.millisOfDay()).millis
else -> Task.createDueDate(Task.URGENCY_SPECIFIC_DAY, date) else -> createDueDate(Task.URGENCY_SPECIFIC_DAY, date)
}) })
if (original != task.dueDate) { if (original != task.dueDate) {
taskDao.save(task) taskDao.save(task)

@ -4,11 +4,11 @@ import com.todoroo.andlib.sql.Criterion.Companion.and
import com.todoroo.andlib.sql.Join.Companion.left import com.todoroo.andlib.sql.Join.Companion.left
import com.todoroo.andlib.sql.QueryTemplate import com.todoroo.andlib.sql.QueryTemplate
import com.todoroo.andlib.utility.AndroidUtilities import com.todoroo.andlib.utility.AndroidUtilities
import com.todoroo.astrid.api.Filter.Companion.NO_COUNT
import com.todoroo.astrid.data.Task
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
import org.tasks.data.CaldavCalendar import org.tasks.data.CaldavCalendar
import org.tasks.data.CaldavTask import org.tasks.data.CaldavTask
import org.tasks.data.NO_COUNT
import com.todoroo.astrid.data.Task
import org.tasks.data.TaskDao.TaskCriteria.activeAndVisible import org.tasks.data.TaskDao.TaskCriteria.activeAndVisible
@Parcelize @Parcelize

@ -2,6 +2,8 @@ package com.todoroo.astrid.api
import android.os.Parcelable import android.os.Parcelable
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
import org.tasks.data.NO_COUNT
import org.tasks.data.NO_ORDER
interface Filter : FilterListItem, Parcelable { interface Filter : FilterListItem, Parcelable {
val valuesForNewTasks: String? val valuesForNewTasks: String?
@ -28,11 +30,6 @@ interface Filter : FilterListItem, Parcelable {
fun supportsHiddenTasks(): Boolean = true fun supportsHiddenTasks(): Boolean = true
fun supportsSubtasks(): Boolean = true fun supportsSubtasks(): Boolean = true
fun supportsSorting(): Boolean = true fun supportsSorting(): Boolean = true
companion object {
const val NO_ORDER = -1
const val NO_COUNT = -1
}
} }
@Deprecated("Use manual ordering") @Deprecated("Use manual ordering")

@ -4,12 +4,12 @@ import com.todoroo.andlib.sql.Criterion.Companion.and
import com.todoroo.andlib.sql.Join.Companion.left import com.todoroo.andlib.sql.Join.Companion.left
import com.todoroo.andlib.sql.QueryTemplate import com.todoroo.andlib.sql.QueryTemplate
import com.todoroo.andlib.utility.AndroidUtilities import com.todoroo.andlib.utility.AndroidUtilities
import com.todoroo.astrid.api.Filter.Companion.NO_COUNT
import com.todoroo.astrid.data.Task import com.todoroo.astrid.data.Task
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
import org.tasks.data.CaldavCalendar import org.tasks.data.CaldavCalendar
import org.tasks.data.CaldavTask import org.tasks.data.CaldavTask
import org.tasks.data.GoogleTask import org.tasks.data.GoogleTask
import org.tasks.data.NO_COUNT
import org.tasks.data.TaskDao.TaskCriteria.activeAndVisible import org.tasks.data.TaskDao.TaskCriteria.activeAndVisible
@Parcelize @Parcelize

@ -4,9 +4,9 @@ import com.todoroo.andlib.sql.Criterion.Companion.and
import com.todoroo.andlib.sql.Join.Companion.inner import com.todoroo.andlib.sql.Join.Companion.inner
import com.todoroo.andlib.sql.QueryTemplate import com.todoroo.andlib.sql.QueryTemplate
import com.todoroo.andlib.utility.AndroidUtilities import com.todoroo.andlib.utility.AndroidUtilities
import com.todoroo.astrid.api.Filter.Companion.NO_COUNT
import com.todoroo.astrid.data.Task import com.todoroo.astrid.data.Task
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
import org.tasks.data.NO_COUNT
import org.tasks.data.Tag import org.tasks.data.Tag
import org.tasks.data.TagData import org.tasks.data.TagData
import org.tasks.data.TaskDao.TaskCriteria.activeAndVisible import org.tasks.data.TaskDao.TaskCriteria.activeAndVisible

@ -6,6 +6,7 @@
package com.todoroo.astrid.core; package com.todoroo.astrid.core;
import static org.tasks.data.CaldavDaoKt.APPLE_EPOCH;
import static org.tasks.db.QueryUtils.showCompleted; import static org.tasks.db.QueryUtils.showCompleted;
import static org.tasks.db.QueryUtils.showHidden; import static org.tasks.db.QueryUtils.showHidden;
@ -44,7 +45,6 @@ public class SortHelper {
public static final int SORT_COMPLETED = 10; public static final int SORT_COMPLETED = 10;
public static final int SORT_MANUAL = 11; public static final int SORT_MANUAL = 11;
public static final long APPLE_EPOCH = 978307200000L; // 1/1/2001 GMT
@SuppressLint("DefaultLocale") @SuppressLint("DefaultLocale")
public static final String CALDAV_ORDER_COLUMN = public static final String CALDAV_ORDER_COLUMN =
String.format(Locale.US, "IFNULL(tasks.`order`, (tasks.created - %d) / 1000)", APPLE_EPOCH); String.format(Locale.US, "IFNULL(tasks.`order`, (tasks.created - %d) / 1000)", APPLE_EPOCH);

@ -6,11 +6,14 @@
package com.todoroo.astrid.dao package com.todoroo.astrid.dao
import com.todoroo.astrid.api.Filter import com.todoroo.astrid.api.Filter
import com.todoroo.astrid.data.Task
import com.todoroo.astrid.timers.TimerPlugin import com.todoroo.astrid.timers.TimerPlugin
import org.tasks.LocalBroadcastManager import org.tasks.LocalBroadcastManager
import com.todoroo.astrid.data.Task
import org.tasks.data.TaskContainer import org.tasks.data.TaskContainer
import org.tasks.data.TaskDao import org.tasks.data.TaskDao
import org.tasks.data.fetchFiltered
import org.tasks.data.fetchTasks
import org.tasks.data.setCollapsed
import org.tasks.date.DateTimeUtils.isAfterNow import org.tasks.date.DateTimeUtils.isAfterNow
import org.tasks.db.SuspendDbUtils.eachChunk import org.tasks.db.SuspendDbUtils.eachChunk
import org.tasks.jobs.WorkManager import org.tasks.jobs.WorkManager

@ -1,12 +0,0 @@
/*
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.data;
public class SyncFlags {
public static final String SUPPRESS_SYNC = "suppress_sync";
public static final String FORCE_CALDAV_SYNC = "force_caldav_sync";
}

@ -1,17 +0,0 @@
package com.todoroo.astrid.helper;
import java.util.UUID;
public class UUIDHelper {
private static final long MIN_UUID = 100000000;
/** @return a pair consisting of the newly generated uuid and the corresponding proof text */
public static String newUUID() {
long uuid;
do {
uuid = UUID.randomUUID().getLeastSignificantBits() & 0x7fffffffffffffffL;
} while (uuid < MIN_UUID);
return Long.toString(uuid);
}
}

@ -28,7 +28,7 @@ import org.tasks.repeats.BasicRecurrenceDialog
import org.tasks.repeats.RecurrenceUtils.newRecur import org.tasks.repeats.RecurrenceUtils.newRecur
import org.tasks.repeats.RepeatRuleToString import org.tasks.repeats.RepeatRuleToString
import org.tasks.time.DateTime import org.tasks.time.DateTime
import org.tasks.time.DateTimeUtils.currentTimeMillis import org.tasks.time.DateTimeUtils2.currentTimeMillis
import org.tasks.ui.TaskEditControlFragment import org.tasks.ui.TaskEditControlFragment
import javax.inject.Inject import javax.inject.Inject

@ -9,7 +9,6 @@ import com.todoroo.andlib.utility.DateUtilities
import com.todoroo.astrid.alarms.AlarmService import com.todoroo.astrid.alarms.AlarmService
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.createDueDate
import com.todoroo.astrid.gcal.GCalHelper import com.todoroo.astrid.gcal.GCalHelper
import net.fortuna.ical4j.model.Date import net.fortuna.ical4j.model.Date
import net.fortuna.ical4j.model.Recur import net.fortuna.ical4j.model.Recur
@ -17,6 +16,8 @@ import net.fortuna.ical4j.model.WeekDay
import org.tasks.LocalBroadcastManager import org.tasks.LocalBroadcastManager
import org.tasks.data.Alarm import org.tasks.data.Alarm
import org.tasks.data.Alarm.Companion.TYPE_SNOOZE import org.tasks.data.Alarm.Companion.TYPE_SNOOZE
import org.tasks.data.createDueDate
import org.tasks.data.setRecurrence
import org.tasks.date.DateTimeUtils.newDateTime import org.tasks.date.DateTimeUtils.newDateTime
import org.tasks.repeats.RecurrenceUtils.newRecur import org.tasks.repeats.RecurrenceUtils.newRecur
import org.tasks.time.DateTime import org.tasks.time.DateTime

@ -17,6 +17,7 @@ import dagger.hilt.android.qualifiers.ApplicationContext
import org.tasks.LocalBroadcastManager import org.tasks.LocalBroadcastManager
import org.tasks.data.CaldavDao import org.tasks.data.CaldavDao
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
@ -65,7 +66,7 @@ class TaskCompleter @Inject internal constructor(
return return
} }
val completed = completionDate > 0 val completed = completionDate > 0
val modified = System.currentTimeMillis() val modified = currentTimeMillis()
database.withTransaction { database.withTransaction {
tasks tasks
.map { .map {

@ -12,7 +12,6 @@ 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
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.IMPORTANCE
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
import com.todoroo.astrid.utility.TitleParser.parse import com.todoroo.astrid.utility.TitleParser.parse
@ -26,7 +25,6 @@ import org.tasks.data.Alarm.Companion.whenStarted
import org.tasks.data.AlarmDao import org.tasks.data.AlarmDao
import org.tasks.data.CaldavDao import org.tasks.data.CaldavDao
import org.tasks.data.CaldavTask import org.tasks.data.CaldavTask
import org.tasks.data.Geofence
import org.tasks.data.GoogleTask import org.tasks.data.GoogleTask
import org.tasks.data.GoogleTaskDao import org.tasks.data.GoogleTaskDao
import org.tasks.data.LocationDao import org.tasks.data.LocationDao
@ -35,6 +33,9 @@ import org.tasks.data.Tag
import org.tasks.data.TagDao import org.tasks.data.TagDao
import org.tasks.data.TagData import org.tasks.data.TagData
import org.tasks.data.TagDataDao import org.tasks.data.TagDataDao
import org.tasks.data.createDueDate
import org.tasks.data.createGeofence
import org.tasks.data.createHideUntil
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 org.tasks.time.DateTimeUtils.startOfDay
@ -111,7 +112,7 @@ class TaskCreator @Inject constructor(
if (task.hasTransitory(Place.KEY)) { if (task.hasTransitory(Place.KEY)) {
val place = locationDao.getPlace(task.getTransitory<String>(Place.KEY)!!) val place = locationDao.getPlace(task.getTransitory<String>(Place.KEY)!!)
if (place != null) { if (place != null) {
locationDao.insert(Geofence(place.uid, preferences)) locationDao.insert(createGeofence(place.uid, preferences))
} }
} }
taskDao.save(task, null) taskDao.save(task, null)

@ -5,7 +5,6 @@ import com.todoroo.andlib.utility.DateUtilities
import com.todoroo.astrid.api.CaldavFilter import com.todoroo.astrid.api.CaldavFilter
import com.todoroo.astrid.api.Filter import com.todoroo.astrid.api.Filter
import com.todoroo.astrid.api.GtasksFilter import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.data.Task
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import org.tasks.BuildConfig import org.tasks.BuildConfig
import org.tasks.LocalBroadcastManager import org.tasks.LocalBroadcastManager
@ -15,7 +14,9 @@ import org.tasks.data.CaldavDao
import org.tasks.data.CaldavTask import org.tasks.data.CaldavTask
import org.tasks.data.GoogleTaskDao import org.tasks.data.GoogleTaskDao
import org.tasks.data.GoogleTaskListDao import org.tasks.data.GoogleTaskListDao
import com.todoroo.astrid.data.Task
import org.tasks.data.TaskDao import org.tasks.data.TaskDao
import org.tasks.data.getLocalList
import org.tasks.db.DbUtils.dbchunk import org.tasks.db.DbUtils.dbchunk
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import org.tasks.sync.SyncAdapters import org.tasks.sync.SyncAdapters

@ -7,11 +7,11 @@ package com.todoroo.astrid.utility
import com.mdimension.jchronic.AstridChronic import com.mdimension.jchronic.AstridChronic
import com.mdimension.jchronic.Chronic import com.mdimension.jchronic.Chronic
import com.todoroo.astrid.data.Task
import com.todoroo.astrid.data.Task.Companion.createDueDate
import net.fortuna.ical4j.model.Recur.Frequency import net.fortuna.ical4j.model.Recur.Frequency
import org.tasks.Strings.isNullOrEmpty import org.tasks.Strings.isNullOrEmpty
import org.tasks.data.TagDataDao import org.tasks.data.TagDataDao
import com.todoroo.astrid.data.Task
import org.tasks.data.createDueDate
import org.tasks.repeats.RecurrenceUtils.newRecur import org.tasks.repeats.RecurrenceUtils.newRecur
import timber.log.Timber import timber.log.Timber
import java.util.Calendar import java.util.Calendar

@ -11,15 +11,16 @@ import org.tasks.data.Alarm
import org.tasks.data.Alarm.Companion.TYPE_GEO_ENTER import org.tasks.data.Alarm.Companion.TYPE_GEO_ENTER
import org.tasks.data.Alarm.Companion.TYPE_GEO_EXIT import org.tasks.data.Alarm.Companion.TYPE_GEO_EXIT
import org.tasks.data.Geofence import org.tasks.data.Geofence
import org.tasks.data.Notification
import org.tasks.data.TaskDao import org.tasks.data.TaskDao
import org.tasks.data.fetchFiltered
import org.tasks.intents.TaskIntents import org.tasks.intents.TaskIntents
import org.tasks.notifications.AudioManager import org.tasks.notifications.AudioManager
import org.tasks.notifications.Notification
import org.tasks.notifications.NotificationManager import org.tasks.notifications.NotificationManager
import org.tasks.notifications.TelephonyManager import org.tasks.notifications.TelephonyManager
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import org.tasks.themes.ColorProvider import org.tasks.themes.ColorProvider
import org.tasks.time.DateTimeUtils import org.tasks.time.DateTimeUtils2.currentTimeMillis
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
import kotlin.math.min import kotlin.math.min
@ -63,7 +64,7 @@ class Notifier @Inject constructor(
.setContentText(filter.title) .setContentText(filter.title)
.setContentIntent(pendingIntent) .setContentIntent(pendingIntent)
.setAutoCancel(true) .setAutoCancel(true)
.setWhen(DateTimeUtils.currentTimeMillis()) .setWhen(currentTimeMillis())
.setShowWhen(true) .setShowWhen(true)
.setColor(colorProvider.getPriorityColor(maxPriority, true)) .setColor(colorProvider.getPriorityColor(maxPriority, true))
.setGroupSummary(true) .setGroupSummary(true)
@ -79,7 +80,7 @@ class Notifier @Inject constructor(
Notification().apply { Notification().apply {
taskId = it.task taskId = it.task
type = if (arrival) TYPE_GEO_ENTER else TYPE_GEO_EXIT type = if (arrival) TYPE_GEO_ENTER else TYPE_GEO_EXIT
timestamp = DateTimeUtils.currentTimeMillis() timestamp = currentTimeMillis()
location = place location = place
} }
} }

@ -14,7 +14,7 @@ import org.tasks.dialogs.MyTimePickerDialog.Companion.timeInputMode
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import org.tasks.themes.ThemeAccent import org.tasks.themes.ThemeAccent
import org.tasks.time.DateTime import org.tasks.time.DateTime
import org.tasks.time.DateTimeUtils.currentTimeMillis import org.tasks.time.DateTimeUtils2.currentTimeMillis
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint @AndroidEntryPoint

@ -25,7 +25,6 @@ import com.todoroo.astrid.activity.TaskListFragment
import com.todoroo.astrid.api.BooleanCriterion import com.todoroo.astrid.api.BooleanCriterion
import com.todoroo.astrid.api.CustomFilter import com.todoroo.astrid.api.CustomFilter
import com.todoroo.astrid.api.CustomFilterCriterion import com.todoroo.astrid.api.CustomFilterCriterion
import com.todoroo.astrid.api.Filter.Companion.NO_ORDER
import com.todoroo.astrid.api.MultipleSelectCriterion import com.todoroo.astrid.api.MultipleSelectCriterion
import com.todoroo.astrid.api.PermaSql import com.todoroo.astrid.api.PermaSql
import com.todoroo.astrid.api.TextInputCriterion import com.todoroo.astrid.api.TextInputCriterion
@ -41,6 +40,7 @@ import org.tasks.R
import org.tasks.Strings import org.tasks.Strings
import org.tasks.data.Filter import org.tasks.data.Filter
import org.tasks.data.FilterDao import org.tasks.data.FilterDao
import org.tasks.data.NO_ORDER
import org.tasks.data.TaskDao.TaskCriteria.activeAndVisible import org.tasks.data.TaskDao.TaskCriteria.activeAndVisible
import org.tasks.databinding.FilterSettingsActivityBinding import org.tasks.databinding.FilterSettingsActivityBinding
import org.tasks.db.QueryUtils import org.tasks.db.QueryUtils

@ -35,6 +35,7 @@ import org.tasks.data.FilterDao
import org.tasks.data.GoogleTaskListDao import org.tasks.data.GoogleTaskListDao
import org.tasks.data.LocationDao import org.tasks.data.LocationDao
import org.tasks.data.TagDataDao import org.tasks.data.TagDataDao
import org.tasks.data.listSettingsClass
import org.tasks.databinding.ActivityTagOrganizerBinding import org.tasks.databinding.ActivityTagOrganizerBinding
import org.tasks.filters.FilterProvider import org.tasks.filters.FilterProvider
import org.tasks.filters.PlaceFilter import org.tasks.filters.PlaceFilter

@ -15,6 +15,7 @@ import org.tasks.R
import org.tasks.Strings.isNullOrEmpty import org.tasks.Strings.isNullOrEmpty
import org.tasks.data.LocationDao import org.tasks.data.LocationDao
import org.tasks.data.Place import org.tasks.data.Place
import org.tasks.data.mapPosition
import org.tasks.databinding.ActivityLocationSettingsBinding import org.tasks.databinding.ActivityLocationSettingsBinding
import org.tasks.extensions.formatNumber import org.tasks.extensions.formatNumber
import org.tasks.filters.PlaceFilter import org.tasks.filters.PlaceFilter

@ -21,6 +21,7 @@ import org.tasks.extensions.Context.toast
import org.tasks.files.FileHelper import org.tasks.files.FileHelper
import org.tasks.jobs.WorkManager import org.tasks.jobs.WorkManager
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import timber.log.Timber import timber.log.Timber
import java.io.File import java.io.File
import java.io.IOException import java.io.IOException
@ -123,7 +124,7 @@ class TasksJsonExporter @Inject constructor(
} }
val data: MutableMap<String, Any> = HashMap() val data: MutableMap<String, Any> = HashMap()
data["version"] = BuildConfig.VERSION_CODE data["version"] = BuildConfig.VERSION_CODE
data["timestamp"] = System.currentTimeMillis() data["timestamp"] = currentTimeMillis()
data["data"] = BackupContainer( data["data"] = BackupContainer(
taskBackups, taskBackups,
locationDao.getPlaces(), locationDao.getPlaces(),

@ -9,6 +9,7 @@ import org.tasks.LocalBroadcastManager
import org.tasks.R import org.tasks.R
import org.tasks.data.CaldavAccount.Companion.TYPE_TASKS import org.tasks.data.CaldavAccount.Companion.TYPE_TASKS
import org.tasks.data.CaldavDao import org.tasks.data.CaldavDao
import org.tasks.data.isTasksSubscription
import org.tasks.extensions.Context.openUri import org.tasks.extensions.Context.openUri
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import timber.log.Timber import timber.log.Timber

@ -10,6 +10,7 @@ import okhttp3.OkHttpClient
import org.tasks.R import org.tasks.R
import org.tasks.billing.Inventory import org.tasks.billing.Inventory
import org.tasks.data.CaldavAccount import org.tasks.data.CaldavAccount
import org.tasks.data.getPassword
import org.tasks.http.HttpClientFactory import org.tasks.http.HttpClientFactory
import org.tasks.security.KeyStoreEncryption import org.tasks.security.KeyStoreEncryption
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit

@ -6,10 +6,6 @@ import at.bitfire.ical4android.util.DateUtils.ical4jTimeZone
import com.todoroo.andlib.utility.DateUtilities import com.todoroo.andlib.utility.DateUtilities
import com.todoroo.astrid.alarms.AlarmService import com.todoroo.astrid.alarms.AlarmService
import com.todoroo.astrid.dao.TaskDao import com.todoroo.astrid.dao.TaskDao
import com.todoroo.astrid.data.Task.Companion.HIDE_UNTIL_SPECIFIC_DAY
import com.todoroo.astrid.data.Task.Companion.HIDE_UNTIL_SPECIFIC_DAY_TIME
import com.todoroo.astrid.data.Task.Companion.URGENCY_SPECIFIC_DAY
import com.todoroo.astrid.data.Task.Companion.URGENCY_SPECIFIC_DAY_TIME
import com.todoroo.astrid.service.TaskCreator import com.todoroo.astrid.service.TaskCreator
import com.todoroo.astrid.service.TaskCreator.Companion.getDefaultAlarms import com.todoroo.astrid.service.TaskCreator.Companion.getDefaultAlarms
import com.todoroo.astrid.service.TaskCreator.Companion.setDefaultReminders import com.todoroo.astrid.service.TaskCreator.Companion.setDefaultReminders
@ -42,12 +38,18 @@ import org.tasks.data.CaldavCalendar
import org.tasks.data.CaldavCalendar.Companion.ACCESS_READ_ONLY import org.tasks.data.CaldavCalendar.Companion.ACCESS_READ_ONLY
import org.tasks.data.CaldavDao import org.tasks.data.CaldavDao
import org.tasks.data.CaldavTask import org.tasks.data.CaldavTask
import org.tasks.data.Geofence
import org.tasks.data.LocationDao import org.tasks.data.LocationDao
import org.tasks.data.Place import org.tasks.data.Place
import org.tasks.data.TagDao import org.tasks.data.TagDao
import org.tasks.data.TagData import org.tasks.data.TagData
import org.tasks.data.TagDataDao import org.tasks.data.TagDataDao
import com.todoroo.astrid.data.Task.Companion.HIDE_UNTIL_SPECIFIC_DAY
import com.todoroo.astrid.data.Task.Companion.HIDE_UNTIL_SPECIFIC_DAY_TIME
import com.todoroo.astrid.data.Task.Companion.URGENCY_SPECIFIC_DAY
import com.todoroo.astrid.data.Task.Companion.URGENCY_SPECIFIC_DAY_TIME
import org.tasks.data.createDueDate
import org.tasks.data.createGeofence
import org.tasks.data.createHideUntil
import org.tasks.date.DateTimeUtils.newDateTime import org.tasks.date.DateTimeUtils.newDateTime
import org.tasks.date.DateTimeUtils.toDateTime import org.tasks.date.DateTimeUtils.toDateTime
import org.tasks.date.DateTimeUtils.toLocal import org.tasks.date.DateTimeUtils.toLocal
@ -110,7 +112,7 @@ class iCalendar @Inject constructor(
val existing = locationDao.getGeofences(taskId) val existing = locationDao.getGeofences(taskId)
if (existing == null) { if (existing == null) {
locationDao.insert( locationDao.insert(
Geofence( createGeofence(
place.uid, place.uid,
preferences preferences
).copy(task = taskId) ).copy(task = taskId)
@ -308,11 +310,11 @@ class iCalendar @Inject constructor(
fun Due?.toMillis() = fun Due?.toMillis() =
when (this?.date) { when (this?.date) {
null -> 0 null -> 0
is DateTime -> com.todoroo.astrid.data.Task.createDueDate( is DateTime -> createDueDate(
URGENCY_SPECIFIC_DAY_TIME, URGENCY_SPECIFIC_DAY_TIME,
getLocal(this) getLocal(this)
) )
else -> com.todoroo.astrid.data.Task.createDueDate( else -> createDueDate(
URGENCY_SPECIFIC_DAY, URGENCY_SPECIFIC_DAY,
getLocal(this) getLocal(this)
) )

@ -2,10 +2,6 @@ package org.tasks.caldav
import at.bitfire.ical4android.Task import at.bitfire.ical4android.Task
import com.todoroo.andlib.utility.DateUtilities import com.todoroo.andlib.utility.DateUtilities
import com.todoroo.astrid.data.Task.Priority.Companion.HIGH
import com.todoroo.astrid.data.Task.Priority.Companion.LOW
import com.todoroo.astrid.data.Task.Priority.Companion.MEDIUM
import com.todoroo.astrid.data.Task.Priority.Companion.NONE
import net.fortuna.ical4j.model.property.Status import net.fortuna.ical4j.model.property.Status
import org.tasks.caldav.iCalendar.Companion.collapsed import org.tasks.caldav.iCalendar.Companion.collapsed
import org.tasks.caldav.iCalendar.Companion.getLocal import org.tasks.caldav.iCalendar.Companion.getLocal
@ -13,6 +9,11 @@ import org.tasks.caldav.iCalendar.Companion.order
import org.tasks.caldav.iCalendar.Companion.parent import org.tasks.caldav.iCalendar.Companion.parent
import org.tasks.caldav.iCalendar.Companion.toMillis import org.tasks.caldav.iCalendar.Companion.toMillis
import org.tasks.data.CaldavTask import org.tasks.data.CaldavTask
import com.todoroo.astrid.data.Task.Priority.Companion.HIGH
import com.todoroo.astrid.data.Task.Priority.Companion.LOW
import com.todoroo.astrid.data.Task.Priority.Companion.MEDIUM
import com.todoroo.astrid.data.Task.Priority.Companion.NONE
import org.tasks.data.setRecurrence
import org.tasks.date.DateTimeUtils.newDateTime import org.tasks.date.DateTimeUtils.newDateTime
import org.tasks.time.DateTime.UTC import org.tasks.time.DateTime.UTC
import org.tasks.time.DateTimeUtils.startOfSecond import org.tasks.time.DateTimeUtils.startOfSecond

@ -36,14 +36,15 @@ import androidx.compose.ui.unit.dp
import com.google.android.material.composethemeadapter.MdcTheme import com.google.android.material.composethemeadapter.MdcTheme
import com.todoroo.astrid.api.Filter import com.todoroo.astrid.api.Filter
import com.todoroo.astrid.api.GtasksFilter import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.data.Task
import org.tasks.compose.CheckBox import org.tasks.compose.CheckBox
import org.tasks.compose.ClearButton import org.tasks.compose.ClearButton
import org.tasks.compose.DisabledText import org.tasks.compose.DisabledText
import org.tasks.compose.SubtaskChip import org.tasks.compose.SubtaskChip
import org.tasks.compose.TaskEditIcon import org.tasks.compose.TaskEditIcon
import org.tasks.compose.TaskEditRow import org.tasks.compose.TaskEditRow
import com.todoroo.astrid.data.Task
import org.tasks.data.TaskContainer import org.tasks.data.TaskContainer
import org.tasks.data.isHidden
import org.tasks.tasklist.SectionedDataSource import org.tasks.tasklist.SectionedDataSource
import org.tasks.ui.TaskListViewModel import org.tasks.ui.TaskListViewModel
@ -214,7 +215,7 @@ fun ExistingSubtaskRow(
text = task.title!!, text = task.title!!,
modifier = Modifier modifier = Modifier
.weight(1f) .weight(1f)
.alpha(if (task.isCompleted || task.isHidden) ContentAlpha.disabled else ContentAlpha.high) .alpha(if (task.isCompleted || task.task.isHidden) ContentAlpha.disabled else ContentAlpha.high)
.align(Alignment.Top) .align(Alignment.Top)
.padding(top = 12.dp), .padding(top = 12.dp),
style = MaterialTheme.typography.body1.copy( style = MaterialTheme.typography.body1.copy(

@ -11,7 +11,12 @@ import androidx.compose.material.Text
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Pause import androidx.compose.material.icons.outlined.Pause
import androidx.compose.material.icons.outlined.PlayArrow import androidx.compose.material.icons.outlined.PlayArrow
import androidx.compose.runtime.* import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.alpha
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
@ -22,6 +27,7 @@ import kotlinx.coroutines.delay
import org.tasks.R import org.tasks.R
import org.tasks.compose.DisabledText import org.tasks.compose.DisabledText
import org.tasks.compose.TaskEditRow import org.tasks.compose.TaskEditRow
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import kotlin.time.Duration.Companion.seconds import kotlin.time.Duration.Companion.seconds
@Composable @Composable
@ -35,7 +41,7 @@ fun TimerRow(
TaskEditRow( TaskEditRow(
iconRes = R.drawable.ic_outline_timer_24px, iconRes = R.drawable.ic_outline_timer_24px,
content = { content = {
var now by remember { mutableStateOf(System.currentTimeMillis()) } var now by remember { mutableStateOf(currentTimeMillis()) }
val newElapsed = if (started > 0) (now - started) / 1000L else 0 val newElapsed = if (started > 0) (now - started) / 1000L else 0
val estimatedString = estimated val estimatedString = estimated
@ -79,7 +85,7 @@ fun TimerRow(
} }
IconButton( IconButton(
onClick = { onClick = {
now = System.currentTimeMillis() now = currentTimeMillis()
timerClicked() timerClicked()
}, },
modifier = Modifier.padding(vertical = 8.dp), modifier = Modifier.padding(vertical = 8.dp),
@ -98,7 +104,7 @@ fun TimerRow(
LaunchedEffect(key1 = started) { LaunchedEffect(key1 = started) {
while (started > 0) { while (started > 0) {
delay(1.seconds) delay(1.seconds)
now = System.currentTimeMillis() now = currentTimeMillis()
} }
} }
}, },
@ -120,6 +126,6 @@ fun NoTimer() {
@Composable @Composable
fun RunningTimer() { fun RunningTimer() {
MdcTheme { MdcTheme {
TimerRow(started = System.currentTimeMillis(), estimated = 900, elapsed = 400, timerClicked = {}, onClick = {}) TimerRow(started = currentTimeMillis(), estimated = 900, elapsed = 400, timerClicked = {}, onClick = {})
} }
} }

@ -13,6 +13,8 @@ import kotlinx.coroutines.launch
import org.tasks.LocalBroadcastManager import org.tasks.LocalBroadcastManager
import org.tasks.R import org.tasks.R
import org.tasks.data.TaskDao import org.tasks.data.TaskDao
import org.tasks.data.count
import org.tasks.data.fetchFiltered
import org.tasks.intents.TaskIntents import org.tasks.intents.TaskIntents
import org.tasks.preferences.DefaultFilterProvider import org.tasks.preferences.DefaultFilterProvider
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences

@ -0,0 +1,72 @@
package org.tasks.data
import android.app.Activity
import android.content.Context
import org.tasks.R
import org.tasks.caldav.BaseCaldavAccountSettingsActivity
import org.tasks.caldav.CaldavAccountSettingsActivity
import org.tasks.caldav.CaldavCalendarSettingsActivity
import org.tasks.caldav.LocalListSettingsActivity
import org.tasks.data.OpenTaskDao.Companion.isDavx5
import org.tasks.data.OpenTaskDao.Companion.isDecSync
import org.tasks.data.OpenTaskDao.Companion.isEteSync
import org.tasks.etebase.EtebaseAccountSettingsActivity
import org.tasks.etebase.EtebaseCalendarSettingsActivity
import org.tasks.etesync.EteSyncAccountSettingsActivity
import org.tasks.opentasks.OpenTaskAccountSettingsActivity
import org.tasks.opentasks.OpenTasksListSettingsActivity
import org.tasks.security.KeyStoreEncryption
import org.tasks.sync.microsoft.MicrosoftListSettingsActivity
val CaldavAccount.prefTitle: Int
get() = when {
isTasksOrg -> R.string.tasks_org
isCaldavAccount -> R.string.caldav
isEtebaseAccount || uuid.isEteSync() -> R.string.etesync
isEteSyncAccount -> R.string.etesync_v1
uuid.isDavx5() -> R.string.davx5
uuid.isDecSync() -> R.string.decsync
isMicrosoft -> R.string.microsoft
isGoogleTasks -> R.string.gtasks_GPr_header
else -> 0
}
val CaldavAccount.prefIcon: Int
get() = when {
isTasksOrg -> R.drawable.ic_round_icon
isCaldavAccount -> R.drawable.ic_webdav_logo
isEtebaseAccount || isEteSyncAccount || uuid.isEteSync() -> R.drawable.ic_etesync
uuid.isDavx5() -> R.drawable.ic_davx5_icon_green_bg
uuid.isDecSync() -> R.drawable.ic_decsync
isMicrosoft -> R.drawable.ic_microsoft_tasks
isGoogleTasks -> R.drawable.ic_google
else -> 0
}
fun CaldavAccount.isTasksSubscription(context: Context): Boolean {
val caldavUrl = context.getString(R.string.tasks_caldav_url)
return url?.startsWith("${caldavUrl}/calendars/") == true &&
!isPaymentRequired() &&
!isLoggedOut()
}
fun CaldavAccount.listSettingsClass(): Class<out Activity> = when(accountType) {
CaldavAccount.TYPE_LOCAL -> LocalListSettingsActivity::class.java
CaldavAccount.TYPE_ETESYNC, CaldavAccount.TYPE_OPENTASKS -> OpenTasksListSettingsActivity::class.java
CaldavAccount.TYPE_ETEBASE -> EtebaseCalendarSettingsActivity::class.java
CaldavAccount.TYPE_MICROSOFT -> MicrosoftListSettingsActivity::class.java
else -> CaldavCalendarSettingsActivity::class.java
}
val CaldavAccount.accountSettingsClass: Class<out BaseCaldavAccountSettingsActivity>
get() = when {
isCaldavAccount -> CaldavAccountSettingsActivity::class.java
isEteSyncAccount -> EteSyncAccountSettingsActivity::class.java
isEtebaseAccount -> EtebaseAccountSettingsActivity::class.java
isOpenTasks -> OpenTaskAccountSettingsActivity::class.java
else -> throw IllegalArgumentException("Unexpected account type: $this")
}
fun CaldavAccount.getPassword(encryption: KeyStoreEncryption): String {
return encryption.decrypt(password) ?: ""
}

@ -0,0 +1,35 @@
package org.tasks.data
import android.content.Context
import com.todoroo.astrid.helper.UUIDHelper
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import org.tasks.R
private val mutex = Mutex()
suspend fun CaldavDao.setupLocalAccount(context: Context): CaldavAccount = mutex.withLock {
val account = getLocalAccount()
getLocalList(context, account)
return account
}
suspend fun CaldavDao.getLocalList(context: Context) = mutex.withLock {
getLocalList(context, getLocalAccount())
}
private suspend fun CaldavDao.getLocalAccount() = getAccountByUuid(CaldavDao.LOCAL) ?: CaldavAccount().apply {
accountType = CaldavAccount.TYPE_LOCAL
uuid = CaldavDao.LOCAL
id = insert(this)
}
private suspend fun CaldavDao.getLocalList(context: Context, account: CaldavAccount): CaldavCalendar =
getCalendarsByAccount(account.uuid!!).getOrNull(0)
?: CaldavCalendar(
name = context.getString(R.string.default_list),
uuid = UUIDHelper.newUUID(),
account = account.uuid,
).apply {
insert(this)
}

@ -0,0 +1,8 @@
package org.tasks.data
import com.todoroo.astrid.api.GtasksFilter
fun GoogleTaskFilters.toGtasksFilter(): GtasksFilter = GtasksFilter(
list = googleTaskList,
count = count,
)

@ -0,0 +1,28 @@
package org.tasks.data
import com.todoroo.astrid.data.Task
import org.tasks.R
import org.tasks.preferences.Preferences
suspend fun LocationDao.getLocation(task: Task, preferences: Preferences): Location? {
if (task.isNew) {
if (task.hasTransitory(Place.KEY)) {
getPlace(task.getTransitory<String>(Place.KEY)!!)?.let {
return Location(createGeofence(it.uid, preferences), it)
}
}
} else {
return getGeofences(task.id)
}
return null
}
fun createGeofence(
place: String?,
preferences: Preferences,
defaultReminders: Int = preferences.getIntegerFromString(R.string.p_default_location_reminder_key, 1)
) = Geofence(
place = place,
isArrival = defaultReminders == 1 || defaultReminders == 3,
isDeparture = defaultReminders == 2 || defaultReminders == 3,
)

@ -0,0 +1,7 @@
package org.tasks.data
import android.content.Context
fun Location.open(context: Context?) {
place.open(context)
}

@ -0,0 +1,8 @@
package org.tasks.data
import org.tasks.filters.PlaceFilter
fun LocationFilters.toLocationFilter(): PlaceFilter = PlaceFilter(
place = place,
count = count,
)

@ -3,9 +3,14 @@ package org.tasks.data
import android.content.ContentUris import android.content.ContentUris
import android.database.Cursor import android.database.Cursor
import android.net.Uri import android.net.Uri
import at.bitfire.ical4android.* import at.bitfire.ical4android.AndroidTask
import at.bitfire.ical4android.BatchOperation
import at.bitfire.ical4android.BatchOperation.CpoBuilder.Companion.newInsert import at.bitfire.ical4android.BatchOperation.CpoBuilder.Companion.newInsert
import at.bitfire.ical4android.BatchOperation.CpoBuilder.Companion.newUpdate import at.bitfire.ical4android.BatchOperation.CpoBuilder.Companion.newUpdate
import at.bitfire.ical4android.ICalendar
import at.bitfire.ical4android.Ical4Android
import at.bitfire.ical4android.Task
import at.bitfire.ical4android.UnknownProperty
import at.bitfire.ical4android.util.MiscUtils.CursorHelper.toValues import at.bitfire.ical4android.util.MiscUtils.CursorHelper.toValues
import net.fortuna.ical4j.model.Parameter import net.fortuna.ical4j.model.Parameter
import net.fortuna.ical4j.model.parameter.RelType import net.fortuna.ical4j.model.parameter.RelType
@ -13,7 +18,7 @@ import net.fortuna.ical4j.model.parameter.Related
import net.fortuna.ical4j.model.property.Action import net.fortuna.ical4j.model.property.Action
import org.dmfs.tasks.contract.TaskContract import org.dmfs.tasks.contract.TaskContract
import org.tasks.data.OpenTaskDao.Companion.getLong import org.tasks.data.OpenTaskDao.Companion.getLong
import java.util.* import java.util.Locale
import java.util.logging.Level import java.util.logging.Level
class MyAndroidTask() : AndroidTask(null) { class MyAndroidTask() : AndroidTask(null) {

@ -0,0 +1,12 @@
package org.tasks.data
import android.content.Context
import android.net.Uri
import org.tasks.extensions.Context.openUri
import org.tasks.location.MapPosition
fun Place.open(context: Context?) =
context?.openUri("geo:$latitude,$longitude?q=${Uri.encode(displayName)}")
val Place.mapPosition: MapPosition
get() = MapPosition(latitude, longitude)

@ -0,0 +1,23 @@
package org.tasks.data
import org.tasks.filters.AlphanumComparator
suspend fun TagDataDao.searchTags(query: String): List<TagData> = searchTagsInternal("%$query%").sort()
private val COMPARATOR = Comparator<TagData> { f1, f2 ->
when {
f1.order == NO_ORDER && f2.order == NO_ORDER -> f1.id!!.compareTo(f2.id!!)
f1.order == NO_ORDER -> 1
f2.order == NO_ORDER -> -1
f1.order < f2.order -> -1
f1.order > f2.order -> 1
else -> AlphanumComparator.TAGDATA.compare(f1, f2)
}
}
private fun List<TagData>.sort(): List<TagData> =
if (all { it.order == NO_ORDER }) {
sortedWith(AlphanumComparator.TAGDATA)
} else {
sortedWith(COMPARATOR)
}

@ -0,0 +1,8 @@
package org.tasks.data
import com.todoroo.astrid.api.TagFilter
fun TagFilters.toTagFilter(): TagFilter = TagFilter(
tagData = tagData,
count = count,
)

@ -0,0 +1,49 @@
package org.tasks.data
import androidx.sqlite.db.SimpleSQLiteQuery
import com.todoroo.andlib.sql.Field
import com.todoroo.andlib.sql.Query
import com.todoroo.astrid.api.Filter
import com.todoroo.astrid.api.PermaSql
import com.todoroo.astrid.data.Task
import org.tasks.db.SuspendDbUtils.eachChunk
import org.tasks.preferences.QueryPreferences
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import timber.log.Timber
suspend fun TaskDao.fetchTasks(preferences: QueryPreferences, filter: Filter): List<TaskContainer> =
fetchTasks {
TaskListQuery.getQuery(preferences, filter)
}
internal suspend fun TaskDao.setCollapsed(preferences: QueryPreferences, filter: Filter, collapsed: Boolean) {
fetchTasks(preferences, filter)
.filter(TaskContainer::hasChildren)
.map(TaskContainer::id)
.eachChunk { setCollapsed(it, collapsed) }
}
suspend fun TaskDao.fetchFiltered(filter: Filter): List<Task> = fetchFiltered(filter.sql!!)
suspend fun TaskDao.fetchFiltered(queryTemplate: String): List<Task> {
val query = getQuery(queryTemplate, Task.FIELDS)
val start = if (BuildConfig.DEBUG) currentTimeMillis() else 0
val tasks = fetchTasks(query)
Timber.v("%sms: %s", currentTimeMillis() - start, query.sql)
return tasks.map(TaskContainer::task)
}
suspend fun TaskDao.count(filter: Filter): Int {
val query = getQuery(filter.sql!!, Field.COUNT)
val start = if (BuildConfig.DEBUG) currentTimeMillis() else 0
val count = countRaw(query)
Timber.v("%sms: %s", currentTimeMillis() - start, query.sql)
return count
}
private fun getQuery(queryTemplate: String, vararg fields: Field): SimpleSQLiteQuery =
SimpleSQLiteQuery(
Query.select(*fields)
.withQueryTemplate(PermaSql.replacePlaceholdersForQuery(queryTemplate))
.from(Task.TABLE)
.toString())

@ -0,0 +1,89 @@
package org.tasks.data
import com.todoroo.andlib.utility.DateUtilities
import com.todoroo.astrid.data.Task
import net.fortuna.ical4j.model.Recur
import org.tasks.date.DateTimeUtils
import org.tasks.date.DateTimeUtils.toDateTime
import org.tasks.time.DateTimeUtils.startOfDay
/** Checks whether task is hidden. Requires HIDDEN_UNTIL */
val Task.isHidden
get() = hideUntil > DateUtilities.now()
/**
* Create hide until for this task.
*
* @param setting one of the HIDE_UNTIL_* constants
* @param customDate if specific day is set, this value
*/
fun Task.createHideUntil(setting: Int, customDate: Long): Long {
val date: Long = when (setting) {
Task.HIDE_UNTIL_NONE -> return 0
Task.HIDE_UNTIL_DUE, Task.HIDE_UNTIL_DUE_TIME -> dueDate
Task.HIDE_UNTIL_DAY_BEFORE -> dueDate - DateUtilities.ONE_DAY
Task.HIDE_UNTIL_WEEK_BEFORE -> dueDate - DateUtilities.ONE_WEEK
Task.HIDE_UNTIL_SPECIFIC_DAY, Task.HIDE_UNTIL_SPECIFIC_DAY_TIME -> customDate
else -> throw IllegalArgumentException("Unknown setting $setting")
}
if (date <= 0) {
return date
}
return if (setting == Task.HIDE_UNTIL_SPECIFIC_DAY_TIME ||
setting == Task.HIDE_UNTIL_DUE_TIME && Task.hasDueTime(dueDate)
) {
date.toDateTime().withSecondOfMinute(1).withMillisOfSecond(0).millis
} else {
date.startOfDay()
}
}
val Task.isOverdue: Boolean
get() {
if (isCompleted || !hasDueDate()) {
return false
}
val compareTo = if (hasDueTime()) DateUtilities.now() else DateTimeUtils.newDateTime().startOfDay().millis
return dueDate < compareTo
}
fun Task.setRecurrence(rrule: Recur?) {
recurrence = rrule?.toString()
}
fun Task.hasNotes(): Boolean {
return !notes.isNullOrEmpty()
}
/**
* Creates due date for this task. If this due date has no time associated, we move it to the last
* millisecond of the day.
*
* @param setting one of the URGENCY_* constants
* @param customDate if specific day or day & time is set, this value
*/
fun createDueDate(setting: Int, customDate: Long): Long {
val date: Long = when (setting) {
Task.URGENCY_NONE -> 0
Task.URGENCY_TODAY -> DateUtilities.now()
Task.URGENCY_TOMORROW -> DateUtilities.now() + DateUtilities.ONE_DAY
Task.URGENCY_DAY_AFTER -> DateUtilities.now() + 2 * DateUtilities.ONE_DAY
Task.URGENCY_NEXT_WEEK -> DateUtilities.now() + DateUtilities.ONE_WEEK
Task.URGENCY_IN_TWO_WEEKS -> DateUtilities.now() + 2 * DateUtilities.ONE_WEEK
Task.URGENCY_SPECIFIC_DAY, Task.URGENCY_SPECIFIC_DAY_TIME -> customDate
else -> throw IllegalArgumentException("Unknown setting $setting")
}
if (date <= 0) {
return date
}
var dueDate = DateTimeUtils.newDateTime(date).withMillisOfSecond(0)
dueDate = if (setting != Task.URGENCY_SPECIFIC_DAY_TIME) {
dueDate
.withHourOfDay(12)
.withMinuteOfHour(0)
.withSecondOfMinute(0) // Seconds == 0 means no due time
} else {
dueDate.withSecondOfMinute(1) // Seconds > 0 means due time exists
}
return dueDate.millis
}

@ -2,7 +2,7 @@ package org.tasks.date
import org.tasks.time.DateTime import org.tasks.time.DateTime
import org.tasks.time.DateTime.UTC import org.tasks.time.DateTime.UTC
import java.util.* import java.util.TimeZone
object DateTimeUtils { object DateTimeUtils {
@JvmStatic @JvmStatic
@ -25,8 +25,6 @@ object DateTimeUtils {
@JvmStatic @JvmStatic
fun newDateTime(timestamp: Long, timeZone: TimeZone): DateTime = DateTime(timestamp, timeZone) fun newDateTime(timestamp: Long, timeZone: TimeZone): DateTime = DateTime(timestamp, timeZone)
fun Long.toAppleEpoch(): Long = DateTime(this).toAppleEpoch()
fun Long.toDateTime(): DateTime = DateTime(this) fun Long.toDateTime(): DateTime = DateTime(this)
fun Long.isAfterNow(): Boolean = DateTime(this).isAfterNow fun Long.isAfterNow(): Boolean = DateTime(this).isAfterNow

@ -3,15 +3,8 @@ package org.tasks.db
import android.content.Context import android.content.Context
import android.database.sqlite.SQLiteException import android.database.sqlite.SQLiteException
import androidx.core.database.getStringOrNull import androidx.core.database.getStringOrNull
import androidx.room.DeleteColumn
import androidx.room.migration.AutoMigrationSpec
import androidx.room.migration.Migration import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase import androidx.sqlite.db.SupportSQLiteDatabase
import com.todoroo.astrid.api.Filter.Companion.NO_ORDER
import com.todoroo.astrid.data.Task
import com.todoroo.astrid.data.Task.Companion.NOTIFY_AFTER_DEADLINE
import com.todoroo.astrid.data.Task.Companion.NOTIFY_AT_DEADLINE
import com.todoroo.astrid.data.Task.Companion.NOTIFY_AT_START
import org.tasks.R import org.tasks.R
import org.tasks.caldav.FileStorage import org.tasks.caldav.FileStorage
import org.tasks.data.Alarm.Companion.TYPE_RANDOM import org.tasks.data.Alarm.Companion.TYPE_RANDOM
@ -22,7 +15,12 @@ import org.tasks.data.CaldavAccount.Companion.SERVER_UNKNOWN
import org.tasks.data.CaldavAccount.Companion.TYPE_GOOGLE_TASKS import org.tasks.data.CaldavAccount.Companion.TYPE_GOOGLE_TASKS
import org.tasks.data.CaldavCalendar.Companion.ACCESS_OWNER import org.tasks.data.CaldavCalendar.Companion.ACCESS_OWNER
import org.tasks.data.CaldavCalendar.Companion.ACCESS_READ_ONLY import org.tasks.data.CaldavCalendar.Companion.ACCESS_READ_ONLY
import org.tasks.data.NO_ORDER
import org.tasks.data.OpenTaskDao.Companion.getLong import org.tasks.data.OpenTaskDao.Companion.getLong
import com.todoroo.astrid.data.Task
import com.todoroo.astrid.data.Task.Companion.NOTIFY_AFTER_DEADLINE
import com.todoroo.astrid.data.Task.Companion.NOTIFY_AT_DEADLINE
import com.todoroo.astrid.data.Task.Companion.NOTIFY_AT_START
import org.tasks.extensions.getLongOrNull import org.tasks.extensions.getLongOrNull
import org.tasks.extensions.getString import org.tasks.extensions.getString
import org.tasks.preferences.DefaultFilterProvider import org.tasks.preferences.DefaultFilterProvider
@ -35,12 +33,6 @@ import java.util.concurrent.TimeUnit.HOURS
object Migrations { object Migrations {
@DeleteColumn.Entries(
DeleteColumn(tableName = "caldav_accounts", columnName = "cda_encryption_key"),
DeleteColumn(tableName = "caldav_accounts", columnName = "cda_repeat"),
)
class AutoMigrate83to84: AutoMigrationSpec
private val MIGRATION_35_36: Migration = object : Migration(35, 36) { private val MIGRATION_35_36: Migration = object : Migration(35, 36) {
override fun migrate(database: SupportSQLiteDatabase) { override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE `tagdata` ADD COLUMN `color` INTEGER DEFAULT -1") database.execSQL("ALTER TABLE `tagdata` ADD COLUMN `color` INTEGER DEFAULT -1")

@ -12,11 +12,12 @@ import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.todoroo.andlib.utility.DateUtilities import com.todoroo.andlib.utility.DateUtilities
import com.todoroo.astrid.dao.TaskDao import com.todoroo.astrid.dao.TaskDao
import com.todoroo.astrid.data.Task
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.NonCancellable import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.tasks.R import org.tasks.R
import com.todoroo.astrid.data.Task
import org.tasks.data.createDueDate
import org.tasks.databinding.DialogDateTimePickerBinding import org.tasks.databinding.DialogDateTimePickerBinding
import org.tasks.date.DateTimeUtils.newDateTime import org.tasks.date.DateTimeUtils.newDateTime
import org.tasks.date.DateTimeUtils.toDateTime import org.tasks.date.DateTimeUtils.toDateTime
@ -272,11 +273,11 @@ class DateTimePicker : BaseDateTimePicker() {
} }
it.setDueDateAdjustingHideUntil(when { it.setDueDateAdjustingHideUntil(when {
day == NO_DAY -> 0L day == NO_DAY -> 0L
time == NO_TIME -> Task.createDueDate( time == NO_TIME -> createDueDate(
Task.URGENCY_SPECIFIC_DAY, Task.URGENCY_SPECIFIC_DAY,
day day
) )
else -> Task.createDueDate( else -> createDueDate(
Task.URGENCY_SPECIFIC_DAY_TIME, Task.URGENCY_SPECIFIC_DAY_TIME,
day.toDateTime().withMillisOfDay(time).millis day.toDateTime().withMillisOfDay(time).millis
) )

@ -13,8 +13,8 @@ import dagger.hilt.android.AndroidEntryPoint
import org.tasks.R import org.tasks.R
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import org.tasks.time.DateTime import org.tasks.time.DateTime
import org.tasks.time.DateTimeUtils.currentTimeMillis
import org.tasks.time.DateTimeUtils.startOfDay import org.tasks.time.DateTimeUtils.startOfDay
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint @AndroidEntryPoint

@ -5,13 +5,14 @@ import android.os.Bundle
import android.view.View import android.view.View
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.appcompat.widget.Toolbar import androidx.appcompat.widget.Toolbar
import com.todoroo.astrid.data.Task
import com.todoroo.astrid.helper.UUIDHelper import com.todoroo.astrid.helper.UUIDHelper
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import org.tasks.R import org.tasks.R
import org.tasks.analytics.Constants import org.tasks.analytics.Constants
import org.tasks.caldav.BaseCaldavAccountSettingsActivity import org.tasks.caldav.BaseCaldavAccountSettingsActivity
import org.tasks.data.CaldavAccount import org.tasks.data.CaldavAccount
import com.todoroo.astrid.data.Task
import org.tasks.data.getPassword
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject

@ -1,14 +1,17 @@
package org.tasks.etebase package org.tasks.etebase
import android.content.Context import android.content.Context
import com.etebase.client.* import com.etebase.client.Account
import com.etebase.client.Collection import com.etebase.client.Collection
import com.etebase.client.FetchOptions
import com.etebase.client.Item
import com.etebase.client.ItemMetadata
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.tasks.data.CaldavCalendar import org.tasks.data.CaldavCalendar
import org.tasks.data.CaldavDao import org.tasks.data.CaldavDao
import org.tasks.data.CaldavTask import org.tasks.data.CaldavTask
import org.tasks.time.DateTimeUtils.currentTimeMillis import org.tasks.time.DateTimeUtils2.currentTimeMillis
import timber.log.Timber import timber.log.Timber
class EtebaseClient( class EtebaseClient(

@ -9,6 +9,7 @@ import kotlinx.coroutines.withContext
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import org.tasks.data.CaldavAccount import org.tasks.data.CaldavAccount
import org.tasks.data.CaldavDao import org.tasks.data.CaldavDao
import org.tasks.data.getPassword
import org.tasks.http.HttpClientFactory import org.tasks.http.HttpClientFactory
import org.tasks.security.KeyStoreEncryption import org.tasks.security.KeyStoreEncryption
import java.security.KeyManagementException import java.security.KeyManagementException

@ -25,7 +25,7 @@ import org.tasks.caldav.iCalendar.Companion.fromVtodo
import org.tasks.data.CaldavAccount import org.tasks.data.CaldavAccount
import org.tasks.data.CaldavCalendar import org.tasks.data.CaldavCalendar
import org.tasks.data.CaldavDao import org.tasks.data.CaldavDao
import org.tasks.time.DateTimeUtils.currentTimeMillis import org.tasks.time.DateTimeUtils2.currentTimeMillis
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject

@ -1,17 +0,0 @@
package org.tasks.filters
import androidx.room.Embedded
import com.todoroo.astrid.api.CaldavFilter
import org.tasks.data.CaldavCalendar
data class CaldavFilters(
@JvmField @Embedded val caldavCalendar: CaldavCalendar,
@JvmField val count: Int,
@JvmField val principals: Int,
) {
fun toCaldavFilter(): CaldavFilter = CaldavFilter(
calendar = caldavCalendar,
principals = principals,
count = count,
)
}

@ -3,9 +3,9 @@ package org.tasks.filters
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import com.todoroo.astrid.activity.MainActivity import com.todoroo.astrid.activity.MainActivity
import com.todoroo.astrid.api.CaldavFilter
import com.todoroo.astrid.api.CustomFilter import com.todoroo.astrid.api.CustomFilter
import com.todoroo.astrid.api.Filter import com.todoroo.astrid.api.Filter
import com.todoroo.astrid.api.Filter.Companion.NO_ORDER
import com.todoroo.astrid.api.FilterListItem import com.todoroo.astrid.api.FilterListItem
import com.todoroo.astrid.core.BuiltInFilterExposer import com.todoroo.astrid.core.BuiltInFilterExposer
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
@ -20,9 +20,18 @@ import org.tasks.data.CaldavAccount.Companion.TYPE_LOCAL
import org.tasks.data.CaldavAccount.Companion.TYPE_OPENTASKS import org.tasks.data.CaldavAccount.Companion.TYPE_OPENTASKS
import org.tasks.data.CaldavDao import org.tasks.data.CaldavDao
import org.tasks.data.FilterDao import org.tasks.data.FilterDao
import org.tasks.data.GoogleTaskFilters
import org.tasks.data.GoogleTaskListDao import org.tasks.data.GoogleTaskListDao
import org.tasks.data.LocationDao import org.tasks.data.LocationDao
import org.tasks.data.LocationFilters
import org.tasks.data.NO_ORDER
import org.tasks.data.TagDataDao import org.tasks.data.TagDataDao
import org.tasks.data.TagFilters
import org.tasks.data.listSettingsClass
import org.tasks.data.setupLocalAccount
import org.tasks.data.toGtasksFilter
import org.tasks.data.toLocationFilter
import org.tasks.data.toTagFilter
import org.tasks.filters.NavigationDrawerSubheader.SubheaderType import org.tasks.filters.NavigationDrawerSubheader.SubheaderType
import org.tasks.location.LocationPickerActivity import org.tasks.location.LocationPickerActivity
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
@ -236,7 +245,13 @@ class FilterProvider @Inject constructor(
.apply { if (account.isCollapsed) return this } .apply { if (account.isCollapsed) return this }
.plus(caldavDao .plus(caldavDao
.getCaldavFilters(account.uuid!!) .getCaldavFilters(account.uuid!!)
.map(CaldavFilters::toCaldavFilter) .map {
CaldavFilter(
calendar = it.caldavCalendar,
principals = it.principals,
count = it.count,
)
}
.sort()) .sort())
companion object { companion object {

@ -1,15 +0,0 @@
package org.tasks.filters
import androidx.room.Embedded
import com.todoroo.astrid.api.GtasksFilter
import org.tasks.data.CaldavCalendar
data class GoogleTaskFilters(
@JvmField @Embedded val googleTaskList: CaldavCalendar,
@JvmField val count: Int,
) {
fun toGtasksFilter(): GtasksFilter = GtasksFilter(
list = googleTaskList,
count = count,
)
}

@ -1,14 +0,0 @@
package org.tasks.filters
import androidx.room.Embedded
import org.tasks.data.Place
data class LocationFilters(
@JvmField @Embedded var place: Place,
@JvmField var count: Int
) {
fun toLocationFilter(): PlaceFilter = PlaceFilter(
place = place,
count = count,
)
}

@ -7,7 +7,7 @@ import com.todoroo.astrid.api.FilterListItem
import com.todoroo.astrid.data.Task import com.todoroo.astrid.data.Task
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
import org.tasks.R import org.tasks.R
import org.tasks.notifications.Notification import org.tasks.data.Notification
@Parcelize @Parcelize
data class NotificationsFilter( data class NotificationsFilter(

@ -7,13 +7,14 @@ import com.todoroo.andlib.sql.Join.Companion.inner
import com.todoroo.andlib.sql.QueryTemplate import com.todoroo.andlib.sql.QueryTemplate
import com.todoroo.andlib.utility.AndroidUtilities import com.todoroo.andlib.utility.AndroidUtilities
import com.todoroo.astrid.api.Filter import com.todoroo.astrid.api.Filter
import com.todoroo.astrid.api.Filter.Companion.NO_COUNT
import com.todoroo.astrid.api.FilterListItem import com.todoroo.astrid.api.FilterListItem
import com.todoroo.astrid.data.Task
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
import org.tasks.data.Geofence import org.tasks.data.Geofence
import org.tasks.data.NO_COUNT
import org.tasks.data.Place import org.tasks.data.Place
import com.todoroo.astrid.data.Task
import org.tasks.data.TaskDao.TaskCriteria.activeAndVisible import org.tasks.data.TaskDao.TaskCriteria.activeAndVisible
import org.tasks.data.open
import org.tasks.themes.CustomIcons import org.tasks.themes.CustomIcons
@Parcelize @Parcelize

@ -1,15 +0,0 @@
package org.tasks.filters
import androidx.room.Embedded
import com.todoroo.astrid.api.TagFilter
import org.tasks.data.TagData
data class TagFilters(
@JvmField @Embedded var tagData: TagData,
@JvmField var count: Int,
) {
fun toTagFilter(): TagFilter = TagFilter(
tagData = tagData,
count = count,
)
}

@ -8,7 +8,6 @@ import com.google.api.services.tasks.model.TaskList
import com.google.api.services.tasks.model.Tasks import com.google.api.services.tasks.model.Tasks
import com.todoroo.astrid.api.GtasksFilter import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.dao.TaskDao import com.todoroo.astrid.dao.TaskDao
import com.todoroo.astrid.data.Task.Companion.createDueDate
import com.todoroo.astrid.gtasks.GtasksListService import com.todoroo.astrid.gtasks.GtasksListService
import com.todoroo.astrid.gtasks.api.GtasksApiUtilities import com.todoroo.astrid.gtasks.api.GtasksApiUtilities
import com.todoroo.astrid.gtasks.api.GtasksInvoker import com.todoroo.astrid.gtasks.api.GtasksInvoker

@ -31,7 +31,7 @@ import org.tasks.data.TaskDao
import org.tasks.data.TaskListMetadataDao import org.tasks.data.TaskListMetadataDao
import org.tasks.data.UserActivityDao import org.tasks.data.UserActivityDao
import org.tasks.jobs.WorkManager import org.tasks.jobs.WorkManager
import org.tasks.notifications.NotificationDao import org.tasks.data.NotificationDao
import java.util.Locale import java.util.Locale
import javax.inject.Singleton import javax.inject.Singleton

@ -1,9 +1,9 @@
package org.tasks.jobs; package org.tasks.jobs;
import static org.tasks.time.DateTimeUtils.currentTimeMillis; import static org.tasks.time.DateTimeUtils2.currentTimeMillis;
import static org.tasks.time.DateTimeUtils.printTimestamp; import static org.tasks.time.DateTimeUtilsKt.printTimestamp;
import org.tasks.notifications.Notification; import org.tasks.data.Notification;
import java.util.Objects; import java.util.Objects;

@ -10,6 +10,7 @@ import org.tasks.LocalBroadcastManager
import org.tasks.analytics.Firebase import org.tasks.analytics.Firebase
import org.tasks.data.LocationDao import org.tasks.data.LocationDao
import org.tasks.data.Place import org.tasks.data.Place
import org.tasks.data.mapPosition
import org.tasks.injection.BaseWorker import org.tasks.injection.BaseWorker
import org.tasks.location.Geocoder import org.tasks.location.Geocoder
import timber.log.Timber import timber.log.Timber

@ -34,6 +34,7 @@ import org.tasks.gtasks.GoogleTaskSynchronizer
import org.tasks.injection.BaseWorker import org.tasks.injection.BaseWorker
import org.tasks.opentasks.OpenTasksSynchronizer import org.tasks.opentasks.OpenTasksSynchronizer
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import org.tasks.time.DateTimeUtils2.currentTimeMillis
@HiltWorker @HiltWorker
class SyncWork @AssistedInject constructor( class SyncWork @AssistedInject constructor(
@ -70,7 +71,7 @@ class SyncWork @AssistedInject constructor(
localBroadcastManager.broadcastRefresh() localBroadcastManager.broadcastRefresh()
try { try {
doSync() doSync()
preferences.lastSync = System.currentTimeMillis() preferences.lastSync = currentTimeMillis()
} catch (e: Exception) { } catch (e: Exception) {
firebase.reportException(e) firebase.reportException(e)
} finally { } finally {

@ -54,6 +54,8 @@ import org.tasks.jobs.WorkManager.Companion.TAG_UPDATE_PURCHASES
import org.tasks.notifications.Throttle import org.tasks.notifications.Throttle
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import org.tasks.time.DateTimeUtils import org.tasks.time.DateTimeUtils
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import org.tasks.time.printTimestamp
import timber.log.Timber import timber.log.Timber
import java.util.Random import java.util.Random
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
@ -153,7 +155,7 @@ class WorkManagerImpl(
override fun scheduleNotification(scheduledTime: Long) { override fun scheduleNotification(scheduledTime: Long) {
val time = max(now(), scheduledTime) val time = max(now(), scheduledTime)
if (time < DateTimeUtils.currentTimeMillis()) { if (time < currentTimeMillis()) {
val intent = notificationIntent val intent = notificationIntent
if (AndroidUtilities.atLeastOreo()) { if (AndroidUtilities.atLeastOreo()) {
@ -227,7 +229,7 @@ class WorkManagerImpl(
if (expedited) { if (expedited) {
builder.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST) builder.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
} }
Timber.d("$key: expedited=$expedited ${DateTimeUtils.printTimestamp(delay)} (${DateTimeUtils.printDuration(delay)})") Timber.d("$key: expedited=$expedited ${printTimestamp(delay)} (${DateTimeUtils.printDuration(delay)})")
enqueue(workManager.beginUniqueWork(key, REPLACE, builder.build())) enqueue(workManager.beginUniqueWork(key, REPLACE, builder.build()))
} }

@ -2,15 +2,15 @@ package org.tasks.locale.receiver
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.createDueDate
import com.todoroo.astrid.service.TaskCreator import com.todoroo.astrid.service.TaskCreator
import com.todoroo.astrid.service.TaskCreator.Companion.getDefaultAlarms import com.todoroo.astrid.service.TaskCreator.Companion.getDefaultAlarms
import org.tasks.Strings.isNullOrEmpty import org.tasks.Strings.isNullOrEmpty
import org.tasks.analytics.Firebase import org.tasks.analytics.Firebase
import org.tasks.data.AlarmDao import org.tasks.data.AlarmDao
import org.tasks.data.createDueDate
import org.tasks.locale.bundle.TaskCreationBundle import org.tasks.locale.bundle.TaskCreationBundle
import org.tasks.time.DateTime import org.tasks.time.DateTime
import org.tasks.time.DateTimeUtils import org.tasks.time.DateTimeUtils2.currentTimeMillis
import timber.log.Timber import timber.log.Timber
import java.time.LocalDate import java.time.LocalDate
import java.time.LocalTime import java.time.LocalTime
@ -43,7 +43,7 @@ class TaskerTaskCreator @Inject internal constructor(
val dueTime = LocalTime.parse(dueTimeString, timeFormatter) val dueTime = LocalTime.parse(dueTimeString, timeFormatter)
task.dueDate = createDueDate( task.dueDate = createDueDate(
Task.URGENCY_SPECIFIC_DAY_TIME, Task.URGENCY_SPECIFIC_DAY_TIME,
DateTime(if (task.hasDueDate()) task.dueDate else DateTimeUtils.currentTimeMillis()) DateTime(if (task.hasDueDate()) task.dueDate else currentTimeMillis())
.withHourOfDay(dueTime.hour) .withHourOfDay(dueTime.hour)
.withMinuteOfHour(dueTime.minute) .withMinuteOfHour(dueTime.minute)
.millis) .millis)

@ -35,6 +35,7 @@ import org.tasks.caldav.GeoUtils.toLikeString
import org.tasks.data.LocationDao import org.tasks.data.LocationDao
import org.tasks.data.Place import org.tasks.data.Place
import org.tasks.data.PlaceUsage import org.tasks.data.PlaceUsage
import org.tasks.data.mapPosition
import org.tasks.databinding.ActivityLocationPickerBinding import org.tasks.databinding.ActivityLocationPickerBinding
import org.tasks.dialogs.DialogBuilder import org.tasks.dialogs.DialogBuilder
import org.tasks.extensions.Context.toast import org.tasks.extensions.Context.toast

@ -14,6 +14,8 @@ import org.tasks.LocalBroadcastManager
import org.tasks.R import org.tasks.R
import org.tasks.data.Alarm import org.tasks.data.Alarm
import org.tasks.data.LocationDao import org.tasks.data.LocationDao
import org.tasks.data.Notification
import org.tasks.data.NotificationDao
import org.tasks.data.TaskDao import org.tasks.data.TaskDao
import org.tasks.intents.TaskIntents import org.tasks.intents.TaskIntents
import org.tasks.markdown.MarkdownProvider import org.tasks.markdown.MarkdownProvider
@ -25,7 +27,7 @@ import org.tasks.reminders.SnoozeActivity
import org.tasks.reminders.SnoozeDialog import org.tasks.reminders.SnoozeDialog
import org.tasks.themes.ColorProvider import org.tasks.themes.ColorProvider
import org.tasks.time.DateTime import org.tasks.time.DateTime
import org.tasks.time.DateTimeUtils import org.tasks.time.DateTimeUtils2.currentTimeMillis
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
@ -407,7 +409,7 @@ class NotificationManager @Inject constructor(
.setContentIntent(pendingIntent) .setContentIntent(pendingIntent)
.setContentTitle(appName) .setContentTitle(appName)
.setContentText(text) .setContentText(text)
.setWhen(DateTimeUtils.currentTimeMillis()) .setWhen(currentTimeMillis())
.setSmallIcon(R.drawable.ic_timer_white_24dp) .setSmallIcon(R.drawable.ic_timer_white_24dp)
.setAutoCancel(false) .setAutoCancel(false)
.setOngoing(true) .setOngoing(true)

@ -1,7 +1,7 @@
package org.tasks.notifications package org.tasks.notifications
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import org.tasks.time.DateTimeUtils.currentTimeMillis import org.tasks.time.DateTimeUtils2.currentTimeMillis
import timber.log.Timber import timber.log.Timber
import java.util.concurrent.Executor import java.util.concurrent.Executor
import java.util.concurrent.Executors.newSingleThreadExecutor import java.util.concurrent.Executors.newSingleThreadExecutor

@ -8,7 +8,6 @@ import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.api.TagFilter import com.todoroo.astrid.api.TagFilter
import com.todoroo.astrid.core.BuiltInFilterExposer import com.todoroo.astrid.core.BuiltInFilterExposer
import com.todoroo.astrid.core.BuiltInFilterExposer.Companion.getMyTasksFilter import com.todoroo.astrid.core.BuiltInFilterExposer.Companion.getMyTasksFilter
import com.todoroo.astrid.data.Task
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import org.tasks.R import org.tasks.R
@ -22,6 +21,8 @@ import org.tasks.data.GoogleTaskDao
import org.tasks.data.GoogleTaskListDao import org.tasks.data.GoogleTaskListDao
import org.tasks.data.LocationDao import org.tasks.data.LocationDao
import org.tasks.data.TagDataDao import org.tasks.data.TagDataDao
import com.todoroo.astrid.data.Task
import org.tasks.data.getLocalList
import org.tasks.filters.PlaceFilter import org.tasks.filters.PlaceFilter
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject

@ -22,6 +22,9 @@ import org.tasks.billing.PurchaseActivity
import org.tasks.caldav.BaseCaldavAccountSettingsActivity import org.tasks.caldav.BaseCaldavAccountSettingsActivity
import org.tasks.caldav.CaldavAccountSettingsActivity import org.tasks.caldav.CaldavAccountSettingsActivity
import org.tasks.data.CaldavAccount import org.tasks.data.CaldavAccount
import org.tasks.data.accountSettingsClass
import org.tasks.data.prefIcon
import org.tasks.data.prefTitle
import org.tasks.etebase.EtebaseAccountSettingsActivity import org.tasks.etebase.EtebaseAccountSettingsActivity
import org.tasks.extensions.Context.openUri import org.tasks.extensions.Context.openUri
import org.tasks.extensions.Context.toast import org.tasks.extensions.Context.toast

@ -7,6 +7,7 @@ import dagger.hilt.android.AndroidEntryPoint
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import org.tasks.R import org.tasks.R
import org.tasks.data.TaskDao import org.tasks.data.TaskDao
import org.tasks.data.count
import org.tasks.injection.InjectingJobIntentService import org.tasks.injection.InjectingJobIntentService
import org.tasks.preferences.DefaultFilterProvider import org.tasks.preferences.DefaultFilterProvider
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences

@ -24,6 +24,7 @@ import org.tasks.repeats.CustomRecurrenceActivity.Companion.EXTRA_DATE
import org.tasks.repeats.CustomRecurrenceActivity.Companion.EXTRA_RRULE import org.tasks.repeats.CustomRecurrenceActivity.Companion.EXTRA_RRULE
import org.tasks.time.DateTime import org.tasks.time.DateTime
import org.tasks.time.DateTimeUtils.startOfDay import org.tasks.time.DateTimeUtils.startOfDay
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import java.time.DayOfWeek import java.time.DayOfWeek
import java.time.Instant import java.time.Instant
import java.time.ZoneId import java.time.ZoneId
@ -83,7 +84,7 @@ class CustomRecurrenceViewModel @Inject constructor(
val dueDate = savedStateHandle val dueDate = savedStateHandle
.get<Long>(EXTRA_DATE) .get<Long>(EXTRA_DATE)
?.takeIf { it > 0 } ?.takeIf { it > 0 }
?: System.currentTimeMillis().startOfDay() ?: currentTimeMillis().startOfDay()
val isMicrosoftTask = savedStateHandle.get<Int>(EXTRA_ACCOUNT_TYPE) == TYPE_MICROSOFT val isMicrosoftTask = savedStateHandle.get<Int>(EXTRA_ACCOUNT_TYPE) == TYPE_MICROSOFT
val frequencies = if (isMicrosoftTask) FREQ_MICROSOFT else FREQ_ALL val frequencies = if (isMicrosoftTask) FREQ_MICROSOFT else FREQ_ALL
_state.update { state -> _state.update { state ->

@ -1,8 +1,5 @@
package org.tasks.sync package org.tasks.sync
import com.todoroo.astrid.data.SyncFlags
import com.todoroo.astrid.data.SyncFlags.FORCE_CALDAV_SYNC
import com.todoroo.astrid.data.Task
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.asCoroutineDispatcher
@ -16,8 +13,11 @@ import org.tasks.data.CaldavAccount.Companion.TYPE_GOOGLE_TASKS
import org.tasks.data.CaldavAccount.Companion.TYPE_OPENTASKS import org.tasks.data.CaldavAccount.Companion.TYPE_OPENTASKS
import org.tasks.data.CaldavAccount.Companion.TYPE_TASKS import org.tasks.data.CaldavAccount.Companion.TYPE_TASKS
import org.tasks.data.CaldavDao import org.tasks.data.CaldavDao
import com.todoroo.astrid.data.FORCE_CALDAV_SYNC
import org.tasks.data.GoogleTaskDao import org.tasks.data.GoogleTaskDao
import org.tasks.data.OpenTaskDao import org.tasks.data.OpenTaskDao
import com.todoroo.astrid.data.SUPPRESS_SYNC
import com.todoroo.astrid.data.Task
import org.tasks.jobs.WorkManager import org.tasks.jobs.WorkManager
import org.tasks.jobs.WorkManager.Companion.TAG_SYNC import org.tasks.jobs.WorkManager.Companion.TAG_SYNC
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
@ -45,7 +45,7 @@ class SyncAdapters @Inject constructor(
} }
fun sync(task: Task, original: Task?) = scope.launch { fun sync(task: Task, original: Task?) = scope.launch {
if (task.checkTransitory(SyncFlags.SUPPRESS_SYNC)) { if (task.checkTransitory(SUPPRESS_SYNC)) {
return@launch return@launch
} }
val needsGoogleTaskSync = !task.googleTaskUpToDate(original) val needsGoogleTaskSync = !task.googleTaskUpToDate(original)

@ -9,6 +9,7 @@ import org.tasks.data.TagData
import org.tasks.sync.microsoft.Tasks.Task.RecurrenceDayOfWeek import org.tasks.sync.microsoft.Tasks.Task.RecurrenceDayOfWeek
import org.tasks.sync.microsoft.Tasks.Task.RecurrenceType import org.tasks.sync.microsoft.Tasks.Task.RecurrenceType
import org.tasks.time.DateTime import org.tasks.time.DateTime
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.time.ZonedDateTime import java.time.ZonedDateTime
import java.util.Locale import java.util.Locale
@ -32,7 +33,7 @@ object MicrosoftConverter {
defaultPriority != Task.Priority.HIGH -> defaultPriority defaultPriority != Task.Priority.HIGH -> defaultPriority
else -> Task.Priority.NONE else -> Task.Priority.NONE
} }
completionDate = remote.completedDateTime.toLong(System.currentTimeMillis()) completionDate = remote.completedDateTime.toLong(currentTimeMillis())
dueDate = remote.dueDateTime.toLong(0L) dueDate = remote.dueDateTime.toLong(0L)
creationDate = remote.createdDateTime.parseDateTime() creationDate = remote.createdDateTime.parseDateTime()
modificationDate = remote.lastModifiedDateTime.parseDateTime() modificationDate = remote.lastModifiedDateTime.parseDateTime()
@ -163,7 +164,7 @@ object MicrosoftConverter {
private fun String?.parseDateTime(): Long = private fun String?.parseDateTime(): Long =
this this
?.let { ZonedDateTime.parse(this).toInstant().toEpochMilli() } ?.let { ZonedDateTime.parse(this).toInstant().toEpochMilli() }
?: System.currentTimeMillis() ?: currentTimeMillis()
private fun Tasks.Task.DateTime?.toLong(default: Long): Long = private fun Tasks.Task.DateTime?.toLong(default: Long): Long =
this this

@ -11,6 +11,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.tasks.data.TagData import org.tasks.data.TagData
import org.tasks.data.TagDataDao import org.tasks.data.TagDataDao
import org.tasks.data.searchTags
import javax.inject.Inject import javax.inject.Inject
@HiltViewModel @HiltViewModel

@ -30,6 +30,9 @@ import org.tasks.compose.FilterChip
import org.tasks.compose.StartDateChip import org.tasks.compose.StartDateChip
import org.tasks.compose.SubtaskChip import org.tasks.compose.SubtaskChip
import org.tasks.data.TaskContainer import org.tasks.data.TaskContainer
import org.tasks.data.hasNotes
import org.tasks.data.isHidden
import org.tasks.data.isOverdue
import org.tasks.databinding.TaskAdapterRowBinding import org.tasks.databinding.TaskAdapterRowBinding
import org.tasks.date.DateTimeUtils.newDateTime import org.tasks.date.DateTimeUtils.newDateTime
import org.tasks.dialogs.Linkify import org.tasks.dialogs.Linkify
@ -157,7 +160,7 @@ class TaskViewHolder internal constructor(
) )
if (preferences.getBoolean(R.string.p_show_description, true)) { if (preferences.getBoolean(R.string.p_show_description, true)) {
markdown.setMarkdown(description, task.notes) markdown.setMarkdown(description, task.notes)
description.visibility = if (task.hasNotes()) View.VISIBLE else View.GONE description.visibility = if (task.task.hasNotes()) View.VISIBLE else View.GONE
} }
if (markdown.enabled || preferences.getBoolean(R.string.p_linkify_task_list, false)) { if (markdown.enabled || preferences.getBoolean(R.string.p_linkify_task_list, false)) {
linkify.setMovementMethod( linkify.setMovementMethod(
@ -197,7 +200,7 @@ class TaskViewHolder internal constructor(
nameView.paintFlags = nameView.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG nameView.paintFlags = nameView.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
} else { } else {
nameView.setTextColor( nameView.setTextColor(
context.getColor(if (task.isHidden) R.color.text_tertiary else R.color.text_primary)) context.getColor(if (task.task.isHidden) R.color.text_tertiary else R.color.text_primary))
nameView.paintFlags = nameView.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv() nameView.paintFlags = nameView.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
} }
completeBox.isChecked = task.isCompleted completeBox.isChecked = task.isCompleted
@ -207,7 +210,7 @@ class TaskViewHolder internal constructor(
private fun setupDueDate(sortByDueDate: Boolean) { private fun setupDueDate(sortByDueDate: Boolean) {
if (task.hasDueDate()) { if (task.hasDueDate()) {
if (task.isOverdue) { if (task.task.isOverdue) {
dueDate.setTextColor(textColorOverdue) dueDate.setTextColor(textColorOverdue)
} else { } else {
dueDate.setTextColor(textColorSecondary) dueDate.setTextColor(textColorSecondary)
@ -232,7 +235,7 @@ class TaskViewHolder internal constructor(
val id = task.id val id = task.id
val children = task.children val children = task.children
val collapsed = task.isCollapsed val collapsed = task.isCollapsed
val isHidden = task.isHidden val isHidden = task.task.isHidden
val sortGroup = task.sortGroup val sortGroup = task.sortGroup
val startDate = task.task.hideUntil val startDate = task.task.hideUntil
val place = task.location?.place val place = task.location?.place

@ -1,7 +1,6 @@
package org.tasks.time; package org.tasks.time;
import static com.todoroo.astrid.core.SortHelper.APPLE_EPOCH; import static org.tasks.time.DateTimeUtils2.currentTimeMillis;
import static org.tasks.time.DateTimeUtils.currentTimeMillis;
import static java.util.Calendar.FRIDAY; import static java.util.Calendar.FRIDAY;
import static java.util.Calendar.MONDAY; import static java.util.Calendar.MONDAY;
import static java.util.Calendar.SATURDAY; import static java.util.Calendar.SATURDAY;
@ -12,6 +11,8 @@ import static java.util.Calendar.WEDNESDAY;
import net.fortuna.ical4j.model.WeekDay; import net.fortuna.ical4j.model.WeekDay;
import org.tasks.data.CaldavDao;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -304,7 +305,7 @@ public class DateTime {
} }
public boolean isBeforeNow() { public boolean isBeforeNow() {
return timestamp < DateTimeUtils.currentTimeMillis(); return timestamp < currentTimeMillis();
} }
public boolean isBefore(DateTime dateTime) { public boolean isBefore(DateTime dateTime) {
@ -376,7 +377,7 @@ public class DateTime {
} }
public long toAppleEpoch() { public long toAppleEpoch() {
return (timestamp - APPLE_EPOCH) / 1000; return CaldavDao.toAppleEpoch(timestamp);
} }
public int getDayOfWeekInMonth() { public int getDayOfWeekInMonth() {

@ -3,31 +3,8 @@ package org.tasks.time
import android.annotation.SuppressLint import android.annotation.SuppressLint
import org.tasks.BuildConfig import org.tasks.BuildConfig
import org.tasks.date.DateTimeUtils.toDateTime import org.tasks.date.DateTimeUtils.toDateTime
import java.util.*
object DateTimeUtils { object DateTimeUtils {
private val SYSTEM_MILLIS_PROVIDER = SystemMillisProvider()
@Volatile
private var MILLIS_PROVIDER: MillisProvider = SYSTEM_MILLIS_PROVIDER
@JvmStatic
fun currentTimeMillis(): Long {
return MILLIS_PROVIDER.millis
}
fun setCurrentMillisFixed(millis: Long) {
MILLIS_PROVIDER = FixedMillisProvider(millis)
}
fun setCurrentMillisSystem() {
MILLIS_PROVIDER = SYSTEM_MILLIS_PROVIDER
}
@JvmStatic
fun printTimestamp(timestamp: Long): String =
if (BuildConfig.DEBUG) Date(timestamp).toString() else timestamp.toString()
@SuppressLint("DefaultLocale") @SuppressLint("DefaultLocale")
fun printDuration(millis: Long): String = if (BuildConfig.DEBUG) { fun printDuration(millis: Long): String = if (BuildConfig.DEBUG) {
val seconds = millis / 1000 val seconds = millis / 1000

@ -1,15 +0,0 @@
package org.tasks.time;
public class FixedMillisProvider implements MillisProvider {
private final long millis;
public FixedMillisProvider(long millis) {
this.millis = millis;
}
@Override
public long getMillis() {
return millis;
}
}

@ -1,6 +0,0 @@
package org.tasks.time;
interface MillisProvider {
long getMillis();
}

@ -1,9 +0,0 @@
package org.tasks.time;
public class SystemMillisProvider implements MillisProvider {
@Override
public long getMillis() {
return System.currentTimeMillis();
}
}

@ -19,6 +19,8 @@ import org.tasks.compose.edit.LocationRow
import org.tasks.data.Geofence import org.tasks.data.Geofence
import org.tasks.data.Location import org.tasks.data.Location
import org.tasks.data.Place import org.tasks.data.Place
import org.tasks.data.createGeofence
import org.tasks.data.open
import org.tasks.dialogs.DialogBuilder import org.tasks.dialogs.DialogBuilder
import org.tasks.dialogs.GeofenceDialog import org.tasks.dialogs.GeofenceDialog
import org.tasks.extensions.Context.openUri import org.tasks.extensions.Context.openUri
@ -128,7 +130,7 @@ class LocationControlSet : TaskEditControlFragment() {
val place: Place = data!!.getParcelableExtra(LocationPickerActivity.EXTRA_PLACE)!! val place: Place = data!!.getParcelableExtra(LocationPickerActivity.EXTRA_PLACE)!!
val location = viewModel.selectedLocation.value val location = viewModel.selectedLocation.value
val geofence = if (location == null) { val geofence = if (location == null) {
Geofence(place.uid, preferences) createGeofence(place.uid, preferences)
} else { } else {
val existing = location.geofence val existing = location.geofence
Geofence( Geofence(

@ -14,11 +14,10 @@ import com.todoroo.astrid.api.CaldavFilter
import com.todoroo.astrid.api.Filter import com.todoroo.astrid.api.Filter
import com.todoroo.astrid.api.GtasksFilter import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.dao.TaskDao import com.todoroo.astrid.dao.TaskDao
import com.todoroo.astrid.data.SyncFlags import com.todoroo.astrid.data.FORCE_CALDAV_SYNC
import com.todoroo.astrid.data.Task import com.todoroo.astrid.data.Task
import com.todoroo.astrid.data.Task.Companion.NOTIFY_MODE_FIVE import com.todoroo.astrid.data.Task.Companion.NOTIFY_MODE_FIVE
import com.todoroo.astrid.data.Task.Companion.NOTIFY_MODE_NONSTOP import com.todoroo.astrid.data.Task.Companion.NOTIFY_MODE_NONSTOP
import com.todoroo.astrid.data.Task.Companion.createDueDate
import com.todoroo.astrid.data.Task.Companion.hasDueTime import com.todoroo.astrid.data.Task.Companion.hasDueTime
import com.todoroo.astrid.gcal.GCalHelper import com.todoroo.astrid.gcal.GCalHelper
import com.todoroo.astrid.service.TaskCompleter import com.todoroo.astrid.service.TaskCompleter
@ -55,13 +54,14 @@ import org.tasks.data.TaskAttachment
import org.tasks.data.TaskAttachmentDao import org.tasks.data.TaskAttachmentDao
import org.tasks.data.UserActivity import org.tasks.data.UserActivity
import org.tasks.data.UserActivityDao import org.tasks.data.UserActivityDao
import org.tasks.data.createDueDate
import org.tasks.date.DateTimeUtils.toDateTime import org.tasks.date.DateTimeUtils.toDateTime
import org.tasks.files.FileHelper import org.tasks.files.FileHelper
import org.tasks.location.GeofenceApi import org.tasks.location.GeofenceApi
import org.tasks.preferences.PermissionChecker import org.tasks.preferences.PermissionChecker
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import org.tasks.time.DateTimeUtils.currentTimeMillis
import org.tasks.time.DateTimeUtils.startOfDay import org.tasks.time.DateTimeUtils.startOfDay
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
@ -284,7 +284,7 @@ class TaskEditViewModel @Inject constructor(
) )
geofenceApi.update(place) geofenceApi.update(place)
} }
task.putTransitory(SyncFlags.FORCE_CALDAV_SYNC, true) task.putTransitory(FORCE_CALDAV_SYNC, true)
task.modificationDate = currentTimeMillis() task.modificationDate = currentTimeMillis()
} }
@ -358,7 +358,7 @@ class TaskEditViewModel @Inject constructor(
(isNew && selectedAlarms.value.isNotEmpty()) (isNew && selectedAlarms.value.isNotEmpty())
) { ) {
alarmService.synchronizeAlarms(task.id, selectedAlarms.value.toMutableSet()) alarmService.synchronizeAlarms(task.id, selectedAlarms.value.toMutableSet())
task.putTransitory(SyncFlags.FORCE_CALDAV_SYNC, true) task.putTransitory(FORCE_CALDAV_SYNC, true)
task.modificationDate = now() task.modificationDate = now()
} }

@ -13,7 +13,6 @@ import com.todoroo.astrid.api.Filter
import com.todoroo.astrid.api.FilterImpl import com.todoroo.astrid.api.FilterImpl
import com.todoroo.astrid.api.SearchFilter import com.todoroo.astrid.api.SearchFilter
import com.todoroo.astrid.core.BuiltInFilterExposer import com.todoroo.astrid.core.BuiltInFilterExposer
import com.todoroo.astrid.data.Task
import com.todoroo.astrid.service.TaskDeleter import com.todoroo.astrid.service.TaskDeleter
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
@ -33,9 +32,11 @@ import org.tasks.analytics.Firebase
import org.tasks.billing.Inventory import org.tasks.billing.Inventory
import org.tasks.compose.throttleLatest import org.tasks.compose.throttleLatest
import org.tasks.data.DeletionDao import org.tasks.data.DeletionDao
import com.todoroo.astrid.data.Task
import org.tasks.data.TaskContainer import org.tasks.data.TaskContainer
import org.tasks.data.TaskDao import org.tasks.data.TaskDao
import org.tasks.data.TaskListQuery.getQuery import org.tasks.data.TaskListQuery.getQuery
import org.tasks.data.fetchTasks
import org.tasks.db.QueryUtils import org.tasks.db.QueryUtils
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import org.tasks.preferences.QueryPreferences import org.tasks.preferences.QueryPreferences

@ -23,6 +23,7 @@ import org.tasks.intents.TaskIntents
import org.tasks.preferences.DefaultFilterProvider import org.tasks.preferences.DefaultFilterProvider
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import org.tasks.themes.ThemeColor import org.tasks.themes.ThemeColor
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
@ -85,7 +86,7 @@ class TasksWidget : AppWidgetProvider() {
opacity = widgetPreferences.footerOpacity, opacity = widgetPreferences.footerOpacity,
) )
setOnClickPendingIntent(R.id.empty_view, getOpenListIntent(context, filter, id)) setOnClickPendingIntent(R.id.empty_view, getOpenListIntent(context, filter, id))
val cacheBuster = Uri.parse("tasks://widget/" + System.currentTimeMillis()) val cacheBuster = Uri.parse("tasks://widget/" + currentTimeMillis())
setRemoteAdapter( setRemoteAdapter(
R.id.list_view, R.id.list_view,
Intent(context, TasksWidgetAdapter::class.java) Intent(context, TasksWidgetAdapter::class.java)

@ -17,6 +17,9 @@ import org.tasks.R
import org.tasks.data.TaskContainer import org.tasks.data.TaskContainer
import org.tasks.data.TaskDao import org.tasks.data.TaskDao
import org.tasks.data.TaskListQuery.getQuery import org.tasks.data.TaskListQuery.getQuery
import org.tasks.data.hasNotes
import org.tasks.data.isHidden
import org.tasks.data.isOverdue
import org.tasks.date.DateTimeUtils import org.tasks.date.DateTimeUtils
import org.tasks.extensions.setBackgroundResource import org.tasks.extensions.setBackgroundResource
import org.tasks.extensions.setColorFilter import org.tasks.extensions.setColorFilter
@ -229,7 +232,7 @@ internal class TasksWidgetViewFactory(
) )
) )
} }
if (taskContainer.isHidden && settings.showStartChips) { if (taskContainer.task.isHidden && settings.showStartChips) {
val sortByDate = settings.groupMode == SortHelper.SORT_START && !disableGroups val sortByDate = settings.groupMode == SortHelper.SORT_START && !disableGroups
chipProvider chipProvider
.getStartDateChip(taskContainer, settings.showFullDate, sortByDate) .getStartDateChip(taskContainer, settings.showFullDate, sortByDate)
@ -296,7 +299,7 @@ internal class TasksWidgetViewFactory(
setTextViewText(dueDateRes, text) setTextViewText(dueDateRes, text)
setTextColor( setTextColor(
dueDateRes, dueDateRes,
if (task.isOverdue) context.getColor(R.color.overdue) else onSurfaceVariant if (task.task.isOverdue) context.getColor(R.color.overdue) else onSurfaceVariant
) )
setTextSize(dueDateRes, max(10f, settings.textSize - 2)) setTextSize(dueDateRes, max(10f, settings.textSize - 2))
setOnClickFillInIntent( setOnClickFillInIntent(

@ -8,11 +8,12 @@ import com.todoroo.astrid.api.CaldavFilter
import com.todoroo.astrid.api.Filter import com.todoroo.astrid.api.Filter
import com.todoroo.astrid.api.GtasksFilter import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.api.TagFilter import com.todoroo.astrid.api.TagFilter
import com.todoroo.astrid.data.Task
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import org.tasks.BuildConfig import org.tasks.BuildConfig
import org.tasks.R import org.tasks.R
import com.todoroo.astrid.data.Task
import org.tasks.data.TaskContainer import org.tasks.data.TaskContainer
import org.tasks.data.isHidden
import org.tasks.date.DateTimeUtils.toDateTime import org.tasks.date.DateTimeUtils.toDateTime
import org.tasks.extensions.setColorFilter import org.tasks.extensions.setColorFilter
import org.tasks.filters.PlaceFilter import org.tasks.filters.PlaceFilter
@ -50,7 +51,7 @@ class WidgetChipProvider @Inject constructor(
} }
fun getStartDateChip(task: TaskContainer, showFullDate: Boolean, sortByStartDate: Boolean): RemoteViews? { fun getStartDateChip(task: TaskContainer, showFullDate: Boolean, sortByStartDate: Boolean): RemoteViews? {
return if (task.isHidden) { return if (task.task.isHidden) {
val time = if (sortByStartDate && task.sortGroup?.startOfDay() == task.task.hideUntil.startOfDay()) { val time = if (sortByStartDate && task.sortGroup?.startOfDay() == task.task.hideUntil.startOfDay()) {
task.task.hideUntil task.task.hideUntil
.takeIf { Task.hasDueTime(it) } .takeIf { Task.hasDueTime(it) }

@ -2,7 +2,6 @@ package com.todoroo.astrid.alarms
import com.natpryce.makeiteasy.MakeItEasy.with import com.natpryce.makeiteasy.MakeItEasy.with
import com.todoroo.andlib.utility.DateUtilities.ONE_WEEK import com.todoroo.andlib.utility.DateUtilities.ONE_WEEK
import com.todoroo.astrid.data.Task
import com.todoroo.astrid.data.Task.Companion.HIDE_UNTIL_DUE import com.todoroo.astrid.data.Task.Companion.HIDE_UNTIL_DUE
import com.todoroo.astrid.data.Task.Companion.HIDE_UNTIL_DUE_TIME import com.todoroo.astrid.data.Task.Companion.HIDE_UNTIL_DUE_TIME
import com.todoroo.astrid.data.Task.Companion.URGENCY_SPECIFIC_DAY_TIME import com.todoroo.astrid.data.Task.Companion.URGENCY_SPECIFIC_DAY_TIME
@ -21,6 +20,7 @@ import org.tasks.data.Alarm.Companion.TYPE_SNOOZE
import org.tasks.data.Alarm.Companion.whenDue import org.tasks.data.Alarm.Companion.whenDue
import org.tasks.data.Alarm.Companion.whenOverdue import org.tasks.data.Alarm.Companion.whenOverdue
import org.tasks.data.Alarm.Companion.whenStarted import org.tasks.data.Alarm.Companion.whenStarted
import org.tasks.data.createDueDate
import org.tasks.date.DateTimeUtils.newDateTime import org.tasks.date.DateTimeUtils.newDateTime
import org.tasks.date.DateTimeUtils.toDateTime import org.tasks.date.DateTimeUtils.toDateTime
import org.tasks.makers.AlarmEntryMaker.TIME import org.tasks.makers.AlarmEntryMaker.TIME
@ -271,7 +271,7 @@ class AlarmCalculatorTest {
@Test @Test
fun reminderOverdueEveryDay() = runBlocking { fun reminderOverdueEveryDay() = runBlocking {
val dueDate = val dueDate =
Task.createDueDate(URGENCY_SPECIFIC_DAY_TIME, DateTime(2022, 1, 30, 13, 30).millis) createDueDate(URGENCY_SPECIFIC_DAY_TIME, DateTime(2022, 1, 30, 13, 30).millis)
.toDateTime() .toDateTime()
val alarm = alarmCalculator.toAlarmEntry( val alarm = alarmCalculator.toAlarmEntry(
newTask(with(DUE_TIME, dueDate), with(REMINDER_LAST, dueDate.plusDays(6))), newTask(with(DUE_TIME, dueDate), with(REMINDER_LAST, dueDate.plusDays(6))),
@ -287,7 +287,7 @@ class AlarmCalculatorTest {
@Test @Test
fun endDailyOverdueReminder() = runBlocking { fun endDailyOverdueReminder() = runBlocking {
val dueDate = val dueDate =
Task.createDueDate(URGENCY_SPECIFIC_DAY_TIME, DateTime(2022, 1, 30, 13, 30).millis) createDueDate(URGENCY_SPECIFIC_DAY_TIME, DateTime(2022, 1, 30, 13, 30).millis)
.toDateTime() .toDateTime()
val alarm = alarmCalculator.toAlarmEntry( val alarm = alarmCalculator.toAlarmEntry(
newTask(with(DUE_TIME, dueDate), with(REMINDER_LAST, dueDate.plusDays(7))), newTask(with(DUE_TIME, dueDate), with(REMINDER_LAST, dueDate.plusDays(7))),

@ -8,8 +8,12 @@ import org.junit.Before
import org.junit.Test import org.junit.Test
import org.tasks.Freeze import org.tasks.Freeze
import org.tasks.Freeze.Companion.freezeAt import org.tasks.Freeze.Companion.freezeAt
import org.tasks.data.createDueDate
import org.tasks.data.isHidden
import org.tasks.data.isOverdue
import org.tasks.date.DateTimeUtils import org.tasks.date.DateTimeUtils
import org.tasks.time.DateTime import org.tasks.time.DateTime
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import java.util.TreeSet import java.util.TreeSet
class TaskTest { class TaskTest {
@ -25,37 +29,37 @@ class TaskTest {
@Test @Test
fun testCreateDueDateNoUrgency() { fun testCreateDueDateNoUrgency() {
assertEquals(0, Task.createDueDate(Task.URGENCY_NONE, 1L)) assertEquals(0, createDueDate(Task.URGENCY_NONE, 1L))
} }
@Test @Test
fun testCreateDueDateToday() { fun testCreateDueDateToday() {
val expected = DateTime(2013, 12, 31, 12, 0, 0, 0).millis val expected = DateTime(2013, 12, 31, 12, 0, 0, 0).millis
assertEquals(expected, Task.createDueDate(Task.URGENCY_TODAY, -1L)) assertEquals(expected, createDueDate(Task.URGENCY_TODAY, -1L))
} }
@Test @Test
fun testCreateDueDateTomorrow() { fun testCreateDueDateTomorrow() {
val expected = DateTime(2014, 1, 1, 12, 0, 0, 0).millis val expected = DateTime(2014, 1, 1, 12, 0, 0, 0).millis
assertEquals(expected, Task.createDueDate(Task.URGENCY_TOMORROW, -1L)) assertEquals(expected, createDueDate(Task.URGENCY_TOMORROW, -1L))
} }
@Test @Test
fun testCreateDueDateDayAfter() { fun testCreateDueDateDayAfter() {
val expected = DateTime(2014, 1, 2, 12, 0, 0, 0).millis val expected = DateTime(2014, 1, 2, 12, 0, 0, 0).millis
assertEquals(expected, Task.createDueDate(Task.URGENCY_DAY_AFTER, -1L)) assertEquals(expected, createDueDate(Task.URGENCY_DAY_AFTER, -1L))
} }
@Test @Test
fun testCreateDueDateNextWeek() { fun testCreateDueDateNextWeek() {
val expected = DateTime(2014, 1, 7, 12, 0, 0, 0).millis val expected = DateTime(2014, 1, 7, 12, 0, 0, 0).millis
assertEquals(expected, Task.createDueDate(Task.URGENCY_NEXT_WEEK, -1L)) assertEquals(expected, createDueDate(Task.URGENCY_NEXT_WEEK, -1L))
} }
@Test @Test
fun testCreateDueDateInTwoWeeks() { fun testCreateDueDateInTwoWeeks() {
val expected = DateTime(2014, 1, 14, 12, 0, 0, 0).millis val expected = DateTime(2014, 1, 14, 12, 0, 0, 0).millis
assertEquals(expected, Task.createDueDate(Task.URGENCY_IN_TWO_WEEKS, -1L)) assertEquals(expected, createDueDate(Task.URGENCY_IN_TWO_WEEKS, -1L))
} }
@Test @Test
@ -66,13 +70,13 @@ class TaskTest {
.withSecondOfMinute(0) .withSecondOfMinute(0)
.withMillisOfSecond(0) .withMillisOfSecond(0)
.millis .millis
assertEquals(expected, Task.createDueDate(Task.URGENCY_SPECIFIC_DAY, specificDueDate.millis)) assertEquals(expected, createDueDate(Task.URGENCY_SPECIFIC_DAY, specificDueDate.millis))
} }
@Test @Test
fun testRemoveSecondsForSpecificTime() { fun testRemoveSecondsForSpecificTime() {
val expected = specificDueDate.withSecondOfMinute(1).withMillisOfSecond(0).millis val expected = specificDueDate.withSecondOfMinute(1).withMillisOfSecond(0).millis
assertEquals(expected, Task.createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME, specificDueDate.millis)) assertEquals(expected, createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME, specificDueDate.millis))
} }
@Test @Test
@ -144,7 +148,7 @@ class TaskTest {
@Test @Test
fun testTaskIsNotHiddenAtHideUntilTime() { fun testTaskIsNotHiddenAtHideUntilTime() {
val now = org.tasks.time.DateTimeUtils.currentTimeMillis() val now = currentTimeMillis()
freezeAt(now) { freezeAt(now) {
val task = Task() val task = Task()
task.hideUntil = now task.hideUntil = now
@ -154,7 +158,7 @@ class TaskTest {
@Test @Test
fun testTaskIsHiddenBeforeHideUntilTime() { fun testTaskIsHiddenBeforeHideUntilTime() {
val now = org.tasks.time.DateTimeUtils.currentTimeMillis() val now = currentTimeMillis()
freezeAt(now) { freezeAt(now) {
val task = Task() val task = Task()
task.hideUntil = now + 1 task.hideUntil = now + 1
@ -176,7 +180,7 @@ class TaskTest {
@Test @Test
fun testTaskNotOverdueAtDueTime() { fun testTaskNotOverdueAtDueTime() {
val now = org.tasks.time.DateTimeUtils.currentTimeMillis() val now = currentTimeMillis()
freezeAt(now) { freezeAt(now) {
val task = Task() val task = Task()
task.dueDate = now task.dueDate = now
@ -186,7 +190,7 @@ class TaskTest {
@Test @Test
fun testTaskIsOverduePastDueTime() { fun testTaskIsOverduePastDueTime() {
val dueDate = org.tasks.time.DateTimeUtils.currentTimeMillis() val dueDate = currentTimeMillis()
freezeAt(dueDate + 1) { freezeAt(dueDate + 1) {
val task = Task() val task = Task()
task.dueDate = dueDate task.dueDate = dueDate

@ -13,6 +13,7 @@ import org.mockito.Mockito.anySet
import org.mockito.Mockito.mock import org.mockito.Mockito.mock
import org.mockito.Mockito.`when` import org.mockito.Mockito.`when`
import org.tasks.LocalBroadcastManager import org.tasks.LocalBroadcastManager
import org.tasks.data.createDueDate
import org.tasks.makers.TaskMaker import org.tasks.makers.TaskMaker
import org.tasks.time.DateTime import org.tasks.time.DateTime
@ -35,7 +36,7 @@ abstract class RepeatTests {
protected fun newDay(year: Int, month: Int, day: Int) = protected fun newDay(year: Int, month: Int, day: Int) =
DateTime( DateTime(
Task.createDueDate( createDueDate(
Task.URGENCY_SPECIFIC_DAY, Task.URGENCY_SPECIFIC_DAY,
DateTime(year, month, day).millis DateTime(year, month, day).millis
) )
@ -43,7 +44,7 @@ abstract class RepeatTests {
protected fun newDayTime(year: Int, month: Int, day: Int, hour: Int, minute: Int) = protected fun newDayTime(year: Int, month: Int, day: Int, hour: Int, minute: Int) =
DateTime( DateTime(
Task.createDueDate( createDueDate(
Task.URGENCY_SPECIFIC_DAY_TIME, Task.URGENCY_SPECIFIC_DAY_TIME,
DateTime(year, month, day, hour, minute).millis DateTime(year, month, day, hour, minute).millis
) )

@ -1,7 +1,9 @@
package org.tasks package org.tasks
import org.tasks.time.DateTime import org.tasks.time.DateTime
import org.tasks.time.DateTimeUtils import org.tasks.time.DateTimeUtils2.currentTimeMillis
import org.tasks.time.DateTimeUtils2.setCurrentMillisFixed
import org.tasks.time.DateTimeUtils2.setCurrentMillisSystem
class Freeze { class Freeze {
fun <T> thawAfter(run: () -> T): T { fun <T> thawAfter(run: () -> T): T {
@ -15,7 +17,7 @@ class Freeze {
companion object { companion object {
fun freezeClock(run: () -> Unit): Any { fun freezeClock(run: () -> Unit): Any {
return freezeAt(DateTimeUtils.currentTimeMillis()).thawAfter(run) return freezeAt(currentTimeMillis()).thawAfter(run)
} }
fun <T> freezeAt(dateTime: DateTime, run: () -> T): T { fun <T> freezeAt(dateTime: DateTime, run: () -> T): T {
@ -31,12 +33,12 @@ class Freeze {
} }
fun freezeAt(millis: Long): Freeze { fun freezeAt(millis: Long): Freeze {
DateTimeUtils.setCurrentMillisFixed(millis) setCurrentMillisFixed(millis)
return Freeze() return Freeze()
} }
fun thaw() { fun thaw() {
DateTimeUtils.setCurrentMillisSystem() setCurrentMillisSystem()
} }
} }
} }

@ -1,7 +1,9 @@
package org.tasks package org.tasks
import org.tasks.time.DateTime import org.tasks.time.DateTime
import org.tasks.time.DateTimeUtils import org.tasks.time.DateTimeUtils2.currentTimeMillis
import org.tasks.time.DateTimeUtils2.setCurrentMillisFixed
import org.tasks.time.DateTimeUtils2.setCurrentMillisSystem
class SuspendFreeze { class SuspendFreeze {
@ -16,7 +18,7 @@ class SuspendFreeze {
companion object { companion object {
suspend fun <T> freezeClock(run: suspend () -> T): T { suspend fun <T> freezeClock(run: suspend () -> T): T {
return freezeAt(DateTimeUtils.currentTimeMillis()).thawAfter(run) return freezeAt(currentTimeMillis()).thawAfter(run)
} }
suspend fun <T> freezeAt(dateTime: DateTime, run: suspend () -> T): T { suspend fun <T> freezeAt(dateTime: DateTime, run: suspend () -> T): T {
@ -32,12 +34,12 @@ class SuspendFreeze {
} }
fun freezeAt(millis: Long): SuspendFreeze { fun freezeAt(millis: Long): SuspendFreeze {
DateTimeUtils.setCurrentMillisFixed(millis) setCurrentMillisFixed(millis)
return SuspendFreeze() return SuspendFreeze()
} }
fun thaw() { fun thaw() {
DateTimeUtils.setCurrentMillisSystem() setCurrentMillisSystem()
} }
} }
} }

@ -6,8 +6,9 @@ import org.junit.Assert.assertEquals
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
import org.tasks.TestUtilities.vtodo import org.tasks.TestUtilities.vtodo
import org.tasks.data.createDueDate
import org.tasks.time.DateTime import org.tasks.time.DateTime
import java.util.* import java.util.TimeZone
class NextCloudTests { class NextCloudTests {
private val defaultTimeZone = TimeZone.getDefault() private val defaultTimeZone = TimeZone.getDefault()
@ -50,7 +51,7 @@ class NextCloudTests {
@Test @Test
fun readAllDayTask() { fun readAllDayTask() {
assertEquals( assertEquals(
Task.createDueDate(Task.URGENCY_SPECIFIC_DAY, DateTime(2021, 2, 1).millis), createDueDate(Task.URGENCY_SPECIFIC_DAY, DateTime(2021, 2, 1).millis),
vtodo("nextcloud/all_day_task.txt").dueDate vtodo("nextcloud/all_day_task.txt").dueDate
) )
} }

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save