Use standard content provider instead of TaskProvider in TaskSyncer (#982)

* Update ical4android

* Use standard content provider in TaskSyncer

* Check version instead of acquiring TaskProvider

* Add sync result error

---------

Co-authored-by: Arnau Mora <arnyminerz@proton.me>
This commit is contained in:
Sunik Kupfer 2024-08-20 10:47:50 +02:00 committed by GitHub
parent fca7c09105
commit b962b68631
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 29 additions and 24 deletions

View file

@ -65,7 +65,7 @@ class LocalTask: DmfsTask, LocalResource<Task> {
// update in tasks provider
val values = ContentValues(1)
values.put(Tasks._UID, newUid)
taskList.provider.client.update(taskSyncURI(), values, null, null)
taskList.provider.update(taskSyncURI(), values, null, null)
// update this task
task!!.uid = newUid
@ -86,7 +86,7 @@ class LocalTask: DmfsTask, LocalResource<Task> {
values.put(COLUMN_ETAG, eTag)
values.put(Tasks.SYNC_VERSION, task!!.sequence)
values.put(Tasks._DIRTY, 0)
taskList.provider.client.update(taskSyncURI(), values, null, null)
taskList.provider.update(taskSyncURI(), values, null, null)
if (fileName != null)
this.fileName = fileName
@ -97,7 +97,7 @@ class LocalTask: DmfsTask, LocalResource<Task> {
if (id != null) {
val values = ContentValues(1)
values.put(COLUMN_FLAGS, flags)
taskList.provider.client.update(taskSyncURI(), values, null, null)
taskList.provider.update(taskSyncURI(), values, null, null)
}
this.flags = flags

View file

@ -6,6 +6,7 @@ package at.bitfire.davdroid.resource
import android.accounts.Account
import android.annotation.SuppressLint
import android.content.ContentProviderClient
import android.content.ContentValues
import android.content.Context
import android.net.Uri
@ -27,13 +28,14 @@ import java.util.logging.Logger
*/
class LocalTaskList private constructor(
account: Account,
provider: TaskProvider,
provider: ContentProviderClient,
providerName: TaskProvider.ProviderName,
id: Long
): DmfsTaskList<LocalTask>(account, provider, LocalTask.Factory, id), LocalCollection<LocalTask> {
): DmfsTaskList<LocalTask>(account, provider, providerName, LocalTask.Factory, id), LocalCollection<LocalTask> {
companion object {
fun create(account: Account, provider: TaskProvider, info: Collection): Uri {
fun create(account: Account, provider: ContentProviderClient, providerName: TaskProvider.ProviderName, info: Collection): Uri {
// If the collection doesn't have a color, use a default color.
if (info.color != null)
info.color = Constants.DAVDROID_GREEN_RGBA
@ -42,7 +44,7 @@ class LocalTaskList private constructor(
values.put(TaskLists.OWNER, account.name)
values.put(TaskLists.SYNC_ENABLED, 1)
values.put(TaskLists.VISIBLE, 1)
return create(account, provider, values)
return create(account, provider, providerName, values)
}
@SuppressLint("Recycle")
@ -100,7 +102,7 @@ class LocalTaskList private constructor(
override var lastSyncState: SyncState?
get() {
try {
provider.client.query(taskListSyncUri(), arrayOf(TaskLists.SYNC_VERSION),
provider.query(taskListSyncUri(), arrayOf(TaskLists.SYNC_VERSION),
null, null, null)?.use { cursor ->
if (cursor.moveToNext())
cursor.getString(0)?.let {
@ -115,7 +117,7 @@ class LocalTaskList private constructor(
set(state) {
val values = ContentValues(1)
values.put(TaskLists.SYNC_VERSION, state?.toString())
provider.client.update(taskListSyncUri(), values, null, null)
provider.update(taskListSyncUri(), values, null, null)
}
@ -154,28 +156,32 @@ class LocalTaskList private constructor(
override fun markNotDirty(flags: Int): Int {
val values = ContentValues(1)
values.put(LocalTask.COLUMN_FLAGS, flags)
return provider.client.update(tasksSyncUri(), values,
return provider.update(tasksSyncUri(), values,
"${Tasks.LIST_ID}=? AND ${Tasks._DIRTY}=0",
arrayOf(id.toString()))
}
override fun removeNotDirtyMarked(flags: Int) =
provider.client.delete(tasksSyncUri(),
provider.delete(tasksSyncUri(),
"${Tasks.LIST_ID}=? AND NOT ${Tasks._DIRTY} AND ${LocalTask.COLUMN_FLAGS}=?",
arrayOf(id.toString(), flags.toString()))
override fun forgetETags() {
val values = ContentValues(1)
values.putNull(LocalEvent.COLUMN_ETAG)
provider.client.update(tasksSyncUri(), values, "${Tasks.LIST_ID}=?",
provider.update(tasksSyncUri(), values, "${Tasks.LIST_ID}=?",
arrayOf(id.toString()))
}
object Factory: DmfsTaskListFactory<LocalTaskList> {
override fun newInstance(account: Account, provider: TaskProvider, id: Long) =
LocalTaskList(account, provider, id)
override fun newInstance(
account: Account,
provider: ContentProviderClient,
providerName: TaskProvider.ProviderName,
id: Long
) = LocalTaskList(account, provider, providerName, id)
}

View file

@ -54,6 +54,7 @@ class JtxSyncer @AssistedInject constructor(
TaskProvider.checkVersion(context, TaskProvider.ProviderName.JtxBoard)
} catch (e: TaskProvider.ProviderTooOldException) {
tasksAppManager.get().notifyProviderTooOld(e)
syncResult.databaseError = true
return false // Don't sync
}

View file

@ -38,20 +38,18 @@ class TaskSyncer @AssistedInject constructor(
fun create(account: Account, authority: String, extras: Array<String>, syncResult: SyncResult): TaskSyncer
}
private lateinit var taskProvider: TaskProvider
private val providerName = TaskProvider.ProviderName.fromAuthority(authority)
override val serviceType: String
get() = Service.TYPE_CALDAV
override fun localSyncCollections(provider: ContentProviderClient): List<LocalTaskList>
= DmfsTaskList.find(account, taskProvider, LocalTaskList.Factory, "${TaskLists.SYNC_ENABLED}!=0", null)
= DmfsTaskList.find(account, LocalTaskList.Factory, provider, providerName, "${TaskLists.SYNC_ENABLED}!=0", null)
override fun prepare(provider: ContentProviderClient): Boolean {
// Acquire task provider
val providerName = TaskProvider.ProviderName.fromAuthority(authority)
taskProvider = try {
TaskProvider.fromProviderClient(context, providerName, provider)
// Don't sync if task provider is too old
try {
TaskProvider.checkVersion(context, providerName)
} catch (e: TaskProvider.ProviderTooOldException) {
tasksAppManager.get().notifyProviderTooOld(e)
syncResult.databaseError = true
@ -80,8 +78,8 @@ class TaskSyncer @AssistedInject constructor(
override fun create(provider: ContentProviderClient, remoteCollection: Collection): LocalTaskList {
logger.log(Level.INFO, "Adding local task list", remoteCollection)
val uri = LocalTaskList.create(account, taskProvider, remoteCollection)
return DmfsTaskList.findByID(account, taskProvider, LocalTaskList.Factory, ContentUris.parseId(uri))
val uri = LocalTaskList.create(account, provider, providerName, remoteCollection)
return DmfsTaskList.findByID(account, provider, providerName, LocalTaskList.Factory, ContentUris.parseId(uri))
}
override fun syncCollection(provider: ContentProviderClient, localCollection: LocalTaskList, remoteCollection: Collection) {

View file

@ -20,7 +20,7 @@ androidx-test-junit = "1.2.1"
androidx-work = "2.9.1"
bitfire-cert4android = "f1cc9b9ca3"
bitfire-dav4jvm = "56d8b6c176"
bitfire-ical4android = "86af14d6c8"
bitfire-ical4android = "0f42348d4d"
bitfire-vcard4android = "d5415f20b7"
compose-accompanist = "0.34.0"
compose-bom = "2024.06.00"