From 2c424240dfd3c1a67c2c12d53096a5246ec0d00a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Santos?= Date: Fri, 20 Sep 2024 12:00:24 +0100 Subject: [PATCH] Update AGP. Store engine URL. Remove notification sound and vibration. Don't run test without urls. --- .../org/ooni/probe/background/RunWorker.kt | 6 +- .../probe/data/repositories/UrlRepository.kt | 18 +++-- .../kotlin/org/ooni/probe/di/Dependencies.kt | 3 +- .../org/ooni/probe/domain/RunDescriptors.kt | 2 + .../org/ooni/probe/domain/RunNetTest.kt | 5 +- .../data/repositories/UrlRepositoryTest.kt | 66 +++++++++---------- gradle/libs.versions.toml | 4 +- 7 files changed, 58 insertions(+), 46 deletions(-) diff --git a/composeApp/src/androidMain/kotlin/org/ooni/probe/background/RunWorker.kt b/composeApp/src/androidMain/kotlin/org/ooni/probe/background/RunWorker.kt index 7a35e85e..a96b5f78 100644 --- a/composeApp/src/androidMain/kotlin/org/ooni/probe/background/RunWorker.kt +++ b/composeApp/src/androidMain/kotlin/org/ooni/probe/background/RunWorker.kt @@ -136,7 +136,7 @@ class RunWorker( NotificationChannel( NOTIFICATION_CHANNEL_ID, getString(Res.string.notification_channel_name), - NotificationManager.IMPORTANCE_DEFAULT, + NotificationManager.IMPORTANCE_LOW, ), ) } @@ -150,6 +150,10 @@ class RunWorker( .setColor(state.descriptor?.color?.toArgb() ?: primaryLight.toArgb()) .setProgress(1000, (state.progress * 1000).roundToInt(), false) .setAutoCancel(false) + .setPriority(NotificationCompat.PRIORITY_LOW) + .setSound(null) + .setVibrate(null) + .setLights(0, 0, 0) .setContentIntent(openAppIntent) .addAction( NotificationCompat.Action.Builder( diff --git a/composeApp/src/commonMain/kotlin/org/ooni/probe/data/repositories/UrlRepository.kt b/composeApp/src/commonMain/kotlin/org/ooni/probe/data/repositories/UrlRepository.kt index 39fc9e17..34503756 100644 --- a/composeApp/src/commonMain/kotlin/org/ooni/probe/data/repositories/UrlRepository.kt +++ b/composeApp/src/commonMain/kotlin/org/ooni/probe/data/repositories/UrlRepository.kt @@ -4,6 +4,7 @@ import app.cash.sqldelight.coroutines.asFlow import app.cash.sqldelight.coroutines.mapToList import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.coroutines.withContext import org.ooni.engine.models.WebConnectivityCategory @@ -65,6 +66,19 @@ class UrlRepository( } } + suspend fun getOrCreateByUrl(url: String): UrlModel = + listByUrls(listOf(url)) + .first() + .firstOrNull() + ?: run { + val newModel = UrlModel( + url = url, + category = WebConnectivityCategory.MISC, + countryCode = null, + ) + newModel.copy(id = createOrUpdate(newModel)) + } + fun list(): Flow> = database.urlQueries .selectAll() @@ -78,10 +92,6 @@ class UrlRepository( .asFlow() .mapToList(backgroundDispatcher) .map { list -> list.mapNotNull { it.toModel() } } - - fun getByUrl(url: String): Flow = - listByUrls(listOf(url)) - .map { it.firstOrNull() } } fun Url.toModel(): UrlModel? { diff --git a/composeApp/src/commonMain/kotlin/org/ooni/probe/di/Dependencies.kt b/composeApp/src/commonMain/kotlin/org/ooni/probe/di/Dependencies.kt index 201ee3bb..1bf81ae6 100644 --- a/composeApp/src/commonMain/kotlin/org/ooni/probe/di/Dependencies.kt +++ b/composeApp/src/commonMain/kotlin/org/ooni/probe/di/Dependencies.kt @@ -207,6 +207,7 @@ class Dependencies( observeSettings = preferenceRepository::allSettings, ) } + val runDescriptors by lazy { RunDescriptors( getTestDescriptorsBySpec = getTestDescriptorsBySpec::invoke, @@ -257,7 +258,7 @@ class Dependencies( startTest = engine::startTask, storeResult = resultRepository::createOrUpdate, setCurrentTestState = testStateManager::updateState, - getUrlByUrl = urlRepository::getByUrl, + getOrCreateUrl = urlRepository::getOrCreateByUrl, storeMeasurement = measurementRepository::createOrUpdate, storeNetwork = networkRepository::createIfNew, writeFile = writeFile, diff --git a/composeApp/src/commonMain/kotlin/org/ooni/probe/domain/RunDescriptors.kt b/composeApp/src/commonMain/kotlin/org/ooni/probe/domain/RunDescriptors.kt index ef1c1a52..9c4a7872 100644 --- a/composeApp/src/commonMain/kotlin/org/ooni/probe/domain/RunDescriptors.kt +++ b/composeApp/src/commonMain/kotlin/org/ooni/probe/domain/RunDescriptors.kt @@ -91,9 +91,11 @@ class RunDescriptors( longRunningTests = descriptor.longRunningTests.downloadUrlsIfNeeded(taskOrigin), ) } + .filterNot { it.allTests.isEmpty() } private suspend fun List.downloadUrlsIfNeeded(taskOrigin: TaskOrigin): List = map { test -> test.copy(inputs = test.inputsOrDownloadUrls(taskOrigin)) } + .filterNot { it.test is TestType.WebConnectivity && it.inputs?.any() != true } private suspend fun NetTest.inputsOrDownloadUrls(taskOrigin: TaskOrigin): List? { if (!inputs.isNullOrEmpty() || test !is TestType.WebConnectivity) return inputs diff --git a/composeApp/src/commonMain/kotlin/org/ooni/probe/domain/RunNetTest.kt b/composeApp/src/commonMain/kotlin/org/ooni/probe/domain/RunNetTest.kt index e5ecdb6c..a6b1fa30 100644 --- a/composeApp/src/commonMain/kotlin/org/ooni/probe/domain/RunNetTest.kt +++ b/composeApp/src/commonMain/kotlin/org/ooni/probe/domain/RunNetTest.kt @@ -3,7 +3,6 @@ package org.ooni.probe.domain import co.touchlab.kermit.Logger import co.touchlab.kermit.Severity import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.first import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import org.ooni.engine.models.TaskEvent @@ -23,7 +22,7 @@ import org.ooni.probe.shared.toLocalDateTime class RunNetTest( private val startTest: (String, List?, TaskOrigin, InstalledTestDescriptorModel.Id?) -> Flow, - private val getUrlByUrl: suspend (String) -> Flow, + private val getOrCreateUrl: suspend (String) -> UrlModel, private val storeMeasurement: suspend (MeasurementModel) -> MeasurementModel.Id, private val storeNetwork: suspend (NetworkModel) -> NetworkModel.Id, private val storeResult: suspend (ResultModel) -> ResultModel.Id, @@ -101,7 +100,7 @@ class RunNetTest( urlId = if (event.url.isNullOrEmpty()) { null } else { - getUrlByUrl(event.url).first()?.id + getOrCreateUrl(event.url).id }, ), ) diff --git a/composeApp/src/commonTest/kotlin/org/ooni/probe/data/repositories/UrlRepositoryTest.kt b/composeApp/src/commonTest/kotlin/org/ooni/probe/data/repositories/UrlRepositoryTest.kt index 443638a8..4a2ecae7 100644 --- a/composeApp/src/commonTest/kotlin/org/ooni/probe/data/repositories/UrlRepositoryTest.kt +++ b/composeApp/src/commonTest/kotlin/org/ooni/probe/data/repositories/UrlRepositoryTest.kt @@ -20,22 +20,20 @@ class UrlRepositoryTest { @BeforeTest fun before() { - subject = - UrlRepository( - database = Dependencies.buildDatabase(::createTestDatabaseDriver), - backgroundDispatcher = Dispatchers.Default, - ) + subject = UrlRepository( + database = Dependencies.buildDatabase(::createTestDatabaseDriver), + backgroundDispatcher = Dispatchers.Default, + ) } @Test fun createWithoutIdAndGet() = runTest { - val model = - UrlModelFactory.build( - id = null, - countryCode = "IT", - category = WebConnectivityCategory.ENV, - ) + val model = UrlModelFactory.build( + id = null, + countryCode = "IT", + category = WebConnectivityCategory.ENV, + ) subject.createOrUpdate(model) val result = subject.list().first().first() @@ -61,29 +59,26 @@ class UrlRepositoryTest { @Test fun createOrUpdateByUrls() = runTest { - val existingModel = - UrlModelFactory.build( - id = UrlModel.Id(Random.nextLong().absoluteValue), - url = "https://example.org", - countryCode = null, - category = WebConnectivityCategory.MISC, - ) + val existingModel = UrlModelFactory.build( + id = UrlModel.Id(Random.nextLong().absoluteValue), + url = "https://example.org", + countryCode = null, + category = WebConnectivityCategory.MISC, + ) subject.createOrUpdate(existingModel) - val modelWithSameUrl = - UrlModelFactory.build( - id = null, - url = existingModel.url, - countryCode = "US", - category = WebConnectivityCategory.ENV, - ) - val modelWithNewUrl = - UrlModelFactory.build( - id = null, - url = "https://ooni.org", - countryCode = "IT", - category = WebConnectivityCategory.NEWS, - ) + val modelWithSameUrl = UrlModelFactory.build( + id = null, + url = existingModel.url, + countryCode = "US", + category = WebConnectivityCategory.ENV, + ) + val modelWithNewUrl = UrlModelFactory.build( + id = null, + url = "https://ooni.org", + countryCode = "IT", + category = WebConnectivityCategory.NEWS, + ) val results = subject.createOrUpdateByUrl(listOf(modelWithSameUrl, modelWithNewUrl)) val allUrls = subject.list().first() @@ -105,15 +100,16 @@ class UrlRepositoryTest { } @Test - fun getByUrl() = + fun getOrCreateByUrl() = runTest { val url = "htts://example.org" val model = UrlModelFactory.build(url = url) - subject.createOrUpdate(model) - val result = subject.getByUrl(url).first() + val id = subject.createOrUpdate(model) + val result = subject.getOrCreateByUrl(url) assertNotNull(result) assertEquals(url, result.url) + assertEquals(id, result.id) } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ef3fa4d6..72d40afb 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,13 +1,13 @@ [versions] -agp = "8.3.2" # Max compatible version https://kotlinlang.org/docs/multiplatform-compatibility-guide.html#version-compatibility +agp = "8.5.2" # Check compatibility https://kotlinlang.org/docs/multiplatform-compatibility-guide.html#version-compatibility android-compileSdk = "34" android-minSdk = "24" android-targetSdk = "34" compose-plugin = "1.6.11" -kotlin = "2.0.0" +kotlin = "2.0.20" sqldelight = "2.0.2" dataStoreVersion = "1.1.1"