diff --git a/app/src/main/java/com/xayah/databackup/ui/activity/processing/ProcessingViewModel.kt b/app/src/main/java/com/xayah/databackup/ui/activity/processing/ProcessingViewModel.kt index 06f3358f76..99a73ff51d 100644 --- a/app/src/main/java/com/xayah/databackup/ui/activity/processing/ProcessingViewModel.kt +++ b/app/src/main/java/com/xayah/databackup/ui/activity/processing/ProcessingViewModel.kt @@ -2,7 +2,6 @@ package com.xayah.databackup.ui.activity.processing import androidx.compose.animation.core.MutableTransitionState import androidx.compose.foundation.lazy.LazyListState -import androidx.compose.runtime.snapshots.SnapshotStateList import androidx.lifecycle.ViewModel import com.xayah.databackup.data.LoadingState import com.xayah.databackup.data.ProcessingTaskFilter @@ -13,6 +12,7 @@ import com.xayah.databackup.ui.activity.processing.components.ProcessingTask import com.xayah.databackup.util.GlobalString import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow class ProcessingViewModel : ViewModel() { var listType = TypeBackupApp @@ -27,33 +27,47 @@ class ProcessingViewModel : ViewModel() { val progress = MutableStateFlow(0) // 备份对象列表 - val objectList = MutableStateFlow(SnapshotStateList()) + private val _objectList = MutableStateFlow(listOf()) + val objectList = _objectList.asStateFlow() + + fun emitObjectList(list: List) { + _objectList.value = list + } // 任务列表 - val taskList = MutableStateFlow(SnapshotStateList()) + private val _taskList = MutableStateFlow(listOf()) + val taskList = _taskList.asStateFlow() + + fun emitTaskList(list: List) { + _taskList.value = list + } + val allDone by lazy { MutableTransitionState(false) } val isFirst = MutableStateFlow(true) val isCancel = MutableStateFlow(false) fun refreshTaskList() { - objectList.value.clear() + emitObjectList(listOf()) + val taskList = taskList.value.toMutableList() when (filter.value) { ProcessingTaskFilter.None -> { - for (i in taskList.value) { + for (i in taskList) { i.visible.value = true } } + ProcessingTaskFilter.Succeed -> { - for (i in taskList.value) { + for (i in taskList) { i.visible.value = i.taskState.value == TaskState.Success } } ProcessingTaskFilter.Failed -> { - for (i in taskList.value) { + for (i in taskList) { i.visible.value = i.taskState.value != TaskState.Success } } } + emitTaskList(taskList) } // 过滤 diff --git a/app/src/main/java/com/xayah/databackup/ui/activity/processing/action/BackupApp.kt b/app/src/main/java/com/xayah/databackup/ui/activity/processing/action/BackupApp.kt index 473cac65d5..a1747fd802 100644 --- a/app/src/main/java/com/xayah/databackup/ui/activity/processing/action/BackupApp.kt +++ b/app/src/main/java/com/xayah/databackup/ui/activity/processing/action/BackupApp.kt @@ -4,15 +4,33 @@ import android.content.Context import androidx.compose.runtime.mutableStateOf import com.xayah.databackup.App import com.xayah.databackup.R -import com.xayah.databackup.data.* +import com.xayah.databackup.data.AppInfoDetailRestore +import com.xayah.databackup.data.AppInfoRestore +import com.xayah.databackup.data.BackupStrategy +import com.xayah.databackup.data.CompressionType +import com.xayah.databackup.data.DataType +import com.xayah.databackup.data.LoadingState +import com.xayah.databackup.data.TaskState import com.xayah.databackup.librootservice.RootService import com.xayah.databackup.ui.activity.processing.ProcessingViewModel import com.xayah.databackup.ui.activity.processing.components.ProcessObjectItem import com.xayah.databackup.ui.activity.processing.components.ProcessingTask import com.xayah.databackup.ui.activity.processing.components.onInfoUpdate -import com.xayah.databackup.util.* +import com.xayah.databackup.util.GlobalObject +import com.xayah.databackup.util.GlobalString +import com.xayah.databackup.util.GsonUtil +import com.xayah.databackup.util.Logcat +import com.xayah.databackup.util.Path import com.xayah.databackup.util.command.Command import com.xayah.databackup.util.command.Preparation +import com.xayah.databackup.util.readBackupSavePath +import com.xayah.databackup.util.readBackupStrategy +import com.xayah.databackup.util.readBackupUser +import com.xayah.databackup.util.readCompatibleMode +import com.xayah.databackup.util.readCompressionType +import com.xayah.databackup.util.readIsBackupIcon +import com.xayah.databackup.util.readIsBackupItself +import com.xayah.databackup.util.readIsResetBackupList import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -27,13 +45,11 @@ fun onBackupAppProcessing(viewModel: ProcessingViewModel, context: Context, glob val loadingState = viewModel.loadingState val progress = viewModel.progress val topBarTitle = viewModel.topBarTitle - val taskList = viewModel.taskList.value - val objectList = viewModel.objectList.value.apply { - clear() - addAll(listOf(DataType.APK, DataType.USER, DataType.USER_DE, DataType.DATA, DataType.OBB, DataType.APP_MEDIA).map { - ProcessObjectItem(type = it) - }) + val taskList = viewModel.taskList.value.toMutableList() + val objectList = listOf(DataType.APK, DataType.USER, DataType.USER_DE, DataType.DATA, DataType.OBB, DataType.APP_MEDIA).map { + ProcessObjectItem(type = it) } + viewModel.emitObjectList(objectList) val allDone = viewModel.allDone // Check global map @@ -59,6 +75,7 @@ fun onBackupAppProcessing(viewModel: ProcessingViewModel, context: Context, glob objectList = listOf() ) }) + viewModel.emitTaskList(taskList) } else { Logcat.getInstance().actionLogAddLine(tag, "Retrying.") } @@ -108,9 +125,11 @@ fun onBackupAppProcessing(viewModel: ProcessingViewModel, context: Context, glob subtitle.value = GlobalString.pleaseWait } } + viewModel.emitObjectList(objectList) // Enter processing state i.taskState.value = TaskState.Processing + viewModel.emitTaskList(taskList) val appInfoBackup = globalObject.appInfoBackupMap.value[i.packageName]!! // Scroll to processing task @@ -163,6 +182,7 @@ fun onBackupAppProcessing(viewModel: ProcessingViewModel, context: Context, glob objectList[5].visible.value = true } } + viewModel.emitObjectList(objectList) // Kill the app Preparation.killPackage(packageName) @@ -170,11 +190,13 @@ fun onBackupAppProcessing(viewModel: ProcessingViewModel, context: Context, glob if (viewModel.isCancel.value) break if (j.visible.value) { j.state.value = TaskState.Processing + viewModel.emitObjectList(objectList) when (j.type) { DataType.APK -> { Command.compressAPK(compressionType, packageName, outPutPath, userId, appInfoBackup.detailBackup.appSize, compatibleMode) { type, line -> onInfoUpdate(type, line ?: "", j) + viewModel.emitObjectList(objectList) }.apply { if (!this) { isSuccess = false @@ -193,6 +215,7 @@ fun onBackupAppProcessing(viewModel: ProcessingViewModel, context: Context, glob Command.compress(compressionType, DataType.USER, packageName, outPutPath, Path.getUserPath(), appInfoBackup.detailBackup.userSize, compatibleMode) { type, line -> onInfoUpdate(type, line ?: "", j) + viewModel.emitObjectList(objectList) }.apply { if (!this) { isSuccess = false @@ -206,6 +229,7 @@ fun onBackupAppProcessing(viewModel: ProcessingViewModel, context: Context, glob Command.compress(compressionType, DataType.USER_DE, packageName, outPutPath, Path.getUserDePath(), appInfoBackup.detailBackup.userDeSize, compatibleMode) { type, line -> onInfoUpdate(type, line ?: "", j) + viewModel.emitObjectList(objectList) }.apply { if (!this) { isSuccess = false @@ -219,6 +243,7 @@ fun onBackupAppProcessing(viewModel: ProcessingViewModel, context: Context, glob Command.compress(compressionType, DataType.DATA, packageName, outPutPath, Path.getDataPath(), appInfoBackup.detailBackup.dataSize, compatibleMode) { type, line -> onInfoUpdate(type, line ?: "", j) + viewModel.emitObjectList(objectList) }.apply { if (!this) { isSuccess = false @@ -232,6 +257,7 @@ fun onBackupAppProcessing(viewModel: ProcessingViewModel, context: Context, glob Command.compress(compressionType, DataType.OBB, packageName, outPutPath, Path.getObbPath(), appInfoBackup.detailBackup.obbSize, compatibleMode) { type, line -> onInfoUpdate(type, line ?: "", j) + viewModel.emitObjectList(objectList) }.apply { if (!this) { isSuccess = false @@ -245,6 +271,7 @@ fun onBackupAppProcessing(viewModel: ProcessingViewModel, context: Context, glob Command.compress(compressionType, DataType.APP_MEDIA, packageName, outPutPath, Path.getAPPMediaPath(), appInfoBackup.detailBackup.mediaSize, compatibleMode) { type, line -> onInfoUpdate(type, line ?: "", j) + viewModel.emitObjectList(objectList) }.apply { if (!this) { isSuccess = false @@ -324,6 +351,7 @@ fun onBackupAppProcessing(viewModel: ProcessingViewModel, context: Context, glob } this.objectList = list.toList() } + viewModel.emitTaskList(taskList) progress.value += 1 topBarTitle.value = "${context.getString(R.string.backing_up)}(${progress.value}/${taskList.size})" diff --git a/app/src/main/java/com/xayah/databackup/ui/activity/processing/action/BackupMedia.kt b/app/src/main/java/com/xayah/databackup/ui/activity/processing/action/BackupMedia.kt index bb4773b43b..aa1591ca3b 100644 --- a/app/src/main/java/com/xayah/databackup/ui/activity/processing/action/BackupMedia.kt +++ b/app/src/main/java/com/xayah/databackup/ui/activity/processing/action/BackupMedia.kt @@ -4,14 +4,27 @@ import android.content.Context import androidx.compose.runtime.mutableStateOf import com.xayah.databackup.App import com.xayah.databackup.R -import com.xayah.databackup.data.* +import com.xayah.databackup.data.BackupStrategy +import com.xayah.databackup.data.CompressionType +import com.xayah.databackup.data.DataType +import com.xayah.databackup.data.LoadingState +import com.xayah.databackup.data.MediaInfoDetailBase +import com.xayah.databackup.data.MediaInfoRestore +import com.xayah.databackup.data.TaskState import com.xayah.databackup.librootservice.RootService import com.xayah.databackup.ui.activity.processing.ProcessingViewModel import com.xayah.databackup.ui.activity.processing.components.ProcessObjectItem import com.xayah.databackup.ui.activity.processing.components.ProcessingTask import com.xayah.databackup.ui.activity.processing.components.onInfoUpdate -import com.xayah.databackup.util.* +import com.xayah.databackup.util.GlobalObject +import com.xayah.databackup.util.GlobalString +import com.xayah.databackup.util.GsonUtil +import com.xayah.databackup.util.Logcat +import com.xayah.databackup.util.Path import com.xayah.databackup.util.command.Command +import com.xayah.databackup.util.readBackupStrategy +import com.xayah.databackup.util.readCompatibleMode +import com.xayah.databackup.util.readIsResetBackupList import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -26,11 +39,9 @@ fun onBackupMediaProcessing(viewModel: ProcessingViewModel, context: Context, gl val loadingState = viewModel.loadingState val progress = viewModel.progress val topBarTitle = viewModel.topBarTitle - val taskList = viewModel.taskList.value - val objectList = viewModel.objectList.value.apply { - clear() - add(ProcessObjectItem(type = DataType.DATA)) - } + val taskList = viewModel.taskList.value.toMutableList() + val objectList = listOf(ProcessObjectItem(type = DataType.DATA)) + viewModel.emitObjectList(objectList) val allDone = viewModel.allDone // Check global map @@ -57,6 +68,7 @@ fun onBackupMediaProcessing(viewModel: ProcessingViewModel, context: Context, gl objectList = listOf() ) }) + viewModel.emitTaskList(taskList) } else { Logcat.getInstance().actionLogAddLine(tag, "Retrying.") } @@ -83,9 +95,11 @@ fun onBackupMediaProcessing(viewModel: ProcessingViewModel, context: Context, gl visible.value = false subtitle.value = GlobalString.pleaseWait } + viewModel.emitObjectList(objectList) // Enter processing state i.taskState.value = TaskState.Processing + viewModel.emitTaskList(taskList) val mediaInfoBackup = globalObject.mediaInfoBackupMap.value[i.appName]!! // Scroll to processing task @@ -105,16 +119,19 @@ fun onBackupMediaProcessing(viewModel: ProcessingViewModel, context: Context, gl if (i.selectData) { objectList[0].visible.value = true + viewModel.emitObjectList(objectList) } for (j in objectList) { if (viewModel.isCancel.value) break if (j.visible.value) { j.state.value = TaskState.Processing + viewModel.emitObjectList(objectList) when (j.type) { DataType.DATA -> { Command.compress(CompressionType.TAR, DataType.MEDIA, i.appName, outPutPath, i.packageName, mediaInfoBackup.backupDetail.size, compatibleMode) { type, line -> onInfoUpdate(type, line ?: "", j) + viewModel.emitObjectList(objectList) }.apply { if (!this) { isSuccess = false diff --git a/app/src/main/java/com/xayah/databackup/ui/activity/processing/action/RestoreApp.kt b/app/src/main/java/com/xayah/databackup/ui/activity/processing/action/RestoreApp.kt index a2fc3fdf94..26ed1d361e 100644 --- a/app/src/main/java/com/xayah/databackup/ui/activity/processing/action/RestoreApp.kt +++ b/app/src/main/java/com/xayah/databackup/ui/activity/processing/action/RestoreApp.kt @@ -29,13 +29,11 @@ fun onRestoreAppProcessing(viewModel: ProcessingViewModel, context: Context, glo val loadingState = viewModel.loadingState val progress = viewModel.progress val topBarTitle = viewModel.topBarTitle - val taskList = viewModel.taskList.value - val objectList = viewModel.objectList.value.apply { - clear() - addAll(listOf(DataType.APK, DataType.USER, DataType.USER_DE, DataType.DATA, DataType.OBB, DataType.APP_MEDIA).map { - ProcessObjectItem(type = it) - }) + val taskList = viewModel.taskList.value.toMutableList() + val objectList = listOf(DataType.APK, DataType.USER, DataType.USER_DE, DataType.DATA, DataType.OBB, DataType.APP_MEDIA).map { + ProcessObjectItem(type = it) } + viewModel.emitObjectList(objectList) val allDone = viewModel.allDone // Check global map @@ -69,6 +67,7 @@ fun onRestoreAppProcessing(viewModel: ProcessingViewModel, context: Context, glo } } }) + viewModel.emitTaskList(taskList) } else { Logcat.getInstance().actionLogAddLine(tag, "Retrying.") } @@ -98,9 +97,11 @@ fun onRestoreAppProcessing(viewModel: ProcessingViewModel, context: Context, glo subtitle.value = GlobalString.pleaseWait } } + viewModel.emitObjectList(objectList) // Enter processing state i.taskState.value = TaskState.Processing + viewModel.emitTaskList(taskList) val appInfoRestore = globalObject.appInfoRestoreMap.value[i.packageName]!! // Scroll to processing task @@ -154,15 +155,18 @@ fun onRestoreAppProcessing(viewModel: ProcessingViewModel, context: Context, glo objectList[5].visible.value = true } } + viewModel.emitObjectList(objectList) for ((jIndex, j) in objectList.withIndex()) { if (viewModel.isCancel.value) break if (j.visible.value) { j.state.value = TaskState.Processing + viewModel.emitObjectList(objectList) when (j.type) { DataType.APK -> { isSuccess = Command.installAPK(compressionType, apkPath, packageName, userId, appInfoRestore.versionCode.toString()) { type, line -> onInfoUpdate(type, line ?: "", j) + viewModel.emitObjectList(objectList) } // If the app isn't installed, the restoring can't move on @@ -179,12 +183,14 @@ fun onRestoreAppProcessing(viewModel: ProcessingViewModel, context: Context, glo Command.decompress(compressionType, DataType.USER, userPath, packageName, Path.getUserPath(userId)) { type, line -> onInfoUpdate(type, line ?: "", j) + viewModel.emitObjectList(objectList) }.apply { if (!this) isSuccess = false } Command.setOwnerAndSELinux(DataType.USER, packageName, "${Path.getUserPath(userId)}/${packageName}", userId, contextSELinux) { type, line -> onInfoUpdate(type, line ?: "", j) + viewModel.emitObjectList(objectList) }.apply { if (!this) isSuccess = false } @@ -195,12 +201,14 @@ fun onRestoreAppProcessing(viewModel: ProcessingViewModel, context: Context, glo Command.decompress(compressionType, DataType.USER_DE, userDePath, packageName, Path.getUserDePath(userId)) { type, line -> onInfoUpdate(type, line ?: "", j) + viewModel.emitObjectList(objectList) }.apply { if (!this) isSuccess = false } Command.setOwnerAndSELinux(DataType.USER_DE, packageName, "${Path.getUserDePath(userId)}/${packageName}", userId, contextSELinux) { type, line -> onInfoUpdate(type, line ?: "", j) + viewModel.emitObjectList(objectList) }.apply { if (!this) isSuccess = false } @@ -211,12 +219,14 @@ fun onRestoreAppProcessing(viewModel: ProcessingViewModel, context: Context, glo Command.decompress(compressionType, DataType.DATA, dataPath, packageName, Path.getDataPath(userId)) { type, line -> onInfoUpdate(type, line ?: "", j) + viewModel.emitObjectList(objectList) }.apply { if (!this) isSuccess = false } Command.setOwnerAndSELinux(DataType.DATA, packageName, "${Path.getDataPath(userId)}/${packageName}", userId, contextSELinux) { type, line -> onInfoUpdate(type, line ?: "", j) + viewModel.emitObjectList(objectList) }.apply { if (!this) isSuccess = false } @@ -227,12 +237,14 @@ fun onRestoreAppProcessing(viewModel: ProcessingViewModel, context: Context, glo Command.decompress(compressionType, DataType.OBB, obbPath, packageName, Path.getObbPath(userId)) { type, line -> onInfoUpdate(type, line ?: "", j) + viewModel.emitObjectList(objectList) }.apply { if (!this) isSuccess = false } Command.setOwnerAndSELinux(DataType.OBB, packageName, "${Path.getObbPath(userId)}/${packageName}", userId, contextSELinux) { type, line -> onInfoUpdate(type, line ?: "", j) + viewModel.emitObjectList(objectList) }.apply { if (!this) isSuccess = false } @@ -243,12 +255,14 @@ fun onRestoreAppProcessing(viewModel: ProcessingViewModel, context: Context, glo Command.decompress(compressionType, DataType.APP_MEDIA, appMediaPath, packageName, Path.getAPPMediaPath(userId)) { type, line -> onInfoUpdate(type, line ?: "", j) + viewModel.emitObjectList(objectList) }.apply { if (!this) isSuccess = false } Command.setOwnerAndSELinux(DataType.APP_MEDIA, packageName, "${Path.getAPPMediaPath(userId)}/${packageName}", userId, contextSELinux) { type, line -> onInfoUpdate(type, line ?: "", j) + viewModel.emitObjectList(objectList) }.apply { if (!this) isSuccess = false } @@ -283,6 +297,7 @@ fun onRestoreAppProcessing(viewModel: ProcessingViewModel, context: Context, glo } this.objectList = list.toList() } + viewModel.emitTaskList(taskList) progress.value += 1 topBarTitle.value = "${context.getString(R.string.restoring)}(${progress.value}/${taskList.size})" diff --git a/app/src/main/java/com/xayah/databackup/ui/activity/processing/action/RestoreMedia.kt b/app/src/main/java/com/xayah/databackup/ui/activity/processing/action/RestoreMedia.kt index ee311b0e00..f69009608f 100644 --- a/app/src/main/java/com/xayah/databackup/ui/activity/processing/action/RestoreMedia.kt +++ b/app/src/main/java/com/xayah/databackup/ui/activity/processing/action/RestoreMedia.kt @@ -27,11 +27,9 @@ fun onRestoreMediaProcessing(viewModel: ProcessingViewModel, context: Context, g val loadingState = viewModel.loadingState val progress = viewModel.progress val topBarTitle = viewModel.topBarTitle - val taskList = viewModel.taskList.value - val objectList = viewModel.objectList.value.apply { - clear() - add(ProcessObjectItem(type = DataType.DATA)) - } + val taskList = viewModel.taskList.value.toMutableList() + val objectList = listOf(ProcessObjectItem(type = DataType.DATA)) + viewModel.emitObjectList(objectList) val allDone = viewModel.allDone // Check global map @@ -55,6 +53,7 @@ fun onRestoreMediaProcessing(viewModel: ProcessingViewModel, context: Context, g objectList = listOf() ) }) + viewModel.emitTaskList(taskList) } else { Logcat.getInstance().actionLogAddLine(tag, "Retrying.") } @@ -75,6 +74,7 @@ fun onRestoreMediaProcessing(viewModel: ProcessingViewModel, context: Context, g visible.value = false subtitle.value = GlobalString.pleaseWait } + viewModel.emitObjectList(objectList) // Enter processing state i.taskState.value = TaskState.Processing @@ -97,17 +97,20 @@ fun onRestoreMediaProcessing(viewModel: ProcessingViewModel, context: Context, g if (i.selectData) { objectList[0].visible.value = true + viewModel.emitObjectList(objectList) } for (j in objectList) { if (viewModel.isCancel.value) break if (j.visible.value) { j.state.value = TaskState.Processing + viewModel.emitObjectList(objectList) when (j.type) { DataType.DATA -> { val inputPath = "${inPath}/${i.appName}.tar" Command.decompress(CompressionType.TAR, DataType.MEDIA, inputPath, i.appName, i.packageName.replace("/${i.appName}", "")) { type, line -> onInfoUpdate(type, line ?: "", j) + viewModel.emitObjectList(objectList) }.apply { if (!this) isSuccess = false } @@ -143,6 +146,7 @@ fun onRestoreMediaProcessing(viewModel: ProcessingViewModel, context: Context, g } this.objectList = list.toList() } + viewModel.emitTaskList(taskList) progress.value += 1 topBarTitle.value = "${context.getString(R.string.restoring)}(${progress.value}/${taskList.size})" diff --git a/app/src/main/java/com/xayah/databackup/ui/activity/processing/components/Scaffold.kt b/app/src/main/java/com/xayah/databackup/ui/activity/processing/components/Scaffold.kt index a11e240eb2..aae8bf4522 100644 --- a/app/src/main/java/com/xayah/databackup/ui/activity/processing/components/Scaffold.kt +++ b/app/src/main/java/com/xayah/databackup/ui/activity/processing/components/Scaffold.kt @@ -9,7 +9,11 @@ import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.Done -import androidx.compose.material3.* +import androidx.compose.material3.Card +import androidx.compose.material3.CenterAlignedTopAppBar +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue @@ -18,7 +22,17 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.dimensionResource import com.google.accompanist.drawablepainter.rememberDrawablePainter import com.xayah.databackup.R -import com.xayah.databackup.data.* +import com.xayah.databackup.data.LoadingState +import com.xayah.databackup.data.ProcessCompressing +import com.xayah.databackup.data.ProcessDecompressing +import com.xayah.databackup.data.ProcessError +import com.xayah.databackup.data.ProcessFinished +import com.xayah.databackup.data.ProcessInstallingApk +import com.xayah.databackup.data.ProcessSettingSELinux +import com.xayah.databackup.data.ProcessShowTotal +import com.xayah.databackup.data.ProcessSkip +import com.xayah.databackup.data.ProcessTesting +import com.xayah.databackup.data.TaskState import com.xayah.databackup.ui.activity.processing.ProcessingViewModel import com.xayah.databackup.ui.components.LoadingView import com.xayah.databackup.ui.components.Scaffold @@ -179,8 +193,7 @@ fun ProcessingScaffold( taskState = taskList[it].taskState.value, clickable = allDone.currentState, onClick = { - objectList.clear() - objectList.addAll(taskList[it].objectList) + viewModel.emitObjectList(taskList[it].objectList) } ) }