Provide owner url in jtx collection (bitfireAT/davx5#221)

* provide owner url in jtx collection

* Updated contract, added owner displayname to collections sync

* Update ical4android

---------

Co-authored-by: Patrick Lang <72232737+patrickunterwegs@users.noreply.github.com>
This commit is contained in:
Sunik Kupfer 2023-02-24 13:10:48 +01:00 committed by Ricki Hirner
parent 54c6117ba2
commit fe7a928064
No known key found for this signature in database
GPG key ID: 79A019FCAAEDD3AA
6 changed files with 30 additions and 20 deletions

View file

@ -306,12 +306,12 @@ class RefreshCollectionsWorkerTest {
)
// Refresh - homesets and their collections
assertEquals(0, db.principalDao().get(service.id).size)
assertEquals(0, db.principalDao().getByService(service.id).size)
RefreshCollectionsWorker.Refresher(db, service, settings, client.okHttpClient)
.refreshHomesetsAndTheirCollections()
// Check principal saved and the collection was updated with its reference
val principals = db.principalDao().get(service.id)
val principals = db.principalDao().getByService(service.id)
assertEquals(1, principals.size)
assertEquals(mockServer.url("$PATH_CARDDAV$SUBPATH_PRINCIPAL"), principals[0].url)
assertEquals(null, principals[0].displayName)
@ -401,12 +401,12 @@ class RefreshCollectionsWorkerTest {
)
// Refresh homeless collections
assertEquals(0, db.principalDao().get(service.id).size)
assertEquals(0, db.principalDao().getByService(service.id).size)
RefreshCollectionsWorker.Refresher(db, service, settings, client.okHttpClient)
.refreshHomelessCollections()
// Check principal saved and the collection was updated with its reference
val principals = db.principalDao().get(service.id)
val principals = db.principalDao().getByService(service.id)
assertEquals(1, principals.size)
assertEquals(mockServer.url("$PATH_CARDDAV$SUBPATH_PRINCIPAL"), principals[0].url)
assertEquals(null, principals[0].displayName)
@ -449,7 +449,7 @@ class RefreshCollectionsWorkerTest {
.refreshPrincipals()
// Check principal now got a display name
val principals = db.principalDao().get(service.id)
val principals = db.principalDao().getByService(service.id)
assertEquals(1, principals.size)
assertEquals(mockServer.url("$PATH_CARDDAV$SUBPATH_PRINCIPAL"), principals[0].url)
assertEquals("Mr. Wobbles", principals[0].displayName)
@ -473,7 +473,7 @@ class RefreshCollectionsWorkerTest {
.refreshPrincipals()
// Check principal was deleted
val principals = db.principalDao().get(service.id)
val principals = db.principalDao().getByService(service.id)
assertEquals(0, principals.size)
}

View file

@ -11,12 +11,15 @@ import okhttp3.HttpUrl
@Dao
interface PrincipalDao {
@Query("SELECT * FROM principal WHERE serviceId=:serviceId")
fun get(serviceId: Long): List<Principal>
@Query("SELECT * FROM principal WHERE id=:id")
fun get(id: Long): Principal
@Query("SELECT * FROM principal WHERE id=:id")
fun getLive(id: Long): LiveData<Principal>
@Query("SELECT * FROM principal WHERE serviceId=:serviceId")
fun getByService(serviceId: Long): List<Principal>
@Query("SELECT * FROM principal WHERE serviceId=:serviceId AND url=:url")
fun getByUrl(serviceId: Long, url: HttpUrl): Principal?

View file

@ -7,13 +7,15 @@ package at.bitfire.davdroid.resource
import android.accounts.Account
import android.content.ContentProviderClient
import android.content.ContentValues
import at.bitfire.davdroid.util.DavUtils
import at.bitfire.davdroid.db.*
import at.bitfire.davdroid.db.Collection
import at.bitfire.davdroid.db.SyncState
import at.bitfire.davdroid.log.Logger
import at.bitfire.davdroid.util.DavUtils
import at.bitfire.ical4android.JtxCollection
import at.bitfire.ical4android.JtxCollectionFactory
import at.bitfire.ical4android.JtxICalObject
import at.techbee.jtx.JtxContract
import java.util.logging.Level
class LocalJtxCollection(account: Account, client: ContentProviderClient, id: Long):
JtxCollection<JtxICalObject>(account, client, LocalJtxICalObject.Factory, id),
@ -21,17 +23,20 @@ class LocalJtxCollection(account: Account, client: ContentProviderClient, id: Lo
companion object {
fun create(account: Account, client: ContentProviderClient, info: Collection) {
val values = valuesFromCollection(info, account)
fun create(account: Account, client: ContentProviderClient, info: Collection, owner: Principal?) {
val values = valuesFromCollection(info, account, owner)
create(account, client, values)
}
fun valuesFromCollection(info: Collection, account: Account) =
fun valuesFromCollection(info: Collection, account: Account, owner: Principal?) =
ContentValues().apply {
put(JtxContract.JtxCollection.URL, info.url.toString())
put(JtxContract.JtxCollection.DISPLAYNAME, info.displayName ?: DavUtils.lastSegmentOfUrl(info.url))
put(JtxContract.JtxCollection.DESCRIPTION, info.description)
put(JtxContract.JtxCollection.OWNER, info.ownerId)
if (owner != null)
put(JtxContract.JtxCollection.OWNER, owner.url.toString())
else Logger.log.log(Level.SEVERE, "No collection owner given. Will create jtx collection without owner")
put(JtxContract.JtxCollection.OWNER_DISPLAYNAME, owner?.displayName)
put(JtxContract.JtxCollection.COLOR, info.color)
put(JtxContract.JtxCollection.SUPPORTSVEVENT, info.supportsVEVENT)
put(JtxContract.JtxCollection.SUPPORTSVJOURNAL, info.supportsVJOURNAL)
@ -50,8 +55,8 @@ class LocalJtxCollection(account: Account, client: ContentProviderClient, id: Lo
get() = SyncState.fromString(syncstate)
set(value) { syncstate = value.toString() }
fun updateCollection(info: Collection) {
val values = valuesFromCollection(info, account)
fun updateCollection(info: Collection, owner: Principal?) {
val values = valuesFromCollection(info, account, owner)
update(values)
}

View file

@ -427,7 +427,7 @@ class RefreshCollectionsWorker @AssistedInject constructor(
*/
internal fun refreshPrincipals() {
// Refresh principals (collection owner urls)
val principals = db.principalDao().get(service.id)
val principals = db.principalDao().getByService(service.id)
for (oldPrincipal in principals) {
val principalUrl = oldPrincipal.url
Logger.log.fine("Querying principal $principalUrl")

View file

@ -95,7 +95,8 @@ class JtxSyncAdapterService: SyncAdapterService() {
} else {
// remote CollectionInfo found for this local collection, update data
Logger.log.log(Level.FINE, "Updating local collection $url", info)
jtxCollection.updateCollection(info)
val owner = info.ownerId?.let { db.principalDao().get(it) }
jtxCollection.updateCollection(info, owner)
// we already have a local task list for this remote collection, don't take into consideration anymore
remoteCollections -= url
}
@ -104,7 +105,8 @@ class JtxSyncAdapterService: SyncAdapterService() {
// create new local collections
for ((_,info) in remoteCollections) {
Logger.log.log(Level.INFO, "Adding local collections", info)
LocalJtxCollection.create(account, client, info)
val owner = info.ownerId?.let { db.principalDao().get(it) }
LocalJtxCollection.create(account, client, info, owner)
}
}
}

@ -1 +1 @@
Subproject commit 43ef1460bf457dadfae9bc432b3041415cd88329
Subproject commit 596bb13b4672b37e21ec4c7135ab1316ae733087