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

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 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.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding 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.foundation.lazy.items
import androidx.compose.material3.AlertDialog import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button import androidx.compose.material3.Button
import androidx.compose.material3.Checkbox
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.LinearProgressIndicator import androidx.compose.material3.LinearProgressIndicator
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
@@ -23,6 +26,7 @@ import androidx.compose.runtime.mutableFloatStateOf
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
@@ -45,6 +49,7 @@ fun TaskPipelineScreen(
val runningTaskIds = pipeline.runningTaskIds val runningTaskIds = pipeline.runningTaskIds
var showTestDialog by remember { mutableStateOf(false) } var showTestDialog by remember { mutableStateOf(false) }
var testDurationSec by remember { mutableFloatStateOf(10f) } var testDurationSec by remember { mutableFloatStateOf(10f) }
var testInfinity by remember { mutableStateOf(false) }
Scaffold( Scaffold(
modifier = modifier, modifier = modifier,
@@ -128,12 +133,30 @@ fun TaskPipelineScreen(
onValueChange = { testDurationSec = it }, onValueChange = { testDurationSec = it },
valueRange = 0f..60f, 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 = { confirmButton = {
Button( Button(
onClick = { onClick = {
viewModel.startTestTask(testDurationSec.toInt()) viewModel.startTestTask(
testDurationSec.toInt(),
testInfinity,
)
showTestDialog = false showTestDialog = false
}, },
) { ) {

View File

@@ -14,10 +14,13 @@ class TaskPipelineViewModel @Inject constructor(
val orchestrator: ITaskOrchestrator, val orchestrator: ITaskOrchestrator,
) : ViewModel() { ) : ViewModel() {
fun startTestTask(durationSec: Int) { fun startTestTask(durationSec: Int, infinityIndeterminateProgress: Boolean) {
val safeDurationSec = durationSec.coerceIn(0, 60) val safeDurationSec = durationSec.coerceIn(0, 60)
val title =
if (infinityIndeterminateProgress) "Test task (${safeDurationSec}s, ∞)"
else "Test task (${safeDurationSec}s)"
orchestrator.enqueue( orchestrator.enqueue(
title = "Test task (${safeDurationSec}s)", title = title,
dispatcher = Dispatchers.Default, dispatcher = Dispatchers.Default,
work = { ctx -> work = { ctx ->
val steps = if (safeDurationSec == 0) 1 else safeDurationSec * 10 val steps = if (safeDurationSec == 0) 1 else safeDurationSec * 10
@@ -26,7 +29,7 @@ class TaskPipelineViewModel @Inject constructor(
val fraction = step.toFloat() / steps.toFloat() val fraction = step.toFloat() / steps.toFloat()
val elapsedMs = (fraction * safeDurationSec * 1000).toInt() val elapsedMs = (fraction * safeDurationSec * 1000).toInt()
ctx.reportProgress( ctx.reportProgress(
fraction = fraction, fraction = if (infinityIndeterminateProgress) null else fraction,
label = "Elapsed: ${elapsedMs / 1000}s / ${safeDurationSec}s", label = "Elapsed: ${elapsedMs / 1000}s / ${safeDurationSec}s",
) )
if (step < steps) delay(100) 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_duration">Duration: %1$d s</string>
<string name="task_pipeline_test_dialog_start">Start</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_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_queued">Queued</string>
<string name="task_state_running">Running</string> <string name="task_state_running">Running</string>
<string name="task_state_completed">Completed</string> <string name="task_state_completed">Completed</string>