Move Room to data module

pull/2884/head
Alex Baker 3 weeks ago
parent 6118121698
commit 6e14d07d0c

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

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

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

@ -6,7 +6,9 @@ import com.todoroo.astrid.helper.UUIDHelper
import dagger.hilt.android.testing.HiltAndroidTest
import dagger.hilt.android.testing.UninstallModules
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.tasks.data.CaldavDao.Companion.LOCAL
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.newTask
import org.tasks.time.DateTime
import org.tasks.time.DateTimeUtils
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import javax.inject.Inject
@UninstallModules(ProductionModule::class)
@ -43,7 +45,7 @@ class DeletionDaoTests : InjectingTestCase() {
deletionDao.markDeleted(listOf(task.id))
task = taskDao.fetch(task.id)!!
assertTrue(task.modificationDate > task.creationDate)
assertTrue(task.modificationDate < DateTimeUtils.currentTimeMillis())
assertTrue(task.modificationDate < currentTimeMillis())
}
@Test
@ -53,7 +55,7 @@ class DeletionDaoTests : InjectingTestCase() {
deletionDao.markDeleted(listOf(task.id))
task = taskDao.fetch(task.id)!!
assertTrue(task.deletionDate > task.creationDate)
assertTrue(task.deletionDate < DateTimeUtils.currentTimeMillis())
assertTrue(task.deletionDate < currentTimeMillis())
}
@Test

