Возможность запуска бесконечной задачи

This commit is contained in:
2026-04-21 02:29:27 +03:00
parent 75162e2d64
commit be07ccf0aa
3 changed files with 31 additions and 4 deletions

View File

@@ -1,7 +1,9 @@
package com.github.nullptroma.wallenc.presentation.screens.main.screens.tasks
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
@@ -10,6 +12,7 @@ import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.Checkbox
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.LinearProgressIndicator
import androidx.compose.material3.MaterialTheme
@@ -23,6 +26,7 @@ import androidx.compose.runtime.mutableFloatStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
@@ -45,6 +49,7 @@ fun TaskPipelineScreen(
val runningTaskIds = pipeline.runningTaskIds
var showTestDialog by remember { mutableStateOf(false) }
var testDurationSec by remember { mutableFloatStateOf(10f) }
var testInfinity by remember { mutableStateOf(false) }
Scaffold(
modifier = modifier,
@@ -128,12 +133,30 @@ fun TaskPipelineScreen(
onValueChange = { testDurationSec = it },
valueRange = 0f..60f,
)
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.fillMaxWidth(),
) {
Checkbox(
checked = testInfinity,
onCheckedChange = { testInfinity = it },
)
Text(
stringResource(R.string.task_pipeline_test_dialog_infinity),
modifier = Modifier
.clickable { testInfinity = !testInfinity }
.weight(1f),
)
}
}
},
confirmButton = {
Button(
onClick = {
viewModel.startTestTask(testDurationSec.toInt())
viewModel.startTestTask(
testDurationSec.toInt(),
testInfinity,
)
showTestDialog = false
},
) {

View File

@@ -14,10 +14,13 @@ class TaskPipelineViewModel @Inject constructor(
val orchestrator: ITaskOrchestrator,
) : ViewModel() {
fun startTestTask(durationSec: Int) {
fun startTestTask(durationSec: Int, infinityIndeterminateProgress: Boolean) {
val safeDurationSec = durationSec.coerceIn(0, 60)
val title =
if (infinityIndeterminateProgress) "Test task (${safeDurationSec}s, ∞)"
else "Test task (${safeDurationSec}s)"
orchestrator.enqueue(
title = "Test task (${safeDurationSec}s)",
title = title,
dispatcher = Dispatchers.Default,
work = { ctx ->
val steps = if (safeDurationSec == 0) 1 else safeDurationSec * 10
@@ -26,7 +29,7 @@ class TaskPipelineViewModel @Inject constructor(
val fraction = step.toFloat() / steps.toFloat()
val elapsedMs = (fraction * safeDurationSec * 1000).toInt()
ctx.reportProgress(
fraction = fraction,
fraction = if (infinityIndeterminateProgress) null else fraction,
label = "Elapsed: ${elapsedMs / 1000}s / ${safeDurationSec}s",
)
if (step < steps) delay(100)

View File

@@ -25,6 +25,7 @@
<string name="task_pipeline_test_dialog_duration">Duration: %1$d s</string>
<string name="task_pipeline_test_dialog_start">Start</string>
<string name="task_pipeline_test_dialog_cancel">Cancel</string>
<string name="task_pipeline_test_dialog_infinity">Infinity (indeterminate progress)</string>
<string name="task_state_queued">Queued</string>
<string name="task_state_running">Running</string>
<string name="task_state_completed">Completed</string>