Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 33 additions & 40 deletions app/src/main/kotlin/at/bitfire/davdroid/resource/LocalTask.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,37 +10,49 @@ import android.content.Context
import android.net.Uri
import androidx.core.content.contentValuesOf
import at.bitfire.ical4android.DmfsTask
import at.bitfire.ical4android.DmfsTaskFactory
import at.bitfire.ical4android.DmfsTaskList
import at.bitfire.ical4android.Task
import at.bitfire.ical4android.TaskProvider
import com.google.common.base.MoreObjects
import org.dmfs.tasks.contract.TaskContract.Tasks
import java.util.Optional
import java.util.logging.Logger

/**
* Represents a Dmfs Task (OpenTasks and Tasks.org) entry
*/
class LocalTask: DmfsTask, LocalResource {
class LocalTask(
val dmfsTask: DmfsTask
): LocalResource {

val logger: Logger = Logger.getLogger(javaClass.name)


// LocalResource implementation

override val id: Long?
get() = dmfsTask.id

override var fileName: String?
get() = syncId
set(value) { syncId = value }
get() = dmfsTask.syncId
set(value) { dmfsTask.syncId = value }

override var eTag: String?
get() = dmfsTask.eTag
set(value) { dmfsTask.eTag = value }

/**
* Note: Schedule-Tag for tasks is not supported
*/
override var scheduleTag: String? = null

override val flags: Int
get() = dmfsTask.flags

constructor(taskList: DmfsTaskList<*>, task: Task, fileName: String?, eTag: String?, flags: Int)
: super(taskList, task, fileName, eTag, flags)
fun add() = dmfsTask.add()

private constructor(taskList: DmfsTaskList<*>, values: ContentValues)
: super(taskList, values)
fun update(data: Task) = dmfsTask.update(data)


/* custom queries */
fun delete() = dmfsTask.delete()

override fun clearDirty(fileName: Optional<String>, eTag: String?, scheduleTag: String?) {
if (scheduleTag != null)
Expand All @@ -49,46 +61,33 @@ class LocalTask: DmfsTask, LocalResource {
val values = ContentValues(4)
if (fileName.isPresent)
values.put(Tasks._SYNC_ID, fileName.get())
values.put(COLUMN_ETAG, eTag)
values.put(Tasks.SYNC_VERSION, task!!.sequence)
values.put(DmfsTask.COLUMN_ETAG, eTag)
values.put(Tasks.SYNC_VERSION, dmfsTask.task!!.sequence)
values.put(Tasks._DIRTY, 0)
taskList.provider.update(taskSyncURI(), values, null, null)
dmfsTask.update(values)

if (fileName.isPresent)
this.fileName = fileName.get()
this.eTag = eTag
}

fun update(data: Task, fileName: String?, eTag: String?, scheduleTag: String?, flags: Int) {
if (scheduleTag != null)
logger.fine("Schedule-Tag for tasks not supported, won't save")

this.fileName = fileName
this.eTag = eTag
this.flags = flags

// processes this.{fileName, eTag, scheduleTag, flags} and resets DIRTY flag
update(data)
}

override fun updateFlags(flags: Int) {
if (id != null) {
val values = contentValuesOf(COLUMN_FLAGS to flags)
taskList.provider.update(taskSyncURI(), values, null, null)
val values = contentValuesOf(DmfsTask.COLUMN_FLAGS to flags)
dmfsTask.update(values)
}

this.flags = flags
dmfsTask.flags = flags
}

override fun updateSequence(sequence: Int) = throw NotImplementedError()

override fun updateUid(uid: String) {
val values = contentValuesOf(Tasks._UID to uid)
taskList.provider.update(taskSyncURI(), values, null, null)
dmfsTask.update(values)
}

override fun deleteLocal() {
delete()
dmfsTask.delete()
}

override fun resetDeleted() {
Expand All @@ -112,9 +111,9 @@ class LocalTask: DmfsTask, LocalResource {
.toString()

override fun getViewUri(context: Context): Uri? = id?.let { id ->
when (taskList.providerName) {
when (dmfsTask.taskList.providerName) {
TaskProvider.ProviderName.OpenTasks -> {
val contentUri = Tasks.getContentUri(taskList.providerName.authority)
val contentUri = Tasks.getContentUri(dmfsTask.taskList.providerName.authority)
ContentUris.withAppendedId(contentUri, id)
}
// Tasks.org can't handle view content URIs (missing intent-filter)
Expand All @@ -123,10 +122,4 @@ class LocalTask: DmfsTask, LocalResource {
}
}


object Factory: DmfsTaskFactory<LocalTask> {
override fun fromProvider(taskList: DmfsTaskList<*>, values: ContentValues) =
LocalTask(taskList, values)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class LocalTaskList private constructor(
provider: ContentProviderClient,
providerName: TaskProvider.ProviderName,
id: Long
): DmfsTaskList<LocalTask>(account, provider, providerName, LocalTask.Factory, id), LocalCollection<LocalTask> {
): DmfsTaskList(account, provider, providerName, id), LocalCollection<LocalTask> {

private val logger = Logger.getGlobal()

Expand All @@ -51,10 +51,11 @@ class LocalTaskList private constructor(
}

override fun findDeleted() = queryTasks(Tasks._DELETED, null)
.map { LocalTask(it) }

override fun findDirty(): List<LocalTask> {
val tasks = queryTasks(Tasks._DIRTY, null)
for (localTask in tasks) {
val dmfsTasks = queryTasks(Tasks._DIRTY, null)
for (localTask in dmfsTasks) {
try {
val task = requireNotNull(localTask.task)
val sequence = task.sequence
Expand All @@ -66,11 +67,14 @@ class LocalTaskList private constructor(
logger.log(Level.WARNING, "Couldn't check/increase sequence", e)
}
}
return tasks
return dmfsTasks.map { LocalTask(it) }
}

override fun findByName(name: String) =
queryTasks("${Tasks._SYNC_ID}=?", arrayOf(name)).firstOrNull()
queryTasks("${Tasks._SYNC_ID}=?", arrayOf(name))
.firstOrNull()?.let {
LocalTask(it)
}


override fun markNotDirty(flags: Int): Int {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import android.provider.CalendarContract.Calendars
import android.provider.CalendarContract.Reminders
import androidx.core.content.ContextCompat
import androidx.core.content.contentValuesOf
import at.bitfire.davdroid.resource.LocalTask
import at.bitfire.ical4android.DmfsTask
import at.bitfire.ical4android.TaskProvider
import at.techbee.jtx.JtxContract.asSyncAdapter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import at.bitfire.davdroid.resource.LocalTaskList
import at.bitfire.davdroid.resource.SyncState
import at.bitfire.davdroid.util.DavUtils
import at.bitfire.davdroid.util.DavUtils.lastSegment
import at.bitfire.ical4android.DmfsTask
import at.bitfire.ical4android.Task
import at.bitfire.synctools.exception.InvalidICalendarException
import dagger.assisted.Assisted
Expand Down Expand Up @@ -103,7 +104,7 @@ class TasksSyncManager @AssistedInject constructor(
override fun syncAlgorithm() = SyncAlgorithm.PROPFIND_REPORT

override fun generateUpload(resource: LocalTask): GeneratedResource {
val task = requireNotNull(resource.task)
val task = requireNotNull(resource.dmfsTask.task)
logger.log(Level.FINE, "Preparing upload of task ${resource.id}", task)

// get/create UID
Expand Down Expand Up @@ -191,7 +192,7 @@ class TasksSyncManager @AssistedInject constructor(
local.update(newData)
} else {
logger.log(Level.INFO, "Adding $fileName to local task list", newData)
val newLocal = LocalTask(localCollection, newData, fileName, eTag, LocalResource.FLAG_REMOTELY_PRESENT)
val newLocal = LocalTask(DmfsTask(localCollection, newData, fileName, eTag, LocalResource.FLAG_REMOTELY_PRESENT))
SyncException.wrapWithLocalResource(newLocal) {
newLocal.add()
}
Expand Down
2 changes: 1 addition & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ androidx-test-junit = "1.3.0"
androidx-work = "2.11.0"
bitfire-cert4android = "42d883e958"
bitfire-dav4jvm = "de16b12343"
bitfire-synctools = "5fb54ec88c"
bitfire-synctools = "de78892b5c"
compose-accompanist = "0.37.3"
compose-bom = "2025.11.01"
conscrypt = "2.5.3"
Expand Down