feat(ui): добавлены новые состояния и компоненты для отображения статуса работы

This commit is contained in:
2026-05-13 17:22:31 +03:00
parent 6c18a1d741
commit f551efe4a6
40 changed files with 1787 additions and 542 deletions

View File

@@ -2,9 +2,10 @@ package com.github.nullptroma.wallenc.app
import android.app.Application
import androidx.work.Configuration
import androidx.hilt.work.HiltWorkerFactory
import com.github.nullptroma.wallenc.app.di.HiltWorkerFactoryEntryPoint
import com.github.nullptroma.wallenc.app.sync.StorageSyncBootstrap
import com.github.nullptroma.wallenc.app.tasks.TaskPipelineForegroundBootstrap
import dagger.hilt.android.EntryPointAccessors
import dagger.hilt.android.HiltAndroidApp
import javax.inject.Inject
@@ -17,9 +18,6 @@ class WallencApplication : Application(), Configuration.Provider {
@Inject
lateinit var storageSyncBootstrap: StorageSyncBootstrap
@Inject
lateinit var workerFactory: HiltWorkerFactory
override fun onCreate() {
super.onCreate()
taskPipelineForegroundBootstrap.start()
@@ -27,7 +25,13 @@ class WallencApplication : Application(), Configuration.Provider {
}
override val workManagerConfiguration: Configuration
get() = Configuration.Builder()
.setWorkerFactory(workerFactory)
.build()
get() {
val factory = EntryPointAccessors.fromApplication(
applicationContext,
HiltWorkerFactoryEntryPoint::class.java,
).hiltWorkerFactory()
return Configuration.Builder()
.setWorkerFactory(factory)
.build()
}
}

View File

@@ -0,0 +1,17 @@
package com.github.nullptroma.wallenc.app.di
import androidx.hilt.work.HiltWorkerFactory
import dagger.hilt.EntryPoint
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
/**
* WorkManager инициализируется до [android.app.Application.onCreate], поэтому
* нельзя читать `@Inject lateinit var workerFactory` в [Configuration.Provider].
* Фабрика берётся через EntryPoint.
*/
@EntryPoint
@InstallIn(SingletonComponent::class)
interface HiltWorkerFactoryEntryPoint {
fun hiltWorkerFactory(): HiltWorkerFactory
}

View File

@@ -0,0 +1,26 @@
package com.github.nullptroma.wallenc.app.di
import android.content.Context
import com.github.nullptroma.wallenc.ui.resources.UiStringResolver
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
object UiStringModule {
@Provides
@Singleton
fun provideUiStringResolver(@ApplicationContext context: Context): UiStringResolver =
UiStringResolver { id, args ->
if (args.isEmpty()) {
context.getString(id)
} else {
context.getString(id, *args)
}
}
}

View File

@@ -1,6 +1,8 @@
package com.github.nullptroma.wallenc.app.sync
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.usecases.RunStorageSyncUseCase
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@@ -21,6 +23,7 @@ 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)
@@ -40,7 +43,10 @@ class StorageSyncBootstrap @Inject constructor(
merge(*triggers.toTypedArray())
.debounce(DEBOUNCE_AFTER_CHANGE_MS)
.collect {
syncRunner.enqueue("debounce")
syncRunner.enqueue(
displayTitle = uiStrings(R.string.task_title_storage_sync_background),
logReason = "debounce",
)
}
}
}

View File

@@ -1,8 +1,8 @@
<resources>
<string name="app_name">Wallenc</string>
<string name="task_notification_channel_name">Background tasks</string>
<string name="task_notification_title">Wallenc tasks</string>
<string name="task_notification_preparing">Preparing</string>
<string name="task_notification_indeterminate">Working</string>
<string name="task_notification_cancel">Cancel</string>
</resources>
<string name="task_notification_channel_name">Фоновые задачи</string>
<string name="task_notification_title">Задачи Wallenc</string>
<string name="task_notification_preparing">Подготовка</string>
<string name="task_notification_indeterminate">Выполняется</string>
<string name="task_notification_cancel">Отмена</string>
</resources>