From 6dbd7bd861dfde375b968a482b7e822450d12caa Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 18 Oct 2024 17:27:45 +0400 Subject: [PATCH 1/5] Updated on 2026-08-14 --- app/build.gradle.kts | 2 +- .../com/tangem/tap/ApplicationEntryPoint.kt | 2 +- .../java/com/tangem/tap/TangemApplication.kt | 2 +- .../tap/common/extensions/Blockchain.kt | 18 -------- .../tap/di/domain/CardLegacyDomainModule.kt | 2 +- .../scanCard/CardScanningFeatureToggles.kt | 2 +- .../di/WalletConnectInteractorModule.kt | 2 +- .../toggles/WalletConnectFeatureToggles.kt | 2 +- .../home/featuretoggles/HomeFeatureToggles.kt | 2 +- .../storage/FeatureTogglesStorage.kt | 15 ------- .../storage/LocalFeatureTogglesStorage.kt | 29 ------------ .../core/featuretoggle/utils/CollectionExt.kt | 13 ------ core/{featuretoggles => toggles}/.gitignore | 0 .../build.gradle.kts | 2 +- .../configs/excluded_blockchains_config.json | 10 +++++ .../toggle}/di/FeatureTogglesManagerModule.kt | 20 ++++----- .../toggle/feature}/FeatureTogglesManager.kt | 2 +- .../feature}/MutableFeatureTogglesManager.kt | 2 +- .../feature/impl}/DevFeatureTogglesManager.kt | 17 +++---- .../feature/impl/FeatureTogglesConstants.kt | 6 +++ .../impl}/ProdFeatureTogglesManager.kt | 17 +++---- .../toggle/storage/LocalTogglesStorage.kt | 24 ++++++++++ .../com/tangem/core/toggle/storage/Toggle.kt} | 10 ++--- .../core/toggle/storage/TogglesStorage.kt | 15 +++++++ .../tangem/core/toggle/utils/CollectionExt.kt | 13 ++++++ .../toggle}/version/DefaultVersionProvider.kt | 2 +- .../tangem/core/toggle/version}/Version.kt | 2 +- .../version}/VersionAvailabilityContract.kt | 2 +- .../core/toggle}/version/VersionProvider.kt | 2 +- .../VersionAvailabilityContractTest.kt | 3 +- .../core/toggle}/contract/VersionTest.kt | 3 +- .../toggle/manager/DevTogglesManagerTest.kt} | 45 ++++++++++--------- .../toggle/manager/ProdTogglesManagerTest.kt} | 45 ++++++++++--------- .../storage/LocalTogglesStorageTest.kt} | 28 ++++++------ features/details/impl/build.gradle.kts | 2 +- features/disclaimer/impl/build.gradle.kts | 2 +- features/manage-tokens/impl/build.gradle.kts | 2 +- features/markets/impl/build.gradle.kts | 2 +- features/onboarding-v2/impl/build.gradle.kts | 2 +- .../v2/DefaultOnboardingV2FeatureToggles.kt | 2 +- features/onboarding/build.gradle.kts | 2 +- features/onramp/impl/build.gradle.kts | 2 +- .../onramp/DefaultOnrampFeatureToggles.kt | 2 +- .../features/onramp/OnrampFeatureModule.kt | 4 +- .../push-notifications/impl/build.gradle.kts | 2 +- features/send/impl/build.gradle.kts | 2 +- features/staking/impl/build.gradle.kts | 2 +- features/swap/presentation/build.gradle.kts | 2 +- features/tester/impl/build.gradle.kts | 2 +- .../viewmodels/FeatureTogglesViewModel.kt | 4 +- features/tokendetails/impl/build.gradle.kts | 2 +- .../wallet-settings/impl/build.gradle.kts | 2 +- features/wallet/impl/build.gradle.kts | 2 +- .../DefaultWalletFeatureToggles.kt | 2 +- libs/blockchain-sdk/build.gradle.kts | 2 +- .../di/BlockchainSDKFactoryModule.kt | 2 +- .../DefaultBlockchainSDKFeatureToggles.kt | 2 +- settings.gradle.kts | 2 +- 58 files changed, 207 insertions(+), 206 deletions(-) delete mode 100644 app/src/main/java/com/tangem/tap/common/extensions/Blockchain.kt delete mode 100644 core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/storage/FeatureTogglesStorage.kt delete mode 100644 core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/storage/LocalFeatureTogglesStorage.kt delete mode 100644 core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/utils/CollectionExt.kt rename core/{featuretoggles => toggles}/.gitignore (100%) rename core/{featuretoggles => toggles}/build.gradle.kts (94%) create mode 100644 core/toggles/src/main/assets/configs/excluded_blockchains_config.json rename core/{featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle => toggles/src/main/kotlin/com/tangem/core/toggle}/di/FeatureTogglesManagerModule.kt (62%) rename core/{featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/manager => toggles/src/main/kotlin/com/tangem/core/toggle/feature}/FeatureTogglesManager.kt (86%) rename core/{featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/manager => toggles/src/main/kotlin/com/tangem/core/toggle/feature}/MutableFeatureTogglesManager.kt (92%) rename core/{featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/manager => toggles/src/main/kotlin/com/tangem/core/toggle/feature/impl}/DevFeatureTogglesManager.kt (82%) create mode 100644 core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/impl/FeatureTogglesConstants.kt rename core/{featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/manager => toggles/src/main/kotlin/com/tangem/core/toggle/feature/impl}/ProdFeatureTogglesManager.kt (63%) create mode 100644 core/toggles/src/main/kotlin/com/tangem/core/toggle/storage/LocalTogglesStorage.kt rename core/{featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/storage/FeatureToggle.kt => toggles/src/main/kotlin/com/tangem/core/toggle/storage/Toggle.kt} (53%) create mode 100644 core/toggles/src/main/kotlin/com/tangem/core/toggle/storage/TogglesStorage.kt create mode 100644 core/toggles/src/main/kotlin/com/tangem/core/toggle/utils/CollectionExt.kt rename core/{featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle => toggles/src/main/kotlin/com/tangem/core/toggle}/version/DefaultVersionProvider.kt (96%) rename core/{featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/contract => toggles/src/main/kotlin/com/tangem/core/toggle/version}/Version.kt (98%) rename core/{featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/contract => toggles/src/main/kotlin/com/tangem/core/toggle/version}/VersionAvailabilityContract.kt (93%) rename core/{featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle => toggles/src/main/kotlin/com/tangem/core/toggle}/version/VersionProvider.kt (74%) rename core/{featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle => toggles/src/test/kotlin/com/tangem/core/toggle}/contract/VersionAvailabilityContractTest.kt (94%) rename core/{featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle => toggles/src/test/kotlin/com/tangem/core/toggle}/contract/VersionTest.kt (97%) rename core/{featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/manager/DevFeatureTogglesManagerTest.kt => toggles/src/test/kotlin/com/tangem/core/toggle/manager/DevTogglesManagerTest.kt} (81%) rename core/{featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/manager/ProdFeatureTogglesManagerTest.kt => toggles/src/test/kotlin/com/tangem/core/toggle/manager/ProdTogglesManagerTest.kt} (69%) rename core/{featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/storage/LocalFeatureTogglesStorageTest.kt => toggles/src/test/kotlin/com/tangem/core/toggle/storage/LocalTogglesStorageTest.kt} (74%) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f08ee1b88d..dd0208cf7f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -81,7 +81,7 @@ dependencies { implementation(projects.core.analytics) implementation(projects.core.analytics.models) implementation(projects.core.navigation) - implementation(projects.core.featuretoggles) + implementation(projects.core.toggles) implementation(projects.core.res) implementation(projects.core.ui) implementation(projects.core.datasource) diff --git a/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt b/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt index b116caf952..4a7cf3ec44 100644 --- a/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt +++ b/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt @@ -5,9 +5,9 @@ import com.tangem.blockchainsdk.BlockchainSDKFactory import com.tangem.blockchainsdk.signer.TransactionSignerFactory import com.tangem.common.routing.AppRouter import com.tangem.core.analytics.filter.OneTimeEventFilter -import com.tangem.core.featuretoggle.manager.FeatureTogglesManager import com.tangem.core.navigation.share.ShareManager import com.tangem.core.navigation.url.UrlOpener +import com.tangem.core.toggle.feature.FeatureTogglesManager import com.tangem.datasource.connection.NetworkConnectionManager import com.tangem.datasource.local.config.environment.EnvironmentConfigStorage import com.tangem.datasource.local.config.issuers.IssuersConfigStorage diff --git a/app/src/main/java/com/tangem/tap/TangemApplication.kt b/app/src/main/java/com/tangem/tap/TangemApplication.kt index 0e2e83f67f..0790e718b8 100644 --- a/app/src/main/java/com/tangem/tap/TangemApplication.kt +++ b/app/src/main/java/com/tangem/tap/TangemApplication.kt @@ -17,7 +17,7 @@ import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.analytics.models.Basic import com.tangem.core.analytics.models.Basic.TransactionSent.WalletForm -import com.tangem.core.featuretoggle.manager.FeatureTogglesManager +import com.tangem.core.toggle.feature.FeatureTogglesManager import com.tangem.datasource.api.common.MoshiConverter import com.tangem.datasource.api.common.createNetworkLoggingInterceptor import com.tangem.datasource.connection.NetworkConnectionManager diff --git a/app/src/main/java/com/tangem/tap/common/extensions/Blockchain.kt b/app/src/main/java/com/tangem/tap/common/extensions/Blockchain.kt deleted file mode 100644 index 08c1b72a81..0000000000 --- a/app/src/main/java/com/tangem/tap/common/extensions/Blockchain.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.tangem.tap.common.extensions - -import com.tangem.blockchain.common.Blockchain -import com.tangem.common.extensions.remove - -fun Blockchain.getNetworkStandardName(): String { - return when (this) { - Blockchain.Ethereum, Blockchain.EthereumTestnet -> "ERC20" - Blockchain.BSC, Blockchain.BSCTestnet -> "BEP20" - Blockchain.Binance, Blockchain.BinanceTestnet -> "BEP2" - Blockchain.Tron, Blockchain.TronTestnet -> "TRC20" - Blockchain.TON -> "TON" - else -> "" - } -} - -val Blockchain.networkNameWithoutTestnet - get() = this.getNetworkName().remove(" Testnet") \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/di/domain/CardLegacyDomainModule.kt b/app/src/main/java/com/tangem/tap/di/domain/CardLegacyDomainModule.kt index 12b071ad16..77ff3a6bee 100644 --- a/app/src/main/java/com/tangem/tap/di/domain/CardLegacyDomainModule.kt +++ b/app/src/main/java/com/tangem/tap/di/domain/CardLegacyDomainModule.kt @@ -1,6 +1,6 @@ package com.tangem.tap.di.domain -import com.tangem.core.featuretoggle.manager.FeatureTogglesManager +import com.tangem.core.toggle.feature.FeatureTogglesManager import com.tangem.domain.card.ScanCardProcessor import com.tangem.domain.wallets.legacy.UserWalletsListManager import com.tangem.domain.wallets.usecase.GenerateWalletNameUseCase diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/CardScanningFeatureToggles.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/CardScanningFeatureToggles.kt index 904cfe1673..1c989ca3db 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/CardScanningFeatureToggles.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/CardScanningFeatureToggles.kt @@ -1,6 +1,6 @@ package com.tangem.tap.domain.scanCard -import com.tangem.core.featuretoggle.manager.FeatureTogglesManager +import com.tangem.core.toggle.feature.FeatureTogglesManager /** * Add custom token feature toggles diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect2/di/WalletConnectInteractorModule.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect2/di/WalletConnectInteractorModule.kt index cc4a3e16c4..65faebf4db 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect2/di/WalletConnectInteractorModule.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect2/di/WalletConnectInteractorModule.kt @@ -3,7 +3,7 @@ package com.tangem.tap.domain.walletconnect2.di import android.app.Application import com.squareup.moshi.Moshi import com.tangem.core.analytics.api.AnalyticsEventHandler -import com.tangem.core.featuretoggle.manager.FeatureTogglesManager +import com.tangem.core.toggle.feature.FeatureTogglesManager import com.tangem.datasource.di.SdkMoshi import com.tangem.datasource.files.FileReader import com.tangem.domain.tokens.repository.CurrenciesRepository diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect2/toggles/WalletConnectFeatureToggles.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect2/toggles/WalletConnectFeatureToggles.kt index 26547d68e8..e9f55f3815 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect2/toggles/WalletConnectFeatureToggles.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect2/toggles/WalletConnectFeatureToggles.kt @@ -1,6 +1,6 @@ package com.tangem.tap.domain.walletconnect2.toggles -import com.tangem.core.featuretoggle.manager.FeatureTogglesManager +import com.tangem.core.toggle.feature.FeatureTogglesManager internal class WalletConnectFeatureToggles( private val featureTogglesManager: FeatureTogglesManager, diff --git a/app/src/main/java/com/tangem/tap/features/home/featuretoggles/HomeFeatureToggles.kt b/app/src/main/java/com/tangem/tap/features/home/featuretoggles/HomeFeatureToggles.kt index ce8c0bcec3..ebbb05500b 100644 --- a/app/src/main/java/com/tangem/tap/features/home/featuretoggles/HomeFeatureToggles.kt +++ b/app/src/main/java/com/tangem/tap/features/home/featuretoggles/HomeFeatureToggles.kt @@ -1,6 +1,6 @@ package com.tangem.tap.features.home.featuretoggles -import com.tangem.core.featuretoggle.manager.FeatureTogglesManager +import com.tangem.core.toggle.feature.FeatureTogglesManager import javax.inject.Inject class HomeFeatureToggles @Inject constructor( diff --git a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/storage/FeatureTogglesStorage.kt b/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/storage/FeatureTogglesStorage.kt deleted file mode 100644 index dd788efacb..0000000000 --- a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/storage/FeatureTogglesStorage.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.tangem.core.featuretoggle.storage - -/** - * Component that initializes and stores a list of feature toggles - * -[REDACTED_AUTHOR] - */ -internal interface FeatureTogglesStorage { - - /** List of feature toggles */ - val featureToggles: List - - /** Initialize storage */ - suspend fun init() -} \ No newline at end of file diff --git a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/storage/LocalFeatureTogglesStorage.kt b/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/storage/LocalFeatureTogglesStorage.kt deleted file mode 100644 index dbd92dee48..0000000000 --- a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/storage/LocalFeatureTogglesStorage.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.tangem.core.featuretoggle.storage - -import com.tangem.core.featuretoggle.storage.LocalFeatureTogglesStorage.Companion.LOCAL_CONFIG_PATH -import com.tangem.datasource.asset.loader.AssetLoader -import kotlin.properties.Delegates - -/** - * Storage implementation for storing local feature toggles. - * Feature toggles are declared in file [LOCAL_CONFIG_PATH]. - * - * @property assetLoader asset loader - * -[REDACTED_AUTHOR] - */ -internal class LocalFeatureTogglesStorage( - private val assetLoader: AssetLoader, -) : FeatureTogglesStorage { - - override var featureToggles: List by Delegates.notNull() - private set - - override suspend fun init() { - featureToggles = assetLoader.loadList(LOCAL_CONFIG_PATH) - } - - private companion object { - const val LOCAL_CONFIG_PATH: String = "configs/feature_toggles_config" - } -} \ No newline at end of file diff --git a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/utils/CollectionExt.kt b/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/utils/CollectionExt.kt deleted file mode 100644 index 990f95cf18..0000000000 --- a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/utils/CollectionExt.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.tangem.core.featuretoggle.utils - -import com.tangem.core.featuretoggle.contract.VersionAvailabilityContract -import com.tangem.core.featuretoggle.storage.FeatureToggle - -internal fun List.associateToggles(currentVersion: String): Map { - return associate { localToggle -> - Pair( - first = localToggle.name, - second = VersionAvailabilityContract(currentVersion, localToggle.version), - ) - } -} \ No newline at end of file diff --git a/core/featuretoggles/.gitignore b/core/toggles/.gitignore similarity index 100% rename from core/featuretoggles/.gitignore rename to core/toggles/.gitignore diff --git a/core/featuretoggles/build.gradle.kts b/core/toggles/build.gradle.kts similarity index 94% rename from core/featuretoggles/build.gradle.kts rename to core/toggles/build.gradle.kts index 410ef17d0e..e56b5955fe 100644 --- a/core/featuretoggles/build.gradle.kts +++ b/core/toggles/build.gradle.kts @@ -7,7 +7,7 @@ plugins { } android { - namespace = "com.tangem.core.featuretoggles" + namespace = "com.tangem.core.toggles" } dependencies { diff --git a/core/toggles/src/main/assets/configs/excluded_blockchains_config.json b/core/toggles/src/main/assets/configs/excluded_blockchains_config.json new file mode 100644 index 0000000000..fe5273f780 --- /dev/null +++ b/core/toggles/src/main/assets/configs/excluded_blockchains_config.json @@ -0,0 +1,10 @@ +[ + { + "mainnet_id": "", + "excluded_till": "undefined" + }, + { + "mainnet_id": "NEXA", + "excluded_till": "undefined" + } +] \ No newline at end of file diff --git a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/di/FeatureTogglesManagerModule.kt b/core/toggles/src/main/kotlin/com/tangem/core/toggle/di/FeatureTogglesManagerModule.kt similarity index 62% rename from core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/di/FeatureTogglesManagerModule.kt rename to core/toggles/src/main/kotlin/com/tangem/core/toggle/di/FeatureTogglesManagerModule.kt index ca45c78a6b..0f740243f0 100644 --- a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/di/FeatureTogglesManagerModule.kt +++ b/core/toggles/src/main/kotlin/com/tangem/core/toggle/di/FeatureTogglesManagerModule.kt @@ -1,12 +1,12 @@ -package com.tangem.core.featuretoggle.di +package com.tangem.core.toggle.di import android.content.Context -import com.tangem.core.featuretoggle.manager.DevFeatureTogglesManager -import com.tangem.core.featuretoggle.manager.FeatureTogglesManager -import com.tangem.core.featuretoggle.manager.ProdFeatureTogglesManager -import com.tangem.core.featuretoggle.storage.LocalFeatureTogglesStorage -import com.tangem.core.featuretoggle.version.DefaultVersionProvider -import com.tangem.core.featuretoggles.BuildConfig +import com.tangem.core.toggle.feature.FeatureTogglesManager +import com.tangem.core.toggle.feature.impl.DevFeatureTogglesManager +import com.tangem.core.toggle.feature.impl.ProdFeatureTogglesManager +import com.tangem.core.toggle.storage.LocalTogglesStorage +import com.tangem.core.toggle.version.DefaultVersionProvider +import com.tangem.core.toggles.BuildConfig import com.tangem.datasource.asset.loader.AssetLoader import com.tangem.datasource.local.preferences.AppPreferencesStore import dagger.Module @@ -27,18 +27,18 @@ internal object FeatureTogglesManagerModule { assetLoader: AssetLoader, appPreferencesStore: AppPreferencesStore, ): FeatureTogglesManager { - val localFeatureTogglesStorage = LocalFeatureTogglesStorage(assetLoader) + val localTogglesStorage = LocalTogglesStorage(assetLoader) val versionProvider = DefaultVersionProvider(context) return if (BuildConfig.TESTER_MENU_ENABLED) { DevFeatureTogglesManager( - localFeatureTogglesStorage = localFeatureTogglesStorage, + localTogglesStorage = localTogglesStorage, appPreferencesStore = appPreferencesStore, versionProvider = versionProvider, ) } else { ProdFeatureTogglesManager( - localFeatureTogglesStorage = localFeatureTogglesStorage, + localTogglesStorage = localTogglesStorage, versionProvider = versionProvider, ) } diff --git a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/manager/FeatureTogglesManager.kt b/core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/FeatureTogglesManager.kt similarity index 86% rename from core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/manager/FeatureTogglesManager.kt rename to core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/FeatureTogglesManager.kt index 6111e7f73b..1de1ff39ee 100644 --- a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/manager/FeatureTogglesManager.kt +++ b/core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/FeatureTogglesManager.kt @@ -1,4 +1,4 @@ -package com.tangem.core.featuretoggle.manager +package com.tangem.core.toggle.feature /** * Component for getting information about the availability of feature toggles diff --git a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/manager/MutableFeatureTogglesManager.kt b/core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/MutableFeatureTogglesManager.kt similarity index 92% rename from core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/manager/MutableFeatureTogglesManager.kt rename to core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/MutableFeatureTogglesManager.kt index f04b423f4f..ce9798863e 100644 --- a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/manager/MutableFeatureTogglesManager.kt +++ b/core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/MutableFeatureTogglesManager.kt @@ -1,4 +1,4 @@ -package com.tangem.core.featuretoggle.manager +package com.tangem.core.toggle.feature /** * Component for change information about the availability of feature toggles diff --git a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/manager/DevFeatureTogglesManager.kt b/core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/impl/DevFeatureTogglesManager.kt similarity index 82% rename from core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/manager/DevFeatureTogglesManager.kt rename to core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/impl/DevFeatureTogglesManager.kt index 303dce3c7b..8441522e6d 100644 --- a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/manager/DevFeatureTogglesManager.kt +++ b/core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/impl/DevFeatureTogglesManager.kt @@ -1,9 +1,10 @@ -package com.tangem.core.featuretoggle.manager +package com.tangem.core.toggle.feature.impl import androidx.annotation.VisibleForTesting -import com.tangem.core.featuretoggle.storage.FeatureTogglesStorage -import com.tangem.core.featuretoggle.utils.associateToggles -import com.tangem.core.featuretoggle.version.VersionProvider +import com.tangem.core.toggle.feature.MutableFeatureTogglesManager +import com.tangem.core.toggle.storage.TogglesStorage +import com.tangem.core.toggle.utils.associateToggles +import com.tangem.core.toggle.version.VersionProvider import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.local.preferences.PreferencesKeys import com.tangem.datasource.local.preferences.utils.getObjectSyncOrNull @@ -13,12 +14,12 @@ import kotlin.properties.Delegates /** * Feature toggles manager implementation in DEV build * - * @property localFeatureTogglesStorage local feature toggles storage + * @property localTogglesStorage local feature toggles storage * @property appPreferencesStore application local store * @property versionProvider application version provider */ internal class DevFeatureTogglesManager( - private val localFeatureTogglesStorage: FeatureTogglesStorage, + private val localTogglesStorage: TogglesStorage, private val appPreferencesStore: AppPreferencesStore, private val versionProvider: VersionProvider, ) : MutableFeatureTogglesManager { @@ -27,13 +28,13 @@ internal class DevFeatureTogglesManager( private var localFeatureTogglesMap: Map by Delegates.notNull() override suspend fun init() { - localFeatureTogglesStorage.init() + localTogglesStorage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH) val savedFeatureToggles = appPreferencesStore.getObjectSyncOrNull>( key = PreferencesKeys.FEATURE_TOGGLES_KEY, ) ?: emptyMap() - val localFeatureToggles = localFeatureTogglesStorage.featureToggles + val localFeatureToggles = localTogglesStorage.toggles .associateToggles(currentVersion = versionProvider.get().orEmpty()) localFeatureTogglesMap = localFeatureToggles diff --git a/core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/impl/FeatureTogglesConstants.kt b/core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/impl/FeatureTogglesConstants.kt new file mode 100644 index 0000000000..06fd9d9417 --- /dev/null +++ b/core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/impl/FeatureTogglesConstants.kt @@ -0,0 +1,6 @@ +package com.tangem.core.toggle.feature.impl + +internal object FeatureTogglesConstants { + + const val LOCAL_CONFIG_PATH: String = "configs/feature_toggles_config" +} \ No newline at end of file diff --git a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/manager/ProdFeatureTogglesManager.kt b/core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/impl/ProdFeatureTogglesManager.kt similarity index 63% rename from core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/manager/ProdFeatureTogglesManager.kt rename to core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/impl/ProdFeatureTogglesManager.kt index 0f88c3791c..4624273b81 100644 --- a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/manager/ProdFeatureTogglesManager.kt +++ b/core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/impl/ProdFeatureTogglesManager.kt @@ -1,27 +1,28 @@ -package com.tangem.core.featuretoggle.manager +package com.tangem.core.toggle.feature.impl import androidx.annotation.VisibleForTesting -import com.tangem.core.featuretoggle.storage.FeatureTogglesStorage -import com.tangem.core.featuretoggle.utils.associateToggles -import com.tangem.core.featuretoggle.version.VersionProvider +import com.tangem.core.toggle.feature.FeatureTogglesManager +import com.tangem.core.toggle.storage.TogglesStorage +import com.tangem.core.toggle.utils.associateToggles +import com.tangem.core.toggle.version.VersionProvider import kotlin.properties.Delegates /** * Feature toggles manager implementation in PROD build * - * @property localFeatureTogglesStorage local feature toggles storage + * @property localTogglesStorage local feature toggles storage * @property versionProvider application version provider */ internal class ProdFeatureTogglesManager( - private val localFeatureTogglesStorage: FeatureTogglesStorage, + private val localTogglesStorage: TogglesStorage, private val versionProvider: VersionProvider, ) : FeatureTogglesManager { private var featureToggles: Map by Delegates.notNull() override suspend fun init() { - localFeatureTogglesStorage.init() - featureToggles = localFeatureTogglesStorage.featureToggles + localTogglesStorage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH) + featureToggles = localTogglesStorage.toggles .associateToggles(currentVersion = versionProvider.get() ?: "") } diff --git a/core/toggles/src/main/kotlin/com/tangem/core/toggle/storage/LocalTogglesStorage.kt b/core/toggles/src/main/kotlin/com/tangem/core/toggle/storage/LocalTogglesStorage.kt new file mode 100644 index 0000000000..1fadc664bd --- /dev/null +++ b/core/toggles/src/main/kotlin/com/tangem/core/toggle/storage/LocalTogglesStorage.kt @@ -0,0 +1,24 @@ +package com.tangem.core.toggle.storage + +import com.tangem.datasource.asset.loader.AssetLoader +import kotlin.properties.Delegates + +/** + * Storage implementation for storing local feature toggles. + * Feature toggles are declared in file [LOCAL_CONFIG_PATH]. + * + * @property assetLoader asset loader + * +[REDACTED_AUTHOR] + */ +internal class LocalTogglesStorage( + private val assetLoader: AssetLoader, +) : TogglesStorage { + + override var toggles: List by Delegates.notNull() + private set + + override suspend fun populate(path: String) { + toggles = assetLoader.loadList(path) + } +} \ No newline at end of file diff --git a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/storage/FeatureToggle.kt b/core/toggles/src/main/kotlin/com/tangem/core/toggle/storage/Toggle.kt similarity index 53% rename from core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/storage/FeatureToggle.kt rename to core/toggles/src/main/kotlin/com/tangem/core/toggle/storage/Toggle.kt index b019bfc810..52973d28d3 100644 --- a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/storage/FeatureToggle.kt +++ b/core/toggles/src/main/kotlin/com/tangem/core/toggle/storage/Toggle.kt @@ -1,20 +1,20 @@ -package com.tangem.core.featuretoggle.storage +package com.tangem.core.toggle.storage import com.squareup.moshi.Json import com.squareup.moshi.JsonClass /** - * Data model with information about feature toggle + * Data model with information about config toggle * - * @property name feature toggle name + * @property name toggle name * @property version version number in which the feature will be included * - * IMPORTANT: if the version is "undefined", it means that feature toggle is disabled! + * IMPORTANT: if the version is "undefined", it means that toggle is disabled! * [REDACTED_AUTHOR] */ @JsonClass(generateAdapter = true) -internal data class FeatureToggle( +internal data class Toggle( @Json(name = "name") val name: String, @Json(name = "version") val version: String, ) \ No newline at end of file diff --git a/core/toggles/src/main/kotlin/com/tangem/core/toggle/storage/TogglesStorage.kt b/core/toggles/src/main/kotlin/com/tangem/core/toggle/storage/TogglesStorage.kt new file mode 100644 index 0000000000..43027a29c8 --- /dev/null +++ b/core/toggles/src/main/kotlin/com/tangem/core/toggle/storage/TogglesStorage.kt @@ -0,0 +1,15 @@ +package com.tangem.core.toggle.storage + +/** + * Component that initializes and stores a list of feature toggles + * +[REDACTED_AUTHOR] + */ +internal interface TogglesStorage { + + /** List of feature toggles */ + val toggles: List + + /** Populate the storage with toggles */ + suspend fun populate(path: String) +} \ No newline at end of file diff --git a/core/toggles/src/main/kotlin/com/tangem/core/toggle/utils/CollectionExt.kt b/core/toggles/src/main/kotlin/com/tangem/core/toggle/utils/CollectionExt.kt new file mode 100644 index 0000000000..44a378ac2c --- /dev/null +++ b/core/toggles/src/main/kotlin/com/tangem/core/toggle/utils/CollectionExt.kt @@ -0,0 +1,13 @@ +package com.tangem.core.toggle.utils + +import com.tangem.core.toggle.storage.Toggle +import com.tangem.core.toggle.version.VersionAvailabilityContract + +internal fun List.associateToggles(currentVersion: String): Map { + return associate { localToggle -> + Pair( + first = localToggle.name, + second = VersionAvailabilityContract(currentVersion, localToggle.version), + ) + } +} \ No newline at end of file diff --git a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/version/DefaultVersionProvider.kt b/core/toggles/src/main/kotlin/com/tangem/core/toggle/version/DefaultVersionProvider.kt similarity index 96% rename from core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/version/DefaultVersionProvider.kt rename to core/toggles/src/main/kotlin/com/tangem/core/toggle/version/DefaultVersionProvider.kt index c602be463f..e69c13e2eb 100644 --- a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/version/DefaultVersionProvider.kt +++ b/core/toggles/src/main/kotlin/com/tangem/core/toggle/version/DefaultVersionProvider.kt @@ -1,4 +1,4 @@ -package com.tangem.core.featuretoggle.version +package com.tangem.core.toggle.version import android.content.Context import android.content.pm.PackageManager diff --git a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/contract/Version.kt b/core/toggles/src/main/kotlin/com/tangem/core/toggle/version/Version.kt similarity index 98% rename from core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/contract/Version.kt rename to core/toggles/src/main/kotlin/com/tangem/core/toggle/version/Version.kt index b506d80ec4..60b3188565 100644 --- a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/contract/Version.kt +++ b/core/toggles/src/main/kotlin/com/tangem/core/toggle/version/Version.kt @@ -1,4 +1,4 @@ -package com.tangem.core.featuretoggle.contract +package com.tangem.core.toggle.version import androidx.annotation.VisibleForTesting import timber.log.Timber diff --git a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/contract/VersionAvailabilityContract.kt b/core/toggles/src/main/kotlin/com/tangem/core/toggle/version/VersionAvailabilityContract.kt similarity index 93% rename from core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/contract/VersionAvailabilityContract.kt rename to core/toggles/src/main/kotlin/com/tangem/core/toggle/version/VersionAvailabilityContract.kt index 2ee5c72e14..61f7e8f1e3 100644 --- a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/contract/VersionAvailabilityContract.kt +++ b/core/toggles/src/main/kotlin/com/tangem/core/toggle/version/VersionAvailabilityContract.kt @@ -1,4 +1,4 @@ -package com.tangem.core.featuretoggle.contract +package com.tangem.core.toggle.version /** * Version contract to evaluate availability of feature toggle diff --git a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/version/VersionProvider.kt b/core/toggles/src/main/kotlin/com/tangem/core/toggle/version/VersionProvider.kt similarity index 74% rename from core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/version/VersionProvider.kt rename to core/toggles/src/main/kotlin/com/tangem/core/toggle/version/VersionProvider.kt index 585caf85b8..1df39f1487 100644 --- a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/version/VersionProvider.kt +++ b/core/toggles/src/main/kotlin/com/tangem/core/toggle/version/VersionProvider.kt @@ -1,4 +1,4 @@ -package com.tangem.core.featuretoggle.version +package com.tangem.core.toggle.version /** Application version provider */ internal interface VersionProvider { diff --git a/core/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/contract/VersionAvailabilityContractTest.kt b/core/toggles/src/test/kotlin/com/tangem/core/toggle/contract/VersionAvailabilityContractTest.kt similarity index 94% rename from core/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/contract/VersionAvailabilityContractTest.kt rename to core/toggles/src/test/kotlin/com/tangem/core/toggle/contract/VersionAvailabilityContractTest.kt index 476c967367..f9907665f9 100644 --- a/core/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/contract/VersionAvailabilityContractTest.kt +++ b/core/toggles/src/test/kotlin/com/tangem/core/toggle/contract/VersionAvailabilityContractTest.kt @@ -1,6 +1,7 @@ -package com.tangem.core.featuretoggle.contract +package com.tangem.core.toggle.contract import com.google.common.truth.Truth +import com.tangem.core.toggle.version.VersionAvailabilityContract import org.junit.Test /** diff --git a/core/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/contract/VersionTest.kt b/core/toggles/src/test/kotlin/com/tangem/core/toggle/contract/VersionTest.kt similarity index 97% rename from core/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/contract/VersionTest.kt rename to core/toggles/src/test/kotlin/com/tangem/core/toggle/contract/VersionTest.kt index f8763c6a00..32c3815325 100644 --- a/core/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/contract/VersionTest.kt +++ b/core/toggles/src/test/kotlin/com/tangem/core/toggle/contract/VersionTest.kt @@ -1,6 +1,7 @@ -package com.tangem.core.featuretoggle.contract +package com.tangem.core.toggle.contract import com.google.common.truth.Truth +import com.tangem.core.toggle.version.Version import org.junit.Test /** diff --git a/core/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/manager/DevFeatureTogglesManagerTest.kt b/core/toggles/src/test/kotlin/com/tangem/core/toggle/manager/DevTogglesManagerTest.kt similarity index 81% rename from core/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/manager/DevFeatureTogglesManagerTest.kt rename to core/toggles/src/test/kotlin/com/tangem/core/toggle/manager/DevTogglesManagerTest.kt index e0e8fbef2f..31559dc763 100644 --- a/core/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/manager/DevFeatureTogglesManagerTest.kt +++ b/core/toggles/src/test/kotlin/com/tangem/core/toggle/manager/DevTogglesManagerTest.kt @@ -1,11 +1,12 @@ -package com.tangem.core.featuretoggle.manager +package com.tangem.core.toggle.manager import android.annotation.SuppressLint import com.google.common.truth.Truth -import com.tangem.core.featuretoggle.storage.FeatureToggle -import com.tangem.core.featuretoggle.storage.FeatureTogglesStorage -import com.tangem.core.featuretoggle.utils.associateToggles -import com.tangem.core.featuretoggle.version.VersionProvider +import com.tangem.core.toggle.feature.impl.DevFeatureTogglesManager +import com.tangem.core.toggle.storage.Toggle +import com.tangem.core.toggle.storage.TogglesStorage +import com.tangem.core.toggle.utils.associateToggles +import com.tangem.core.toggle.version.VersionProvider import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.local.preferences.PreferencesKeys import com.tangem.datasource.local.preferences.utils.getObjectSyncOrNull @@ -19,13 +20,13 @@ import kotlin.collections.set [REDACTED_AUTHOR] */ @SuppressLint("CheckResult") -internal class DevFeatureTogglesManagerTest { +internal class DevTogglesManagerTest { - private val localFeatureTogglesStorage = mockk() + private val localTogglesStorage = mockk() private val appPreferenceStore = mockk(relaxed = true) private val versionProvider = mockk() private val manager = DevFeatureTogglesManager( - localFeatureTogglesStorage = localFeatureTogglesStorage, + localTogglesStorage = localTogglesStorage, appPreferencesStore = appPreferenceStore, versionProvider = versionProvider, ) @@ -34,17 +35,17 @@ internal class DevFeatureTogglesManagerTest { fun `successfully initialize storage if shared prefs kept feature toggles`() = runTest { val currentVersion = "0.1.0" - coEvery { localFeatureTogglesStorage.init() } just Runs + coEvery { localTogglesStorage.populate() } just Runs coEvery { appPreferenceStore.getObjectSyncOrNull>(PreferencesKeys.FEATURE_TOGGLES_KEY) } returns savedFeatureTogglesMap - coEvery { localFeatureTogglesStorage.featureToggles } returns localFeatureToggles + coEvery { localTogglesStorage.toggles } returns localFeatureToggles coEvery { versionProvider.get() } returns currentVersion manager.init() coVerifyOrder { - localFeatureTogglesStorage.init() + localTogglesStorage.populate() versionProvider.get() } @@ -61,17 +62,17 @@ internal class DevFeatureTogglesManagerTest { fun `successfully initialize storage if shared prefs kept empty list`() = runTest { val currentVersion = "0.1.0" - coEvery { localFeatureTogglesStorage.init() } just Runs + coEvery { localTogglesStorage.populate() } just Runs coEvery { appPreferenceStore.getObjectSyncOrNull>(PreferencesKeys.FEATURE_TOGGLES_KEY) } returns emptyMap() - coEvery { localFeatureTogglesStorage.featureToggles } returns localFeatureToggles + coEvery { localTogglesStorage.toggles } returns localFeatureToggles coEvery { versionProvider.get() } returns currentVersion manager.init() coVerifyOrder { - localFeatureTogglesStorage.init() + localTogglesStorage.populate() versionProvider.get() } @@ -88,17 +89,17 @@ internal class DevFeatureTogglesManagerTest { fun `successfully initialize storage if shared prefs didn't keep feature toggles`() = runTest { val currentVersion = "0.1.0" - coEvery { localFeatureTogglesStorage.init() } just Runs + coEvery { localTogglesStorage.populate() } just Runs coEvery { appPreferenceStore.getObjectSyncOrNull>(PreferencesKeys.FEATURE_TOGGLES_KEY) } returns null - coEvery { localFeatureTogglesStorage.featureToggles } returns localFeatureToggles + coEvery { localTogglesStorage.toggles } returns localFeatureToggles coEvery { versionProvider.get() } returns currentVersion manager.init() coVerifyOrder { - localFeatureTogglesStorage.init() + localTogglesStorage.populate() versionProvider.get() } @@ -111,15 +112,15 @@ internal class DevFeatureTogglesManagerTest { @Test fun `successfully initialize storage if versionProvider returns null`() = runTest { - coEvery { localFeatureTogglesStorage.init() } just Runs + coEvery { localTogglesStorage.populate() } just Runs coEvery { appPreferenceStore.getSyncOrNull(PreferencesKeys.FEATURE_TOGGLES_KEY) } returns savedFeatureToggles - coEvery { localFeatureTogglesStorage.featureToggles } returns localFeatureToggles + coEvery { localTogglesStorage.toggles } returns localFeatureToggles coEvery { versionProvider.get() } returns null manager.init() coVerifyOrder { - localFeatureTogglesStorage.init() + localTogglesStorage.populate() versionProvider.get() } @@ -222,8 +223,8 @@ internal class DevFeatureTogglesManagerTest { ) val localFeatureToggles = listOf( - FeatureToggle(name = "INACTIVE_TEST_FEATURE_ENABLED", version = "undefined"), - FeatureToggle(name = "ACTIVE2_TEST_FEATURE_ENABLED", version = "1.0.0"), + Toggle(name = "INACTIVE_TEST_FEATURE_ENABLED", version = "undefined"), + Toggle(name = "ACTIVE2_TEST_FEATURE_ENABLED", version = "1.0.0"), ) } } \ No newline at end of file diff --git a/core/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/manager/ProdFeatureTogglesManagerTest.kt b/core/toggles/src/test/kotlin/com/tangem/core/toggle/manager/ProdTogglesManagerTest.kt similarity index 69% rename from core/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/manager/ProdFeatureTogglesManagerTest.kt rename to core/toggles/src/test/kotlin/com/tangem/core/toggle/manager/ProdTogglesManagerTest.kt index 35af42ae54..6b1841cb28 100644 --- a/core/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/manager/ProdFeatureTogglesManagerTest.kt +++ b/core/toggles/src/test/kotlin/com/tangem/core/toggle/manager/ProdTogglesManagerTest.kt @@ -1,11 +1,12 @@ -package com.tangem.core.featuretoggle.manager +package com.tangem.core.toggle.manager import android.content.pm.PackageManager import com.google.common.truth.Truth -import com.tangem.core.featuretoggle.storage.FeatureToggle -import com.tangem.core.featuretoggle.storage.FeatureTogglesStorage -import com.tangem.core.featuretoggle.utils.associateToggles -import com.tangem.core.featuretoggle.version.VersionProvider +import com.tangem.core.toggle.feature.impl.ProdFeatureTogglesManager +import com.tangem.core.toggle.storage.Toggle +import com.tangem.core.toggle.storage.TogglesStorage +import com.tangem.core.toggle.utils.associateToggles +import com.tangem.core.toggle.version.VersionProvider import io.mockk.* import kotlinx.coroutines.test.runTest import org.junit.Test @@ -13,24 +14,24 @@ import org.junit.Test /** [REDACTED_AUTHOR] */ -internal class ProdFeatureTogglesManagerTest { +internal class ProdTogglesManagerTest { - private val localFeatureTogglesStorage = mockk() + private val localTogglesStorage = mockk() private val versionProvider = mockk() - private val manager = ProdFeatureTogglesManager(localFeatureTogglesStorage, versionProvider) + private val manager = ProdFeatureTogglesManager(localTogglesStorage, versionProvider) @Test fun `successfully initialize storage`() = runTest { val currentVersion = "1.0.0" - coEvery { localFeatureTogglesStorage.init() } just Runs - every { localFeatureTogglesStorage.featureToggles } returns localFeatureToggles + coEvery { localTogglesStorage.populate() } just Runs + every { localTogglesStorage.toggles } returns localFeatureToggles every { versionProvider.get() } returns currentVersion manager.init() coVerifyOrder { - localFeatureTogglesStorage.init() + localTogglesStorage.populate() versionProvider.get() } @@ -40,14 +41,14 @@ internal class ProdFeatureTogglesManagerTest { @Test fun `successfully initialize storage if versionProvider returns null`() = runTest { - coEvery { localFeatureTogglesStorage.init() } just Runs - every { localFeatureTogglesStorage.featureToggles } returns localFeatureToggles + coEvery { localTogglesStorage.populate() } just Runs + every { localTogglesStorage.toggles } returns localFeatureToggles every { versionProvider.get() } returns null manager.init() coVerifyOrder { - localFeatureTogglesStorage.init() + localTogglesStorage.populate() versionProvider.get() } @@ -56,8 +57,8 @@ internal class ProdFeatureTogglesManagerTest { @Test fun `failure initialize storage if localFeatureTogglesStorage throws exception`() = runTest { - coEvery { localFeatureTogglesStorage.init() } just Runs - every { localFeatureTogglesStorage.featureToggles } throws IllegalStateException( + coEvery { localTogglesStorage.populate() } just Runs + every { localTogglesStorage.toggles } throws IllegalStateException( "Property featureToggles should be initialized before get.", ) @@ -72,14 +73,14 @@ internal class ProdFeatureTogglesManagerTest { Truth.assertThat(it).isInstanceOf(IllegalStateException::class.java) } - coVerifyOrder { localFeatureTogglesStorage.init() } + coVerifyOrder { localTogglesStorage.populate() } verifyAll(inverse = true) { versionProvider.get() } } @Test fun `failure initialize storage if versionProvider throws exception`() = runTest { - coEvery { localFeatureTogglesStorage.init() } just Runs - every { localFeatureTogglesStorage.featureToggles } returns localFeatureToggles + coEvery { localTogglesStorage.populate() } just Runs + every { localTogglesStorage.toggles } returns localFeatureToggles every { versionProvider.get() } throws PackageManager.NameNotFoundException() runCatching { manager.init() } @@ -89,7 +90,7 @@ internal class ProdFeatureTogglesManagerTest { } coVerifyOrder { - localFeatureTogglesStorage.init() + localTogglesStorage.populate() versionProvider.get() } } @@ -122,8 +123,8 @@ internal class ProdFeatureTogglesManagerTest { private companion object { val localFeatureToggles = listOf( - FeatureToggle(name = "INACTIVE_TEST_FEATURE_ENABLED", version = "undefined"), - FeatureToggle(name = "ACTIVE2_TEST_FEATURE_ENABLED", version = "1.0.0"), + Toggle(name = "INACTIVE_TEST_FEATURE_ENABLED", version = "undefined"), + Toggle(name = "ACTIVE2_TEST_FEATURE_ENABLED", version = "1.0.0"), ) val disabledFeatureToggles = mapOf( diff --git a/core/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/storage/LocalFeatureTogglesStorageTest.kt b/core/toggles/src/test/kotlin/com/tangem/core/toggle/storage/LocalTogglesStorageTest.kt similarity index 74% rename from core/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/storage/LocalFeatureTogglesStorageTest.kt rename to core/toggles/src/test/kotlin/com/tangem/core/toggle/storage/LocalTogglesStorageTest.kt index 3950e2c649..948f4d8f8e 100644 --- a/core/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/storage/LocalFeatureTogglesStorageTest.kt +++ b/core/toggles/src/test/kotlin/com/tangem/core/toggle/storage/LocalTogglesStorageTest.kt @@ -1,4 +1,4 @@ -package com.tangem.core.featuretoggle.storage +package com.tangem.core.toggle.storage import android.annotation.SuppressLint import com.google.common.truth.Truth @@ -16,16 +16,16 @@ import java.io.IOException [REDACTED_AUTHOR] */ @SuppressLint("CheckResult") -internal class LocalFeatureTogglesStorageTest { +internal class LocalTogglesStorageTest { private val assetReader = mockk() private val moshi = mockk() - private val jsonAdapter = mockk>>() + private val jsonAdapter = mockk>>() // Impossible to mockk AssetLoader because it implement inline functions private val assetLoader = AssetLoader(assetReader = assetReader, moshi = moshi) - private val storage = LocalFeatureTogglesStorage(assetLoader) + private val storage = LocalTogglesStorage(assetLoader) @Test fun `successfully initialize storage`() = runTest { @@ -33,14 +33,14 @@ internal class LocalFeatureTogglesStorageTest { everyCreatingMoshiAdapter() returns jsonAdapter everyMappingJson() returns featureToggles - storage.init() + storage.populate() coVerifyOrder { assetReader.read(CONFIG_FILE_NAME) jsonAdapter.fromJson(json) } - Truth.assertThat(storage.featureToggles).containsExactlyElementsIn(featureToggles) + Truth.assertThat(storage.toggles).containsExactlyElementsIn(featureToggles) } @Test @@ -49,33 +49,33 @@ internal class LocalFeatureTogglesStorageTest { everyCreatingMoshiAdapter() returns jsonAdapter everyMappingJson() throws IOException() - storage.init() + storage.populate() coVerifyOrder { assetReader.read(CONFIG_FILE_NAME) jsonAdapter.fromJson(json) } - Truth.assertThat(storage.featureToggles).containsExactlyElementsIn(emptyList()) + Truth.assertThat(storage.toggles).containsExactlyElementsIn(emptyList()) } @Test fun `failure initialize storage if jsonAdapter throws exception`() = runTest { everyReadingJson() throws IOException() - storage.init() + storage.populate() coVerifyOrder { assetReader.read(CONFIG_FILE_NAME) } verifyAll(inverse = true) { jsonAdapter.fromJson(any()) } - Truth.assertThat(storage.featureToggles).containsExactlyElementsIn(emptyList()) + Truth.assertThat(storage.toggles).containsExactlyElementsIn(emptyList()) } private fun everyReadingJson() = coEvery { assetReader.read(CONFIG_FILE_NAME) } private fun everyCreatingMoshiAdapter() = every { - val types = Types.newParameterizedType(List::class.java, FeatureToggle::class.java) - moshi.adapter>(types) + val types = Types.newParameterizedType(List::class.java, Toggle::class.java) + moshi.adapter>(types) } private fun everyMappingJson() = every { jsonAdapter.fromJson(json) } @@ -97,8 +97,8 @@ internal class LocalFeatureTogglesStorageTest { """.trimIndent() val featureToggles = listOf( - FeatureToggle(name = "INACTIVE_TEST_FEATURE_ENABLED", version = "undefined"), - FeatureToggle(name = "ACTIVE2_TEST_FEATURE_ENABLED", version = "1.0.0"), + Toggle(name = "INACTIVE_TEST_FEATURE_ENABLED", version = "undefined"), + Toggle(name = "ACTIVE2_TEST_FEATURE_ENABLED", version = "1.0.0"), ) } } \ No newline at end of file diff --git a/features/details/impl/build.gradle.kts b/features/details/impl/build.gradle.kts index 9a16bc4892..b38b859e27 100644 --- a/features/details/impl/build.gradle.kts +++ b/features/details/impl/build.gradle.kts @@ -21,7 +21,7 @@ dependencies { /* Project - Core */ implementation(projects.core.decompose) implementation(projects.core.ui) - implementation(projects.core.featuretoggles) + implementation(projects.core.toggles) implementation(projects.core.navigation) implementation(projects.core.analytics) implementation(projects.core.analytics.models) diff --git a/features/disclaimer/impl/build.gradle.kts b/features/disclaimer/impl/build.gradle.kts index d60dcd1885..443b47a2ac 100644 --- a/features/disclaimer/impl/build.gradle.kts +++ b/features/disclaimer/impl/build.gradle.kts @@ -28,7 +28,7 @@ dependencies { /** Core modules */ implementation(projects.core.ui) implementation(projects.core.utils) - implementation(projects.core.featuretoggles) + implementation(projects.core.toggles) implementation(projects.core.navigation) implementation(projects.core.decompose) implementation(projects.common.routing) diff --git a/features/manage-tokens/impl/build.gradle.kts b/features/manage-tokens/impl/build.gradle.kts index 93e730eb6f..896ec5d1c3 100644 --- a/features/manage-tokens/impl/build.gradle.kts +++ b/features/manage-tokens/impl/build.gradle.kts @@ -19,7 +19,7 @@ dependencies { implementation(projects.core.decompose) implementation(projects.core.ui) implementation(projects.common.routing) - implementation(projects.core.featuretoggles) + implementation(projects.core.toggles) implementation(projects.core.analytics) /* Project - Domain */ diff --git a/features/markets/impl/build.gradle.kts b/features/markets/impl/build.gradle.kts index 94012bfcb8..ee18d8dfb1 100644 --- a/features/markets/impl/build.gradle.kts +++ b/features/markets/impl/build.gradle.kts @@ -63,7 +63,7 @@ dependencies { /* Core */ implementation(projects.core.decompose) implementation(projects.core.ui) - implementation(projects.core.featuretoggles) + implementation(projects.core.toggles) implementation(projects.core.analytics) implementation(projects.core.analytics.models) diff --git a/features/onboarding-v2/impl/build.gradle.kts b/features/onboarding-v2/impl/build.gradle.kts index 5e2dc1d547..d9d42209ae 100644 --- a/features/onboarding-v2/impl/build.gradle.kts +++ b/features/onboarding-v2/impl/build.gradle.kts @@ -16,7 +16,7 @@ dependencies { implementation(projects.features.onboardingV2.api) /** Core modules */ - implementation(projects.core.featuretoggles) + implementation(projects.core.toggles) implementation(projects.core.analytics) implementation(projects.core.analytics.models) implementation(projects.core.utils) diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/DefaultOnboardingV2FeatureToggles.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/DefaultOnboardingV2FeatureToggles.kt index fe67d84f57..d677f7e5bf 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/DefaultOnboardingV2FeatureToggles.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/DefaultOnboardingV2FeatureToggles.kt @@ -1,6 +1,6 @@ package com.tangem.features.onboarding.v2 -import com.tangem.core.featuretoggle.manager.FeatureTogglesManager +import com.tangem.core.toggle.feature.FeatureTogglesManager import javax.inject.Inject internal class DefaultOnboardingV2FeatureToggles @Inject constructor( diff --git a/features/onboarding/build.gradle.kts b/features/onboarding/build.gradle.kts index 9f081a463f..480638468a 100644 --- a/features/onboarding/build.gradle.kts +++ b/features/onboarding/build.gradle.kts @@ -15,7 +15,7 @@ dependencies { /** Core modules */ implementation(project(":common")) implementation(project(":domain:models")) - implementation(project(":core:featuretoggles")) + implementation(project(":core:toggles")) implementation(project(":core:datasource")) implementation(project(":core:analytics")) implementation(projects.core.analytics.models) diff --git a/features/onramp/impl/build.gradle.kts b/features/onramp/impl/build.gradle.kts index c97691d146..b6a32faee2 100644 --- a/features/onramp/impl/build.gradle.kts +++ b/features/onramp/impl/build.gradle.kts @@ -21,7 +21,7 @@ dependencies { /** Project - Core */ implementation(projects.core.decompose) implementation(projects.core.ui) - implementation(projects.core.featuretoggles) + implementation(projects.core.toggles) implementation(projects.core.navigation) /** Project - Common */ diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/DefaultOnrampFeatureToggles.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/DefaultOnrampFeatureToggles.kt index 15d7dd6713..2669d201e9 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/DefaultOnrampFeatureToggles.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/DefaultOnrampFeatureToggles.kt @@ -1,6 +1,6 @@ package com.tangem.features.onramp -import com.tangem.core.featuretoggle.manager.FeatureTogglesManager +import com.tangem.core.toggle.feature.FeatureTogglesManager internal class DefaultOnrampFeatureToggles( private val featureTogglesManager: FeatureTogglesManager, diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/OnrampFeatureModule.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/OnrampFeatureModule.kt index 6e668e4f69..3392e56a71 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/OnrampFeatureModule.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/OnrampFeatureModule.kt @@ -1,6 +1,8 @@ package com.tangem.features.onramp -import com.tangem.core.featuretoggle.manager.FeatureTogglesManager +import com.tangem.core.toggle.feature.FeatureTogglesManager +import com.tangem.features.onramp.DefaultOnrampFeatureToggles +import com.tangem.features.onramp.OnrampFeatureToggles import dagger.Module import dagger.Provides import dagger.hilt.InstallIn diff --git a/features/push-notifications/impl/build.gradle.kts b/features/push-notifications/impl/build.gradle.kts index a9965b5681..5cb0bfe1d8 100644 --- a/features/push-notifications/impl/build.gradle.kts +++ b/features/push-notifications/impl/build.gradle.kts @@ -27,7 +27,7 @@ dependencies { /** Core modules */ implementation(projects.core.ui) - implementation(projects.core.featuretoggles) + implementation(projects.core.toggles) implementation(projects.core.navigation) implementation(projects.core.analytics) implementation(projects.core.analytics.models) diff --git a/features/send/impl/build.gradle.kts b/features/send/impl/build.gradle.kts index 14e47173a5..1af9e0ba59 100644 --- a/features/send/impl/build.gradle.kts +++ b/features/send/impl/build.gradle.kts @@ -43,7 +43,7 @@ dependencies { implementation(deps.tangem.blockchain) /** Core modules */ - implementation(projects.core.featuretoggles) + implementation(projects.core.toggles) implementation(projects.core.ui) implementation(projects.core.utils) implementation(projects.core.navigation) diff --git a/features/staking/impl/build.gradle.kts b/features/staking/impl/build.gradle.kts index 808810f2d7..ed61b2bdcb 100644 --- a/features/staking/impl/build.gradle.kts +++ b/features/staking/impl/build.gradle.kts @@ -40,7 +40,7 @@ dependencies { implementation(deps.tangem.blockchain) /** Core modules */ - implementation(projects.core.featuretoggles) + implementation(projects.core.toggles) implementation(projects.core.ui) implementation(projects.core.utils) implementation(projects.core.navigation) diff --git a/features/swap/presentation/build.gradle.kts b/features/swap/presentation/build.gradle.kts index 84cbe75297..23df0ea2f3 100644 --- a/features/swap/presentation/build.gradle.kts +++ b/features/swap/presentation/build.gradle.kts @@ -15,7 +15,7 @@ dependencies { /** Core modules */ implementation(projects.core.analytics) implementation(projects.core.analytics.models) - implementation(projects.core.featuretoggles) + implementation(projects.core.toggles) implementation(projects.core.navigation) implementation(projects.core.utils) implementation(projects.core.ui) diff --git a/features/tester/impl/build.gradle.kts b/features/tester/impl/build.gradle.kts index 0e94a8abeb..6158abaeb9 100644 --- a/features/tester/impl/build.gradle.kts +++ b/features/tester/impl/build.gradle.kts @@ -39,7 +39,7 @@ dependencies { /** Core modules */ implementation(projects.core.datasource) - implementation(projects.core.featuretoggles) + implementation(projects.core.toggles) implementation(projects.core.ui) implementation(projects.core.utils) implementation(projects.core.navigation) diff --git a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/featuretoggles/viewmodels/FeatureTogglesViewModel.kt b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/featuretoggles/viewmodels/FeatureTogglesViewModel.kt index 2af75d3b80..34b965c18b 100644 --- a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/featuretoggles/viewmodels/FeatureTogglesViewModel.kt +++ b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/featuretoggles/viewmodels/FeatureTogglesViewModel.kt @@ -5,9 +5,9 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.tangem.core.featuretoggle.manager.FeatureTogglesManager -import com.tangem.core.featuretoggle.manager.MutableFeatureTogglesManager import com.tangem.core.navigation.finisher.AppFinisher +import com.tangem.core.toggle.feature.FeatureTogglesManager +import com.tangem.core.toggle.feature.MutableFeatureTogglesManager import com.tangem.feature.tester.presentation.featuretoggles.models.TesterFeatureToggle import com.tangem.feature.tester.presentation.featuretoggles.state.FeatureTogglesContentState import com.tangem.feature.tester.presentation.navigation.InnerTesterRouter diff --git a/features/tokendetails/impl/build.gradle.kts b/features/tokendetails/impl/build.gradle.kts index 32efd6bb49..cf37f98aed 100644 --- a/features/tokendetails/impl/build.gradle.kts +++ b/features/tokendetails/impl/build.gradle.kts @@ -54,7 +54,7 @@ dependencies { implementation(projects.core.datasource) implementation(projects.core.deepLinks) implementation(projects.core.deepLinks.global) - implementation(projects.core.featuretoggles) + implementation(projects.core.toggles) implementation(projects.core.decompose) implementation(projects.common.ui) diff --git a/features/wallet-settings/impl/build.gradle.kts b/features/wallet-settings/impl/build.gradle.kts index e472817d13..5af449e0c1 100644 --- a/features/wallet-settings/impl/build.gradle.kts +++ b/features/wallet-settings/impl/build.gradle.kts @@ -20,7 +20,7 @@ dependencies { /* Project - Core */ implementation(projects.core.decompose) implementation(projects.core.ui) - implementation(projects.core.featuretoggles) + implementation(projects.core.toggles) implementation(projects.core.navigation) implementation(projects.core.analytics) implementation(projects.core.analytics.models) diff --git a/features/wallet/impl/build.gradle.kts b/features/wallet/impl/build.gradle.kts index 6164b3a3cc..4ed8e4e465 100644 --- a/features/wallet/impl/build.gradle.kts +++ b/features/wallet/impl/build.gradle.kts @@ -46,7 +46,7 @@ dependencies { kapt(deps.hilt.kapt) /** Core modules */ - implementation(projects.core.featuretoggles) + implementation(projects.core.toggles) implementation(projects.core.navigation) implementation(projects.core.ui) implementation(projects.core.utils) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/featuretoggles/DefaultWalletFeatureToggles.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/featuretoggles/DefaultWalletFeatureToggles.kt index cda1776fc1..b32cabf35d 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/featuretoggles/DefaultWalletFeatureToggles.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/featuretoggles/DefaultWalletFeatureToggles.kt @@ -1,6 +1,6 @@ package com.tangem.feature.wallet.featuretoggles -import com.tangem.core.featuretoggle.manager.FeatureTogglesManager +import com.tangem.core.toggle.feature.FeatureTogglesManager import com.tangem.features.wallet.featuretoggles.WalletFeatureToggles import javax.inject.Inject diff --git a/libs/blockchain-sdk/build.gradle.kts b/libs/blockchain-sdk/build.gradle.kts index 47b65e7313..864077c492 100644 --- a/libs/blockchain-sdk/build.gradle.kts +++ b/libs/blockchain-sdk/build.gradle.kts @@ -13,7 +13,7 @@ dependencies { // region Core modules implementation(projects.core.datasource) - implementation(projects.core.featuretoggles) + implementation(projects.core.toggles) implementation(projects.core.utils) // endregion 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 de38a2241f..5e75ba18ed 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 @@ -9,7 +9,7 @@ import com.tangem.blockchainsdk.datastorage.DefaultBlockchainDataStorage import com.tangem.blockchainsdk.featuretoggles.DefaultBlockchainSDKFeatureToggles import com.tangem.blockchainsdk.loader.BlockchainProvidersResponseLoader import com.tangem.blockchainsdk.store.DefaultRuntimeStore -import com.tangem.core.featuretoggle.manager.FeatureTogglesManager +import com.tangem.core.toggle.feature.FeatureTogglesManager import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.local.config.environment.EnvironmentConfigStorage import com.tangem.datasource.local.preferences.AppPreferencesStore diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/featuretoggles/DefaultBlockchainSDKFeatureToggles.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/featuretoggles/DefaultBlockchainSDKFeatureToggles.kt index 29df94634c..99a4bfeaa0 100644 --- a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/featuretoggles/DefaultBlockchainSDKFeatureToggles.kt +++ b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/featuretoggles/DefaultBlockchainSDKFeatureToggles.kt @@ -1,6 +1,6 @@ package com.tangem.blockchainsdk.featuretoggles -import com.tangem.core.featuretoggle.manager.FeatureTogglesManager +import com.tangem.core.toggle.feature.FeatureTogglesManager internal class DefaultBlockchainSDKFeatureToggles( private val featureTogglesManager: FeatureTogglesManager, diff --git a/settings.gradle.kts b/settings.gradle.kts index f915fb1945..a84de9b176 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -127,7 +127,7 @@ include(":common:routing") include(":core:analytics") include(":core:analytics:models") include(":core:datasource") -include(":core:featuretoggles") +include(":core:toggles") include(":core:navigation") include(":core:res") include(":core:ui") From 4773ed2485a075c35b87bc16503d00ae2cec0cf9 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 23 Oct 2024 18:30:02 +0400 Subject: [PATCH 2/5] Updated on 2026-08-14 --- .../com/tangem/tap/ApplicationEntryPoint.kt | 6 ++ .../java/com/tangem/tap/TangemApplication.kt | 23 ++++-- .../local/preferences/PreferencesKeys.kt | 2 + .../utils/AppPreferencesStoreExt.kt | 6 ++ .../configs/excluded_blockchains_config.json | 8 +- .../blockchain/ExcludedBlockchainsManager.kt | 8 ++ .../MutableExcludedBlockchainsManager.kt | 10 +++ .../impl/DefaultExcludedBlockchainsManager.kt | 73 +++++++++++++++++++ .../di/ExcludedBlockchainsManagerModule.kt | 49 +++++++++++++ 9 files changed, 175 insertions(+), 10 deletions(-) create mode 100644 core/toggles/src/main/kotlin/com/tangem/core/toggle/blockchain/ExcludedBlockchainsManager.kt create mode 100644 core/toggles/src/main/kotlin/com/tangem/core/toggle/blockchain/MutableExcludedBlockchainsManager.kt create mode 100644 core/toggles/src/main/kotlin/com/tangem/core/toggle/blockchain/impl/DefaultExcludedBlockchainsManager.kt create mode 100644 core/toggles/src/main/kotlin/com/tangem/core/toggle/di/ExcludedBlockchainsManagerModule.kt diff --git a/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt b/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt index 4a7cf3ec44..ff04434dfa 100644 --- a/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt +++ b/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt @@ -7,6 +7,7 @@ import com.tangem.common.routing.AppRouter import com.tangem.core.analytics.filter.OneTimeEventFilter import com.tangem.core.navigation.share.ShareManager import com.tangem.core.navigation.url.UrlOpener +import com.tangem.core.toggle.blockchain.ExcludedBlockchainsManager import com.tangem.core.toggle.feature.FeatureTogglesManager import com.tangem.datasource.connection.NetworkConnectionManager import com.tangem.datasource.local.config.environment.EnvironmentConfigStorage @@ -34,6 +35,7 @@ import com.tangem.tap.common.log.TangemAppLoggerInitializer import com.tangem.tap.domain.scanCard.CardScanningFeatureToggles import com.tangem.tap.features.home.featuretoggles.HomeFeatureToggles import com.tangem.tap.proxy.AppStateHolder +import com.tangem.utils.coroutines.CoroutineDispatcherProvider import dagger.hilt.EntryPoint import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent @@ -52,6 +54,8 @@ interface ApplicationEntryPoint { fun getFeatureTogglesManager(): FeatureTogglesManager + fun getExcludedBlockchainsManager(): ExcludedBlockchainsManager + fun getNetworkConnectionManager(): NetworkConnectionManager fun getCardScanningFeatureToggles(): CardScanningFeatureToggles @@ -113,4 +117,6 @@ interface ApplicationEntryPoint { fun getOnrampFeatureToggles(): OnrampFeatureToggles fun getOnboardingV2FeatureToggles(): OnboardingV2FeatureToggles + + fun getCoroutineDispatcherProvider(): CoroutineDispatcherProvider } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/TangemApplication.kt b/app/src/main/java/com/tangem/tap/TangemApplication.kt index 0790e718b8..287f99d263 100644 --- a/app/src/main/java/com/tangem/tap/TangemApplication.kt +++ b/app/src/main/java/com/tangem/tap/TangemApplication.kt @@ -17,6 +17,7 @@ import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.analytics.models.Basic import com.tangem.core.analytics.models.Basic.TransactionSent.WalletForm +import com.tangem.core.toggle.blockchain.ExcludedBlockchainsManager import com.tangem.core.toggle.feature.FeatureTogglesManager import com.tangem.datasource.api.common.MoshiConverter import com.tangem.datasource.api.common.createNetworkLoggingInterceptor @@ -57,9 +58,11 @@ import com.tangem.tap.domain.tasks.product.DerivationsFinder import com.tangem.tap.features.home.featuretoggles.HomeFeatureToggles import com.tangem.tap.proxy.AppStateHolder import com.tangem.tap.proxy.redux.DaggerGraphState -import com.tangem.utils.coroutines.AppCoroutineDispatcherProvider +import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.wallet.BuildConfig import dagger.hilt.EntryPoints +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll import kotlinx.coroutines.runBlocking import org.rekotlin.Store import com.tangem.tap.domain.walletconnect2.domain.LegacyWalletConnectRepository as WalletConnect2Repository @@ -88,6 +91,9 @@ abstract class TangemApplication : Application(), ImageLoaderFactory { private val featureTogglesManager: FeatureTogglesManager get() = entryPoint.getFeatureTogglesManager() + private val excludedBlockchainsManager: ExcludedBlockchainsManager + get() = entryPoint.getExcludedBlockchainsManager() + private val networkConnectionManager: NetworkConnectionManager get() = entryPoint.getNetworkConnectionManager() @@ -180,6 +186,9 @@ abstract class TangemApplication : Application(), ImageLoaderFactory { private val onboardingV2FeatureToggles: OnboardingV2FeatureToggles get() = entryPoint.getOnboardingV2FeatureToggles() + + private val dispatchers: CoroutineDispatcherProvider + get() = entryPoint.getCoroutineDispatcherProvider() // endregion override fun onCreate() { @@ -199,10 +208,12 @@ abstract class TangemApplication : Application(), ImageLoaderFactory { // TODO: Try to performance and user experience. // [REDACTED_JIRA] - runBlocking { - featureTogglesManager.init() - - initWithConfigDependency(environmentConfig = environmentConfigStorage.initialize()) + runBlocking(dispatchers.io) { + awaitAll( + async { featureTogglesManager.init() }, + async { excludedBlockchainsManager.init() }, + async { initWithConfigDependency(environmentConfig = environmentConfigStorage.initialize()) }, + ) } loadNativeLibraries() @@ -216,7 +227,7 @@ abstract class TangemApplication : Application(), ImageLoaderFactory { derivationsFinder = DerivationsFinder( appPreferencesStore = appPreferencesStore, - dispatchers = AppCoroutineDispatcherProvider(), + dispatchers = dispatchers, ) appStateHolder.mainStore = store diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/preferences/PreferencesKeys.kt b/core/datasource/src/main/java/com/tangem/datasource/local/preferences/PreferencesKeys.kt index 5fd333db8a..1f4b7caf2b 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/preferences/PreferencesKeys.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/local/preferences/PreferencesKeys.kt @@ -55,6 +55,8 @@ object PreferencesKeys { val FEATURE_TOGGLES_KEY by lazy { stringPreferencesKey(name = "featureToggles") } + val EXCLUDED_BLOCKCHAINS_KEY by lazy { stringPreferencesKey(name = "excludedBlockchains") } + val WAS_TWINS_ONBOARDING_SHOWN by lazy { booleanPreferencesKey(name = "twinsOnboardingShown") } val IS_TANGEM_TOS_ACCEPTED_KEY by lazy { booleanPreferencesKey(name = "tangem_tos_accepted") } diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/preferences/utils/AppPreferencesStoreExt.kt b/core/datasource/src/main/java/com/tangem/datasource/local/preferences/utils/AppPreferencesStoreExt.kt index 0369cf22cd..ebfe3c221d 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/preferences/utils/AppPreferencesStoreExt.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/local/preferences/utils/AppPreferencesStoreExt.kt @@ -98,6 +98,12 @@ suspend inline fun AppPreferencesStore.storeObjectList(key: Preferen edit { it[key] = adapter.toJson(value) } } +/** Store set of data [value] by string [key] */ +suspend inline fun AppPreferencesStore.storeObjectSet(key: Preferences.Key, value: Set) { + val adapter = moshi.adapter>(Types.newParameterizedType(Set::class.java, T::class.java)) + edit { it[key] = adapter.toJson(value) } +} + /** Get flow of list of data [T] by string [key]. If data is not found, it returns `null` */ inline fun AppPreferencesStore.getObjectList(key: Preferences.Key): Flow?> { val adapter = moshi.adapter>(Types.newParameterizedType(List::class.java, T::class.java)) diff --git a/core/toggles/src/main/assets/configs/excluded_blockchains_config.json b/core/toggles/src/main/assets/configs/excluded_blockchains_config.json index fe5273f780..4113610e04 100644 --- a/core/toggles/src/main/assets/configs/excluded_blockchains_config.json +++ b/core/toggles/src/main/assets/configs/excluded_blockchains_config.json @@ -1,10 +1,10 @@ [ { - "mainnet_id": "", - "excluded_till": "undefined" + "name": "", + "version": "undefined" }, { - "mainnet_id": "NEXA", - "excluded_till": "undefined" + "name": "NEXA", + "version": "undefined" } ] \ No newline at end of file diff --git a/core/toggles/src/main/kotlin/com/tangem/core/toggle/blockchain/ExcludedBlockchainsManager.kt b/core/toggles/src/main/kotlin/com/tangem/core/toggle/blockchain/ExcludedBlockchainsManager.kt new file mode 100644 index 0000000000..fd6c3a91ae --- /dev/null +++ b/core/toggles/src/main/kotlin/com/tangem/core/toggle/blockchain/ExcludedBlockchainsManager.kt @@ -0,0 +1,8 @@ +package com.tangem.core.toggle.blockchain + +interface ExcludedBlockchainsManager { + + val excludedBlockchainsIds: Set + + suspend fun init() +} \ No newline at end of file diff --git a/core/toggles/src/main/kotlin/com/tangem/core/toggle/blockchain/MutableExcludedBlockchainsManager.kt b/core/toggles/src/main/kotlin/com/tangem/core/toggle/blockchain/MutableExcludedBlockchainsManager.kt new file mode 100644 index 0000000000..7e2f28e33e --- /dev/null +++ b/core/toggles/src/main/kotlin/com/tangem/core/toggle/blockchain/MutableExcludedBlockchainsManager.kt @@ -0,0 +1,10 @@ +package com.tangem.core.toggle.blockchain + +interface MutableExcludedBlockchainsManager : ExcludedBlockchainsManager { + + suspend fun excludeBlockchain(mainnetId: String, isExcluded: Boolean) + + fun isMatchLocalConfig(): Boolean + + suspend fun recoverLocalConfig() +} \ No newline at end of file diff --git a/core/toggles/src/main/kotlin/com/tangem/core/toggle/blockchain/impl/DefaultExcludedBlockchainsManager.kt b/core/toggles/src/main/kotlin/com/tangem/core/toggle/blockchain/impl/DefaultExcludedBlockchainsManager.kt new file mode 100644 index 0000000000..1f1469773b --- /dev/null +++ b/core/toggles/src/main/kotlin/com/tangem/core/toggle/blockchain/impl/DefaultExcludedBlockchainsManager.kt @@ -0,0 +1,73 @@ +package com.tangem.core.toggle.blockchain.impl + +import com.tangem.core.toggle.blockchain.MutableExcludedBlockchainsManager +import com.tangem.core.toggle.storage.TogglesStorage +import com.tangem.core.toggle.utils.associateToggles +import com.tangem.core.toggle.version.VersionProvider +import com.tangem.datasource.local.preferences.AppPreferencesStore +import com.tangem.datasource.local.preferences.PreferencesKeys +import com.tangem.datasource.local.preferences.utils.getObjectSetSync +import com.tangem.datasource.local.preferences.utils.storeObjectSet + +internal class DefaultExcludedBlockchainsManager( + private val localTogglesStorage: TogglesStorage, + private val appPreferencesStore: AppPreferencesStore, + private val versionProvider: VersionProvider, +) : MutableExcludedBlockchainsManager { + + private var isInitialized: Boolean = false + + private lateinit var currentExcludedBlockchainsIds: Set + private lateinit var localExcludedBlockchainsIds: Set + + override val excludedBlockchainsIds: Set + get() { + if (!isInitialized) error("ExcludedBlockchainsManager is not initialized") + + return currentExcludedBlockchainsIds + } + + override suspend fun init() { + localTogglesStorage.populate(path = "configs/excluded_blockchains_config") + + val storedExcludedBlockchainsIds = appPreferencesStore.getObjectSetSync( + key = PreferencesKeys.EXCLUDED_BLOCKCHAINS_KEY, + ) + + localExcludedBlockchainsIds = localTogglesStorage.toggles + .associateToggles(currentVersion = versionProvider.get().orEmpty()) + .filterValues { isIncluded -> !isIncluded } + .keys + + currentExcludedBlockchainsIds = localExcludedBlockchainsIds + storedExcludedBlockchainsIds + + isInitialized = true + } + + override suspend fun excludeBlockchain(mainnetId: String, isExcluded: Boolean) { + if (isExcluded) { + currentExcludedBlockchainsIds += mainnetId + } else { + currentExcludedBlockchainsIds -= mainnetId + } + + storeCurrent() + } + + override fun isMatchLocalConfig(): Boolean { + return currentExcludedBlockchainsIds == localExcludedBlockchainsIds + } + + override suspend fun recoverLocalConfig() { + currentExcludedBlockchainsIds = localExcludedBlockchainsIds + + storeCurrent() + } + + private suspend fun storeCurrent() { + appPreferencesStore.storeObjectSet( + PreferencesKeys.EXCLUDED_BLOCKCHAINS_KEY, + currentExcludedBlockchainsIds, + ) + } +} \ No newline at end of file diff --git a/core/toggles/src/main/kotlin/com/tangem/core/toggle/di/ExcludedBlockchainsManagerModule.kt b/core/toggles/src/main/kotlin/com/tangem/core/toggle/di/ExcludedBlockchainsManagerModule.kt new file mode 100644 index 0000000000..7d8c5f5973 --- /dev/null +++ b/core/toggles/src/main/kotlin/com/tangem/core/toggle/di/ExcludedBlockchainsManagerModule.kt @@ -0,0 +1,49 @@ +package com.tangem.core.toggle.di + +import android.content.Context +import com.tangem.core.toggle.blockchain.ExcludedBlockchainsManager +import com.tangem.core.toggle.blockchain.MutableExcludedBlockchainsManager +import com.tangem.core.toggle.blockchain.impl.DefaultExcludedBlockchainsManager +import com.tangem.core.toggle.storage.LocalTogglesStorage +import com.tangem.core.toggle.version.DefaultVersionProvider +import com.tangem.core.toggles.BuildConfig +import com.tangem.datasource.asset.loader.AssetLoader +import com.tangem.datasource.local.preferences.AppPreferencesStore +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +internal object ExcludedBlockchainsManagerModule { + + @Provides + @Singleton + fun provideExcludedBlockchainsManager( + @ApplicationContext context: Context, + assetLoader: AssetLoader, + appPreferencesStore: AppPreferencesStore, + ): ExcludedBlockchainsManager { + val localTogglesStorage = LocalTogglesStorage(assetLoader) + val versionProvider = DefaultVersionProvider(context) + + return DefaultExcludedBlockchainsManager( + localTogglesStorage, + appPreferencesStore, + versionProvider, + ) + } + + @Provides + @Singleton + fun provideMutableExcludedBlockchainsManager( + manager: ExcludedBlockchainsManager, + ): MutableExcludedBlockchainsManager? { + if (!BuildConfig.TESTER_MENU_ENABLED) return null + + return manager as MutableExcludedBlockchainsManager + } +} \ No newline at end of file From 37232295392a58f6da6acf4c91645c12f6fc4cac Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 30 Oct 2024 14:50:18 +0400 Subject: [PATCH 3/5] Updated on 2026-08-14 --- .../toggle/manager/DevTogglesManagerTest.kt | 17 +++++++++-------- .../toggle/manager/ProdTogglesManagerTest.kt | 17 +++++++++-------- .../toggle/storage/LocalTogglesStorageTest.kt | 7 ++++--- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/core/toggles/src/test/kotlin/com/tangem/core/toggle/manager/DevTogglesManagerTest.kt b/core/toggles/src/test/kotlin/com/tangem/core/toggle/manager/DevTogglesManagerTest.kt index 31559dc763..bf3dba4217 100644 --- a/core/toggles/src/test/kotlin/com/tangem/core/toggle/manager/DevTogglesManagerTest.kt +++ b/core/toggles/src/test/kotlin/com/tangem/core/toggle/manager/DevTogglesManagerTest.kt @@ -3,6 +3,7 @@ package com.tangem.core.toggle.manager import android.annotation.SuppressLint import com.google.common.truth.Truth import com.tangem.core.toggle.feature.impl.DevFeatureTogglesManager +import com.tangem.core.toggle.feature.impl.FeatureTogglesConstants import com.tangem.core.toggle.storage.Toggle import com.tangem.core.toggle.storage.TogglesStorage import com.tangem.core.toggle.utils.associateToggles @@ -35,7 +36,7 @@ internal class DevTogglesManagerTest { fun `successfully initialize storage if shared prefs kept feature toggles`() = runTest { val currentVersion = "0.1.0" - coEvery { localTogglesStorage.populate() } just Runs + coEvery { localTogglesStorage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH) } just Runs coEvery { appPreferenceStore.getObjectSyncOrNull>(PreferencesKeys.FEATURE_TOGGLES_KEY) } returns savedFeatureTogglesMap @@ -45,7 +46,7 @@ internal class DevTogglesManagerTest { manager.init() coVerifyOrder { - localTogglesStorage.populate() + localTogglesStorage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH) versionProvider.get() } @@ -62,7 +63,7 @@ internal class DevTogglesManagerTest { fun `successfully initialize storage if shared prefs kept empty list`() = runTest { val currentVersion = "0.1.0" - coEvery { localTogglesStorage.populate() } just Runs + coEvery { localTogglesStorage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH) } just Runs coEvery { appPreferenceStore.getObjectSyncOrNull>(PreferencesKeys.FEATURE_TOGGLES_KEY) } returns emptyMap() @@ -72,7 +73,7 @@ internal class DevTogglesManagerTest { manager.init() coVerifyOrder { - localTogglesStorage.populate() + localTogglesStorage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH) versionProvider.get() } @@ -89,7 +90,7 @@ internal class DevTogglesManagerTest { fun `successfully initialize storage if shared prefs didn't keep feature toggles`() = runTest { val currentVersion = "0.1.0" - coEvery { localTogglesStorage.populate() } just Runs + coEvery { localTogglesStorage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH) } just Runs coEvery { appPreferenceStore.getObjectSyncOrNull>(PreferencesKeys.FEATURE_TOGGLES_KEY) } returns null @@ -99,7 +100,7 @@ internal class DevTogglesManagerTest { manager.init() coVerifyOrder { - localTogglesStorage.populate() + localTogglesStorage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH) versionProvider.get() } @@ -112,7 +113,7 @@ internal class DevTogglesManagerTest { @Test fun `successfully initialize storage if versionProvider returns null`() = runTest { - coEvery { localTogglesStorage.populate() } just Runs + coEvery { localTogglesStorage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH) } just Runs coEvery { appPreferenceStore.getSyncOrNull(PreferencesKeys.FEATURE_TOGGLES_KEY) } returns savedFeatureToggles coEvery { localTogglesStorage.toggles } returns localFeatureToggles coEvery { versionProvider.get() } returns null @@ -120,7 +121,7 @@ internal class DevTogglesManagerTest { manager.init() coVerifyOrder { - localTogglesStorage.populate() + localTogglesStorage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH) versionProvider.get() } diff --git a/core/toggles/src/test/kotlin/com/tangem/core/toggle/manager/ProdTogglesManagerTest.kt b/core/toggles/src/test/kotlin/com/tangem/core/toggle/manager/ProdTogglesManagerTest.kt index 6b1841cb28..8b8f5d2884 100644 --- a/core/toggles/src/test/kotlin/com/tangem/core/toggle/manager/ProdTogglesManagerTest.kt +++ b/core/toggles/src/test/kotlin/com/tangem/core/toggle/manager/ProdTogglesManagerTest.kt @@ -2,6 +2,7 @@ package com.tangem.core.toggle.manager import android.content.pm.PackageManager import com.google.common.truth.Truth +import com.tangem.core.toggle.feature.impl.FeatureTogglesConstants import com.tangem.core.toggle.feature.impl.ProdFeatureTogglesManager import com.tangem.core.toggle.storage.Toggle import com.tangem.core.toggle.storage.TogglesStorage @@ -24,14 +25,14 @@ internal class ProdTogglesManagerTest { fun `successfully initialize storage`() = runTest { val currentVersion = "1.0.0" - coEvery { localTogglesStorage.populate() } just Runs + coEvery { localTogglesStorage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH) } just Runs every { localTogglesStorage.toggles } returns localFeatureToggles every { versionProvider.get() } returns currentVersion manager.init() coVerifyOrder { - localTogglesStorage.populate() + localTogglesStorage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH) versionProvider.get() } @@ -41,14 +42,14 @@ internal class ProdTogglesManagerTest { @Test fun `successfully initialize storage if versionProvider returns null`() = runTest { - coEvery { localTogglesStorage.populate() } just Runs + coEvery { localTogglesStorage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH) } just Runs every { localTogglesStorage.toggles } returns localFeatureToggles every { versionProvider.get() } returns null manager.init() coVerifyOrder { - localTogglesStorage.populate() + localTogglesStorage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH) versionProvider.get() } @@ -57,7 +58,7 @@ internal class ProdTogglesManagerTest { @Test fun `failure initialize storage if localFeatureTogglesStorage throws exception`() = runTest { - coEvery { localTogglesStorage.populate() } just Runs + coEvery { localTogglesStorage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH) } just Runs every { localTogglesStorage.toggles } throws IllegalStateException( "Property featureToggles should be initialized before get.", ) @@ -73,13 +74,13 @@ internal class ProdTogglesManagerTest { Truth.assertThat(it).isInstanceOf(IllegalStateException::class.java) } - coVerifyOrder { localTogglesStorage.populate() } + coVerifyOrder { localTogglesStorage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH) } verifyAll(inverse = true) { versionProvider.get() } } @Test fun `failure initialize storage if versionProvider throws exception`() = runTest { - coEvery { localTogglesStorage.populate() } just Runs + coEvery { localTogglesStorage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH) } just Runs every { localTogglesStorage.toggles } returns localFeatureToggles every { versionProvider.get() } throws PackageManager.NameNotFoundException() @@ -90,7 +91,7 @@ internal class ProdTogglesManagerTest { } coVerifyOrder { - localTogglesStorage.populate() + localTogglesStorage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH) versionProvider.get() } } diff --git a/core/toggles/src/test/kotlin/com/tangem/core/toggle/storage/LocalTogglesStorageTest.kt b/core/toggles/src/test/kotlin/com/tangem/core/toggle/storage/LocalTogglesStorageTest.kt index 948f4d8f8e..7a875582d6 100644 --- a/core/toggles/src/test/kotlin/com/tangem/core/toggle/storage/LocalTogglesStorageTest.kt +++ b/core/toggles/src/test/kotlin/com/tangem/core/toggle/storage/LocalTogglesStorageTest.kt @@ -5,6 +5,7 @@ import com.google.common.truth.Truth import com.squareup.moshi.JsonAdapter import com.squareup.moshi.Moshi import com.squareup.moshi.Types +import com.tangem.core.toggle.feature.impl.FeatureTogglesConstants import com.tangem.datasource.asset.loader.AssetLoader import com.tangem.datasource.asset.reader.AssetReader import io.mockk.* @@ -33,7 +34,7 @@ internal class LocalTogglesStorageTest { everyCreatingMoshiAdapter() returns jsonAdapter everyMappingJson() returns featureToggles - storage.populate() + storage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH) coVerifyOrder { assetReader.read(CONFIG_FILE_NAME) @@ -49,7 +50,7 @@ internal class LocalTogglesStorageTest { everyCreatingMoshiAdapter() returns jsonAdapter everyMappingJson() throws IOException() - storage.populate() + storage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH) coVerifyOrder { assetReader.read(CONFIG_FILE_NAME) @@ -63,7 +64,7 @@ internal class LocalTogglesStorageTest { fun `failure initialize storage if jsonAdapter throws exception`() = runTest { everyReadingJson() throws IOException() - storage.populate() + storage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH) coVerifyOrder { assetReader.read(CONFIG_FILE_NAME) } verifyAll(inverse = true) { jsonAdapter.fromJson(any()) } From c6e06b1eb9829466fa1f25f5414554994c59d7fe Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 30 Oct 2024 15:07:29 +0400 Subject: [PATCH 4/5] Updated on 2026-08-14 --- app/build.gradle.kts | 2 +- .../com/tangem/tap/ApplicationEntryPoint.kt | 4 ++-- .../java/com/tangem/tap/TangemApplication.kt | 4 ++-- .../tap/di/domain/CardLegacyDomainModule.kt | 2 +- .../scanCard/CardScanningFeatureToggles.kt | 2 +- .../di/WalletConnectInteractorModule.kt | 2 +- .../toggles/WalletConnectFeatureToggles.kt | 2 +- .../home/featuretoggles/HomeFeatureToggles.kt | 2 +- core/{toggles => config-toggles}/.gitignore | 0 .../build.gradle.kts | 2 +- .../configs/excluded_blockchains_config.json | 0 .../blockchain/ExcludedBlockchainsManager.kt | 2 +- .../MutableExcludedBlockchainsManager.kt | 2 +- .../impl/DefaultExcludedBlockchainsManager.kt | 19 ++++++++++--------- .../di/ExcludedBlockchainsManagerModule.kt | 14 +++++++------- .../di/FeatureTogglesManagerModule.kt | 14 +++++++------- .../feature/FeatureTogglesManager.kt | 2 +- .../feature/MutableFeatureTogglesManager.kt | 2 +- .../feature/impl/DevFeatureTogglesManager.kt | 10 +++++----- .../feature/impl/FeatureTogglesConstants.kt | 2 +- .../feature/impl/ProdFeatureTogglesManager.kt | 10 +++++----- .../configtoggle/storage/ConfigToggle.kt} | 6 +++--- .../storage/LocalTogglesStorage.kt | 6 +++--- .../configtoggle}/storage/TogglesStorage.kt | 4 ++-- .../core/configtoggle/utils/CollectionExt.kt | 13 +++++++++++++ .../version/DefaultVersionProvider.kt | 2 +- .../core/configtoggle}/version/Version.kt | 2 +- .../version/VersionAvailabilityContract.kt | 2 +- .../configtoggle}/version/VersionProvider.kt | 2 +- .../VersionAvailabilityContractTest.kt | 4 ++-- .../configtoggle}/contract/VersionTest.kt | 4 ++-- .../manager/DevTogglesManagerTest.kt | 18 +++++++++--------- .../manager/ProdTogglesManagerTest.kt | 18 +++++++++--------- .../storage/LocalTogglesStorageTest.kt | 18 +++++++++--------- .../local/preferences/PreferencesKeys.kt | 2 +- .../utils/AppPreferencesStoreExt.kt | 6 ------ .../tangem/core/toggle/utils/CollectionExt.kt | 13 ------------- features/details/impl/build.gradle.kts | 2 +- features/disclaimer/impl/build.gradle.kts | 2 +- features/manage-tokens/impl/build.gradle.kts | 2 +- features/markets/impl/build.gradle.kts | 2 +- features/onboarding-v2/impl/build.gradle.kts | 2 +- .../v2/DefaultOnboardingV2FeatureToggles.kt | 2 +- features/onboarding/build.gradle.kts | 2 +- features/onramp/impl/build.gradle.kts | 2 +- .../onramp/DefaultOnrampFeatureToggles.kt | 2 +- .../features/onramp/OnrampFeatureModule.kt | 4 +--- .../push-notifications/impl/build.gradle.kts | 2 +- features/send/impl/build.gradle.kts | 2 +- features/staking/impl/build.gradle.kts | 2 +- features/swap/presentation/build.gradle.kts | 2 +- features/tester/impl/build.gradle.kts | 2 +- .../viewmodels/FeatureTogglesViewModel.kt | 4 ++-- features/tokendetails/impl/build.gradle.kts | 2 +- .../wallet-settings/impl/build.gradle.kts | 2 +- features/wallet/impl/build.gradle.kts | 2 +- .../DefaultWalletFeatureToggles.kt | 2 +- libs/blockchain-sdk/build.gradle.kts | 2 +- .../di/BlockchainSDKFactoryModule.kt | 2 +- .../DefaultBlockchainSDKFeatureToggles.kt | 2 +- settings.gradle.kts | 2 +- 61 files changed, 132 insertions(+), 139 deletions(-) rename core/{toggles => config-toggles}/.gitignore (100%) rename core/{toggles => config-toggles}/build.gradle.kts (94%) rename core/{toggles => config-toggles}/src/main/assets/configs/excluded_blockchains_config.json (100%) rename core/{toggles/src/main/kotlin/com/tangem/core/toggle => config-toggles/src/main/kotlin/com/tangem/core/configtoggle}/blockchain/ExcludedBlockchainsManager.kt (69%) rename core/{toggles/src/main/kotlin/com/tangem/core/toggle => config-toggles/src/main/kotlin/com/tangem/core/configtoggle}/blockchain/MutableExcludedBlockchainsManager.kt (82%) rename core/{toggles/src/main/kotlin/com/tangem/core/toggle => config-toggles/src/main/kotlin/com/tangem/core/configtoggle}/blockchain/impl/DefaultExcludedBlockchainsManager.kt (79%) rename core/{toggles/src/main/kotlin/com/tangem/core/toggle => config-toggles/src/main/kotlin/com/tangem/core/configtoggle}/di/ExcludedBlockchainsManagerModule.kt (73%) rename core/{toggles/src/main/kotlin/com/tangem/core/toggle => config-toggles/src/main/kotlin/com/tangem/core/configtoggle}/di/FeatureTogglesManagerModule.kt (74%) rename core/{toggles/src/main/kotlin/com/tangem/core/toggle => config-toggles/src/main/kotlin/com/tangem/core/configtoggle}/feature/FeatureTogglesManager.kt (87%) rename core/{toggles/src/main/kotlin/com/tangem/core/toggle => config-toggles/src/main/kotlin/com/tangem/core/configtoggle}/feature/MutableFeatureTogglesManager.kt (93%) rename core/{toggles/src/main/kotlin/com/tangem/core/toggle => config-toggles/src/main/kotlin/com/tangem/core/configtoggle}/feature/impl/DevFeatureTogglesManager.kt (90%) rename core/{toggles/src/main/kotlin/com/tangem/core/toggle => config-toggles/src/main/kotlin/com/tangem/core/configtoggle}/feature/impl/FeatureTogglesConstants.kt (70%) rename core/{toggles/src/main/kotlin/com/tangem/core/toggle => config-toggles/src/main/kotlin/com/tangem/core/configtoggle}/feature/impl/ProdFeatureTogglesManager.kt (79%) rename core/{toggles/src/main/kotlin/com/tangem/core/toggle/storage/Toggle.kt => config-toggles/src/main/kotlin/com/tangem/core/configtoggle/storage/ConfigToggle.kt} (73%) rename core/{toggles/src/main/kotlin/com/tangem/core/toggle => config-toggles/src/main/kotlin/com/tangem/core/configtoggle}/storage/LocalTogglesStorage.kt (72%) rename core/{toggles/src/main/kotlin/com/tangem/core/toggle => config-toggles/src/main/kotlin/com/tangem/core/configtoggle}/storage/TogglesStorage.kt (75%) create mode 100644 core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/utils/CollectionExt.kt rename core/{toggles/src/main/kotlin/com/tangem/core/toggle => config-toggles/src/main/kotlin/com/tangem/core/configtoggle}/version/DefaultVersionProvider.kt (96%) rename core/{toggles/src/main/kotlin/com/tangem/core/toggle => config-toggles/src/main/kotlin/com/tangem/core/configtoggle}/version/Version.kt (98%) rename core/{toggles/src/main/kotlin/com/tangem/core/toggle => config-toggles/src/main/kotlin/com/tangem/core/configtoggle}/version/VersionAvailabilityContract.kt (93%) rename core/{toggles/src/main/kotlin/com/tangem/core/toggle => config-toggles/src/main/kotlin/com/tangem/core/configtoggle}/version/VersionProvider.kt (74%) rename core/{toggles/src/test/kotlin/com/tangem/core/toggle => config-toggles/src/test/kotlin/com/tangem/core/configtoggle}/contract/VersionAvailabilityContractTest.kt (93%) rename core/{toggles/src/test/kotlin/com/tangem/core/toggle => config-toggles/src/test/kotlin/com/tangem/core/configtoggle}/contract/VersionTest.kt (97%) rename core/{toggles/src/test/kotlin/com/tangem/core/toggle => config-toggles/src/test/kotlin/com/tangem/core/configtoggle}/manager/DevTogglesManagerTest.kt (92%) rename core/{toggles/src/test/kotlin/com/tangem/core/toggle => config-toggles/src/test/kotlin/com/tangem/core/configtoggle}/manager/ProdTogglesManagerTest.kt (88%) rename core/{toggles/src/test/kotlin/com/tangem/core/toggle => config-toggles/src/test/kotlin/com/tangem/core/configtoggle}/storage/LocalTogglesStorageTest.kt (85%) delete mode 100644 core/toggles/src/main/kotlin/com/tangem/core/toggle/utils/CollectionExt.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index dd0208cf7f..e6d30a7cc6 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -81,7 +81,7 @@ dependencies { implementation(projects.core.analytics) implementation(projects.core.analytics.models) implementation(projects.core.navigation) - implementation(projects.core.toggles) + implementation(projects.core.configToggles) implementation(projects.core.res) implementation(projects.core.ui) implementation(projects.core.datasource) diff --git a/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt b/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt index ff04434dfa..81b845f7bc 100644 --- a/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt +++ b/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt @@ -5,10 +5,10 @@ import com.tangem.blockchainsdk.BlockchainSDKFactory import com.tangem.blockchainsdk.signer.TransactionSignerFactory import com.tangem.common.routing.AppRouter import com.tangem.core.analytics.filter.OneTimeEventFilter +import com.tangem.core.configtoggle.blockchain.ExcludedBlockchainsManager +import com.tangem.core.configtoggle.feature.FeatureTogglesManager import com.tangem.core.navigation.share.ShareManager import com.tangem.core.navigation.url.UrlOpener -import com.tangem.core.toggle.blockchain.ExcludedBlockchainsManager -import com.tangem.core.toggle.feature.FeatureTogglesManager import com.tangem.datasource.connection.NetworkConnectionManager import com.tangem.datasource.local.config.environment.EnvironmentConfigStorage import com.tangem.datasource.local.config.issuers.IssuersConfigStorage diff --git a/app/src/main/java/com/tangem/tap/TangemApplication.kt b/app/src/main/java/com/tangem/tap/TangemApplication.kt index 287f99d263..18d3e87bd8 100644 --- a/app/src/main/java/com/tangem/tap/TangemApplication.kt +++ b/app/src/main/java/com/tangem/tap/TangemApplication.kt @@ -17,8 +17,8 @@ import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.analytics.models.Basic import com.tangem.core.analytics.models.Basic.TransactionSent.WalletForm -import com.tangem.core.toggle.blockchain.ExcludedBlockchainsManager -import com.tangem.core.toggle.feature.FeatureTogglesManager +import com.tangem.core.configtoggle.blockchain.ExcludedBlockchainsManager +import com.tangem.core.configtoggle.feature.FeatureTogglesManager import com.tangem.datasource.api.common.MoshiConverter import com.tangem.datasource.api.common.createNetworkLoggingInterceptor import com.tangem.datasource.connection.NetworkConnectionManager diff --git a/app/src/main/java/com/tangem/tap/di/domain/CardLegacyDomainModule.kt b/app/src/main/java/com/tangem/tap/di/domain/CardLegacyDomainModule.kt index 77ff3a6bee..38adc6ec9e 100644 --- a/app/src/main/java/com/tangem/tap/di/domain/CardLegacyDomainModule.kt +++ b/app/src/main/java/com/tangem/tap/di/domain/CardLegacyDomainModule.kt @@ -1,6 +1,6 @@ package com.tangem.tap.di.domain -import com.tangem.core.toggle.feature.FeatureTogglesManager +import com.tangem.core.configtoggle.feature.FeatureTogglesManager import com.tangem.domain.card.ScanCardProcessor import com.tangem.domain.wallets.legacy.UserWalletsListManager import com.tangem.domain.wallets.usecase.GenerateWalletNameUseCase diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/CardScanningFeatureToggles.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/CardScanningFeatureToggles.kt index 1c989ca3db..59310f93b5 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/CardScanningFeatureToggles.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/CardScanningFeatureToggles.kt @@ -1,6 +1,6 @@ package com.tangem.tap.domain.scanCard -import com.tangem.core.toggle.feature.FeatureTogglesManager +import com.tangem.core.configtoggle.feature.FeatureTogglesManager /** * Add custom token feature toggles diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect2/di/WalletConnectInteractorModule.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect2/di/WalletConnectInteractorModule.kt index 65faebf4db..9b7a44b10d 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect2/di/WalletConnectInteractorModule.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect2/di/WalletConnectInteractorModule.kt @@ -3,7 +3,7 @@ package com.tangem.tap.domain.walletconnect2.di import android.app.Application import com.squareup.moshi.Moshi import com.tangem.core.analytics.api.AnalyticsEventHandler -import com.tangem.core.toggle.feature.FeatureTogglesManager +import com.tangem.core.configtoggle.feature.FeatureTogglesManager import com.tangem.datasource.di.SdkMoshi import com.tangem.datasource.files.FileReader import com.tangem.domain.tokens.repository.CurrenciesRepository diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect2/toggles/WalletConnectFeatureToggles.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect2/toggles/WalletConnectFeatureToggles.kt index e9f55f3815..a6da04800a 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect2/toggles/WalletConnectFeatureToggles.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect2/toggles/WalletConnectFeatureToggles.kt @@ -1,6 +1,6 @@ package com.tangem.tap.domain.walletconnect2.toggles -import com.tangem.core.toggle.feature.FeatureTogglesManager +import com.tangem.core.configtoggle.feature.FeatureTogglesManager internal class WalletConnectFeatureToggles( private val featureTogglesManager: FeatureTogglesManager, diff --git a/app/src/main/java/com/tangem/tap/features/home/featuretoggles/HomeFeatureToggles.kt b/app/src/main/java/com/tangem/tap/features/home/featuretoggles/HomeFeatureToggles.kt index ebbb05500b..55ebe3e10d 100644 --- a/app/src/main/java/com/tangem/tap/features/home/featuretoggles/HomeFeatureToggles.kt +++ b/app/src/main/java/com/tangem/tap/features/home/featuretoggles/HomeFeatureToggles.kt @@ -1,6 +1,6 @@ package com.tangem.tap.features.home.featuretoggles -import com.tangem.core.toggle.feature.FeatureTogglesManager +import com.tangem.core.configtoggle.feature.FeatureTogglesManager import javax.inject.Inject class HomeFeatureToggles @Inject constructor( diff --git a/core/toggles/.gitignore b/core/config-toggles/.gitignore similarity index 100% rename from core/toggles/.gitignore rename to core/config-toggles/.gitignore diff --git a/core/toggles/build.gradle.kts b/core/config-toggles/build.gradle.kts similarity index 94% rename from core/toggles/build.gradle.kts rename to core/config-toggles/build.gradle.kts index e56b5955fe..0a7bc83fdc 100644 --- a/core/toggles/build.gradle.kts +++ b/core/config-toggles/build.gradle.kts @@ -7,7 +7,7 @@ plugins { } android { - namespace = "com.tangem.core.toggles" + namespace = "com.tangem.core.configtoggle" } dependencies { diff --git a/core/toggles/src/main/assets/configs/excluded_blockchains_config.json b/core/config-toggles/src/main/assets/configs/excluded_blockchains_config.json similarity index 100% rename from core/toggles/src/main/assets/configs/excluded_blockchains_config.json rename to core/config-toggles/src/main/assets/configs/excluded_blockchains_config.json diff --git a/core/toggles/src/main/kotlin/com/tangem/core/toggle/blockchain/ExcludedBlockchainsManager.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/blockchain/ExcludedBlockchainsManager.kt similarity index 69% rename from core/toggles/src/main/kotlin/com/tangem/core/toggle/blockchain/ExcludedBlockchainsManager.kt rename to core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/blockchain/ExcludedBlockchainsManager.kt index fd6c3a91ae..f5db3637b9 100644 --- a/core/toggles/src/main/kotlin/com/tangem/core/toggle/blockchain/ExcludedBlockchainsManager.kt +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/blockchain/ExcludedBlockchainsManager.kt @@ -1,4 +1,4 @@ -package com.tangem.core.toggle.blockchain +package com.tangem.core.configtoggle.blockchain interface ExcludedBlockchainsManager { diff --git a/core/toggles/src/main/kotlin/com/tangem/core/toggle/blockchain/MutableExcludedBlockchainsManager.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/blockchain/MutableExcludedBlockchainsManager.kt similarity index 82% rename from core/toggles/src/main/kotlin/com/tangem/core/toggle/blockchain/MutableExcludedBlockchainsManager.kt rename to core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/blockchain/MutableExcludedBlockchainsManager.kt index 7e2f28e33e..1f7fcf4dc0 100644 --- a/core/toggles/src/main/kotlin/com/tangem/core/toggle/blockchain/MutableExcludedBlockchainsManager.kt +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/blockchain/MutableExcludedBlockchainsManager.kt @@ -1,4 +1,4 @@ -package com.tangem.core.toggle.blockchain +package com.tangem.core.configtoggle.blockchain interface MutableExcludedBlockchainsManager : ExcludedBlockchainsManager { diff --git a/core/toggles/src/main/kotlin/com/tangem/core/toggle/blockchain/impl/DefaultExcludedBlockchainsManager.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/blockchain/impl/DefaultExcludedBlockchainsManager.kt similarity index 79% rename from core/toggles/src/main/kotlin/com/tangem/core/toggle/blockchain/impl/DefaultExcludedBlockchainsManager.kt rename to core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/blockchain/impl/DefaultExcludedBlockchainsManager.kt index 1f1469773b..d0f1dccc44 100644 --- a/core/toggles/src/main/kotlin/com/tangem/core/toggle/blockchain/impl/DefaultExcludedBlockchainsManager.kt +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/blockchain/impl/DefaultExcludedBlockchainsManager.kt @@ -1,13 +1,13 @@ -package com.tangem.core.toggle.blockchain.impl +package com.tangem.core.configtoggle.blockchain.impl -import com.tangem.core.toggle.blockchain.MutableExcludedBlockchainsManager -import com.tangem.core.toggle.storage.TogglesStorage -import com.tangem.core.toggle.utils.associateToggles -import com.tangem.core.toggle.version.VersionProvider +import com.tangem.core.configtoggle.blockchain.MutableExcludedBlockchainsManager +import com.tangem.core.configtoggle.storage.TogglesStorage +import com.tangem.core.configtoggle.utils.associateToggles +import com.tangem.core.configtoggle.version.VersionProvider import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.local.preferences.PreferencesKeys -import com.tangem.datasource.local.preferences.utils.getObjectSetSync -import com.tangem.datasource.local.preferences.utils.storeObjectSet +import com.tangem.datasource.local.preferences.utils.getSyncOrDefault +import com.tangem.datasource.local.preferences.utils.store internal class DefaultExcludedBlockchainsManager( private val localTogglesStorage: TogglesStorage, @@ -30,8 +30,9 @@ internal class DefaultExcludedBlockchainsManager( override suspend fun init() { localTogglesStorage.populate(path = "configs/excluded_blockchains_config") - val storedExcludedBlockchainsIds = appPreferencesStore.getObjectSetSync( + val storedExcludedBlockchainsIds = appPreferencesStore.getSyncOrDefault( key = PreferencesKeys.EXCLUDED_BLOCKCHAINS_KEY, + default = emptySet(), ) localExcludedBlockchainsIds = localTogglesStorage.toggles @@ -65,7 +66,7 @@ internal class DefaultExcludedBlockchainsManager( } private suspend fun storeCurrent() { - appPreferencesStore.storeObjectSet( + appPreferencesStore.store( PreferencesKeys.EXCLUDED_BLOCKCHAINS_KEY, currentExcludedBlockchainsIds, ) diff --git a/core/toggles/src/main/kotlin/com/tangem/core/toggle/di/ExcludedBlockchainsManagerModule.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/di/ExcludedBlockchainsManagerModule.kt similarity index 73% rename from core/toggles/src/main/kotlin/com/tangem/core/toggle/di/ExcludedBlockchainsManagerModule.kt rename to core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/di/ExcludedBlockchainsManagerModule.kt index 7d8c5f5973..2e4fcddac5 100644 --- a/core/toggles/src/main/kotlin/com/tangem/core/toggle/di/ExcludedBlockchainsManagerModule.kt +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/di/ExcludedBlockchainsManagerModule.kt @@ -1,12 +1,12 @@ -package com.tangem.core.toggle.di +package com.tangem.core.configtoggle.di import android.content.Context -import com.tangem.core.toggle.blockchain.ExcludedBlockchainsManager -import com.tangem.core.toggle.blockchain.MutableExcludedBlockchainsManager -import com.tangem.core.toggle.blockchain.impl.DefaultExcludedBlockchainsManager -import com.tangem.core.toggle.storage.LocalTogglesStorage -import com.tangem.core.toggle.version.DefaultVersionProvider -import com.tangem.core.toggles.BuildConfig +import com.tangem.core.configtoggle.BuildConfig +import com.tangem.core.configtoggle.blockchain.ExcludedBlockchainsManager +import com.tangem.core.configtoggle.blockchain.MutableExcludedBlockchainsManager +import com.tangem.core.configtoggle.blockchain.impl.DefaultExcludedBlockchainsManager +import com.tangem.core.configtoggle.storage.LocalTogglesStorage +import com.tangem.core.configtoggle.version.DefaultVersionProvider import com.tangem.datasource.asset.loader.AssetLoader import com.tangem.datasource.local.preferences.AppPreferencesStore import dagger.Module diff --git a/core/toggles/src/main/kotlin/com/tangem/core/toggle/di/FeatureTogglesManagerModule.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/di/FeatureTogglesManagerModule.kt similarity index 74% rename from core/toggles/src/main/kotlin/com/tangem/core/toggle/di/FeatureTogglesManagerModule.kt rename to core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/di/FeatureTogglesManagerModule.kt index 0f740243f0..8346378b52 100644 --- a/core/toggles/src/main/kotlin/com/tangem/core/toggle/di/FeatureTogglesManagerModule.kt +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/di/FeatureTogglesManagerModule.kt @@ -1,12 +1,12 @@ -package com.tangem.core.toggle.di +package com.tangem.core.configtoggle.di import android.content.Context -import com.tangem.core.toggle.feature.FeatureTogglesManager -import com.tangem.core.toggle.feature.impl.DevFeatureTogglesManager -import com.tangem.core.toggle.feature.impl.ProdFeatureTogglesManager -import com.tangem.core.toggle.storage.LocalTogglesStorage -import com.tangem.core.toggle.version.DefaultVersionProvider -import com.tangem.core.toggles.BuildConfig +import com.tangem.core.configtoggle.BuildConfig +import com.tangem.core.configtoggle.feature.FeatureTogglesManager +import com.tangem.core.configtoggle.feature.impl.DevFeatureTogglesManager +import com.tangem.core.configtoggle.feature.impl.ProdFeatureTogglesManager +import com.tangem.core.configtoggle.storage.LocalTogglesStorage +import com.tangem.core.configtoggle.version.DefaultVersionProvider import com.tangem.datasource.asset.loader.AssetLoader import com.tangem.datasource.local.preferences.AppPreferencesStore import dagger.Module diff --git a/core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/FeatureTogglesManager.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/FeatureTogglesManager.kt similarity index 87% rename from core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/FeatureTogglesManager.kt rename to core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/FeatureTogglesManager.kt index 1de1ff39ee..86a027924c 100644 --- a/core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/FeatureTogglesManager.kt +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/FeatureTogglesManager.kt @@ -1,4 +1,4 @@ -package com.tangem.core.toggle.feature +package com.tangem.core.configtoggle.feature /** * Component for getting information about the availability of feature toggles diff --git a/core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/MutableFeatureTogglesManager.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/MutableFeatureTogglesManager.kt similarity index 93% rename from core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/MutableFeatureTogglesManager.kt rename to core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/MutableFeatureTogglesManager.kt index ce9798863e..d1d09ced03 100644 --- a/core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/MutableFeatureTogglesManager.kt +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/MutableFeatureTogglesManager.kt @@ -1,4 +1,4 @@ -package com.tangem.core.toggle.feature +package com.tangem.core.configtoggle.feature /** * Component for change information about the availability of feature toggles diff --git a/core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/impl/DevFeatureTogglesManager.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/impl/DevFeatureTogglesManager.kt similarity index 90% rename from core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/impl/DevFeatureTogglesManager.kt rename to core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/impl/DevFeatureTogglesManager.kt index 8441522e6d..750dbada43 100644 --- a/core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/impl/DevFeatureTogglesManager.kt +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/impl/DevFeatureTogglesManager.kt @@ -1,10 +1,10 @@ -package com.tangem.core.toggle.feature.impl +package com.tangem.core.configtoggle.feature.impl import androidx.annotation.VisibleForTesting -import com.tangem.core.toggle.feature.MutableFeatureTogglesManager -import com.tangem.core.toggle.storage.TogglesStorage -import com.tangem.core.toggle.utils.associateToggles -import com.tangem.core.toggle.version.VersionProvider +import com.tangem.core.configtoggle.feature.MutableFeatureTogglesManager +import com.tangem.core.configtoggle.storage.TogglesStorage +import com.tangem.core.configtoggle.utils.associateToggles +import com.tangem.core.configtoggle.version.VersionProvider import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.local.preferences.PreferencesKeys import com.tangem.datasource.local.preferences.utils.getObjectSyncOrNull diff --git a/core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/impl/FeatureTogglesConstants.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/impl/FeatureTogglesConstants.kt similarity index 70% rename from core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/impl/FeatureTogglesConstants.kt rename to core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/impl/FeatureTogglesConstants.kt index 06fd9d9417..63087a2e90 100644 --- a/core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/impl/FeatureTogglesConstants.kt +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/impl/FeatureTogglesConstants.kt @@ -1,4 +1,4 @@ -package com.tangem.core.toggle.feature.impl +package com.tangem.core.configtoggle.feature.impl internal object FeatureTogglesConstants { diff --git a/core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/impl/ProdFeatureTogglesManager.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/impl/ProdFeatureTogglesManager.kt similarity index 79% rename from core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/impl/ProdFeatureTogglesManager.kt rename to core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/impl/ProdFeatureTogglesManager.kt index 4624273b81..d723297a45 100644 --- a/core/toggles/src/main/kotlin/com/tangem/core/toggle/feature/impl/ProdFeatureTogglesManager.kt +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/impl/ProdFeatureTogglesManager.kt @@ -1,10 +1,10 @@ -package com.tangem.core.toggle.feature.impl +package com.tangem.core.configtoggle.feature.impl import androidx.annotation.VisibleForTesting -import com.tangem.core.toggle.feature.FeatureTogglesManager -import com.tangem.core.toggle.storage.TogglesStorage -import com.tangem.core.toggle.utils.associateToggles -import com.tangem.core.toggle.version.VersionProvider +import com.tangem.core.configtoggle.feature.FeatureTogglesManager +import com.tangem.core.configtoggle.storage.TogglesStorage +import com.tangem.core.configtoggle.utils.associateToggles +import com.tangem.core.configtoggle.version.VersionProvider import kotlin.properties.Delegates /** diff --git a/core/toggles/src/main/kotlin/com/tangem/core/toggle/storage/Toggle.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/storage/ConfigToggle.kt similarity index 73% rename from core/toggles/src/main/kotlin/com/tangem/core/toggle/storage/Toggle.kt rename to core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/storage/ConfigToggle.kt index 52973d28d3..6078eea70a 100644 --- a/core/toggles/src/main/kotlin/com/tangem/core/toggle/storage/Toggle.kt +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/storage/ConfigToggle.kt @@ -1,4 +1,4 @@ -package com.tangem.core.toggle.storage +package com.tangem.core.configtoggle.storage import com.squareup.moshi.Json import com.squareup.moshi.JsonClass @@ -7,14 +7,14 @@ import com.squareup.moshi.JsonClass * Data model with information about config toggle * * @property name toggle name - * @property version version number in which the feature will be included + * @property version version in which the toggle will be enabled * * IMPORTANT: if the version is "undefined", it means that toggle is disabled! * [REDACTED_AUTHOR] */ @JsonClass(generateAdapter = true) -internal data class Toggle( +internal data class ConfigToggle( @Json(name = "name") val name: String, @Json(name = "version") val version: String, ) \ No newline at end of file diff --git a/core/toggles/src/main/kotlin/com/tangem/core/toggle/storage/LocalTogglesStorage.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/storage/LocalTogglesStorage.kt similarity index 72% rename from core/toggles/src/main/kotlin/com/tangem/core/toggle/storage/LocalTogglesStorage.kt rename to core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/storage/LocalTogglesStorage.kt index 1fadc664bd..59086d9658 100644 --- a/core/toggles/src/main/kotlin/com/tangem/core/toggle/storage/LocalTogglesStorage.kt +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/storage/LocalTogglesStorage.kt @@ -1,4 +1,4 @@ -package com.tangem.core.toggle.storage +package com.tangem.core.configtoggle.storage import com.tangem.datasource.asset.loader.AssetLoader import kotlin.properties.Delegates @@ -15,10 +15,10 @@ internal class LocalTogglesStorage( private val assetLoader: AssetLoader, ) : TogglesStorage { - override var toggles: List by Delegates.notNull() + override var toggles: List by Delegates.notNull() private set override suspend fun populate(path: String) { - toggles = assetLoader.loadList(path) + toggles = assetLoader.loadList(path) } } \ No newline at end of file diff --git a/core/toggles/src/main/kotlin/com/tangem/core/toggle/storage/TogglesStorage.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/storage/TogglesStorage.kt similarity index 75% rename from core/toggles/src/main/kotlin/com/tangem/core/toggle/storage/TogglesStorage.kt rename to core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/storage/TogglesStorage.kt index 43027a29c8..39fa7b2f68 100644 --- a/core/toggles/src/main/kotlin/com/tangem/core/toggle/storage/TogglesStorage.kt +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/storage/TogglesStorage.kt @@ -1,4 +1,4 @@ -package com.tangem.core.toggle.storage +package com.tangem.core.configtoggle.storage /** * Component that initializes and stores a list of feature toggles @@ -8,7 +8,7 @@ package com.tangem.core.toggle.storage internal interface TogglesStorage { /** List of feature toggles */ - val toggles: List + val toggles: List /** Populate the storage with toggles */ suspend fun populate(path: String) diff --git a/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/utils/CollectionExt.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/utils/CollectionExt.kt new file mode 100644 index 0000000000..68ee66b88c --- /dev/null +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/utils/CollectionExt.kt @@ -0,0 +1,13 @@ +package com.tangem.core.configtoggle.utils + +import com.tangem.core.configtoggle.storage.ConfigToggle +import com.tangem.core.configtoggle.version.VersionAvailabilityContract + +internal fun List.associateToggles(currentVersion: String): Map { + return associate { localToggle -> + Pair( + first = localToggle.name, + second = VersionAvailabilityContract(currentVersion, localToggle.version), + ) + } +} \ No newline at end of file diff --git a/core/toggles/src/main/kotlin/com/tangem/core/toggle/version/DefaultVersionProvider.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/version/DefaultVersionProvider.kt similarity index 96% rename from core/toggles/src/main/kotlin/com/tangem/core/toggle/version/DefaultVersionProvider.kt rename to core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/version/DefaultVersionProvider.kt index e69c13e2eb..b55e9637c3 100644 --- a/core/toggles/src/main/kotlin/com/tangem/core/toggle/version/DefaultVersionProvider.kt +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/version/DefaultVersionProvider.kt @@ -1,4 +1,4 @@ -package com.tangem.core.toggle.version +package com.tangem.core.configtoggle.version import android.content.Context import android.content.pm.PackageManager diff --git a/core/toggles/src/main/kotlin/com/tangem/core/toggle/version/Version.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/version/Version.kt similarity index 98% rename from core/toggles/src/main/kotlin/com/tangem/core/toggle/version/Version.kt rename to core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/version/Version.kt index 60b3188565..0822cec520 100644 --- a/core/toggles/src/main/kotlin/com/tangem/core/toggle/version/Version.kt +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/version/Version.kt @@ -1,4 +1,4 @@ -package com.tangem.core.toggle.version +package com.tangem.core.configtoggle.version import androidx.annotation.VisibleForTesting import timber.log.Timber diff --git a/core/toggles/src/main/kotlin/com/tangem/core/toggle/version/VersionAvailabilityContract.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/version/VersionAvailabilityContract.kt similarity index 93% rename from core/toggles/src/main/kotlin/com/tangem/core/toggle/version/VersionAvailabilityContract.kt rename to core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/version/VersionAvailabilityContract.kt index 61f7e8f1e3..2360052af4 100644 --- a/core/toggles/src/main/kotlin/com/tangem/core/toggle/version/VersionAvailabilityContract.kt +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/version/VersionAvailabilityContract.kt @@ -1,4 +1,4 @@ -package com.tangem.core.toggle.version +package com.tangem.core.configtoggle.version /** * Version contract to evaluate availability of feature toggle diff --git a/core/toggles/src/main/kotlin/com/tangem/core/toggle/version/VersionProvider.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/version/VersionProvider.kt similarity index 74% rename from core/toggles/src/main/kotlin/com/tangem/core/toggle/version/VersionProvider.kt rename to core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/version/VersionProvider.kt index 1df39f1487..27913b7dce 100644 --- a/core/toggles/src/main/kotlin/com/tangem/core/toggle/version/VersionProvider.kt +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/version/VersionProvider.kt @@ -1,4 +1,4 @@ -package com.tangem.core.toggle.version +package com.tangem.core.configtoggle.version /** Application version provider */ internal interface VersionProvider { diff --git a/core/toggles/src/test/kotlin/com/tangem/core/toggle/contract/VersionAvailabilityContractTest.kt b/core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/contract/VersionAvailabilityContractTest.kt similarity index 93% rename from core/toggles/src/test/kotlin/com/tangem/core/toggle/contract/VersionAvailabilityContractTest.kt rename to core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/contract/VersionAvailabilityContractTest.kt index f9907665f9..ba641dfd04 100644 --- a/core/toggles/src/test/kotlin/com/tangem/core/toggle/contract/VersionAvailabilityContractTest.kt +++ b/core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/contract/VersionAvailabilityContractTest.kt @@ -1,7 +1,7 @@ -package com.tangem.core.toggle.contract +package com.tangem.core.configtoggle.contract import com.google.common.truth.Truth -import com.tangem.core.toggle.version.VersionAvailabilityContract +import com.tangem.core.configtoggle.version.VersionAvailabilityContract import org.junit.Test /** diff --git a/core/toggles/src/test/kotlin/com/tangem/core/toggle/contract/VersionTest.kt b/core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/contract/VersionTest.kt similarity index 97% rename from core/toggles/src/test/kotlin/com/tangem/core/toggle/contract/VersionTest.kt rename to core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/contract/VersionTest.kt index 32c3815325..e61ace5722 100644 --- a/core/toggles/src/test/kotlin/com/tangem/core/toggle/contract/VersionTest.kt +++ b/core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/contract/VersionTest.kt @@ -1,7 +1,7 @@ -package com.tangem.core.toggle.contract +package com.tangem.core.configtoggle.contract import com.google.common.truth.Truth -import com.tangem.core.toggle.version.Version +import com.tangem.core.configtoggle.version.Version import org.junit.Test /** diff --git a/core/toggles/src/test/kotlin/com/tangem/core/toggle/manager/DevTogglesManagerTest.kt b/core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/manager/DevTogglesManagerTest.kt similarity index 92% rename from core/toggles/src/test/kotlin/com/tangem/core/toggle/manager/DevTogglesManagerTest.kt rename to core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/manager/DevTogglesManagerTest.kt index bf3dba4217..b1822c84d9 100644 --- a/core/toggles/src/test/kotlin/com/tangem/core/toggle/manager/DevTogglesManagerTest.kt +++ b/core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/manager/DevTogglesManagerTest.kt @@ -1,13 +1,13 @@ -package com.tangem.core.toggle.manager +package com.tangem.core.configtoggle.manager import android.annotation.SuppressLint import com.google.common.truth.Truth -import com.tangem.core.toggle.feature.impl.DevFeatureTogglesManager -import com.tangem.core.toggle.feature.impl.FeatureTogglesConstants -import com.tangem.core.toggle.storage.Toggle -import com.tangem.core.toggle.storage.TogglesStorage -import com.tangem.core.toggle.utils.associateToggles -import com.tangem.core.toggle.version.VersionProvider +import com.tangem.core.configtoggle.feature.impl.DevFeatureTogglesManager +import com.tangem.core.configtoggle.feature.impl.FeatureTogglesConstants +import com.tangem.core.configtoggle.storage.ConfigToggle +import com.tangem.core.configtoggle.storage.TogglesStorage +import com.tangem.core.configtoggle.utils.associateToggles +import com.tangem.core.configtoggle.version.VersionProvider import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.local.preferences.PreferencesKeys import com.tangem.datasource.local.preferences.utils.getObjectSyncOrNull @@ -224,8 +224,8 @@ internal class DevTogglesManagerTest { ) val localFeatureToggles = listOf( - Toggle(name = "INACTIVE_TEST_FEATURE_ENABLED", version = "undefined"), - Toggle(name = "ACTIVE2_TEST_FEATURE_ENABLED", version = "1.0.0"), + ConfigToggle(name = "INACTIVE_TEST_FEATURE_ENABLED", version = "undefined"), + ConfigToggle(name = "ACTIVE2_TEST_FEATURE_ENABLED", version = "1.0.0"), ) } } \ No newline at end of file diff --git a/core/toggles/src/test/kotlin/com/tangem/core/toggle/manager/ProdTogglesManagerTest.kt b/core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/manager/ProdTogglesManagerTest.kt similarity index 88% rename from core/toggles/src/test/kotlin/com/tangem/core/toggle/manager/ProdTogglesManagerTest.kt rename to core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/manager/ProdTogglesManagerTest.kt index 8b8f5d2884..6453d3eb4d 100644 --- a/core/toggles/src/test/kotlin/com/tangem/core/toggle/manager/ProdTogglesManagerTest.kt +++ b/core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/manager/ProdTogglesManagerTest.kt @@ -1,13 +1,13 @@ -package com.tangem.core.toggle.manager +package com.tangem.core.configtoggle.manager import android.content.pm.PackageManager import com.google.common.truth.Truth -import com.tangem.core.toggle.feature.impl.FeatureTogglesConstants -import com.tangem.core.toggle.feature.impl.ProdFeatureTogglesManager -import com.tangem.core.toggle.storage.Toggle -import com.tangem.core.toggle.storage.TogglesStorage -import com.tangem.core.toggle.utils.associateToggles -import com.tangem.core.toggle.version.VersionProvider +import com.tangem.core.configtoggle.feature.impl.FeatureTogglesConstants +import com.tangem.core.configtoggle.feature.impl.ProdFeatureTogglesManager +import com.tangem.core.configtoggle.storage.ConfigToggle +import com.tangem.core.configtoggle.storage.TogglesStorage +import com.tangem.core.configtoggle.utils.associateToggles +import com.tangem.core.configtoggle.version.VersionProvider import io.mockk.* import kotlinx.coroutines.test.runTest import org.junit.Test @@ -124,8 +124,8 @@ internal class ProdTogglesManagerTest { private companion object { val localFeatureToggles = listOf( - Toggle(name = "INACTIVE_TEST_FEATURE_ENABLED", version = "undefined"), - Toggle(name = "ACTIVE2_TEST_FEATURE_ENABLED", version = "1.0.0"), + ConfigToggle(name = "INACTIVE_TEST_FEATURE_ENABLED", version = "undefined"), + ConfigToggle(name = "ACTIVE2_TEST_FEATURE_ENABLED", version = "1.0.0"), ) val disabledFeatureToggles = mapOf( diff --git a/core/toggles/src/test/kotlin/com/tangem/core/toggle/storage/LocalTogglesStorageTest.kt b/core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/storage/LocalTogglesStorageTest.kt similarity index 85% rename from core/toggles/src/test/kotlin/com/tangem/core/toggle/storage/LocalTogglesStorageTest.kt rename to core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/storage/LocalTogglesStorageTest.kt index 7a875582d6..4a8e6550b8 100644 --- a/core/toggles/src/test/kotlin/com/tangem/core/toggle/storage/LocalTogglesStorageTest.kt +++ b/core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/storage/LocalTogglesStorageTest.kt @@ -1,11 +1,11 @@ -package com.tangem.core.toggle.storage +package com.tangem.core.configtoggle.storage import android.annotation.SuppressLint import com.google.common.truth.Truth import com.squareup.moshi.JsonAdapter import com.squareup.moshi.Moshi import com.squareup.moshi.Types -import com.tangem.core.toggle.feature.impl.FeatureTogglesConstants +import com.tangem.core.configtoggle.feature.impl.FeatureTogglesConstants import com.tangem.datasource.asset.loader.AssetLoader import com.tangem.datasource.asset.reader.AssetReader import io.mockk.* @@ -21,7 +21,7 @@ internal class LocalTogglesStorageTest { private val assetReader = mockk() private val moshi = mockk() - private val jsonAdapter = mockk>>() + private val jsonAdapter = mockk>>() // Impossible to mockk AssetLoader because it implement inline functions private val assetLoader = AssetLoader(assetReader = assetReader, moshi = moshi) @@ -57,7 +57,7 @@ internal class LocalTogglesStorageTest { jsonAdapter.fromJson(json) } - Truth.assertThat(storage.toggles).containsExactlyElementsIn(emptyList()) + Truth.assertThat(storage.toggles).containsExactlyElementsIn(emptyList()) } @Test @@ -69,14 +69,14 @@ internal class LocalTogglesStorageTest { coVerifyOrder { assetReader.read(CONFIG_FILE_NAME) } verifyAll(inverse = true) { jsonAdapter.fromJson(any()) } - Truth.assertThat(storage.toggles).containsExactlyElementsIn(emptyList()) + Truth.assertThat(storage.toggles).containsExactlyElementsIn(emptyList()) } private fun everyReadingJson() = coEvery { assetReader.read(CONFIG_FILE_NAME) } private fun everyCreatingMoshiAdapter() = every { - val types = Types.newParameterizedType(List::class.java, Toggle::class.java) - moshi.adapter>(types) + val types = Types.newParameterizedType(List::class.java, ConfigToggle::class.java) + moshi.adapter>(types) } private fun everyMappingJson() = every { jsonAdapter.fromJson(json) } @@ -98,8 +98,8 @@ internal class LocalTogglesStorageTest { """.trimIndent() val featureToggles = listOf( - Toggle(name = "INACTIVE_TEST_FEATURE_ENABLED", version = "undefined"), - Toggle(name = "ACTIVE2_TEST_FEATURE_ENABLED", version = "1.0.0"), + ConfigToggle(name = "INACTIVE_TEST_FEATURE_ENABLED", version = "undefined"), + ConfigToggle(name = "ACTIVE2_TEST_FEATURE_ENABLED", version = "1.0.0"), ) } } \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/preferences/PreferencesKeys.kt b/core/datasource/src/main/java/com/tangem/datasource/local/preferences/PreferencesKeys.kt index 1f4b7caf2b..cf9ecaf3f0 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/preferences/PreferencesKeys.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/local/preferences/PreferencesKeys.kt @@ -55,7 +55,7 @@ object PreferencesKeys { val FEATURE_TOGGLES_KEY by lazy { stringPreferencesKey(name = "featureToggles") } - val EXCLUDED_BLOCKCHAINS_KEY by lazy { stringPreferencesKey(name = "excludedBlockchains") } + val EXCLUDED_BLOCKCHAINS_KEY by lazy { stringSetPreferencesKey(name = "excludedBlockchains") } val WAS_TWINS_ONBOARDING_SHOWN by lazy { booleanPreferencesKey(name = "twinsOnboardingShown") } diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/preferences/utils/AppPreferencesStoreExt.kt b/core/datasource/src/main/java/com/tangem/datasource/local/preferences/utils/AppPreferencesStoreExt.kt index ebfe3c221d..0369cf22cd 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/preferences/utils/AppPreferencesStoreExt.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/local/preferences/utils/AppPreferencesStoreExt.kt @@ -98,12 +98,6 @@ suspend inline fun AppPreferencesStore.storeObjectList(key: Preferen edit { it[key] = adapter.toJson(value) } } -/** Store set of data [value] by string [key] */ -suspend inline fun AppPreferencesStore.storeObjectSet(key: Preferences.Key, value: Set) { - val adapter = moshi.adapter>(Types.newParameterizedType(Set::class.java, T::class.java)) - edit { it[key] = adapter.toJson(value) } -} - /** Get flow of list of data [T] by string [key]. If data is not found, it returns `null` */ inline fun AppPreferencesStore.getObjectList(key: Preferences.Key): Flow?> { val adapter = moshi.adapter>(Types.newParameterizedType(List::class.java, T::class.java)) diff --git a/core/toggles/src/main/kotlin/com/tangem/core/toggle/utils/CollectionExt.kt b/core/toggles/src/main/kotlin/com/tangem/core/toggle/utils/CollectionExt.kt deleted file mode 100644 index 44a378ac2c..0000000000 --- a/core/toggles/src/main/kotlin/com/tangem/core/toggle/utils/CollectionExt.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.tangem.core.toggle.utils - -import com.tangem.core.toggle.storage.Toggle -import com.tangem.core.toggle.version.VersionAvailabilityContract - -internal fun List.associateToggles(currentVersion: String): Map { - return associate { localToggle -> - Pair( - first = localToggle.name, - second = VersionAvailabilityContract(currentVersion, localToggle.version), - ) - } -} \ No newline at end of file diff --git a/features/details/impl/build.gradle.kts b/features/details/impl/build.gradle.kts index b38b859e27..b3981ae397 100644 --- a/features/details/impl/build.gradle.kts +++ b/features/details/impl/build.gradle.kts @@ -21,7 +21,7 @@ dependencies { /* Project - Core */ implementation(projects.core.decompose) implementation(projects.core.ui) - implementation(projects.core.toggles) + implementation(projects.core.configToggles) implementation(projects.core.navigation) implementation(projects.core.analytics) implementation(projects.core.analytics.models) diff --git a/features/disclaimer/impl/build.gradle.kts b/features/disclaimer/impl/build.gradle.kts index 443b47a2ac..c7d9e6d9fd 100644 --- a/features/disclaimer/impl/build.gradle.kts +++ b/features/disclaimer/impl/build.gradle.kts @@ -28,7 +28,7 @@ dependencies { /** Core modules */ implementation(projects.core.ui) implementation(projects.core.utils) - implementation(projects.core.toggles) + implementation(projects.core.configToggles) implementation(projects.core.navigation) implementation(projects.core.decompose) implementation(projects.common.routing) diff --git a/features/manage-tokens/impl/build.gradle.kts b/features/manage-tokens/impl/build.gradle.kts index 896ec5d1c3..1d92f0d67a 100644 --- a/features/manage-tokens/impl/build.gradle.kts +++ b/features/manage-tokens/impl/build.gradle.kts @@ -19,7 +19,7 @@ dependencies { implementation(projects.core.decompose) implementation(projects.core.ui) implementation(projects.common.routing) - implementation(projects.core.toggles) + implementation(projects.core.configToggles) implementation(projects.core.analytics) /* Project - Domain */ diff --git a/features/markets/impl/build.gradle.kts b/features/markets/impl/build.gradle.kts index ee18d8dfb1..6b12108830 100644 --- a/features/markets/impl/build.gradle.kts +++ b/features/markets/impl/build.gradle.kts @@ -63,7 +63,7 @@ dependencies { /* Core */ implementation(projects.core.decompose) implementation(projects.core.ui) - implementation(projects.core.toggles) + implementation(projects.core.configToggles) implementation(projects.core.analytics) implementation(projects.core.analytics.models) diff --git a/features/onboarding-v2/impl/build.gradle.kts b/features/onboarding-v2/impl/build.gradle.kts index d9d42209ae..d4aef21340 100644 --- a/features/onboarding-v2/impl/build.gradle.kts +++ b/features/onboarding-v2/impl/build.gradle.kts @@ -16,7 +16,7 @@ dependencies { implementation(projects.features.onboardingV2.api) /** Core modules */ - implementation(projects.core.toggles) + implementation(projects.core.configToggles) implementation(projects.core.analytics) implementation(projects.core.analytics.models) implementation(projects.core.utils) diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/DefaultOnboardingV2FeatureToggles.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/DefaultOnboardingV2FeatureToggles.kt index d677f7e5bf..529bebe5d7 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/DefaultOnboardingV2FeatureToggles.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/DefaultOnboardingV2FeatureToggles.kt @@ -1,6 +1,6 @@ package com.tangem.features.onboarding.v2 -import com.tangem.core.toggle.feature.FeatureTogglesManager +import com.tangem.core.configtoggle.feature.FeatureTogglesManager import javax.inject.Inject internal class DefaultOnboardingV2FeatureToggles @Inject constructor( diff --git a/features/onboarding/build.gradle.kts b/features/onboarding/build.gradle.kts index 480638468a..fb353a3220 100644 --- a/features/onboarding/build.gradle.kts +++ b/features/onboarding/build.gradle.kts @@ -15,7 +15,7 @@ dependencies { /** Core modules */ implementation(project(":common")) implementation(project(":domain:models")) - implementation(project(":core:toggles")) + implementation(project(":core:config-toggles")) implementation(project(":core:datasource")) implementation(project(":core:analytics")) implementation(projects.core.analytics.models) diff --git a/features/onramp/impl/build.gradle.kts b/features/onramp/impl/build.gradle.kts index b6a32faee2..d2aa39d798 100644 --- a/features/onramp/impl/build.gradle.kts +++ b/features/onramp/impl/build.gradle.kts @@ -21,7 +21,7 @@ dependencies { /** Project - Core */ implementation(projects.core.decompose) implementation(projects.core.ui) - implementation(projects.core.toggles) + implementation(projects.core.configToggles) implementation(projects.core.navigation) /** Project - Common */ diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/DefaultOnrampFeatureToggles.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/DefaultOnrampFeatureToggles.kt index 2669d201e9..337eb159c5 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/DefaultOnrampFeatureToggles.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/DefaultOnrampFeatureToggles.kt @@ -1,6 +1,6 @@ package com.tangem.features.onramp -import com.tangem.core.toggle.feature.FeatureTogglesManager +import com.tangem.core.configtoggle.feature.FeatureTogglesManager internal class DefaultOnrampFeatureToggles( private val featureTogglesManager: FeatureTogglesManager, diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/OnrampFeatureModule.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/OnrampFeatureModule.kt index 3392e56a71..c10c24183d 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/OnrampFeatureModule.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/OnrampFeatureModule.kt @@ -1,8 +1,6 @@ package com.tangem.features.onramp -import com.tangem.core.toggle.feature.FeatureTogglesManager -import com.tangem.features.onramp.DefaultOnrampFeatureToggles -import com.tangem.features.onramp.OnrampFeatureToggles +import com.tangem.core.configtoggle.feature.FeatureTogglesManager import dagger.Module import dagger.Provides import dagger.hilt.InstallIn diff --git a/features/push-notifications/impl/build.gradle.kts b/features/push-notifications/impl/build.gradle.kts index 5cb0bfe1d8..de3b57819b 100644 --- a/features/push-notifications/impl/build.gradle.kts +++ b/features/push-notifications/impl/build.gradle.kts @@ -27,7 +27,7 @@ dependencies { /** Core modules */ implementation(projects.core.ui) - implementation(projects.core.toggles) + implementation(projects.core.configToggles) implementation(projects.core.navigation) implementation(projects.core.analytics) implementation(projects.core.analytics.models) diff --git a/features/send/impl/build.gradle.kts b/features/send/impl/build.gradle.kts index 1af9e0ba59..176864f05a 100644 --- a/features/send/impl/build.gradle.kts +++ b/features/send/impl/build.gradle.kts @@ -43,7 +43,7 @@ dependencies { implementation(deps.tangem.blockchain) /** Core modules */ - implementation(projects.core.toggles) + implementation(projects.core.configToggles) implementation(projects.core.ui) implementation(projects.core.utils) implementation(projects.core.navigation) diff --git a/features/staking/impl/build.gradle.kts b/features/staking/impl/build.gradle.kts index ed61b2bdcb..6c77d65471 100644 --- a/features/staking/impl/build.gradle.kts +++ b/features/staking/impl/build.gradle.kts @@ -40,7 +40,7 @@ dependencies { implementation(deps.tangem.blockchain) /** Core modules */ - implementation(projects.core.toggles) + implementation(projects.core.configToggles) implementation(projects.core.ui) implementation(projects.core.utils) implementation(projects.core.navigation) diff --git a/features/swap/presentation/build.gradle.kts b/features/swap/presentation/build.gradle.kts index 23df0ea2f3..ddbb0c1e9a 100644 --- a/features/swap/presentation/build.gradle.kts +++ b/features/swap/presentation/build.gradle.kts @@ -15,7 +15,7 @@ dependencies { /** Core modules */ implementation(projects.core.analytics) implementation(projects.core.analytics.models) - implementation(projects.core.toggles) + implementation(projects.core.configToggles) implementation(projects.core.navigation) implementation(projects.core.utils) implementation(projects.core.ui) diff --git a/features/tester/impl/build.gradle.kts b/features/tester/impl/build.gradle.kts index 6158abaeb9..5be818db4b 100644 --- a/features/tester/impl/build.gradle.kts +++ b/features/tester/impl/build.gradle.kts @@ -39,7 +39,7 @@ dependencies { /** Core modules */ implementation(projects.core.datasource) - implementation(projects.core.toggles) + implementation(projects.core.configToggles) implementation(projects.core.ui) implementation(projects.core.utils) implementation(projects.core.navigation) diff --git a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/featuretoggles/viewmodels/FeatureTogglesViewModel.kt b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/featuretoggles/viewmodels/FeatureTogglesViewModel.kt index 34b965c18b..0da5a80bad 100644 --- a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/featuretoggles/viewmodels/FeatureTogglesViewModel.kt +++ b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/featuretoggles/viewmodels/FeatureTogglesViewModel.kt @@ -5,9 +5,9 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.tangem.core.configtoggle.feature.FeatureTogglesManager +import com.tangem.core.configtoggle.feature.MutableFeatureTogglesManager import com.tangem.core.navigation.finisher.AppFinisher -import com.tangem.core.toggle.feature.FeatureTogglesManager -import com.tangem.core.toggle.feature.MutableFeatureTogglesManager import com.tangem.feature.tester.presentation.featuretoggles.models.TesterFeatureToggle import com.tangem.feature.tester.presentation.featuretoggles.state.FeatureTogglesContentState import com.tangem.feature.tester.presentation.navigation.InnerTesterRouter diff --git a/features/tokendetails/impl/build.gradle.kts b/features/tokendetails/impl/build.gradle.kts index cf37f98aed..d7fd0ffad5 100644 --- a/features/tokendetails/impl/build.gradle.kts +++ b/features/tokendetails/impl/build.gradle.kts @@ -54,7 +54,7 @@ dependencies { implementation(projects.core.datasource) implementation(projects.core.deepLinks) implementation(projects.core.deepLinks.global) - implementation(projects.core.toggles) + implementation(projects.core.configToggles) implementation(projects.core.decompose) implementation(projects.common.ui) diff --git a/features/wallet-settings/impl/build.gradle.kts b/features/wallet-settings/impl/build.gradle.kts index 5af449e0c1..9bad883a97 100644 --- a/features/wallet-settings/impl/build.gradle.kts +++ b/features/wallet-settings/impl/build.gradle.kts @@ -20,7 +20,7 @@ dependencies { /* Project - Core */ implementation(projects.core.decompose) implementation(projects.core.ui) - implementation(projects.core.toggles) + implementation(projects.core.configToggles) implementation(projects.core.navigation) implementation(projects.core.analytics) implementation(projects.core.analytics.models) diff --git a/features/wallet/impl/build.gradle.kts b/features/wallet/impl/build.gradle.kts index 4ed8e4e465..624fa004c5 100644 --- a/features/wallet/impl/build.gradle.kts +++ b/features/wallet/impl/build.gradle.kts @@ -46,7 +46,7 @@ dependencies { kapt(deps.hilt.kapt) /** Core modules */ - implementation(projects.core.toggles) + implementation(projects.core.configToggles) implementation(projects.core.navigation) implementation(projects.core.ui) implementation(projects.core.utils) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/featuretoggles/DefaultWalletFeatureToggles.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/featuretoggles/DefaultWalletFeatureToggles.kt index b32cabf35d..c3aba027cc 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/featuretoggles/DefaultWalletFeatureToggles.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/featuretoggles/DefaultWalletFeatureToggles.kt @@ -1,6 +1,6 @@ package com.tangem.feature.wallet.featuretoggles -import com.tangem.core.toggle.feature.FeatureTogglesManager +import com.tangem.core.configtoggle.feature.FeatureTogglesManager import com.tangem.features.wallet.featuretoggles.WalletFeatureToggles import javax.inject.Inject diff --git a/libs/blockchain-sdk/build.gradle.kts b/libs/blockchain-sdk/build.gradle.kts index 864077c492..96dcda0905 100644 --- a/libs/blockchain-sdk/build.gradle.kts +++ b/libs/blockchain-sdk/build.gradle.kts @@ -13,7 +13,7 @@ dependencies { // region Core modules implementation(projects.core.datasource) - implementation(projects.core.toggles) + implementation(projects.core.configToggles) implementation(projects.core.utils) // endregion 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 5e75ba18ed..e0ac497835 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 @@ -9,7 +9,7 @@ import com.tangem.blockchainsdk.datastorage.DefaultBlockchainDataStorage import com.tangem.blockchainsdk.featuretoggles.DefaultBlockchainSDKFeatureToggles import com.tangem.blockchainsdk.loader.BlockchainProvidersResponseLoader import com.tangem.blockchainsdk.store.DefaultRuntimeStore -import com.tangem.core.toggle.feature.FeatureTogglesManager +import com.tangem.core.configtoggle.feature.FeatureTogglesManager import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.local.config.environment.EnvironmentConfigStorage import com.tangem.datasource.local.preferences.AppPreferencesStore diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/featuretoggles/DefaultBlockchainSDKFeatureToggles.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/featuretoggles/DefaultBlockchainSDKFeatureToggles.kt index 99a4bfeaa0..2242f2675f 100644 --- a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/featuretoggles/DefaultBlockchainSDKFeatureToggles.kt +++ b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/featuretoggles/DefaultBlockchainSDKFeatureToggles.kt @@ -1,6 +1,6 @@ package com.tangem.blockchainsdk.featuretoggles -import com.tangem.core.toggle.feature.FeatureTogglesManager +import com.tangem.core.configtoggle.feature.FeatureTogglesManager internal class DefaultBlockchainSDKFeatureToggles( private val featureTogglesManager: FeatureTogglesManager, diff --git a/settings.gradle.kts b/settings.gradle.kts index a84de9b176..d8139ac1f0 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -127,7 +127,7 @@ include(":common:routing") include(":core:analytics") include(":core:analytics:models") include(":core:datasource") -include(":core:toggles") +include(":core:config-toggles") include(":core:navigation") include(":core:res") include(":core:ui") From 14216d524317849d9f252f852a3a9c90ce4fda61 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 26 Nov 2024 13:54:51 +0400 Subject: [PATCH 5/5] Updated on 2026-08-14 --- app/src/main/java/com/tangem/tap/TangemApplication.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/tangem/tap/TangemApplication.kt b/app/src/main/java/com/tangem/tap/TangemApplication.kt index 18d3e87bd8..ddb2c9f1bc 100644 --- a/app/src/main/java/com/tangem/tap/TangemApplication.kt +++ b/app/src/main/java/com/tangem/tap/TangemApplication.kt @@ -208,7 +208,7 @@ abstract class TangemApplication : Application(), ImageLoaderFactory { // TODO: Try to performance and user experience. // [REDACTED_JIRA] - runBlocking(dispatchers.io) { + runBlocking { awaitAll( async { featureTogglesManager.init() }, async { excludedBlockchainsManager.init() },