Add a periodic DB vacuuming task

This commit is contained in:
Jorge Martín 2025-12-05 14:19:36 +01:00 committed by Jorge Martin Espinosa
parent 9c72310cb4
commit 482d7e0648
22 changed files with 172 additions and 21 deletions

View file

@ -12,16 +12,19 @@ import io.element.android.libraries.matrix.api.core.SessionId
interface WorkManagerScheduler {
fun submit(workManagerRequest: WorkManagerRequest)
fun hasPendingWork(sessionId: SessionId, requestType: WorkManagerRequestType): Boolean
fun cancel(sessionId: SessionId)
}
fun workManagerTag(sessionId: SessionId, requestType: WorkManagerRequestType): String {
val prefix = when (requestType) {
WorkManagerRequestType.NOTIFICATION_SYNC -> "notifications"
WorkManagerRequestType.DB_VACUUM -> "db_vacuum"
}
return "$prefix-$sessionId"
}
enum class WorkManagerRequestType {
NOTIFICATION_SYNC,
DB_VACUUM,
}

View file

@ -11,6 +11,7 @@ package io.element.android.libraries.workmanager.impl
import androidx.work.WorkManager
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.ContributesBinding
import io.element.android.libraries.core.bool.orFalse
import dev.zacsweers.metro.SingleIn
import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.sessionstorage.api.observer.SessionListener
@ -51,6 +52,10 @@ class DefaultWorkManagerScheduler(
)
}
override fun hasPendingWork(sessionId: SessionId, requestType: WorkManagerRequestType): Boolean {
return workManager.getWorkInfosByTag(workManagerTag(sessionId, requestType)).get()?.isNotEmpty().orFalse()
}
override fun cancel(sessionId: SessionId) {
Timber.d("Cancelling work for sessionId: $sessionId")
for (requestType in WorkManagerRequestType.entries) {

View file

@ -10,17 +10,23 @@ package io.element.android.libraries.workmanager.test
import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.workmanager.api.WorkManagerRequest
import io.element.android.libraries.workmanager.api.WorkManagerRequestType
import io.element.android.libraries.workmanager.api.WorkManagerScheduler
import io.element.android.tests.testutils.lambda.lambdaError
class FakeWorkManagerScheduler(
private val submitLambda: (WorkManagerRequest) -> Unit = { lambdaError() },
private val hasPendingWorkLambda: (SessionId, WorkManagerRequestType) -> Boolean = { _, _ -> false },
private val cancelLambda: (SessionId) -> Unit = { lambdaError() },
) : WorkManagerScheduler {
override fun submit(workManagerRequest: WorkManagerRequest) {
submitLambda(workManagerRequest)
}
override fun hasPendingWork(sessionId: SessionId, requestType: WorkManagerRequestType): Boolean {
return hasPendingWorkLambda(sessionId, requestType)
}
override fun cancel(sessionId: SessionId) {
cancelLambda(sessionId)
}