diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 6466fb008..af1e89a18 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -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) diff --git a/app/src/androidTest/java/com/todoroo/astrid/model/TaskTest.kt b/app/src/androidTest/java/com/todoroo/astrid/model/TaskTest.kt index 460497df9..4df4aab25 100644 --- a/app/src/androidTest/java/com/todoroo/astrid/model/TaskTest.kt +++ b/app/src/androidTest/java/com/todoroo/astrid/model/TaskTest.kt @@ -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) } } diff --git a/app/src/androidTest/java/com/todoroo/astrid/service/TaskCreatorTest.kt b/app/src/androidTest/java/com/todoroo/astrid/service/TaskCreatorTest.kt index 16193d49d..a5c4765fc 100644 --- a/app/src/androidTest/java/com/todoroo/astrid/service/TaskCreatorTest.kt +++ b/app/src/androidTest/java/com/todoroo/astrid/service/TaskCreatorTest.kt @@ -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 ) } diff --git a/app/src/androidTest/java/org/tasks/data/DeletionDaoTests.kt b/app/src/androidTest/java/org/tasks/data/DeletionDaoTests.kt index c64ee5533..a0568a924 100644 --- a/app/src/androidTest/java/org/tasks/data/DeletionDaoTests.kt +++ b/app/src/androidTest/java/org/tasks/data/DeletionDaoTests.kt @@ -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 diff --git a/app/src/androidTest/java/org/tasks/opentasks/TestOpenTaskDao.kt b/app/src/androidTest/java/org/tasks/opentasks/TestOpenTaskDao.kt index 2fcd12f36..f4491eb0a 100644 --- a/app/src/androidTest/java/org/tasks/opentasks/TestOpenTaskDao.kt +++ b/app/src/androidTest/java/org/tasks/opentasks/TestOpenTaskDao.kt @@ -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 { val uri = taskLists.buildUpon() .appendQueryParameter(TaskContract.CALLER_IS_SYNCADAPTER, "true") diff --git a/app/src/androidTest/java/org/tasks/ui/editviewmodel/BaseTaskEditViewModelTest.kt b/app/src/androidTest/java/org/tasks/ui/editviewmodel/BaseTaskEditViewModelTest.kt index bc2f570f0..cb5106cbc 100644 --- a/app/src/androidTest/java/org/tasks/ui/editviewmodel/BaseTaskEditViewModelTest.kt +++ b/app/src/androidTest/java/org/tasks/ui/editviewmodel/BaseTaskEditViewModelTest.kt @@ -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 diff --git a/app/src/androidTest/java/org/tasks/ui/editviewmodel/ReminderTests.kt b/app/src/androidTest/java/org/tasks/ui/editviewmodel/ReminderTests.kt index 35db9f919..0a62c457a 100644 --- a/app/src/androidTest/java/org/tasks/ui/editviewmodel/ReminderTests.kt +++ b/app/src/androidTest/java/org/tasks/ui/editviewmodel/ReminderTests.kt @@ -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() ) diff --git a/app/src/main/java/com/todoroo/andlib/utility/DateUtilities.java b/app/src/main/java/com/todoroo/andlib/utility/DateUtilities.java index 4cdb5242a..9e6918c8c 100644 --- a/app/src/main/java/com/todoroo/andlib/utility/DateUtilities.java +++ b/app/src/main/java/com/todoroo/andlib/utility/DateUtilities.java @@ -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; diff --git a/app/src/main/java/com/todoroo/astrid/activity/MainActivity.kt b/app/src/main/java/com/todoroo/astrid/activity/MainActivity.kt index 105037fdb..3b5d530b1 100644 --- a/app/src/main/java/com/todoroo/astrid/activity/MainActivity.kt +++ b/app/src/main/java/com/todoroo/astrid/activity/MainActivity.kt @@ -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 diff --git a/app/src/main/java/com/todoroo/astrid/activity/MainActivityViewModel.kt b/app/src/main/java/com/todoroo/astrid/activity/MainActivityViewModel.kt index 4f8d67066..99aecfa5b 100644 --- a/app/src/main/java/com/todoroo/astrid/activity/MainActivityViewModel.kt +++ b/app/src/main/java/com/todoroo/astrid/activity/MainActivityViewModel.kt @@ -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 diff --git a/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.kt b/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.kt index a3e4f2db2..1ba24694d 100644 --- a/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.kt +++ b/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.kt @@ -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 diff --git a/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.kt b/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.kt index 4338a51da..dfd1f16ab 100644 --- a/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.kt +++ b/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.kt @@ -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) diff --git a/app/src/main/java/com/todoroo/astrid/api/CaldavFilter.kt b/app/src/main/java/com/todoroo/astrid/api/CaldavFilter.kt index 4f708cf9f..66e2b7c9f 100644 --- a/app/src/main/java/com/todoroo/astrid/api/CaldavFilter.kt +++ b/app/src/main/java/com/todoroo/astrid/api/CaldavFilter.kt @@ -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 diff --git a/app/src/main/java/com/todoroo/astrid/api/Filter.kt b/app/src/main/java/com/todoroo/astrid/api/Filter.kt index 1f4a4c1de..ce3669848 100644 --- a/app/src/main/java/com/todoroo/astrid/api/Filter.kt +++ b/app/src/main/java/com/todoroo/astrid/api/Filter.kt @@ -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") diff --git a/app/src/main/java/com/todoroo/astrid/api/GtasksFilter.kt b/app/src/main/java/com/todoroo/astrid/api/GtasksFilter.kt index 1d44768b6..20c73b757 100644 --- a/app/src/main/java/com/todoroo/astrid/api/GtasksFilter.kt +++ b/app/src/main/java/com/todoroo/astrid/api/GtasksFilter.kt @@ -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 diff --git a/app/src/main/java/com/todoroo/astrid/api/TagFilter.kt b/app/src/main/java/com/todoroo/astrid/api/TagFilter.kt index 28d91599d..1b1904015 100644 --- a/app/src/main/java/com/todoroo/astrid/api/TagFilter.kt +++ b/app/src/main/java/com/todoroo/astrid/api/TagFilter.kt @@ -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 diff --git a/app/src/main/java/com/todoroo/astrid/core/SortHelper.java b/app/src/main/java/com/todoroo/astrid/core/SortHelper.java index a89306f6d..2d1683f00 100644 --- a/app/src/main/java/com/todoroo/astrid/core/SortHelper.java +++ b/app/src/main/java/com/todoroo/astrid/core/SortHelper.java @@ -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); diff --git a/app/src/main/java/com/todoroo/astrid/dao/TaskDao.kt b/app/src/main/java/com/todoroo/astrid/dao/TaskDao.kt index 683a63d40..22848b869 100644 --- a/app/src/main/java/com/todoroo/astrid/dao/TaskDao.kt +++ b/app/src/main/java/com/todoroo/astrid/dao/TaskDao.kt @@ -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 diff --git a/app/src/main/java/com/todoroo/astrid/data/SyncFlags.java b/app/src/main/java/com/todoroo/astrid/data/SyncFlags.java deleted file mode 100644 index 79eac8c65..000000000 --- a/app/src/main/java/com/todoroo/astrid/data/SyncFlags.java +++ /dev/null @@ -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"; -} diff --git a/app/src/main/java/com/todoroo/astrid/helper/UUIDHelper.java b/app/src/main/java/com/todoroo/astrid/helper/UUIDHelper.java deleted file mode 100644 index 2b5922f9b..000000000 --- a/app/src/main/java/com/todoroo/astrid/helper/UUIDHelper.java +++ /dev/null @@ -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); - } -} diff --git a/app/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.kt b/app/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.kt index ba29c2d0c..ec63bfbfe 100644 --- a/app/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.kt +++ b/app/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.kt @@ -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 diff --git a/app/src/main/java/com/todoroo/astrid/repeats/RepeatTaskHelper.kt b/app/src/main/java/com/todoroo/astrid/repeats/RepeatTaskHelper.kt index e95e90a44..1553c4c64 100644 --- a/app/src/main/java/com/todoroo/astrid/repeats/RepeatTaskHelper.kt +++ b/app/src/main/java/com/todoroo/astrid/repeats/RepeatTaskHelper.kt @@ -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) { diff --git a/app/src/main/java/com/todoroo/astrid/service/TaskCompleter.kt b/app/src/main/java/com/todoroo/astrid/service/TaskCompleter.kt index af638475a..58d5d8cf7 100644 --- a/app/src/main/java/com/todoroo/astrid/service/TaskCompleter.kt +++ b/app/src/main/java/com/todoroo/astrid/service/TaskCompleter.kt @@ -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 { diff --git a/app/src/main/java/com/todoroo/astrid/service/TaskCreator.kt b/app/src/main/java/com/todoroo/astrid/service/TaskCreator.kt index 92615fa79..59d29a176 100644 --- a/app/src/main/java/com/todoroo/astrid/service/TaskCreator.kt +++ b/app/src/main/java/com/todoroo/astrid/service/TaskCreator.kt @@ -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(Place.KEY)!!) if (place != null) { - locationDao.insert(Geofence(place.uid, preferences)) + locationDao.insert(createGeofence(place.uid, preferences)) } } taskDao.save(task, null) diff --git a/app/src/main/java/com/todoroo/astrid/service/TaskMover.kt b/app/src/main/java/com/todoroo/astrid/service/TaskMover.kt index 378d9a689..03d9ed8f0 100644 --- a/app/src/main/java/com/todoroo/astrid/service/TaskMover.kt +++ b/app/src/main/java/com/todoroo/astrid/service/TaskMover.kt @@ -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 diff --git a/app/src/main/java/com/todoroo/astrid/utility/TitleParser.kt b/app/src/main/java/com/todoroo/astrid/utility/TitleParser.kt index 9855cedb3..5de85c1ad 100644 --- a/app/src/main/java/com/todoroo/astrid/utility/TitleParser.kt +++ b/app/src/main/java/com/todoroo/astrid/utility/TitleParser.kt @@ -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 diff --git a/app/src/main/java/org/tasks/Notifier.kt b/app/src/main/java/org/tasks/Notifier.kt index 91a1d666f..0af23e0aa 100644 --- a/app/src/main/java/org/tasks/Notifier.kt +++ b/app/src/main/java/org/tasks/Notifier.kt @@ -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 } } diff --git a/app/src/main/java/org/tasks/activities/DateAndTimePickerActivity.kt b/app/src/main/java/org/tasks/activities/DateAndTimePickerActivity.kt index 70d85c0e3..4a1f766b4 100644 --- a/app/src/main/java/org/tasks/activities/DateAndTimePickerActivity.kt +++ b/app/src/main/java/org/tasks/activities/DateAndTimePickerActivity.kt @@ -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 diff --git a/app/src/main/java/org/tasks/activities/FilterSettingsActivity.kt b/app/src/main/java/org/tasks/activities/FilterSettingsActivity.kt index 2d21564dc..fffed5fc6 100644 --- a/app/src/main/java/org/tasks/activities/FilterSettingsActivity.kt +++ b/app/src/main/java/org/tasks/activities/FilterSettingsActivity.kt @@ -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 diff --git a/app/src/main/java/org/tasks/activities/NavigationDrawerCustomization.kt b/app/src/main/java/org/tasks/activities/NavigationDrawerCustomization.kt index 9494da6ea..ff3beb980 100644 --- a/app/src/main/java/org/tasks/activities/NavigationDrawerCustomization.kt +++ b/app/src/main/java/org/tasks/activities/NavigationDrawerCustomization.kt @@ -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 diff --git a/app/src/main/java/org/tasks/activities/PlaceSettingsActivity.kt b/app/src/main/java/org/tasks/activities/PlaceSettingsActivity.kt index c04ba710a..de93ab7fb 100644 --- a/app/src/main/java/org/tasks/activities/PlaceSettingsActivity.kt +++ b/app/src/main/java/org/tasks/activities/PlaceSettingsActivity.kt @@ -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 diff --git a/app/src/main/java/org/tasks/backup/BackupContainer.kt b/app/src/main/java/org/tasks/backup/BackupContainer.kt index f9b05d98a..ec98c0d96 100644 --- a/app/src/main/java/org/tasks/backup/BackupContainer.kt +++ b/app/src/main/java/org/tasks/backup/BackupContainer.kt @@ -22,15 +22,15 @@ class BackupContainer( val googleTaskLists: List? = emptyList(), ) { class TaskBackup( - val task: Task, - val alarms: List, - val geofences: List?, - val tags: List, - val comments: List, - val attachments: List?, - val caldavTasks: List?, - val vtodo: String?, - val google: List = emptyList(), + val task: Task, + val alarms: List, + val geofences: List?, + val tags: List, + val comments: List, + val attachments: List?, + val caldavTasks: List?, + val vtodo: String?, + val google: List = emptyList(), ) { val locations: List = emptyList() } diff --git a/app/src/main/java/org/tasks/backup/TasksJsonExporter.kt b/app/src/main/java/org/tasks/backup/TasksJsonExporter.kt index 841f9468b..164595687 100755 --- a/app/src/main/java/org/tasks/backup/TasksJsonExporter.kt +++ b/app/src/main/java/org/tasks/backup/TasksJsonExporter.kt @@ -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 = HashMap() data["version"] = BuildConfig.VERSION_CODE - data["timestamp"] = System.currentTimeMillis() + data["timestamp"] = currentTimeMillis() data["data"] = BackupContainer( taskBackups, locationDao.getPlaces(), diff --git a/app/src/main/java/org/tasks/billing/Inventory.kt b/app/src/main/java/org/tasks/billing/Inventory.kt index 6e1cf1c67..a23bb09ac 100644 --- a/app/src/main/java/org/tasks/billing/Inventory.kt +++ b/app/src/main/java/org/tasks/billing/Inventory.kt @@ -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 diff --git a/app/src/main/java/org/tasks/caldav/CaldavClientProvider.kt b/app/src/main/java/org/tasks/caldav/CaldavClientProvider.kt index 8c6061bd4..e14f4349e 100644 --- a/app/src/main/java/org/tasks/caldav/CaldavClientProvider.kt +++ b/app/src/main/java/org/tasks/caldav/CaldavClientProvider.kt @@ -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 diff --git a/app/src/main/java/org/tasks/caldav/iCalendar.kt b/app/src/main/java/org/tasks/caldav/iCalendar.kt index e0c432149..3a7722b20 100644 --- a/app/src/main/java/org/tasks/caldav/iCalendar.kt +++ b/app/src/main/java/org/tasks/caldav/iCalendar.kt @@ -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) ) diff --git a/app/src/main/java/org/tasks/caldav/iCalendarMerge.kt b/app/src/main/java/org/tasks/caldav/iCalendarMerge.kt index b59498d86..3610ee0f9 100644 --- a/app/src/main/java/org/tasks/caldav/iCalendarMerge.kt +++ b/app/src/main/java/org/tasks/caldav/iCalendarMerge.kt @@ -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 diff --git a/app/src/main/java/org/tasks/compose/edit/SubtaskRow.kt b/app/src/main/java/org/tasks/compose/edit/SubtaskRow.kt index ffabb28f5..684486aa3 100644 --- a/app/src/main/java/org/tasks/compose/edit/SubtaskRow.kt +++ b/app/src/main/java/org/tasks/compose/edit/SubtaskRow.kt @@ -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( diff --git a/app/src/main/java/org/tasks/compose/edit/TimerRow.kt b/app/src/main/java/org/tasks/compose/edit/TimerRow.kt index b0e31f0b9..6f93da337 100644 --- a/app/src/main/java/org/tasks/compose/edit/TimerRow.kt +++ b/app/src/main/java/org/tasks/compose/edit/TimerRow.kt @@ -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 = {}) } } \ No newline at end of file diff --git a/app/src/main/java/org/tasks/dashclock/DashClockExtension.kt b/app/src/main/java/org/tasks/dashclock/DashClockExtension.kt index 8da95f12d..875abdc49 100644 --- a/app/src/main/java/org/tasks/dashclock/DashClockExtension.kt +++ b/app/src/main/java/org/tasks/dashclock/DashClockExtension.kt @@ -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 diff --git a/app/src/main/java/org/tasks/data/CaldavAccountExtensions.kt b/app/src/main/java/org/tasks/data/CaldavAccountExtensions.kt new file mode 100644 index 000000000..ec35f75c0 --- /dev/null +++ b/app/src/main/java/org/tasks/data/CaldavAccountExtensions.kt @@ -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 = 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 + 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) ?: "" +} diff --git a/app/src/main/java/org/tasks/data/CaldavDaoExtensions.kt b/app/src/main/java/org/tasks/data/CaldavDaoExtensions.kt new file mode 100644 index 000000000..66357dc92 --- /dev/null +++ b/app/src/main/java/org/tasks/data/CaldavDaoExtensions.kt @@ -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) + } \ No newline at end of file diff --git a/app/src/main/java/org/tasks/data/GoogleTaskFiltersExtensions.kt b/app/src/main/java/org/tasks/data/GoogleTaskFiltersExtensions.kt new file mode 100644 index 000000000..a574fa555 --- /dev/null +++ b/app/src/main/java/org/tasks/data/GoogleTaskFiltersExtensions.kt @@ -0,0 +1,8 @@ +package org.tasks.data + +import com.todoroo.astrid.api.GtasksFilter + +fun GoogleTaskFilters.toGtasksFilter(): GtasksFilter = GtasksFilter( + list = googleTaskList, + count = count, +) diff --git a/app/src/main/java/org/tasks/data/LocationDaoExtensions.kt b/app/src/main/java/org/tasks/data/LocationDaoExtensions.kt new file mode 100644 index 000000000..3128037b3 --- /dev/null +++ b/app/src/main/java/org/tasks/data/LocationDaoExtensions.kt @@ -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(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, +) diff --git a/app/src/main/java/org/tasks/data/LocationExtensions.kt b/app/src/main/java/org/tasks/data/LocationExtensions.kt new file mode 100644 index 000000000..c0cf71260 --- /dev/null +++ b/app/src/main/java/org/tasks/data/LocationExtensions.kt @@ -0,0 +1,7 @@ +package org.tasks.data + +import android.content.Context + +fun Location.open(context: Context?) { + place.open(context) +} diff --git a/app/src/main/java/org/tasks/data/LocationFiltersExtensions.kt b/app/src/main/java/org/tasks/data/LocationFiltersExtensions.kt new file mode 100644 index 000000000..9dce6c314 --- /dev/null +++ b/app/src/main/java/org/tasks/data/LocationFiltersExtensions.kt @@ -0,0 +1,8 @@ +package org.tasks.data + +import org.tasks.filters.PlaceFilter + +fun LocationFilters.toLocationFilter(): PlaceFilter = PlaceFilter( + place = place, + count = count, +) diff --git a/app/src/main/java/org/tasks/data/MyAndroidTask.kt b/app/src/main/java/org/tasks/data/MyAndroidTask.kt index ada25eab7..f1cfcd2e5 100644 --- a/app/src/main/java/org/tasks/data/MyAndroidTask.kt +++ b/app/src/main/java/org/tasks/data/MyAndroidTask.kt @@ -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) { diff --git a/app/src/main/java/org/tasks/data/PlaceExtensions.kt b/app/src/main/java/org/tasks/data/PlaceExtensions.kt new file mode 100644 index 000000000..846b87a82 --- /dev/null +++ b/app/src/main/java/org/tasks/data/PlaceExtensions.kt @@ -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) diff --git a/app/src/main/java/org/tasks/data/TagDataDaoExtensions.kt b/app/src/main/java/org/tasks/data/TagDataDaoExtensions.kt new file mode 100644 index 000000000..e839775bd --- /dev/null +++ b/app/src/main/java/org/tasks/data/TagDataDaoExtensions.kt @@ -0,0 +1,23 @@ +package org.tasks.data + +import org.tasks.filters.AlphanumComparator + +suspend fun TagDataDao.searchTags(query: String): List = searchTagsInternal("%$query%").sort() + +private val COMPARATOR = Comparator { 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.sort(): List = + if (all { it.order == NO_ORDER }) { + sortedWith(AlphanumComparator.TAGDATA) + } else { + sortedWith(COMPARATOR) + } diff --git a/app/src/main/java/org/tasks/data/TagFiltersExtensions.kt b/app/src/main/java/org/tasks/data/TagFiltersExtensions.kt new file mode 100644 index 000000000..a775734db --- /dev/null +++ b/app/src/main/java/org/tasks/data/TagFiltersExtensions.kt @@ -0,0 +1,8 @@ +package org.tasks.data + +import com.todoroo.astrid.api.TagFilter + +fun TagFilters.toTagFilter(): TagFilter = TagFilter( + tagData = tagData, + count = count, +) diff --git a/app/src/main/java/org/tasks/data/TaskDaoExtensions.kt b/app/src/main/java/org/tasks/data/TaskDaoExtensions.kt new file mode 100644 index 000000000..f3384cd11 --- /dev/null +++ b/app/src/main/java/org/tasks/data/TaskDaoExtensions.kt @@ -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 = + 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 = fetchFiltered(filter.sql!!) + +suspend fun TaskDao.fetchFiltered(queryTemplate: String): List { + 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()) diff --git a/app/src/main/java/org/tasks/data/TaskExtensions.kt b/app/src/main/java/org/tasks/data/TaskExtensions.kt new file mode 100644 index 000000000..d715ce1fd --- /dev/null +++ b/app/src/main/java/org/tasks/data/TaskExtensions.kt @@ -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 +} diff --git a/app/src/main/java/org/tasks/date/DateTimeUtils.kt b/app/src/main/java/org/tasks/date/DateTimeUtils.kt index a725a27a4..38e603feb 100644 --- a/app/src/main/java/org/tasks/date/DateTimeUtils.kt +++ b/app/src/main/java/org/tasks/date/DateTimeUtils.kt @@ -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 diff --git a/app/src/main/java/org/tasks/db/Migrations.kt b/app/src/main/java/org/tasks/db/Migrations.kt index f436739c3..e97f2dbf9 100644 --- a/app/src/main/java/org/tasks/db/Migrations.kt +++ b/app/src/main/java/org/tasks/db/Migrations.kt @@ -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") diff --git a/app/src/main/java/org/tasks/dialogs/DateTimePicker.kt b/app/src/main/java/org/tasks/dialogs/DateTimePicker.kt index 60e490643..85e3ff909 100644 --- a/app/src/main/java/org/tasks/dialogs/DateTimePicker.kt +++ b/app/src/main/java/org/tasks/dialogs/DateTimePicker.kt @@ -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 ) diff --git a/app/src/main/java/org/tasks/dialogs/MyDatePickerDialog.kt b/app/src/main/java/org/tasks/dialogs/MyDatePickerDialog.kt index ca6d61e8f..53f3b6a2c 100644 --- a/app/src/main/java/org/tasks/dialogs/MyDatePickerDialog.kt +++ b/app/src/main/java/org/tasks/dialogs/MyDatePickerDialog.kt @@ -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 diff --git a/app/src/main/java/org/tasks/etebase/EtebaseAccountSettingsActivity.kt b/app/src/main/java/org/tasks/etebase/EtebaseAccountSettingsActivity.kt index 05b25f828..1087296d0 100644 --- a/app/src/main/java/org/tasks/etebase/EtebaseAccountSettingsActivity.kt +++ b/app/src/main/java/org/tasks/etebase/EtebaseAccountSettingsActivity.kt @@ -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 diff --git a/app/src/main/java/org/tasks/etebase/EtebaseClient.kt b/app/src/main/java/org/tasks/etebase/EtebaseClient.kt index c82361ebb..1c3784832 100644 --- a/app/src/main/java/org/tasks/etebase/EtebaseClient.kt +++ b/app/src/main/java/org/tasks/etebase/EtebaseClient.kt @@ -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( diff --git a/app/src/main/java/org/tasks/etebase/EtebaseClientProvider.kt b/app/src/main/java/org/tasks/etebase/EtebaseClientProvider.kt index dc1f0d9a3..47a5532dc 100644 --- a/app/src/main/java/org/tasks/etebase/EtebaseClientProvider.kt +++ b/app/src/main/java/org/tasks/etebase/EtebaseClientProvider.kt @@ -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 diff --git a/app/src/main/java/org/tasks/etebase/EtebaseSynchronizer.kt b/app/src/main/java/org/tasks/etebase/EtebaseSynchronizer.kt index 5c2191165..c6a1deacf 100644 --- a/app/src/main/java/org/tasks/etebase/EtebaseSynchronizer.kt +++ b/app/src/main/java/org/tasks/etebase/EtebaseSynchronizer.kt @@ -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 diff --git a/app/src/main/java/org/tasks/filters/CaldavFilters.kt b/app/src/main/java/org/tasks/filters/CaldavFilters.kt deleted file mode 100644 index 683addbea..000000000 --- a/app/src/main/java/org/tasks/filters/CaldavFilters.kt +++ /dev/null @@ -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, - ) -} diff --git a/app/src/main/java/org/tasks/filters/FilterProvider.kt b/app/src/main/java/org/tasks/filters/FilterProvider.kt index f01d54ff8..e4fb13aae 100644 --- a/app/src/main/java/org/tasks/filters/FilterProvider.kt +++ b/app/src/main/java/org/tasks/filters/FilterProvider.kt @@ -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 { diff --git a/app/src/main/java/org/tasks/filters/GoogleTaskFilters.kt b/app/src/main/java/org/tasks/filters/GoogleTaskFilters.kt deleted file mode 100644 index e264b2a53..000000000 --- a/app/src/main/java/org/tasks/filters/GoogleTaskFilters.kt +++ /dev/null @@ -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, - ) -} diff --git a/app/src/main/java/org/tasks/filters/LocationFilters.kt b/app/src/main/java/org/tasks/filters/LocationFilters.kt deleted file mode 100644 index bb9466a61..000000000 --- a/app/src/main/java/org/tasks/filters/LocationFilters.kt +++ /dev/null @@ -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, - ) -} diff --git a/app/src/main/java/org/tasks/filters/NotificationsFilter.kt b/app/src/main/java/org/tasks/filters/NotificationsFilter.kt index 5e5b9c9a6..367d438ce 100644 --- a/app/src/main/java/org/tasks/filters/NotificationsFilter.kt +++ b/app/src/main/java/org/tasks/filters/NotificationsFilter.kt @@ -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( diff --git a/app/src/main/java/org/tasks/filters/PlaceFilter.kt b/app/src/main/java/org/tasks/filters/PlaceFilter.kt index f4dc0d70a..b4d1169af 100644 --- a/app/src/main/java/org/tasks/filters/PlaceFilter.kt +++ b/app/src/main/java/org/tasks/filters/PlaceFilter.kt @@ -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 diff --git a/app/src/main/java/org/tasks/filters/TagFilters.kt b/app/src/main/java/org/tasks/filters/TagFilters.kt deleted file mode 100644 index de46e2062..000000000 --- a/app/src/main/java/org/tasks/filters/TagFilters.kt +++ /dev/null @@ -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, - ) -} diff --git a/app/src/main/java/org/tasks/gtasks/GoogleTaskSynchronizer.kt b/app/src/main/java/org/tasks/gtasks/GoogleTaskSynchronizer.kt index a6ca939c5..e37ab4625 100644 --- a/app/src/main/java/org/tasks/gtasks/GoogleTaskSynchronizer.kt +++ b/app/src/main/java/org/tasks/gtasks/GoogleTaskSynchronizer.kt @@ -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 diff --git a/app/src/main/java/org/tasks/injection/ApplicationModule.kt b/app/src/main/java/org/tasks/injection/ApplicationModule.kt index 6d8d8659e..c3fdb2717 100644 --- a/app/src/main/java/org/tasks/injection/ApplicationModule.kt +++ b/app/src/main/java/org/tasks/injection/ApplicationModule.kt @@ -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 diff --git a/app/src/main/java/org/tasks/jobs/AlarmEntry.java b/app/src/main/java/org/tasks/jobs/AlarmEntry.java index a2c6e9877..5c321761a 100644 --- a/app/src/main/java/org/tasks/jobs/AlarmEntry.java +++ b/app/src/main/java/org/tasks/jobs/AlarmEntry.java @@ -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; diff --git a/app/src/main/java/org/tasks/jobs/ReverseGeocodeWork.kt b/app/src/main/java/org/tasks/jobs/ReverseGeocodeWork.kt index 8d406dc5a..9fcc050b5 100644 --- a/app/src/main/java/org/tasks/jobs/ReverseGeocodeWork.kt +++ b/app/src/main/java/org/tasks/jobs/ReverseGeocodeWork.kt @@ -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 diff --git a/app/src/main/java/org/tasks/jobs/SyncWork.kt b/app/src/main/java/org/tasks/jobs/SyncWork.kt index 13900deed..a34e282d9 100644 --- a/app/src/main/java/org/tasks/jobs/SyncWork.kt +++ b/app/src/main/java/org/tasks/jobs/SyncWork.kt @@ -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 { diff --git a/app/src/main/java/org/tasks/jobs/WorkManagerImpl.kt b/app/src/main/java/org/tasks/jobs/WorkManagerImpl.kt index a5ffde63f..3f763ebd1 100644 --- a/app/src/main/java/org/tasks/jobs/WorkManagerImpl.kt +++ b/app/src/main/java/org/tasks/jobs/WorkManagerImpl.kt @@ -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())) } diff --git a/app/src/main/java/org/tasks/locale/receiver/TaskerTaskCreator.kt b/app/src/main/java/org/tasks/locale/receiver/TaskerTaskCreator.kt index da8dd38b9..5973d3dfa 100644 --- a/app/src/main/java/org/tasks/locale/receiver/TaskerTaskCreator.kt +++ b/app/src/main/java/org/tasks/locale/receiver/TaskerTaskCreator.kt @@ -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) diff --git a/app/src/main/java/org/tasks/location/LocationPickerActivity.kt b/app/src/main/java/org/tasks/location/LocationPickerActivity.kt index 55b60829f..31284b74e 100644 --- a/app/src/main/java/org/tasks/location/LocationPickerActivity.kt +++ b/app/src/main/java/org/tasks/location/LocationPickerActivity.kt @@ -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 diff --git a/app/src/main/java/org/tasks/notifications/NotificationManager.kt b/app/src/main/java/org/tasks/notifications/NotificationManager.kt index b877dd369..31795efeb 100644 --- a/app/src/main/java/org/tasks/notifications/NotificationManager.kt +++ b/app/src/main/java/org/tasks/notifications/NotificationManager.kt @@ -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, - alert: Boolean, - nonstop: Boolean, - fiveTimes: Boolean) { + newNotifications: List, + 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, - alert: Boolean, - nonstop: Boolean, - fiveTimes: Boolean, - useGroupKey: Boolean + notifications: List, + 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) diff --git a/app/src/main/java/org/tasks/notifications/Throttle.kt b/app/src/main/java/org/tasks/notifications/Throttle.kt index f53076094..16c193b05 100644 --- a/app/src/main/java/org/tasks/notifications/Throttle.kt +++ b/app/src/main/java/org/tasks/notifications/Throttle.kt @@ -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 diff --git a/app/src/main/java/org/tasks/preferences/DefaultFilterProvider.kt b/app/src/main/java/org/tasks/preferences/DefaultFilterProvider.kt index 6f689e8e5..dfc11bd01 100644 --- a/app/src/main/java/org/tasks/preferences/DefaultFilterProvider.kt +++ b/app/src/main/java/org/tasks/preferences/DefaultFilterProvider.kt @@ -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 diff --git a/app/src/main/java/org/tasks/preferences/fragments/MainSettingsFragment.kt b/app/src/main/java/org/tasks/preferences/fragments/MainSettingsFragment.kt index f0d941e7e..3a9562d10 100644 --- a/app/src/main/java/org/tasks/preferences/fragments/MainSettingsFragment.kt +++ b/app/src/main/java/org/tasks/preferences/fragments/MainSettingsFragment.kt @@ -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 diff --git a/app/src/main/java/org/tasks/receivers/RefreshReceiver.kt b/app/src/main/java/org/tasks/receivers/RefreshReceiver.kt index def2b7a22..6955315a7 100644 --- a/app/src/main/java/org/tasks/receivers/RefreshReceiver.kt +++ b/app/src/main/java/org/tasks/receivers/RefreshReceiver.kt @@ -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 diff --git a/app/src/main/java/org/tasks/repeats/CustomRecurrenceViewModel.kt b/app/src/main/java/org/tasks/repeats/CustomRecurrenceViewModel.kt index 4c7b8e923..c3a2f844b 100644 --- a/app/src/main/java/org/tasks/repeats/CustomRecurrenceViewModel.kt +++ b/app/src/main/java/org/tasks/repeats/CustomRecurrenceViewModel.kt @@ -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(EXTRA_DATE) ?.takeIf { it > 0 } - ?: System.currentTimeMillis().startOfDay() + ?: currentTimeMillis().startOfDay() val isMicrosoftTask = savedStateHandle.get(EXTRA_ACCOUNT_TYPE) == TYPE_MICROSOFT val frequencies = if (isMicrosoftTask) FREQ_MICROSOFT else FREQ_ALL _state.update { state -> diff --git a/app/src/main/java/org/tasks/sync/SyncAdapters.kt b/app/src/main/java/org/tasks/sync/SyncAdapters.kt index ac5bf7c74..b5e295179 100644 --- a/app/src/main/java/org/tasks/sync/SyncAdapters.kt +++ b/app/src/main/java/org/tasks/sync/SyncAdapters.kt @@ -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) diff --git a/app/src/main/java/org/tasks/sync/microsoft/MicrosoftConverter.kt b/app/src/main/java/org/tasks/sync/microsoft/MicrosoftConverter.kt index 5769422bc..70eb2f4a8 100644 --- a/app/src/main/java/org/tasks/sync/microsoft/MicrosoftConverter.kt +++ b/app/src/main/java/org/tasks/sync/microsoft/MicrosoftConverter.kt @@ -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 diff --git a/app/src/main/java/org/tasks/tags/TagPickerViewModel.kt b/app/src/main/java/org/tasks/tags/TagPickerViewModel.kt index 47f2101d9..3f728913d 100644 --- a/app/src/main/java/org/tasks/tags/TagPickerViewModel.kt +++ b/app/src/main/java/org/tasks/tags/TagPickerViewModel.kt @@ -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 diff --git a/app/src/main/java/org/tasks/tasklist/TaskViewHolder.kt b/app/src/main/java/org/tasks/tasklist/TaskViewHolder.kt index 463a30941..e37e5d27a 100644 --- a/app/src/main/java/org/tasks/tasklist/TaskViewHolder.kt +++ b/app/src/main/java/org/tasks/tasklist/TaskViewHolder.kt @@ -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 diff --git a/app/src/main/java/org/tasks/time/DateTime.java b/app/src/main/java/org/tasks/time/DateTime.java index 7fc9e9507..9c8aea9b9 100644 --- a/app/src/main/java/org/tasks/time/DateTime.java +++ b/app/src/main/java/org/tasks/time/DateTime.java @@ -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() { diff --git a/app/src/main/java/org/tasks/time/DateTimeUtils.kt b/app/src/main/java/org/tasks/time/DateTimeUtils.kt index 0555c8844..634242041 100644 --- a/app/src/main/java/org/tasks/time/DateTimeUtils.kt +++ b/app/src/main/java/org/tasks/time/DateTimeUtils.kt @@ -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 diff --git a/app/src/main/java/org/tasks/time/FixedMillisProvider.java b/app/src/main/java/org/tasks/time/FixedMillisProvider.java deleted file mode 100644 index 470ee13a6..000000000 --- a/app/src/main/java/org/tasks/time/FixedMillisProvider.java +++ /dev/null @@ -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; - } -} diff --git a/app/src/main/java/org/tasks/time/MillisProvider.java b/app/src/main/java/org/tasks/time/MillisProvider.java deleted file mode 100644 index 408412bfb..000000000 --- a/app/src/main/java/org/tasks/time/MillisProvider.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.tasks.time; - -interface MillisProvider { - - long getMillis(); -} diff --git a/app/src/main/java/org/tasks/time/SystemMillisProvider.java b/app/src/main/java/org/tasks/time/SystemMillisProvider.java deleted file mode 100644 index 386143abe..000000000 --- a/app/src/main/java/org/tasks/time/SystemMillisProvider.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.tasks.time; - -public class SystemMillisProvider implements MillisProvider { - - @Override - public long getMillis() { - return System.currentTimeMillis(); - } -} diff --git a/app/src/main/java/org/tasks/ui/LocationControlSet.kt b/app/src/main/java/org/tasks/ui/LocationControlSet.kt index feb4d2d7d..2b895d17d 100644 --- a/app/src/main/java/org/tasks/ui/LocationControlSet.kt +++ b/app/src/main/java/org/tasks/ui/LocationControlSet.kt @@ -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( diff --git a/app/src/main/java/org/tasks/ui/TaskEditViewModel.kt b/app/src/main/java/org/tasks/ui/TaskEditViewModel.kt index 8d1ade3cd..ff751ee6d 100644 --- a/app/src/main/java/org/tasks/ui/TaskEditViewModel.kt +++ b/app/src/main/java/org/tasks/ui/TaskEditViewModel.kt @@ -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() } diff --git a/app/src/main/java/org/tasks/ui/TaskListViewModel.kt b/app/src/main/java/org/tasks/ui/TaskListViewModel.kt index 9135c63c5..54401a275 100644 --- a/app/src/main/java/org/tasks/ui/TaskListViewModel.kt +++ b/app/src/main/java/org/tasks/ui/TaskListViewModel.kt @@ -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 diff --git a/app/src/main/java/org/tasks/widget/TasksWidget.kt b/app/src/main/java/org/tasks/widget/TasksWidget.kt index b881edba7..35a703de7 100644 --- a/app/src/main/java/org/tasks/widget/TasksWidget.kt +++ b/app/src/main/java/org/tasks/widget/TasksWidget.kt @@ -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) diff --git a/app/src/main/java/org/tasks/widget/TasksWidgetViewFactory.kt b/app/src/main/java/org/tasks/widget/TasksWidgetViewFactory.kt index 54e79df7b..e98e41c72 100644 --- a/app/src/main/java/org/tasks/widget/TasksWidgetViewFactory.kt +++ b/app/src/main/java/org/tasks/widget/TasksWidgetViewFactory.kt @@ -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( diff --git a/app/src/main/java/org/tasks/widget/WidgetChipProvider.kt b/app/src/main/java/org/tasks/widget/WidgetChipProvider.kt index 6478b3471..3f2213d47 100644 --- a/app/src/main/java/org/tasks/widget/WidgetChipProvider.kt +++ b/app/src/main/java/org/tasks/widget/WidgetChipProvider.kt @@ -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) } diff --git a/app/src/test/java/com/todoroo/astrid/alarms/AlarmCalculatorTest.kt b/app/src/test/java/com/todoroo/astrid/alarms/AlarmCalculatorTest.kt index 4a007cbc1..22fccceba 100644 --- a/app/src/test/java/com/todoroo/astrid/alarms/AlarmCalculatorTest.kt +++ b/app/src/test/java/com/todoroo/astrid/alarms/AlarmCalculatorTest.kt @@ -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))), diff --git a/app/src/test/java/com/todoroo/astrid/data/TaskTest.kt b/app/src/test/java/com/todoroo/astrid/data/TaskTest.kt index 99e7a674d..9b401cec2 100644 --- a/app/src/test/java/com/todoroo/astrid/data/TaskTest.kt +++ b/app/src/test/java/com/todoroo/astrid/data/TaskTest.kt @@ -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 diff --git a/app/src/test/java/com/todoroo/astrid/repeats/RepeatTests.kt b/app/src/test/java/com/todoroo/astrid/repeats/RepeatTests.kt index 7bd1384e7..64fdda100 100644 --- a/app/src/test/java/com/todoroo/astrid/repeats/RepeatTests.kt +++ b/app/src/test/java/com/todoroo/astrid/repeats/RepeatTests.kt @@ -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, - afterComplete: Boolean = false + recur: String, + due: DateTime, + vararg properties: PropertyValue, + afterComplete: Boolean = false ) = TaskMaker.newTask( MakeItEasy.with(TaskMaker.RECUR, recur), MakeItEasy.with(TaskMaker.AFTER_COMPLETE, afterComplete), diff --git a/app/src/test/java/org/tasks/Freeze.kt b/app/src/test/java/org/tasks/Freeze.kt index e20801de9..d307a201f 100644 --- a/app/src/test/java/org/tasks/Freeze.kt +++ b/app/src/test/java/org/tasks/Freeze.kt @@ -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 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 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() } } } \ No newline at end of file diff --git a/app/src/test/java/org/tasks/SuspendFreeze.kt b/app/src/test/java/org/tasks/SuspendFreeze.kt index 67b20b0aa..c570534fe 100644 --- a/app/src/test/java/org/tasks/SuspendFreeze.kt +++ b/app/src/test/java/org/tasks/SuspendFreeze.kt @@ -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 SuspendFreeze { @@ -16,7 +18,7 @@ class SuspendFreeze { companion object { suspend fun freezeClock(run: suspend () -> T): T { - return freezeAt(DateTimeUtils.currentTimeMillis()).thawAfter(run) + return freezeAt(currentTimeMillis()).thawAfter(run) } suspend fun freezeAt(dateTime: DateTime, run: suspend () -> T): T { @@ -32,12 +34,12 @@ class SuspendFreeze { } fun freezeAt(millis: Long): SuspendFreeze { - DateTimeUtils.setCurrentMillisFixed(millis) + setCurrentMillisFixed(millis) return SuspendFreeze() } fun thaw() { - DateTimeUtils.setCurrentMillisSystem() + setCurrentMillisSystem() } } } \ No newline at end of file diff --git a/app/src/test/java/org/tasks/caldav/NextCloudTests.kt b/app/src/test/java/org/tasks/caldav/NextCloudTests.kt index 824c2db15..3980a4d12 100644 --- a/app/src/test/java/org/tasks/caldav/NextCloudTests.kt +++ b/app/src/test/java/org/tasks/caldav/NextCloudTests.kt @@ -6,8 +6,9 @@ import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test import org.tasks.TestUtilities.vtodo +import org.tasks.data.createDueDate import org.tasks.time.DateTime -import java.util.* +import java.util.TimeZone class NextCloudTests { private val defaultTimeZone = TimeZone.getDefault() @@ -50,7 +51,7 @@ class NextCloudTests { @Test fun readAllDayTask() { 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 ) } diff --git a/app/src/test/java/org/tasks/caldav/iCalendarMergeTest.kt b/app/src/test/java/org/tasks/caldav/iCalendarMergeTest.kt index 0bb582559..3030df682 100644 --- a/app/src/test/java/org/tasks/caldav/iCalendarMergeTest.kt +++ b/app/src/test/java/org/tasks/caldav/iCalendarMergeTest.kt @@ -4,13 +4,16 @@ package org.tasks.caldav import com.natpryce.makeiteasy.MakeItEasy.with import com.todoroo.astrid.data.Task.Companion.URGENCY_SPECIFIC_DAY -import com.todoroo.astrid.data.Task.Companion.createDueDate 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 net.fortuna.ical4j.model.property.Status -import org.junit.Assert.* +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue import org.junit.Test +import org.tasks.data.createDueDate import org.tasks.date.DateTimeUtils.newDateTime import org.tasks.makers.CaldavTaskMaker.REMOTE_PARENT import org.tasks.makers.CaldavTaskMaker.newCaldavTask diff --git a/app/src/test/java/org/tasks/date/DateTimeUtilsTest.kt b/app/src/test/java/org/tasks/date/DateTimeUtilsTest.kt index 82caf8765..3a231110d 100644 --- a/app/src/test/java/org/tasks/date/DateTimeUtilsTest.kt +++ b/app/src/test/java/org/tasks/date/DateTimeUtilsTest.kt @@ -4,7 +4,8 @@ import org.junit.Assert.assertEquals import org.junit.Test import org.tasks.Freeze.Companion.freezeAt import org.tasks.time.DateTime -import java.util.* +import org.tasks.time.DateTimeUtils2.currentTimeMillis +import java.util.TimeZone class DateTimeUtilsTest { private val now = DateTime(2014, 1, 1, 15, 17, 53, 0) @@ -12,7 +13,7 @@ class DateTimeUtilsTest { @Test fun testGetCurrentTime() { freezeAt(now) { - assertEquals(now.millis, org.tasks.time.DateTimeUtils.currentTimeMillis()) + assertEquals(now.millis, currentTimeMillis()) } } diff --git a/app/src/test/java/org/tasks/makers/RemoteGtaskListMaker.kt b/app/src/test/java/org/tasks/makers/RemoteGtaskListMaker.kt index 205d7ce8e..fac5d8aae 100644 --- a/app/src/test/java/org/tasks/makers/RemoteGtaskListMaker.kt +++ b/app/src/test/java/org/tasks/makers/RemoteGtaskListMaker.kt @@ -8,7 +8,7 @@ import com.natpryce.makeiteasy.Property.newProperty import com.natpryce.makeiteasy.PropertyLookup import com.natpryce.makeiteasy.PropertyValue import org.tasks.makers.Maker.make -import org.tasks.time.DateTimeUtils +import org.tasks.time.DateTimeUtils2.currentTimeMillis object RemoteGtaskListMaker { val REMOTE_ID: Property = newProperty() @@ -18,7 +18,7 @@ object RemoteGtaskListMaker { TaskList() .setId(lookup.valueOf(REMOTE_ID, "1")) .setTitle(lookup.valueOf(NAME, "Default")) - .setUpdated(DateTime(DateTimeUtils.currentTimeMillis()).toStringRfc3339()) + .setUpdated(DateTime(currentTimeMillis()).toStringRfc3339()) } fun newRemoteList(vararg properties: PropertyValue): TaskList { diff --git a/app/src/test/java/org/tasks/makers/TaskMaker.kt b/app/src/test/java/org/tasks/makers/TaskMaker.kt index 510db42b8..487583efc 100644 --- a/app/src/test/java/org/tasks/makers/TaskMaker.kt +++ b/app/src/test/java/org/tasks/makers/TaskMaker.kt @@ -8,6 +8,8 @@ import com.natpryce.makeiteasy.PropertyValue import com.todoroo.astrid.data.Task import com.todoroo.astrid.data.Task.Companion.HIDE_UNTIL_SPECIFIC_DAY import com.todoroo.astrid.data.Task.Companion.NO_UUID +import org.tasks.data.createDueDate +import org.tasks.data.createHideUntil import org.tasks.date.DateTimeUtils import org.tasks.makers.Maker.make import org.tasks.repeats.RecurrenceUtils.newRecur @@ -41,9 +43,9 @@ object TaskMaker { title = lookup.valueOf(TITLE, null as String?), priority = lookup.valueOf(PRIORITY, Task.Priority.NONE), dueDate = lookup.valueOf(DUE_DATE, null as DateTime?) - ?.let { Task.createDueDate(Task.URGENCY_SPECIFIC_DAY, it.millis) } + ?.let { createDueDate(Task.URGENCY_SPECIFIC_DAY, it.millis) } ?: lookup.valueOf(DUE_TIME, null as DateTime?) - ?.let { Task.createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME, it.millis) } + ?.let { createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME, it.millis) } ?: 0L, completionDate = lookup.valueOf(COMPLETION_TIME, null as DateTime?)?.millis ?: 0L, deletionDate = lookup.valueOf(DELETION_TIME, null as DateTime?)?.millis ?: 0L, diff --git a/app/src/test/java/org/tasks/notifications/ThrottleTest.kt b/app/src/test/java/org/tasks/notifications/ThrottleTest.kt index 9d1e9dfa8..21875a598 100644 --- a/app/src/test/java/org/tasks/notifications/ThrottleTest.kt +++ b/app/src/test/java/org/tasks/notifications/ThrottleTest.kt @@ -7,7 +7,7 @@ import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import org.tasks.Freeze -import org.tasks.time.DateTimeUtils +import org.tasks.time.DateTimeUtils2.currentTimeMillis @ExperimentalCoroutinesApi class ThrottleTest { @@ -22,7 +22,7 @@ class ThrottleTest { @Test fun dontThrottle() { throttle = Throttle(3, executor = SynchronousExecutor()) { sleep.add(it) } - val now = DateTimeUtils.currentTimeMillis() + val now = currentTimeMillis() runAt(now) runAt(now) runAt(now) @@ -33,7 +33,7 @@ class ThrottleTest { @Test fun throttleForOneMillisecond() { throttle = Throttle(3, executor = SynchronousExecutor()) { sleep.add(it) } - val now = DateTimeUtils.currentTimeMillis() + val now = currentTimeMillis() runAt(now) runAt(now) runAt(now) @@ -44,7 +44,7 @@ class ThrottleTest { @Test fun throttleForOneSecond() { throttle = Throttle(3, executor = SynchronousExecutor()) { sleep.add(it) } - val now = DateTimeUtils.currentTimeMillis() + val now = currentTimeMillis() runAt(now) runAt(now) runAt(now) @@ -55,7 +55,7 @@ class ThrottleTest { @Test fun throttleMultiple() { throttle = Throttle(3, executor = SynchronousExecutor()) { sleep.add(it) } - val now = DateTimeUtils.currentTimeMillis() + val now = currentTimeMillis() runAt(now) runAt(now + 200) runAt(now + 600) diff --git a/data/.gitignore b/data/.gitignore new file mode 100644 index 000000000..42afabfd2 --- /dev/null +++ b/data/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/data/build.gradle.kts b/data/build.gradle.kts new file mode 100644 index 000000000..1a820efa1 --- /dev/null +++ b/data/build.gradle.kts @@ -0,0 +1,58 @@ +plugins { + id("com.android.library") + kotlin("android") + id("com.google.devtools.ksp") + id("kotlin-parcelize") +} + +repositories { + mavenCentral() + google() +} + +android { + namespace = "org.tasks.data" + compileSdk = 34 + + buildFeatures { + buildConfig = true + } + defaultConfig { + minSdk = 24 + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles("consumer-rules.pro") + + ksp { + arg("room.schemaLocation", "$projectDir/schemas") + arg("room.incremental", "true") + arg("room.generateKotlin", "true") + } + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + kotlinOptions { + jvmTarget = "17" + } +} + +dependencies { + implementation(libs.androidx.core) + implementation(libs.androidx.lifecycle.livedata) + implementation(libs.androidx.room) + implementation(libs.gson) + implementation(libs.timber) + ksp(libs.androidx.room.compiler) +} \ No newline at end of file diff --git a/data/consumer-rules.pro b/data/consumer-rules.pro new file mode 100644 index 000000000..e69de29bb diff --git a/data/proguard-rules.pro b/data/proguard-rules.pro new file mode 100644 index 000000000..481bb4348 --- /dev/null +++ b/data/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/schemas/com.todoroo.astrid.dao.Database/39.json b/data/schemas/com.todoroo.astrid.dao.Database/39.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/39.json rename to data/schemas/com.todoroo.astrid.dao.Database/39.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/40.json b/data/schemas/com.todoroo.astrid.dao.Database/40.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/40.json rename to data/schemas/com.todoroo.astrid.dao.Database/40.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/41.json b/data/schemas/com.todoroo.astrid.dao.Database/41.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/41.json rename to data/schemas/com.todoroo.astrid.dao.Database/41.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/42.json b/data/schemas/com.todoroo.astrid.dao.Database/42.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/42.json rename to data/schemas/com.todoroo.astrid.dao.Database/42.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/43.json b/data/schemas/com.todoroo.astrid.dao.Database/43.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/43.json rename to data/schemas/com.todoroo.astrid.dao.Database/43.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/44.json b/data/schemas/com.todoroo.astrid.dao.Database/44.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/44.json rename to data/schemas/com.todoroo.astrid.dao.Database/44.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/45.json b/data/schemas/com.todoroo.astrid.dao.Database/45.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/45.json rename to data/schemas/com.todoroo.astrid.dao.Database/45.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/46.json b/data/schemas/com.todoroo.astrid.dao.Database/46.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/46.json rename to data/schemas/com.todoroo.astrid.dao.Database/46.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/47.json b/data/schemas/com.todoroo.astrid.dao.Database/47.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/47.json rename to data/schemas/com.todoroo.astrid.dao.Database/47.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/48.json b/data/schemas/com.todoroo.astrid.dao.Database/48.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/48.json rename to data/schemas/com.todoroo.astrid.dao.Database/48.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/49.json b/data/schemas/com.todoroo.astrid.dao.Database/49.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/49.json rename to data/schemas/com.todoroo.astrid.dao.Database/49.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/50.json b/data/schemas/com.todoroo.astrid.dao.Database/50.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/50.json rename to data/schemas/com.todoroo.astrid.dao.Database/50.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/51.json b/data/schemas/com.todoroo.astrid.dao.Database/51.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/51.json rename to data/schemas/com.todoroo.astrid.dao.Database/51.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/52.json b/data/schemas/com.todoroo.astrid.dao.Database/52.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/52.json rename to data/schemas/com.todoroo.astrid.dao.Database/52.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/53.json b/data/schemas/com.todoroo.astrid.dao.Database/53.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/53.json rename to data/schemas/com.todoroo.astrid.dao.Database/53.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/54.json b/data/schemas/com.todoroo.astrid.dao.Database/54.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/54.json rename to data/schemas/com.todoroo.astrid.dao.Database/54.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/55.json b/data/schemas/com.todoroo.astrid.dao.Database/55.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/55.json rename to data/schemas/com.todoroo.astrid.dao.Database/55.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/56.json b/data/schemas/com.todoroo.astrid.dao.Database/56.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/56.json rename to data/schemas/com.todoroo.astrid.dao.Database/56.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/57.json b/data/schemas/com.todoroo.astrid.dao.Database/57.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/57.json rename to data/schemas/com.todoroo.astrid.dao.Database/57.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/58.json b/data/schemas/com.todoroo.astrid.dao.Database/58.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/58.json rename to data/schemas/com.todoroo.astrid.dao.Database/58.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/59.json b/data/schemas/com.todoroo.astrid.dao.Database/59.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/59.json rename to data/schemas/com.todoroo.astrid.dao.Database/59.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/60.json b/data/schemas/com.todoroo.astrid.dao.Database/60.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/60.json rename to data/schemas/com.todoroo.astrid.dao.Database/60.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/61.json b/data/schemas/com.todoroo.astrid.dao.Database/61.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/61.json rename to data/schemas/com.todoroo.astrid.dao.Database/61.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/62.json b/data/schemas/com.todoroo.astrid.dao.Database/62.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/62.json rename to data/schemas/com.todoroo.astrid.dao.Database/62.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/63.json b/data/schemas/com.todoroo.astrid.dao.Database/63.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/63.json rename to data/schemas/com.todoroo.astrid.dao.Database/63.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/64.json b/data/schemas/com.todoroo.astrid.dao.Database/64.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/64.json rename to data/schemas/com.todoroo.astrid.dao.Database/64.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/65.json b/data/schemas/com.todoroo.astrid.dao.Database/65.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/65.json rename to data/schemas/com.todoroo.astrid.dao.Database/65.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/66.json b/data/schemas/com.todoroo.astrid.dao.Database/66.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/66.json rename to data/schemas/com.todoroo.astrid.dao.Database/66.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/67.json b/data/schemas/com.todoroo.astrid.dao.Database/67.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/67.json rename to data/schemas/com.todoroo.astrid.dao.Database/67.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/68.json b/data/schemas/com.todoroo.astrid.dao.Database/68.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/68.json rename to data/schemas/com.todoroo.astrid.dao.Database/68.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/69.json b/data/schemas/com.todoroo.astrid.dao.Database/69.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/69.json rename to data/schemas/com.todoroo.astrid.dao.Database/69.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/70.json b/data/schemas/com.todoroo.astrid.dao.Database/70.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/70.json rename to data/schemas/com.todoroo.astrid.dao.Database/70.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/71.json b/data/schemas/com.todoroo.astrid.dao.Database/71.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/71.json rename to data/schemas/com.todoroo.astrid.dao.Database/71.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/72.json b/data/schemas/com.todoroo.astrid.dao.Database/72.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/72.json rename to data/schemas/com.todoroo.astrid.dao.Database/72.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/73.json b/data/schemas/com.todoroo.astrid.dao.Database/73.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/73.json rename to data/schemas/com.todoroo.astrid.dao.Database/73.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/74.json b/data/schemas/com.todoroo.astrid.dao.Database/74.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/74.json rename to data/schemas/com.todoroo.astrid.dao.Database/74.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/75.json b/data/schemas/com.todoroo.astrid.dao.Database/75.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/75.json rename to data/schemas/com.todoroo.astrid.dao.Database/75.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/76.json b/data/schemas/com.todoroo.astrid.dao.Database/76.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/76.json rename to data/schemas/com.todoroo.astrid.dao.Database/76.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/77.json b/data/schemas/com.todoroo.astrid.dao.Database/77.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/77.json rename to data/schemas/com.todoroo.astrid.dao.Database/77.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/78.json b/data/schemas/com.todoroo.astrid.dao.Database/78.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/78.json rename to data/schemas/com.todoroo.astrid.dao.Database/78.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/79.json b/data/schemas/com.todoroo.astrid.dao.Database/79.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/79.json rename to data/schemas/com.todoroo.astrid.dao.Database/79.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/80.json b/data/schemas/com.todoroo.astrid.dao.Database/80.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/80.json rename to data/schemas/com.todoroo.astrid.dao.Database/80.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/81.json b/data/schemas/com.todoroo.astrid.dao.Database/81.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/81.json rename to data/schemas/com.todoroo.astrid.dao.Database/81.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/82.json b/data/schemas/com.todoroo.astrid.dao.Database/82.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/82.json rename to data/schemas/com.todoroo.astrid.dao.Database/82.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/83.json b/data/schemas/com.todoroo.astrid.dao.Database/83.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/83.json rename to data/schemas/com.todoroo.astrid.dao.Database/83.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/84.json b/data/schemas/com.todoroo.astrid.dao.Database/84.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/84.json rename to data/schemas/com.todoroo.astrid.dao.Database/84.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/85.json b/data/schemas/com.todoroo.astrid.dao.Database/85.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/85.json rename to data/schemas/com.todoroo.astrid.dao.Database/85.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/86.json b/data/schemas/com.todoroo.astrid.dao.Database/86.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/86.json rename to data/schemas/com.todoroo.astrid.dao.Database/86.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/87.json b/data/schemas/com.todoroo.astrid.dao.Database/87.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/87.json rename to data/schemas/com.todoroo.astrid.dao.Database/87.json diff --git a/app/schemas/com.todoroo.astrid.dao.Database/88.json b/data/schemas/com.todoroo.astrid.dao.Database/88.json similarity index 100% rename from app/schemas/com.todoroo.astrid.dao.Database/88.json rename to data/schemas/com.todoroo.astrid.dao.Database/88.json diff --git a/data/src/main/AndroidManifest.xml b/data/src/main/AndroidManifest.xml new file mode 100644 index 000000000..a5918e68a --- /dev/null +++ b/data/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/java/com/todoroo/andlib/data/Property.kt b/data/src/main/kotlin/com/todoroo/andlib/data/Property.kt similarity index 100% rename from app/src/main/java/com/todoroo/andlib/data/Property.kt rename to data/src/main/kotlin/com/todoroo/andlib/data/Property.kt diff --git a/app/src/main/java/com/todoroo/andlib/data/Table.kt b/data/src/main/kotlin/com/todoroo/andlib/data/Table.kt similarity index 100% rename from app/src/main/java/com/todoroo/andlib/data/Table.kt rename to data/src/main/kotlin/com/todoroo/andlib/data/Table.kt diff --git a/app/src/main/java/com/todoroo/andlib/sql/Criterion.kt b/data/src/main/kotlin/com/todoroo/andlib/sql/Criterion.kt similarity index 100% rename from app/src/main/java/com/todoroo/andlib/sql/Criterion.kt rename to data/src/main/kotlin/com/todoroo/andlib/sql/Criterion.kt diff --git a/app/src/main/java/com/todoroo/andlib/sql/DBObject.kt b/data/src/main/kotlin/com/todoroo/andlib/sql/DBObject.kt similarity index 100% rename from app/src/main/java/com/todoroo/andlib/sql/DBObject.kt rename to data/src/main/kotlin/com/todoroo/andlib/sql/DBObject.kt diff --git a/app/src/main/java/com/todoroo/andlib/sql/Field.kt b/data/src/main/kotlin/com/todoroo/andlib/sql/Field.kt similarity index 100% rename from app/src/main/java/com/todoroo/andlib/sql/Field.kt rename to data/src/main/kotlin/com/todoroo/andlib/sql/Field.kt diff --git a/app/src/main/java/com/todoroo/andlib/sql/Functions.kt b/data/src/main/kotlin/com/todoroo/andlib/sql/Functions.kt similarity index 100% rename from app/src/main/java/com/todoroo/andlib/sql/Functions.kt rename to data/src/main/kotlin/com/todoroo/andlib/sql/Functions.kt diff --git a/app/src/main/java/com/todoroo/andlib/sql/Join.kt b/data/src/main/kotlin/com/todoroo/andlib/sql/Join.kt similarity index 100% rename from app/src/main/java/com/todoroo/andlib/sql/Join.kt rename to data/src/main/kotlin/com/todoroo/andlib/sql/Join.kt diff --git a/app/src/main/java/com/todoroo/andlib/sql/JoinType.kt b/data/src/main/kotlin/com/todoroo/andlib/sql/JoinType.kt similarity index 100% rename from app/src/main/java/com/todoroo/andlib/sql/JoinType.kt rename to data/src/main/kotlin/com/todoroo/andlib/sql/JoinType.kt diff --git a/app/src/main/java/com/todoroo/andlib/sql/Operator.kt b/data/src/main/kotlin/com/todoroo/andlib/sql/Operator.kt similarity index 100% rename from app/src/main/java/com/todoroo/andlib/sql/Operator.kt rename to data/src/main/kotlin/com/todoroo/andlib/sql/Operator.kt diff --git a/app/src/main/java/com/todoroo/andlib/sql/Order.kt b/data/src/main/kotlin/com/todoroo/andlib/sql/Order.kt similarity index 100% rename from app/src/main/java/com/todoroo/andlib/sql/Order.kt rename to data/src/main/kotlin/com/todoroo/andlib/sql/Order.kt diff --git a/app/src/main/java/com/todoroo/andlib/sql/OrderType.kt b/data/src/main/kotlin/com/todoroo/andlib/sql/OrderType.kt similarity index 100% rename from app/src/main/java/com/todoroo/andlib/sql/OrderType.kt rename to data/src/main/kotlin/com/todoroo/andlib/sql/OrderType.kt diff --git a/app/src/main/java/com/todoroo/andlib/sql/Query.kt b/data/src/main/kotlin/com/todoroo/andlib/sql/Query.kt similarity index 100% rename from app/src/main/java/com/todoroo/andlib/sql/Query.kt rename to data/src/main/kotlin/com/todoroo/andlib/sql/Query.kt diff --git a/app/src/main/java/com/todoroo/andlib/sql/QueryTemplate.kt b/data/src/main/kotlin/com/todoroo/andlib/sql/QueryTemplate.kt similarity index 100% rename from app/src/main/java/com/todoroo/andlib/sql/QueryTemplate.kt rename to data/src/main/kotlin/com/todoroo/andlib/sql/QueryTemplate.kt diff --git a/app/src/main/java/com/todoroo/andlib/sql/StringBuilderExtensions.kt b/data/src/main/kotlin/com/todoroo/andlib/sql/StringBuilderExtensions.kt similarity index 100% rename from app/src/main/java/com/todoroo/andlib/sql/StringBuilderExtensions.kt rename to data/src/main/kotlin/com/todoroo/andlib/sql/StringBuilderExtensions.kt diff --git a/app/src/main/java/com/todoroo/andlib/sql/UnaryCriterion.kt b/data/src/main/kotlin/com/todoroo/andlib/sql/UnaryCriterion.kt similarity index 100% rename from app/src/main/java/com/todoroo/andlib/sql/UnaryCriterion.kt rename to data/src/main/kotlin/com/todoroo/andlib/sql/UnaryCriterion.kt diff --git a/app/src/main/java/com/todoroo/astrid/dao/Database.kt b/data/src/main/kotlin/com/todoroo/astrid/dao/Database.kt similarity index 93% rename from app/src/main/java/com/todoroo/astrid/dao/Database.kt rename to data/src/main/kotlin/com/todoroo/astrid/dao/Database.kt index 2572b6e13..18d958097 100644 --- a/app/src/main/java/com/todoroo/astrid/dao/Database.kt +++ b/data/src/main/kotlin/com/todoroo/astrid/dao/Database.kt @@ -7,6 +7,7 @@ import com.todoroo.astrid.data.Task import org.tasks.data.Alarm import org.tasks.data.AlarmDao import org.tasks.data.Attachment +import org.tasks.data.AutoMigrate83to84 import org.tasks.data.CaldavAccount import org.tasks.data.CaldavCalendar import org.tasks.data.CaldavDao @@ -19,6 +20,8 @@ import org.tasks.data.Geofence import org.tasks.data.GoogleTaskDao import org.tasks.data.GoogleTaskListDao import org.tasks.data.LocationDao +import org.tasks.data.Notification +import org.tasks.data.NotificationDao import org.tasks.data.Place import org.tasks.data.Principal import org.tasks.data.PrincipalAccess @@ -35,9 +38,6 @@ import org.tasks.data.TaskListMetadataDao import org.tasks.data.UpgraderDao import org.tasks.data.UserActivity import org.tasks.data.UserActivityDao -import org.tasks.db.Migrations -import org.tasks.notifications.Notification -import org.tasks.notifications.NotificationDao @Database( entities = [ @@ -60,7 +60,7 @@ import org.tasks.notifications.NotificationDao Attachment::class, ], autoMigrations = [ - AutoMigration(from = 83, to = 84, spec = Migrations.AutoMigrate83to84::class), + AutoMigration(from = 83, to = 84, spec = AutoMigrate83to84::class), ], version = 88 ) diff --git a/app/src/main/java/com/todoroo/astrid/data/Task.kt b/data/src/main/kotlin/com/todoroo/astrid/data/Task.kt similarity index 76% rename from app/src/main/java/com/todoroo/astrid/data/Task.kt rename to data/src/main/kotlin/com/todoroo/astrid/data/Task.kt index 37821ac9b..4807df870 100644 --- a/app/src/main/java/com/todoroo/astrid/data/Task.kt +++ b/data/src/main/kotlin/com/todoroo/astrid/data/Task.kt @@ -10,17 +10,14 @@ import androidx.room.PrimaryKey import com.google.gson.annotations.SerializedName import com.todoroo.andlib.data.Table import com.todoroo.andlib.sql.Field -import com.todoroo.andlib.utility.DateUtilities import kotlinx.parcelize.Parcelize import kotlinx.parcelize.RawValue -import net.fortuna.ical4j.model.Recur -import org.tasks.Strings import org.tasks.data.Tag -import org.tasks.date.DateTimeUtils -import org.tasks.date.DateTimeUtils.toDateTime -import org.tasks.time.DateTimeUtils.startOfDay import timber.log.Timber +const val SUPPRESS_SYNC = "suppress_sync" +const val FORCE_CALDAV_SYNC = "force_caldav_sync" + @Parcelize @Entity( tableName = Task.TABLE_NAME, @@ -83,7 +80,7 @@ data class Task( private var transitoryData: @RawValue HashMap? = null, ) : Parcelable { var uuid: String - get() = if (Strings.isNullOrEmpty(remoteId)) NO_UUID else remoteId!! + get() = if (remoteId.isNullOrEmpty()) NO_UUID else remoteId!! set(uuid) { remoteId = uuid } @@ -96,10 +93,6 @@ data class Task( val isDeleted get() = deletionDate > 0 - /** Checks whether task is hidden. Requires HIDDEN_UNTIL */ - val isHidden - get() = hideUntil > DateUtilities.now() - fun hasStartTime() = hasDueTime(hideUntil) fun hasStartDate() = hideUntil > 0 @@ -107,44 +100,9 @@ data class Task( /** Checks whether task is done. Requires DUE_DATE */ fun hasDueDate() = dueDate > 0 - /** - * Create hide until for this task. - * - * @param setting one of the HIDE_UNTIL_* constants - * @param customDate if specific day is set, this value - */ - fun createHideUntil(setting: Int, customDate: Long): Long { - val date: Long = when (setting) { - HIDE_UNTIL_NONE -> return 0 - HIDE_UNTIL_DUE, HIDE_UNTIL_DUE_TIME -> dueDate - HIDE_UNTIL_DAY_BEFORE -> dueDate - DateUtilities.ONE_DAY - HIDE_UNTIL_WEEK_BEFORE -> dueDate - DateUtilities.ONE_WEEK - HIDE_UNTIL_SPECIFIC_DAY, HIDE_UNTIL_SPECIFIC_DAY_TIME -> customDate - else -> throw IllegalArgumentException("Unknown setting $setting") - } - if (date <= 0) { - return date - } - return if (setting == HIDE_UNTIL_SPECIFIC_DAY_TIME || - setting == HIDE_UNTIL_DUE_TIME && hasDueTime(dueDate)) { - date.toDateTime().withSecondOfMinute(1).withMillisOfSecond(0).millis - } else { - date.startOfDay() - } - } - /** Checks whether this due date has a due time or only a date */ fun hasDueTime(): Boolean = hasDueTime(dueDate) - val isOverdue: Boolean - get() { - if (isCompleted || !hasDueDate()) { - return false - } - val compareTo = if (hasDueTime()) DateUtilities.now() else DateTimeUtils.newDateTime().startOfDay().millis - return dueDate < compareTo - } - fun repeatAfterCompletion(): Boolean = repeatFrom == RepeatFrom.COMPLETION_DATE fun setDueDateAdjustingHideUntil(newDueDate: Long) { @@ -159,14 +117,6 @@ data class Task( val isRecurring: Boolean get() = recurrence?.isNotBlank() == true - fun setRecurrence(rrule: Recur?) { - recurrence = rrule?.toString() - } - - fun hasNotes(): Boolean { - return !Strings.isNullOrEmpty(notes) - } - val isNotifyModeNonstop: Boolean get() = ringFlags == NOTIFY_MODE_NONSTOP @@ -251,7 +201,7 @@ data class Task( @Synchronized fun suppressSync() { - putTransitory(SyncFlags.SUPPRESS_SYNC, true) + putTransitory(SUPPRESS_SYNC, true) } @Synchronized @@ -391,39 +341,6 @@ data class Task( private val INVALID_COUNT = ";?COUNT=(-1|0)".toRegex() - /** - * 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) { - URGENCY_NONE -> 0 - URGENCY_TODAY -> DateUtilities.now() - URGENCY_TOMORROW -> DateUtilities.now() + DateUtilities.ONE_DAY - URGENCY_DAY_AFTER -> DateUtilities.now() + 2 * DateUtilities.ONE_DAY - URGENCY_NEXT_WEEK -> DateUtilities.now() + DateUtilities.ONE_WEEK - URGENCY_IN_TWO_WEEKS -> DateUtilities.now() + 2 * DateUtilities.ONE_WEEK - URGENCY_SPECIFIC_DAY, 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 != 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 - } - /** Checks whether provided due date has a due time or only a date */ @JvmStatic fun hasDueTime(dueDate: Long): Boolean { return dueDate > 0 && dueDate % 60000 > 0 @@ -444,7 +361,7 @@ data class Task( ?.replace(INVALID_COUNT, "") // ical4j adds COUNT=-1 if there is an UNTIL value fun isUuidEmpty(uuid: String?): Boolean { - return NO_UUID == uuid || Strings.isNullOrEmpty(uuid) + return NO_UUID == uuid || uuid.isNullOrEmpty() } } } diff --git a/data/src/main/kotlin/com/todoroo/astrid/helper/UUIDHelper.kt b/data/src/main/kotlin/com/todoroo/astrid/helper/UUIDHelper.kt new file mode 100644 index 000000000..b95eff7b5 --- /dev/null +++ b/data/src/main/kotlin/com/todoroo/astrid/helper/UUIDHelper.kt @@ -0,0 +1,15 @@ +package com.todoroo.astrid.helper + +import java.util.UUID + +object UUIDHelper { + private const val MIN_UUID: Long = 100000000 + + fun newUUID(): String { + var uuid: Long + do { + uuid = UUID.randomUUID().leastSignificantBits and 0x7fffffffffffffffL + } while (uuid < MIN_UUID) + return uuid.toString() + } +} diff --git a/app/src/main/java/org/tasks/data/Alarm.kt b/data/src/main/kotlin/org/tasks/data/Alarm.kt similarity index 98% rename from app/src/main/java/org/tasks/data/Alarm.kt rename to data/src/main/kotlin/org/tasks/data/Alarm.kt index 5872e106a..4b3e2ecf6 100644 --- a/app/src/main/java/org/tasks/data/Alarm.kt +++ b/data/src/main/kotlin/org/tasks/data/Alarm.kt @@ -9,7 +9,7 @@ import androidx.room.Ignore import androidx.room.PrimaryKey import com.todoroo.andlib.data.Table import com.todoroo.astrid.data.Task -import org.tasks.time.DateTimeUtils.printTimestamp +import org.tasks.time.printTimestamp import java.util.concurrent.TimeUnit @Entity( diff --git a/app/src/main/java/org/tasks/data/AlarmDao.kt b/data/src/main/kotlin/org/tasks/data/AlarmDao.kt similarity index 100% rename from app/src/main/java/org/tasks/data/AlarmDao.kt rename to data/src/main/kotlin/org/tasks/data/AlarmDao.kt diff --git a/app/src/main/java/org/tasks/data/Attachment.kt b/data/src/main/kotlin/org/tasks/data/Attachment.kt similarity index 100% rename from app/src/main/java/org/tasks/data/Attachment.kt rename to data/src/main/kotlin/org/tasks/data/Attachment.kt diff --git a/data/src/main/kotlin/org/tasks/data/AutoMigrations.kt b/data/src/main/kotlin/org/tasks/data/AutoMigrations.kt new file mode 100644 index 000000000..48a5cc1d4 --- /dev/null +++ b/data/src/main/kotlin/org/tasks/data/AutoMigrations.kt @@ -0,0 +1,10 @@ +package org.tasks.data + +import androidx.room.DeleteColumn +import androidx.room.migration.AutoMigrationSpec + +@DeleteColumn.Entries( + DeleteColumn(tableName = "caldav_accounts", columnName = "cda_encryption_key"), + DeleteColumn(tableName = "caldav_accounts", columnName = "cda_repeat"), +) +class AutoMigrate83to84: AutoMigrationSpec diff --git a/app/src/main/java/org/tasks/data/CaldavAccount.kt b/data/src/main/kotlin/org/tasks/data/CaldavAccount.kt similarity index 65% rename from app/src/main/java/org/tasks/data/CaldavAccount.kt rename to data/src/main/kotlin/org/tasks/data/CaldavAccount.kt index e4a2f6c93..3a9dc0bda 100644 --- a/app/src/main/java/org/tasks/data/CaldavAccount.kt +++ b/data/src/main/kotlin/org/tasks/data/CaldavAccount.kt @@ -1,7 +1,5 @@ package org.tasks.data -import android.app.Activity -import android.content.Context import android.os.Parcel import android.os.Parcelable import androidx.core.os.ParcelCompat @@ -11,21 +9,6 @@ import androidx.room.Ignore import androidx.room.PrimaryKey import com.todoroo.andlib.data.Table import com.todoroo.astrid.data.Task -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 import java.net.HttpURLConnection @Entity(tableName = "caldav_accounts") @@ -80,10 +63,6 @@ class CaldavAccount : Parcelable { serverType = source.readInt() } - fun getPassword(encryption: KeyStoreEncryption): String { - return encryption.decrypt(password) ?: "" - } - val isCaldavAccount: Boolean get() = accountType == TYPE_CALDAV @@ -91,10 +70,10 @@ class CaldavAccount : Parcelable { val isEteSyncAccount: Boolean get() = accountType == TYPE_ETESYNC - private val isEtebaseAccount: Boolean + val isEtebaseAccount: Boolean get() = accountType == TYPE_ETEBASE - private val isOpenTasks: Boolean + val isOpenTasks: Boolean get() = accountType == TYPE_OPENTASKS val isTasksOrg: Boolean @@ -106,23 +85,6 @@ class CaldavAccount : Parcelable { val isGoogleTasks: Boolean get() = accountType == TYPE_GOOGLE_TASKS - fun listSettingsClass(): Class = when(accountType) { - TYPE_LOCAL -> LocalListSettingsActivity::class.java - TYPE_ETESYNC, TYPE_OPENTASKS -> OpenTasksListSettingsActivity::class.java - TYPE_ETEBASE -> EtebaseCalendarSettingsActivity::class.java - TYPE_MICROSOFT -> MicrosoftListSettingsActivity::class.java - else -> CaldavCalendarSettingsActivity::class.java - } - - val accountSettingsClass: Class - 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") - } - val isSuppressRepeatingTasks: Boolean get() = when (serverType) { SERVER_OPEN_XCHANGE, @@ -188,13 +150,6 @@ class CaldavAccount : Parcelable { return "CaldavAccount(id=$id, uuid=$uuid, name=$name, url=$url, username=$username, password=>, error=$error, accountType=$accountType, isCollapsed=$isCollapsed, serverType=$serverType)" } - fun isTasksSubscription(context: Context): Boolean { - val caldavUrl = context.getString(R.string.tasks_caldav_url) - return url?.startsWith("${caldavUrl}/calendars/") == true && - !isPaymentRequired() && - !isLoggedOut() - } - fun isLoggedOut() = error?.startsWith(ERROR_UNAUTHORIZED) == true fun isPaymentRequired() = error.isPaymentRequired() @@ -202,31 +157,6 @@ class CaldavAccount : Parcelable { val hasError: Boolean get() = !error.isNullOrBlank() - val 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 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 - } - companion object { val TABLE = Table("caldav_accounts") val UUID = TABLE.column("cda_uuid") diff --git a/app/src/main/java/org/tasks/data/CaldavCalendar.kt b/data/src/main/kotlin/org/tasks/data/CaldavCalendar.kt similarity index 95% rename from app/src/main/java/org/tasks/data/CaldavCalendar.kt rename to data/src/main/kotlin/org/tasks/data/CaldavCalendar.kt index 70a0f9486..cfa280c6d 100644 --- a/app/src/main/java/org/tasks/data/CaldavCalendar.kt +++ b/data/src/main/kotlin/org/tasks/data/CaldavCalendar.kt @@ -5,10 +5,8 @@ import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey import com.todoroo.andlib.data.Table -import com.todoroo.astrid.api.Filter.Companion.NO_ORDER import com.todoroo.astrid.data.Task import kotlinx.parcelize.Parcelize -import org.tasks.themes.CustomIcons.LIST @Parcelize @Entity(tableName = "caldav_lists") diff --git a/app/src/main/java/org/tasks/data/CaldavDao.kt b/data/src/main/kotlin/org/tasks/data/CaldavDao.kt similarity index 89% rename from app/src/main/java/org/tasks/data/CaldavDao.kt rename to data/src/main/kotlin/org/tasks/data/CaldavDao.kt index 4017b1701..9cd3f9c46 100644 --- a/app/src/main/java/org/tasks/data/CaldavDao.kt +++ b/data/src/main/kotlin/org/tasks/data/CaldavDao.kt @@ -1,6 +1,5 @@ package org.tasks.data -import android.content.Context import androidx.lifecycle.LiveData import androidx.room.Dao import androidx.room.Delete @@ -8,24 +7,17 @@ import androidx.room.Insert import androidx.room.Query import androidx.room.Transaction import androidx.room.Update -import com.todoroo.andlib.utility.DateUtilities.now -import com.todoroo.astrid.api.Filter.Companion.NO_ORDER -import com.todoroo.astrid.core.SortHelper.APPLE_EPOCH import com.todoroo.astrid.data.Task -import com.todoroo.astrid.helper.UUIDHelper -import kotlinx.coroutines.sync.Mutex -import kotlinx.coroutines.sync.withLock -import org.tasks.R import org.tasks.data.CaldavAccount.Companion.TYPE_ETESYNC import org.tasks.data.CaldavAccount.Companion.TYPE_GOOGLE_TASKS import org.tasks.data.CaldavAccount.Companion.TYPE_LOCAL import org.tasks.data.CaldavAccount.Companion.TYPE_OPENTASKS import org.tasks.data.CaldavAccount.Companion.TYPE_TASKS -import org.tasks.date.DateTimeUtils.toAppleEpoch import org.tasks.db.DbUtils.dbchunk import org.tasks.db.SuspendDbUtils.chunkedMap -import org.tasks.filters.CaldavFilters -import org.tasks.time.DateTimeUtils.currentTimeMillis +import org.tasks.time.DateTimeUtils2.currentTimeMillis + +const val APPLE_EPOCH = 978307200000L // 1/1/2001 GMT @Dao abstract class CaldavDao { @@ -127,7 +119,7 @@ WHERE cd_calendar = :calendar AND deleted = 0 AND parent = :parent """) - internal abstract suspend fun findFirstTask(calendar: String, parent: Long): Long? + abstract suspend fun findFirstTask(calendar: String, parent: Long): Long? @Query(""" SELECT MAX(IFNULL(`order`, (created - $APPLE_EPOCH) / 1000)) @@ -138,7 +130,7 @@ WHERE cd_calendar = :calendar AND deleted = 0 AND parent = :parent """) - internal abstract suspend fun findLastTask(calendar: String, parent: Long): Long? + abstract suspend fun findLastTask(calendar: String, parent: Long): Long? @Insert abstract suspend fun insert(caldavTask: CaldavTask): Long @@ -156,7 +148,7 @@ WHERE cd_calendar = :calendar abstract suspend fun updateTasks(tasks: Iterable) @Query("UPDATE caldav_tasks SET cd_remote_parent = :remoteParent WHERE cd_id = :id") - internal abstract suspend fun update(id: Long, remoteParent: String?) + abstract suspend fun update(id: Long, remoteParent: String?) @Update abstract suspend fun update(tasks: Iterable) @@ -355,7 +347,7 @@ GROUP BY caldav_lists.cdl_uuid } @Query("UPDATE tasks SET modified = :modificationTime WHERE _id in (:ids)") - internal abstract suspend fun touchInternal(ids: List, modificationTime: Long = now()) + internal abstract suspend fun touchInternal(ids: List, modificationTime: Long = currentTimeMillis()) @Query(""" SELECT task.*, caldav_task.*, IFNULL(`order`, (created - $APPLE_EPOCH) / 1000) AS primary_sort @@ -380,34 +372,9 @@ ORDER BY primary_sort @Query("UPDATE tasks SET `order` = :order WHERE _id = :id") abstract suspend fun setTaskOrder(id: Long, order: Long?) - suspend fun setupLocalAccount(context: Context): CaldavAccount = mutex.withLock { - val account = getLocalAccount() - getLocalList(context, account) - return account - } - - suspend fun getLocalList(context: Context) = mutex.withLock { - getLocalList(context, getLocalAccount()) - } - - private suspend fun getLocalAccount() = getAccountByUuid(LOCAL) ?: CaldavAccount().apply { - accountType = TYPE_LOCAL - uuid = LOCAL - id = insert(this) - } - - private suspend fun 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) - } - companion object { const val LOCAL = "local" - private val mutex = Mutex() + + @JvmStatic fun Long.toAppleEpoch(): Long = (this - APPLE_EPOCH) / 1000 } } \ No newline at end of file diff --git a/data/src/main/kotlin/org/tasks/data/CaldavFilters.kt b/data/src/main/kotlin/org/tasks/data/CaldavFilters.kt new file mode 100644 index 000000000..3d9633b0b --- /dev/null +++ b/data/src/main/kotlin/org/tasks/data/CaldavFilters.kt @@ -0,0 +1,9 @@ +package org.tasks.data + +import androidx.room.Embedded + +data class CaldavFilters( + @JvmField @Embedded val caldavCalendar: CaldavCalendar, + @JvmField val count: Int, + @JvmField val principals: Int, +) diff --git a/app/src/main/java/org/tasks/data/CaldavTask.kt b/data/src/main/kotlin/org/tasks/data/CaldavTask.kt similarity index 100% rename from app/src/main/java/org/tasks/data/CaldavTask.kt rename to data/src/main/kotlin/org/tasks/data/CaldavTask.kt diff --git a/app/src/main/java/org/tasks/data/CaldavTaskContainer.kt b/data/src/main/kotlin/org/tasks/data/CaldavTaskContainer.kt similarity index 82% rename from app/src/main/java/org/tasks/data/CaldavTaskContainer.kt rename to data/src/main/kotlin/org/tasks/data/CaldavTaskContainer.kt index 8c41ddb84..94c9fb518 100644 --- a/app/src/main/java/org/tasks/data/CaldavTaskContainer.kt +++ b/data/src/main/kotlin/org/tasks/data/CaldavTaskContainer.kt @@ -2,7 +2,7 @@ package org.tasks.data import androidx.room.Embedded import com.todoroo.astrid.data.Task -import org.tasks.time.DateTime +import org.tasks.data.CaldavDao.Companion.toAppleEpoch class CaldavTaskContainer { @Embedded lateinit var task: Task @@ -18,7 +18,7 @@ class CaldavTaskContainer { get() = task.isDeleted val sortOrder: Long - get() = task.order ?: DateTime(task.creationDate).toAppleEpoch() + get() = task.order ?: task.creationDate.toAppleEpoch() val startDate: Long get() = task.hideUntil diff --git a/data/src/main/kotlin/org/tasks/data/Constants.kt b/data/src/main/kotlin/org/tasks/data/Constants.kt new file mode 100644 index 000000000..81a24c21b --- /dev/null +++ b/data/src/main/kotlin/org/tasks/data/Constants.kt @@ -0,0 +1,7 @@ +package org.tasks.data + +const val NO_ORDER = -1 +const val NO_COUNT = -1 + +@Deprecated("remove this") const val LABEL = 1 +@Deprecated("remove this") const val LIST = 8 diff --git a/app/src/main/java/org/tasks/data/ContentProviderDao.kt b/data/src/main/kotlin/org/tasks/data/ContentProviderDao.kt similarity index 100% rename from app/src/main/java/org/tasks/data/ContentProviderDao.kt rename to data/src/main/kotlin/org/tasks/data/ContentProviderDao.kt diff --git a/app/src/main/java/org/tasks/data/DeletionDao.kt b/data/src/main/kotlin/org/tasks/data/DeletionDao.kt similarity index 100% rename from app/src/main/java/org/tasks/data/DeletionDao.kt rename to data/src/main/kotlin/org/tasks/data/DeletionDao.kt diff --git a/app/src/main/java/org/tasks/data/Filter.kt b/data/src/main/kotlin/org/tasks/data/Filter.kt similarity index 93% rename from app/src/main/java/org/tasks/data/Filter.kt rename to data/src/main/kotlin/org/tasks/data/Filter.kt index 84eb6bad8..9e4d6fa42 100644 --- a/app/src/main/java/org/tasks/data/Filter.kt +++ b/data/src/main/kotlin/org/tasks/data/Filter.kt @@ -4,7 +4,6 @@ import android.os.Parcelable import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import com.todoroo.astrid.api.Filter.Companion.NO_ORDER import kotlinx.parcelize.Parcelize @Parcelize diff --git a/app/src/main/java/org/tasks/data/FilterDao.kt b/data/src/main/kotlin/org/tasks/data/FilterDao.kt similarity index 94% rename from app/src/main/java/org/tasks/data/FilterDao.kt rename to data/src/main/kotlin/org/tasks/data/FilterDao.kt index 04c045388..653ad4405 100644 --- a/app/src/main/java/org/tasks/data/FilterDao.kt +++ b/data/src/main/kotlin/org/tasks/data/FilterDao.kt @@ -5,7 +5,6 @@ import androidx.room.Delete import androidx.room.Insert import androidx.room.Query import androidx.room.Update -import com.todoroo.astrid.api.Filter.Companion.NO_ORDER @Dao interface FilterDao { diff --git a/app/src/main/java/org/tasks/data/Geofence.kt b/data/src/main/kotlin/org/tasks/data/Geofence.kt similarity index 79% rename from app/src/main/java/org/tasks/data/Geofence.kt rename to data/src/main/kotlin/org/tasks/data/Geofence.kt index 93a686ef4..133a3a974 100644 --- a/app/src/main/java/org/tasks/data/Geofence.kt +++ b/data/src/main/kotlin/org/tasks/data/Geofence.kt @@ -9,8 +9,6 @@ import androidx.room.PrimaryKey import com.todoroo.andlib.data.Table import com.todoroo.astrid.data.Task import kotlinx.parcelize.Parcelize -import org.tasks.R -import org.tasks.preferences.Preferences import java.io.Serializable @Parcelize @@ -53,17 +51,6 @@ data class Geofence( isDeparture = departure, ) - @Ignore - constructor( - place: String?, - preferences: Preferences, - defaultReminders: Int = preferences.getIntegerFromString(R.string.p_default_location_reminder_key, 1) - ): this( - place = place, - isArrival = defaultReminders == 1 || defaultReminders == 3, - isDeparture = defaultReminders == 2 || defaultReminders == 3, - ) - @Ignore constructor( place: String?, diff --git a/app/src/main/java/org/tasks/data/GoogleTask.kt b/data/src/main/kotlin/org/tasks/data/GoogleTask.kt similarity index 100% rename from app/src/main/java/org/tasks/data/GoogleTask.kt rename to data/src/main/kotlin/org/tasks/data/GoogleTask.kt diff --git a/app/src/main/java/org/tasks/data/GoogleTaskAccount.kt b/data/src/main/kotlin/org/tasks/data/GoogleTaskAccount.kt similarity index 100% rename from app/src/main/java/org/tasks/data/GoogleTaskAccount.kt rename to data/src/main/kotlin/org/tasks/data/GoogleTaskAccount.kt diff --git a/app/src/main/java/org/tasks/data/GoogleTaskDao.kt b/data/src/main/kotlin/org/tasks/data/GoogleTaskDao.kt similarity index 98% rename from app/src/main/java/org/tasks/data/GoogleTaskDao.kt rename to data/src/main/kotlin/org/tasks/data/GoogleTaskDao.kt index d836b5f8a..575e94014 100644 --- a/app/src/main/java/org/tasks/data/GoogleTaskDao.kt +++ b/data/src/main/kotlin/org/tasks/data/GoogleTaskDao.kt @@ -132,7 +132,7 @@ WHERE c.parent > 0 ORDER BY primary_sort ASC, secondary_sort ASC """ ) - internal abstract suspend fun getByLocalOrder(listId: String): List + abstract suspend fun getByLocalOrder(listId: String): List @Query( """ diff --git a/data/src/main/kotlin/org/tasks/data/GoogleTaskFilters.kt b/data/src/main/kotlin/org/tasks/data/GoogleTaskFilters.kt new file mode 100644 index 000000000..f37d59ed3 --- /dev/null +++ b/data/src/main/kotlin/org/tasks/data/GoogleTaskFilters.kt @@ -0,0 +1,8 @@ +package org.tasks.data + +import androidx.room.Embedded + +data class GoogleTaskFilters( + @JvmField @Embedded val googleTaskList: CaldavCalendar, + @JvmField val count: Int, +) diff --git a/app/src/main/java/org/tasks/data/GoogleTaskList.kt b/data/src/main/kotlin/org/tasks/data/GoogleTaskList.kt similarity index 84% rename from app/src/main/java/org/tasks/data/GoogleTaskList.kt rename to data/src/main/kotlin/org/tasks/data/GoogleTaskList.kt index 63a1d19f1..10c9c70e5 100644 --- a/app/src/main/java/org/tasks/data/GoogleTaskList.kt +++ b/data/src/main/kotlin/org/tasks/data/GoogleTaskList.kt @@ -1,7 +1,5 @@ package org.tasks.data -import com.todoroo.astrid.api.Filter.Companion.NO_ORDER - @Deprecated("Only used for backup migration") data class GoogleTaskList( var account: String? = null, diff --git a/app/src/main/java/org/tasks/data/GoogleTaskListDao.kt b/data/src/main/kotlin/org/tasks/data/GoogleTaskListDao.kt similarity index 90% rename from app/src/main/java/org/tasks/data/GoogleTaskListDao.kt rename to data/src/main/kotlin/org/tasks/data/GoogleTaskListDao.kt index 4f82cbd30..e868ea690 100644 --- a/app/src/main/java/org/tasks/data/GoogleTaskListDao.kt +++ b/data/src/main/kotlin/org/tasks/data/GoogleTaskListDao.kt @@ -1,9 +1,11 @@ package org.tasks.data -import androidx.room.* +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query import org.tasks.data.CaldavAccount.Companion.TYPE_GOOGLE_TASKS -import org.tasks.filters.GoogleTaskFilters -import org.tasks.time.DateTimeUtils.currentTimeMillis +import org.tasks.time.DateTimeUtils2.currentTimeMillis @Dao interface GoogleTaskListDao { diff --git a/app/src/main/java/org/tasks/data/Location.kt b/data/src/main/kotlin/org/tasks/data/Location.kt similarity index 94% rename from app/src/main/java/org/tasks/data/Location.kt rename to data/src/main/kotlin/org/tasks/data/Location.kt index 092a52d7c..c0db60074 100644 --- a/app/src/main/java/org/tasks/data/Location.kt +++ b/data/src/main/kotlin/org/tasks/data/Location.kt @@ -1,6 +1,5 @@ package org.tasks.data -import android.content.Context import android.os.Parcel import android.os.Parcelable import androidx.room.Embedded @@ -48,10 +47,6 @@ data class Location( val displayAddress: String? get() = place.displayAddress - fun open(context: Context?) { - place.open(context) - } - override fun describeContents() = 0 override fun writeToParcel(dest: Parcel, flags: Int) { diff --git a/app/src/main/java/org/tasks/data/LocationDao.kt b/data/src/main/kotlin/org/tasks/data/LocationDao.kt similarity index 86% rename from app/src/main/java/org/tasks/data/LocationDao.kt rename to data/src/main/kotlin/org/tasks/data/LocationDao.kt index 781eb0e1b..b1e1b7021 100644 --- a/app/src/main/java/org/tasks/data/LocationDao.kt +++ b/data/src/main/kotlin/org/tasks/data/LocationDao.kt @@ -7,13 +7,8 @@ import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query import androidx.room.Update -import com.todoroo.andlib.utility.DateUtilities.now -import com.todoroo.astrid.api.Filter.Companion.NO_ORDER -import com.todoroo.astrid.data.Task import org.tasks.data.Alarm.Companion.TYPE_SNOOZE -import org.tasks.filters.LocationFilters -import org.tasks.preferences.Preferences -import org.tasks.time.DateTimeUtils.currentTimeMillis +import org.tasks.time.DateTimeUtils2.currentTimeMillis @Dao interface LocationDao { @@ -45,14 +40,14 @@ interface LocationDao { + " LEFT JOIN alarms ON tasks._id = alarms.task AND alarms.type == $TYPE_SNOOZE" + " WHERE place = :place AND arrival = 1 AND tasks.completed = 0" + " AND tasks.deleted = 0 AND (alarms._id IS NULL OR alarms.time < :now) AND tasks.hideUntil < :now") - suspend fun getArrivalGeofences(place: String, now: Long = now()): List + suspend fun getArrivalGeofences(place: String, now: Long = currentTimeMillis()): List @Query("SELECT geofences.* FROM geofences" + " INNER JOIN tasks ON tasks._id = geofences.task" + " LEFT JOIN alarms ON tasks._id = alarms.task AND alarms.type == $TYPE_SNOOZE" + " WHERE place = :place AND departure = 1 AND tasks.completed = 0" + " AND tasks.deleted = 0 AND (alarms._id IS NULL OR alarms.time < :now) AND tasks.hideUntil < :now") - suspend fun getDepartureGeofences(place: String, now: Long = now()): List + suspend fun getDepartureGeofences(place: String, now: Long = currentTimeMillis()): List @Query("SELECT * FROM geofences" + " INNER JOIN places ON geofences.place = places.uid" @@ -126,16 +121,4 @@ interface LocationDao { @Query("UPDATE places SET place_order = :order WHERE place_id = :id") suspend fun setOrder(id: Long, order: Int) - suspend fun getLocation(task: Task, preferences: Preferences): Location? { - if (task.isNew) { - if (task.hasTransitory(Place.KEY)) { - getPlace(task.getTransitory(Place.KEY)!!)?.let { - return Location(Geofence(it.uid, preferences), it) - } - } - } else { - return getGeofences(task.id) - } - return null - } } \ No newline at end of file diff --git a/data/src/main/kotlin/org/tasks/data/LocationFilters.kt b/data/src/main/kotlin/org/tasks/data/LocationFilters.kt new file mode 100644 index 000000000..521915270 --- /dev/null +++ b/data/src/main/kotlin/org/tasks/data/LocationFilters.kt @@ -0,0 +1,8 @@ +package org.tasks.data + +import androidx.room.Embedded + +data class LocationFilters( + @JvmField @Embedded var place: Place, + @JvmField var count: Int +) diff --git a/app/src/main/java/org/tasks/data/MergedGeofence.kt b/data/src/main/kotlin/org/tasks/data/MergedGeofence.kt similarity index 100% rename from app/src/main/java/org/tasks/data/MergedGeofence.kt rename to data/src/main/kotlin/org/tasks/data/MergedGeofence.kt diff --git a/app/src/main/java/org/tasks/notifications/Notification.kt b/data/src/main/kotlin/org/tasks/data/Notification.kt similarity index 97% rename from app/src/main/java/org/tasks/notifications/Notification.kt rename to data/src/main/kotlin/org/tasks/data/Notification.kt index d8b49d707..d208ce309 100644 --- a/app/src/main/java/org/tasks/notifications/Notification.kt +++ b/data/src/main/kotlin/org/tasks/data/Notification.kt @@ -1,4 +1,4 @@ -package org.tasks.notifications +package org.tasks.data import androidx.room.ColumnInfo import androidx.room.Entity diff --git a/app/src/main/java/org/tasks/notifications/NotificationDao.kt b/data/src/main/kotlin/org/tasks/data/NotificationDao.kt similarity index 95% rename from app/src/main/java/org/tasks/notifications/NotificationDao.kt rename to data/src/main/kotlin/org/tasks/data/NotificationDao.kt index a7120d213..a96025b22 100644 --- a/app/src/main/java/org/tasks/notifications/NotificationDao.kt +++ b/data/src/main/kotlin/org/tasks/data/NotificationDao.kt @@ -1,4 +1,4 @@ -package org.tasks.notifications +package org.tasks.data import androidx.room.Dao import androidx.room.Insert diff --git a/app/src/main/java/org/tasks/data/Place.kt b/data/src/main/kotlin/org/tasks/data/Place.kt similarity index 81% rename from app/src/main/java/org/tasks/data/Place.kt rename to data/src/main/kotlin/org/tasks/data/Place.kt index b8af68061..d6716974b 100644 --- a/app/src/main/java/org/tasks/data/Place.kt +++ b/data/src/main/kotlin/org/tasks/data/Place.kt @@ -1,20 +1,14 @@ package org.tasks.data -import android.content.Context import android.location.Location -import android.net.Uri import android.os.Parcelable import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.Index import androidx.room.PrimaryKey import com.todoroo.andlib.data.Table -import com.todoroo.astrid.api.Filter.Companion.NO_ORDER import com.todoroo.astrid.helper.UUIDHelper import kotlinx.parcelize.Parcelize -import org.tasks.Strings -import org.tasks.extensions.Context.openUri -import org.tasks.location.MapPosition import java.io.Serializable import java.util.regex.Pattern import kotlin.math.abs @@ -56,10 +50,10 @@ data class Place( ) : Serializable, Parcelable { val displayName: String get() { - if (!Strings.isNullOrEmpty(name) && !COORDS.matcher(name!!).matches()) { + if (!name.isNullOrEmpty() && !COORDS.matcher(name!!).matches()) { return name } - return if (!Strings.isNullOrEmpty(address)) { + return if (!address.isNullOrEmpty()) { address!! } else { "${formatCoordinate(latitude, true)} ${formatCoordinate(longitude, false)}" @@ -67,13 +61,7 @@ data class Place( } val displayAddress: String? - get() = if (Strings.isNullOrEmpty(address)) null else address!!.replace("$name, ", "") - - fun open(context: Context?) = - context?.openUri("geo:$latitude,$longitude?q=${Uri.encode(displayName)}") - - val mapPosition: MapPosition - get() = MapPosition(latitude, longitude) + get() = if (address.isNullOrEmpty()) null else address!!.replace("$name, ", "") companion object { const val KEY = "place" diff --git a/app/src/main/java/org/tasks/data/PlaceUsage.kt b/data/src/main/kotlin/org/tasks/data/PlaceUsage.kt similarity index 100% rename from app/src/main/java/org/tasks/data/PlaceUsage.kt rename to data/src/main/kotlin/org/tasks/data/PlaceUsage.kt diff --git a/app/src/main/java/org/tasks/data/Principal.kt b/data/src/main/kotlin/org/tasks/data/Principal.kt similarity index 100% rename from app/src/main/java/org/tasks/data/Principal.kt rename to data/src/main/kotlin/org/tasks/data/Principal.kt diff --git a/app/src/main/java/org/tasks/data/PrincipalAccess.kt b/data/src/main/kotlin/org/tasks/data/PrincipalAccess.kt similarity index 100% rename from app/src/main/java/org/tasks/data/PrincipalAccess.kt rename to data/src/main/kotlin/org/tasks/data/PrincipalAccess.kt diff --git a/app/src/main/java/org/tasks/data/PrincipalDao.kt b/data/src/main/kotlin/org/tasks/data/PrincipalDao.kt similarity index 100% rename from app/src/main/java/org/tasks/data/PrincipalDao.kt rename to data/src/main/kotlin/org/tasks/data/PrincipalDao.kt diff --git a/app/src/main/java/org/tasks/data/PrincipalWithAccess.kt b/data/src/main/kotlin/org/tasks/data/PrincipalWithAccess.kt similarity index 100% rename from app/src/main/java/org/tasks/data/PrincipalWithAccess.kt rename to data/src/main/kotlin/org/tasks/data/PrincipalWithAccess.kt diff --git a/app/src/main/java/org/tasks/data/Tag.kt b/data/src/main/kotlin/org/tasks/data/Tag.kt similarity index 100% rename from app/src/main/java/org/tasks/data/Tag.kt rename to data/src/main/kotlin/org/tasks/data/Tag.kt diff --git a/app/src/main/java/org/tasks/data/TagDao.kt b/data/src/main/kotlin/org/tasks/data/TagDao.kt similarity index 100% rename from app/src/main/java/org/tasks/data/TagDao.kt rename to data/src/main/kotlin/org/tasks/data/TagDao.kt diff --git a/app/src/main/java/org/tasks/data/TagData.kt b/data/src/main/kotlin/org/tasks/data/TagData.kt similarity index 97% rename from app/src/main/java/org/tasks/data/TagData.kt rename to data/src/main/kotlin/org/tasks/data/TagData.kt index 5825b1990..2fa5326b9 100644 --- a/app/src/main/java/org/tasks/data/TagData.kt +++ b/data/src/main/kotlin/org/tasks/data/TagData.kt @@ -7,9 +7,7 @@ import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.Ignore import androidx.room.PrimaryKey -import com.todoroo.astrid.api.Filter.Companion.NO_ORDER import com.todoroo.astrid.data.Task -import org.tasks.themes.CustomIcons.LABEL @Entity(tableName = "tagdata") class TagData : Parcelable { diff --git a/app/src/main/java/org/tasks/data/TagDataDao.kt b/data/src/main/kotlin/org/tasks/data/TagDataDao.kt similarity index 82% rename from app/src/main/java/org/tasks/data/TagDataDao.kt rename to data/src/main/kotlin/org/tasks/data/TagDataDao.kt index 9a1ea7eae..e76e6cc73 100644 --- a/app/src/main/java/org/tasks/data/TagDataDao.kt +++ b/data/src/main/kotlin/org/tasks/data/TagDataDao.kt @@ -8,13 +8,10 @@ import androidx.room.Insert import androidx.room.Query import androidx.room.Transaction import androidx.room.Update -import com.todoroo.astrid.api.Filter.Companion.NO_ORDER import com.todoroo.astrid.data.Task import com.todoroo.astrid.helper.UUIDHelper import org.tasks.db.DbUtils -import org.tasks.filters.AlphanumComparator -import org.tasks.filters.TagFilters -import org.tasks.time.DateTimeUtils.currentTimeMillis +import org.tasks.time.DateTimeUtils2.currentTimeMillis @Dao abstract class TagDataDao { @@ -30,10 +27,8 @@ abstract class TagDataDao { */ suspend fun getTagWithCase(tag: String): String = getTagByName(tag)?.name ?: tag - suspend fun searchTags(query: String): List = searchTagsInternal("%$query%").sort() - @Query("SELECT * FROM tagdata WHERE name LIKE :query AND name NOT NULL AND name != ''") - protected abstract suspend fun searchTagsInternal(query: String): List + abstract suspend fun searchTagsInternal(query: String): List @Query("SELECT * FROM tagdata") abstract suspend fun getAll(): List @@ -84,7 +79,7 @@ abstract class TagDataDao { @Transaction open suspend fun applyTags( - tasks: List, partiallySelected: List, selected: List): List { + tasks: List, partiallySelected: List, selected: List): List { val modified = HashSet() val keep = partiallySelected.plus(selected).map { it.remoteId!! } for (sublist in tasks.chunked(DbUtils.MAX_SQLITE_ARGS - keep.size)) { @@ -158,24 +153,4 @@ abstract class TagDataDao { } else { getTagDataForTask(task.id) }) - - companion object { - private val COMPARATOR = Comparator { 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.sort(): List = - if (all { it.order == NO_ORDER }) { - sortedWith(AlphanumComparator.TAGDATA) - } else { - sortedWith(COMPARATOR) - } - } } \ No newline at end of file diff --git a/data/src/main/kotlin/org/tasks/data/TagFilters.kt b/data/src/main/kotlin/org/tasks/data/TagFilters.kt new file mode 100644 index 000000000..65877fae4 --- /dev/null +++ b/data/src/main/kotlin/org/tasks/data/TagFilters.kt @@ -0,0 +1,8 @@ +package org.tasks.data + +import androidx.room.Embedded + +data class TagFilters( + @JvmField @Embedded var tagData: TagData, + @JvmField var count: Int, +) diff --git a/app/src/main/java/org/tasks/data/TaskAttachment.kt b/data/src/main/kotlin/org/tasks/data/TaskAttachment.kt similarity index 100% rename from app/src/main/java/org/tasks/data/TaskAttachment.kt rename to data/src/main/kotlin/org/tasks/data/TaskAttachment.kt diff --git a/app/src/main/java/org/tasks/data/TaskAttachmentDao.kt b/data/src/main/kotlin/org/tasks/data/TaskAttachmentDao.kt similarity index 100% rename from app/src/main/java/org/tasks/data/TaskAttachmentDao.kt rename to data/src/main/kotlin/org/tasks/data/TaskAttachmentDao.kt diff --git a/app/src/main/java/org/tasks/data/TaskContainer.kt b/data/src/main/kotlin/org/tasks/data/TaskContainer.kt similarity index 92% rename from app/src/main/java/org/tasks/data/TaskContainer.kt rename to data/src/main/kotlin/org/tasks/data/TaskContainer.kt index cb9a54786..8af31ed96 100644 --- a/app/src/main/java/org/tasks/data/TaskContainer.kt +++ b/data/src/main/kotlin/org/tasks/data/TaskContainer.kt @@ -37,14 +37,8 @@ data class TaskContainer( val notes: String? get() = task.notes - fun hasNotes(): Boolean { - return task.hasNotes() - } - val title: String? get() = task.title - val isHidden: Boolean - get() = task.isHidden val isCompleted: Boolean get() = task.isCompleted @@ -56,8 +50,6 @@ data class TaskContainer( return task.hasDueTime() } - val isOverdue: Boolean - get() = task.isOverdue val dueDate: Long get() = task.dueDate val id: Long diff --git a/app/src/main/java/org/tasks/data/TaskDao.kt b/data/src/main/kotlin/org/tasks/data/TaskDao.kt similarity index 75% rename from app/src/main/java/org/tasks/data/TaskDao.kt rename to data/src/main/kotlin/org/tasks/data/TaskDao.kt index 083ac0002..b83e0159f 100644 --- a/app/src/main/java/org/tasks/data/TaskDao.kt +++ b/data/src/main/kotlin/org/tasks/data/TaskDao.kt @@ -8,21 +8,15 @@ import androidx.room.Update import androidx.room.withTransaction import androidx.sqlite.db.SimpleSQLiteQuery import com.todoroo.andlib.sql.Criterion -import com.todoroo.andlib.sql.Field import com.todoroo.andlib.sql.Functions -import com.todoroo.andlib.utility.DateUtilities.now -import com.todoroo.astrid.api.Filter -import com.todoroo.astrid.api.PermaSql import com.todoroo.astrid.dao.Database import com.todoroo.astrid.data.Task import com.todoroo.astrid.data.Task.Companion.NO_ID import com.todoroo.astrid.helper.UUIDHelper -import org.tasks.BuildConfig import org.tasks.data.Alarm.Companion.TYPE_SNOOZE import org.tasks.db.SuspendDbUtils.chunkedMap import org.tasks.db.SuspendDbUtils.eachChunk -import org.tasks.preferences.QueryPreferences -import org.tasks.time.DateTimeUtils.currentTimeMillis +import org.tasks.time.DateTimeUtils2.currentTimeMillis import timber.log.Timber private const val MAX_TIME = 9999999999999 @@ -42,7 +36,7 @@ FROM ( WHERE completed = 0 AND deleted = 0 ) """) - abstract suspend fun nextRefresh(now: Long = now()): Long + abstract suspend fun nextRefresh(now: Long = currentTimeMillis()): Long @Query("SELECT * FROM tasks WHERE _id = :id LIMIT 1") abstract suspend fun fetch(id: Long): Task? @@ -75,7 +69,7 @@ FROM ( abstract suspend fun getRecurringTasks(remoteIds: List): List @Query("UPDATE tasks SET completed = :completionDate, modified = :updateTime WHERE remoteId IN (:remoteIds)") - abstract suspend fun setCompletionDate(remoteIds: List, completionDate: Long, updateTime: Long = now()) + abstract suspend fun setCompletionDate(remoteIds: List, completionDate: Long, updateTime: Long = currentTimeMillis()) @Query("SELECT tasks.* FROM tasks " + "LEFT JOIN caldav_tasks ON tasks._id = caldav_tasks.cd_task " @@ -115,30 +109,25 @@ FROM ( open suspend fun fetchTasks(callback: suspend () -> List): List = database.withTransaction { - val start = if (BuildConfig.DEBUG) now() else 0 + val start = if (BuildConfig.DEBUG) currentTimeMillis() else 0 val queries = callback() val last = queries.size - 1 for (i in 0 until last) { query(SimpleSQLiteQuery(queries[i])) } val result = fetchTasks(SimpleSQLiteQuery(queries[last])) - Timber.v("%sms: %s", now() - start, queries.joinToString(";\n")) + Timber.v("%sms: %s", currentTimeMillis() - start, queries.joinToString(";\n")) result } - suspend fun fetchTasks(preferences: QueryPreferences, filter: Filter): List = - fetchTasks { - TaskListQuery.getQuery(preferences, filter) - } - @RawQuery internal abstract suspend fun query(query: SimpleSQLiteQuery): Int @RawQuery - internal abstract suspend fun fetchTasks(query: SimpleSQLiteQuery): List + abstract suspend fun fetchTasks(query: SimpleSQLiteQuery): List @RawQuery - abstract suspend fun count(query: SimpleSQLiteQuery): Int + abstract suspend fun countRaw(query: SimpleSQLiteQuery): Int suspend fun touch(ids: List, now: Long = currentTimeMillis()) = ids.eachChunk { internalTouch(it, now) } @@ -147,7 +136,7 @@ FROM ( internal abstract suspend fun internalTouch(ids: List, now: Long = currentTimeMillis()) @Query("UPDATE tasks SET `order` = :order WHERE _id = :id") - internal abstract suspend fun setOrder(id: Long, order: Long?) + abstract suspend fun setOrder(id: Long, order: Long?) suspend fun setParent(parent: Long, tasks: List) = tasks.eachChunk { setParentInternal(parent, it) } @@ -188,22 +177,15 @@ FROM recursive_tasks """) abstract suspend fun getParents(parent: Long): List - internal suspend fun setCollapsed(preferences: QueryPreferences, filter: Filter, collapsed: Boolean) { - fetchTasks(preferences, filter) - .filter(TaskContainer::hasChildren) - .map(TaskContainer::id) - .eachChunk { setCollapsed(it, collapsed) } - } - @Query("UPDATE tasks SET collapsed = :collapsed, modified = :now WHERE _id IN (:ids)") - internal abstract suspend fun setCollapsed(ids: List, collapsed: Boolean, now: Long = now()) + abstract suspend fun setCollapsed(ids: List, collapsed: Boolean, now: Long = currentTimeMillis()) @Insert abstract suspend fun insert(task: Task): Long suspend fun update(task: Task, original: Task? = null): Boolean { if (!task.insignificantChange(original)) { - task.modificationDate = now() + task.modificationDate = currentTimeMillis() } return updateInternal(task) == 1 } @@ -212,12 +194,12 @@ FROM recursive_tasks internal abstract suspend fun updateInternal(task: Task): Int @Update - internal abstract suspend fun updateInternal(tasks: List) + abstract suspend fun updateInternal(tasks: List) suspend fun createNew(task: Task): Long { task.id = NO_ID if (task.creationDate == 0L) { - task.creationDate = now() + task.creationDate = currentTimeMillis() } if (Task.isUuidEmpty(task.remoteId)) { task.remoteId = UUIDHelper.newUUID() @@ -230,24 +212,6 @@ FROM recursive_tasks return task.id } - suspend fun count(filter: Filter): Int { - val query = getQuery(filter.sql!!, Field.COUNT) - val start = if (BuildConfig.DEBUG) now() else 0 - val count = count(query) - Timber.v("%sms: %s", now() - start, query.sql) - return count - } - - suspend fun fetchFiltered(filter: Filter): List = fetchFiltered(filter.sql!!) - - suspend fun fetchFiltered(queryTemplate: String): List { - val query = getQuery(queryTemplate, Task.FIELDS) - val start = if (BuildConfig.DEBUG) now() else 0 - val tasks = fetchTasks(query) - Timber.v("%sms: %s", now() - start, query.sql) - return tasks.map(TaskContainer::task) - } - @Query(""" SELECT _id FROM tasks @@ -266,13 +230,4 @@ WHERE cd_id IS NULL Task.DELETION_DATE.lte(0), Task.HIDE_UNTIL.lte(Functions.now())) } - - companion object { - fun getQuery(queryTemplate: String, vararg fields: Field): SimpleSQLiteQuery = - SimpleSQLiteQuery( - com.todoroo.andlib.sql.Query.select(*fields) - .withQueryTemplate(PermaSql.replacePlaceholdersForQuery(queryTemplate)) - .from(Task.TABLE) - .toString()) - } } \ No newline at end of file diff --git a/app/src/main/java/org/tasks/data/TaskListMetadata.kt b/data/src/main/kotlin/org/tasks/data/TaskListMetadata.kt similarity index 100% rename from app/src/main/java/org/tasks/data/TaskListMetadata.kt rename to data/src/main/kotlin/org/tasks/data/TaskListMetadata.kt diff --git a/app/src/main/java/org/tasks/data/TaskListMetadataDao.kt b/data/src/main/kotlin/org/tasks/data/TaskListMetadataDao.kt similarity index 100% rename from app/src/main/java/org/tasks/data/TaskListMetadataDao.kt rename to data/src/main/kotlin/org/tasks/data/TaskListMetadataDao.kt diff --git a/app/src/main/java/org/tasks/data/UpgraderDao.kt b/data/src/main/kotlin/org/tasks/data/UpgraderDao.kt similarity index 100% rename from app/src/main/java/org/tasks/data/UpgraderDao.kt rename to data/src/main/kotlin/org/tasks/data/UpgraderDao.kt diff --git a/app/src/main/java/org/tasks/data/UserActivity.kt b/data/src/main/kotlin/org/tasks/data/UserActivity.kt similarity index 94% rename from app/src/main/java/org/tasks/data/UserActivity.kt rename to data/src/main/kotlin/org/tasks/data/UserActivity.kt index 4f1d9192e..60b7bb099 100644 --- a/app/src/main/java/org/tasks/data/UserActivity.kt +++ b/data/src/main/kotlin/org/tasks/data/UserActivity.kt @@ -11,7 +11,6 @@ import com.todoroo.andlib.data.Table import com.todoroo.astrid.data.Task import org.json.JSONException import org.json.JSONObject -import org.tasks.Strings import timber.log.Timber import java.io.File @@ -57,7 +56,7 @@ class UserActivity : Parcelable { } val pictureUri: Uri? - get() = if (Strings.isNullOrEmpty(picture)) null else Uri.parse(picture) + get() = if (picture.isNullOrBlank()) null else Uri.parse(picture) fun convertPictureUri() { setPicture(getLegacyPictureUri(picture)) @@ -88,7 +87,7 @@ class UserActivity : Parcelable { private fun getLegacyPictureUri(value: String?): Uri? { return try { - if (Strings.isNullOrEmpty(value)) { + if (value.isNullOrBlank()) { return null } if (value!!.contains("uri") || value.contains("path")) { diff --git a/app/src/main/java/org/tasks/data/UserActivityDao.kt b/data/src/main/kotlin/org/tasks/data/UserActivityDao.kt similarity index 82% rename from app/src/main/java/org/tasks/data/UserActivityDao.kt rename to data/src/main/kotlin/org/tasks/data/UserActivityDao.kt index 993b6d2ec..3bd5de556 100644 --- a/app/src/main/java/org/tasks/data/UserActivityDao.kt +++ b/data/src/main/kotlin/org/tasks/data/UserActivityDao.kt @@ -1,10 +1,14 @@ package org.tasks.data -import androidx.room.* -import com.todoroo.andlib.utility.DateUtilities +import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.Query +import androidx.room.Update import com.todoroo.astrid.data.Task import com.todoroo.astrid.helper.UUIDHelper import kotlinx.coroutines.flow.Flow +import org.tasks.time.DateTimeUtils2.currentTimeMillis @Dao abstract class UserActivityDao { @@ -28,7 +32,7 @@ abstract class UserActivityDao { suspend fun createNew(item: UserActivity) { if (item.created == null || item.created == 0L) { - item.created = DateUtilities.now() + item.created = currentTimeMillis() } if (Task.isUuidEmpty(item.remoteId)) { item.remoteId = UUIDHelper.newUUID() diff --git a/app/src/main/java/org/tasks/db/DbUtils.kt b/data/src/main/kotlin/org/tasks/db/DbUtils.kt similarity index 100% rename from app/src/main/java/org/tasks/db/DbUtils.kt rename to data/src/main/kotlin/org/tasks/db/DbUtils.kt diff --git a/app/src/main/java/org/tasks/db/SuspendDbUtils.kt b/data/src/main/kotlin/org/tasks/db/SuspendDbUtils.kt similarity index 100% rename from app/src/main/java/org/tasks/db/SuspendDbUtils.kt rename to data/src/main/kotlin/org/tasks/db/SuspendDbUtils.kt diff --git a/data/src/main/kotlin/org/tasks/time/DateTimeUtils.kt b/data/src/main/kotlin/org/tasks/time/DateTimeUtils.kt new file mode 100644 index 000000000..0cc6c5e75 --- /dev/null +++ b/data/src/main/kotlin/org/tasks/time/DateTimeUtils.kt @@ -0,0 +1,27 @@ +package org.tasks.time + +import org.tasks.data.BuildConfig +import java.util.Date + +object DateTimeUtils2 { + @JvmStatic + fun currentTimeMillis(): Long { + return MILLIS_PROVIDER.millis + } + + private val SYSTEM_MILLIS_PROVIDER = SystemMillisProvider() + + @Volatile + private var MILLIS_PROVIDER: MillisProvider = SYSTEM_MILLIS_PROVIDER + + fun setCurrentMillisFixed(millis: Long) { + MILLIS_PROVIDER = FixedMillisProvider(millis) + } + + fun setCurrentMillisSystem() { + MILLIS_PROVIDER = SYSTEM_MILLIS_PROVIDER + } +} + +fun printTimestamp(timestamp: Long): String = + if (BuildConfig.DEBUG) Date(timestamp).toString() else timestamp.toString() \ No newline at end of file diff --git a/data/src/main/kotlin/org/tasks/time/FixedMillisProvider.kt b/data/src/main/kotlin/org/tasks/time/FixedMillisProvider.kt new file mode 100644 index 000000000..f26f78586 --- /dev/null +++ b/data/src/main/kotlin/org/tasks/time/FixedMillisProvider.kt @@ -0,0 +1,3 @@ +package org.tasks.time + +class FixedMillisProvider(override val millis: Long) : MillisProvider diff --git a/data/src/main/kotlin/org/tasks/time/MillisProvider.kt b/data/src/main/kotlin/org/tasks/time/MillisProvider.kt new file mode 100644 index 000000000..d786c95ac --- /dev/null +++ b/data/src/main/kotlin/org/tasks/time/MillisProvider.kt @@ -0,0 +1,5 @@ +package org.tasks.time + +internal interface MillisProvider { + val millis: Long +} diff --git a/data/src/main/kotlin/org/tasks/time/SystemMillisProvider.kt b/data/src/main/kotlin/org/tasks/time/SystemMillisProvider.kt new file mode 100644 index 000000000..f7a8707f2 --- /dev/null +++ b/data/src/main/kotlin/org/tasks/time/SystemMillisProvider.kt @@ -0,0 +1,6 @@ +package org.tasks.time + +class SystemMillisProvider : MillisProvider { + override val millis: Long + get() = System.currentTimeMillis() +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 39bec121d..0a32fb7a4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -74,10 +74,12 @@ androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "a androidx-compose = { module = "androidx.compose:compose-bom", version.ref = "compose" } androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3" } androidx-constraintlayout = { module = "androidx.constraintlayout:constraintlayout", version.ref = "constraintlayout" } +androidx-core = { group = "androidx.core", name = "core", version = "1.13.1" } androidx-fragment-ktx = { module = "androidx.fragment:fragment-ktx", version.ref = "fragment-ktx" } androidx-hilt-compiler = { module = "androidx.hilt:hilt-compiler", version.ref = "hilt" } androidx-hilt-work = { module = "androidx.hilt:hilt-work", version.ref = "hilt" } androidx-junit = { module = "androidx.test.ext:junit", version.ref = "junit" } +androidx-lifecycle-livedata = { group = "androidx.lifecycle", name = "lifecycle-livedata-core-ktx", version.ref = "lifecycle" } androidx-lifecycle-runtime = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycle" } androidx-lifecycle-viewmodel = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "lifecycle" } androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycle" } @@ -158,5 +160,3 @@ retrofit-moshi = { module = "com.squareup.retrofit2:converter-moshi", version.re shortcut-badger = { module = "me.leolin:ShortcutBadger", version.ref = "shortcut-badger" } timber = { module = "com.jakewharton.timber:timber", version.ref = "timber" } xpp3 = { module = "org.ogce:xpp3", version.ref = "xpp3" } - -[plugins] diff --git a/settings.gradle.kts b/settings.gradle.kts index 7c438a013..c43cf6e95 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1 +1,2 @@ include("app") +include("data")