Skip to content

Commit 25ec29c

Browse files
authored
Merge pull request #72 from ooni/mark-result-as-viewed
Mark result as viewed
2 parents 7aedcad + 45fb290 commit 25ec29c

File tree

6 files changed

+43
-8
lines changed

6 files changed

+43
-8
lines changed

composeApp/src/commonMain/kotlin/org/ooni/probe/data/repositories/ResultRepository.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,11 @@ class ResultRepository(
6666
}
6767
}
6868

69+
suspend fun markAsViewed(resultId: ResultModel.Id) =
70+
withContext(backgroundDispatcher) {
71+
database.resultQueries.markAsViewed(resultId.value)
72+
}
73+
6974
private fun Result.toModel(): ResultModel? {
7075
return ResultModel(
7176
id = ResultModel.Id(id),

composeApp/src/commonMain/kotlin/org/ooni/probe/di/Dependencies.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,13 @@ class Dependencies(
203203
resultId: ResultModel.Id,
204204
onBack: () -> Unit,
205205
goToMeasurement: (MeasurementModel.ReportId, String?) -> Unit,
206-
) = ResultViewModel(resultId, onBack, goToMeasurement, getResult::invoke)
206+
) = ResultViewModel(
207+
resultId = resultId,
208+
onBack = onBack,
209+
goToMeasurement = goToMeasurement,
210+
getResult = getResult::invoke,
211+
markResultAsViewed = resultRepository::markAsViewed,
212+
)
207213

208214
companion object {
209215
@VisibleForTesting

composeApp/src/commonMain/kotlin/org/ooni/probe/ui/result/ResultViewModel.kt

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,11 @@ import kotlinx.coroutines.flow.MutableSharedFlow
77
import kotlinx.coroutines.flow.MutableStateFlow
88
import kotlinx.coroutines.flow.asStateFlow
99
import kotlinx.coroutines.flow.filterIsInstance
10+
import kotlinx.coroutines.flow.filterNotNull
1011
import kotlinx.coroutines.flow.launchIn
12+
import kotlinx.coroutines.flow.map
1113
import kotlinx.coroutines.flow.onEach
14+
import kotlinx.coroutines.flow.take
1215
import kotlinx.coroutines.flow.update
1316
import org.ooni.probe.data.models.MeasurementModel
1417
import org.ooni.probe.data.models.ResultItem
@@ -19,6 +22,7 @@ class ResultViewModel(
1922
onBack: () -> Unit,
2023
goToMeasurement: (MeasurementModel.ReportId, String?) -> Unit,
2124
getResult: (ResultModel.Id) -> Flow<ResultItem?>,
25+
markResultAsViewed: suspend (ResultModel.Id) -> Unit,
2226
) : ViewModel() {
2327
private val events = MutableSharedFlow<Event>(extraBufferCapacity = 1)
2428

@@ -27,7 +31,23 @@ class ResultViewModel(
2731

2832
init {
2933
getResult(resultId)
30-
.onEach { result -> _state.update { it.copy(result = result) } }
34+
.onEach { result ->
35+
_state.update { it.copy(result = result) }
36+
if (result?.result?.isViewed == false) {
37+
markResultAsViewed(resultId)
38+
}
39+
}
40+
.launchIn(viewModelScope)
41+
42+
_state
43+
.map { it.result }
44+
.filterNotNull()
45+
.take(1)
46+
.onEach {
47+
if (!it.result.isViewed) {
48+
markResultAsViewed(resultId)
49+
}
50+
}
3151
.launchIn(viewModelScope)
3252

3353
events

composeApp/src/commonMain/kotlin/org/ooni/probe/ui/results/ResultsScreen.kt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -89,12 +89,11 @@ private fun ResultItem(
8989
onResultClick: () -> Unit,
9090
) {
9191
Surface(
92-
color =
93-
if (item.result.isViewed) {
94-
MaterialTheme.colorScheme.surface
95-
} else {
96-
MaterialTheme.colorScheme.surfaceVariant
97-
},
92+
color = if (item.result.isViewed) {
93+
MaterialTheme.colorScheme.surface
94+
} else {
95+
MaterialTheme.colorScheme.surfaceVariant
96+
},
9897
modifier = Modifier.padding(top = 1.dp),
9998
) {
10099
Row(

composeApp/src/commonMain/sqldelight/org/ooni/probe/data/Result.sq

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,6 @@ FROM Result
5151
LEFT JOIN Network ON Result.network_id = Network.id
5252
WHERE Result.id = ?
5353
LIMIT 1;
54+
55+
markAsViewed:
56+
UPDATE Result SET is_viewed = 1 WHERE id = ?;

composeApp/src/commonTest/kotlin/org/ooni/probe/ui/result/ResultViewModelTest.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,12 @@ class ResultViewModelTest {
4242
onBack: () -> Unit = {},
4343
goToMeasurement: (MeasurementModel.ReportId, String?) -> Unit = { _, _ -> },
4444
getResult: (ResultModel.Id) -> Flow<ResultItem?> = { flowOf(null) },
45+
markResultAsViewed: (ResultModel.Id) -> Unit = {},
4546
) = ResultViewModel(
4647
resultId = resultId,
4748
onBack = onBack,
4849
goToMeasurement = goToMeasurement,
4950
getResult = getResult,
51+
markResultAsViewed = markResultAsViewed,
5052
)
5153
}

0 commit comments

Comments
 (0)