diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f08ee1b88d..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.featuretoggles) + 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 b116caf952..81b845f7bc 100644 --- a/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt +++ b/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt @@ -5,7 +5,8 @@ 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.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.datasource.connection.NetworkConnectionManager @@ -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 0e2e83f67f..ddb2c9f1bc 100644 --- a/app/src/main/java/com/tangem/tap/TangemApplication.kt +++ b/app/src/main/java/com/tangem/tap/TangemApplication.kt @@ -17,7 +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.featuretoggle.manager.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 @@ -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() { @@ -200,9 +209,11 @@ abstract class TangemApplication : Application(), ImageLoaderFactory { // TODO: Try to performance and user experience. // [REDACTED_JIRA] runBlocking { - featureTogglesManager.init() - - initWithConfigDependency(environmentConfig = environmentConfigStorage.initialize()) + 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/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..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.featuretoggle.manager.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 904cfe1673..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.featuretoggle.manager.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 cc4a3e16c4..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.featuretoggle.manager.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 26547d68e8..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.featuretoggle.manager.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 ce8c0bcec3..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.featuretoggle.manager.FeatureTogglesManager +import com.tangem.core.configtoggle.feature.FeatureTogglesManager import javax.inject.Inject class HomeFeatureToggles @Inject constructor( diff --git a/core/featuretoggles/.gitignore b/core/config-toggles/.gitignore similarity index 100% rename from core/featuretoggles/.gitignore rename to core/config-toggles/.gitignore diff --git a/core/featuretoggles/build.gradle.kts b/core/config-toggles/build.gradle.kts similarity index 94% rename from core/featuretoggles/build.gradle.kts rename to core/config-toggles/build.gradle.kts index 410ef17d0e..0a7bc83fdc 100644 --- a/core/featuretoggles/build.gradle.kts +++ b/core/config-toggles/build.gradle.kts @@ -7,7 +7,7 @@ plugins { } android { - namespace = "com.tangem.core.featuretoggles" + namespace = "com.tangem.core.configtoggle" } dependencies { diff --git a/core/config-toggles/src/main/assets/configs/excluded_blockchains_config.json b/core/config-toggles/src/main/assets/configs/excluded_blockchains_config.json new file mode 100644 index 0000000000..4113610e04 --- /dev/null +++ b/core/config-toggles/src/main/assets/configs/excluded_blockchains_config.json @@ -0,0 +1,10 @@ +[ + { + "name": "", + "version": "undefined" + }, + { + "name": "NEXA", + "version": "undefined" + } +] \ No newline at end of file diff --git a/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/blockchain/ExcludedBlockchainsManager.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/blockchain/ExcludedBlockchainsManager.kt new file mode 100644 index 0000000000..f5db3637b9 --- /dev/null +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/blockchain/ExcludedBlockchainsManager.kt @@ -0,0 +1,8 @@ +package com.tangem.core.configtoggle.blockchain + +interface ExcludedBlockchainsManager { + + val excludedBlockchainsIds: Set + + suspend fun init() +} \ No newline at end of file diff --git a/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/blockchain/MutableExcludedBlockchainsManager.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/blockchain/MutableExcludedBlockchainsManager.kt new file mode 100644 index 0000000000..1f7fcf4dc0 --- /dev/null +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/blockchain/MutableExcludedBlockchainsManager.kt @@ -0,0 +1,10 @@ +package com.tangem.core.configtoggle.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/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/blockchain/impl/DefaultExcludedBlockchainsManager.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/blockchain/impl/DefaultExcludedBlockchainsManager.kt new file mode 100644 index 0000000000..d0f1dccc44 --- /dev/null +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/blockchain/impl/DefaultExcludedBlockchainsManager.kt @@ -0,0 +1,74 @@ +package com.tangem.core.configtoggle.blockchain.impl + +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.getSyncOrDefault +import com.tangem.datasource.local.preferences.utils.store + +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.getSyncOrDefault( + key = PreferencesKeys.EXCLUDED_BLOCKCHAINS_KEY, + default = emptySet(), + ) + + 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.store( + PreferencesKeys.EXCLUDED_BLOCKCHAINS_KEY, + currentExcludedBlockchainsIds, + ) + } +} \ No newline at end of file diff --git a/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/di/ExcludedBlockchainsManagerModule.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/di/ExcludedBlockchainsManagerModule.kt new file mode 100644 index 0000000000..2e4fcddac5 --- /dev/null +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/di/ExcludedBlockchainsManagerModule.kt @@ -0,0 +1,49 @@ +package com.tangem.core.configtoggle.di + +import android.content.Context +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 +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 diff --git a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/di/FeatureTogglesManagerModule.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/di/FeatureTogglesManagerModule.kt similarity index 62% rename from core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/di/FeatureTogglesManagerModule.kt rename to core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/di/FeatureTogglesManagerModule.kt index ca45c78a6b..8346378b52 100644 --- a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/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.featuretoggle.di +package com.tangem.core.configtoggle.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.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 @@ -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/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/FeatureTogglesManager.kt similarity index 86% rename from core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/manager/FeatureTogglesManager.kt rename to core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/FeatureTogglesManager.kt index 6111e7f73b..86a027924c 100644 --- a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/manager/FeatureTogglesManager.kt +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/FeatureTogglesManager.kt @@ -1,4 +1,4 @@ -package com.tangem.core.featuretoggle.manager +package com.tangem.core.configtoggle.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/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/MutableFeatureTogglesManager.kt similarity index 92% rename from core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/manager/MutableFeatureTogglesManager.kt rename to core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/MutableFeatureTogglesManager.kt index f04b423f4f..d1d09ced03 100644 --- a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/manager/MutableFeatureTogglesManager.kt +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/MutableFeatureTogglesManager.kt @@ -1,4 +1,4 @@ -package com.tangem.core.featuretoggle.manager +package com.tangem.core.configtoggle.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/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/impl/DevFeatureTogglesManager.kt similarity index 81% rename from core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/manager/DevFeatureTogglesManager.kt rename to core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/impl/DevFeatureTogglesManager.kt index 303dce3c7b..750dbada43 100644 --- a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/manager/DevFeatureTogglesManager.kt +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/impl/DevFeatureTogglesManager.kt @@ -1,9 +1,10 @@ -package com.tangem.core.featuretoggle.manager +package com.tangem.core.configtoggle.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.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 @@ -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/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/impl/FeatureTogglesConstants.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/impl/FeatureTogglesConstants.kt new file mode 100644 index 0000000000..63087a2e90 --- /dev/null +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/impl/FeatureTogglesConstants.kt @@ -0,0 +1,6 @@ +package com.tangem.core.configtoggle.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/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/impl/ProdFeatureTogglesManager.kt similarity index 62% rename from core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/manager/ProdFeatureTogglesManager.kt rename to core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/impl/ProdFeatureTogglesManager.kt index 0f88c3791c..d723297a45 100644 --- a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/manager/ProdFeatureTogglesManager.kt +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/feature/impl/ProdFeatureTogglesManager.kt @@ -1,27 +1,28 @@ -package com.tangem.core.featuretoggle.manager +package com.tangem.core.configtoggle.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.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 /** * 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/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/storage/ConfigToggle.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/storage/ConfigToggle.kt new file mode 100644 index 0000000000..6078eea70a --- /dev/null +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/storage/ConfigToggle.kt @@ -0,0 +1,20 @@ +package com.tangem.core.configtoggle.storage + +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass + +/** + * Data model with information about config toggle + * + * @property name toggle name + * @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 ConfigToggle( + @Json(name = "name") val name: String, + @Json(name = "version") val version: String, +) \ No newline at end of file diff --git a/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/storage/LocalTogglesStorage.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/storage/LocalTogglesStorage.kt new file mode 100644 index 0000000000..59086d9658 --- /dev/null +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/storage/LocalTogglesStorage.kt @@ -0,0 +1,24 @@ +package com.tangem.core.configtoggle.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/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/storage/TogglesStorage.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/storage/TogglesStorage.kt new file mode 100644 index 0000000000..39fa7b2f68 --- /dev/null +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/storage/TogglesStorage.kt @@ -0,0 +1,15 @@ +package com.tangem.core.configtoggle.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/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/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/version/DefaultVersionProvider.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/version/DefaultVersionProvider.kt similarity index 96% rename from core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/version/DefaultVersionProvider.kt rename to core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/version/DefaultVersionProvider.kt index c602be463f..b55e9637c3 100644 --- a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/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.featuretoggle.version +package com.tangem.core.configtoggle.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/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/version/Version.kt similarity index 98% rename from core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/contract/Version.kt rename to core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/version/Version.kt index b506d80ec4..0822cec520 100644 --- a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/contract/Version.kt +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/version/Version.kt @@ -1,4 +1,4 @@ -package com.tangem.core.featuretoggle.contract +package com.tangem.core.configtoggle.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/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/version/VersionAvailabilityContract.kt similarity index 93% rename from core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/contract/VersionAvailabilityContract.kt rename to core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/version/VersionAvailabilityContract.kt index 2ee5c72e14..2360052af4 100644 --- a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/contract/VersionAvailabilityContract.kt +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/version/VersionAvailabilityContract.kt @@ -1,4 +1,4 @@ -package com.tangem.core.featuretoggle.contract +package com.tangem.core.configtoggle.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/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/version/VersionProvider.kt similarity index 74% rename from core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/version/VersionProvider.kt rename to core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/version/VersionProvider.kt index 585caf85b8..27913b7dce 100644 --- a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/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.featuretoggle.version +package com.tangem.core.configtoggle.version /** Application version provider */ internal interface VersionProvider { diff --git a/core/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/contract/VersionAvailabilityContractTest.kt b/core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/contract/VersionAvailabilityContractTest.kt similarity index 93% rename from core/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/contract/VersionAvailabilityContractTest.kt rename to core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/contract/VersionAvailabilityContractTest.kt index 476c967367..ba641dfd04 100644 --- a/core/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/contract/VersionAvailabilityContractTest.kt +++ b/core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/contract/VersionAvailabilityContractTest.kt @@ -1,6 +1,7 @@ -package com.tangem.core.featuretoggle.contract +package com.tangem.core.configtoggle.contract import com.google.common.truth.Truth +import com.tangem.core.configtoggle.version.VersionAvailabilityContract import org.junit.Test /** diff --git a/core/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/contract/VersionTest.kt b/core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/contract/VersionTest.kt similarity index 97% rename from core/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/contract/VersionTest.kt rename to core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/contract/VersionTest.kt index f8763c6a00..e61ace5722 100644 --- a/core/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/contract/VersionTest.kt +++ b/core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/contract/VersionTest.kt @@ -1,6 +1,7 @@ -package com.tangem.core.featuretoggle.contract +package com.tangem.core.configtoggle.contract import com.google.common.truth.Truth +import com.tangem.core.configtoggle.version.Version import org.junit.Test /** diff --git a/core/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/manager/DevFeatureTogglesManagerTest.kt b/core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/manager/DevTogglesManagerTest.kt similarity index 78% rename from core/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/manager/DevFeatureTogglesManagerTest.kt rename to core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/manager/DevTogglesManagerTest.kt index e0e8fbef2f..b1822c84d9 100644 --- a/core/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/manager/DevFeatureTogglesManagerTest.kt +++ b/core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/manager/DevTogglesManagerTest.kt @@ -1,11 +1,13 @@ -package com.tangem.core.featuretoggle.manager +package com.tangem.core.configtoggle.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.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 @@ -19,13 +21,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 +36,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(FeatureTogglesConstants.LOCAL_CONFIG_PATH) } 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(FeatureTogglesConstants.LOCAL_CONFIG_PATH) versionProvider.get() } @@ -61,17 +63,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(FeatureTogglesConstants.LOCAL_CONFIG_PATH) } 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(FeatureTogglesConstants.LOCAL_CONFIG_PATH) versionProvider.get() } @@ -88,17 +90,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(FeatureTogglesConstants.LOCAL_CONFIG_PATH) } 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(FeatureTogglesConstants.LOCAL_CONFIG_PATH) versionProvider.get() } @@ -111,15 +113,15 @@ internal class DevFeatureTogglesManagerTest { @Test fun `successfully initialize storage if versionProvider returns null`() = runTest { - coEvery { localFeatureTogglesStorage.init() } just Runs + coEvery { localTogglesStorage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH) } 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(FeatureTogglesConstants.LOCAL_CONFIG_PATH) versionProvider.get() } @@ -222,8 +224,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"), + 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/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/manager/ProdFeatureTogglesManagerTest.kt b/core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/manager/ProdTogglesManagerTest.kt similarity index 64% rename from core/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/manager/ProdFeatureTogglesManagerTest.kt rename to core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/manager/ProdTogglesManagerTest.kt index 35af42ae54..6453d3eb4d 100644 --- a/core/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/manager/ProdFeatureTogglesManagerTest.kt +++ b/core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/manager/ProdTogglesManagerTest.kt @@ -1,11 +1,13 @@ -package com.tangem.core.featuretoggle.manager +package com.tangem.core.configtoggle.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.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 @@ -13,24 +15,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(FeatureTogglesConstants.LOCAL_CONFIG_PATH) } just Runs + every { localTogglesStorage.toggles } returns localFeatureToggles every { versionProvider.get() } returns currentVersion manager.init() coVerifyOrder { - localFeatureTogglesStorage.init() + localTogglesStorage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH) versionProvider.get() } @@ -40,14 +42,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(FeatureTogglesConstants.LOCAL_CONFIG_PATH) } just Runs + every { localTogglesStorage.toggles } returns localFeatureToggles every { versionProvider.get() } returns null manager.init() coVerifyOrder { - localFeatureTogglesStorage.init() + localTogglesStorage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH) versionProvider.get() } @@ -56,8 +58,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(FeatureTogglesConstants.LOCAL_CONFIG_PATH) } just Runs + every { localTogglesStorage.toggles } throws IllegalStateException( "Property featureToggles should be initialized before get.", ) @@ -72,14 +74,14 @@ internal class ProdFeatureTogglesManagerTest { Truth.assertThat(it).isInstanceOf(IllegalStateException::class.java) } - coVerifyOrder { localFeatureTogglesStorage.init() } + coVerifyOrder { localTogglesStorage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH) } 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(FeatureTogglesConstants.LOCAL_CONFIG_PATH) } just Runs + every { localTogglesStorage.toggles } returns localFeatureToggles every { versionProvider.get() } throws PackageManager.NameNotFoundException() runCatching { manager.init() } @@ -89,7 +91,7 @@ internal class ProdFeatureTogglesManagerTest { } coVerifyOrder { - localFeatureTogglesStorage.init() + localTogglesStorage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH) versionProvider.get() } } @@ -122,8 +124,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"), + 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/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/storage/LocalFeatureTogglesStorageTest.kt b/core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/storage/LocalTogglesStorageTest.kt similarity index 71% rename from core/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/storage/LocalFeatureTogglesStorageTest.kt rename to core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/storage/LocalTogglesStorageTest.kt index 3950e2c649..4a8e6550b8 100644 --- a/core/featuretoggles/src/test/kotlin/com/tangem/core/featuretoggle/storage/LocalFeatureTogglesStorageTest.kt +++ b/core/config-toggles/src/test/kotlin/com/tangem/core/configtoggle/storage/LocalTogglesStorageTest.kt @@ -1,10 +1,11 @@ -package com.tangem.core.featuretoggle.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.configtoggle.feature.impl.FeatureTogglesConstants import com.tangem.datasource.asset.loader.AssetLoader import com.tangem.datasource.asset.reader.AssetReader import io.mockk.* @@ -16,16 +17,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 +34,14 @@ internal class LocalFeatureTogglesStorageTest { everyCreatingMoshiAdapter() returns jsonAdapter everyMappingJson() returns featureToggles - storage.init() + storage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH) coVerifyOrder { assetReader.read(CONFIG_FILE_NAME) jsonAdapter.fromJson(json) } - Truth.assertThat(storage.featureToggles).containsExactlyElementsIn(featureToggles) + Truth.assertThat(storage.toggles).containsExactlyElementsIn(featureToggles) } @Test @@ -49,33 +50,33 @@ internal class LocalFeatureTogglesStorageTest { everyCreatingMoshiAdapter() returns jsonAdapter everyMappingJson() throws IOException() - storage.init() + storage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH) 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(FeatureTogglesConstants.LOCAL_CONFIG_PATH) 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, ConfigToggle::class.java) + moshi.adapter>(types) } private fun everyMappingJson() = every { jsonAdapter.fromJson(json) } @@ -97,8 +98,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"), + 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 5fd333db8a..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,6 +55,8 @@ object PreferencesKeys { val FEATURE_TOGGLES_KEY by lazy { stringPreferencesKey(name = "featureToggles") } + val EXCLUDED_BLOCKCHAINS_KEY by lazy { stringSetPreferencesKey(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/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/storage/FeatureToggle.kt b/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/storage/FeatureToggle.kt deleted file mode 100644 index b019bfc810..0000000000 --- a/core/featuretoggles/src/main/kotlin/com/tangem/core/featuretoggle/storage/FeatureToggle.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.tangem.core.featuretoggle.storage - -import com.squareup.moshi.Json -import com.squareup.moshi.JsonClass - -/** - * Data model with information about feature toggle - * - * @property name feature 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! - * -[REDACTED_AUTHOR] - */ -@JsonClass(generateAdapter = true) -internal data class FeatureToggle( - @Json(name = "name") val name: String, - @Json(name = "version") val version: String, -) \ No newline at end of file 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/features/details/impl/build.gradle.kts b/features/details/impl/build.gradle.kts index 9a16bc4892..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.featuretoggles) + 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 d60dcd1885..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.featuretoggles) + 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 93e730eb6f..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.featuretoggles) + 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 94012bfcb8..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.featuretoggles) + 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 2dfbd823dd..cd5cd2d578 100644 --- a/features/onboarding-v2/impl/build.gradle.kts +++ b/features/onboarding-v2/impl/build.gradle.kts @@ -17,7 +17,7 @@ dependencies { implementation(projects.features.manageTokens.api) /** Core modules */ - implementation(projects.core.featuretoggles) + 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 fe67d84f57..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.featuretoggle.manager.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 9f081a463f..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:featuretoggles")) + 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 c97691d146..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.featuretoggles) + 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 15d7dd6713..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.featuretoggle.manager.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 6e668e4f69..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,6 +1,6 @@ package com.tangem.features.onramp -import com.tangem.core.featuretoggle.manager.FeatureTogglesManager +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 a9965b5681..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.featuretoggles) + 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 14e47173a5..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.featuretoggles) + 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 808810f2d7..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.featuretoggles) + 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 84cbe75297..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.featuretoggles) + 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 0e94a8abeb..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.featuretoggles) + 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 2af75d3b80..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,8 +5,8 @@ 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.configtoggle.feature.FeatureTogglesManager +import com.tangem.core.configtoggle.feature.MutableFeatureTogglesManager import com.tangem.core.navigation.finisher.AppFinisher import com.tangem.feature.tester.presentation.featuretoggles.models.TesterFeatureToggle import com.tangem.feature.tester.presentation.featuretoggles.state.FeatureTogglesContentState diff --git a/features/tokendetails/impl/build.gradle.kts b/features/tokendetails/impl/build.gradle.kts index ac41a99f20..cf4e80b1fa 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.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 e472817d13..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.featuretoggles) + 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 6164b3a3cc..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.featuretoggles) + 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 cda1776fc1..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.featuretoggle.manager.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 47b65e7313..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.featuretoggles) + 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 de38a2241f..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.featuretoggle.manager.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 29df94634c..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.featuretoggle.manager.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 f915fb1945..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:featuretoggles") +include(":core:config-toggles") include(":core:navigation") include(":core:res") include(":core:ui")