diff --git a/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/main/screens/remotes/RemoteVaultsViewModel.kt b/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/main/screens/remotes/RemoteVaultsViewModel.kt index 55b3bf4..678c7fd 100644 --- a/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/main/screens/remotes/RemoteVaultsViewModel.kt +++ b/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/main/screens/remotes/RemoteVaultsViewModel.kt @@ -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") diff --git a/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/main/screens/storage/secrets/TextSecretDetailsViewModel.kt b/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/main/screens/storage/secrets/TextSecretDetailsViewModel.kt index e43683e..73619cd 100644 --- a/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/main/screens/storage/secrets/TextSecretDetailsViewModel.kt +++ b/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/main/screens/storage/secrets/TextSecretDetailsViewModel.kt @@ -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) }, ) diff --git a/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/main/screens/storage/secrets/TextSecretEditViewModel.kt b/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/main/screens/storage/secrets/TextSecretEditViewModel.kt index 8c5de0e..0895691 100644 --- a/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/main/screens/storage/secrets/TextSecretEditViewModel.kt +++ b/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/main/screens/storage/secrets/TextSecretEditViewModel.kt @@ -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, diff --git a/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/main/screens/storage/twofa/TwoFaTokensViewModel.kt b/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/main/screens/storage/twofa/TwoFaTokensViewModel.kt index f2c0ee4..3868be2 100644 --- a/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/main/screens/storage/twofa/TwoFaTokensViewModel.kt +++ b/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/main/screens/storage/twofa/TwoFaTokensViewModel.kt @@ -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) }, ) diff --git a/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/main/screens/tasks/TaskPipelineScreen.kt b/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/main/screens/tasks/TaskPipelineScreen.kt index 6dd5a8d..ce38d88 100644 --- a/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/main/screens/tasks/TaskPipelineScreen.kt +++ b/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/main/screens/tasks/TaskPipelineScreen.kt @@ -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 }, diff --git a/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/main/screens/vault/AbstractVaultBrowserViewModel.kt b/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/main/screens/vault/AbstractVaultBrowserViewModel.kt index 329d751..00350ec 100644 --- a/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/main/screens/vault/AbstractVaultBrowserViewModel.kt +++ b/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/main/screens/vault/AbstractVaultBrowserViewModel.kt @@ -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 @@ -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") diff --git a/ui/src/main/res/values/strings.xml b/ui/src/main/res/values/strings.xml index a9f6989..1b8b3eb 100644 --- a/ui/src/main/res/values/strings.xml +++ b/ui/src/main/res/values/strings.xml @@ -124,6 +124,21 @@ Включение шифрования Расшифровка и открытие хранилища Расшифровка… + Сканирование дерева… + Создание хранилища… + Шифрование… + Закрытие хранилища… + Очистка содержимого… + Переименование… + Удаление… + Снятие блокировки… + Добавление… + Удаление… + Подключение… + Сохранение… + Удаление… + Сохранение… + Удаление… Закрытие зашифрованного хранилища Отключение шифрования Переименование хранилища