Большой рефакторинг
Из domain выкинуты типы vault, теперь он ничего не знает о Yandex. Объявления провайдеров вынесены в vault-api, а реализации в data
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user