diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e3e96fb28d..b38fcaaff0 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -81,6 +81,8 @@ dependencies { implementation(projects.features.tokendetails.api) implementation(projects.features.tokendetails.impl) implementation(projects.features.send.api) + implementation(projects.features.manageTokens.api) + implementation(projects.features.manageTokens.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 2b66b30ca7..8968591dd2 100644 --- a/app/src/main/java/com/tangem/tap/MainActivity.kt +++ b/app/src/main/java/com/tangem/tap/MainActivity.kt @@ -24,6 +24,7 @@ import com.tangem.domain.apptheme.model.AppThemeMode import com.tangem.domain.card.ScanCardUseCase import com.tangem.domain.card.repository.CardSdkConfigRepository import com.tangem.domain.wallets.legacy.UserWalletsListManager +import com.tangem.features.managetokens.navigation.ManageTokensRouter import com.tangem.features.tester.api.TesterRouter import com.tangem.features.tokendetails.navigation.TokenDetailsRouter import com.tangem.features.wallet.navigation.WalletRouter @@ -108,6 +109,9 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac @Inject lateinit var tokenDetailsRouter: TokenDetailsRouter + @Inject + lateinit var manageTokensRouter: ManageTokensRouter + @Inject lateinit var walletConnectInteractor: WalletConnectInteractor @@ -155,6 +159,7 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac walletRouter = walletRouter, walletConnectInteractor = walletConnectInteractor, tokenDetailsRouter = tokenDetailsRouter, + manageTokensRouter = manageTokensRouter, cardSdkConfigRepository = cardSdkConfigRepository, ), ) diff --git a/app/src/main/java/com/tangem/tap/TapApplication.kt b/app/src/main/java/com/tangem/tap/TapApplication.kt index 8d56db3a2b..7139ed166e 100644 --- a/app/src/main/java/com/tangem/tap/TapApplication.kt +++ b/app/src/main/java/com/tangem/tap/TapApplication.kt @@ -35,6 +35,7 @@ import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.wallets.legacy.UserWalletsListManager import com.tangem.domain.wallets.legacy.WalletManagersRepository import com.tangem.domain.wallets.repository.WalletsRepository +import com.tangem.features.managetokens.featuretoggles.ManageTokensFeatureToggles import com.tangem.features.tokendetails.featuretoggles.TokenDetailsFeatureToggles import com.tangem.features.wallet.featuretoggles.WalletFeatureToggles import com.tangem.tap.common.analytics.AnalyticsFactory @@ -173,6 +174,9 @@ internal class TapApplication : Application(), ImageLoaderFactory { @Inject lateinit var tokenDetailsFeatureToggles: TokenDetailsFeatureToggles + @Inject + lateinit var manageTokensFeatureToggles: ManageTokensFeatureToggles + @Inject lateinit var scanCardProcessor: ScanCardProcessor @@ -291,6 +295,7 @@ internal class TapApplication : Application(), ImageLoaderFactory { walletConnectRepository = walletConnect2Repository, walletConnectSessionsRepository = walletConnectSessionsRepository, tokenDetailsFeatureToggles = tokenDetailsFeatureToggles, + manageTokensFeatureToggles = manageTokensFeatureToggles, scanCardProcessor = scanCardProcessor, appCurrencyRepository = appCurrencyRepository, walletManagersFacade = walletManagersFacade, 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 5f4abc182a..b91ae2f2a6 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 @@ -154,7 +154,18 @@ private fun fragmentFactory(screen: AppScreen): Fragment { AppScreen.ResetToFactory -> ResetCardFragment() AppScreen.AccessCodeRecovery -> AccessCodeRecoveryFragment() AppScreen.Disclaimer -> DisclaimerFragment() - AppScreen.AddTokens -> TokensListFragment() + AppScreen.ManageTokens -> { + val featureToggles = store.state.daggerGraphState.get( + getDependency = DaggerGraphState::manageTokensFeatureToggles, + ) + if (featureToggles.isRedesignedScreenEnabled) { + store.state.daggerGraphState + .get(getDependency = DaggerGraphState::manageTokensRouter) + .getEntryFragment() + } else { + TokensListFragment() + } + } AppScreen.AddCustomToken -> AddCustomTokenFragment() AppScreen.WalletDetails -> { val featureToggles = store.state.daggerGraphState.get( diff --git a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt index 12a6e857cd..5931931a3f 100644 --- a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt @@ -105,7 +105,7 @@ class HomeFragment : Fragment(), StoreSubscriber { }, onSearchTokensClick = { Analytics.send(IntroductionProcess.ButtonTokensList()) - store.dispatch(NavigationAction.NavigateTo(AppScreen.AddTokens)) + store.dispatch(NavigationAction.NavigateTo(AppScreen.ManageTokens)) store.dispatch(TokensAction.SetArgs.ReadAccess) }, ) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/MultiWalletView.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/MultiWalletView.kt index 290bd68881..37789a8792 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/MultiWalletView.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/MultiWalletView.kt @@ -106,7 +106,7 @@ class MultiWalletView : WalletView() { Analytics.send(Portfolio.ButtonManageTokens()) store.dispatch(action = TokensAction.SetArgs.ManageAccess) - store.dispatch(action = NavigationAction.NavigateTo(screen = AppScreen.AddTokens)) + store.dispatch(action = NavigationAction.NavigateTo(screen = AppScreen.ManageTokens)) } handleErrorStates(state = state, binding = binding, fragment = fragment) } 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 1b0f19c9fe..fae82469a6 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.domain.card.repository.CardSdkConfigRepository +import com.tangem.features.managetokens.navigation.ManageTokensRouter import com.tangem.features.tester.api.TesterRouter import com.tangem.features.tokendetails.navigation.TokenDetailsRouter import com.tangem.features.wallet.navigation.WalletRouter @@ -16,6 +17,7 @@ sealed interface DaggerGraphAction : Action { val walletRouter: WalletRouter, val walletConnectInteractor: WalletConnectInteractor, val tokenDetailsRouter: TokenDetailsRouter, + val manageTokensRouter: ManageTokensRouter, val cardSdkConfigRepository: CardSdkConfigRepository, ) : 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 aec162a122..1f85121328 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 @@ -18,6 +18,7 @@ object DaggerGraphReducer { walletRouter = action.walletRouter, walletConnectInteractor = action.walletConnectInteractor, tokenDetailsRouter = action.tokenDetailsRouter, + manageTokensRouter = action.manageTokensRouter, cardSdkConfigRepository = action.cardSdkConfigRepository, ) } 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 441afa259c..f032f715d0 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 @@ -11,6 +11,8 @@ import com.tangem.domain.card.repository.CardSdkConfigRepository import com.tangem.domain.tokens.repository.CurrenciesRepository import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.wallets.repository.WalletsRepository +import com.tangem.features.managetokens.featuretoggles.ManageTokensFeatureToggles +import com.tangem.features.managetokens.navigation.ManageTokensRouter import com.tangem.features.tester.api.TesterRouter import com.tangem.features.tokendetails.featuretoggles.TokenDetailsFeatureToggles import com.tangem.features.tokendetails.navigation.TokenDetailsRouter @@ -37,6 +39,8 @@ data class DaggerGraphState( val walletConnectInteractor: WalletConnectInteractor? = null, val tokenDetailsFeatureToggles: TokenDetailsFeatureToggles? = null, val tokenDetailsRouter: TokenDetailsRouter? = null, + val manageTokensFeatureToggles: ManageTokensFeatureToggles? = null, + val manageTokensRouter: ManageTokensRouter? = null, val scanCardProcessor: ScanCardProcessor? = null, val cardSdkConfigRepository: CardSdkConfigRepository? = null, val appCurrencyRepository: AppCurrencyRepository? = null, 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 25f17ea484..68ff29608d 100644 --- a/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json +++ b/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json @@ -30,5 +30,9 @@ { "name": "DARK_THEME_ENABLED", "version": "undefined" + }, + { + "name": "REDESIGNED_MANAGE_TOKENS_SCREEN_ENABLED", + "version": "undefined" } ] diff --git a/core/navigation/src/main/java/com/tangem/core/navigation/NavigationState.kt b/core/navigation/src/main/java/com/tangem/core/navigation/NavigationState.kt index 9aea608408..1e3ffc39fe 100644 --- a/core/navigation/src/main/java/com/tangem/core/navigation/NavigationState.kt +++ b/core/navigation/src/main/java/com/tangem/core/navigation/NavigationState.kt @@ -26,7 +26,7 @@ enum class AppScreen(val isDialogFragment: Boolean = false) { AppSettings, ResetToFactory, AccessCodeRecovery, - AddTokens, + ManageTokens, AddCustomToken, WalletConnectSessions, QrScan, diff --git a/features/manage-tokens/.gitignore b/features/manage-tokens/.gitignore new file mode 100644 index 0000000000..42afabfd2a --- /dev/null +++ b/features/manage-tokens/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/features/manage-tokens/api/.gitignore b/features/manage-tokens/api/.gitignore new file mode 100644 index 0000000000..42afabfd2a --- /dev/null +++ b/features/manage-tokens/api/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/features/manage-tokens/api/build.gradle.kts b/features/manage-tokens/api/build.gradle.kts new file mode 100644 index 0000000000..aa4ad2bd26 --- /dev/null +++ b/features/manage-tokens/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.managetokens.api" +} + +dependencies { + /** AndroidX */ + implementation(deps.androidx.fragment.ktx) +} \ No newline at end of file diff --git a/features/manage-tokens/api/src/main/kotlin/com/tangem/features/managetokens/featuretoggles/ManageTokensFeatureToggles.kt b/features/manage-tokens/api/src/main/kotlin/com/tangem/features/managetokens/featuretoggles/ManageTokensFeatureToggles.kt new file mode 100644 index 0000000000..e29173b5fc --- /dev/null +++ b/features/manage-tokens/api/src/main/kotlin/com/tangem/features/managetokens/featuretoggles/ManageTokensFeatureToggles.kt @@ -0,0 +1,5 @@ +package com.tangem.features.managetokens.featuretoggles + +interface ManageTokensFeatureToggles { + val isRedesignedScreenEnabled: Boolean +} \ No newline at end of file diff --git a/features/manage-tokens/api/src/main/kotlin/com/tangem/features/managetokens/navigation/ManageTokensRouter.kt b/features/manage-tokens/api/src/main/kotlin/com/tangem/features/managetokens/navigation/ManageTokensRouter.kt new file mode 100644 index 0000000000..7feba2b807 --- /dev/null +++ b/features/manage-tokens/api/src/main/kotlin/com/tangem/features/managetokens/navigation/ManageTokensRouter.kt @@ -0,0 +1,7 @@ +package com.tangem.features.managetokens.navigation + +import androidx.fragment.app.Fragment + +interface ManageTokensRouter { + fun getEntryFragment(): Fragment +} \ No newline at end of file diff --git a/features/manage-tokens/impl/.gitignore b/features/manage-tokens/impl/.gitignore new file mode 100644 index 0000000000..42afabfd2a --- /dev/null +++ b/features/manage-tokens/impl/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/features/manage-tokens/impl/build.gradle.kts b/features/manage-tokens/impl/build.gradle.kts new file mode 100644 index 0000000000..76bd921f71 --- /dev/null +++ b/features/manage-tokens/impl/build.gradle.kts @@ -0,0 +1,68 @@ +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.managetokens.impl" +} + +dependencies { + /** AndroidX */ + implementation(deps.androidx.activity.compose) + implementation(deps.material) + + /** Compose */ + implementation(deps.compose.accompanist.systemUiController) + implementation(deps.compose.coil) + implementation(deps.compose.constraintLayout) + implementation(deps.compose.foundation) + implementation(deps.compose.material) + implementation(deps.compose.material3) + implementation(deps.compose.navigation) + implementation(deps.compose.navigation.hilt) + implementation(deps.compose.paging) + implementation(deps.compose.reorderable) + implementation(deps.compose.shimmer) + implementation(deps.compose.ui) + implementation(deps.compose.ui.tooling) + + /** Other libraries */ + implementation(deps.arrow.core) + implementation(deps.jodatime) + implementation(deps.kotlin.immutable.collections) + implementation(deps.tangem.card.core) + implementation(deps.tangem.blockchain) + + /** DI */ + implementation(deps.hilt.android) + kapt(deps.hilt.kapt) + + /** Core modules */ + implementation(projects.core.featuretoggles) + implementation(projects.core.navigation) + implementation(projects.core.ui) + implementation(projects.core.utils) + + /** Domain modules */ + implementation(projects.common) + implementation(projects.domain.card) + implementation(projects.domain.demo) + implementation(projects.domain.legacy) + implementation(projects.domain.models) + implementation(projects.domain.settings) + implementation(projects.domain.tokens) + implementation(projects.domain.tokens.models) + implementation(projects.domain.txhistory) + implementation(projects.domain.txhistory.models) + implementation(projects.domain.wallets) + implementation(projects.domain.wallets.models) + implementation(projects.domain.appCurrency) + implementation(projects.domain.appCurrency.models) + + /** Feature Apis */ + implementation(projects.features.manageTokens.api) +} \ No newline at end of file diff --git a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/ManageTokensFragment.kt b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/ManageTokensFragment.kt new file mode 100644 index 0000000000..f4f7fa959b --- /dev/null +++ b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/ManageTokensFragment.kt @@ -0,0 +1,41 @@ +package com.tangem.managetokens + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.tangem.core.ui.components.SystemBarsEffect +import com.tangem.core.ui.res.TangemTheme +import com.tangem.core.ui.screen.ComposeFragment +import com.tangem.core.ui.theme.AppThemeModeHolder +import com.tangem.features.managetokens.navigation.ManageTokensRouter +import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject + +@AndroidEntryPoint +internal class ManageTokensFragment : ComposeFragment() { + + @Inject + override lateinit var appThemeModeHolder: AppThemeModeHolder + + @Inject + lateinit var manageTokensRouter: ManageTokensRouter + + // private val internalManageTokensRouter: InnerManageTokensRouter + // get() = requireNotNull(manageTokensRouter as? InnerManageTokensRouter) { + // "internalManageTokensRouter should be instance of InnerManageTokensRouter" + // } + + @Composable + override fun ScreenContent(modifier: Modifier) { + // val viewModel = hiltViewModel() + // viewModel.router = [REDACTED_EMAIL] + // + // LocalLifecycleOwner.current.lifecycle.addObserver(viewModel) + + val systemBarsColor = TangemTheme.colors.background.secondary + SystemBarsEffect { + setSystemBarsColor(systemBarsColor) + } + + // ManageTokensScreen(state = viewModel.uiState) + } +} \ No newline at end of file diff --git a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/di/ManageTokensFeatureTogglesModule.kt b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/di/ManageTokensFeatureTogglesModule.kt new file mode 100644 index 0000000000..7552eb21df --- /dev/null +++ b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/di/ManageTokensFeatureTogglesModule.kt @@ -0,0 +1,21 @@ +package com.tangem.managetokens.di + +import com.tangem.core.featuretoggle.manager.FeatureTogglesManager +import com.tangem.features.managetokens.featuretoggles.ManageTokensFeatureToggles +import com.tangem.managetokens.featuretoggles.DefaultManageTokensFeatureToggles +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 ManageTokensFeatureTogglesModule { + + @Provides + @Singleton + fun provideWalletFeatureToggles(featureTogglesManager: FeatureTogglesManager): ManageTokensFeatureToggles { + return DefaultManageTokensFeatureToggles(featureTogglesManager = featureTogglesManager) + } +} \ No newline at end of file diff --git a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/di/ManageTokensRouterModule.kt b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/di/ManageTokensRouterModule.kt new file mode 100644 index 0000000000..73783601c0 --- /dev/null +++ b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/di/ManageTokensRouterModule.kt @@ -0,0 +1,20 @@ +package com.tangem.managetokens.di + +import com.tangem.features.managetokens.navigation.ManageTokensRouter +import com.tangem.managetokens.presentation.router.DefaultManageTokensRouter +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 ManageTokensRouterModule { + + @Provides + @ActivityScoped + fun provideManageTokensRouter(): ManageTokensRouter { + return DefaultManageTokensRouter() + } +} \ No newline at end of file diff --git a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/featuretoggles/DefaultManageTokensFeatureToggles.kt b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/featuretoggles/DefaultManageTokensFeatureToggles.kt new file mode 100644 index 0000000000..967a54e950 --- /dev/null +++ b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/featuretoggles/DefaultManageTokensFeatureToggles.kt @@ -0,0 +1,11 @@ +package com.tangem.managetokens.featuretoggles + +import com.tangem.core.featuretoggle.manager.FeatureTogglesManager +import com.tangem.features.managetokens.featuretoggles.ManageTokensFeatureToggles + +internal class DefaultManageTokensFeatureToggles( + private val featureTogglesManager: FeatureTogglesManager, +) : ManageTokensFeatureToggles { + override val isRedesignedScreenEnabled: Boolean + get() = featureTogglesManager.isFeatureEnabled(name = "REDESIGNED_MANAGE_TOKENS_SCREEN_ENABLED") +} \ No newline at end of file diff --git a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/router/DefaultManageTokensRouter.kt b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/router/DefaultManageTokensRouter.kt new file mode 100644 index 0000000000..593da2a10a --- /dev/null +++ b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/router/DefaultManageTokensRouter.kt @@ -0,0 +1,9 @@ +package com.tangem.managetokens.presentation.router + +import androidx.fragment.app.Fragment +import com.tangem.features.managetokens.navigation.ManageTokensRouter +import com.tangem.managetokens.ManageTokensFragment + +internal class DefaultManageTokensRouter : ManageTokensRouter { + override fun getEntryFragment(): Fragment = ManageTokensFragment() +} \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt index cf0a846de9..7298d0c172 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt @@ -135,7 +135,7 @@ internal class DefaultWalletRouter(private val reduxNavController: ReduxNavContr override fun isWalletLastScreen(): Boolean = reduxNavController.getBackStack().lastOrNull() == AppScreen.Wallet override fun openManageTokensScreen() { - reduxNavController.navigate(action = NavigationAction.NavigateTo(AppScreen.AddTokens)) + reduxNavController.navigate(action = NavigationAction.NavigateTo(AppScreen.ManageTokens)) } private companion object { diff --git a/settings.gradle.kts b/settings.gradle.kts index 174e29f0e4..4a46fb5bad 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -93,6 +93,9 @@ include(":features:learn2earn:api") include(":features:learn2earn:impl") include(":features:send:api") + +include(":features:manage-tokens:api") +include(":features:manage-tokens:impl") // endregion Feature modules // region Domain modules