diff --git a/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/app/DispatchersModule.kt b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/app/DispatchersModule.kt index 5b71f23..be79ff4 100644 --- a/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/app/DispatchersModule.kt +++ b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/app/DispatchersModule.kt @@ -11,12 +11,10 @@ import javax.inject.Singleton @Qualifier @Retention(AnnotationRetention.BINARY) -@Singleton annotation class MainDispatcher @Qualifier @Retention(AnnotationRetention.BINARY) -@Singleton annotation class IoDispatcher @Module diff --git a/app/src/main/java/com/github/nullptroma/wallenc/app/di/LocaleModule.kt b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/app/LocaleModule.kt similarity index 89% rename from app/src/main/java/com/github/nullptroma/wallenc/app/di/LocaleModule.kt rename to app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/app/LocaleModule.kt index 615b78b..4ace318 100644 --- a/app/src/main/java/com/github/nullptroma/wallenc/app/di/LocaleModule.kt +++ b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/app/LocaleModule.kt @@ -1,4 +1,4 @@ -package com.github.nullptroma.wallenc.app.di +package com.github.nullptroma.wallenc.app.di.modules.app import com.github.nullptroma.wallenc.app.locale.AppLocaleControllerImpl import com.github.nullptroma.wallenc.ui.locale.AppLocaleController diff --git a/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/app/SingletonModule.kt b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/app/LoggerModule.kt similarity index 81% rename from app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/app/SingletonModule.kt rename to app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/app/LoggerModule.kt index 335fd9c..4bf37c3 100644 --- a/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/app/SingletonModule.kt +++ b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/app/LoggerModule.kt @@ -10,10 +10,8 @@ import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) -class SingletonModule { +object LoggerModule { @Provides @Singleton - fun provideLogger(): ILogger { - return Logger() - } -} \ No newline at end of file + fun provideLogger(): ILogger = Logger() +} diff --git a/app/src/main/java/com/github/nullptroma/wallenc/app/di/UiStringModule.kt b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/app/UiStringModule.kt similarity index 92% rename from app/src/main/java/com/github/nullptroma/wallenc/app/di/UiStringModule.kt rename to app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/app/UiStringModule.kt index 61d55cc..0262bc4 100644 --- a/app/src/main/java/com/github/nullptroma/wallenc/app/di/UiStringModule.kt +++ b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/app/UiStringModule.kt @@ -1,4 +1,4 @@ -package com.github.nullptroma.wallenc.app.di +package com.github.nullptroma.wallenc.app.di.modules.app import android.content.Context import com.github.nullptroma.wallenc.ui.resources.UiStringResolver diff --git a/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/NetworkModule.kt b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/NetworkModule.kt new file mode 100644 index 0000000..2b635f1 --- /dev/null +++ b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/NetworkModule.kt @@ -0,0 +1,51 @@ +package com.github.nullptroma.wallenc.app.di.modules.data + +import com.github.nullptroma.wallenc.app.di.modules.app.IoDispatcher +import com.github.nullptroma.wallenc.domain.vault.network.yandexdisk.YandexDiskApiFactory +import com.github.nullptroma.wallenc.domain.vault.network.yandexdisk.repository.YandexDiskRepositoryFactory +import com.github.nullptroma.wallenc.domain.vault.network.yandexuserinfo.YandexUserInfoApi +import com.github.nullptroma.wallenc.domain.vault.network.yandexuserinfo.YandexUserInfoApiFactory +import com.github.nullptroma.wallenc.domain.vault.network.yandexuserinfo.repository.YandexUserInfoRepository +import com.github.nullptroma.wallenc.domain.vault.ports.YandexAccountStore +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import kotlinx.coroutines.CoroutineDispatcher +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object NetworkModule { + + @Provides + @Singleton + fun provideYandexUserInfoApi(): YandexUserInfoApi = YandexUserInfoApiFactory.create() + + @Provides + @Singleton + fun provideYandexDiskApiFactory( + yandexAccountStore: YandexAccountStore, + @IoDispatcher ioDispatcher: CoroutineDispatcher, + ): YandexDiskApiFactory = YandexDiskApiFactory( + accountRepository = yandexAccountStore, + ioDispatcher = ioDispatcher, + ) + + @Provides + @Singleton + fun provideYandexDiskRepositoryFactory( + apiFactory: YandexDiskApiFactory, + @IoDispatcher ioDispatcher: CoroutineDispatcher, + ): YandexDiskRepositoryFactory = YandexDiskRepositoryFactory( + apiFactory = apiFactory, + ioDispatcher = ioDispatcher, + ) + + @Provides + @Singleton + fun provideYandexUserInfoRepository( + api: YandexUserInfoApi, + @IoDispatcher ioDispatcher: CoroutineDispatcher, + ): YandexUserInfoRepository = YandexUserInfoRepository(api, ioDispatcher) +} diff --git a/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/PersistenceModule.kt b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/PersistenceModule.kt new file mode 100644 index 0000000..60cd145 --- /dev/null +++ b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/PersistenceModule.kt @@ -0,0 +1,55 @@ +package com.github.nullptroma.wallenc.app.di.modules.data + +import com.github.nullptroma.wallenc.app.di.modules.app.IoDispatcher +import com.github.nullptroma.wallenc.domain.interfaces.IStorageSyncGroupStore +import com.github.nullptroma.wallenc.domain.vault.db.app.dao.StorageKeyMapDao +import com.github.nullptroma.wallenc.domain.vault.db.app.dao.StorageSyncGroupDao +import com.github.nullptroma.wallenc.domain.vault.db.app.dao.YandexAccountDao +import com.github.nullptroma.wallenc.domain.vault.db.app.repository.StorageKeyMapRepository +import com.github.nullptroma.wallenc.domain.vault.db.app.repository.StorageSyncGroupRepository +import com.github.nullptroma.wallenc.domain.vault.db.app.repository.YandexAccountRepository +import com.github.nullptroma.wallenc.domain.vault.ports.StorageKeyMapStore +import com.github.nullptroma.wallenc.domain.vault.ports.YandexAccountStore +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import kotlinx.coroutines.CoroutineDispatcher +import javax.inject.Singleton + +/** + * Room DAO/repository types live in `:infrastructure-android` under `domain.vault` packages. + */ +@Module +@InstallIn(SingletonComponent::class) +object PersistenceModule { + + @Provides + @Singleton + fun provideStorageKeyMapRepository( + dao: StorageKeyMapDao, + @IoDispatcher ioDispatcher: CoroutineDispatcher, + ): StorageKeyMapRepository = StorageKeyMapRepository(dao, ioDispatcher) + + @Provides + @Singleton + fun provideStorageKeyMapStore(impl: StorageKeyMapRepository): StorageKeyMapStore = impl + + @Provides + @Singleton + fun provideStorageSyncGroupStore( + dao: StorageSyncGroupDao, + @IoDispatcher ioDispatcher: CoroutineDispatcher, + ): IStorageSyncGroupStore = StorageSyncGroupRepository(dao, ioDispatcher) + + @Provides + @Singleton + fun provideYandexAccountRepository( + dao: YandexAccountDao, + @IoDispatcher ioDispatcher: CoroutineDispatcher, + ): YandexAccountRepository = YandexAccountRepository(dao, ioDispatcher) + + @Provides + @Singleton + fun provideYandexAccountStore(impl: YandexAccountRepository): YandexAccountStore = impl +} diff --git a/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/RoomModule.kt b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/RoomModule.kt index a44cf43..17e6ec7 100644 --- a/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/RoomModule.kt +++ b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/RoomModule.kt @@ -11,14 +11,16 @@ 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 +/** Room types are implemented in `:infrastructure-android` with `domain.vault` packages. */ @Module -@InstallIn(dagger.hilt.components.SingletonComponent::class) -class RoomModule { +@InstallIn(SingletonComponent::class) +object RoomModule { @Provides @Singleton - fun provideRoomFactory(@ApplicationContext appContext: Context) : RoomFactory { + fun provideRoomFactory(@ApplicationContext appContext: Context): RoomFactory { return RoomFactory(appContext) } @@ -48,9 +50,7 @@ class RoomModule { @Provides @Singleton - fun provideAppDb( - factory: RoomFactory - ): IAppDb { + fun provideAppDb(factory: RoomFactory): IAppDb { return factory.buildAppDb() } } \ No newline at end of file diff --git a/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/SingletonModule.kt b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/SingletonModule.kt deleted file mode 100644 index 1d1842a..0000000 --- a/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/SingletonModule.kt +++ /dev/null @@ -1,169 +0,0 @@ -package com.github.nullptroma.wallenc.app.di.modules.data - -import android.content.Context -import com.github.nullptroma.wallenc.app.di.modules.app.IoDispatcher -import com.github.nullptroma.wallenc.domain.vault.db.app.dao.StorageKeyMapDao -import com.github.nullptroma.wallenc.domain.vault.db.app.dao.StorageMetaInfoDao -import com.github.nullptroma.wallenc.domain.vault.db.app.dao.StorageSyncGroupDao -import com.github.nullptroma.wallenc.domain.vault.db.app.dao.YandexAccountDao -import com.github.nullptroma.wallenc.domain.vault.db.app.repository.StorageKeyMapRepository -import com.github.nullptroma.wallenc.domain.vault.db.app.repository.StorageMetaInfoRepository -import com.github.nullptroma.wallenc.domain.vault.db.app.repository.StorageSyncGroupRepository -import com.github.nullptroma.wallenc.domain.vault.db.app.repository.YandexAccountRepository -import com.github.nullptroma.wallenc.domain.vault.network.yandexdisk.YandexDiskApiFactory -import com.github.nullptroma.wallenc.domain.vault.network.yandexdisk.repository.YandexDiskRepositoryFactory -import com.github.nullptroma.wallenc.domain.vault.network.yandexuserinfo.YandexUserInfoApi -import com.github.nullptroma.wallenc.domain.vault.network.yandexuserinfo.YandexUserInfoApiFactory -import com.github.nullptroma.wallenc.domain.vault.network.yandexuserinfo.repository.YandexUserInfoRepository -import com.github.nullptroma.wallenc.domain.vault.ports.StorageKeyMapStore -import com.github.nullptroma.wallenc.domain.vault.ports.YandexAccountStore -import com.github.nullptroma.wallenc.task.runtime.TaskOrchestrator -import com.github.nullptroma.wallenc.domain.vault.vaults.VaultsManager -import com.github.nullptroma.wallenc.domain.vault.vaults.local.LocalVault -import com.github.nullptroma.wallenc.domain.interfaces.IUnlockManager -import com.github.nullptroma.wallenc.domain.interfaces.IStorageSyncGroupStore -import com.github.nullptroma.wallenc.domain.interfaces.IVault -import com.github.nullptroma.wallenc.domain.interfaces.IVaultsManager -import com.github.nullptroma.wallenc.domain.tasks.ITaskOrchestrator -import com.github.nullptroma.wallenc.vault.contract.VaultRegistrar -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.qualifiers.ApplicationContext -import dagger.hilt.components.SingletonComponent -import kotlinx.coroutines.CoroutineDispatcher -import javax.inject.Singleton - -@Module -@InstallIn(SingletonComponent::class) -class SingletonModule { - @Provides - @Singleton - fun provideTaskOrchestrator( - @IoDispatcher ioDispatcher: CoroutineDispatcher, - ): ITaskOrchestrator = TaskOrchestrator(ioDispatcher) - - @Provides - @Singleton - fun provideYandexUserInfoApi(): YandexUserInfoApi = YandexUserInfoApiFactory.create() - - @Provides - @Singleton - fun provideYandexDiskApiFactory( - yandexAccountStore: YandexAccountStore, - @IoDispatcher ioDispatcher: CoroutineDispatcher, - ): YandexDiskApiFactory = YandexDiskApiFactory( - accountRepository = yandexAccountStore, - ioDispatcher = ioDispatcher, - ) - - @Provides - @Singleton - fun provideYandexDiskRepositoryFactory( - apiFactory: YandexDiskApiFactory, - @IoDispatcher ioDispatcher: CoroutineDispatcher, - ): YandexDiskRepositoryFactory = YandexDiskRepositoryFactory( - apiFactory = apiFactory, - ioDispatcher = ioDispatcher, - ) - - @Provides - @Singleton - fun provideVaultsManager( - @IoDispatcher ioDispatcher: CoroutineDispatcher, - localVault: IVault, - keyRepo: StorageKeyMapStore, - yandexAccountStore: YandexAccountStore, - yandexUserInfoRepository: YandexUserInfoRepository, - yandexDiskRepositoryFactory: YandexDiskRepositoryFactory, - ): VaultsManager { - return VaultsManager( - ioDispatcher = ioDispatcher, - localVault = localVault, - keyRepo = keyRepo, - yandexAccountStore = yandexAccountStore, - yandexUserInfoRepository = yandexUserInfoRepository, - yandexDiskRepositoryFactory = yandexDiskRepositoryFactory, - ) - } - - @Provides - @Singleton - fun provideLocalVault( - @IoDispatcher ioDispatcher: CoroutineDispatcher, - @ApplicationContext context: Context, - ): IVault = LocalVault( - ioDispatcher = ioDispatcher, - vaultRoot = context.getExternalFilesDir("LocalVault"), - ) - - @Provides - @Singleton - fun provideIVaultsManager(impl: VaultsManager): IVaultsManager = impl - - @Provides - @Singleton - fun provideVaultRegistrar(impl: VaultsManager): VaultRegistrar = impl - - @Provides - fun provideUnlockManager( - vaultsManager: IVaultsManager - ): IUnlockManager { - return vaultsManager.unlockManager - } - - @Provides - @Singleton - fun provideStorageKeyMapRepository( - dao: StorageKeyMapDao, - @IoDispatcher ioDispatcher: CoroutineDispatcher - ): StorageKeyMapRepository { - return StorageKeyMapRepository(dao, ioDispatcher) - } - - @Provides - @Singleton - fun provideStorageKeyMapStore( - impl: StorageKeyMapRepository, - ): StorageKeyMapStore = impl - - @Provides - @Singleton - fun provideStorageMetaInfoRepository( - dao: StorageMetaInfoDao, - @IoDispatcher ioDispatcher: CoroutineDispatcher - ): StorageMetaInfoRepository { - return StorageMetaInfoRepository(dao, ioDispatcher) - } - - @Provides - @Singleton - fun provideStorageSyncGroupStore( - dao: StorageSyncGroupDao, - @IoDispatcher ioDispatcher: CoroutineDispatcher, - ): IStorageSyncGroupStore = StorageSyncGroupRepository(dao, ioDispatcher) - - @Provides - @Singleton - fun provideYandexAccountRepository( - dao: YandexAccountDao, - @IoDispatcher ioDispatcher: CoroutineDispatcher - ): YandexAccountRepository { - return YandexAccountRepository(dao, ioDispatcher) - } - - @Provides - @Singleton - fun provideYandexAccountStore( - impl: YandexAccountRepository, - ): YandexAccountStore = impl - - @Provides - @Singleton - fun provideYandexUserInfoRepository( - api: YandexUserInfoApi, - @IoDispatcher ioDispatcher: CoroutineDispatcher - ): YandexUserInfoRepository { - return YandexUserInfoRepository(api, ioDispatcher) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/TaskModule.kt b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/TaskModule.kt new file mode 100644 index 0000000..4b0c868 --- /dev/null +++ b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/TaskModule.kt @@ -0,0 +1,22 @@ +package com.github.nullptroma.wallenc.app.di.modules.data + +import com.github.nullptroma.wallenc.app.di.modules.app.IoDispatcher +import com.github.nullptroma.wallenc.domain.tasks.ITaskOrchestrator +import com.github.nullptroma.wallenc.task.runtime.TaskOrchestrator +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import kotlinx.coroutines.CoroutineDispatcher +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object TaskModule { + + @Provides + @Singleton + fun provideTaskOrchestrator( + @IoDispatcher ioDispatcher: CoroutineDispatcher, + ): ITaskOrchestrator = TaskOrchestrator(ioDispatcher) +} diff --git a/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/VaultBindingsModule.kt b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/VaultBindingsModule.kt new file mode 100644 index 0000000..cb96e16 --- /dev/null +++ b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/VaultBindingsModule.kt @@ -0,0 +1,23 @@ +package com.github.nullptroma.wallenc.app.di.modules.data + +import com.github.nullptroma.wallenc.domain.interfaces.IVaultsManager +import com.github.nullptroma.wallenc.domain.vault.vaults.VaultsManager +import com.github.nullptroma.wallenc.vault.contract.VaultRegistrar +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +abstract class VaultBindingsModule { + + @Binds + @Singleton + abstract fun bindVaultsManager(impl: VaultsManager): IVaultsManager + + @Binds + @Singleton + abstract fun bindVaultRegistrar(impl: VaultsManager): VaultRegistrar +} diff --git a/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/VaultModule.kt b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/VaultModule.kt new file mode 100644 index 0000000..32d97a5 --- /dev/null +++ b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/VaultModule.kt @@ -0,0 +1,59 @@ +package com.github.nullptroma.wallenc.app.di.modules.data + +import android.content.Context +import com.github.nullptroma.wallenc.app.di.modules.app.IoDispatcher +import com.github.nullptroma.wallenc.domain.interfaces.IUnlockManager +import com.github.nullptroma.wallenc.domain.interfaces.IVault +import com.github.nullptroma.wallenc.domain.interfaces.IVaultsManager +import com.github.nullptroma.wallenc.domain.vault.network.yandexdisk.repository.YandexDiskRepositoryFactory +import com.github.nullptroma.wallenc.domain.vault.network.yandexuserinfo.repository.YandexUserInfoRepository +import com.github.nullptroma.wallenc.domain.vault.ports.StorageKeyMapStore +import com.github.nullptroma.wallenc.domain.vault.ports.YandexAccountStore +import com.github.nullptroma.wallenc.domain.vault.vaults.VaultsManager +import com.github.nullptroma.wallenc.domain.vault.vaults.local.LocalVault +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent +import kotlinx.coroutines.CoroutineDispatcher +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object VaultModule { + + @Provides + @Singleton + fun provideLocalVault( + @IoDispatcher ioDispatcher: CoroutineDispatcher, + @ApplicationContext context: Context, + ): IVault = LocalVault( + ioDispatcher = ioDispatcher, + // getExternalFilesDir may return null before storage is ready; LocalVault handles null root. + vaultRoot = context.getExternalFilesDir("LocalVault"), + ) + + @Provides + @Singleton + fun provideVaultsManager( + @IoDispatcher ioDispatcher: CoroutineDispatcher, + localVault: IVault, + keyRepo: StorageKeyMapStore, + yandexAccountStore: YandexAccountStore, + yandexUserInfoRepository: YandexUserInfoRepository, + yandexDiskRepositoryFactory: YandexDiskRepositoryFactory, + ): VaultsManager = VaultsManager( + ioDispatcher = ioDispatcher, + localVault = localVault, + keyRepo = keyRepo, + yandexAccountStore = yandexAccountStore, + yandexUserInfoRepository = yandexUserInfoRepository, + yandexDiskRepositoryFactory = yandexDiskRepositoryFactory, + ) + + @Provides + @Singleton + fun provideUnlockManager(vaultsManager: IVaultsManager): IUnlockManager = + vaultsManager.unlockManager +} 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 a0e438c..82e88b2 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,131 +1,18 @@ package com.github.nullptroma.wallenc.app.di.modules.domain -import com.github.nullptroma.wallenc.domain.interfaces.IUnlockManager import com.github.nullptroma.wallenc.domain.interfaces.IStorageSyncEngine -import com.github.nullptroma.wallenc.domain.interfaces.IStorageSyncGroupStore -import com.github.nullptroma.wallenc.domain.tasks.ITaskOrchestrator -import com.github.nullptroma.wallenc.domain.interfaces.IVaultsManager -import com.github.nullptroma.wallenc.usecases.GetOpenedStoragesUseCase -import com.github.nullptroma.wallenc.usecases.FindStorageUseCase -import com.github.nullptroma.wallenc.usecases.ManageStoragesEncryptionUseCase -import com.github.nullptroma.wallenc.usecases.ManageTextSecretsUseCase -import com.github.nullptroma.wallenc.usecases.ManageTwoFaTokensUseCase -import com.github.nullptroma.wallenc.usecases.ManageVaultUseCase -import com.github.nullptroma.wallenc.usecases.RemoveStorageUseCase -import com.github.nullptroma.wallenc.usecases.RenameStorageUseCase -import com.github.nullptroma.wallenc.usecases.RunStorageSyncUseCase -import com.github.nullptroma.wallenc.usecases.ManageStorageSyncGroupsUseCase import com.github.nullptroma.wallenc.usecases.StorageSyncEngine -import com.github.nullptroma.wallenc.usecases.StorageSyncReadiness -import com.github.nullptroma.wallenc.usecases.StorageFileManagementUseCase +import dagger.Binds import dagger.Module -import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) -class UseCasesModule { - @Provides - @Singleton - fun provideGetOpenedStoragesUseCase(unlockManager: IUnlockManager): GetOpenedStoragesUseCase { - return GetOpenedStoragesUseCase(unlockManager) - } +abstract class UseCasesModule { - @Provides + @Binds @Singleton - fun provideManageVaultUseCase(vaultsManager: IVaultsManager): ManageVaultUseCase { - return ManageVaultUseCase(vaultsManager) - } - - @Provides - @Singleton - fun provideFindStorageUseCase(vaultsManager: IVaultsManager): FindStorageUseCase { - return FindStorageUseCase(vaultsManager) - } - - @Provides - @Singleton - fun provideStorageFileManagementUseCase(): StorageFileManagementUseCase { - return StorageFileManagementUseCase() - } - - @Provides - @Singleton - fun provideRenameStorageUseCase(): RenameStorageUseCase { - return RenameStorageUseCase() - } - - @Provides - @Singleton - fun provideManageStoragesEncryptionUseCase( - unlockManager: IUnlockManager, - ): ManageStoragesEncryptionUseCase { - return ManageStoragesEncryptionUseCase(unlockManager) - } - - @Provides - @Singleton - fun provideRemoveStorageUseCase( - vaultsManager: IVaultsManager, - unlockManager: IUnlockManager, - manageStoragesEncryptionUseCase: ManageStoragesEncryptionUseCase, - ): RemoveStorageUseCase { - return RemoveStorageUseCase(vaultsManager, unlockManager, manageStoragesEncryptionUseCase) - } - - @Provides - @Singleton - fun provideManageTwoFaTokensUseCase(): ManageTwoFaTokensUseCase { - return ManageTwoFaTokensUseCase() - } - - @Provides - @Singleton - fun provideManageTextSecretsUseCase(): ManageTextSecretsUseCase { - return ManageTextSecretsUseCase() - } - - @Provides - @Singleton - fun provideStorageSyncEngine( - vaultsManager: IVaultsManager, - groupStore: IStorageSyncGroupStore, - findStorageUseCase: FindStorageUseCase, - ): IStorageSyncEngine = StorageSyncEngine( - vaultsManager = vaultsManager, - groupStore = groupStore, - findStorageUseCase = findStorageUseCase, - ) - - @Provides - @Singleton - fun provideManageStorageSyncGroupsUseCase( - groupStore: IStorageSyncGroupStore, - ): ManageStorageSyncGroupsUseCase = ManageStorageSyncGroupsUseCase(groupStore) - - @Provides - @Singleton - fun provideStorageSyncReadiness( - vaultsManager: IVaultsManager, - groupStore: IStorageSyncGroupStore, - findStorageUseCase: FindStorageUseCase, - ): StorageSyncReadiness = StorageSyncReadiness( - vaultsManager = vaultsManager, - groupStore = groupStore, - findStorageUseCase = findStorageUseCase, - ) - - @Provides - @Singleton - fun provideRunStorageSyncUseCase( - orchestrator: ITaskOrchestrator, - syncEngine: IStorageSyncEngine, - syncReadiness: StorageSyncReadiness, - ): RunStorageSyncUseCase = RunStorageSyncUseCase( - orchestrator = orchestrator, - syncEngine = syncEngine, - syncReadiness = syncReadiness, - ) -} \ No newline at end of file + abstract fun bindStorageSyncEngine(impl: StorageSyncEngine): IStorageSyncEngine +} diff --git a/usecases/build.gradle.kts b/usecases/build.gradle.kts index 7cb6383..c30d388 100644 --- a/usecases/build.gradle.kts +++ b/usecases/build.gradle.kts @@ -14,6 +14,7 @@ kotlin { } dependencies { + compileOnly("javax.inject:javax.inject:1") implementation(project(":domain")) implementation(libs.kotlinx.coroutines.core) implementation(libs.kotlinx.serialization.json) diff --git a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/FindStorageUseCase.kt b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/FindStorageUseCase.kt index c33e1b1..2fb8163 100644 --- a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/FindStorageUseCase.kt +++ b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/FindStorageUseCase.kt @@ -3,8 +3,11 @@ package com.github.nullptroma.wallenc.usecases import com.github.nullptroma.wallenc.domain.interfaces.IStorage import com.github.nullptroma.wallenc.domain.interfaces.IVaultsManager import java.util.UUID +import javax.inject.Inject +import javax.inject.Singleton -class FindStorageUseCase( +@Singleton +class FindStorageUseCase @Inject constructor( private val vaultsManager: IVaultsManager, ) { fun find(storageUuid: UUID): IStorage? { diff --git a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/GetOpenedStoragesUseCase.kt b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/GetOpenedStoragesUseCase.kt index 914a575..38f4301 100644 --- a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/GetOpenedStoragesUseCase.kt +++ b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/GetOpenedStoragesUseCase.kt @@ -4,8 +4,13 @@ import com.github.nullptroma.wallenc.domain.interfaces.IStorageInfo import com.github.nullptroma.wallenc.domain.interfaces.IUnlockManager import kotlinx.coroutines.flow.StateFlow import java.util.UUID +import javax.inject.Inject +import javax.inject.Singleton -class GetOpenedStoragesUseCase(private val unlockManager: IUnlockManager) { +@Singleton +class GetOpenedStoragesUseCase @Inject constructor( + private val unlockManager: IUnlockManager, +) { val openedStorages: StateFlow> get() = unlockManager.openedStorages } diff --git a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/ManageStorageSyncGroupsUseCase.kt b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/ManageStorageSyncGroupsUseCase.kt index 168e3b1..a6375b6 100644 --- a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/ManageStorageSyncGroupsUseCase.kt +++ b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/ManageStorageSyncGroupsUseCase.kt @@ -4,6 +4,8 @@ import com.github.nullptroma.wallenc.domain.interfaces.IStorageSyncGroupStore import com.github.nullptroma.wallenc.domain.interfaces.StorageSyncGroup import com.github.nullptroma.wallenc.domain.interfaces.StorageSyncGroupEncryptionKind import java.util.UUID +import javax.inject.Inject +import javax.inject.Singleton data class StorageSyncCompatibilityInput( val isEncrypted: Boolean, @@ -19,7 +21,8 @@ sealed interface AddStorageToSyncGroupResult { data object MissingEncryptionSecret : AddStorageToSyncGroupResult } -class ManageStorageSyncGroupsUseCase( +@Singleton +class ManageStorageSyncGroupsUseCase @Inject constructor( private val groupStore: IStorageSyncGroupStore, ) { suspend fun getGroups(): List = groupStore.getGroups() diff --git a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/ManageStoragesEncryptionUseCase.kt b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/ManageStoragesEncryptionUseCase.kt index 1da59fb..0e48011 100644 --- a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/ManageStoragesEncryptionUseCase.kt +++ b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/ManageStoragesEncryptionUseCase.kt @@ -7,8 +7,11 @@ import com.github.nullptroma.wallenc.domain.interfaces.IStorageInfo import com.github.nullptroma.wallenc.domain.interfaces.IUnlockManager import com.github.nullptroma.wallenc.domain.tasks.TaskProgress import kotlinx.coroutines.flow.first +import javax.inject.Inject +import javax.inject.Singleton -class ManageStoragesEncryptionUseCase( +@Singleton +class ManageStoragesEncryptionUseCase @Inject constructor( private val unlockManager: IUnlockManager, ) { sealed interface CanEncryptResult { diff --git a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/ManageTextSecretsUseCase.kt b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/ManageTextSecretsUseCase.kt index 141000a..0059964 100644 --- a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/ManageTextSecretsUseCase.kt +++ b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/ManageTextSecretsUseCase.kt @@ -21,8 +21,11 @@ import kotlinx.serialization.json.buildJsonObject import kotlinx.serialization.json.contentOrNull import kotlinx.serialization.json.jsonPrimitive import java.util.UUID +import javax.inject.Inject +import javax.inject.Singleton -class ManageTextSecretsUseCase { +@Singleton +class ManageTextSecretsUseCase @Inject constructor() { private val mutex = Mutex() fun observe(storageInfo: IStorageInfo): Flow> { diff --git a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/ManageTwoFaTokensUseCase.kt b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/ManageTwoFaTokensUseCase.kt index c985969..4b24600 100644 --- a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/ManageTwoFaTokensUseCase.kt +++ b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/ManageTwoFaTokensUseCase.kt @@ -18,8 +18,11 @@ import kotlinx.serialization.json.buildJsonObject import kotlinx.serialization.json.contentOrNull import kotlinx.serialization.json.jsonPrimitive import java.util.UUID +import javax.inject.Inject +import javax.inject.Singleton -class ManageTwoFaTokensUseCase { +@Singleton +class ManageTwoFaTokensUseCase @Inject constructor() { private val mutex = Mutex() fun observe(storageInfo: IStorageInfo): Flow> { diff --git a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/ManageVaultUseCase.kt b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/ManageVaultUseCase.kt index 67c6b1b..e9a0f1f 100644 --- a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/ManageVaultUseCase.kt +++ b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/ManageVaultUseCase.kt @@ -9,9 +9,14 @@ import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import java.util.UUID +import javax.inject.Inject +import javax.inject.Singleton @OptIn(ExperimentalCoroutinesApi::class) -class ManageVaultUseCase(private val manager: IVaultsManager) { +@Singleton +class ManageVaultUseCase @Inject constructor( + private val manager: IVaultsManager, +) { /** Найти vault по идентификатору в текущем состоянии. */ fun find(vaultUuid: UUID): IVault? = diff --git a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/RemoveStorageUseCase.kt b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/RemoveStorageUseCase.kt index e3365e8..da05424 100644 --- a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/RemoveStorageUseCase.kt +++ b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/RemoveStorageUseCase.kt @@ -6,8 +6,11 @@ import com.github.nullptroma.wallenc.domain.interfaces.IUnlockManager import com.github.nullptroma.wallenc.domain.interfaces.IVault import com.github.nullptroma.wallenc.domain.interfaces.IVaultsManager import java.util.UUID +import javax.inject.Inject +import javax.inject.Singleton -class RemoveStorageUseCase( +@Singleton +class RemoveStorageUseCase @Inject constructor( private val vaultsManager: IVaultsManager, private val unlockManager: IUnlockManager, private val manageStoragesEncryptionUseCase: ManageStoragesEncryptionUseCase, diff --git a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/RenameStorageUseCase.kt b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/RenameStorageUseCase.kt index 23427fc..b7a2ef9 100644 --- a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/RenameStorageUseCase.kt +++ b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/RenameStorageUseCase.kt @@ -2,8 +2,11 @@ package com.github.nullptroma.wallenc.usecases import com.github.nullptroma.wallenc.domain.interfaces.IStorage import com.github.nullptroma.wallenc.domain.interfaces.IStorageInfo +import javax.inject.Inject +import javax.inject.Singleton -class RenameStorageUseCase { +@Singleton +class RenameStorageUseCase @Inject constructor() { suspend fun rename(storage: IStorageInfo, newName: String) { when (storage) { is IStorage -> storage.rename(newName) 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 53e9258..e77e947 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 @@ -12,8 +12,11 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import java.util.concurrent.atomic.AtomicBoolean +import javax.inject.Inject +import javax.inject.Singleton -class RunStorageSyncUseCase( +@Singleton +class RunStorageSyncUseCase @Inject constructor( private val orchestrator: ITaskOrchestrator, private val syncEngine: IStorageSyncEngine, private val syncReadiness: StorageSyncReadiness, diff --git a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/StorageFileManagementUseCase.kt b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/StorageFileManagementUseCase.kt index 7a4259b..142b0a8 100644 --- a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/StorageFileManagementUseCase.kt +++ b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/StorageFileManagementUseCase.kt @@ -4,8 +4,11 @@ import com.github.nullptroma.wallenc.domain.interfaces.IDirectory import com.github.nullptroma.wallenc.domain.interfaces.IFile import com.github.nullptroma.wallenc.domain.interfaces.IStorage import com.github.nullptroma.wallenc.domain.interfaces.IStorageInfo +import javax.inject.Inject +import javax.inject.Singleton -class StorageFileManagementUseCase { +@Singleton +class StorageFileManagementUseCase @Inject constructor() { private var _storage: IStorage? = null fun setStorage(storage: IStorageInfo) { diff --git a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/StorageSyncEngine.kt b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/StorageSyncEngine.kt index df28233..73a037e 100644 --- a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/StorageSyncEngine.kt +++ b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/StorageSyncEngine.kt @@ -16,8 +16,11 @@ import java.time.Instant import java.util.UUID import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.atomic.AtomicLong +import javax.inject.Inject +import javax.inject.Singleton -class StorageSyncEngine( +@Singleton +class StorageSyncEngine @Inject constructor( private val vaultsManager: IVaultsManager, private val groupStore: IStorageSyncGroupStore, private val findStorageUseCase: FindStorageUseCase, diff --git a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/StorageSyncReadiness.kt b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/StorageSyncReadiness.kt index 1c415ee..215120f 100644 --- a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/StorageSyncReadiness.kt +++ b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/StorageSyncReadiness.kt @@ -4,11 +4,14 @@ import com.github.nullptroma.wallenc.domain.interfaces.IStorageSyncGroupStore import com.github.nullptroma.wallenc.domain.interfaces.IVaultsManager import kotlinx.coroutines.delay import java.util.UUID +import javax.inject.Inject +import javax.inject.Singleton /** * Ожидание готовности хранилищ перед синхронизацией (холодный старт из WorkManager). */ -class StorageSyncReadiness( +@Singleton +class StorageSyncReadiness @Inject constructor( private val vaultsManager: IVaultsManager, private val groupStore: IStorageSyncGroupStore, private val findStorageUseCase: FindStorageUseCase,