Progress label для всех задач

This commit is contained in:
2026-05-18 11:14:50 +03:00
parent c7a08342b2
commit a1226a8803
7 changed files with 42 additions and 7 deletions

View File

@@ -77,6 +77,7 @@ class RemoteVaultsViewModel @Inject constructor(
dispatcher = Dispatchers.IO,
work = { ctx ->
try {
ctx.reportProgress(null, uiStrings(R.string.task_progress_add_remote_vault))
ctx.log(TaskLogLevel.Info, "Adding vault…")
vaultRegistrar.register(registration)
ctx.log(TaskLogLevel.Info, "Vault added")
@@ -109,6 +110,7 @@ class RemoteVaultsViewModel @Inject constructor(
dispatcher = Dispatchers.IO,
work = { ctx ->
try {
ctx.reportProgress(null, uiStrings(R.string.task_progress_remove_remote_vault))
ctx.log(TaskLogLevel.Info, "Removing remote vault…")
vaultRegistrar.unregister(uuid)
ctx.log(TaskLogLevel.Info, "Remote vault removed")
@@ -131,6 +133,7 @@ class RemoteVaultsViewModel @Inject constructor(
dispatcher = Dispatchers.IO,
work = { ctx ->
try {
ctx.reportProgress(null, uiStrings(R.string.task_progress_retry_remote_vault))
ctx.log(TaskLogLevel.Info, "Retrying remote vault connection…")
vaultRegistrar.retry(vaultUuid)
ctx.log(TaskLogLevel.Info, "Retry requested")

View File

@@ -98,7 +98,8 @@ class TextSecretDetailsViewModel @Inject constructor(
title = uiStrings(R.string.task_title_delete_text_secret),
dispatcher = Dispatchers.IO,
busyStorageUuid = storage.uuid,
work = { _ ->
work = { ctx ->
ctx.reportProgress(null, uiStrings(R.string.task_progress_delete_text_secret))
manageTextSecretsUseCase.delete(storage, secretId)
},
)

View File

@@ -107,7 +107,8 @@ class TextSecretEditViewModel @Inject constructor(
title = uiStrings(R.string.task_title_save_text_secret),
dispatcher = Dispatchers.IO,
busyStorageUuid = storage.uuid,
work = { _ ->
work = { ctx ->
ctx.reportProgress(null, uiStrings(R.string.task_progress_save_text_secret))
if (existingId == null) {
manageTextSecretsUseCase.create(
storageInfo = storage,

View File

@@ -101,7 +101,8 @@ class TwoFaTokensViewModel @Inject constructor(
title = uiStrings(R.string.task_title_save_2fa_token),
dispatcher = Dispatchers.IO,
busyStorageUuid = storage.uuid,
work = { _ ->
work = { ctx ->
ctx.reportProgress(null, uiStrings(R.string.task_progress_save_2fa_token))
if (existingId == null) {
manageTwoFaTokensUseCase.create(
storageInfo = storage,
@@ -148,7 +149,8 @@ class TwoFaTokensViewModel @Inject constructor(
title = uiStrings(R.string.task_title_delete_2fa_token),
dispatcher = Dispatchers.IO,
busyStorageUuid = storage.uuid,
work = { _ ->
work = { ctx ->
ctx.reportProgress(null, uiStrings(R.string.task_progress_delete_2fa_token))
manageTwoFaTokensUseCase.delete(storage, id)
},
)

View File

@@ -183,16 +183,19 @@ private fun TaskRow(task: PipelineTask, isRunning: Boolean) {
style = if (isRunning) MaterialTheme.typography.titleSmall
else MaterialTheme.typography.bodyMedium,
)
val runningProgress = (task.state as? TaskRunState.Running)?.progress
val progressLabel = runningProgress?.label?.takeIf { it.isNotBlank() }
val stateLabel = when (val s = task.state) {
TaskRunState.Queued -> stringResource(R.string.task_state_queued)
is TaskRunState.Running -> stringResource(R.string.task_state_running)
is TaskRunState.Running ->
progressLabel ?: stringResource(R.string.task_state_running)
TaskRunState.Completed -> stringResource(R.string.task_state_completed)
TaskRunState.Cancelled -> stringResource(R.string.task_state_cancelled)
is TaskRunState.Failed -> stringResource(R.string.task_state_failed, s.message)
}
Text(stateLabel, style = MaterialTheme.typography.bodySmall)
if (task.state is TaskRunState.Running) {
val frac = (task.state as TaskRunState.Running).progress?.fraction
val frac = runningProgress?.fraction
if (frac != null) {
LinearProgressIndicator(
progress = { frac },

View File

@@ -160,6 +160,7 @@ abstract class AbstractVaultBrowserViewModel(
dispatcher = Dispatchers.IO,
busyStorageUuid = id,
work = { ctx ->
ctx.reportProgress(null, uiStrings(R.string.task_progress_dump_storage_log))
storageFileManagementUseCase.setStorage(storage)
ctx.log(TaskLogLevel.Info, "Enumerating files and directories…")
val files: List<IFile>
@@ -201,6 +202,7 @@ abstract class AbstractVaultBrowserViewModel(
locksVaultStorageList = true,
work = { ctx ->
try {
ctx.reportProgress(null, uiStrings(R.string.task_progress_create_storage))
ctx.log(TaskLogLevel.Info, "Creating storage…")
val uuid = resolveCreateVaultUuid()
?: throw IllegalStateException("Vault is not available")
@@ -235,6 +237,7 @@ abstract class AbstractVaultBrowserViewModel(
busyStorageUuid = id,
work = { ctx ->
try {
ctx.reportProgress(null, uiStrings(R.string.task_progress_enable_encryption))
ctx.log(TaskLogLevel.Info, "Checking storage…")
when (manageStoragesEncryptionUseCase.canEncrypt(storage)) {
ManageStoragesEncryptionUseCase.CanEncryptResult.Allowed -> {
@@ -316,6 +319,7 @@ abstract class AbstractVaultBrowserViewModel(
busyStorageUuid = id,
work = { ctx ->
try {
ctx.reportProgress(null, uiStrings(R.string.task_progress_close_storage))
ctx.log(TaskLogLevel.Info, "Closing storage…")
manageStoragesEncryptionUseCase.closeStorage(storage)
ctx.log(TaskLogLevel.Info, "Storage closed")
@@ -344,9 +348,12 @@ abstract class AbstractVaultBrowserViewModel(
busyStorageUuid = id,
work = { ctx ->
try {
ctx.reportProgress(null, uiStrings(R.string.task_progress_disable_encryption))
ctx.log(TaskLogLevel.Info, "Disabling encryption…")
manageStoragesEncryptionUseCase.clearAndDisableEncryption(storage) { p ->
ctx.reportProgress(p)
val label = p.label?.takeIf { it.isNotBlank() }
?: uiStrings(R.string.task_progress_disable_encryption)
ctx.reportProgress(p.fraction, label)
}
ctx.log(TaskLogLevel.Info, "Encryption disabled")
_userNotifications.emit(UserNotification.TextRes(R.string.msg_encryption_disabled))
@@ -375,6 +382,7 @@ abstract class AbstractVaultBrowserViewModel(
busyStorageUuid = id,
work = { ctx ->
try {
ctx.reportProgress(null, uiStrings(R.string.task_progress_rename_storage))
ctx.log(TaskLogLevel.Info, "Renaming…")
renameStorageUseCase.rename(storage, newName)
ctx.log(TaskLogLevel.Info, "Renamed")
@@ -398,6 +406,7 @@ abstract class AbstractVaultBrowserViewModel(
locksVaultStorageList = true,
work = { ctx ->
try {
ctx.reportProgress(null, uiStrings(R.string.task_progress_remove_storage))
ctx.log(TaskLogLevel.Info, "Removing storage…")
removeStorageUseCase.remove(storage)
ctx.log(TaskLogLevel.Info, "Removed")
@@ -448,6 +457,7 @@ abstract class AbstractVaultBrowserViewModel(
_userNotifications.emit(UserNotification.TextRes(R.string.msg_invalid_storage_for_sync_lock))
return@enqueue
}
ctx.reportProgress(null, uiStrings(R.string.task_progress_clear_sync_lock))
ctx.log(TaskLogLevel.Info, "Clearing sync lock…")
s.accessor.forceClearSyncLock()
ctx.log(TaskLogLevel.Info, "Sync lock cleared")

View File

@@ -124,6 +124,21 @@
<string name="task_title_enable_encryption">Включение шифрования</string>
<string name="task_title_open_encrypted_storage">Расшифровка и открытие хранилища</string>
<string name="task_progress_decrypt_running">Расшифровка…</string>
<string name="task_progress_dump_storage_log">Сканирование дерева…</string>
<string name="task_progress_create_storage">Создание хранилища…</string>
<string name="task_progress_enable_encryption">Шифрование…</string>
<string name="task_progress_close_storage">Закрытие хранилища…</string>
<string name="task_progress_disable_encryption">Очистка содержимого…</string>
<string name="task_progress_rename_storage">Переименование…</string>
<string name="task_progress_remove_storage">Удаление…</string>
<string name="task_progress_clear_sync_lock">Снятие блокировки…</string>
<string name="task_progress_add_remote_vault">Добавление…</string>
<string name="task_progress_remove_remote_vault">Удаление…</string>
<string name="task_progress_retry_remote_vault">Подключение…</string>
<string name="task_progress_save_2fa_token">Сохранение…</string>
<string name="task_progress_delete_2fa_token">Удаление…</string>
<string name="task_progress_save_text_secret">Сохранение…</string>
<string name="task_progress_delete_text_secret">Удаление…</string>
<string name="task_title_close_encrypted_storage">Закрытие зашифрованного хранилища</string>
<string name="task_title_disable_encryption">Отключение шифрования</string>
<string name="task_title_rename_storage">Переименование хранилища</string>