diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 85f77c58ce..9d6381ca2f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -48,11 +48,14 @@ dependencies { implementation(deps.compose.constraintLayout) implementation(deps.compose.material) implementation(deps.compose.animation) + implementation(deps.compose.coil) + implementation(deps.compose.constraintLayout) implementation(deps.compose.foundation) + implementation(deps.compose.material) + implementation(deps.compose.navigation.hilt) + implementation(deps.compose.shimmer) implementation(deps.compose.ui) implementation(deps.compose.ui.tooling) - implementation(deps.compose.coil) - implementation(deps.compose.shimmer) /** Firebase libraries */ implementation(platform(deps.firebase.bom)) diff --git a/app/src/main/java/com/tangem/tap/TapApplication.kt b/app/src/main/java/com/tangem/tap/TapApplication.kt index de10af7d92..87f540fc6b 100644 --- a/app/src/main/java/com/tangem/tap/TapApplication.kt +++ b/app/src/main/java/com/tangem/tap/TapApplication.kt @@ -49,6 +49,7 @@ import com.tangem.tap.domain.walletStores.repository.WalletManagersRepository import com.tangem.tap.domain.walletStores.repository.WalletStoresRepository import com.tangem.tap.domain.walletStores.repository.di.provideDefaultImplementation import com.tangem.tap.domain.walletconnect.WalletConnectRepository +import com.tangem.tap.features.tokens.api.featuretoggles.TokensListFeatureToggles import com.tangem.tap.persistence.PreferencesStorage import com.tangem.tap.proxy.AppStateHolder import com.tangem.tap.proxy.redux.DaggerGraphAction @@ -126,6 +127,9 @@ class TapApplication : Application(), ImageLoaderFactory { @Inject lateinit var networkConnectionManager: NetworkConnectionManager + @Inject + lateinit var tokensListFeatureToggles: TokensListFeatureToggles + override fun onCreate() { super.onCreate() @@ -174,6 +178,7 @@ class TapApplication : Application(), ImageLoaderFactory { action = DaggerGraphAction.SetApplicationDependencies( assetReader = assetReader, networkConnectionManager = networkConnectionManager, + tokensListFeatureToggles = tokensListFeatureToggles, ), ) 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 0755764b78..f6e77e9af9 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 @@ -27,10 +27,13 @@ import com.tangem.tap.features.send.ui.SendFragment import com.tangem.tap.features.shop.ui.ShopFragment import com.tangem.tap.features.tokens.addCustomToken.AddCustomTokenFragment import com.tangem.tap.features.tokens.presentation.AddTokensFragment +import com.tangem.tap.features.tokens.presentation.TokensListFragment import com.tangem.tap.features.wallet.ui.WalletDetailsFragment import com.tangem.tap.features.wallet.ui.WalletFragment import com.tangem.tap.features.walletSelector.ui.WalletSelectorBottomSheetFragment import com.tangem.tap.features.welcome.ui.WelcomeFragment +import com.tangem.tap.proxy.redux.DaggerGraphState +import com.tangem.tap.store import com.tangem.wallet.R import timber.log.Timber @@ -107,7 +110,12 @@ private fun fragmentFactory(screen: AppScreen): Fragment { AppScreen.AppSettings -> AppSettingsFragment() AppScreen.ResetToFactory -> ResetCardFragment() AppScreen.Disclaimer -> DisclaimerFragment() - AppScreen.AddTokens -> AddTokensFragment() + AppScreen.AddTokens -> { + val featureToggles = store.state.daggerGraphState.get( + getDependency = DaggerGraphState::tokensListFeatureToggles, + ) + if (featureToggles.isRedesignedScreenEnabled) TokensListFragment() else AddTokensFragment() + } AppScreen.AddCustomToken -> AddCustomTokenFragment() AppScreen.WalletDetails -> WalletDetailsFragment() AppScreen.WalletConnectSessions -> WalletConnectFragment() diff --git a/app/src/main/java/com/tangem/tap/features/tokens/api/featuretoggles/TokensListFeatureToggles.kt b/app/src/main/java/com/tangem/tap/features/tokens/api/featuretoggles/TokensListFeatureToggles.kt new file mode 100644 index 0000000000..286eb6d0e0 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/tokens/api/featuretoggles/TokensListFeatureToggles.kt @@ -0,0 +1,12 @@ +package com.tangem.tap.features.tokens.api.featuretoggles + +/** + * TokensList feature toggles + * +[REDACTED_AUTHOR] + */ +interface TokensListFeatureToggles { + + /** Availability of redesigned screen (internal feature) */ + val isRedesignedScreenEnabled: Boolean +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/tokens/di/TokensListFeatureTogglesModule.kt b/app/src/main/java/com/tangem/tap/features/tokens/di/TokensListFeatureTogglesModule.kt new file mode 100644 index 0000000000..be1a69cc5b --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/tokens/di/TokensListFeatureTogglesModule.kt @@ -0,0 +1,24 @@ +package com.tangem.tap.features.tokens.di + +import com.tangem.core.featuretoggle.manager.FeatureTogglesManager +import com.tangem.tap.features.tokens.api.featuretoggles.TokensListFeatureToggles +import com.tangem.tap.features.tokens.featuretoggles.DefaultTokensListFeatureToggles +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +/** +[REDACTED_AUTHOR] + */ +@Module +@InstallIn(SingletonComponent::class) +internal object TokensListFeatureTogglesModule { + + @Provides + @Singleton + fun providesTokensListFeatureToggles(featureTogglesManager: FeatureTogglesManager): TokensListFeatureToggles { + return DefaultTokensListFeatureToggles(featureTogglesManager) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/tokens/featuretoggles/DefaultTokensListFeatureToggles.kt b/app/src/main/java/com/tangem/tap/features/tokens/featuretoggles/DefaultTokensListFeatureToggles.kt new file mode 100644 index 0000000000..eedb10b4a9 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/tokens/featuretoggles/DefaultTokensListFeatureToggles.kt @@ -0,0 +1,19 @@ +package com.tangem.tap.features.tokens.featuretoggles + +import com.tangem.core.featuretoggle.manager.FeatureTogglesManager +import com.tangem.tap.features.tokens.api.featuretoggles.TokensListFeatureToggles + +/** + * Default implementation of TokensList feature toggles + * + * @property featureTogglesManager manager for getting information about the availability of feature toggles + * +[REDACTED_AUTHOR] + */ +internal class DefaultTokensListFeatureToggles( + private val featureTogglesManager: FeatureTogglesManager, +) : TokensListFeatureToggles { + + override val isRedesignedScreenEnabled: Boolean + get() = featureTogglesManager.isFeatureEnabled(name = "REDESIGNED_TOKEN_LIST_SCREEN_ENABLED") +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/tokens/presentation/TokensListFragment.kt b/app/src/main/java/com/tangem/tap/features/tokens/presentation/TokensListFragment.kt new file mode 100644 index 0000000000..85bb563548 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/tokens/presentation/TokensListFragment.kt @@ -0,0 +1,49 @@ +package com.tangem.tap.features.tokens.presentation + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.compose.ui.platform.ComposeView +import androidx.core.view.WindowCompat +import androidx.fragment.app.Fragment +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.transition.TransitionInflater +import com.tangem.core.ui.res.TangemTheme +import com.tangem.tap.features.tokens.presentation.ui.AddTokensScreen +import com.tangem.tap.features.tokens.presentation.viewmodels.AddTokensViewModel +import com.tangem.wallet.R +import dagger.hilt.android.AndroidEntryPoint + +/** + * Fragment with list of tokens + * +[REDACTED_AUTHOR] + */ +@AndroidEntryPoint +internal class TokensListFragment : Fragment() { + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + activity?.window?.let { WindowCompat.setDecorFitsSystemWindows(it, true) } + + with(TransitionInflater.from(requireContext())) { + enterTransition = inflateTransition(R.transition.fade) + exitTransition = inflateTransition(R.transition.fade) + } + + return ComposeView(inflater.context).apply { + setContent { + isTransitionGroup = true + + val viewModel = hiltViewModel().apply { + // TODO("[REDACTED_TASK_KEY] subscribe on Redux events") + // subscribeOnReduxEvents(lifecycle = LocalLifecycleOwner.current.lifecycle) + } + + TangemTheme { + AddTokensScreen(stateHolder = viewModel.uiState) + } + } + } + } +} \ No newline at end of file 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 cd392ae831..57cdad3cf3 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 @@ -3,6 +3,7 @@ package com.tangem.tap.proxy.redux import com.tangem.datasource.asset.AssetReader import com.tangem.datasource.connection.NetworkConnectionManager import com.tangem.features.tester.api.TesterRouter +import com.tangem.tap.features.tokens.api.featuretoggles.TokensListFeatureToggles import org.rekotlin.Action sealed interface DaggerGraphAction : Action { @@ -10,6 +11,7 @@ sealed interface DaggerGraphAction : Action { data class SetApplicationDependencies( val assetReader: AssetReader, val networkConnectionManager: NetworkConnectionManager, + val tokensListFeatureToggles: TokensListFeatureToggles, ) : DaggerGraphAction data class SetActivityDependencies(val testerRouter: TesterRouter) : DaggerGraphAction 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 34564599ac..65cfee1cf5 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 @@ -15,6 +15,7 @@ object DaggerGraphReducer { is DaggerGraphAction.SetApplicationDependencies -> state.daggerGraphState.copy( assetReader = action.assetReader, networkConnectionManager = action.networkConnectionManager, + tokensListFeatureToggles = action.tokensListFeatureToggles, ) is DaggerGraphAction.SetActivityDependencies -> state.daggerGraphState.copy( testerRouter = action.testerRouter, 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 800182a67c..792009c602 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 @@ -3,12 +3,14 @@ package com.tangem.tap.proxy.redux import com.tangem.datasource.asset.AssetReader import com.tangem.datasource.connection.NetworkConnectionManager import com.tangem.features.tester.api.TesterRouter +import com.tangem.tap.features.tokens.api.featuretoggles.TokensListFeatureToggles import org.rekotlin.StateType data class DaggerGraphState( val assetReader: AssetReader? = null, val testerRouter: TesterRouter? = null, val networkConnectionManager: NetworkConnectionManager? = null, + val tokensListFeatureToggles: TokensListFeatureToggles? = 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 74e4d91915..b7661838a4 100644 --- a/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json +++ b/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json @@ -2,5 +2,9 @@ { "name": "OPTIMISM_SWAP_FEATURE_ENABLED", "version": "4.3.1" + }, + { + "name": "REDESIGNED_TOKEN_LIST_SCREEN_ENABLED", + "version": "4.5.0" } ] \ No newline at end of file