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 {