summaryrefslogtreecommitdiffstats
path: root/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/TaskViewModel.kt
diff options
context:
space:
mode:
Diffstat (limited to 'src/android/app/src/main/java/org/yuzu/yuzu_emu/model/TaskViewModel.kt')
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/model/TaskViewModel.kt29
1 files changed, 27 insertions, 2 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/TaskViewModel.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/TaskViewModel.kt
index e59c95733..4361eb972 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/TaskViewModel.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/TaskViewModel.kt
@@ -8,6 +8,7 @@ import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
class TaskViewModel : ViewModel() {
@@ -23,13 +24,28 @@ class TaskViewModel : ViewModel() {
val cancelled: StateFlow<Boolean> get() = _cancelled
private val _cancelled = MutableStateFlow(false)
- lateinit var task: suspend () -> Any
+ private val _progress = MutableStateFlow(0.0)
+ val progress = _progress.asStateFlow()
+
+ private val _maxProgress = MutableStateFlow(0.0)
+ val maxProgress = _maxProgress.asStateFlow()
+
+ private val _message = MutableStateFlow("")
+ val message = _message.asStateFlow()
+
+ lateinit var task: suspend (
+ progressCallback: (max: Long, progress: Long) -> Boolean,
+ messageCallback: (message: String) -> Unit
+ ) -> Any
fun clear() {
_result.value = Any()
_isComplete.value = false
_isRunning.value = false
_cancelled.value = false
+ _progress.value = 0.0
+ _maxProgress.value = 0.0
+ _message.value = ""
}
fun setCancelled(value: Boolean) {
@@ -43,7 +59,16 @@ class TaskViewModel : ViewModel() {
_isRunning.value = true
viewModelScope.launch(Dispatchers.IO) {
- val res = task()
+ val res = task(
+ { max, progress ->
+ _maxProgress.value = max.toDouble()
+ _progress.value = progress.toDouble()
+ return@task cancelled.value
+ },
+ { message ->
+ _message.value = message
+ }
+ )
_result.value = res
_isComplete.value = true
_isRunning.value = false