Add developer option to optimize the SDK DBs

This commit is contained in:
Jorge Martín
2025-11-28 07:58:06 +01:00
committed by Jorge Martin Espinosa
parent d98a733974
commit 9c72310cb4
6 changed files with 49 additions and 0 deletions

View File

@@ -21,4 +21,5 @@ sealed interface DeveloperSettingsEvents {
data class SetShowColorPicker(val show: Boolean) : DeveloperSettingsEvents
data class ChangeBrandColor(val color: Color?) : DeveloperSettingsEvents
data object ClearCache : DeveloperSettingsEvents
data object VacuumStores : DeveloperSettingsEvents
}

View File

@@ -29,6 +29,7 @@ import io.element.android.features.preferences.impl.developer.tracing.toLogLevel
import io.element.android.features.preferences.impl.model.EnabledFeature
import io.element.android.features.preferences.impl.tasks.ClearCacheUseCase
import io.element.android.features.preferences.impl.tasks.ComputeCacheSizeUseCase
import io.element.android.features.preferences.impl.tasks.VacuumStoresUseCase
import io.element.android.features.rageshake.api.preferences.RageshakePreferencesState
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.architecture.AsyncData
@@ -61,6 +62,7 @@ class DeveloperSettingsPresenter(
private val appPreferencesStore: AppPreferencesStore,
private val buildMeta: BuildMeta,
private val enterpriseService: EnterpriseService,
private val vacuumStoresUseCase: VacuumStoresUseCase,
) : Presenter<DeveloperSettingsState> {
@Composable
override fun present(): DeveloperSettingsState {
@@ -151,6 +153,9 @@ class DeveloperSettingsPresenter(
is DeveloperSettingsEvents.SetShowColorPicker -> {
showColorPicker = event.show
}
DeveloperSettingsEvents.VacuumStores -> coroutineScope.launch {
vacuumStoresUseCase()
}
}
}

View File

@@ -146,6 +146,14 @@ fun DeveloperSettingsView(
}
val cache = state.cacheSize
PreferenceCategory(title = "Cache") {
ListItem(
headlineContent = {
Text("Vacuum stores")
},
onClick = {
state.eventSink(DeveloperSettingsEvents.VacuumStores)
}
)
ListItem(
headlineContent = {
Text("Clear cache")

View File

@@ -0,0 +1,27 @@
/*
* Copyright (c) 2025 Element Creations Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.features.preferences.impl.tasks
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.ContributesBinding
import io.element.android.libraries.matrix.api.MatrixClient
import timber.log.Timber
interface VacuumStoresUseCase {
suspend operator fun invoke()
}
@ContributesBinding(AppScope::class)
class DefaultVacuumStoresUseCase(
private val matrixClient: MatrixClient,
) : VacuumStoresUseCase {
override suspend fun invoke() {
matrixClient.vacuumStores()
.onFailure { Timber.e(it, "Failed to vacuum stores") }
}
}

View File

@@ -194,6 +194,8 @@ interface MatrixClient {
* Use [Timeline.markAsRead] instead when possible.
*/
suspend fun markRoomAsFullyRead(roomId: RoomId, eventId: EventId): Result<Unit>
suspend fun vacuumStores(): Result<Unit>
}
/**

View File

@@ -726,6 +726,12 @@ class RustMatrixClient(
}
}
override suspend fun vacuumStores(): Result<Unit> = withContext(sessionDispatcher) {
runCatchingExceptions {
innerClient.optimizeStores()
}
}
private suspend fun getCacheSize(
includeCryptoDb: Boolean = false,
): Long = withContext(sessionDispatcher) {