Updated on 2026-08-14
This commit is contained in:
parent
7907c61101
commit
861f650cd4
8 changed files with 56 additions and 91 deletions
|
|
@ -39,6 +39,7 @@ dependencies {
|
|||
/** Network */
|
||||
implementation(deps.moshi)
|
||||
implementation(deps.moshi.kotlin)
|
||||
implementation(deps.moshi.adapters)
|
||||
implementation(deps.okHttp)
|
||||
implementation(deps.okHttp.prettyLogging)
|
||||
implementation(deps.retrofit)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,32 @@
|
|||
package com.tangem.datasource.config.models
|
||||
|
||||
import com.squareup.moshi.Json
|
||||
|
||||
/** Config provider model */
|
||||
sealed class ProviderModel {
|
||||
|
||||
/**
|
||||
* Example,
|
||||
* {
|
||||
* "type": "public",
|
||||
* "url": "https://example.com"
|
||||
* }
|
||||
*/
|
||||
data class Public(
|
||||
@Json(name = "url") val url: String,
|
||||
) : ProviderModel()
|
||||
|
||||
/**
|
||||
* Example,
|
||||
* {
|
||||
* "type": "private",
|
||||
* "name": "nownodes"
|
||||
* }
|
||||
*/
|
||||
data class Private(
|
||||
@Json(name = "name") val name: String,
|
||||
) : ProviderModel()
|
||||
|
||||
/** Unsupported type */
|
||||
data object UnsupportedType : ProviderModel()
|
||||
}
|
||||
|
|
@ -1,11 +1,13 @@
|
|||
package com.tangem.datasource.di
|
||||
|
||||
import com.squareup.moshi.Moshi
|
||||
import com.squareup.moshi.adapters.PolymorphicJsonAdapterFactory
|
||||
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
|
||||
import com.tangem.common.json.MoshiJsonConverter
|
||||
import com.tangem.datasource.api.common.BigDecimalAdapter
|
||||
import com.tangem.datasource.api.common.DateTimeAdapter
|
||||
import com.tangem.datasource.api.common.LocalDateAdapter
|
||||
import com.tangem.datasource.config.models.ProviderModel
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
import dagger.hilt.InstallIn
|
||||
|
|
@ -21,6 +23,12 @@ class MoshiModule {
|
|||
@NetworkMoshi
|
||||
fun provideNetworkMoshi(): Moshi {
|
||||
return Moshi.Builder()
|
||||
.add(
|
||||
PolymorphicJsonAdapterFactory.of(ProviderModel::class.java, "type")
|
||||
.withSubtype(ProviderModel.Public::class.java, "public")
|
||||
.withSubtype(ProviderModel.Private::class.java, "private")
|
||||
.withDefaultValue(ProviderModel.UnsupportedType),
|
||||
)
|
||||
.add(BigDecimalAdapter())
|
||||
.add(LocalDateAdapter())
|
||||
.add(DateTimeAdapter())
|
||||
|
|
|
|||
|
|
@ -223,6 +223,7 @@ lottie = { module = "com.airbnb.android:lottie", version.ref = "lottie" }
|
|||
material = { module = "com.google.android.material:material", version.ref = "googleMaterialComponent" }
|
||||
moshi = { module = "com.squareup.moshi:moshi", version.ref = "moshi" }
|
||||
moshi-kotlin = { module = "com.squareup.moshi:moshi-kotlin", version.ref = "moshi" }
|
||||
moshi-adapters = { module = "com.squareup.moshi:moshi-adapters", version.ref = "moshi" }
|
||||
okHttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" }
|
||||
okHttp-prettyLogging = { module = "com.github.ihsanbal:LoggingInterceptor", version.ref = "okHttp-prettyLogging" }
|
||||
spongecastle-core = { module = "com.madgag.spongycastle:core", version.ref = "spongycastleCryptoCore" }
|
||||
|
|
|
|||
|
|
@ -6,7 +6,9 @@ import com.tangem.blockchain.common.datastorage.BlockchainDataStorage
|
|||
import com.tangem.blockchain.common.logging.BlockchainSDKLogger
|
||||
import com.tangem.blockchainsdk.config.ConfigStorage
|
||||
import com.tangem.blockchainsdk.converters.BlockchainSDKConfigConverter
|
||||
import com.tangem.blockchainsdk.loader.ConfigLoader
|
||||
import com.tangem.datasource.asset.loader.AssetLoader
|
||||
import com.tangem.datasource.config.models.ConfigValueModel
|
||||
import com.tangem.libs.blockchain_sdk.BuildConfig
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.firstOrNull
|
||||
import kotlinx.coroutines.flow.map
|
||||
|
|
@ -14,7 +16,7 @@ import kotlinx.coroutines.flow.map
|
|||
/**
|
||||
* Implementation of Blockchain SDK components factory
|
||||
*
|
||||
* @property configLoader config loader
|
||||
* @property assetLoader asset loader
|
||||
* @property configStorage config storage
|
||||
* @property accountCreator account creator
|
||||
* @property blockchainDataStorage blockchain data storage
|
||||
|
|
@ -23,7 +25,7 @@ import kotlinx.coroutines.flow.map
|
|||
[REDACTED_AUTHOR]
|
||||
*/
|
||||
internal class DefaultBlockchainSDKFactory(
|
||||
private val configLoader: ConfigLoader,
|
||||
private val assetLoader: AssetLoader,
|
||||
private val configStorage: ConfigStorage,
|
||||
private val accountCreator: AccountCreator,
|
||||
private val blockchainDataStorage: BlockchainDataStorage,
|
||||
|
|
@ -33,7 +35,7 @@ internal class DefaultBlockchainSDKFactory(
|
|||
override val walletManagerFactory: Flow<WalletManagerFactory> by lazy(::createWalletManagerFactory)
|
||||
|
||||
override suspend fun init() {
|
||||
val configValueModel = configLoader.load() ?: return
|
||||
val configValueModel = assetLoader.load<ConfigValueModel>(CONFIG_FILE_NAME) ?: return
|
||||
|
||||
configStorage.store(
|
||||
config = BlockchainSDKConfigConverter.convert(value = configValueModel),
|
||||
|
|
@ -52,4 +54,9 @@ internal class DefaultBlockchainSDKFactory(
|
|||
)
|
||||
}
|
||||
}
|
||||
|
||||
private companion object {
|
||||
|
||||
const val CONFIG_FILE_NAME = "tangem-app-config/config_${BuildConfig.ENVIRONMENT}"
|
||||
}
|
||||
}
|
||||
|
|
@ -1,21 +1,15 @@
|
|||
package com.tangem.blockchainsdk.di
|
||||
|
||||
import com.squareup.moshi.Moshi
|
||||
import com.tangem.blockchain.common.logging.BlockchainSDKLogger
|
||||
import com.tangem.blockchainsdk.BlockchainSDKFactory
|
||||
import com.tangem.blockchainsdk.DefaultBlockchainSDKFactory
|
||||
import com.tangem.blockchainsdk.accountcreator.DefaultAccountCreator
|
||||
import com.tangem.blockchainsdk.config.RuntimeConfigStorage
|
||||
import com.tangem.blockchainsdk.datastorage.DefaultBlockchainDataStorage
|
||||
import com.tangem.blockchainsdk.loader.ConfigLoader
|
||||
import com.tangem.blockchainsdk.loader.LocalConfigLoader
|
||||
import com.tangem.datasource.api.common.AuthProvider
|
||||
import com.tangem.datasource.api.tangemTech.TangemTechApi
|
||||
import com.tangem.datasource.asset.reader.AssetReader
|
||||
import com.tangem.datasource.di.SdkMoshi
|
||||
import com.tangem.datasource.asset.loader.AssetLoader
|
||||
import com.tangem.datasource.local.preferences.AppPreferencesStore
|
||||
import com.tangem.libs.blockchain_sdk.BuildConfig
|
||||
import com.tangem.utils.coroutines.AppCoroutineDispatcherProvider
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
import dagger.hilt.InstallIn
|
||||
|
|
@ -29,33 +23,18 @@ internal object BlockchainSDKFactoryModule {
|
|||
@Provides
|
||||
@Singleton
|
||||
fun provideBlockchainSDKFactory(
|
||||
@SdkMoshi moshi: Moshi,
|
||||
assetReader: AssetReader,
|
||||
dispatchers: AppCoroutineDispatcherProvider,
|
||||
assetLoader: AssetLoader,
|
||||
authProvider: AuthProvider,
|
||||
tangemTechApi: TangemTechApi,
|
||||
appPreferencesStore: AppPreferencesStore,
|
||||
blockchainSDKLogger: BlockchainSDKLogger,
|
||||
): BlockchainSDKFactory {
|
||||
return DefaultBlockchainSDKFactory(
|
||||
configLoader = createConfigLoader(moshi, assetReader, dispatchers),
|
||||
assetLoader = assetLoader,
|
||||
configStorage = RuntimeConfigStorage(),
|
||||
accountCreator = DefaultAccountCreator(authProvider, tangemTechApi),
|
||||
blockchainDataStorage = DefaultBlockchainDataStorage(appPreferencesStore),
|
||||
blockchainSDKLogger = blockchainSDKLogger,
|
||||
)
|
||||
}
|
||||
|
||||
private fun createConfigLoader(
|
||||
moshi: Moshi,
|
||||
assetReader: AssetReader,
|
||||
dispatchers: AppCoroutineDispatcherProvider,
|
||||
): ConfigLoader {
|
||||
return LocalConfigLoader(
|
||||
buildEnvironment = BuildConfig.ENVIRONMENT,
|
||||
moshi = moshi,
|
||||
assetReader = assetReader,
|
||||
dispatchers = dispatchers,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
package com.tangem.blockchainsdk.loader
|
||||
|
||||
import com.tangem.datasource.config.models.ConfigValueModel
|
||||
|
||||
/**
|
||||
* Config loader
|
||||
*
|
||||
[REDACTED_AUTHOR]
|
||||
*/
|
||||
internal interface ConfigLoader {
|
||||
|
||||
/** Load config [ConfigValueModel] */
|
||||
suspend fun load(): ConfigValueModel?
|
||||
}
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
package com.tangem.blockchainsdk.loader
|
||||
|
||||
import com.squareup.moshi.JsonAdapter
|
||||
import com.squareup.moshi.Moshi
|
||||
import com.squareup.moshi.adapter
|
||||
import com.tangem.datasource.asset.reader.AssetReader
|
||||
import com.tangem.datasource.config.models.ConfigValueModel
|
||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||
import com.tangem.utils.coroutines.runCatching
|
||||
import timber.log.Timber
|
||||
|
||||
/**
|
||||
* Local config loader
|
||||
*
|
||||
* @param buildEnvironment build environment that defines config file name
|
||||
* @param moshi moshi
|
||||
* @property assetReader asset reader
|
||||
* @property dispatchers dispatchers
|
||||
*/
|
||||
internal class LocalConfigLoader(
|
||||
buildEnvironment: String,
|
||||
moshi: Moshi,
|
||||
private val assetReader: AssetReader,
|
||||
private val dispatchers: CoroutineDispatcherProvider,
|
||||
) : ConfigLoader {
|
||||
|
||||
private val configFileName = "tangem-app-config/config_$buildEnvironment"
|
||||
|
||||
@OptIn(ExperimentalStdlibApi::class)
|
||||
private val adapter: JsonAdapter<ConfigValueModel> = moshi.adapter()
|
||||
|
||||
@Deprecated(message = "Use AssetReader instead")
|
||||
override suspend fun load(): ConfigValueModel? {
|
||||
return runCatching(dispatchers.io) {
|
||||
val json = assetReader.readJson(fileName = configFileName)
|
||||
adapter.fromJson(json)
|
||||
}
|
||||
.fold(
|
||||
onSuccess = { parsedConfig ->
|
||||
if (parsedConfig == null) Timber.e(IllegalStateException("Parsed config is null"))
|
||||
parsedConfig
|
||||
},
|
||||
onFailure = {
|
||||
Timber.e(it, "Failed to load config from assets")
|
||||
null
|
||||
},
|
||||
)
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue