Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Switch to Result Summary Type #373

Merged
merged 1 commit into from
Jan 13, 2025
Merged
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
@@ -0,0 +1,7 @@
package org.ooni.engine.models

enum class SummaryType {
Simple, // total + failed count
Anomaly, // total + failed + anomaly/success count
Performance, // download/upload speed + video quality
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package org.ooni.probe.data.models
import androidx.compose.ui.graphics.Color
import org.jetbrains.compose.resources.DrawableResource
import org.jetbrains.compose.resources.StringResource
import org.ooni.engine.models.SummaryType

data class DefaultTestDescriptor(
val label: String,
Expand All @@ -13,6 +14,7 @@ data class DefaultTestDescriptor(
val color: Color,
val animation: Animation,
val dataUsage: StringResource,
var netTests: List<NetTest>,
var longRunningTests: List<NetTest> = emptyList(),
val netTests: List<NetTest>,
val longRunningTests: List<NetTest> = emptyList(),
val summaryType: SummaryType,
)
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ 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.probe.shared.now
import kotlin.time.Duration.Companion.seconds

Expand All @@ -23,6 +24,7 @@ data class Descriptor(
val source: Source,
val updateStatus: UpdateStatus,
val enabled: Boolean = true,
val summaryType: SummaryType,
) {
sealed interface Source {
data class Default(val value: DefaultTestDescriptor) : Source
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import ooniprobe.composeapp.generated.resources.test_instant_messaging
import ooniprobe.composeapp.generated.resources.test_performance
import ooniprobe.composeapp.generated.resources.test_websites
import org.jetbrains.compose.resources.stringResource
import org.ooni.engine.models.SummaryType
import org.ooni.probe.data.TestDescriptor
import org.ooni.probe.shared.InstalledDescriptorIcons
import org.ooni.probe.shared.hexToColor
Expand Down Expand Up @@ -84,6 +85,8 @@ fun InstalledTestDescriptorModel.toDescriptor(updateStatus: UpdateStatus = Updat
netTests = netTests.orEmpty(),
source = Descriptor.Source.Installed(this),
updateStatus = updateStatus,
// In the future, this will become a DB field with a value provided by the back-end
summaryType = SummaryType.Simple,
)

private val iconAnimationMap = mapOf(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ class GetTestDescriptors(
longRunningTests = longRunningTests,
source = Descriptor.Source.Default(this),
updateStatus = UpdateStatus.NotApplicable,
summaryType = summaryType,
)

@Composable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ import ooniprobe.composeapp.generated.resources.ooni_bw
import org.jetbrains.compose.resources.painterResource
import org.jetbrains.compose.resources.stringResource
import org.ooni.engine.models.NetworkType
import org.ooni.engine.models.TestGroup
import org.ooni.engine.models.SummaryType
import org.ooni.probe.data.models.ResultItem
import org.ooni.probe.shared.pluralStringResourceItem
import org.ooni.probe.ui.result.ResultViewModel.MeasurementGroupItem.Group
Expand Down Expand Up @@ -197,28 +197,18 @@ fun ResultScreen(

@Composable
private fun Summary(item: ResultItem) {
val testGroup = TestGroup.fromTests(item.descriptor.netTests.map { it.test })
val summaryType = item.descriptor.summaryType
val pages = summaryType.summaryPages
val pagerState = rememberPagerState(pageCount = pages::size)

val pagerState = rememberPagerState(pageCount = testGroup::summaryPageCount)
Box {
HorizontalPager(
state = pagerState,
verticalAlignment = Alignment.Top,
modifier = Modifier.padding(top = 8.dp, bottom = 16.dp)
.defaultMinSize(minHeight = 128.dp),
) { page ->
when (page) {
0 -> when (testGroup) {
TestGroup.Experimental -> SummaryDetails(item)
TestGroup.Performance -> Text("Performance")
else -> SummaryStats(item)
}
1 -> when (testGroup) {
TestGroup.Experimental -> SummaryNetwork(item)
else -> SummaryDetails(item)
}
2 -> SummaryNetwork(item)
}
) { pageIndex ->
pages[pageIndex](item)
}
Row(
Modifier.wrapContentHeight().fillMaxWidth().align(Alignment.BottomCenter)
Expand All @@ -241,6 +231,24 @@ private fun Summary(item: ResultItem) {
}
}

private val SummaryType.summaryPages: List<@Composable (ResultItem) -> Unit>
get() = when (this) {
SummaryType.Simple -> listOf(
{ SummaryDetails(it) },
{ SummaryNetwork(it) },
)
SummaryType.Anomaly -> listOf(
{ SummaryStats(it) },
{ SummaryDetails(it) },
{ SummaryNetwork(it) },
)
SummaryType.Performance -> listOf(
// TODO: Insert performance summary page here
{ SummaryDetails(it) },
{ SummaryNetwork(it) },
)
}

@Composable
private fun SummaryStats(item: ResultItem) {
Row(
Expand Down Expand Up @@ -303,12 +311,6 @@ private fun SummaryStats(item: ResultItem) {
}
}

fun TestGroup.summaryPageCount(): Int =
when (this) {
TestGroup.Experimental -> 2
else -> 3
}

@Composable
private fun SummaryDetails(item: ResultItem) {
Column(Modifier.padding(horizontal = 16.dp)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,6 @@ import ooniprobe.composeapp.generated.resources.Res
import ooniprobe.composeapp.generated.resources.Snackbar_ResultsNotUploaded_Text
import ooniprobe.composeapp.generated.resources.TaskOrigin_AutoRun
import ooniprobe.composeapp.generated.resources.TaskOrigin_Manual
import ooniprobe.composeapp.generated.resources.TestResults_Overview_Circumvention_Available
import ooniprobe.composeapp.generated.resources.TestResults_Overview_Circumvention_Blocked
import ooniprobe.composeapp.generated.resources.TestResults_Overview_InstantMessaging_Available
import ooniprobe.composeapp.generated.resources.TestResults_Overview_InstantMessaging_Blocked
import ooniprobe.composeapp.generated.resources.TestResults_Overview_Websites_Blocked
import ooniprobe.composeapp.generated.resources.TestResults_Overview_Websites_Tested
import ooniprobe.composeapp.generated.resources.TestResults_UnknownASN
Expand All @@ -37,15 +33,14 @@ import ooniprobe.composeapp.generated.resources.ic_download
import ooniprobe.composeapp.generated.resources.ic_history
import ooniprobe.composeapp.generated.resources.ic_measurement_anomaly
import ooniprobe.composeapp.generated.resources.ic_measurement_failed
import ooniprobe.composeapp.generated.resources.ic_measurement_ok
import ooniprobe.composeapp.generated.resources.ic_upload
import ooniprobe.composeapp.generated.resources.ic_world
import ooniprobe.composeapp.generated.resources.video_quality
import org.jetbrains.compose.resources.DrawableResource
import org.jetbrains.compose.resources.painterResource
import org.jetbrains.compose.resources.stringResource
import org.ooni.engine.models.SummaryType
import org.ooni.engine.models.TaskOrigin
import org.ooni.engine.models.TestGroup
import org.ooni.probe.data.models.ResultListItem
import org.ooni.probe.shared.pluralStringResourceItem
import org.ooni.probe.ui.dashboard.TestDescriptorLabel
Expand Down Expand Up @@ -154,7 +149,7 @@ fun ResultCell(

@Composable
private fun ResultCounts(item: ResultListItem) {
val testGroup = TestGroup.fromTests(item.descriptor.netTests.map { it.test })
val summaryType = item.descriptor.summaryType
val counts = item.measurementCounts

Column {
Expand All @@ -170,60 +165,22 @@ private fun ResultCounts(item: ResultListItem) {
)
}

when (testGroup) {
TestGroup.Websites -> {
when (summaryType) {
SummaryType.Simple -> {
ResultCountItem(
icon = Res.drawable.ic_measurement_anomaly,
text = pluralStringResourceItem(
Res.plurals.TestResults_Overview_Websites_Blocked,
counts.anomaly.toInt(),
counts.anomaly,
),
color = if (counts.anomaly > 0) {
LocalCustomColors.current.logWarn
} else {
LocalContentColor.current
},
)
ResultCountItem(
icon = Res.drawable.ic_world,
text = pluralStringResourceItem(
Res.plurals.TestResults_Overview_Websites_Tested,
counts.tested.toInt(),
counts.tested,
),
)
}

TestGroup.InstantMessaging -> {
ResultCountItem(
icon = Res.drawable.ic_measurement_anomaly,
text = pluralStringResourceItem(
Res.plurals.TestResults_Overview_InstantMessaging_Blocked,
counts.anomaly.toInt(),
counts.anomaly,
),
color = if (counts.anomaly > 0) {
LocalCustomColors.current.logWarn
} else {
LocalContentColor.current
},
)
ResultCountItem(
icon = Res.drawable.ic_measurement_ok,
icon = Res.drawable.ic_history,
text = pluralStringResourceItem(
Res.plurals.TestResults_Overview_InstantMessaging_Available,
counts.success.toInt(),
counts.success,
Res.plurals.Measurements_Count,
counts.done.toInt(),
counts.done,
),
)
}

TestGroup.Circumvention -> {
SummaryType.Anomaly -> {
ResultCountItem(
icon = Res.drawable.ic_measurement_anomaly,
text = pluralStringResourceItem(
Res.plurals.TestResults_Overview_Circumvention_Blocked,
Res.plurals.TestResults_Overview_Websites_Blocked,
counts.anomaly.toInt(),
counts.anomaly,
),
Expand All @@ -234,16 +191,15 @@ private fun ResultCounts(item: ResultListItem) {
},
)
ResultCountItem(
icon = Res.drawable.ic_measurement_ok,
icon = Res.drawable.ic_world,
text = pluralStringResourceItem(
Res.plurals.TestResults_Overview_Circumvention_Available,
counts.success.toInt(),
counts.success,
Res.plurals.TestResults_Overview_Websites_Tested,
counts.tested.toInt(),
counts.tested,
),
)
}

TestGroup.Performance -> {
SummaryType.Performance -> {
PerformanceMetric(
icon = Res.drawable.ic_download,
text = item.download,
Expand All @@ -261,19 +217,6 @@ private fun ResultCounts(item: ResultListItem) {
},
)
}

TestGroup.Experimental,
TestGroup.Unknown,
-> {
ResultCountItem(
icon = Res.drawable.ic_history,
text = pluralStringResourceItem(
Res.plurals.Measurements_Count,
counts.done.toInt(),
counts.done,
),
)
}
}
}
}
Expand Down

This file was deleted.

Loading