From 1d9c51096326fa4a9fe7140a364f5d64ad6d4ae6 Mon Sep 17 00:00:00 2001 From: Sunik Kupfer Date: Mon, 12 Aug 2024 11:41:41 +0200 Subject: [PATCH] Take ContentProviderClient instead of TasksProvider (#163) * Take ContentProviderClient instead of TaskProvider in find method * Take ContentProviderClient instead of TaskProvider in create method * Take ContentProviderClient instead of TaskProvider in findById method --- .../bitfire/ical4android/DmfsTaskListTest.kt | 10 ++-- .../bitfire/ical4android/impl/TestTaskList.kt | 19 ++++--- .../at/bitfire/ical4android/DmfsTask.kt | 12 ++--- .../at/bitfire/ical4android/DmfsTaskList.kt | 51 ++++++++++--------- .../ical4android/DmfsTaskListFactory.kt | 3 +- 5 files changed, 53 insertions(+), 42 deletions(-) diff --git a/lib/src/androidTest/kotlin/at/bitfire/ical4android/DmfsTaskListTest.kt b/lib/src/androidTest/kotlin/at/bitfire/ical4android/DmfsTaskListTest.kt index 4532e5cb..c227ddf3 100644 --- a/lib/src/androidTest/kotlin/at/bitfire/ical4android/DmfsTaskListTest.kt +++ b/lib/src/androidTest/kotlin/at/bitfire/ical4android/DmfsTaskListTest.kt @@ -21,7 +21,7 @@ import org.junit.Assert.assertTrue import org.junit.Test class DmfsTaskListTest(providerName: TaskProvider.ProviderName): - AbstractTasksTest(providerName) { + AbstractTasksTest(providerName) { private val testAccount = Account("AndroidTaskListTest", TaskContract.LOCAL_ACCOUNT_TYPE) @@ -34,10 +34,10 @@ class DmfsTaskListTest(providerName: TaskProvider.ProviderName): info.put(TaskContract.TaskLists.SYNC_ENABLED, 1) info.put(TaskContract.TaskLists.VISIBLE, 1) - val uri = DmfsTaskList.create(testAccount, provider, info) + val uri = DmfsTaskList.create(testAccount, provider.client, providerName, info) assertNotNull(uri) - return DmfsTaskList.findByID(testAccount, provider, TestTaskList.Factory, ContentUris.parseId(uri)) + return DmfsTaskList.findByID(testAccount, provider.client, providerName, TestTaskList.Factory, ContentUris.parseId(uri)) } @@ -80,7 +80,7 @@ class DmfsTaskListTest(providerName: TaskProvider.ProviderName): val parentId = ContentUris.parseId(parentContentUri) // OpenTasks should provide the correct relation - taskList.provider.client.query(taskList.tasksPropertiesSyncUri(), null, + taskList.provider.query(taskList.tasksPropertiesSyncUri(), null, "${Properties.TASK_ID}=?", arrayOf(childId.toString()), null, null)!!.use { cursor -> assertEquals(1, cursor.count) @@ -99,7 +99,7 @@ class DmfsTaskListTest(providerName: TaskProvider.ProviderName): taskList.touchRelations() // now parent_id should bet set - taskList.provider.client.query(childContentUri, arrayOf(Tasks.PARENT_ID), + taskList.provider.query(childContentUri, arrayOf(Tasks.PARENT_ID), null, null, null)!!.use { cursor -> assertTrue(cursor.moveToNext()) assertEquals(parentId, cursor.getLong(0)) diff --git a/lib/src/androidTest/kotlin/at/bitfire/ical4android/impl/TestTaskList.kt b/lib/src/androidTest/kotlin/at/bitfire/ical4android/impl/TestTaskList.kt index 0ed9edf7..13711224 100644 --- a/lib/src/androidTest/kotlin/at/bitfire/ical4android/impl/TestTaskList.kt +++ b/lib/src/androidTest/kotlin/at/bitfire/ical4android/impl/TestTaskList.kt @@ -5,6 +5,7 @@ package at.bitfire.ical4android.impl import android.accounts.Account +import android.content.ContentProviderClient import android.content.ContentUris import android.content.ContentValues import at.bitfire.ical4android.DmfsTaskList @@ -14,29 +15,33 @@ import org.dmfs.tasks.contract.TaskContract class TestTaskList( account: Account, - provider: TaskProvider, + provider: ContentProviderClient, + providerName: TaskProvider.ProviderName, id: Long -): DmfsTaskList(account, provider, TestTask.Factory, id) { +): DmfsTaskList(account, provider, providerName, TestTask.Factory, id) { companion object { - fun create(account: Account, provider: TaskProvider): TestTaskList { + fun create( + account: Account, + provider: TaskProvider, + ): TestTaskList { val values = ContentValues(4) values.put(TaskContract.TaskListColumns.LIST_NAME, "Test Task List") values.put(TaskContract.TaskListColumns.LIST_COLOR, 0xffff0000) values.put(TaskContract.TaskListColumns.SYNC_ENABLED, 1) values.put(TaskContract.TaskListColumns.VISIBLE, 1) - val uri = DmfsTaskList.create(account, provider, values) + val uri = DmfsTaskList.create(account, provider.client, provider.name, values) - return TestTaskList(account, provider, ContentUris.parseId(uri)) + return TestTaskList(account, provider.client, provider.name, ContentUris.parseId(uri)) } } object Factory: DmfsTaskListFactory { - override fun newInstance(account: Account, provider: TaskProvider, id: Long) = - TestTaskList(account, provider, id) + override fun newInstance(account: Account, provider: ContentProviderClient, providerName: TaskProvider.ProviderName, id: Long) = + TestTaskList(account, provider, providerName, id) } } diff --git a/lib/src/main/kotlin/at/bitfire/ical4android/DmfsTask.kt b/lib/src/main/kotlin/at/bitfire/ical4android/DmfsTask.kt index 42b1e9e8..25a3ef0b 100644 --- a/lib/src/main/kotlin/at/bitfire/ical4android/DmfsTask.kt +++ b/lib/src/main/kotlin/at/bitfire/ical4android/DmfsTask.kt @@ -99,7 +99,7 @@ abstract class DmfsTask( val id = requireNotNull(id) try { - val client = taskList.provider.client + val client = taskList.provider client.query(taskSyncURI(true), null, null, null, null)?.use { cursor -> if (cursor.moveToFirst()) { // create new Task which will be populated @@ -161,7 +161,7 @@ abstract class DmfsTask( task.sequence = values.getAsInteger(Tasks.SYNC_VERSION) task.summary = values.getAsString(Tasks.TITLE) task.location = values.getAsString(Tasks.LOCATION) - task.userAgents += taskList.provider.name.packageName + task.userAgents += taskList.providerName.packageName values.getAsString(Tasks.GEO)?.let { geo -> val (lng, lat) = geo.split(',') @@ -330,7 +330,7 @@ abstract class DmfsTask( fun add(): Uri { - val batch = BatchOperation(taskList.provider.client) + val batch = BatchOperation(taskList.provider) val builder = CpoBuilder.newInsert(taskList.tasksSyncUri()) buildTask(builder, false) @@ -350,7 +350,7 @@ abstract class DmfsTask( this.task = task val existingId = requireNotNull(id) - val batch = BatchOperation(taskList.provider.client) + val batch = BatchOperation(taskList.provider) // remove associated rows which are added later again batch.enqueue(CpoBuilder @@ -367,7 +367,7 @@ abstract class DmfsTask( insertProperties(batch, null) batch.commit() - return ContentUris.withAppendedId(taskList.provider.tasksUri(), existingId) + return ContentUris.withAppendedId(Tasks.getContentUri(taskList.providerName.authority), existingId) } protected open fun insertProperties(batch: BatchOperation, idxTask: Int?) { @@ -472,7 +472,7 @@ abstract class DmfsTask( } fun delete(): Int { - return taskList.provider.client.delete(taskSyncURI(), null, null) + return taskList.provider.delete(taskSyncURI(), null, null) } @CallSuper diff --git a/lib/src/main/kotlin/at/bitfire/ical4android/DmfsTaskList.kt b/lib/src/main/kotlin/at/bitfire/ical4android/DmfsTaskList.kt index 8d42347c..0e82f116 100644 --- a/lib/src/main/kotlin/at/bitfire/ical4android/DmfsTaskList.kt +++ b/lib/src/main/kotlin/at/bitfire/ical4android/DmfsTaskList.kt @@ -5,6 +5,7 @@ package at.bitfire.ical4android import android.accounts.Account +import android.content.ContentProviderClient import android.content.ContentUris import android.content.ContentValues import android.net.Uri @@ -27,7 +28,8 @@ import java.util.logging.Logger */ abstract class DmfsTaskList( val account: Account, - val provider: TaskProvider, + val provider: ContentProviderClient, + val providerName: TaskProvider.ProviderName, val taskFactory: DmfsTaskFactory, val id: Long ) { @@ -37,30 +39,32 @@ abstract class DmfsTaskList( private val logger get() = Logger.getLogger(DmfsTaskList::class.java.name) - fun create(account: Account, provider: TaskProvider, info: ContentValues): Uri { + fun create(account: Account, provider: ContentProviderClient, providerName: TaskProvider.ProviderName, info: ContentValues): Uri { info.put(TaskContract.ACCOUNT_NAME, account.name) info.put(TaskContract.ACCOUNT_TYPE, account.type) - logger.log(Level.FINE, "Creating ${provider.name.authority} task list", info) - return provider.client.insert(provider.taskListsUri().asSyncAdapter(account), info) + val url = TaskLists.getContentUri(providerName.authority).asSyncAdapter(account) + logger.log(Level.FINE, "Creating ${providerName.authority} task list", info) + return provider.insert(url, info) ?: throw CalendarStorageException("Couldn't create task list (empty result from provider)") } fun > findByID( account: Account, - provider: TaskProvider, + provider: ContentProviderClient, + providerName: TaskProvider.ProviderName, factory: DmfsTaskListFactory, id: Long ): T { - provider.client.query( - ContentUris.withAppendedId(provider.taskListsUri(), id).asSyncAdapter(account), + provider.query( + ContentUris.withAppendedId(TaskLists.getContentUri(providerName.authority), id).asSyncAdapter(account), null, null, null, null )?.use { cursor -> if (cursor.moveToNext()) { - val taskList = factory.newInstance(account, provider, id) + val taskList = factory.newInstance(account, provider, providerName, id) taskList.populate(cursor.toValues()) return taskList } @@ -70,14 +74,15 @@ abstract class DmfsTaskList( fun > find( account: Account, - provider: TaskProvider, factory: DmfsTaskListFactory, + provider: ContentProviderClient, + providerName: TaskProvider.ProviderName, where: String?, whereArgs: Array? ): List { val taskLists = LinkedList() - provider.client.query( - provider.taskListsUri().asSyncAdapter(account), + provider.query( + TaskLists.getContentUri(providerName.authority).asSyncAdapter(account), null, where, whereArgs, @@ -86,7 +91,7 @@ abstract class DmfsTaskList( while (cursor.moveToNext()) { val values = cursor.toValues() val taskList = - factory.newInstance(account, provider, values.getAsLong(TaskLists._ID)) + factory.newInstance(account, provider, providerName, values.getAsLong(TaskLists._ID)) taskList.populate(values) taskLists += taskList } @@ -110,7 +115,7 @@ abstract class DmfsTaskList( * Called when an instance is created from a tasks provider data row, for example * using [find]. * - * @param info values from tasks provider + * @param values values from tasks provider */ @CallSuper protected open fun populate(values: ContentValues) { @@ -122,8 +127,8 @@ abstract class DmfsTaskList( } fun update(info: ContentValues): Int { - logger.log(Level.FINE, "Updating ${provider.name.authority} task list (#$id)", info) - return provider.client.update(taskListSyncUri(), info, null, null) + logger.log(Level.FINE, "Updating ${providerName.authority} task list (#$id)", info) + return provider.update(taskListSyncUri(), info, null, null) } /** @@ -132,8 +137,8 @@ abstract class DmfsTaskList( * @return `true` if the calendar was deleted, `false` otherwise (like it was not there before the call) */ fun delete(): Boolean { - logger.log(Level.FINE, "Deleting ${provider.name.authority} task list (#$id)") - return provider.client.delete(taskListSyncUri(), null, null) > 0 + logger.log(Level.FINE, "Deleting ${providerName.authority} task list (#$id)") + return provider.delete(taskListSyncUri(), null, null) > 0 } /** @@ -158,8 +163,8 @@ abstract class DmfsTaskList( */ fun touchRelations(): Int { logger.fine("Touching relations to set parent_id") - val batchOperation = BatchOperation(provider.client) - provider.client.query( + val batchOperation = BatchOperation(provider) + provider.query( tasksSyncUri(true), null, "${Tasks.LIST_ID}=? AND ${Tasks.PARENT_ID} IS NULL AND ${Relation.MIMETYPE}=? AND ${Relation.RELATED_ID} IS NOT NULL", arrayOf(id.toString(), Relation.CONTENT_ITEM_TYPE), @@ -194,7 +199,7 @@ abstract class DmfsTaskList( val whereArgs = (_whereArgs ?: arrayOf()) + id.toString() val tasks = LinkedList() - provider.client.query( + provider.query( tasksSyncUri(), null, where, whereArgs, null @@ -210,10 +215,10 @@ abstract class DmfsTaskList( fun taskListSyncUri() = - ContentUris.withAppendedId(provider.taskListsUri(), id).asSyncAdapter(account) + ContentUris.withAppendedId(TaskLists.getContentUri(providerName.authority), id).asSyncAdapter(account) fun tasksSyncUri(loadProperties: Boolean = false): Uri { - val uri = provider.tasksUri().asSyncAdapter(account) + val uri = Tasks.getContentUri(providerName.authority).asSyncAdapter(account) return if (loadProperties) uri.buildUpon() .appendQueryParameter(TaskContract.LOAD_PROPERTIES, "1") @@ -222,6 +227,6 @@ abstract class DmfsTaskList( uri } - fun tasksPropertiesSyncUri() = provider.propertiesUri().asSyncAdapter(account) + fun tasksPropertiesSyncUri() = TaskContract.Properties.getContentUri(providerName.authority).asSyncAdapter(account) } diff --git a/lib/src/main/kotlin/at/bitfire/ical4android/DmfsTaskListFactory.kt b/lib/src/main/kotlin/at/bitfire/ical4android/DmfsTaskListFactory.kt index 3627c319..7b1da9e2 100644 --- a/lib/src/main/kotlin/at/bitfire/ical4android/DmfsTaskListFactory.kt +++ b/lib/src/main/kotlin/at/bitfire/ical4android/DmfsTaskListFactory.kt @@ -5,9 +5,10 @@ package at.bitfire.ical4android import android.accounts.Account +import android.content.ContentProviderClient interface DmfsTaskListFactory> { - fun newInstance(account: Account, provider: TaskProvider, id: Long): T + fun newInstance(account: Account, provider: ContentProviderClient, providerName: TaskProvider.ProviderName, id: Long): T } \ No newline at end of file