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, dispatcher = Dispatchers.IO,
work = { ctx -> work = { ctx ->
try { try {
ctx.reportProgress(null, uiStrings(R.string.task_progress_add_remote_vault))
ctx.log(TaskLogLevel.Info, "Adding vault…") ctx.log(TaskLogLevel.Info, "Adding vault…")
vaultRegistrar.register(registration) vaultRegistrar.register(registration)
ctx.log(TaskLogLevel.Info, "Vault added") ctx.log(TaskLogLevel.Info, "Vault added")
@@ -109,6 +110,7 @@ class RemoteVaultsViewModel @Inject constructor(
dispatcher = Dispatchers.IO, dispatcher = Dispatchers.IO,
work = { ctx -> work = { ctx ->
try { try {
ctx.reportProgress(null, uiStrings(R.string.task_progress_remove_remote_vault))
ctx.log(TaskLogLevel.Info, "Removing remote vault…") ctx.log(TaskLogLevel.Info, "Removing remote vault…")
vaultRegistrar.unregister(uuid) vaultRegistrar.unregister(uuid)
ctx.log(TaskLogLevel.Info, "Remote vault removed") ctx.log(TaskLogLevel.Info, "Remote vault removed")
@@ -131,6 +133,7 @@ class RemoteVaultsViewModel @Inject constructor(
dispatcher = Dispatchers.IO, dispatcher = Dispatchers.IO,
work = { ctx -> work = { ctx ->
try { try {
ctx.reportProgress(null, uiStrings(R.string.task_progress_retry_remote_vault))
ctx.log(TaskLogLevel.Info, "Retrying remote vault connection…") ctx.log(TaskLogLevel.Info, "Retrying remote vault connection…")
vaultRegistrar.retry(vaultUuid) vaultRegistrar.retry(vaultUuid)
ctx.log(TaskLogLevel.Info, "Retry requested") 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), title = uiStrings(R.string.task_title_delete_text_secret),
dispatcher = Dispatchers.IO, dispatcher = Dispatchers.IO,
busyStorageUuid = storage.uuid, busyStorageUuid = storage.uuid,
work = { _ -> work = { ctx ->
ctx.reportProgress(null, uiStrings(R.string.task_progress_delete_text_secret))
manageTextSecretsUseCase.delete(storage, secretId) manageTextSecretsUseCase.delete(storage, secretId)
}, },
) )

View File

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

View File

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

View File

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

View File

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

View File

@@ -124,6 +124,21 @@
<string name="task_title_enable_encryption">Включение шифрования</string> <string name="task_title_enable_encryption">Включение шифрования</string>
<string name="task_title_open_encrypted_storage">Расшифровка и открытие хранилища</string> <string name="task_title_open_encrypted_storage">Расшифровка и открытие хранилища</string>
<string name="task_progress_decrypt_running">Расшифровка…</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_close_encrypted_storage">Закрытие зашифрованного хранилища</string>
<string name="task_title_disable_encryption">Отключение шифрования</string> <string name="task_title_disable_encryption">Отключение шифрования</string>
<string name="task_title_rename_storage">Переименование хранилища</string> <string name="task_title_rename_storage">Переименование хранилища</string>