diff --git a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/TesterActivity.kt b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/TesterActivity.kt index 5a9fbd3fe3..23e833f935 100644 --- a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/TesterActivity.kt +++ b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/TesterActivity.kt @@ -135,7 +135,7 @@ internal class TesterActivity : ComposeActivity() { composable(route = TesterScreen.BLOCKCHAIN_PROVIDERS.name) { val viewModel = hiltViewModel().apply { - setupNavigation(innerTesterRouter) + setupNavigation(innerTesterRouter, appFinisher) } val state by viewModel.state.collectAsStateWithLifecycle() diff --git a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/providers/entity/BlockchainProvidersUM.kt b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/providers/entity/BlockchainProvidersUM.kt index f63f49d696..53571d98f9 100644 --- a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/providers/entity/BlockchainProvidersUM.kt +++ b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/providers/entity/BlockchainProvidersUM.kt @@ -10,6 +10,7 @@ internal data class BlockchainProvidersUM( val topBar: TopBarWithRefreshUM, val searchBar: SearchBarUM, val blockchainProviders: ImmutableList, + val onRestartAppClick: () -> Unit, ) { @Immutable diff --git a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/providers/ui/BlockchainProvidersScreen.kt b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/providers/ui/BlockchainProvidersScreen.kt index fab6c7afac..908033f11b 100644 --- a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/providers/ui/BlockchainProvidersScreen.kt +++ b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/providers/ui/BlockchainProvidersScreen.kt @@ -30,6 +30,7 @@ import androidx.compose.ui.util.fastForEachIndexed import com.tangem.blockchain.common.network.providers.ProviderType import com.tangem.core.ui.components.AdditionalTextInputDialogUM import com.tangem.core.ui.components.DialogButtonUM +import com.tangem.core.ui.components.PrimaryButton import com.tangem.core.ui.components.TextInputDialog import com.tangem.core.ui.components.fields.SearchBar import com.tangem.core.ui.components.fields.entity.SearchBarUM @@ -59,7 +60,7 @@ internal fun BlockchainProvidersScreen(state: BlockchainProvidersUM) { .fillMaxSize() .background(TangemTheme.colors.background.primary), ) { - LazyColumn { + LazyColumn(contentPadding = PaddingValues(bottom = 64.dp)) { stickyHeader { Header(topBar = state.topBar, searchBar = state.searchBar) } @@ -85,6 +86,15 @@ internal fun BlockchainProvidersScreen(state: BlockchainProvidersUM) { itemContent = { BlockchainProvidersItem(it) }, ) } + + PrimaryButton( + text = stringResourceSafe(id = R.string.restart_app), + onClick = state.onRestartAppClick, + modifier = Modifier + .align(Alignment.BottomCenter) + .fillMaxWidth() + .padding(TangemTheme.dimens.spacing16), + ) } } @@ -427,6 +437,7 @@ private fun Preview_BlockchainProvidersScreen() { ), ), ), + onRestartAppClick = {}, ), ) } diff --git a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/providers/viewmodel/BlockchainProvidersViewModel.kt b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/providers/viewmodel/BlockchainProvidersViewModel.kt index 97cf7d9d36..97c4512a84 100644 --- a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/providers/viewmodel/BlockchainProvidersViewModel.kt +++ b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/providers/viewmodel/BlockchainProvidersViewModel.kt @@ -7,6 +7,7 @@ import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.network.providers.ProviderType import com.tangem.blockchainsdk.providers.BlockchainProvidersTypesManager import com.tangem.blockchainsdk.providers.MutableBlockchainProvidersTypesManager +import com.tangem.core.navigation.finisher.AppFinisher import com.tangem.core.ui.components.fields.entity.SearchBarUM import com.tangem.core.ui.extensions.resourceReference import com.tangem.feature.tester.impl.R @@ -46,6 +47,7 @@ internal class BlockchainProvidersViewModel @Inject constructor( onActiveChange = {}, ), blockchainProviders = persistentListOf(), + onRestartAppClick = {}, ), ) @@ -57,10 +59,11 @@ internal class BlockchainProvidersViewModel @Inject constructor( subscribeOnBlockchainProviderTypesUpdates() } - fun setupNavigation(router: InnerTesterRouter) { + fun setupNavigation(router: InnerTesterRouter, appFinisher: AppFinisher) { _state.update { state -> state.copy( topBar = state.topBar.copy(onBackClick = router::back), + onRestartAppClick = appFinisher::restart, ) } } @@ -116,7 +119,7 @@ internal class BlockchainProvidersViewModel @Inject constructor( private fun onRefreshClick() { viewModelScope.launch { - manager.update() + manager.recoverInitialState() } } diff --git a/libs/blockchain-sdk/build.gradle.kts b/libs/blockchain-sdk/build.gradle.kts index bdbb9dde4f..12234d749f 100644 --- a/libs/blockchain-sdk/build.gradle.kts +++ b/libs/blockchain-sdk/build.gradle.kts @@ -4,6 +4,7 @@ plugins { alias(deps.plugins.android.library) alias(deps.plugins.kotlin.android) alias(deps.plugins.kotlin.kapt) + alias(deps.plugins.hilt.android) id("configuration") } @@ -24,7 +25,7 @@ dependencies { // endregion // region DI libraries - implementation(deps.hilt.core) + implementation(deps.hilt.android) kapt(deps.hilt.kapt) // endregion diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/converters/BlockchainProviderTypesConverter.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/converters/BlockchainProviderTypesConverter.kt index e1a287d634..b988b3fce1 100644 --- a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/converters/BlockchainProviderTypesConverter.kt +++ b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/converters/BlockchainProviderTypesConverter.kt @@ -1,39 +1,43 @@ package com.tangem.blockchainsdk.converters import com.tangem.blockchain.common.Blockchain -import com.tangem.blockchain.common.network.providers.ProviderType import com.tangem.blockchainsdk.BlockchainProvidersResponse import com.tangem.blockchainsdk.providers.BlockchainProviderTypes -import com.tangem.blockchainsdk.utils.createPrivateProviderType import com.tangem.blockchainsdk.utils.fromNetworkId -import com.tangem.datasource.local.config.providers.models.ProviderModel -import com.tangem.utils.converter.Converter +import com.tangem.blockchainsdk.utils.toNetworkId +import com.tangem.utils.converter.TwoWayConverter import timber.log.Timber /** - * Converts [BlockchainProvidersResponse] to [BlockchainProviderTypes] + * Converts [BlockchainProvidersResponse] to [BlockchainProviderTypes] and vice versa * [REDACTED_AUTHOR] */ internal object BlockchainProviderTypesConverter : - Converter { + TwoWayConverter { override fun convert(value: BlockchainProvidersResponse): BlockchainProviderTypes { return value.mapNotNull { (networkId, blockchainProviders) -> val blockchain = Blockchain.fromNetworkId(networkId) ?: return@mapNotNull null - val providerTypes = blockchainProviders.mapNotNull { provider -> - when (provider) { - is ProviderModel.Public -> ProviderType.Public(url = provider.url) - is ProviderModel.Private -> createPrivateProviderType(name = provider.name) - ProviderModel.UnsupportedType -> { - Timber.e("$blockchain provider type is not supported") - null - } - } + val providerTypes = ProviderTypeConverter.convertList(input = blockchainProviders) + + providerTypes.forEach { + if (it == null) Timber.e("$blockchain provider type is not supported") } - blockchain to providerTypes + blockchain to providerTypes.filterNotNull() + } + .toMap() + } + + override fun convertBack(value: BlockchainProviderTypes): BlockchainProvidersResponse { + return value.mapNotNull { (blockchain, providerTypes) -> + val networkId = blockchain.toNetworkId() + + val blockchainProviders = ProviderTypeConverter.convertListBack(input = providerTypes) + + networkId to blockchainProviders } .toMap() } diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/converters/ProviderTypeConverter.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/converters/ProviderTypeConverter.kt new file mode 100644 index 0000000000..9958db8a21 --- /dev/null +++ b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/converters/ProviderTypeConverter.kt @@ -0,0 +1,35 @@ +package com.tangem.blockchainsdk.converters + +import com.tangem.blockchain.common.network.providers.ProviderType +import com.tangem.blockchainsdk.providers.ProviderTypeIdMapping +import com.tangem.datasource.local.config.providers.models.ProviderModel +import com.tangem.utils.converter.TwoWayConverter + +/** + * Converts [ProviderModel] to [ProviderType] and vice versa + * +[REDACTED_AUTHOR] + */ +internal object ProviderTypeConverter : TwoWayConverter { + + override fun convert(value: ProviderModel): ProviderType? { + return when (value) { + is ProviderModel.Public -> ProviderType.Public(url = value.url) + is ProviderModel.Private -> ProviderTypeIdMapping.entries.firstOrNull { it.id == value.name }?.providerType + ProviderModel.UnsupportedType -> null + } + } + + override fun convertBack(value: ProviderType?): ProviderModel { + return when (value) { + null -> ProviderModel.UnsupportedType + is ProviderType.Public -> ProviderModel.Public(url = value.url) + else -> { + val id = ProviderTypeIdMapping.entries.firstOrNull { it.providerType == value }?.id + ?: return ProviderModel.UnsupportedType + + ProviderModel.Private(id) + } + } + } +} \ 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 ec39268431..0e46908b4f 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,17 +1,26 @@ package com.tangem.blockchainsdk.di +import android.content.Context +import androidx.datastore.core.DataStore +import androidx.datastore.core.DataStoreFactory +import androidx.datastore.dataStoreFile +import com.squareup.moshi.Moshi import com.tangem.blockchain.common.logging.BlockchainSDKLogger +import com.tangem.blockchainsdk.BlockchainProvidersResponse import com.tangem.blockchainsdk.BlockchainSDKFactory import com.tangem.blockchainsdk.DefaultBlockchainSDKFactory import com.tangem.blockchainsdk.WalletManagerFactoryCreator import com.tangem.blockchainsdk.accountcreator.DefaultAccountCreator import com.tangem.blockchainsdk.datastorage.DefaultBlockchainDataStorage import com.tangem.blockchainsdk.featuretoggles.DefaultBlockchainSDKFeatureToggles +import com.tangem.blockchainsdk.providers.BlockchainProviderTypesStore import com.tangem.blockchainsdk.providers.BlockchainProvidersTypesManager import com.tangem.blockchainsdk.providers.DevBlockchainProvidersTypesManager import com.tangem.blockchainsdk.providers.ProdBlockchainProvidersTypesManager +import com.tangem.blockchainsdk.providers.dev.BlockchainProvidersResponseSerializer import com.tangem.core.configtoggle.feature.FeatureTogglesManager import com.tangem.datasource.api.tangemTech.TangemTechApi +import com.tangem.datasource.di.NetworkMoshi import com.tangem.datasource.local.config.environment.EnvironmentConfigStorage import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.libs.blockchain_sdk.BuildConfig @@ -19,7 +28,10 @@ import com.tangem.utils.coroutines.CoroutineDispatcherProvider import dagger.Module import dagger.Provides import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.SupervisorJob import javax.inject.Singleton @Module @@ -45,16 +57,35 @@ internal object BlockchainSDKFactoryModule { @Provides @Singleton fun provideBlockchainProvidersTypesManager( - devBlockchainProvidersTypesManager: DevBlockchainProvidersTypesManager, prodBlockchainProvidersTypesManager: ProdBlockchainProvidersTypesManager, + blockchainProviderTypesStore: BlockchainProviderTypesStore, + changedBlockchainProvidersStore: DataStore, ): BlockchainProvidersTypesManager { - return if (BuildConfig.DEBUG) { - devBlockchainProvidersTypesManager + return if (BuildConfig.TESTER_MENU_ENABLED) { + DevBlockchainProvidersTypesManager( + prodBlockchainProvidersTypesManager = prodBlockchainProvidersTypesManager, + blockchainProviderTypesStore = blockchainProviderTypesStore, + changedBlockchainProvidersStore = changedBlockchainProvidersStore, + ) } else { prodBlockchainProvidersTypesManager } } + @Provides + @Singleton + fun provideChangedBlockchainProvidersResponseDataStore( + @NetworkMoshi moshi: Moshi, + @ApplicationContext context: Context, + dispatchers: CoroutineDispatcherProvider, + ): DataStore { + return DataStoreFactory.create( + serializer = BlockchainProvidersResponseSerializer(moshi), + produceFile = { context.dataStoreFile("changed_providers") }, + scope = CoroutineScope(dispatchers.io + SupervisorJob()), + ) + } + @Provides @Singleton fun provideWalletManagerFactoryCreator( diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/BlockchainProvidersResponseMerger.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/BlockchainProvidersResponseMerger.kt index 8afaacc12d..ec57ec97ac 100644 --- a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/BlockchainProvidersResponseMerger.kt +++ b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/BlockchainProvidersResponseMerger.kt @@ -3,7 +3,6 @@ package com.tangem.blockchainsdk.providers import androidx.core.util.PatternsCompat import com.google.firebase.crashlytics.FirebaseCrashlytics import com.tangem.blockchainsdk.BlockchainProvidersResponse -import com.tangem.blockchainsdk.utils.createPrivateProviderType import com.tangem.datasource.local.config.providers.models.ProviderModel import timber.log.Timber @@ -48,11 +47,11 @@ internal object BlockchainProvidersResponseMerger { return result.guaranteeUrlsEndWithSlash() } - private fun List.filterUnsupportedProviders() = filter { - val isSupportedType = it !is ProviderModel.UnsupportedType + private fun List.filterUnsupportedProviders() = filter { model -> + val isSupportedType = model !is ProviderModel.UnsupportedType - val isSupportedPrivateType = if (it is ProviderModel.Private) { - createPrivateProviderType(it.name) != null + val isSupportedPrivateType = if (model is ProviderModel.Private) { + ProviderTypeIdMapping.entries.any { it.id == model.name } } else { true } diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/BlockchainProvidersTypesManager.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/BlockchainProvidersTypesManager.kt index af43d092c8..6b2d23a725 100644 --- a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/BlockchainProvidersTypesManager.kt +++ b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/BlockchainProvidersTypesManager.kt @@ -1,11 +1,11 @@ package com.tangem.blockchainsdk.providers -import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.Flow /** Blockchain providers types manager */ interface BlockchainProvidersTypesManager { - fun get(): StateFlow + fun get(): Flow suspend fun update() } \ No newline at end of file diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/DevBlockchainProvidersTypesManager.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/DevBlockchainProvidersTypesManager.kt index 479c90f1d2..8af47fd124 100644 --- a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/DevBlockchainProvidersTypesManager.kt +++ b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/DevBlockchainProvidersTypesManager.kt @@ -1,45 +1,68 @@ package com.tangem.blockchainsdk.providers +import androidx.datastore.core.DataStore import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.network.providers.ProviderType -import javax.inject.Inject -import javax.inject.Singleton -import kotlin.properties.Delegates.notNull +import com.tangem.blockchainsdk.BlockchainProvidersResponse +import com.tangem.blockchainsdk.converters.BlockchainProviderTypesConverter +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.firstOrNull +import kotlinx.coroutines.flow.map +import timber.log.Timber /** * Implementation of [BlockchainProvidersTypesManager] in DEV environment * * @property prodBlockchainProvidersTypesManager prod manager * @property blockchainProviderTypesStore blockchain provider types store + * @property changedBlockchainProvidersStore changed blockchain providers store * [REDACTED_AUTHOR] */ -@Singleton -internal class DevBlockchainProvidersTypesManager @Inject constructor( +internal class DevBlockchainProvidersTypesManager( private val prodBlockchainProvidersTypesManager: ProdBlockchainProvidersTypesManager, private val blockchainProviderTypesStore: BlockchainProviderTypesStore, -) : BlockchainProvidersTypesManager by prodBlockchainProvidersTypesManager, - MutableBlockchainProvidersTypesManager { + private val changedBlockchainProvidersStore: DataStore, +) : MutableBlockchainProvidersTypesManager { - private var primaryResponse: BlockchainProviderTypes by notNull() + override fun get(): Flow = changedBlockchainProvidersStore.data + .map(BlockchainProviderTypesConverter::convert) override suspend fun update() { prodBlockchainProvidersTypesManager.update() - primaryResponse = blockchainProviderTypesStore.get().value + val initial = blockchainProviderTypesStore.get().value + + val changed = changedBlockchainProvidersStore.data.firstOrNull().orEmpty() + + if (changed.isEmpty()) { + Timber.i("Initialize ChangedBlockchainProvidersStore") + changedBlockchainProvidersStore.updateData { + BlockchainProviderTypesConverter.convertBack(initial) + } + } + } + + override suspend fun recoverInitialState() { + val initial = blockchainProviderTypesStore.get().value + + changedBlockchainProvidersStore.updateData { + BlockchainProviderTypesConverter.convertBack(initial) + } } override suspend fun update(blockchain: Blockchain, providers: List) { - val currentTypes = blockchainProviderTypesStore.get().value + changedBlockchainProvidersStore.updateData { + val providerModels = BlockchainProviderTypesConverter.convertBack(value = mapOf(blockchain to providers)) - val updatedTypes = currentTypes + (blockchain to providers) - - blockchainProviderTypesStore.store(value = updatedTypes) + it + providerModels + } } override suspend fun isMatchWithMerged(): Boolean { - val current = blockchainProviderTypesStore.get().value + val initial = blockchainProviderTypesStore.get().value + val changed = changedBlockchainProvidersStore.data.firstOrNull().orEmpty() - return current == primaryResponse + return initial == BlockchainProviderTypesConverter.convert(changed) } } \ No newline at end of file diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/MutableBlockchainProvidersTypesManager.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/MutableBlockchainProvidersTypesManager.kt index 148a2dfc23..fd460c4ad9 100644 --- a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/MutableBlockchainProvidersTypesManager.kt +++ b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/MutableBlockchainProvidersTypesManager.kt @@ -13,6 +13,9 @@ interface MutableBlockchainProvidersTypesManager : BlockchainProvidersTypesManag /** Update [providers] for [blockchain] */ suspend fun update(blockchain: Blockchain, providers: List) + /** Recover initial state */ + suspend fun recoverInitialState() + /** Checks that current [BlockchainProviderTypes] was changed */ suspend fun isMatchWithMerged(): Boolean } \ No newline at end of file diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/ProdBlockchainProvidersTypesManager.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/ProdBlockchainProvidersTypesManager.kt index 3a62906d7b..c535a0f61a 100644 --- a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/ProdBlockchainProvidersTypesManager.kt +++ b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/ProdBlockchainProvidersTypesManager.kt @@ -1,7 +1,7 @@ package com.tangem.blockchainsdk.providers import com.tangem.blockchainsdk.converters.BlockchainProviderTypesConverter -import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.Flow import timber.log.Timber import javax.inject.Inject import javax.inject.Singleton @@ -20,7 +20,7 @@ internal class ProdBlockchainProvidersTypesManager @Inject constructor( private val blockchainProviderTypesStore: BlockchainProviderTypesStore, ) : BlockchainProvidersTypesManager { - override fun get(): StateFlow = blockchainProviderTypesStore.get() + override fun get(): Flow = blockchainProviderTypesStore.get() override suspend fun update() { val response = blockchainProvidersResponseLoader.load() diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/ProviderTypeIdMapping.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/ProviderTypeIdMapping.kt new file mode 100644 index 0000000000..6917699851 --- /dev/null +++ b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/ProviderTypeIdMapping.kt @@ -0,0 +1,27 @@ +package com.tangem.blockchainsdk.providers + +import com.tangem.blockchain.common.network.providers.ProviderType + +/** Mapping of [providerType] with [id] */ +internal enum class ProviderTypeIdMapping(val id: String, val providerType: ProviderType) { + NowNodes(id = "nownodes", providerType = ProviderType.NowNodes), + GetBlock(id = "getblock", providerType = ProviderType.GetBlock), + QuickNode(id = "quicknode", providerType = ProviderType.QuickNode), + BitcoinBlockchair(id = "blockchair", providerType = ProviderType.BitcoinLike.Blockchair), + BitcoinBlockcypher(id = "blockcypher", providerType = ProviderType.BitcoinLike.Blockcypher), + CardanoAdalite(id = "adalite", providerType = ProviderType.Cardano.Adalite), + CardanoRosetta(id = "tangemRosetta", providerType = ProviderType.Cardano.Rosetta), + ChiaFireAcademy(id = "fireAcademy", providerType = ProviderType.Chia.FireAcademy), + ChiaTangem(id = "tangemChia", providerType = ProviderType.Chia.Tangem), + ChiaTangemNew(id = "tangemChia3", providerType = ProviderType.Chia.TangemNew), + EthereumInfura(id = "infura", providerType = ProviderType.EthereumLike.Infura), + HederaArkhia(id = "arkhiaHedera", providerType = ProviderType.Hedera.Arkhia), + KaspaSecondary(id = "kaspa", providerType = ProviderType.Kaspa.SecondaryAPI), + SolanaOfficial(id = "solana", providerType = ProviderType.Solana.Official), + TonCentral(id = "ton", providerType = ProviderType.Ton.TonCentral), + TronGrid(id = "tron", providerType = ProviderType.Tron.TronGrid), + BittensorDwellir(id = "dwellirBittensor", providerType = ProviderType.Bittensor.Dwellir), + BittensorOnfinality(id = "onfinalityBittensor", providerType = ProviderType.Bittensor.Onfinality), + KoinosPro(id = "koinospro", providerType = ProviderType.Koinos.KoinosPro), + ; +} \ No newline at end of file diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/dev/BlockchainProvidersResponseSerializer.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/dev/BlockchainProvidersResponseSerializer.kt new file mode 100644 index 0000000000..be75a477db --- /dev/null +++ b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/dev/BlockchainProvidersResponseSerializer.kt @@ -0,0 +1,34 @@ +package com.tangem.blockchainsdk.providers.dev + +import androidx.datastore.core.Serializer +import com.squareup.moshi.Moshi +import com.squareup.moshi.Types +import com.tangem.blockchainsdk.BlockchainProvidersResponse +import com.tangem.datasource.local.config.providers.models.ProviderModel +import java.io.InputStream +import java.io.OutputStream + +/** DataStore serializer for [BlockchainProvidersResponse]. Implemented by [Moshi]. */ +internal class BlockchainProvidersResponseSerializer(moshi: Moshi) : Serializer { + + private val adapter by lazy { + val providersType = Types.newParameterizedType(List::class.java, ProviderModel::class.java) + val type = Types.newParameterizedType(Map::class.java, String::class.java, providersType) + + moshi.adapter(type) + } + + override val defaultValue: BlockchainProvidersResponse = emptyMap() + + override suspend fun readFrom(input: InputStream): BlockchainProvidersResponse { + return input.bufferedReader().use { reader -> + adapter.fromJson(reader.readText()) ?: defaultValue + } + } + + override suspend fun writeTo(t: BlockchainProvidersResponse, output: OutputStream) { + output.bufferedWriter().use { writer -> + writer.write(adapter.toJson(t)) + } + } +} \ No newline at end of file diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/utils/ProviderTypeExt.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/utils/ProviderTypeExt.kt deleted file mode 100644 index 3b32c69ae9..0000000000 --- a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/utils/ProviderTypeExt.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.tangem.blockchainsdk.utils - -import com.tangem.blockchain.common.network.providers.ProviderType -import timber.log.Timber - -/** Create private provider by [name] or return null */ -@Suppress("CyclomaticComplexMethod") -fun createPrivateProviderType(name: String): ProviderType? { - return when (name) { - "blockchair" -> ProviderType.BitcoinLike.Blockchair - "blockcypher" -> ProviderType.BitcoinLike.Blockcypher - "adalite" -> ProviderType.Cardano.Adalite - "tangemRosetta" -> ProviderType.Cardano.Rosetta - "fireAcademy" -> ProviderType.Chia.FireAcademy - "tangemChia" -> ProviderType.Chia.Tangem - "tangemChia3" -> ProviderType.Chia.TangemNew - "infura" -> ProviderType.EthereumLike.Infura - "getblock" -> ProviderType.GetBlock - "arkhiaHedera" -> ProviderType.Hedera.Arkhia - "kaspa" -> ProviderType.Kaspa.SecondaryAPI - "nownodes" -> ProviderType.NowNodes - "quicknode" -> ProviderType.QuickNode - "solana" -> ProviderType.Solana.Official - "ton" -> ProviderType.Ton.TonCentral - "tron" -> ProviderType.Tron.TronGrid - "dwellirBittensor" -> ProviderType.Bittensor.Dwellir - "onfinalityBittensor" -> ProviderType.Bittensor.Onfinality - "koinospro" -> ProviderType.Koinos.KoinosPro - else -> { - Timber.e("Private provider with name $name is not supported") - null - } - } -} \ No newline at end of file