diff --git a/core/datasource/build.gradle.kts b/core/datasource/build.gradle.kts index 6aff99a356..06a4d5180e 100644 --- a/core/datasource/build.gradle.kts +++ b/core/datasource/build.gradle.kts @@ -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) diff --git a/core/datasource/src/main/java/com/tangem/datasource/config/models/ProviderModel.kt b/core/datasource/src/main/java/com/tangem/datasource/config/models/ProviderModel.kt new file mode 100644 index 0000000000..6bd7f5c07a --- /dev/null +++ b/core/datasource/src/main/java/com/tangem/datasource/config/models/ProviderModel.kt @@ -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() +} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/di/MoshiModule.kt b/core/datasource/src/main/java/com/tangem/datasource/di/MoshiModule.kt index c22d4433bf..3884c6c9a5 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/di/MoshiModule.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/di/MoshiModule.kt @@ -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()) diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index e0891747f6..eab18a906d 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -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" } diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/DefaultBlockchainSDKFactory.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/DefaultBlockchainSDKFactory.kt index 7b059dfa48..891dbc65b8 100644 --- a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/DefaultBlockchainSDKFactory.kt +++ b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/DefaultBlockchainSDKFactory.kt @@ -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 by lazy(::createWalletManagerFactory) override suspend fun init() { - val configValueModel = configLoader.load() ?: return + val configValueModel = assetLoader.load(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}" + } } \ No newline at end of file diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/di/BlockchainSDKFactoryModule.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/di/BlockchainSDKFactoryModule.kt index 995369e069..4228700264 100644 --- a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/di/BlockchainSDKFactoryModule.kt +++ b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/di/BlockchainSDKFactoryModule.kt @@ -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, - ) - } } \ No newline at end of file diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/loader/ConfigLoader.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/loader/ConfigLoader.kt deleted file mode 100644 index 570013fd4a..0000000000 --- a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/loader/ConfigLoader.kt +++ /dev/null @@ -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? -} \ No newline at end of file diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/loader/LocalConfigLoader.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/loader/LocalConfigLoader.kt deleted file mode 100644 index a73d01c6ff..0000000000 --- a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/loader/LocalConfigLoader.kt +++ /dev/null @@ -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 = 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 - }, - ) - } -} \ No newline at end of file