From 6359ee7dbed721c94582d0c2b2ecb12eedc55c06 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 7 Jul 2023 17:50:28 +0500 Subject: [PATCH] Updated on 2026-08-14 --- app/build.gradle.kts | 2 + .../main/java/com/tangem/tap/MainActivity.kt | 5 +++ .../java/com/tangem/tap/TapApplication.kt | 5 +++ .../tap/common/extensions/Navigation.kt | 13 ++++++- .../tap/proxy/redux/DaggerGraphAction.kt | 2 + .../tap/proxy/redux/DaggerGraphReducer.kt | 1 + .../tap/proxy/redux/DaggerGraphState.kt | 4 ++ .../configs/feature_toggles_config.json | 6 ++- features/tokendetails/api/.gitignore | 1 + features/tokendetails/api/build.gradle.kts | 14 +++++++ .../TokenDetailsFeatureToggles.kt | 5 +++ .../navigation/TokenDetailsRouter.kt | 8 ++++ features/tokendetails/impl/.gitignore | 1 + features/tokendetails/impl/build.gradle.kts | 38 +++++++++++++++++++ .../di/TokenDetailsFeatureTogglesModule.kt | 21 ++++++++++ .../di/TokenDetailsRouterModule.kt | 18 +++++++++ .../DefaultTokenDetailsFeatureToggles.kt | 14 +++++++ .../router/DefaultTokenDetailsRouter.kt | 10 +++++ settings.gradle.kts | 5 +++ 19 files changed, 171 insertions(+), 2 deletions(-) create mode 100644 features/tokendetails/api/.gitignore create mode 100644 features/tokendetails/api/build.gradle.kts create mode 100644 features/tokendetails/api/src/main/kotlin/com/tangem/features/tokendetails/featuretoggles/TokenDetailsFeatureToggles.kt create mode 100644 features/tokendetails/api/src/main/kotlin/com/tangem/features/tokendetails/navigation/TokenDetailsRouter.kt create mode 100644 features/tokendetails/impl/.gitignore create mode 100644 features/tokendetails/impl/build.gradle.kts create mode 100644 features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/di/TokenDetailsFeatureTogglesModule.kt create mode 100644 features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/di/TokenDetailsRouterModule.kt create mode 100644 features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/featuretoggles/DefaultTokenDetailsFeatureToggles.kt create mode 100644 features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/router/DefaultTokenDetailsRouter.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index efe2848d8c..1f144358fa 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -52,6 +52,8 @@ dependencies { implementation(project(":features:tester:impl")) implementation(project(":features:wallet:api")) implementation(project(":features:wallet:impl")) + implementation(projects.features.tokendetails.api) + implementation(projects.features.tokendetails.impl) /** AndroidX libraries */ implementation(deps.androidx.core.ktx) diff --git a/app/src/main/java/com/tangem/tap/MainActivity.kt b/app/src/main/java/com/tangem/tap/MainActivity.kt index 4b406eaccd..de2272f1f5 100644 --- a/app/src/main/java/com/tangem/tap/MainActivity.kt +++ b/app/src/main/java/com/tangem/tap/MainActivity.kt @@ -13,6 +13,7 @@ import com.google.android.material.snackbar.Snackbar import com.tangem.TangemSdk import com.tangem.domain.card.ScanCardUseCase import com.tangem.features.tester.api.TesterRouter +import com.tangem.features.tokendetails.navigation.TokenDetailsRouter import com.tangem.features.wallet.navigation.WalletRouter import com.tangem.operations.backup.BackupService import com.tangem.sdk.extensions.init @@ -98,6 +99,9 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac @Inject lateinit var walletRouter: WalletRouter + @Inject + lateinit var tokenDetailsRouter: TokenDetailsRouter + @Inject lateinit var walletConnectInteractor: WalletConnectInteractor @@ -139,6 +143,7 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac scanCardUseCase = scanCardUseCase, walletRouter = walletRouter, walletConnectInteractor = walletConnectInteractor, + tokenDetailsRouter = tokenDetailsRouter, ), ) } diff --git a/app/src/main/java/com/tangem/tap/TapApplication.kt b/app/src/main/java/com/tangem/tap/TapApplication.kt index 114746ccdb..4288c782e7 100644 --- a/app/src/main/java/com/tangem/tap/TapApplication.kt +++ b/app/src/main/java/com/tangem/tap/TapApplication.kt @@ -22,6 +22,7 @@ import com.tangem.datasource.connection.NetworkConnectionManager import com.tangem.domain.DomainLayer import com.tangem.domain.common.LogConfig import com.tangem.feature.learn2earn.domain.api.Learn2earnInteractor +import com.tangem.features.tokendetails.featuretoggles.TokenDetailsFeatureToggles import com.tangem.features.wallet.featuretoggles.WalletFeatureToggles import com.tangem.tap.common.analytics.AnalyticsFactory import com.tangem.tap.common.analytics.api.AnalyticsHandlerBuilder @@ -147,6 +148,9 @@ class TapApplication : Application(), ImageLoaderFactory { @Inject lateinit var learn2earnInteractor: Learn2earnInteractor + @Inject + lateinit var tokenDetailsFeatureToggles: TokenDetailsFeatureToggles + override fun onCreate() { super.onCreate() @@ -163,6 +167,7 @@ class TapApplication : Application(), ImageLoaderFactory { walletFeatureToggles = walletFeatureToggles, walletConnectRepository = walletConnect2Repository, walletConnectSessionsRepository = walletConnectSessionsRepository, + tokenDetailsFeatureToggles = tokenDetailsFeatureToggles, ), ), ) diff --git a/app/src/main/java/com/tangem/tap/common/extensions/Navigation.kt b/app/src/main/java/com/tangem/tap/common/extensions/Navigation.kt index f45d14c864..7f1e93ecf1 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/Navigation.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/Navigation.kt @@ -167,7 +167,18 @@ private fun fragmentFactory(screen: AppScreen): Fragment { } } - AppScreen.WalletDetails -> WalletDetailsFragment() + AppScreen.WalletDetails -> { + val featureToggles = store.state.daggerGraphState.get( + getDependency = DaggerGraphState::tokenDetailsFeatureToggles, + ) + if (featureToggles.isRedesignedScreenEnabled) { + store.state.daggerGraphState + .get(getDependency = DaggerGraphState::tokenDetailsRouter) + .getEntryFragment() + } else { + WalletDetailsFragment() + } + } AppScreen.WalletConnectSessions -> WalletConnectFragment() AppScreen.QrScan -> QrScanFragment() AppScreen.ReferralProgram -> ReferralFragment() diff --git a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphAction.kt b/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphAction.kt index 5fab5032f5..e83ed33f3a 100644 --- a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphAction.kt +++ b/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphAction.kt @@ -2,6 +2,7 @@ package com.tangem.tap.proxy.redux import com.tangem.domain.card.ScanCardUseCase import com.tangem.features.tester.api.TesterRouter +import com.tangem.features.tokendetails.navigation.TokenDetailsRouter import com.tangem.features.wallet.navigation.WalletRouter import com.tangem.tap.domain.walletconnect2.domain.WalletConnectInteractor import org.rekotlin.Action @@ -13,5 +14,6 @@ sealed interface DaggerGraphAction : Action { val scanCardUseCase: ScanCardUseCase, val walletRouter: WalletRouter, val walletConnectInteractor: WalletConnectInteractor, + val tokenDetailsRouter: TokenDetailsRouter, ) : DaggerGraphAction } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphReducer.kt b/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphReducer.kt index bdc38a631c..bdd590be4d 100644 --- a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphReducer.kt +++ b/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphReducer.kt @@ -17,6 +17,7 @@ object DaggerGraphReducer { scanCardUseCase = action.scanCardUseCase, walletRouter = action.walletRouter, walletConnectInteractor = action.walletConnectInteractor, + tokenDetailsRouter = action.tokenDetailsRouter, ) } } diff --git a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt b/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt index a741e4dfd4..84409d4e36 100644 --- a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt +++ b/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt @@ -4,6 +4,8 @@ import com.tangem.datasource.asset.AssetReader import com.tangem.datasource.connection.NetworkConnectionManager import com.tangem.domain.card.ScanCardUseCase import com.tangem.features.tester.api.TesterRouter +import com.tangem.features.tokendetails.featuretoggles.TokenDetailsFeatureToggles +import com.tangem.features.tokendetails.navigation.TokenDetailsRouter import com.tangem.features.wallet.featuretoggles.WalletFeatureToggles import com.tangem.features.wallet.navigation.WalletRouter import com.tangem.tap.domain.walletconnect2.domain.WalletConnectInteractor @@ -23,6 +25,8 @@ data class DaggerGraphState( val walletConnectRepository: WalletConnectRepository? = null, val walletConnectSessionsRepository: WalletConnectSessionsRepository? = null, val walletConnectInteractor: WalletConnectInteractor? = null, + val tokenDetailsFeatureToggles: TokenDetailsFeatureToggles? = null, + val tokenDetailsRouter: TokenDetailsRouter? = null, ) : StateType { inline fun get(getDependency: DaggerGraphState.() -> T?): T { diff --git a/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json b/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json index 9a45d3070f..5dc4db710d 100644 --- a/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json +++ b/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json @@ -18,5 +18,9 @@ { "name": "1INCH_LEARN_2_EARN_ENABLED", "version": "undefined" + }, + { + "name": "REDESIGNED_TOKEN_DETAIL_SCREEN_ENABLED", + "version": "undefined" } -] \ No newline at end of file +] diff --git a/features/tokendetails/api/.gitignore b/features/tokendetails/api/.gitignore new file mode 100644 index 0000000000..796b96d1c4 --- /dev/null +++ b/features/tokendetails/api/.gitignore @@ -0,0 +1 @@ +/build diff --git a/features/tokendetails/api/build.gradle.kts b/features/tokendetails/api/build.gradle.kts new file mode 100644 index 0000000000..b7c1f22eeb --- /dev/null +++ b/features/tokendetails/api/build.gradle.kts @@ -0,0 +1,14 @@ +plugins { + alias(deps.plugins.android.library) + alias(deps.plugins.kotlin.android) + id("configuration") +} + +android { + namespace = "com.tangem.features.tokendetails.api" +} + +dependencies { + /** AndroidX */ + implementation(deps.androidx.fragment.ktx) +} \ No newline at end of file diff --git a/features/tokendetails/api/src/main/kotlin/com/tangem/features/tokendetails/featuretoggles/TokenDetailsFeatureToggles.kt b/features/tokendetails/api/src/main/kotlin/com/tangem/features/tokendetails/featuretoggles/TokenDetailsFeatureToggles.kt new file mode 100644 index 0000000000..751dabea32 --- /dev/null +++ b/features/tokendetails/api/src/main/kotlin/com/tangem/features/tokendetails/featuretoggles/TokenDetailsFeatureToggles.kt @@ -0,0 +1,5 @@ +package com.tangem.features.tokendetails.featuretoggles + +interface TokenDetailsFeatureToggles { + val isRedesignedScreenEnabled: Boolean +} \ No newline at end of file diff --git a/features/tokendetails/api/src/main/kotlin/com/tangem/features/tokendetails/navigation/TokenDetailsRouter.kt b/features/tokendetails/api/src/main/kotlin/com/tangem/features/tokendetails/navigation/TokenDetailsRouter.kt new file mode 100644 index 0000000000..a361d75438 --- /dev/null +++ b/features/tokendetails/api/src/main/kotlin/com/tangem/features/tokendetails/navigation/TokenDetailsRouter.kt @@ -0,0 +1,8 @@ +package com.tangem.features.tokendetails.navigation + +import androidx.fragment.app.Fragment + +interface TokenDetailsRouter { + + fun getEntryFragment(): Fragment +} \ No newline at end of file diff --git a/features/tokendetails/impl/.gitignore b/features/tokendetails/impl/.gitignore new file mode 100644 index 0000000000..796b96d1c4 --- /dev/null +++ b/features/tokendetails/impl/.gitignore @@ -0,0 +1 @@ +/build diff --git a/features/tokendetails/impl/build.gradle.kts b/features/tokendetails/impl/build.gradle.kts new file mode 100644 index 0000000000..aa624c46ac --- /dev/null +++ b/features/tokendetails/impl/build.gradle.kts @@ -0,0 +1,38 @@ +plugins { + alias(deps.plugins.android.library) + alias(deps.plugins.kotlin.android) + alias(deps.plugins.kotlin.kapt) + alias(deps.plugins.hilt.android) + id("configuration") +} + +android { + namespace = "com.tangem.features.tokendetails.impl" +} + + +dependencies { + /** AndroidX */ + implementation(deps.androidx.activity.compose) + + /** Compose */ + implementation(deps.compose.material) + implementation(deps.compose.foundation) + implementation(deps.compose.material3) + implementation(deps.compose.navigation) + implementation(deps.compose.navigation.hilt) + implementation(deps.compose.ui) + implementation(deps.compose.ui.tooling) + implementation(deps.compose.accompanist.systemUiController) + + /** DI */ + implementation(deps.hilt.android) + kapt(deps.hilt.kapt) + + /** Core modules */ + implementation(projects.core.featuretoggles) + implementation(projects.core.ui) + + /** Feature Apis */ + implementation(projects.features.tokendetails.api) +} \ No newline at end of file diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/di/TokenDetailsFeatureTogglesModule.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/di/TokenDetailsFeatureTogglesModule.kt new file mode 100644 index 0000000000..767b02d8a6 --- /dev/null +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/di/TokenDetailsFeatureTogglesModule.kt @@ -0,0 +1,21 @@ +package com.tangem.feature.tokendetails.di + +import com.tangem.core.featuretoggle.manager.FeatureTogglesManager +import com.tangem.feature.tokendetails.featuretoggles.DefaultTokenDetailsFeatureToggles +import com.tangem.features.tokendetails.featuretoggles.TokenDetailsFeatureToggles +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +internal object TokenDetailsFeatureTogglesModule { + + @Provides + @Singleton + fun provideTokenDetailsFeatureToggles(featureTogglesManager: FeatureTogglesManager): TokenDetailsFeatureToggles { + return DefaultTokenDetailsFeatureToggles(featureTogglesManager = featureTogglesManager) + } +} \ No newline at end of file diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/di/TokenDetailsRouterModule.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/di/TokenDetailsRouterModule.kt new file mode 100644 index 0000000000..47a8b90f2e --- /dev/null +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/di/TokenDetailsRouterModule.kt @@ -0,0 +1,18 @@ +package com.tangem.feature.tokendetails.di + +import com.tangem.feature.tokendetails.presentation.router.DefaultTokenDetailsRouter +import com.tangem.features.tokendetails.navigation.TokenDetailsRouter +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.components.ActivityComponent +import dagger.hilt.android.scopes.ActivityScoped + +@Module +@InstallIn(ActivityComponent::class) +internal object TokenDetailsRouterModule { + + @Provides + @ActivityScoped + fun provideTokenDetailsRouter(): TokenDetailsRouter = DefaultTokenDetailsRouter() +} \ No newline at end of file diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/featuretoggles/DefaultTokenDetailsFeatureToggles.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/featuretoggles/DefaultTokenDetailsFeatureToggles.kt new file mode 100644 index 0000000000..2ac8bd5fde --- /dev/null +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/featuretoggles/DefaultTokenDetailsFeatureToggles.kt @@ -0,0 +1,14 @@ +package com.tangem.feature.tokendetails.featuretoggles + +import com.tangem.core.featuretoggle.manager.FeatureTogglesManager +import com.tangem.features.tokendetails.featuretoggles.TokenDetailsFeatureToggles + +private const val REDESIGNED_TOKEN_DETAIL_SCREEN_ENABLED_KEY = "REDESIGNED_TOKEN_DETAIL_SCREEN_ENABLED" + +internal class DefaultTokenDetailsFeatureToggles( + private val featureTogglesManager: FeatureTogglesManager, +) : TokenDetailsFeatureToggles { + + override val isRedesignedScreenEnabled: Boolean + get() = featureTogglesManager.isFeatureEnabled(name = REDESIGNED_TOKEN_DETAIL_SCREEN_ENABLED_KEY) +} \ No newline at end of file diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/router/DefaultTokenDetailsRouter.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/router/DefaultTokenDetailsRouter.kt new file mode 100644 index 0000000000..6bfaf4dcaa --- /dev/null +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/router/DefaultTokenDetailsRouter.kt @@ -0,0 +1,10 @@ +package com.tangem.feature.tokendetails.presentation.router + +import androidx.fragment.app.Fragment +import com.tangem.features.tokendetails.navigation.TokenDetailsRouter + +internal class DefaultTokenDetailsRouter : TokenDetailsRouter { + + // TODO: Doston fix it in next PRs + override fun getEntryFragment(): Fragment = Fragment() +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 15b3f6a078..9f5e38d96a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -28,6 +28,8 @@ dependencyResolutionManagement { } } +enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") + include(":app") include(":common") @@ -61,6 +63,9 @@ include(":features:tester:impl") include(":features:wallet:api") include(":features:wallet:impl") +include(":features:tokendetails:api") +include(":features:tokendetails:impl") + include(":features:learn2earn:api") include(":features:learn2earn:impl") // endregion Feature modules