diff --git a/app/src/androidTest/java/com/todoroo/astrid/adapter/CaldavManualSortTaskAdapterTest.kt b/app/src/androidTest/java/com/todoroo/astrid/adapter/CaldavManualSortTaskAdapterTest.kt index eeea43177..9f28a289e 100644 --- a/app/src/androidTest/java/com/todoroo/astrid/adapter/CaldavManualSortTaskAdapterTest.kt +++ b/app/src/androidTest/java/com/todoroo/astrid/adapter/CaldavManualSortTaskAdapterTest.kt @@ -43,7 +43,7 @@ class CaldavManualSortTaskAdapterTest : InjectingTestCase() { private lateinit var adapter: CaldavManualSortTaskAdapter private val tasks = ArrayList() - private val filter = CaldavFilter(CaldavCalendar("calendar", "1234")) + private val filter = CaldavFilter(CaldavCalendar(name = "calendar", uuid = "1234")) private val dataSource = object : TaskAdapterDataSource { override fun getItem(position: Int) = tasks[position] diff --git a/app/src/androidTest/java/com/todoroo/astrid/service/TaskMoverTest.kt b/app/src/androidTest/java/com/todoroo/astrid/service/TaskMoverTest.kt index 8e0c88fa1..8a43ee777 100644 --- a/app/src/androidTest/java/com/todoroo/astrid/service/TaskMoverTest.kt +++ b/app/src/androidTest/java/com/todoroo/astrid/service/TaskMoverTest.kt @@ -300,6 +300,6 @@ class TaskMoverTest : InjectingTestCase() { } private suspend fun moveToCaldavList(calendar: String, vararg tasks: Long) { - taskMover.move(tasks.toList(), CaldavFilter(CaldavCalendar("", calendar))) + taskMover.move(tasks.toList(), CaldavFilter(CaldavCalendar(name = "", uuid = calendar))) } } \ No newline at end of file diff --git a/app/src/androidTest/java/org/tasks/data/DeletionDaoTests.kt b/app/src/androidTest/java/org/tasks/data/DeletionDaoTests.kt index 60531b194..b207ce5aa 100644 --- a/app/src/androidTest/java/org/tasks/data/DeletionDaoTests.kt +++ b/app/src/androidTest/java/org/tasks/data/DeletionDaoTests.kt @@ -60,7 +60,7 @@ class DeletionDaoTests : InjectingTestCase() { fun purgeDeletedLocalTask() = runBlocking { val task = newTask(with(DELETION_TIME, newDateTime())) taskDao.createNew(task) - caldavDao.insert(CaldavCalendar("", "1234").apply { account = LOCAL }) + caldavDao.insert(CaldavCalendar(name = "", uuid = "1234", account = LOCAL)) caldavDao.insert(CaldavTask(task.id, "1234")) deletionDao.purgeDeleted() @@ -72,7 +72,7 @@ class DeletionDaoTests : InjectingTestCase() { fun dontPurgeActiveTasks() = runBlocking { val task = newTask() taskDao.createNew(task) - caldavDao.insert(CaldavCalendar("", "1234").apply { account = LOCAL }) + caldavDao.insert(CaldavCalendar(name = "", uuid = "1234", account = LOCAL)) caldavDao.insert(CaldavTask(task.id, "1234")) deletionDao.purgeDeleted() @@ -84,7 +84,7 @@ class DeletionDaoTests : InjectingTestCase() { fun dontPurgeDeletedCaldavTask() = runBlocking { val task = newTask(with(DELETION_TIME, newDateTime())) taskDao.createNew(task) - caldavDao.insert(CaldavCalendar("", "1234").apply { account = UUIDHelper.newUUID() }) + caldavDao.insert(CaldavCalendar(name = "", uuid = "1234", account = UUIDHelper.newUUID())) caldavDao.insert(CaldavTask(task.id, "1234")) deletionDao.purgeDeleted() diff --git a/app/src/main/java/com/todoroo/astrid/service/Upgrader.kt b/app/src/main/java/com/todoroo/astrid/service/Upgrader.kt index 65a7e221e..737dff0ba 100644 --- a/app/src/main/java/com/todoroo/astrid/service/Upgrader.kt +++ b/app/src/main/java/com/todoroo/astrid/service/Upgrader.kt @@ -129,8 +129,9 @@ class Upgrader @Inject constructor( preferences.setInt( R.string.p_theme_color, getAndroidColor(preferences.getInt(R.string.p_theme_color, 7))) for (calendar in caldavDao.getCalendars()) { - calendar.color = getAndroidColor(calendar.color) - caldavDao.update(calendar) + caldavDao.update( + calendar.copy(color = getAndroidColor(calendar.color)) + ) } for (list in googleTaskListDao.getAllLists()) { list.setColor(getAndroidColor(list.getColor()!!)) diff --git a/app/src/main/java/org/tasks/backup/TasksJsonImporter.kt b/app/src/main/java/org/tasks/backup/TasksJsonImporter.kt index dd08be348..f5f597005 100644 --- a/app/src/main/java/org/tasks/backup/TasksJsonImporter.kt +++ b/app/src/main/java/org/tasks/backup/TasksJsonImporter.kt @@ -109,8 +109,9 @@ class TasksJsonImporter @Inject constructor( } backupContainer.caldavCalendars?.forEach { calendar -> if (caldavDao.getCalendarByUuid(calendar.uuid!!) == null) { - calendar.color = themeToColor(context, version, calendar.color) - caldavDao.insert(calendar) + caldavDao.insert( + calendar.copy(color = themeToColor(context, version, calendar.color)) + ) } } backupContainer.taskListMetadata?.forEach { tlm -> diff --git a/app/src/main/java/org/tasks/caldav/BaseCaldavCalendarSettingsActivity.kt b/app/src/main/java/org/tasks/caldav/BaseCaldavCalendarSettingsActivity.kt index ac4778f44..68567ecf9 100644 --- a/app/src/main/java/org/tasks/caldav/BaseCaldavCalendarSettingsActivity.kt +++ b/app/src/main/java/org/tasks/caldav/BaseCaldavCalendarSettingsActivity.kt @@ -155,13 +155,14 @@ abstract class BaseCaldavCalendarSettingsActivity : BaseListSettingsActivity() { } protected suspend fun createSuccessful(url: String?) { - val caldavCalendar = CaldavCalendar() - caldavCalendar.uuid = UUIDHelper.newUUID() - caldavCalendar.account = caldavAccount.uuid - caldavCalendar.url = url - caldavCalendar.name = newName - caldavCalendar.color = selectedColor - caldavCalendar.setIcon(selectedIcon) + val caldavCalendar = CaldavCalendar( + uuid = UUIDHelper.newUUID(), + account = caldavAccount.uuid, + url = url, + name = newName, + color = selectedColor, + icon = selectedIcon, + ) caldavDao.insert(caldavCalendar) setResult( Activity.RESULT_OK, diff --git a/app/src/main/java/org/tasks/caldav/CaldavCalendarViewModel.kt b/app/src/main/java/org/tasks/caldav/CaldavCalendarViewModel.kt index a548a385a..67effb04d 100644 --- a/app/src/main/java/org/tasks/caldav/CaldavCalendarViewModel.kt +++ b/app/src/main/java/org/tasks/caldav/CaldavCalendarViewModel.kt @@ -9,13 +9,9 @@ import com.todoroo.astrid.service.TaskDeleter import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import org.tasks.data.CaldavAccount -import org.tasks.data.CaldavCalendar +import org.tasks.data.* import org.tasks.data.CaldavCalendar.Companion.ACCESS_READ_WRITE import org.tasks.data.CaldavCalendar.Companion.INVITE_UNKNOWN -import org.tasks.data.CaldavDao -import org.tasks.data.PrincipalDao -import org.tasks.data.PrincipalWithAccess import org.tasks.sync.SyncAdapters import javax.inject.Inject @@ -39,13 +35,14 @@ class CaldavCalendarViewModel @Inject constructor( val url = withContext(Dispatchers.IO) { provider.forAccount(caldavAccount).makeCollection(name, color) } - val calendar = CaldavCalendar().apply { - uuid = UUIDHelper.newUUID() - account = caldavAccount.uuid - this.url = url - this.name = name - this.color = color - setIcon(icon) + val calendar = CaldavCalendar( + uuid = UUIDHelper.newUUID(), + account = caldavAccount.uuid, + url = url, + name = name, + color = color, + icon = icon, + ).apply { caldavDao.insert(this) } if (!ignoreFinish) { diff --git a/app/src/main/java/org/tasks/caldav/CaldavSynchronizer.kt b/app/src/main/java/org/tasks/caldav/CaldavSynchronizer.kt index dddf976d8..bab01564f 100644 --- a/app/src/main/java/org/tasks/caldav/CaldavSynchronizer.kt +++ b/app/src/main/java/org/tasks/caldav/CaldavSynchronizer.kt @@ -1,26 +1,15 @@ package org.tasks.caldav import android.content.Context -import at.bitfire.dav4jvm.DavCalendar +import at.bitfire.dav4jvm.* import at.bitfire.dav4jvm.DavCalendar.Companion.MIME_ICALENDAR -import at.bitfire.dav4jvm.DavResource -import at.bitfire.dav4jvm.Property -import at.bitfire.dav4jvm.PropertyRegistry -import at.bitfire.dav4jvm.Response import at.bitfire.dav4jvm.Response.HrefRelation import at.bitfire.dav4jvm.exception.DavException import at.bitfire.dav4jvm.exception.HttpException import at.bitfire.dav4jvm.exception.ServiceUnavailableException import at.bitfire.dav4jvm.exception.UnauthorizedException -import at.bitfire.dav4jvm.property.CalendarColor -import at.bitfire.dav4jvm.property.CalendarData -import at.bitfire.dav4jvm.property.CurrentUserPrincipal -import at.bitfire.dav4jvm.property.CurrentUserPrivilegeSet -import at.bitfire.dav4jvm.property.DisplayName -import at.bitfire.dav4jvm.property.GetCTag -import at.bitfire.dav4jvm.property.GetETag +import at.bitfire.dav4jvm.property.* import at.bitfire.dav4jvm.property.GetETag.Companion.fromResponse -import at.bitfire.dav4jvm.property.SyncToken import at.bitfire.ical4android.ICalendar.Companion.prodId import com.todoroo.astrid.dao.TaskDao import com.todoroo.astrid.data.Task @@ -39,25 +28,18 @@ import org.tasks.Strings.isNullOrEmpty import org.tasks.analytics.Firebase import org.tasks.billing.Inventory import org.tasks.caldav.iCalendar.Companion.fromVtodo -import org.tasks.caldav.property.Invite -import org.tasks.caldav.property.OCAccess -import org.tasks.caldav.property.OCInvite -import org.tasks.caldav.property.OCOwnerPrincipal -import org.tasks.caldav.property.OCUser +import org.tasks.caldav.property.* import org.tasks.caldav.property.PropertyUtils.register -import org.tasks.caldav.property.ShareAccess import org.tasks.caldav.property.ShareAccess.Companion.READ import org.tasks.caldav.property.ShareAccess.Companion.READ_WRITE import org.tasks.caldav.property.ShareAccess.Companion.SHARED_OWNER -import org.tasks.caldav.property.Sharee -import org.tasks.data.CaldavAccount +import org.tasks.data.* import org.tasks.data.CaldavAccount.Companion.ERROR_UNAUTHORIZED import org.tasks.data.CaldavAccount.Companion.SERVER_OPEN_XCHANGE import org.tasks.data.CaldavAccount.Companion.SERVER_OWNCLOUD import org.tasks.data.CaldavAccount.Companion.SERVER_SABREDAV import org.tasks.data.CaldavAccount.Companion.SERVER_TASKS import org.tasks.data.CaldavAccount.Companion.SERVER_UNKNOWN -import org.tasks.data.CaldavCalendar import org.tasks.data.CaldavCalendar.Companion.ACCESS_OWNER import org.tasks.data.CaldavCalendar.Companion.ACCESS_READ_ONLY import org.tasks.data.CaldavCalendar.Companion.ACCESS_READ_WRITE @@ -67,10 +49,6 @@ import org.tasks.data.CaldavCalendar.Companion.INVITE_DECLINED import org.tasks.data.CaldavCalendar.Companion.INVITE_INVALID import org.tasks.data.CaldavCalendar.Companion.INVITE_NO_RESPONSE import org.tasks.data.CaldavCalendar.Companion.INVITE_UNKNOWN -import org.tasks.data.CaldavDao -import org.tasks.data.CaldavTask -import org.tasks.data.PrincipalAccess -import org.tasks.data.PrincipalDao import timber.log.Timber import java.io.IOException import java.net.ConnectException @@ -178,13 +156,14 @@ class CaldavSynchronizer @Inject constructor( } val color = calendarColor?.color ?: 0 if (calendar == null) { - calendar = CaldavCalendar() - calendar.name = remoteName - calendar.account = account.uuid - calendar.url = url - calendar.uuid = UUIDHelper.newUUID() - calendar.color = color - calendar.access = access + calendar = CaldavCalendar( + name = remoteName, + account = account.uuid, + url = url, + uuid = UUIDHelper.newUUID(), + color = color, + access = access, + ) caldavDao.insert(calendar) } else if (calendar.name != remoteName || calendar.color != color diff --git a/app/src/main/java/org/tasks/data/CaldavCalendar.kt b/app/src/main/java/org/tasks/data/CaldavCalendar.kt index 61662cfe9..16a59a60e 100644 --- a/app/src/main/java/org/tasks/data/CaldavCalendar.kt +++ b/app/src/main/java/org/tasks/data/CaldavCalendar.kt @@ -12,61 +12,35 @@ import com.todoroo.astrid.data.Task import org.tasks.themes.CustomIcons.LIST @Entity(tableName = "caldav_lists") -class CaldavCalendar : Parcelable { +data class CaldavCalendar( @PrimaryKey(autoGenerate = true) - @ColumnInfo(name = "cdl_id") @Transient - var id: Long = 0 - - @ColumnInfo(name = "cdl_account") - var account: String? = Task.NO_UUID - - @ColumnInfo(name = "cdl_uuid") - var uuid: String? = Task.NO_UUID - - @ColumnInfo(name = "cdl_name") - var name: String? = "" - - @ColumnInfo(name = "cdl_color") - var color = 0 - - @ColumnInfo(name = "cdl_ctag") - var ctag: String? = null - - @ColumnInfo(name = "cdl_url") - var url: String? = "" - - @ColumnInfo(name = "cdl_icon") - private var icon: Int? = -1 - - @ColumnInfo(name = "cdl_order") - var order = NO_ORDER - - @ColumnInfo(name = "cdl_access") - var access = ACCESS_OWNER - - constructor() - - @Ignore - constructor(name: String?, uuid: String?) { - this.name = name - this.uuid = uuid - } - + @ColumnInfo(name = "cdl_id") var id: Long = 0, + @ColumnInfo(name = "cdl_account") val account: String? = Task.NO_UUID, + @ColumnInfo(name = "cdl_uuid") var uuid: String? = Task.NO_UUID, + @ColumnInfo(name = "cdl_name") var name: String? = "", + @ColumnInfo(name = "cdl_color") var color: Int = 0, + @ColumnInfo(name = "cdl_ctag") var ctag: String? = null, + @ColumnInfo(name = "cdl_url") var url: String? = "", + @ColumnInfo(name = "cdl_icon") private var icon: Int? = -1, + @ColumnInfo(name = "cdl_order") val order: Int = NO_ORDER, + @ColumnInfo(name = "cdl_access") var access: Int = ACCESS_OWNER, +) : Parcelable { @Ignore - constructor(source: Parcel) { - id = source.readLong() - account = source.readString() - uuid = source.readString() - name = source.readString() - color = source.readInt() - ctag = source.readString() - url = source.readString() - icon = source.readInt() - order = source.readInt() - access = source.readInt() - } - + constructor(source: Parcel): this( + id = source.readLong(), + account = source.readString(), + uuid = source.readString(), + name = source.readString(), + color = source.readInt(), + ctag = source.readString(), + url = source.readString(), + icon = source.readInt(), + order = source.readInt(), + access = source.readInt(), + ) + + @Suppress("RedundantNullableReturnType") fun getIcon(): Int? { return (if (icon == null) LIST else icon!!) } @@ -92,42 +66,6 @@ class CaldavCalendar : Parcelable { } } - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other !is CaldavCalendar) return false - - if (id != other.id) return false - if (account != other.account) return false - if (uuid != other.uuid) return false - if (name != other.name) return false - if (color != other.color) return false - if (ctag != other.ctag) return false - if (url != other.url) return false - if (icon != other.icon) return false - if (order != other.order) return false - if (access != other.access) return false - - return true - } - - override fun hashCode(): Int { - var result = id.hashCode() - result = 31 * result + (account?.hashCode() ?: 0) - result = 31 * result + (uuid?.hashCode() ?: 0) - result = 31 * result + (name?.hashCode() ?: 0) - result = 31 * result + color - result = 31 * result + (ctag?.hashCode() ?: 0) - result = 31 * result + (url?.hashCode() ?: 0) - result = 31 * result + (icon ?: 0) - result = 31 * result + order - result = 31 * result + access - return result - } - - override fun toString(): String { - return "CaldavCalendar(id=$id, account=$account, uuid=$uuid, name=$name, color=$color, ctag=$ctag, url=$url, icon=$icon, order=$order, access=$access)" - } - companion object { const val ACCESS_UNKNOWN = -1 const val ACCESS_OWNER = 0 @@ -140,10 +78,10 @@ class CaldavCalendar : Parcelable { const val INVITE_DECLINED = 2 const val INVITE_INVALID = 3 - @JvmField val TABLE = Table("caldav_lists") + val TABLE = Table("caldav_lists") val ACCOUNT = TABLE.column("cdl_account") - @JvmField val UUID = TABLE.column("cdl_uuid") - @JvmField val NAME = TABLE.column("cdl_name") + val UUID = TABLE.column("cdl_uuid") + val NAME = TABLE.column("cdl_name") @JvmField val CREATOR: Parcelable.Creator = object : Parcelable.Creator { override fun createFromParcel(source: Parcel): CaldavCalendar = CaldavCalendar(source) diff --git a/app/src/main/java/org/tasks/data/CaldavDao.kt b/app/src/main/java/org/tasks/data/CaldavDao.kt index c84ce9144..49b6cdf35 100644 --- a/app/src/main/java/org/tasks/data/CaldavDao.kt +++ b/app/src/main/java/org/tasks/data/CaldavDao.kt @@ -338,8 +338,11 @@ GROUP BY caldav_lists.cdl_uuid private suspend fun getLocalList(context: Context, account: CaldavAccount): CaldavCalendar = getCalendarsByAccount(account.uuid!!).getOrNull(0) - ?: CaldavCalendar(context.getString(R.string.default_list), UUIDHelper.newUUID()).apply { - this.account = account.uuid + ?: CaldavCalendar( + name = context.getString(R.string.default_list), + uuid = UUIDHelper.newUUID(), + account = account.uuid, + ).apply { insert(this) } diff --git a/app/src/main/java/org/tasks/data/OpenTaskDao.kt b/app/src/main/java/org/tasks/data/OpenTaskDao.kt index 957b3c85d..d72e643ba 100644 --- a/app/src/main/java/org/tasks/data/OpenTaskDao.kt +++ b/app/src/main/java/org/tasks/data/OpenTaskDao.kt @@ -47,16 +47,18 @@ open class OpenTaskDao @Inject constructor( while (it.moveToNext()) { val accountType = it.getString(TaskLists.ACCOUNT_TYPE) val accountName = it.getString(TaskLists.ACCOUNT_NAME) - calendars.add(CaldavCalendar().apply { - id = it.getLong(TaskLists._ID) - account = "$accountType:$accountName" - name = it.getString(TaskLists.LIST_NAME) - color = it.getInt(TaskLists.LIST_COLOR) - url = it.getString(CommonSyncColumns._SYNC_ID) - ctag = it.getString(TaskLists.SYNC_VERSION) + calendars.add( + CaldavCalendar( + id = it.getLong(TaskLists._ID), + account = "$accountType:$accountName", + name = it.getString(TaskLists.LIST_NAME), + color = it.getInt(TaskLists.LIST_COLOR), + url = it.getString(CommonSyncColumns._SYNC_ID), + ctag = it.getString(TaskLists.SYNC_VERSION) ?.let(::JSONObject) ?.getString("value") - }) + ) + ) } } calendars @@ -164,16 +166,15 @@ open class OpenTaskDao @Inject constructor( getLong(getColumnIndexOrThrow(columnName)) fun CaldavCalendar.toLocalCalendar(): CaldavCalendar { - val remote = this - return CaldavCalendar().apply { + return CaldavCalendar( uuid = UUID - .nameUUIDFromBytes("${account.openTaskType()}${remote.url}".toByteArray()) - .toString() - url = remote.url - color = remote.color - name = remote.name - account = remote.account - } + .nameUUIDFromBytes("${account.openTaskType()}$url".toByteArray()) + .toString(), + url = url, + color = color, + name = name, + account = account, + ) } } } \ No newline at end of file diff --git a/app/src/main/java/org/tasks/etebase/EtebaseSynchronizer.kt b/app/src/main/java/org/tasks/etebase/EtebaseSynchronizer.kt index 5c5b39d03..8a021d8f7 100644 --- a/app/src/main/java/org/tasks/etebase/EtebaseSynchronizer.kt +++ b/app/src/main/java/org/tasks/etebase/EtebaseSynchronizer.kt @@ -85,12 +85,13 @@ class EtebaseSynchronizer @Inject constructor( val meta = collection.meta val color = meta.color?.let { Color.parseColor(it) } ?: 0 if (calendar == null) { - calendar = CaldavCalendar() - calendar.name = meta.name - calendar.account = account.uuid - calendar.url = collection.uid - calendar.uuid = UUIDHelper.newUUID() - calendar.color = color + calendar = CaldavCalendar( + name = meta.name, + account = account.uuid, + url = collection.uid, + uuid = UUIDHelper.newUUID(), + color = color, + ) caldavDao.insert(calendar) } else if (calendar.name != meta.name || calendar.color != color) { calendar.name = meta.name diff --git a/app/src/main/java/org/tasks/jobs/MigrateLocalWork.kt b/app/src/main/java/org/tasks/jobs/MigrateLocalWork.kt index 2df4931e8..edd67f913 100644 --- a/app/src/main/java/org/tasks/jobs/MigrateLocalWork.kt +++ b/app/src/main/java/org/tasks/jobs/MigrateLocalWork.kt @@ -28,9 +28,12 @@ class MigrateLocalWork @AssistedInject constructor( val caldavAccount = caldavDao.getAccountByUuid(uuid) ?: return Result.failure() val caldavClient = clientProvider.forAccount(caldavAccount) caldavDao.getCalendarsByAccount(CaldavDao.LOCAL).forEach { - it.url = caldavClient.makeCollection(it.name!!, it.color) - it.account = caldavAccount.uuid - caldavDao.update(it) + caldavDao.update( + it.copy( + url = caldavClient.makeCollection(it.name!!, it.color), + account = caldavAccount.uuid, + ) + ) } preferences.setBoolean(R.string.p_lists_enabled, false) syncAdapters.sync() diff --git a/app/src/main/java/org/tasks/sync/microsoft/MicrosoftListSettingsActivityViewModel.kt b/app/src/main/java/org/tasks/sync/microsoft/MicrosoftListSettingsActivityViewModel.kt index eb8703b1b..f3d326a24 100644 --- a/app/src/main/java/org/tasks/sync/microsoft/MicrosoftListSettingsActivityViewModel.kt +++ b/app/src/main/java/org/tasks/sync/microsoft/MicrosoftListSettingsActivityViewModel.kt @@ -49,8 +49,9 @@ class MicrosoftListSettingsActivityViewModel @Inject constructor( val body = Gson().toJson(taskList).toRequestBody(MEDIA_TYPE_JSON) val result = microsoftService.createList(body) if (result.isSuccessful) { - val list = CaldavCalendar().apply { + val list = CaldavCalendar( account = this@MicrosoftListSettingsActivityViewModel.account.uuid + ).apply { result.body()?.applyTo(this) } caldavDao.insert(list)