Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ class AndroidApplication : Application() {
oonimkallBridge = AndroidOonimkallBridge(),
baseFileDir = filesDir.absolutePath,
cacheDir = cacheDir.absolutePath,
readAssetFile = ::readAssetFile,
databaseDriverFactory = ::buildDatabaseDriver,
networkTypeFinder = AndroidNetworkTypeFinder(connectivityManager),
buildDataStore = ::buildDataStore,
Expand Down Expand Up @@ -99,16 +98,14 @@ class AndroidApplication : Application() {
)
}

private fun readAssetFile(path: String) = assets.open(path).bufferedReader().use { it.readText() }

private val connectivityManager get() = getSystemService(ConnectivityManager::class.java)

private fun buildDatabaseDriver(): SqlDriver = AndroidSqliteDriver(Database.Schema, this, "v2.db")

private fun buildDataStore(): DataStore<Preferences> =
Dependencies.getDataStore(
producePath = {
filesDir.resolve(Dependencies.Companion.DATA_STORE_FILE_NAME).absolutePath
filesDir.resolve(Dependencies.DATA_STORE_FILE_NAME).absolutePath
},
migrations = listOf(
SharedPreferencesMigration(this, "${packageName}_preferences"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import androidx.work.WorkManager
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.withContext
import org.ooni.probe.data.models.AutoRunParameters
import org.ooni.probe.data.models.InstalledTestDescriptorModel
import org.ooni.probe.data.models.Descriptor
import org.ooni.probe.data.models.RunSpecification
import java.util.concurrent.TimeUnit

Expand Down Expand Up @@ -80,7 +80,7 @@ class AppWorkerManager(
true
}

suspend fun startDescriptorsUpdate(descriptors: List<InstalledTestDescriptorModel>?) {
suspend fun startDescriptorsUpdate(descriptors: List<Descriptor>?) {
withContext(backgroundDispatcher) {
workManager
.enqueueUniqueWork(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import ooniprobe.composeapp.generated.resources.Res
import org.jetbrains.compose.resources.getString
import org.ooni.probe.AndroidApplication
import org.ooni.probe.R
import org.ooni.probe.data.models.InstalledTestDescriptorModel
import org.ooni.probe.data.models.Descriptor
import org.ooni.probe.di.Dependencies

class DescriptorUpdateWorker(
Expand Down Expand Up @@ -85,12 +85,12 @@ class DescriptorUpdateWorker(
}
}

private suspend fun getDescriptors(): List<InstalledTestDescriptorModel>? {
private suspend fun getDescriptors(): List<Descriptor>? {
val descriptorsJson = inputData.getString(DATA_KEY_DESCRIPTORS)
if (descriptorsJson != null) {
try {
val ids =
json.decodeFromString<List<InstalledTestDescriptorModel.Id>>(descriptorsJson)
json.decodeFromString<List<Descriptor.Id>>(descriptorsJson)
return testDescriptorRepository.listLatestByRunIds(ids).first()
} catch (e: SerializationException) {
Logger.w("Could not start update worker: invalid configuration", e)
Expand Down Expand Up @@ -131,7 +131,7 @@ class DescriptorUpdateWorker(
) : EarlyStopWorkerException(reason)

companion object {
fun buildWorkData(descriptors: List<InstalledTestDescriptorModel.Id>): Data =
fun buildWorkData(descriptors: List<Descriptor.Id>): Data =
workDataOf(
DATA_KEY_DESCRIPTORS to Dependencies.buildJson().encodeToString(descriptors),
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,6 @@

<string name="Settings_Title">Settings</string>
<string name="Settings_TestOptions_Label">Test options</string>
<string name="Settings_TestOptions_LongRunningTest">Long running test</string>
<string name="Settings_AutomatedTesting_RunAutomatically">Run tests automatically</string>
<string name="Settings_AutomatedTesting_RunAutomatically_WiFiOnly">Only on WiFi</string>
<string name="Settings_AutomatedTesting_RunAutomatically_ChargingOnly">Only while charging</string>
Expand Down
6 changes: 3 additions & 3 deletions composeApp/src/commonMain/kotlin/org/ooni/engine/Engine.kt
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import org.ooni.engine.models.TaskSettings
import org.ooni.engine.models.resultOf
import org.ooni.probe.config.OrganizationConfig
import org.ooni.probe.data.models.BatteryState
import org.ooni.probe.data.models.InstalledTestDescriptorModel
import org.ooni.probe.data.models.Descriptor
import org.ooni.probe.data.models.NetTest
import org.ooni.probe.data.models.ProxyOption
import org.ooni.probe.domain.CancelListenerCallback
Expand All @@ -47,7 +47,7 @@ class Engine(
fun startTask(
netTest: NetTest,
taskOrigin: TaskOrigin,
descriptorId: InstalledTestDescriptorModel.Id?,
descriptorId: Descriptor.Id?,
): Flow<TaskEvent> {
val context = newSingleThreadContext("engine-start-task")
return channelFlow {
Expand Down Expand Up @@ -157,7 +157,7 @@ class Engine(
netTest: NetTest,
taskOrigin: TaskOrigin,
preferences: EnginePreferences,
descriptorId: InstalledTestDescriptorModel.Id?,
descriptorId: Descriptor.Id?,
) = TaskSettings(
name = netTest.test.name,
inputs = netTest.inputs.orEmpty(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,6 @@ import kotlinx.serialization.Serializable
data class OONINetTest(
@SerialName("test_name") val name: String,
@SerialName("inputs") val inputs: List<String>? = null,
@SerialName("is_background_run_enabled_default") val isBackgroundRunEnabled: Boolean = false,
@SerialName("is_manual_run_enabled_default") val isManualRunEnabled: Boolean = false,
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package org.ooni.engine.models
import kotlin.time.Instant
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import org.ooni.probe.data.models.InstalledTestDescriptorModel
import org.ooni.probe.data.models.Descriptor
import org.ooni.probe.data.models.NetTest
import org.ooni.probe.shared.toLocalDateTime

Expand Down Expand Up @@ -34,8 +34,8 @@ data class OONIRunDescriptor(
)

fun OONIRunDescriptor.toModel() =
InstalledTestDescriptorModel(
id = InstalledTestDescriptorModel.Id(oonirunLinkId),
Descriptor(
id = Descriptor.Id(oonirunLinkId),
revision = revision,
name = name,
shortDescription = shortDescription,
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,73 +1,80 @@
package org.ooni.probe.data.models

import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color
import kotlinx.datetime.LocalDateTime
import org.jetbrains.compose.resources.DrawableResource
import org.ooni.engine.models.SummaryType
import org.ooni.engine.models.TestType
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import org.ooni.probe.config.OrganizationConfig
import org.ooni.probe.data.TestDescriptor
import org.ooni.probe.shared.now
import kotlin.time.Duration.Companion.seconds
import org.ooni.probe.shared.toEpoch

@Serializable
data class Descriptor(
val id: Id,
val revision: Long,
val name: String,
val title: @Composable () -> String,
val shortDescription: @Composable () -> String?,
val description: @Composable () -> String?,
val metadata: @Composable () -> String? = { null },
val icon: DrawableResource?,
val color: Color?,
val animation: Animation?,
val dataUsage: @Composable () -> String?,
val expirationDate: LocalDateTime?,
val shortDescription: String?,
val description: String?,
val author: String?,
val netTests: List<NetTest>,
val longRunningTests: List<NetTest> = emptyList(),
val source: Source,
val updateStatus: UpdateStatus,
val enabled: Boolean = true,
val summaryType: SummaryType,
val nameIntl: LocalizationString?,
val shortDescriptionIntl: LocalizationString?,
val descriptionIntl: LocalizationString?,
val icon: String?,
val color: String?,
val animation: String?,
val expirationDate: LocalDateTime?,
val dateCreated: LocalDateTime?,
val dateUpdated: LocalDateTime?,
val dateInstalled: LocalDateTime?,
val rejectedRevision: Long? = null,
val autoUpdate: Boolean,
) {
sealed interface Source {
data class Default(
val value: DefaultTestDescriptor,
) : Source
@Serializable
data class Id(
val value: String,
)

data class Installed(
val value: InstalledTestDescriptorModel,
) : Source
}

val isExpired get() = expirationDate != null && expirationDate < LocalDateTime.now()
@Serializable
data class Key(
val id: Id,
val revision: Long,
)

val updatedDescriptor
get() = (updateStatus as? UpdateStatus.Updatable)?.updatedDescriptor
val isOoniDescriptor get() = OoniTest.isValidId(id.value)

val key: String
get() = when (source) {
is Source.Default -> name
is Source.Installed -> source.value.id.value
}
val key get() = Key(id, revision)

val allTests get() = netTests + longRunningTests
val previousRevisions
get() = if (revision <= 1) emptyList() else (1 until revision).toList().reversed()

val estimatedDuration
get() = allTests
.sumOf { it.test.runtime(it.inputs).inWholeSeconds }
.seconds

val isWebConnectivityOnly
get() =
allTests.size == 1 && allTests.first().test == TestType.WebConnectivity

val runLink get() = (source as? Source.Installed)?.value?.runLink
val isExpired get() = expirationDate != null && expirationDate < LocalDateTime.now()

companion object {
val SORT_COMPARATOR =
compareByDescending<Descriptor> { it.source is Source.Installed }
.thenBy { it.isExpired }
.thenByDescending { (it.source as? Source.Installed)?.value?.dateInstalled }
.thenByDescending { (it.source as? Source.Installed)?.value?.id?.value }
}
val runLink get() = "${OrganizationConfig.ooniRunDashboardUrl}/v2/${id.value}"
}

fun List<Descriptor>.notExpired() = filter { !it.isExpired }
fun Descriptor.toDb(json: Json) =
TestDescriptor(
runId = id.value,
revision = revision,
name = name,
short_description = shortDescription,
description = description,
author = author,
nettests = netTests
.map { it.toOONI() }
.let { json.encodeToString(it) },
name_intl = json.encodeToString(nameIntl),
short_description_intl = json.encodeToString(shortDescriptionIntl),
description_intl = json.encodeToString(descriptionIntl),
icon = icon,
color = color,
animation = animation,
expiration_date = expirationDate?.toEpoch(),
date_created = dateCreated?.toEpoch(),
date_updated = dateUpdated?.toEpoch(),
date_installed = dateInstalled?.toEpoch(),
auto_update = if (autoUpdate) 1 else 0,
rejected_revision = rejectedRevision,
)
Loading
Loading