Большой рефакторинг

Из domain выкинуты типы vault, теперь он ничего не знает о Yandex. Объявления провайдеров вынесены в vault-api, а реализации в data
This commit is contained in:
2026-04-27 02:47:02 +03:00
parent 2b1be58a8e
commit 1034e134c2
37 changed files with 527 additions and 219 deletions

View File

@@ -3,8 +3,10 @@ package com.github.nullptroma.wallenc.app.auth
import android.content.Context
import androidx.activity.ComponentActivity
import androidx.activity.result.ActivityResultLauncher
import com.github.nullptroma.wallenc.domain.auth.RemoteYandexAuthResult
import com.github.nullptroma.wallenc.domain.auth.RemoteYandexSignInLauncher
import com.github.nullptroma.wallenc.data.vaults.yandex.YandexRegistration
import com.github.nullptroma.wallenc.vaultapi.CloudBrand
import com.github.nullptroma.wallenc.vaultapi.RemoteVaultAuthenticator
import com.github.nullptroma.wallenc.vaultapi.VaultLinkOutcome
import com.yandex.authsdk.YandexAuthLoginOptions
import com.yandex.authsdk.YandexAuthOptions
import com.yandex.authsdk.YandexAuthResult
@@ -21,11 +23,15 @@ import javax.inject.Singleton
*
* При смене конфигурации новая Activity может вызвать [registerWith] до [unregister] старой —
* тогда владелец и launcher обновляются; [unregister] для уже неактуального экземпляра — no-op.
*
* Реализует [RemoteVaultAuthenticator] из `:vault-api`: presentation про Yandex SDK
* ничего не знает, а получает обобщённый [VaultLinkOutcome] с готовой
* `VaultRegistration` внутри.
*/
@Singleton
class YandexSignInService @Inject constructor(
@ApplicationContext appContext: Context,
) : RemoteYandexSignInLauncher {
) : RemoteVaultAuthenticator {
private val sdk = YandexAuthSdk.create(YandexAuthOptions(appContext, true))
@@ -34,7 +40,7 @@ class YandexSignInService @Inject constructor(
private var registrationOwner: ComponentActivity? = null
@Volatile
private var pending: ((RemoteYandexAuthResult) -> Unit)? = null
private var pending: ((VaultLinkOutcome) -> Unit)? = null
fun registerWith(activity: ComponentActivity) {
if (registrationOwner === activity && launcher != null) return
@@ -59,25 +65,34 @@ class YandexSignInService @Inject constructor(
pending = null
p
}
cb?.invoke(RemoteYandexAuthResult.Cancelled)
cb?.invoke(VaultLinkOutcome.Cancelled)
}
override fun launch(onResult: (RemoteYandexAuthResult) -> Unit) {
val l = launcher
?: error("YandexSignInService: call registerWith(activity) from MainActivity.onCreate first")
synchronized(this) {
pending = onResult
override fun beginLink(brand: CloudBrand, onResult: (VaultLinkOutcome) -> Unit) {
if (brand != CloudBrand.YANDEX) {
onResult(VaultLinkOutcome.Failed("Brand $brand is not supported by YandexSignInService"))
return
}
val l = launcher
if (l == null) {
onResult(
VaultLinkOutcome.Failed(
"YandexSignInService: call registerWith(activity) from MainActivity.onCreate first",
),
)
return
}
synchronized(this) { pending = onResult }
l.launch(YandexAuthLoginOptions(LoginType.WEBVIEW))
}
private fun mapYandexResult(result: YandexAuthResult): RemoteYandexAuthResult = when (result) {
private fun mapYandexResult(result: YandexAuthResult): VaultLinkOutcome = when (result) {
is YandexAuthResult.Success ->
RemoteYandexAuthResult.Success(result.token.value)
VaultLinkOutcome.Success(YandexRegistration(result.token.value))
is YandexAuthResult.Failure ->
RemoteYandexAuthResult.Failure(
VaultLinkOutcome.Failed(
result.exception.message ?: result.exception.toString(),
)
YandexAuthResult.Cancelled -> RemoteYandexAuthResult.Cancelled
YandexAuthResult.Cancelled -> VaultLinkOutcome.Cancelled
}
}

View File

@@ -1,7 +1,7 @@
package com.github.nullptroma.wallenc.app.di.modules.auth
import com.github.nullptroma.wallenc.app.auth.YandexSignInService
import com.github.nullptroma.wallenc.domain.auth.RemoteYandexSignInLauncher
import com.github.nullptroma.wallenc.vaultapi.RemoteVaultAuthenticator
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
@@ -14,7 +14,7 @@ abstract class YandexAuthModule {
@Binds
@Singleton
abstract fun bindRemoteYandexSignInLauncher(
abstract fun bindRemoteVaultAuthenticator(
impl: YandexSignInService,
): RemoteYandexSignInLauncher
): RemoteVaultAuthenticator
}

View File

@@ -16,6 +16,7 @@ import com.github.nullptroma.wallenc.data.vaults.VaultsManager
import com.github.nullptroma.wallenc.domain.interfaces.IUnlockManager
import com.github.nullptroma.wallenc.domain.interfaces.IVaultsManager
import com.github.nullptroma.wallenc.domain.tasks.ITaskOrchestrator
import com.github.nullptroma.wallenc.vaultapi.VaultRegistrar
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
@@ -45,7 +46,7 @@ class SingletonModule {
keyRepo: StorageKeyMapRepository,
yandexAccountRepository: YandexAccountRepository,
yandexUserInfoRepository: YandexUserInfoRepository,
): IVaultsManager {
): VaultsManager {
return VaultsManager(
ioDispatcher = ioDispatcher,
context = context,
@@ -55,6 +56,14 @@ class SingletonModule {
)
}
@Provides
@Singleton
fun provideIVaultsManager(impl: VaultsManager): IVaultsManager = impl
@Provides
@Singleton
fun provideVaultRegistrar(impl: VaultsManager): VaultRegistrar = impl
@Provides
fun provideUnlockManager(
vaultsManager: IVaultsManager

View File

@@ -3,8 +3,8 @@ package com.github.nullptroma.wallenc.app.di.modules.domain
import com.github.nullptroma.wallenc.domain.interfaces.IUnlockManager
import com.github.nullptroma.wallenc.domain.interfaces.IVaultsManager
import com.github.nullptroma.wallenc.domain.usecases.GetOpenedStoragesUseCase
import com.github.nullptroma.wallenc.domain.usecases.ManageLocalVaultUseCase
import com.github.nullptroma.wallenc.domain.usecases.ManageStoragesEncryptionUseCase
import com.github.nullptroma.wallenc.domain.usecases.ManageVaultUseCase
import com.github.nullptroma.wallenc.domain.usecases.RemoveStorageUseCase
import com.github.nullptroma.wallenc.domain.usecases.RenameStorageUseCase
import com.github.nullptroma.wallenc.domain.usecases.StorageFileManagementUseCase
@@ -25,8 +25,8 @@ class UseCasesModule {
@Provides
@Singleton
fun provideManageLocalVaultUseCase(vaultsManager: IVaultsManager): ManageLocalVaultUseCase {
return ManageLocalVaultUseCase(vaultsManager)
fun provideManageVaultUseCase(vaultsManager: IVaultsManager): ManageVaultUseCase {
return ManageVaultUseCase(vaultsManager)
}
@Provides