@ -20,11 +20,11 @@ class TestOpenTaskDao @Inject constructor(
private val caldavDao: CaldavDao
) : OpenTaskDao(context, caldavDao) {
suspend fun insertList(
name: String = DEFAULT_LIST,
type: String = DEFAULT_TYPE,
account: String = DEFAULT_ACCOUNT,
url: String = UUIDHelper.newUUID(),
accessLevel: Int = ACCESS_LEVEL_OWNER,
name: String = DEFAULT_LIST,
type: String = DEFAULT_TYPE,
account: String = DEFAULT_ACCOUNT,
url: String = UUIDHelper.newUUID(),
accessLevel: Int = ACCESS_LEVEL_OWNER,
): Pair<Long, CaldavCalendar> {
val uri = taskLists.buildUpon()
.appendQueryParameter(TaskContract.CALLER_IS_SYNCADAPTER, "true")

@ -19,6 +19,7 @@ import org.tasks.data.AlarmDao
import org.tasks.data.LocationDao
import org.tasks.data.TagDataDao
import org.tasks.data.UserActivityDao
import org.tasks.data.getLocation
import org.tasks.injection.InjectingTestCase
import org.tasks.location.GeofenceApi
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.UninstallModules
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.tasks.data.Alarm
import org.tasks.data.Alarm.Companion.whenOverdue
import org.tasks.data.createDueDate
import org.tasks.injection.ProductionModule
import org.tasks.makers.TaskMaker.newTask
import org.tasks.time.DateTimeUtils.currentTimeMillis
import org.tasks.time.DateTimeUtils2.currentTimeMillis
@UninstallModules(ProductionModule::class)
@HiltAndroidTest
@ -22,7 +25,7 @@ class ReminderTests : BaseTaskEditViewModelTest() {
setup(task)
viewModel.setStartDate(
Task.createDueDate(
createDueDate(
Task.URGENCY_SPECIFIC_DAY_TIME,
currentTimeMillis()
)
@ -43,7 +46,7 @@ class ReminderTests : BaseTaskEditViewModelTest() {
setup(task)
viewModel.setDueDate(
Task.createDueDate(
createDueDate(
Task.URGENCY_SPECIFIC_DAY_TIME,
currentTimeMillis()
)
@ -64,7 +67,7 @@ class ReminderTests : BaseTaskEditViewModelTest() {
setup(task)
viewModel.setDueDate(
Task.createDueDate(
createDueDate(
Task.URGENCY_SPECIFIC_DAY_TIME,
currentTimeMillis()
)

@ -7,7 +7,7 @@
package com.todoroo.andlib.utility;
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.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.api.Filter
import com.todoroo.astrid.dao.TaskDao
import com.todoroo.astrid.data.Task
import com.todoroo.astrid.service.TaskCreator
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Dispatchers
@ -48,6 +47,8 @@ import org.tasks.data.AlarmDao
import org.tasks.data.LocationDao
import org.tasks.data.Place
import org.tasks.data.TagDataDao
import com.todoroo.astrid.data.Task
import org.tasks.data.getLocation
import org.tasks.databinding.TaskListActivityBinding
import org.tasks.dialogs.NewFilterDialog
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.CustomFilter
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.TagFilter
import com.todoroo.astrid.data.Task
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
@ -31,7 +29,10 @@ import org.tasks.Tasks.Companion.IS_GENERIC
import org.tasks.billing.Inventory
import org.tasks.compose.drawer.DrawerItem
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.count
import org.tasks.filters.FilterProvider
import org.tasks.filters.NavigationDrawerSubheader
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.TagFilter
import com.todoroo.astrid.core.BuiltInFilterExposer
import com.todoroo.astrid.dao.Database
import com.todoroo.astrid.dao.TaskDao
import com.todoroo.astrid.data.Task
import com.todoroo.astrid.repeats.RepeatTaskHelper
import com.todoroo.astrid.service.TaskCompleter
import com.todoroo.astrid.service.TaskCreator
@ -96,9 +94,12 @@ import org.tasks.caldav.BaseCaldavCalendarSettingsActivity
import org.tasks.compose.SubscriptionNagBanner
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.data.CaldavDao
import com.todoroo.astrid.dao.Database
import org.tasks.data.Tag
import org.tasks.data.TagDataDao
import com.todoroo.astrid.data.Task
import org.tasks.data.TaskContainer
import org.tasks.data.listSettingsClass
import org.tasks.databinding.FragmentTaskListBinding
import org.tasks.db.SuspendDbUtils.chunkedMap
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_START
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 org.tasks.BuildConfig
import org.tasks.LocalBroadcastManager
import org.tasks.data.CaldavDao
import org.tasks.data.CaldavDao.Companion.toAppleEpoch
import org.tasks.data.CaldavTask
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.date.DateTimeUtils.toAppleEpoch
import org.tasks.data.createDueDate
import org.tasks.data.createHideUntil
import org.tasks.date.DateTimeUtils.toDateTime
import org.tasks.time.DateTimeUtils.millisOfDay
@ -205,7 +207,7 @@ open class TaskAdapter(
task.setDueDateAdjustingHideUntil(when {
date == 0L -> 0L
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) {
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.QueryTemplate
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 org.tasks.data.CaldavCalendar
import org.tasks.data.CaldavTask
import org.tasks.data.NO_COUNT
import com.todoroo.astrid.data.Task
import org.tasks.data.TaskDao.TaskCriteria.activeAndVisible
@Parcelize

@ -2,6 +2,8 @@ package com.todoroo.astrid.api
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
import org.tasks.data.NO_COUNT
import org.tasks.data.NO_ORDER
interface Filter : FilterListItem, Parcelable {
val valuesForNewTasks: String?
@ -28,11 +30,6 @@ interface Filter : FilterListItem, Parcelable {
fun supportsHiddenTasks(): Boolean = true
fun supportsSubtasks(): Boolean = true
fun supportsSorting(): Boolean = true
companion object {
const val NO_ORDER = -1
const val NO_COUNT = -1
}
}
@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.QueryTemplate
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 org.tasks.data.CaldavCalendar
import org.tasks.data.CaldavTask
import org.tasks.data.GoogleTask
import org.tasks.data.NO_COUNT
import org.tasks.data.TaskDao.TaskCriteria.activeAndVisible
@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.QueryTemplate
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 org.tasks.data.NO_COUNT
import org.tasks.data.Tag
import org.tasks.data.TagData
import org.tasks.data.TaskDao.TaskCriteria.activeAndVisible

@ -6,6 +6,7 @@
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.showHidden;
@ -44,7 +45,6 @@ public class SortHelper {
public static final int SORT_COMPLETED = 10;
public static final int SORT_MANUAL = 11;
public static final long APPLE_EPOCH = 978307200000L; // 1/1/2001 GMT
@SuppressLint("DefaultLocale")
public static final String CALDAV_ORDER_COLUMN =
String.format(Locale.US, "IFNULL(tasks.`order`, (tasks.created - %d) / 1000)", APPLE_EPOCH);

@ -6,11 +6,14 @@
package com.todoroo.astrid.dao
import com.todoroo.astrid.api.Filter
import com.todoroo.astrid.data.Task
import com.todoroo.astrid.timers.TimerPlugin
import org.tasks.LocalBroadcastManager
import com.todoroo.astrid.data.Task
import org.tasks.data.TaskContainer
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.db.SuspendDbUtils.eachChunk
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.RepeatRuleToString
import org.tasks.time.DateTime
import org.tasks.time.DateTimeUtils.currentTimeMillis
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import org.tasks.ui.TaskEditControlFragment
import javax.inject.Inject

@ -9,7 +9,6 @@ import com.todoroo.andlib.utility.DateUtilities
import com.todoroo.astrid.alarms.AlarmService
import com.todoroo.astrid.dao.TaskDao
import com.todoroo.astrid.data.Task
import com.todoroo.astrid.data.Task.Companion.createDueDate
import com.todoroo.astrid.gcal.GCalHelper
import net.fortuna.ical4j.model.Date
import net.fortuna.ical4j.model.Recur
@ -17,6 +16,8 @@ import net.fortuna.ical4j.model.WeekDay
import org.tasks.LocalBroadcastManager
import org.tasks.data.Alarm
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.repeats.RecurrenceUtils.newRecur
import org.tasks.time.DateTime
@ -236,7 +237,7 @@ class RepeatTaskHelper @Inject constructor(
/** Set up repeat start date */
private fun setUpStartDate(
task: Task, repeatAfterCompletion: Boolean, frequency: Recur.Frequency): DateTime {
task: Task, repeatAfterCompletion: Boolean, frequency: Recur.Frequency): DateTime {
return if (repeatAfterCompletion) {
var startDate = if (task.isCompleted) newDateTime(task.completionDate) else newDateTime()
if (task.hasDueTime() && frequency != Recur.Frequency.HOURLY && frequency != Recur.Frequency.MINUTELY) {

@ -17,6 +17,7 @@ import dagger.hilt.android.qualifiers.ApplicationContext
import org.tasks.LocalBroadcastManager
import org.tasks.data.CaldavDao
import org.tasks.preferences.Preferences
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import timber.log.Timber
import javax.inject.Inject
@ -65,7 +66,7 @@ class TaskCompleter @Inject internal constructor(
return
}
val completed = completionDate > 0
val modified = System.currentTimeMillis()
val modified = currentTimeMillis()
database.withTransaction {
tasks
.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_NONE
import com.todoroo.astrid.data.Task.Companion.IMPORTANCE
import com.todoroo.astrid.data.Task.Companion.createDueDate
import com.todoroo.astrid.gcal.GCalHelper
import com.todoroo.astrid.helper.UUIDHelper
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.CaldavDao
import org.tasks.data.CaldavTask
import org.tasks.data.Geofence
import org.tasks.data.GoogleTask
import org.tasks.data.GoogleTaskDao
import org.tasks.data.LocationDao
@ -35,6 +33,9 @@ import org.tasks.data.Tag
import org.tasks.data.TagDao
import org.tasks.data.TagData
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.Preferences
import org.tasks.time.DateTimeUtils.startOfDay
@ -111,7 +112,7 @@ class TaskCreator @Inject constructor(
if (task.hasTransitory(Place.KEY)) {
val place = locationDao.getPlace(task.getTransitory<String>(Place.KEY)!!)
if (place != null) {
locationDao.insert(Geofence(place.uid, preferences))
locationDao.insert(createGeofence(place.uid, preferences))
}
}
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.Filter
import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.data.Task
import dagger.hilt.android.qualifiers.ApplicationContext
import org.tasks.BuildConfig
import org.tasks.LocalBroadcastManager
@ -15,7 +14,9 @@ import org.tasks.data.CaldavDao
import org.tasks.data.CaldavTask
import org.tasks.data.GoogleTaskDao
import org.tasks.data.GoogleTaskListDao
import com.todoroo.astrid.data.Task
import org.tasks.data.TaskDao
import org.tasks.data.getLocalList
import org.tasks.db.DbUtils.dbchunk
import org.tasks.preferences.Preferences
import org.tasks.sync.SyncAdapters

@ -7,11 +7,11 @@ package com.todoroo.astrid.utility
import com.mdimension.jchronic.AstridChronic
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 org.tasks.Strings.isNullOrEmpty
import org.tasks.data.TagDataDao
import com.todoroo.astrid.data.Task
import org.tasks.data.createDueDate
import org.tasks.repeats.RecurrenceUtils.newRecur
import timber.log.Timber
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_EXIT
import org.tasks.data.Geofence
import org.tasks.data.Notification
import org.tasks.data.TaskDao
import org.tasks.data.fetchFiltered
import org.tasks.intents.TaskIntents
import org.tasks.notifications.AudioManager
import org.tasks.notifications.Notification
import org.tasks.notifications.NotificationManager
import org.tasks.notifications.TelephonyManager
import org.tasks.preferences.Preferences
import org.tasks.themes.ColorProvider
import org.tasks.time.DateTimeUtils
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import timber.log.Timber
import javax.inject.Inject
import kotlin.math.min
@ -63,7 +64,7 @@ class Notifier @Inject constructor(
.setContentText(filter.title)
.setContentIntent(pendingIntent)
.setAutoCancel(true)
.setWhen(DateTimeUtils.currentTimeMillis())
.setWhen(currentTimeMillis())
.setShowWhen(true)
.setColor(colorProvider.getPriorityColor(maxPriority, true))
.setGroupSummary(true)
@ -79,7 +80,7 @@ class Notifier @Inject constructor(
Notification().apply {
taskId = it.task
type = if (arrival) TYPE_GEO_ENTER else TYPE_GEO_EXIT
timestamp = DateTimeUtils.currentTimeMillis()
timestamp = currentTimeMillis()
location = place
}
}

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

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

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

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

@ -22,15 +22,15 @@ class BackupContainer(
val googleTaskLists: List<GoogleTaskList>? = emptyList(),
) {
class TaskBackup(
val task: Task,
val alarms: List<Alarm>,
val geofences: List<Geofence>?,
val tags: List<Tag>,
val comments: List<UserActivity>,
val attachments: List<Attachment>?,
val caldavTasks: List<CaldavTask>?,
val vtodo: String?,
val google: List<GoogleTask> = emptyList(),
val task: Task,
val alarms: List<Alarm>,
val geofences: List<Geofence>?,
val tags: List<Tag>,
val comments: List<UserActivity>,
val attachments: List<Attachment>?,
val caldavTasks: List<CaldavTask>?,
val vtodo: String?,
val google: List<GoogleTask> = emptyList(),
) {
val locations: List<LegacyLocation> = emptyList()
}

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

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

@ -10,6 +10,7 @@ import okhttp3.OkHttpClient
import org.tasks.R
import org.tasks.billing.Inventory
import org.tasks.data.CaldavAccount
import org.tasks.data.getPassword
import org.tasks.http.HttpClientFactory
import org.tasks.security.KeyStoreEncryption
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.astrid.alarms.AlarmService
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.Companion.getDefaultAlarms
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.CaldavDao
import org.tasks.data.CaldavTask
import org.tasks.data.Geofence
import org.tasks.data.LocationDao
import org.tasks.data.Place
import org.tasks.data.TagDao
import org.tasks.data.TagData
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.toDateTime
import org.tasks.date.DateTimeUtils.toLocal
@ -110,7 +112,7 @@ class iCalendar @Inject constructor(
val existing = locationDao.getGeofences(taskId)
if (existing == null) {
locationDao.insert(
Geofence(
createGeofence(
place.uid,
preferences
).copy(task = taskId)
@ -308,11 +310,11 @@ class iCalendar @Inject constructor(
fun Due?.toMillis() =
when (this?.date) {
null -> 0
is DateTime -> com.todoroo.astrid.data.Task.createDueDate(
is DateTime -> createDueDate(
URGENCY_SPECIFIC_DAY_TIME,
getLocal(this)
)
else -> com.todoroo.astrid.data.Task.createDueDate(
else -> createDueDate(
URGENCY_SPECIFIC_DAY,
getLocal(this)
)

@ -2,10 +2,6 @@ package org.tasks.caldav
import at.bitfire.ical4android.Task
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 org.tasks.caldav.iCalendar.Companion.collapsed
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.toMillis
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.time.DateTime.UTC
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.todoroo.astrid.api.Filter
import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.data.Task
import org.tasks.compose.CheckBox
import org.tasks.compose.ClearButton
import org.tasks.compose.DisabledText
import org.tasks.compose.SubtaskChip
import org.tasks.compose.TaskEditIcon
import org.tasks.compose.TaskEditRow
import com.todoroo.astrid.data.Task
import org.tasks.data.TaskContainer
import org.tasks.data.isHidden
import org.tasks.tasklist.SectionedDataSource
import org.tasks.ui.TaskListViewModel
@ -214,7 +215,7 @@ fun ExistingSubtaskRow(
text = task.title!!,
modifier = Modifier
.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)
.padding(top = 12.dp),
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.outlined.Pause
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.draw.alpha
import androidx.compose.ui.res.stringResource
@ -22,6 +27,7 @@ import kotlinx.coroutines.delay
import org.tasks.R
import org.tasks.compose.DisabledText
import org.tasks.compose.TaskEditRow
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import kotlin.time.Duration.Companion.seconds
@Composable
@ -35,7 +41,7 @@ fun TimerRow(
TaskEditRow(
iconRes = R.drawable.ic_outline_timer_24px,
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 estimatedString = estimated
@ -79,7 +85,7 @@ fun TimerRow(
}
IconButton(
onClick = {
now = System.currentTimeMillis()
now = currentTimeMillis()
timerClicked()
},
modifier = Modifier.padding(vertical = 8.dp),
@ -98,7 +104,7 @@ fun TimerRow(
LaunchedEffect(key1 = started) {
while (started > 0) {
delay(1.seconds)
now = System.currentTimeMillis()
now = currentTimeMillis()
}
}
},
@ -120,6 +126,6 @@ fun NoTimer() {
@Composable
fun RunningTimer() {
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.R
import org.tasks.data.TaskDao
import org.tasks.data.count
import org.tasks.data.fetchFiltered
import org.tasks.intents.TaskIntents
import org.tasks.preferences.DefaultFilterProvider
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.database.Cursor
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.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 net.fortuna.ical4j.model.Parameter
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 org.dmfs.tasks.contract.TaskContract
import org.tasks.data.OpenTaskDao.Companion.getLong
import java.util.*
import java.util.Locale
import java.util.logging.Level
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.UTC
import java.util.*
import java.util.TimeZone
object DateTimeUtils {
@JvmStatic
@ -25,8 +25,6 @@ object DateTimeUtils {
@JvmStatic
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.isAfterNow(): Boolean = DateTime(this).isAfterNow

@ -3,15 +3,8 @@ package org.tasks.db
import android.content.Context
import android.database.sqlite.SQLiteException
import androidx.core.database.getStringOrNull
import androidx.room.DeleteColumn
import androidx.room.migration.AutoMigrationSpec
import androidx.room.migration.Migration
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.caldav.FileStorage
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.CaldavCalendar.Companion.ACCESS_OWNER
import org.tasks.data.CaldavCalendar.Companion.ACCESS_READ_ONLY
import org.tasks.data.NO_ORDER
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.getString
import org.tasks.preferences.DefaultFilterProvider
@ -35,12 +33,6 @@ import java.util.concurrent.TimeUnit.HOURS
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) {
override fun migrate(database: SupportSQLiteDatabase) {
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 com.todoroo.andlib.utility.DateUtilities
import com.todoroo.astrid.dao.TaskDao
import com.todoroo.astrid.data.Task
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.launch
import org.tasks.R
import com.todoroo.astrid.data.Task
import org.tasks.data.createDueDate
import org.tasks.databinding.DialogDateTimePickerBinding
import org.tasks.date.DateTimeUtils.newDateTime
import org.tasks.date.DateTimeUtils.toDateTime
@ -272,11 +273,11 @@ class DateTimePicker : BaseDateTimePicker() {
}
it.setDueDateAdjustingHideUntil(when {
day == NO_DAY -> 0L
time == NO_TIME -> Task.createDueDate(
time == NO_TIME -> createDueDate(
Task.URGENCY_SPECIFIC_DAY,
day
)
else -> Task.createDueDate(
else -> createDueDate(
Task.URGENCY_SPECIFIC_DAY_TIME,
day.toDateTime().withMillisOfDay(time).millis
)

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

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

@ -1,14 +1,17 @@
package org.tasks.etebase
import android.content.Context
import com.etebase.client.*
import com.etebase.client.Account
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.withContext
import org.tasks.data.CaldavCalendar
import org.tasks.data.CaldavDao
import org.tasks.data.CaldavTask
import org.tasks.time.DateTimeUtils.currentTimeMillis
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import timber.log.Timber
class EtebaseClient(

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

@ -25,7 +25,7 @@ import org.tasks.caldav.iCalendar.Companion.fromVtodo
import org.tasks.data.CaldavAccount
import org.tasks.data.CaldavCalendar
import org.tasks.data.CaldavDao
import org.tasks.time.DateTimeUtils.currentTimeMillis
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import timber.log.Timber
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.Intent
import com.todoroo.astrid.activity.MainActivity
import com.todoroo.astrid.api.CaldavFilter
import com.todoroo.astrid.api.CustomFilter
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.core.BuiltInFilterExposer
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.CaldavDao
import org.tasks.data.FilterDao
import org.tasks.data.GoogleTaskFilters
import org.tasks.data.GoogleTaskListDao
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.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.location.LocationPickerActivity
import org.tasks.preferences.Preferences
@ -236,7 +245,13 @@ class FilterProvider @Inject constructor(
.apply { if (account.isCollapsed) return this }
.plus(caldavDao
.getCaldavFilters(account.uuid!!)
.map(CaldavFilters::toCaldavFilter)
.map {
CaldavFilter(
calendar = it.caldavCalendar,
principals = it.principals,
count = it.count,
)
}
.sort())
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 kotlinx.parcelize.Parcelize
import org.tasks.R
import org.tasks.notifications.Notification
import org.tasks.data.Notification
@Parcelize
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.utility.AndroidUtilities
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.data.Task
import kotlinx.parcelize.Parcelize
import org.tasks.data.Geofence
import org.tasks.data.NO_COUNT
import org.tasks.data.Place
import com.todoroo.astrid.data.Task
import org.tasks.data.TaskDao.TaskCriteria.activeAndVisible
import org.tasks.data.open
import org.tasks.themes.CustomIcons
@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.todoroo.astrid.api.GtasksFilter
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.api.GtasksApiUtilities
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.UserActivityDao
import org.tasks.jobs.WorkManager
import org.tasks.notifications.NotificationDao
import org.tasks.data.NotificationDao
import java.util.Locale
import javax.inject.Singleton

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

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

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

@ -54,6 +54,8 @@ import org.tasks.jobs.WorkManager.Companion.TAG_UPDATE_PURCHASES
import org.tasks.notifications.Throttle
import org.tasks.preferences.Preferences
import org.tasks.time.DateTimeUtils
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import org.tasks.time.printTimestamp
import timber.log.Timber
import java.util.Random
import java.util.concurrent.TimeUnit
@ -153,7 +155,7 @@ class WorkManagerImpl(
override fun scheduleNotification(scheduledTime: Long) {
val time = max(now(), scheduledTime)
if (time < DateTimeUtils.currentTimeMillis()) {
if (time < currentTimeMillis()) {
val intent = notificationIntent
if (AndroidUtilities.atLeastOreo()) {
@ -227,7 +229,7 @@ class WorkManagerImpl(
if (expedited) {
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()))
}

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

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

@ -14,6 +14,8 @@ import org.tasks.LocalBroadcastManager
import org.tasks.R
import org.tasks.data.Alarm
import org.tasks.data.LocationDao
import org.tasks.data.Notification
import org.tasks.data.NotificationDao
import org.tasks.data.TaskDao
import org.tasks.intents.TaskIntents
import org.tasks.markdown.MarkdownProvider
@ -25,7 +27,7 @@ import org.tasks.reminders.SnoozeActivity
import org.tasks.reminders.SnoozeDialog
import org.tasks.themes.ColorProvider
import org.tasks.time.DateTime
import org.tasks.time.DateTimeUtils
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import timber.log.Timber
import javax.inject.Inject
import javax.inject.Singleton
@ -33,15 +35,15 @@ import kotlin.math.min
@Singleton
class NotificationManager @Inject constructor(
@param:ApplicationContext private val context: Context,
private val preferences: Preferences,
private val notificationDao: NotificationDao,
private val taskDao: TaskDao,
private val locationDao: LocationDao,
private val localBroadcastManager: LocalBroadcastManager,
private val notificationManager: ThrottledNotificationManager,
private val markdownProvider: MarkdownProvider,
private val permissionChecker: PermissionChecker,
@param:ApplicationContext private val context: Context,
private val preferences: Preferences,
private val notificationDao: NotificationDao,
private val taskDao: TaskDao,
private val locationDao: LocationDao,
private val localBroadcastManager: LocalBroadcastManager,
private val notificationManager: ThrottledNotificationManager,
private val markdownProvider: MarkdownProvider,
private val permissionChecker: PermissionChecker,
) {
private val colorProvider = ColorProvider(context, preferences)
private val queue = NotificationLimiter(MAX_NOTIFICATIONS)
@ -96,10 +98,10 @@ class NotificationManager @Inject constructor(
}
suspend fun notifyTasks(
newNotifications: List<Notification>,
alert: Boolean,
nonstop: Boolean,
fiveTimes: Boolean) {
newNotifications: List<Notification>,
alert: Boolean,
nonstop: Boolean,
fiveTimes: Boolean) {
val existingNotifications = notificationDao.getAllOrdered()
notificationDao.insertAll(newNotifications)
val totalCount = existingNotifications.size + newNotifications.size
@ -142,11 +144,11 @@ class NotificationManager @Inject constructor(
}
private suspend fun createNotifications(
notifications: List<Notification>,
alert: Boolean,
nonstop: Boolean,
fiveTimes: Boolean,
useGroupKey: Boolean
notifications: List<Notification>,
alert: Boolean,
nonstop: Boolean,
fiveTimes: Boolean,
useGroupKey: Boolean
) {
if (!permissionChecker.canNotify()) {
Timber.w("Notifications disabled")
@ -407,7 +409,7 @@ class NotificationManager @Inject constructor(
.setContentIntent(pendingIntent)
.setContentTitle(appName)
.setContentText(text)
.setWhen(DateTimeUtils.currentTimeMillis())
.setWhen(currentTimeMillis())
.setSmallIcon(R.drawable.ic_timer_white_24dp)
.setAutoCancel(false)
.setOngoing(true)

@ -1,7 +1,7 @@
package org.tasks.notifications
import kotlinx.coroutines.runBlocking
import org.tasks.time.DateTimeUtils.currentTimeMillis
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import timber.log.Timber
import java.util.concurrent.Executor
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.core.BuiltInFilterExposer
import com.todoroo.astrid.core.BuiltInFilterExposer.Companion.getMyTasksFilter
import com.todoroo.astrid.data.Task
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.runBlocking
import org.tasks.R
@ -22,6 +21,8 @@ import org.tasks.data.GoogleTaskDao
import org.tasks.data.GoogleTaskListDao
import org.tasks.data.LocationDao
import org.tasks.data.TagDataDao
import com.todoroo.astrid.data.Task
import org.tasks.data.getLocalList
import org.tasks.filters.PlaceFilter
import timber.log.Timber
import javax.inject.Inject

@ -22,6 +22,9 @@ import org.tasks.billing.PurchaseActivity
import org.tasks.caldav.BaseCaldavAccountSettingsActivity
import org.tasks.caldav.CaldavAccountSettingsActivity
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.extensions.Context.openUri
import org.tasks.extensions.Context.toast

@ -7,6 +7,7 @@ import dagger.hilt.android.AndroidEntryPoint
import dagger.hilt.android.qualifiers.ApplicationContext
import org.tasks.R
import org.tasks.data.TaskDao
import org.tasks.data.count
import org.tasks.injection.InjectingJobIntentService
import org.tasks.preferences.DefaultFilterProvider
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.time.DateTime
import org.tasks.time.DateTimeUtils.startOfDay
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import java.time.DayOfWeek
import java.time.Instant
import java.time.ZoneId
@ -83,7 +84,7 @@ class CustomRecurrenceViewModel @Inject constructor(
val dueDate = savedStateHandle
.get<Long>(EXTRA_DATE)
?.takeIf { it > 0 }
?: System.currentTimeMillis().startOfDay()
?: currentTimeMillis().startOfDay()
val isMicrosoftTask = savedStateHandle.get<Int>(EXTRA_ACCOUNT_TYPE) == TYPE_MICROSOFT
val frequencies = if (isMicrosoftTask) FREQ_MICROSOFT else FREQ_ALL
_state.update { state ->

@ -1,8 +1,5 @@
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.SupervisorJob
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_TASKS
import org.tasks.data.CaldavDao
import com.todoroo.astrid.data.FORCE_CALDAV_SYNC
import org.tasks.data.GoogleTaskDao
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.Companion.TAG_SYNC
import org.tasks.preferences.Preferences
@ -45,7 +45,7 @@ class SyncAdapters @Inject constructor(
}
fun sync(task: Task, original: Task?) = scope.launch {
if (task.checkTransitory(SyncFlags.SUPPRESS_SYNC)) {
if (task.checkTransitory(SUPPRESS_SYNC)) {
return@launch
}
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.RecurrenceType
import org.tasks.time.DateTime
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import java.text.SimpleDateFormat
import java.time.ZonedDateTime
import java.util.Locale
@ -32,7 +33,7 @@ object MicrosoftConverter {
defaultPriority != Task.Priority.HIGH -> defaultPriority
else -> Task.Priority.NONE
}
completionDate = remote.completedDateTime.toLong(System.currentTimeMillis())
completionDate = remote.completedDateTime.toLong(currentTimeMillis())
dueDate = remote.dueDateTime.toLong(0L)
creationDate = remote.createdDateTime.parseDateTime()
modificationDate = remote.lastModifiedDateTime.parseDateTime()
@ -163,7 +164,7 @@ object MicrosoftConverter {
private fun String?.parseDateTime(): Long =
this
?.let { ZonedDateTime.parse(this).toInstant().toEpochMilli() }
?: System.currentTimeMillis()
?: currentTimeMillis()
private fun Tasks.Task.DateTime?.toLong(default: Long): Long =
this

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

@ -30,6 +30,9 @@ import org.tasks.compose.FilterChip
import org.tasks.compose.StartDateChip
import org.tasks.compose.SubtaskChip
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.date.DateTimeUtils.newDateTime
import org.tasks.dialogs.Linkify
@ -157,7 +160,7 @@ class TaskViewHolder internal constructor(
)
if (preferences.getBoolean(R.string.p_show_description, true)) {
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)) {
linkify.setMovementMethod(
@ -197,7 +200,7 @@ class TaskViewHolder internal constructor(
nameView.paintFlags = nameView.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
} else {
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()
}
completeBox.isChecked = task.isCompleted
@ -207,7 +210,7 @@ class TaskViewHolder internal constructor(
private fun setupDueDate(sortByDueDate: Boolean) {
if (task.hasDueDate()) {
if (task.isOverdue) {
if (task.task.isOverdue) {
dueDate.setTextColor(textColorOverdue)
} else {
dueDate.setTextColor(textColorSecondary)
@ -232,7 +235,7 @@ class TaskViewHolder internal constructor(
val id = task.id
val children = task.children
val collapsed = task.isCollapsed
val isHidden = task.isHidden
val isHidden = task.task.isHidden
val sortGroup = task.sortGroup
val startDate = task.task.hideUntil
val place = task.location?.place

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

@ -3,31 +3,8 @@ package org.tasks.time
import android.annotation.SuppressLint
import org.tasks.BuildConfig
import org.tasks.date.DateTimeUtils.toDateTime
import java.util.*
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")
fun printDuration(millis: Long): String = if (BuildConfig.DEBUG) {
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.Location
import org.tasks.data.Place
import org.tasks.data.createGeofence
import org.tasks.data.open
import org.tasks.dialogs.DialogBuilder
import org.tasks.dialogs.GeofenceDialog
import org.tasks.extensions.Context.openUri
@ -128,7 +130,7 @@ class LocationControlSet : TaskEditControlFragment() {
val place: Place = data!!.getParcelableExtra(LocationPickerActivity.EXTRA_PLACE)!!
val location = viewModel.selectedLocation.value
val geofence = if (location == null) {
Geofence(place.uid, preferences)
createGeofence(place.uid, preferences)
} else {
val existing = location.geofence
Geofence(

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

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

@ -23,6 +23,7 @@ import org.tasks.intents.TaskIntents
import org.tasks.preferences.DefaultFilterProvider
import org.tasks.preferences.Preferences
import org.tasks.themes.ThemeColor
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import timber.log.Timber
import javax.inject.Inject
@ -85,7 +86,7 @@ class TasksWidget : AppWidgetProvider() {
opacity = widgetPreferences.footerOpacity,
)
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(
R.id.list_view,
Intent(context, TasksWidgetAdapter::class.java)

@ -17,6 +17,9 @@ import org.tasks.R
import org.tasks.data.TaskContainer
import org.tasks.data.TaskDao
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.extensions.setBackgroundResource
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
chipProvider
.getStartDateChip(taskContainer, settings.showFullDate, sortByDate)
@ -296,7 +299,7 @@ internal class TasksWidgetViewFactory(
setTextViewText(dueDateRes, text)
setTextColor(
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))
setOnClickFillInIntent(

@ -8,11 +8,12 @@ import com.todoroo.astrid.api.CaldavFilter
import com.todoroo.astrid.api.Filter
import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.api.TagFilter
import com.todoroo.astrid.data.Task
import dagger.hilt.android.qualifiers.ApplicationContext
import org.tasks.BuildConfig
import org.tasks.R
import com.todoroo.astrid.data.Task
import org.tasks.data.TaskContainer
import org.tasks.data.isHidden
import org.tasks.date.DateTimeUtils.toDateTime
import org.tasks.extensions.setColorFilter
import org.tasks.filters.PlaceFilter
@ -50,7 +51,7 @@ class WidgetChipProvider @Inject constructor(
}
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()) {
task.task.hideUntil
.takeIf { Task.hasDueTime(it) }

@ -2,7 +2,6 @@ package com.todoroo.astrid.alarms
import com.natpryce.makeiteasy.MakeItEasy.with
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_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.whenOverdue
import org.tasks.data.Alarm.Companion.whenStarted
import org.tasks.data.createDueDate
import org.tasks.date.DateTimeUtils.newDateTime
import org.tasks.date.DateTimeUtils.toDateTime
import org.tasks.makers.AlarmEntryMaker.TIME
@ -271,7 +271,7 @@ class AlarmCalculatorTest {
@Test
fun reminderOverdueEveryDay() = runBlocking {
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()
val alarm = alarmCalculator.toAlarmEntry(
newTask(with(DUE_TIME, dueDate), with(REMINDER_LAST, dueDate.plusDays(6))),
@ -287,7 +287,7 @@ class AlarmCalculatorTest {
@Test
fun endDailyOverdueReminder() = runBlocking {
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()
val alarm = alarmCalculator.toAlarmEntry(
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.tasks.Freeze
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.time.DateTime
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import java.util.TreeSet
class TaskTest {
@ -25,37 +29,37 @@ class TaskTest {
@Test
fun testCreateDueDateNoUrgency() {
assertEquals(0, Task.createDueDate(Task.URGENCY_NONE, 1L))
assertEquals(0, createDueDate(Task.URGENCY_NONE, 1L))
}
@Test
fun testCreateDueDateToday() {
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
fun testCreateDueDateTomorrow() {
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
fun testCreateDueDateDayAfter() {
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
fun testCreateDueDateNextWeek() {
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
fun testCreateDueDateInTwoWeeks() {
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
@ -66,13 +70,13 @@ class TaskTest {
.withSecondOfMinute(0)
.withMillisOfSecond(0)
.millis
assertEquals(expected, Task.createDueDate(Task.URGENCY_SPECIFIC_DAY, specificDueDate.millis))
assertEquals(expected, createDueDate(Task.URGENCY_SPECIFIC_DAY, specificDueDate.millis))
}
@Test
fun testRemoveSecondsForSpecificTime() {
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
@ -144,7 +148,7 @@ class TaskTest {
@Test
fun testTaskIsNotHiddenAtHideUntilTime() {
val now = org.tasks.time.DateTimeUtils.currentTimeMillis()
val now = currentTimeMillis()
freezeAt(now) {
val task = Task()
task.hideUntil = now
@ -154,7 +158,7 @@ class TaskTest {
@Test
fun testTaskIsHiddenBeforeHideUntilTime() {
val now = org.tasks.time.DateTimeUtils.currentTimeMillis()
val now = currentTimeMillis()
freezeAt(now) {
val task = Task()
task.hideUntil = now + 1
@ -176,7 +180,7 @@ class TaskTest {
@Test
fun testTaskNotOverdueAtDueTime() {
val now = org.tasks.time.DateTimeUtils.currentTimeMillis()
val now = currentTimeMillis()
freezeAt(now) {
val task = Task()
task.dueDate = now
@ -186,7 +190,7 @@ class TaskTest {
@Test
fun testTaskIsOverduePastDueTime() {
val dueDate = org.tasks.time.DateTimeUtils.currentTimeMillis()
val dueDate = currentTimeMillis()
freezeAt(dueDate + 1) {
val task = Task()
task.dueDate = dueDate

@ -13,6 +13,7 @@ import org.mockito.Mockito.anySet
import org.mockito.Mockito.mock
import org.mockito.Mockito.`when`
import org.tasks.LocalBroadcastManager
import org.tasks.data.createDueDate
import org.tasks.makers.TaskMaker
import org.tasks.time.DateTime
@ -35,7 +36,7 @@ abstract class RepeatTests {
protected fun newDay(year: Int, month: Int, day: Int) =
DateTime(
Task.createDueDate(
createDueDate(
Task.URGENCY_SPECIFIC_DAY,
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) =
DateTime(
Task.createDueDate(
createDueDate(
Task.URGENCY_SPECIFIC_DAY_TIME,
DateTime(year, month, day, hour, minute).millis
)
@ -55,10 +56,10 @@ abstract class RepeatTests {
}
protected fun newFromDue(
recur: String,
due: DateTime,
vararg properties: PropertyValue<in Task?, *>,
afterComplete: Boolean = false
recur: String,
due: DateTime,
vararg properties: PropertyValue<in Task?, *>,
afterComplete: Boolean = false
) = TaskMaker.newTask(
MakeItEasy.with(TaskMaker.RECUR, recur),
MakeItEasy.with(TaskMaker.AFTER_COMPLETE, afterComplete),

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

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

Loading…
Cancel
Save