From d3f3e86fa360fb289438edc77a64da17188c13c7 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 2 Mar 2023 23:27:34 +0800 Subject: [PATCH] Updated on 2026-08-14 --- .../java/com/tangem/tap/TapApplication.kt | 11 +++++---- .../com/tangem/tap/common/redux/AppReducer.kt | 2 ++ .../com/tangem/tap/common/redux/AppState.kt | 4 ++++ .../tokens/LoadAvailableCoinsService.kt | 6 ++--- .../tap/domain/twins/TwinCardsManager.kt | 4 ++-- .../features/di/redux/DaggerGraphAction.kt | 9 ++++++++ .../di/redux/DaggerGraphMiddleware.kt | 12 ++++++++++ .../features/di/redux/DaggerGraphReducer.kt | 20 ++++++++++++++++ .../tap/features/di/redux/DaggerGraphState.kt | 6 +++++ .../products/twins/redux/TwinCardsAction.kt | 2 +- .../products/twins/ui/TwinsCardsFragment.kt | 12 +++++++--- .../features/tokens/redux/TokensMiddleware.kt | 15 +++--------- .../datasource/asset/AndroidAssetReader.kt | 23 +++++++++++++++++++ .../tangem/datasource/asset/AssetReader.kt | 12 ++++++++++ .../datasource/config/FeaturesLocalLoader.kt | 6 ++--- .../com/tangem/datasource/di/AssetModule.kt | 18 +++++++++++++++ .../tangem/datasource/utils/AssetReader.kt | 23 ------------------- 17 files changed, 134 insertions(+), 51 deletions(-) create mode 100644 app/src/main/java/com/tangem/tap/features/di/redux/DaggerGraphAction.kt create mode 100644 app/src/main/java/com/tangem/tap/features/di/redux/DaggerGraphMiddleware.kt create mode 100644 app/src/main/java/com/tangem/tap/features/di/redux/DaggerGraphReducer.kt create mode 100644 app/src/main/java/com/tangem/tap/features/di/redux/DaggerGraphState.kt create mode 100644 core/datasource/src/main/java/com/tangem/datasource/asset/AndroidAssetReader.kt create mode 100644 core/datasource/src/main/java/com/tangem/datasource/asset/AssetReader.kt create mode 100644 core/datasource/src/main/java/com/tangem/datasource/di/AssetModule.kt delete mode 100644 core/datasource/src/main/java/com/tangem/datasource/utils/AssetReader.kt diff --git a/app/src/main/java/com/tangem/tap/TapApplication.kt b/app/src/main/java/com/tangem/tap/TapApplication.kt index 56b14e2732..29e19dad86 100644 --- a/app/src/main/java/com/tangem/tap/TapApplication.kt +++ b/app/src/main/java/com/tangem/tap/TapApplication.kt @@ -12,11 +12,10 @@ import com.tangem.blockchain.common.WalletManagerFactory import com.tangem.blockchain.network.BlockchainSdkRetrofitBuilder import com.tangem.core.analytics.Analytics import com.tangem.datasource.api.common.MoshiConverter +import com.tangem.datasource.asset.AssetReader import com.tangem.datasource.config.ConfigManager import com.tangem.datasource.config.FeaturesLocalLoader import com.tangem.datasource.config.models.Config -import com.tangem.datasource.utils.AndroidAssetReader -import com.tangem.datasource.utils.AssetReader import com.tangem.domain.DomainLayer import com.tangem.domain.common.LogConfig import com.tangem.tap.common.IntentHandler @@ -49,6 +48,7 @@ import com.tangem.tap.domain.walletStores.repository.WalletManagersRepository import com.tangem.tap.domain.walletStores.repository.WalletStoresRepository import com.tangem.tap.domain.walletStores.repository.di.provideDefaultImplementation import com.tangem.tap.domain.walletconnect.WalletConnectRepository +import com.tangem.tap.features.di.redux.DaggerGraphAction import com.tangem.tap.network.NetworkConnectivity import com.tangem.tap.persistence.PreferencesStorage import com.tangem.tap.proxy.AppStateHolder @@ -66,7 +66,6 @@ lateinit var activityResultCaller: ActivityResultCaller lateinit var preferencesStorage: PreferencesStorage lateinit var walletConnectRepository: WalletConnectRepository lateinit var shopService: TangemShopService -lateinit var assetReader: AssetReader lateinit var userTokensRepository: UserTokensRepository private val walletStoresRepository by lazy { WalletStoresRepository.provideDefaultImplementation() } @@ -117,6 +116,9 @@ class TapApplication : Application(), ImageLoaderFactory { @Inject lateinit var configManager: ConfigManager + @Inject + lateinit var assetReader: AssetReader + override fun onCreate() { super.onCreate() @@ -141,7 +143,6 @@ class TapApplication : Application(), ImageLoaderFactory { preferencesStorage = PreferencesStorage(this) walletConnectRepository = WalletConnectRepository(this) - assetReader = AndroidAssetReader(this) val configLoader = FeaturesLocalLoader(assetReader, MoshiConverter.sdkMoshi, BuildConfig.ENVIRONMENT) initConfigManager(configLoader, ::initWithConfigDependency) initWarningMessagesManager() @@ -159,6 +160,8 @@ class TapApplication : Application(), ImageLoaderFactory { appStateHolder.mainStore = store appStateHolder.userTokensRepository = userTokensRepository appStateHolder.walletStoresManager = walletStoresManager + + store.dispatch(DaggerGraphAction.SetDependencies(assetReader)) } override fun newImageLoader(): ImageLoader { diff --git a/app/src/main/java/com/tangem/tap/common/redux/AppReducer.kt b/app/src/main/java/com/tangem/tap/common/redux/AppReducer.kt index 3bcb47a092..0a85acf922 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/AppReducer.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/AppReducer.kt @@ -4,6 +4,7 @@ import com.tangem.tap.common.redux.global.globalReducer import com.tangem.tap.common.redux.navigation.NavigationReducer import com.tangem.tap.features.details.redux.DetailsReducer import com.tangem.tap.features.details.redux.walletconnect.WalletConnectReducer +import com.tangem.tap.features.di.redux.DaggerGraphReducer import com.tangem.tap.features.disclaimer.redux.DisclaimerReducer import com.tangem.tap.features.home.redux.HomeReducer import com.tangem.tap.features.onboarding.products.note.redux.OnboardingNoteReducer @@ -44,6 +45,7 @@ fun appReducer(action: Action, state: AppState?, appStateHolder: AppStateHolder) saveWalletState = SaveWalletReducer.reduce(action, state), walletSelectorState = WalletSelectorReducer.reduce(action, state), sprinklrState = SprinklrReducer.reduce(action, state), + daggerGraphState = DaggerGraphReducer.reduce(action, state), ) } diff --git a/app/src/main/java/com/tangem/tap/common/redux/AppState.kt b/app/src/main/java/com/tangem/tap/common/redux/AppState.kt index e9b253d90d..cd4e19b15f 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/AppState.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/AppState.kt @@ -11,6 +11,8 @@ import com.tangem.tap.features.details.redux.DetailsMiddleware import com.tangem.tap.features.details.redux.DetailsState import com.tangem.tap.features.details.redux.walletconnect.WalletConnectMiddleware import com.tangem.tap.features.details.redux.walletconnect.WalletConnectState +import com.tangem.tap.features.di.redux.DaggerGraphMiddleware +import com.tangem.tap.features.di.redux.DaggerGraphState import com.tangem.tap.features.disclaimer.redux.DisclaimerMiddleware import com.tangem.tap.features.disclaimer.redux.DisclaimerState import com.tangem.tap.features.home.redux.HomeMiddleware @@ -64,6 +66,7 @@ data class AppState( val saveWalletState: SaveWalletState = SaveWalletState(), val walletSelectorState: WalletSelectorState = WalletSelectorState(), val sprinklrState: SprinklrState = SprinklrState(), + val daggerGraphState: DaggerGraphState = DaggerGraphState(), ) : StateType { val domainState: DomainState @@ -105,6 +108,7 @@ data class AppState( LockUserWalletsTimerMiddleware().middleware, AccessCodeRequestPolicyMiddleware().middleware, SprinklrMiddleware().middleware, + DaggerGraphMiddleware.daggerGraphMiddleware, ) } } diff --git a/app/src/main/java/com/tangem/tap/domain/tokens/LoadAvailableCoinsService.kt b/app/src/main/java/com/tangem/tap/domain/tokens/LoadAvailableCoinsService.kt index bc1f1dccc5..e2cf3b1355 100644 --- a/app/src/main/java/com/tangem/tap/domain/tokens/LoadAvailableCoinsService.kt +++ b/app/src/main/java/com/tangem/tap/domain/tokens/LoadAvailableCoinsService.kt @@ -6,8 +6,8 @@ import com.tangem.common.services.Result import com.tangem.datasource.api.common.MoshiConverter import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.api.tangemTech.models.CoinsResponse +import com.tangem.datasource.asset.AssetReader import com.tangem.domain.common.extensions.toNetworkId -import com.tangem.datasource.utils.AssetReader import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.withContext @@ -74,8 +74,8 @@ class LoadAvailableCoinsService( } } - fun getTestnetCoins(): List { - val json = assetReader.readAssetAsString(FILE_NAME_TESTNET_COINS) + private fun getTestnetCoins(): List { + val json = assetReader.readJson(FILE_NAME_TESTNET_COINS) return currenciesAdapter.fromJson(json)!!.coins .map { Currency.fromJsonObject(it) } } diff --git a/app/src/main/java/com/tangem/tap/domain/twins/TwinCardsManager.kt b/app/src/main/java/com/tangem/tap/domain/twins/TwinCardsManager.kt index 8e2cea35fa..3795a0cf00 100644 --- a/app/src/main/java/com/tangem/tap/domain/twins/TwinCardsManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/twins/TwinCardsManager.kt @@ -9,10 +9,10 @@ import com.tangem.common.KeyPair import com.tangem.common.extensions.hexToBytes import com.tangem.common.extensions.toHexString import com.tangem.datasource.api.common.MoshiConverter +import com.tangem.datasource.asset.AssetReader import com.tangem.domain.common.CardDTO import com.tangem.domain.common.ScanResponse import com.tangem.operations.wallet.CreateWalletResponse -import com.tangem.datasource.utils.AssetReader import com.tangem.tap.tangemSdkManager class TwinCardsManager( @@ -89,7 +89,7 @@ class TwinCardsManager( } private fun getIssuers(reader: AssetReader): List { - val file = reader.readAssetAsString("tangem-app-config/issuers") + val file = reader.readJson(fileName = "tangem-app-config/issuers") return getAdapter().fromJson(file)!! } } diff --git a/app/src/main/java/com/tangem/tap/features/di/redux/DaggerGraphAction.kt b/app/src/main/java/com/tangem/tap/features/di/redux/DaggerGraphAction.kt new file mode 100644 index 0000000000..6019e1d5b3 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/di/redux/DaggerGraphAction.kt @@ -0,0 +1,9 @@ +package com.tangem.tap.features.di.redux + +import com.tangem.datasource.asset.AssetReader +import org.rekotlin.Action + +sealed interface DaggerGraphAction : Action { + + data class SetDependencies(val assetReader: AssetReader) : DaggerGraphAction +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/di/redux/DaggerGraphMiddleware.kt b/app/src/main/java/com/tangem/tap/features/di/redux/DaggerGraphMiddleware.kt new file mode 100644 index 0000000000..d88f8da24e --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/di/redux/DaggerGraphMiddleware.kt @@ -0,0 +1,12 @@ +package com.tangem.tap.features.di.redux + +import com.tangem.tap.common.redux.AppState +import org.rekotlin.Middleware + +object DaggerGraphMiddleware { + val daggerGraphMiddleware: Middleware = { _, _ -> + { next -> + { action -> next(action) } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/di/redux/DaggerGraphReducer.kt b/app/src/main/java/com/tangem/tap/features/di/redux/DaggerGraphReducer.kt new file mode 100644 index 0000000000..f060e845f9 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/di/redux/DaggerGraphReducer.kt @@ -0,0 +1,20 @@ +package com.tangem.tap.features.di.redux + +import com.tangem.tap.common.redux.AppState +import org.rekotlin.Action + +object DaggerGraphReducer { + fun reduce(action: Action, state: AppState): DaggerGraphState { + if (action !is DaggerGraphAction) return state.daggerGraphState + + return internalReduce(action, state) + } + + private fun internalReduce(action: DaggerGraphAction, state: AppState): DaggerGraphState { + return when (action) { + is DaggerGraphAction.SetDependencies -> state.daggerGraphState.copy( + assetReader = action.assetReader, + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/di/redux/DaggerGraphState.kt b/app/src/main/java/com/tangem/tap/features/di/redux/DaggerGraphState.kt new file mode 100644 index 0000000000..fe726f8dc0 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/di/redux/DaggerGraphState.kt @@ -0,0 +1,6 @@ +package com.tangem.tap.features.di.redux + +import com.tangem.datasource.asset.AssetReader +import org.rekotlin.StateType + +data class DaggerGraphState(val assetReader: AssetReader? = null) : StateType \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsAction.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsAction.kt index ac58136a05..c552a354a4 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsAction.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsAction.kt @@ -3,7 +3,7 @@ package com.tangem.tap.features.onboarding.products.twins.redux import com.tangem.Message import com.tangem.blockchain.common.WalletManager import com.tangem.common.extensions.VoidCallback -import com.tangem.datasource.utils.AssetReader +import com.tangem.datasource.asset.AssetReader import com.tangem.domain.common.ScanResponse import com.tangem.tap.domain.TapError import com.tangem.tap.domain.twins.TwinCardsManager diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/ui/TwinsCardsFragment.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/ui/TwinsCardsFragment.kt index f471878c85..416dbb70e3 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/ui/TwinsCardsFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/ui/TwinsCardsFragment.kt @@ -15,7 +15,7 @@ import com.tangem.blockchain.common.Blockchain import com.tangem.common.extensions.VoidCallback import com.tangem.core.analytics.Analytics import com.tangem.core.ui.fragments.setStatusBarColor -import com.tangem.datasource.utils.AndroidAssetReader +import com.tangem.datasource.asset.AssetReader import com.tangem.domain.common.ScanResponse import com.tangem.domain.common.TwinCardNumber import com.tangem.tangem_sdk_new.ui.widget.leapfrogWidget.LeapfrogWidget @@ -39,10 +39,16 @@ import com.tangem.tap.features.wallet.redux.Artwork import com.tangem.tap.store import com.tangem.wallet.R import com.tangem.wallet.databinding.LayoutOnboardingContainerTopBinding +import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject @Suppress("LargeClass") +@AndroidEntryPoint class TwinsCardsFragment : BaseOnboardingFragment() { + @Inject + lateinit var assetReader: AssetReader + private val mainBinding by lazy { binding.vMain } private var previousStep: TwinCardsStep = TwinCardsStep.None @@ -253,8 +259,8 @@ class TwinsCardsFragment : BaseOnboardingFragment() { Analytics.send(Onboarding.CreateWallet.ButtonCreateWallet()) store.dispatch( TwinCardsAction.Wallet.LaunchFirstStep( - Message(getString(R.string.twins_recreate_title_format, twinIndexNumber)), - AndroidAssetReader(requireContext()), + initialMessage = Message(getString(R.string.twins_recreate_title_format, twinIndexNumber)), + reader = assetReader, ), ) } diff --git a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt index 27aa168f02..d072b93e1f 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt @@ -21,7 +21,6 @@ import com.tangem.domain.features.addCustomToken.redux.AddCustomTokenAction import com.tangem.domain.redux.domainStore import com.tangem.operations.derivation.ExtendedPublicKeysMap import com.tangem.tap.DELAY_SDK_DIALOG_CLOSE -import com.tangem.tap.assetReader import com.tangem.tap.common.analytics.events.ManageTokens import com.tangem.tap.common.extensions.dispatchDebugErrorNotification import com.tangem.tap.common.extensions.dispatchOnMain @@ -87,7 +86,7 @@ class TokensMiddleware { val loadCoinsService = LoadAvailableCoinsService( tangemTechApi = store.state.domainNetworks.tangemTechService.api, dispatchers = AppCoroutineDispatcherProvider(), - assetReader = assetReader, + assetReader = requireNotNull(store.state.daggerGraphState.assetReader) { "Asset reader is null" }, ) scope.launch { @@ -266,18 +265,10 @@ class TokensMiddleware { val toDerive = bothCandidates.filterNot { alreadyDerivedPaths.contains(it) } if (toDerive.isEmpty()) return null - return DerivationData( - derivations = mapKeyOfWalletPublicKey to toDerive, - alreadyDerivedKeys = alreadyDerivedKeys, - mapKeyOfWalletPublicKey = mapKeyOfWalletPublicKey, - ) + return DerivationData(derivations = mapKeyOfWalletPublicKey to toDerive) } - private class DerivationData( - val derivations: Pair>, - val alreadyDerivedKeys: ExtendedPublicKeysMap, - val mapKeyOfWalletPublicKey: ByteArrayKey, - ) + private class DerivationData(val derivations: Pair>) private fun submitAdd(scanResponse: ScanResponse, currencyList: List) { val selectedUserWallet = userWalletsListManager.selectedUserWalletSync diff --git a/core/datasource/src/main/java/com/tangem/datasource/asset/AndroidAssetReader.kt b/core/datasource/src/main/java/com/tangem/datasource/asset/AndroidAssetReader.kt new file mode 100644 index 0000000000..7e33fefae3 --- /dev/null +++ b/core/datasource/src/main/java/com/tangem/datasource/asset/AndroidAssetReader.kt @@ -0,0 +1,23 @@ +package com.tangem.datasource.asset + +import android.content.Context +import dagger.hilt.android.qualifiers.ApplicationContext +import java.io.BufferedReader +import javax.inject.Inject + +/** + * Implementation of asset file reader + * + * @property context application context + */ +internal class AndroidAssetReader @Inject constructor( + @ApplicationContext private val context: Context, +) : AssetReader { + + override fun readJson(fileName: String): String { + return context.assets + .open("$fileName.json") + .bufferedReader() + .use(BufferedReader::readText) + } +} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/asset/AssetReader.kt b/core/datasource/src/main/java/com/tangem/datasource/asset/AssetReader.kt new file mode 100644 index 0000000000..6475ad3909 --- /dev/null +++ b/core/datasource/src/main/java/com/tangem/datasource/asset/AssetReader.kt @@ -0,0 +1,12 @@ +package com.tangem.datasource.asset + +/** + * Asset file reader + * +[REDACTED_AUTHOR] + */ +interface AssetReader { + + /** Read content of json file [fileName] from asset */ + fun readJson(fileName: String): String +} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/config/FeaturesLocalLoader.kt b/core/datasource/src/main/java/com/tangem/datasource/config/FeaturesLocalLoader.kt index 8ae508cbd3..829b539552 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/config/FeaturesLocalLoader.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/config/FeaturesLocalLoader.kt @@ -2,10 +2,10 @@ package com.tangem.datasource.config import com.squareup.moshi.JsonAdapter import com.squareup.moshi.Moshi +import com.tangem.datasource.asset.AssetReader import com.tangem.datasource.config.models.ConfigModel import com.tangem.datasource.config.models.ConfigValueModel import com.tangem.datasource.config.models.FeatureModel -import com.tangem.datasource.utils.AssetReader import timber.log.Timber /** @@ -25,8 +25,8 @@ class FeaturesLocalLoader( val featureAdapter: JsonAdapter = moshi.adapter(FeatureModel::class.java) val valuesAdapter: JsonAdapter = moshi.adapter(ConfigValueModel::class.java) - val jsonFeatures = assetReader.readAssetAsString(featuresName) - val jsonConfigValues = assetReader.readAssetAsString(configValuesName) + val jsonFeatures = assetReader.readJson(featuresName) + val jsonConfigValues = assetReader.readJson(configValuesName) ConfigModel(featureAdapter.fromJson(jsonFeatures), valuesAdapter.fromJson(jsonConfigValues)) } catch (ex: Exception) { diff --git a/core/datasource/src/main/java/com/tangem/datasource/di/AssetModule.kt b/core/datasource/src/main/java/com/tangem/datasource/di/AssetModule.kt new file mode 100644 index 0000000000..7df5502310 --- /dev/null +++ b/core/datasource/src/main/java/com/tangem/datasource/di/AssetModule.kt @@ -0,0 +1,18 @@ +package com.tangem.datasource.di + +import com.tangem.datasource.asset.AndroidAssetReader +import com.tangem.datasource.asset.AssetReader +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +internal interface AssetModule { + + @Binds + @Singleton + fun bindAsserReader(androidAssetReader: AndroidAssetReader): AssetReader +} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/utils/AssetReader.kt b/core/datasource/src/main/java/com/tangem/datasource/utils/AssetReader.kt deleted file mode 100644 index 919d273aea..0000000000 --- a/core/datasource/src/main/java/com/tangem/datasource/utils/AssetReader.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.tangem.datasource.utils - -import android.content.Context - -/** -[REDACTED_AUTHOR] - */ -interface AssetReader { - fun readAssetAsString(name: String): String -} - -class AndroidAssetReader( - private val context: Context, -) : AssetReader { - - override fun readAssetAsString(name: String): String { - return context.readAssetAsString(name) - } -} - -fun Context.readAssetAsString(fileName: String): String { - return this.assets.open("$fileName.json").bufferedReader().readText() -} \ No newline at end of file