Passing collection directly (#927)

* Passing `collection` directly

Signed-off-by: Arnau Mora Gras <arnyminerz@proton.me>

* Fixed imports

Signed-off-by: Arnau Mora <arnyminerz@proton.me>

* Fix tests

Signed-off-by: Arnau Mora <arnyminerz@proton.me>

* Log sync time using repository; no need for account/service check anymore

* SyncManagerTest: don't write SyncStats to DB

---------

Signed-off-by: Arnau Mora Gras <arnyminerz@proton.me>
Signed-off-by: Arnau Mora <arnyminerz@proton.me>
Co-authored-by: Ricki Hirner <hirner@bitfire.at>
This commit is contained in:
Arnau Mora 2024-08-05 17:24:46 +02:00 committed by GitHub
parent bf1bdfc8ab
commit 410c70a47d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 29 additions and 43 deletions

View file

@ -10,7 +10,6 @@ import android.content.SyncResult
import android.util.Log
import androidx.core.app.NotificationManagerCompat
import androidx.hilt.work.HiltWorkerFactory
import androidx.test.platform.app.InstrumentationRegistry
import androidx.work.Configuration
import androidx.work.testing.WorkManagerTestInitHelper
import at.bitfire.dav4jvm.PropStat
@ -18,15 +17,19 @@ import at.bitfire.dav4jvm.Response
import at.bitfire.dav4jvm.Response.HrefRelation
import at.bitfire.dav4jvm.property.webdav.GetETag
import at.bitfire.davdroid.TestUtils.assertWithin
import at.bitfire.davdroid.db.AppDatabase
import at.bitfire.davdroid.db.Collection
import at.bitfire.davdroid.db.SyncState
import at.bitfire.davdroid.network.HttpClient
import at.bitfire.davdroid.repository.DavSyncStatsRepository
import at.bitfire.davdroid.settings.AccountSettings
import at.bitfire.davdroid.sync.account.TestAccountAuthenticator
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.android.testing.HiltAndroidRule
import dagger.hilt.android.testing.HiltAndroidTest
import dagger.hilt.components.SingletonComponent
import io.mockk.every
import io.mockk.mockk
import okhttp3.Protocol
@ -46,6 +49,14 @@ import javax.inject.Inject
@HiltAndroidTest
class SyncManagerTest {
@Module
@InstallIn(SingletonComponent::class)
object SyncManagerTestModule {
@Provides
fun davSyncStatsRepository(): DavSyncStatsRepository = mockk<DavSyncStatsRepository>(relaxed = true)
}
@get:Rule
val hiltRule = HiltAndroidRule(this)
@ -55,10 +66,6 @@ class SyncManagerTest {
@Inject
@ApplicationContext
lateinit var context: Context
val testContext = InstrumentationRegistry.getInstrumentation().context
@Inject
lateinit var db: AppDatabase
@Inject
lateinit var syncManagerFactory: TestSyncManager.Factory
@ -510,6 +517,7 @@ class SyncManagerTest {
localCollection: LocalTestCollection,
syncResult: SyncResult = SyncResult(),
collection: Collection = mockk<Collection>() {
every { id } returns 1
every { url } returns server.url("/")
}
) = syncManagerFactory.create(

View file

@ -7,6 +7,7 @@ package at.bitfire.davdroid.repository
import android.content.Context
import android.content.pm.PackageManager
import at.bitfire.davdroid.db.AppDatabase
import at.bitfire.davdroid.db.SyncStats
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
@ -39,6 +40,15 @@ class DavSyncStatsRepository @Inject constructor(
}
}
fun logSyncTime(collectionId: Long, authority: String, lastSync: Long = System.currentTimeMillis()) {
dao.insertOrReplace(SyncStats(
id = 0,
collectionId = collectionId,
authority = authority,
lastSync = lastSync
))
}
/**
* Tries to find the application name for given authority. Returns the authority if not

View file

@ -37,12 +37,10 @@ import at.bitfire.dav4jvm.property.webdav.GetETag
import at.bitfire.dav4jvm.property.webdav.SyncToken
import at.bitfire.davdroid.InvalidAccountException
import at.bitfire.davdroid.R
import at.bitfire.davdroid.db.AppDatabase
import at.bitfire.davdroid.db.Collection
import at.bitfire.davdroid.db.Service
import at.bitfire.davdroid.db.SyncState
import at.bitfire.davdroid.db.SyncStats
import at.bitfire.davdroid.network.HttpClient
import at.bitfire.davdroid.repository.DavSyncStatsRepository
import at.bitfire.davdroid.resource.LocalAddressBook
import at.bitfire.davdroid.resource.LocalCollection
import at.bitfire.davdroid.resource.LocalContact
@ -151,15 +149,15 @@ abstract class SyncManager<ResourceType: LocalResource<*>, out CollectionType: L
@ApplicationContext
lateinit var context: Context
@Inject
lateinit var db: AppDatabase
@Inject
lateinit var logger: Logger
@Inject
lateinit var notificationRegistry: NotificationRegistry
@Inject
lateinit var syncStatsRepository: DavSyncStatsRepository
init {
// required for ServiceLoader -> ical4j -> ical4android
@ -189,9 +187,7 @@ abstract class SyncManager<ResourceType: LocalResource<*>, out CollectionType: L
logger.info("No reason to synchronize, aborting")
return
}
// log sync time
saveSyncTime()
syncStatsRepository.logSyncTime(collection.id, authority)
logger.info("Querying server capabilities")
var remoteSyncState = queryCapabilities()
@ -341,34 +337,6 @@ abstract class SyncManager<ResourceType: LocalResource<*>, out CollectionType: L
}
}
/**
* Saves the sync time of the synced account and service.
*/
private fun saveSyncTime() {
val serviceType = when (authority) {
ContactsContract.AUTHORITY -> // contacts
Service.TYPE_CARDDAV
else -> // calendars and tasks
Service.TYPE_CALDAV
}
val accountName =
if (localCollection is LocalAddressBook)
localCollection.requireMainAccount().name
else
account.name
db.runInTransaction {
val service = db.serviceDao().getByAccountAndType(accountName, serviceType)
?: return@runInTransaction
val collection = db.collectionDao().getByServiceAndUrl(service.id, collection.url.toString())
?: return@runInTransaction
db.syncStatsDao().insertOrReplace(
SyncStats(0, collection.id, authority, System.currentTimeMillis())
)
}
}
/**
* Prepares synchronization. Sets the lateinit property [davCollection].