Updated on 2026-08-14

This commit is contained in:
Tangem 2024-04-12 20:29:29 +08:00
parent 7907c61101
commit 861f650cd4
8 changed files with 56 additions and 91 deletions

View file

@ -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}"
}
}

View file

@ -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,
)
}
}

View file

@ -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?
}

View file

@ -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
},
)
}
}