From 07d54b59965851c9121a8f63e37c45d80797f9f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D1=8B=D1=82=D0=BA=D0=BE=D0=B2=20=D0=A0=D0=BE=D0=BC?= =?UTF-8?q?=D0=B0=D0=BD?= Date: Fri, 22 May 2026 00:20:49 +0300 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D0=BE=D0=BB=D0=BE=D0=B2?= =?UTF-8?q?=D0=BE=D0=BA=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B8=20=D1=81?= =?UTF-8?q?=D0=B8=D0=BD=D1=85=D1=80=D0=BE=D0=BD=D0=B8=D0=B7=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/di/modules/domain/UseCasesModule.kt | 8 ++++++++ .../wallenc/app/sync/StorageSyncBootstrap.kt | 8 +------- .../app/sync/StorageSyncTaskTitleFormatter.kt | 16 ++++++++++++++++ .../tasks/IStorageSyncTaskTitleFormatter.kt | 6 ++++++ .../wallenc/ui/resources/TaskLogKeys.kt | 3 +++ .../ui/screens/sync/StorageSyncViewModel.kt | 5 +---- ui/src/main/res/values-ru/strings.xml | 3 +-- ui/src/main/res/values/strings.xml | 3 +-- .../wallenc/usecases/RunStorageSyncUseCase.kt | 9 +++++---- 9 files changed, 42 insertions(+), 19 deletions(-) create mode 100644 app/src/main/java/com/github/nullptroma/wallenc/app/sync/StorageSyncTaskTitleFormatter.kt create mode 100644 domain/src/main/java/com/github/nullptroma/wallenc/domain/tasks/IStorageSyncTaskTitleFormatter.kt diff --git a/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/domain/UseCasesModule.kt b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/domain/UseCasesModule.kt index 82e88b2..43a33a9 100644 --- a/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/domain/UseCasesModule.kt +++ b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/domain/UseCasesModule.kt @@ -1,6 +1,8 @@ package com.github.nullptroma.wallenc.app.di.modules.domain +import com.github.nullptroma.wallenc.app.sync.StorageSyncTaskTitleFormatter import com.github.nullptroma.wallenc.domain.interfaces.IStorageSyncEngine +import com.github.nullptroma.wallenc.domain.tasks.IStorageSyncTaskTitleFormatter import com.github.nullptroma.wallenc.usecases.StorageSyncEngine import dagger.Binds import dagger.Module @@ -15,4 +17,10 @@ abstract class UseCasesModule { @Binds @Singleton abstract fun bindStorageSyncEngine(impl: StorageSyncEngine): IStorageSyncEngine + + @Binds + @Singleton + abstract fun bindStorageSyncTaskTitleFormatter( + impl: StorageSyncTaskTitleFormatter, + ): IStorageSyncTaskTitleFormatter } diff --git a/app/src/main/java/com/github/nullptroma/wallenc/app/sync/StorageSyncBootstrap.kt b/app/src/main/java/com/github/nullptroma/wallenc/app/sync/StorageSyncBootstrap.kt index c9472b0..6361934 100644 --- a/app/src/main/java/com/github/nullptroma/wallenc/app/sync/StorageSyncBootstrap.kt +++ b/app/src/main/java/com/github/nullptroma/wallenc/app/sync/StorageSyncBootstrap.kt @@ -2,8 +2,6 @@ package com.github.nullptroma.wallenc.app.sync import com.github.nullptroma.wallenc.domain.datatypes.StorageSyncPaths import com.github.nullptroma.wallenc.domain.interfaces.IVaultsManager -import com.github.nullptroma.wallenc.ui.R -import com.github.nullptroma.wallenc.ui.resources.UiStringResolver import com.github.nullptroma.wallenc.domain.tasks.StorageSyncTriggerReason import com.github.nullptroma.wallenc.usecases.RunStorageSyncUseCase import kotlinx.coroutines.CoroutineScope @@ -25,7 +23,6 @@ class StorageSyncBootstrap @Inject constructor( private val scheduler: StorageSyncScheduler, private val vaultsManager: IVaultsManager, private val syncRunner: RunStorageSyncUseCase, - private val uiStrings: UiStringResolver, ) { private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO) @@ -60,10 +57,7 @@ class StorageSyncBootstrap @Inject constructor( if (syncRunner.syncRunning.value) { return@collect } - syncRunner.enqueue( - displayTitle = uiStrings(R.string.task_title_storage_sync_background), - reason = StorageSyncTriggerReason.Debounce, - ) + syncRunner.enqueue(StorageSyncTriggerReason.Debounce) } } } diff --git a/app/src/main/java/com/github/nullptroma/wallenc/app/sync/StorageSyncTaskTitleFormatter.kt b/app/src/main/java/com/github/nullptroma/wallenc/app/sync/StorageSyncTaskTitleFormatter.kt new file mode 100644 index 0000000..ea295a2 --- /dev/null +++ b/app/src/main/java/com/github/nullptroma/wallenc/app/sync/StorageSyncTaskTitleFormatter.kt @@ -0,0 +1,16 @@ +package com.github.nullptroma.wallenc.app.sync + +import com.github.nullptroma.wallenc.domain.tasks.IStorageSyncTaskTitleFormatter +import com.github.nullptroma.wallenc.domain.tasks.StorageSyncTriggerReason +import com.github.nullptroma.wallenc.ui.resources.UiStringResolver +import com.github.nullptroma.wallenc.ui.resources.storageSyncTaskTitle +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class StorageSyncTaskTitleFormatter @Inject constructor( + private val uiStrings: UiStringResolver, +) : IStorageSyncTaskTitleFormatter { + override fun format(reason: StorageSyncTriggerReason): String = + uiStrings.storageSyncTaskTitle(reason) +} diff --git a/domain/src/main/java/com/github/nullptroma/wallenc/domain/tasks/IStorageSyncTaskTitleFormatter.kt b/domain/src/main/java/com/github/nullptroma/wallenc/domain/tasks/IStorageSyncTaskTitleFormatter.kt new file mode 100644 index 0000000..d4b4bc0 --- /dev/null +++ b/domain/src/main/java/com/github/nullptroma/wallenc/domain/tasks/IStorageSyncTaskTitleFormatter.kt @@ -0,0 +1,6 @@ +package com.github.nullptroma.wallenc.domain.tasks + +/** Локализованный заголовок задачи синхронизации хранилищ по источнику запуска. */ +fun interface IStorageSyncTaskTitleFormatter { + fun format(reason: StorageSyncTriggerReason): String +} diff --git a/ui/src/main/java/com/github/nullptroma/wallenc/ui/resources/TaskLogKeys.kt b/ui/src/main/java/com/github/nullptroma/wallenc/ui/resources/TaskLogKeys.kt index 54999d0..56a742f 100644 --- a/ui/src/main/java/com/github/nullptroma/wallenc/ui/resources/TaskLogKeys.kt +++ b/ui/src/main/java/com/github/nullptroma/wallenc/ui/resources/TaskLogKeys.kt @@ -23,6 +23,9 @@ fun TaskLogKey.resolve(resolver: UiStringResolver): String = when (this) { } } +fun UiStringResolver.storageSyncTaskTitle(reason: StorageSyncTriggerReason): String = + this(R.string.task_title_storage_sync, resolveSyncTriggerReason(reason)) + private fun UiStringResolver.resolveSyncTriggerReason(reason: StorageSyncTriggerReason): String = when (reason) { StorageSyncTriggerReason.Debounce -> this(R.string.task_sync_trigger_debounce) diff --git a/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/sync/StorageSyncViewModel.kt b/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/sync/StorageSyncViewModel.kt index 9fca6c3..8eb9296 100644 --- a/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/sync/StorageSyncViewModel.kt +++ b/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/sync/StorageSyncViewModel.kt @@ -208,10 +208,7 @@ class StorageSyncViewModel @Inject constructor( } fun runSyncNow() { - val started = runStorageSyncUseCase.enqueue( - displayTitle = uiStrings(R.string.task_title_storage_sync), - reason = StorageSyncTriggerReason.SyncTab, - ) + val started = runStorageSyncUseCase.enqueue(StorageSyncTriggerReason.SyncTab) if (!started) { updateState( state.value.copy( diff --git a/ui/src/main/res/values-ru/strings.xml b/ui/src/main/res/values-ru/strings.xml index 238e51c..8a2a5a1 100644 --- a/ui/src/main/res/values-ru/strings.xml +++ b/ui/src/main/res/values-ru/strings.xml @@ -149,8 +149,7 @@ Удаление удалённого хранилища Повторное подключение удалённого хранилища Обновление списка хранилищ - Синхронизация хранилищ - Фоновая синхронизация хранилищ + Синхронизация хранилищ (%1$s) Сохранение 2FA токена Удаление 2FA токена Сохранение текстового секрета diff --git a/ui/src/main/res/values/strings.xml b/ui/src/main/res/values/strings.xml index 3018961..c017667 100644 --- a/ui/src/main/res/values/strings.xml +++ b/ui/src/main/res/values/strings.xml @@ -149,8 +149,7 @@ Remove remote vault Retry remote vault connection Rescan vault storages - Storage sync - Background storage sync + Storage sync (%1$s) Save 2FA token Delete 2FA token Save text secret diff --git a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/RunStorageSyncUseCase.kt b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/RunStorageSyncUseCase.kt index 98f933e..055666c 100644 --- a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/RunStorageSyncUseCase.kt +++ b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/RunStorageSyncUseCase.kt @@ -3,6 +3,7 @@ package com.github.nullptroma.wallenc.usecases import com.github.nullptroma.wallenc.domain.errors.toWallencException import com.github.nullptroma.wallenc.domain.interfaces.IStorageSyncEngine import com.github.nullptroma.wallenc.domain.tasks.ITaskOrchestrator +import com.github.nullptroma.wallenc.domain.tasks.IStorageSyncTaskTitleFormatter import com.github.nullptroma.wallenc.domain.tasks.StorageSyncTriggerReason import com.github.nullptroma.wallenc.domain.tasks.TaskId import com.github.nullptroma.wallenc.domain.tasks.TaskLogKey @@ -21,6 +22,7 @@ class RunStorageSyncUseCase @Inject constructor( private val orchestrator: ITaskOrchestrator, private val syncEngine: IStorageSyncEngine, private val syncReadiness: StorageSyncReadiness, + private val taskTitleFormatter: IStorageSyncTaskTitleFormatter, ) { private val running = AtomicBoolean(false) @@ -31,18 +33,17 @@ class RunStorageSyncUseCase @Inject constructor( val activeSyncTaskId: StateFlow = _activeSyncTaskId.asStateFlow() /** - * @param displayTitle заголовок задачи в UI (локализованный на стороне вызова) - * @param reason источник запуска — попадает в лог пайплайна + * @param reason источник запуска — заголовок задачи и лог пайплайна * @return false, если синхронизация уже в очереди или выполняется — новая задача не создана */ - fun enqueue(displayTitle: String, reason: StorageSyncTriggerReason): Boolean { + fun enqueue(reason: StorageSyncTriggerReason): Boolean { if (!running.compareAndSet(false, true)) { return false } _syncRunning.value = true try { val taskId = orchestrator.enqueue( - title = displayTitle, + title = taskTitleFormatter.format(reason), dispatcher = Dispatchers.IO, work = { ctx -> try {