From c42b22ebe9b72d33acf17562e28a378cd574f9dd Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Sat, 20 Feb 2021 21:56:52 -0600 Subject: [PATCH] Add ShareAccess property --- app/build.gradle.kts | 1 + app/src/main/java/org/tasks/Tasks.kt | 5 ++ .../java/org/tasks/caldav/CaldavClient.kt | 5 +- .../org/tasks/caldav/property/ShareAccess.kt | 47 +++++++++++++++++++ .../tasks/caldav/property/PropertyUtils.kt | 31 ++++++++++++ .../tasks/caldav/property/ShareAccessTest.kt | 26 ++++++++++ 6 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/org/tasks/caldav/property/ShareAccess.kt create mode 100644 app/src/test/java/org/tasks/caldav/property/PropertyUtils.kt create mode 100644 app/src/test/java/org/tasks/caldav/property/ShareAccessTest.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 50ee601a3..2d09cd547 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -234,6 +234,7 @@ dependencies { testImplementation("com.natpryce:make-it-easy:${Versions.make_it_easy}") testImplementation("androidx.test:core:${Versions.androidx_test}") testImplementation("org.mockito:mockito-core:${Versions.mockito}") + testImplementation("org.ogce:xpp3:1.1.6") } apply(mapOf("plugin" to "com.google.gms.google-services")) diff --git a/app/src/main/java/org/tasks/Tasks.kt b/app/src/main/java/org/tasks/Tasks.kt index 6ddb1b0be..1314a7f04 100644 --- a/app/src/main/java/org/tasks/Tasks.kt +++ b/app/src/main/java/org/tasks/Tasks.kt @@ -8,6 +8,7 @@ import android.util.Log import androidx.core.app.JobIntentService import androidx.hilt.work.HiltWorkerFactory import androidx.work.Configuration +import at.bitfire.dav4jvm.PropertyRegistry import com.todoroo.astrid.service.Upgrader import dagger.Lazy import dagger.hilt.android.HiltAndroidApp @@ -17,6 +18,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import org.tasks.billing.BillingClient import org.tasks.billing.Inventory +import org.tasks.caldav.property.ShareAccess import org.tasks.files.FileHelper import org.tasks.injection.InjectingJobIntentService import org.tasks.jobs.WorkManager @@ -90,6 +92,9 @@ class Tasks : Application(), Configuration.Provider { FileHelper.delete(context, preferences.cacheDirectory) billingClient.get().queryPurchases() appWidgetManager.get().reconfigureWidgets() + PropertyRegistry.register(listOf( + ShareAccess.Factory(), + )) } override fun getWorkManagerConfiguration(): Configuration = Configuration.Builder() diff --git a/app/src/main/java/org/tasks/caldav/CaldavClient.kt b/app/src/main/java/org/tasks/caldav/CaldavClient.kt index a938ee468..05062bf65 100644 --- a/app/src/main/java/org/tasks/caldav/CaldavClient.kt +++ b/app/src/main/java/org/tasks/caldav/CaldavClient.kt @@ -19,6 +19,7 @@ import okhttp3.HttpUrl import okhttp3.OkHttpClient import org.tasks.R import org.tasks.Strings.isNullOrEmpty +import org.tasks.caldav.property.ShareAccess import org.tasks.data.CaldavAccount import org.tasks.ui.DisplayableException import org.xmlpull.v1.XmlPullParserException @@ -121,7 +122,9 @@ open class CaldavClient( SupportedCalendarComponentSet.NAME, GetCTag.NAME, CalendarColor.NAME, - SyncToken.NAME) { response: Response, relation: HrefRelation -> + SyncToken.NAME, + ShareAccess.NAME, + ) { response: Response, relation: HrefRelation -> if (relation == HrefRelation.MEMBER) { responses.add(response) } diff --git a/app/src/main/java/org/tasks/caldav/property/ShareAccess.kt b/app/src/main/java/org/tasks/caldav/property/ShareAccess.kt new file mode 100644 index 000000000..06b267976 --- /dev/null +++ b/app/src/main/java/org/tasks/caldav/property/ShareAccess.kt @@ -0,0 +1,47 @@ +package org.tasks.caldav.property + +import at.bitfire.dav4jvm.Property +import at.bitfire.dav4jvm.PropertyFactory +import at.bitfire.dav4jvm.XmlUtils +import at.bitfire.dav4jvm.XmlUtils.propertyName +import org.tasks.BuildConfig +import org.xmlpull.v1.XmlPullParser + +data class ShareAccess(val access: Property.Name): Property { + + companion object { + @JvmField + val NAME = Property.Name(XmlUtils.NS_WEBDAV, "share-access") + + val SHARED_OWNER = Property.Name(XmlUtils.NS_WEBDAV, "shared-owner") + val READ_WRITE = Property.Name(XmlUtils.NS_WEBDAV, "read-write") + val NOT_SHARED = Property.Name(XmlUtils.NS_WEBDAV, "not-shared") + val READ = Property.Name(XmlUtils.NS_WEBDAV, "read") + } + + override fun toString(): String { + return "ShareAccess(access=$access)" + } + + class Factory : PropertyFactory { + + override fun getName() = NAME + + override fun create(parser: XmlPullParser): ShareAccess? { + // + var result: Property.Name? = null + val depth = parser.depth + var eventType = parser.eventType + while (!(eventType == XmlPullParser.END_TAG && parser.depth == depth)) { + if (eventType == XmlPullParser.START_TAG && parser.depth == depth + 1) { + when (val name = parser.propertyName()) { + SHARED_OWNER, READ_WRITE, NOT_SHARED, READ -> result = name + } + } + eventType = parser.next() + } + if (BuildConfig.DEBUG && parser.depth != depth) { error("Assertion failed") } + return result?.let { ShareAccess(it) } + } + } +} diff --git a/app/src/test/java/org/tasks/caldav/property/PropertyUtils.kt b/app/src/test/java/org/tasks/caldav/property/PropertyUtils.kt new file mode 100644 index 000000000..d798b40f9 --- /dev/null +++ b/app/src/test/java/org/tasks/caldav/property/PropertyUtils.kt @@ -0,0 +1,31 @@ +package org.tasks.caldav.property + +import at.bitfire.dav4jvm.Property +import at.bitfire.dav4jvm.XmlUtils +import java.io.StringReader + +object PropertyUtils { + fun String.toProperty(): T = + toProperties() + .apply { if (this.size != 1) throw IllegalStateException("${this.size} items") } + .first() + .let { + @Suppress("UNCHECKED_CAST") + it as T + } + + fun String.toProperties(): List = + XmlUtils.newPullParser() + .apply { + setInput( + StringReader(""" + + ${this@toProperties} + + """.trimIndent() + ) + ) + nextTag() + } + .let { Property.parse(it) } +} \ No newline at end of file diff --git a/app/src/test/java/org/tasks/caldav/property/ShareAccessTest.kt b/app/src/test/java/org/tasks/caldav/property/ShareAccessTest.kt new file mode 100644 index 000000000..6828e4493 --- /dev/null +++ b/app/src/test/java/org/tasks/caldav/property/ShareAccessTest.kt @@ -0,0 +1,26 @@ +package org.tasks.caldav.property + +import at.bitfire.dav4jvm.PropertyRegistry +import org.junit.Assert.assertEquals +import org.junit.Before +import org.junit.Test +import org.tasks.caldav.property.PropertyUtils.toProperty +import org.tasks.caldav.property.ShareAccess.Companion.SHARED_OWNER + +class ShareAccessTest { + @Before + fun setUp() { + PropertyRegistry.register(ShareAccess.Factory()) + } + + @Test + fun parseShareAccess() { + val access: ShareAccess = """ + + + + """.toProperty() + + assertEquals(ShareAccess(SHARED_OWNER), access) + } +} \ No newline at end of file