From c81ce487a2158fd7dd99aef1178b2237747b6ef5 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 18 Oct 2023 18:47:15 +0300 Subject: [PATCH] Updated on 2026-08-14 --- app/build.gradle.kts | 1 + .../main/java/com/tangem/tap/MainActivity.kt | 5 + .../java/com/tangem/tap/TapApplication.kt | 5 + .../tap/common/extensions/Navigation.kt | 23 +++-- .../tap/features/send/ui/SendViewModel.kt | 2 +- .../middlewares/TradeCryptoMiddleware.kt | 2 +- .../tap/proxy/redux/DaggerGraphAction.kt | 2 + .../tap/proxy/redux/DaggerGraphReducer.kt | 1 + .../tap/proxy/redux/DaggerGraphState.kt | 4 + .../configs/feature_toggles_config.json | 4 + .../tangem/core/navigation/NavigationState.kt | 2 +- core/res/src/main/res/values/strings.xml | 1 + .../TangemBottomSheetDraggableHeader.kt | 5 +- .../com/tangem/core/ui/res/TangemColors.kt | 1 + .../com/tangem/core/ui/res/TangemDimens.kt | 2 + .../com/tangem/core/ui/res/TangemTheme.kt | 7 +- .../api/featuretoggles/SendFeatureToggles.kt | 10 ++ .../send/{ => api}/navigation/SendRouter.kt | 2 +- features/send/impl/.gitignore | 1 + features/send/impl/build.gradle.kts | 40 ++++++++ .../send/impl/di/SendFeatureTogglesModule.kt | 24 +++++ .../features/send/impl/di/SendRouterModule.kt | 23 +++++ .../DefaultSendFeatureToggles.kt | 16 ++++ .../send/impl/navigation/DefaultSendRouter.kt | 9 ++ .../send/impl/presentation/SendFragment.kt | 41 ++++++++ .../send/ui/SendBottomSheetConfig.kt | 7 ++ .../send/ui/SendNavigationButtons.kt | 96 +++++++++++++++++++ .../impl/presentation/send/ui/SendScreen.kt | 52 ++++++++++ .../impl/presentation/send/ui/SendStates.kt | 34 +++++++ settings.gradle.kts | 1 + 30 files changed, 403 insertions(+), 20 deletions(-) create mode 100644 features/send/api/src/main/kotlin/com/tangem/features/send/api/featuretoggles/SendFeatureToggles.kt rename features/send/api/src/main/kotlin/com/tangem/features/send/{ => api}/navigation/SendRouter.kt (80%) create mode 100644 features/send/impl/.gitignore create mode 100644 features/send/impl/build.gradle.kts create mode 100644 features/send/impl/src/main/java/com/tangem/features/send/impl/di/SendFeatureTogglesModule.kt create mode 100644 features/send/impl/src/main/java/com/tangem/features/send/impl/di/SendRouterModule.kt create mode 100644 features/send/impl/src/main/java/com/tangem/features/send/impl/featuretoggles/DefaultSendFeatureToggles.kt create mode 100644 features/send/impl/src/main/java/com/tangem/features/send/impl/navigation/DefaultSendRouter.kt create mode 100644 features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/SendFragment.kt create mode 100644 features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/send/ui/SendBottomSheetConfig.kt create mode 100644 features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/send/ui/SendNavigationButtons.kt create mode 100644 features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/send/ui/SendScreen.kt create mode 100644 features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/send/ui/SendStates.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 18f2560bb9..d8cf7443af 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -83,6 +83,7 @@ dependencies { implementation(projects.features.send.api) implementation(projects.features.manageTokens.api) implementation(projects.features.manageTokens.impl) + implementation(projects.features.send.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 58f0388211..8beeb3858c 100644 --- a/app/src/main/java/com/tangem/tap/MainActivity.kt +++ b/app/src/main/java/com/tangem/tap/MainActivity.kt @@ -30,6 +30,7 @@ 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.send.api.navigation.SendRouter import com.tangem.features.tester.api.TesterRouter import com.tangem.features.tokendetails.navigation.TokenDetailsRouter import com.tangem.features.wallet.navigation.WalletRouter @@ -121,6 +122,9 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac @Inject lateinit var walletConnectInteractor: WalletConnectInteractor + @Inject + lateinit var sendRouter: SendRouter + private lateinit var appThemeModeFlow: SharedFlow // TODO: fixme: inject through DI @@ -169,6 +173,7 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac tokenDetailsRouter = tokenDetailsRouter, manageTokensRouter = manageTokensRouter, cardSdkConfigRepository = cardSdkConfigRepository, + sendRouter = sendRouter, ), ) } diff --git a/app/src/main/java/com/tangem/tap/TapApplication.kt b/app/src/main/java/com/tangem/tap/TapApplication.kt index 76a00f2be2..c585fe7012 100644 --- a/app/src/main/java/com/tangem/tap/TapApplication.kt +++ b/app/src/main/java/com/tangem/tap/TapApplication.kt @@ -38,6 +38,7 @@ 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.send.api.featuretoggles.SendFeatureToggles import com.tangem.features.wallet.featuretoggles.WalletFeatureToggles import com.tangem.tap.common.analytics.AnalyticsFactory import com.tangem.tap.common.analytics.api.AnalyticsHandlerBuilder @@ -216,6 +217,9 @@ internal class TapApplication : Application(), ImageLoaderFactory { @Inject lateinit var walletsRepository: WalletsRepository + + @Inject + lateinit var sendFeatureToggles: SendFeatureToggles // endregion Injected override fun onCreate() { @@ -307,6 +311,7 @@ internal class TapApplication : Application(), ImageLoaderFactory { balanceHidingRepository = balanceHidingRepository, detailsFeatureToggles = detailsFeatureToggles, walletsRepository = walletsRepository, + sendFeatureToggles = sendFeatureToggles, ), ), ) 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 3cc8eb7bf5..126ecb0d60 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 @@ -59,12 +59,8 @@ fun FragmentActivity.openFragment( } } - if (screen.isDialogFragment) { - val dialogFragment = requireNotNull(fragment as? DialogFragment) { - "If screen.isDialogFragment == true then fragment must be a DialogFragment" - } - - dialogFragment.showAllowingStateLoss( + if (screen.isDialogFragment && fragment is DialogFragment) { + fragment.showAllowingStateLoss( fragmentManager = supportFragmentManager, baseTransaction = transaction, tag = screen.name, @@ -125,7 +121,7 @@ fun FragmentActivity.getPreviousScreen(): AppScreen? { return tag?.let { AppScreen.valueOf(tag) } } -@Suppress("ComplexMethod") +@Suppress("ComplexMethod", "LongMethod") private fun fragmentFactory(screen: AppScreen): Fragment { return when (screen) { AppScreen.Home -> HomeFragment() @@ -146,7 +142,18 @@ private fun fragmentFactory(screen: AppScreen): Fragment { WalletFragment() } } - AppScreen.Send -> SendFragment() + AppScreen.Send -> { + val featureToggles = store.state.daggerGraphState.get( + getDependency = DaggerGraphState::sendFeatureToggles, + ) + if (featureToggles.isRedesignedSendEnabled) { + store.state.daggerGraphState + .get(getDependency = DaggerGraphState::sendRouter) + .getEntryFragment() + } else { + SendFragment() + } + } AppScreen.Details -> DetailsFragment() AppScreen.DetailsSecurity -> SecurityModeFragment() AppScreen.CardSettings -> CardSettingsFragment() diff --git a/app/src/main/java/com/tangem/tap/features/send/ui/SendViewModel.kt b/app/src/main/java/com/tangem/tap/features/send/ui/SendViewModel.kt index 806cb70f74..1e49f25fe7 100644 --- a/app/src/main/java/com/tangem/tap/features/send/ui/SendViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/send/ui/SendViewModel.kt @@ -9,7 +9,7 @@ import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.Network import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.usecase.GetSelectedWalletSyncUseCase -import com.tangem.features.send.navigation.SendRouter +import com.tangem.features.send.api.navigation.SendRouter import com.tangem.tap.di.DelayedWork import com.tangem.tap.features.send.redux.AmountAction import com.tangem.tap.proxy.AppStateHolder diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt index 666f1ac84e..6e5f3a779f 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt @@ -15,7 +15,7 @@ import com.tangem.domain.tokens.legacy.TradeCryptoAction import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.Network import com.tangem.feature.swap.presentation.SwapFragment -import com.tangem.features.send.navigation.SendRouter +import com.tangem.features.send.api.navigation.SendRouter import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Token import com.tangem.tap.common.apptheme.MutableAppThemeModeHolder 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 fae82469a6..3392c82127 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.domain.card.ScanCardUseCase import com.tangem.domain.card.repository.CardSdkConfigRepository import com.tangem.features.managetokens.navigation.ManageTokensRouter +import com.tangem.features.send.api.navigation.SendRouter import com.tangem.features.tester.api.TesterRouter import com.tangem.features.tokendetails.navigation.TokenDetailsRouter import com.tangem.features.wallet.navigation.WalletRouter @@ -19,5 +20,6 @@ sealed interface DaggerGraphAction : Action { val tokenDetailsRouter: TokenDetailsRouter, val manageTokensRouter: ManageTokensRouter, val cardSdkConfigRepository: CardSdkConfigRepository, + val sendRouter: SendRouter, ) : 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 1f85121328..df08899bf0 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 @@ -20,6 +20,7 @@ object DaggerGraphReducer { tokenDetailsRouter = action.tokenDetailsRouter, manageTokensRouter = action.manageTokensRouter, cardSdkConfigRepository = action.cardSdkConfigRepository, + sendRouter = action.sendRouter, ) } } 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 ef2711a78b..e7a479dfa0 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 @@ -14,6 +14,8 @@ 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.send.api.featuretoggles.SendFeatureToggles +import com.tangem.features.send.api.navigation.SendRouter import com.tangem.features.tester.api.TesterRouter import com.tangem.features.tokendetails.navigation.TokenDetailsRouter import com.tangem.features.wallet.featuretoggles.WalletFeatureToggles @@ -50,6 +52,8 @@ data class DaggerGraphState( val detailsFeatureToggles: DetailsFeatureToggles? = null, val walletsRepository: WalletsRepository? = null, val networksRepository: NetworksRepository? = null, + val sendFeatureToggles: SendFeatureToggles? = null, + val sendRouter: SendRouter? = null, // FIXME: It is used only for TokensList screen. Remove after refactoring of TokensList val currenciesRepository: CurrenciesRepository? = 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 7cc58bfba5..0a8d0acd66 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": "REDESIGNED_MANAGE_TOKENS_SCREEN_ENABLED", "version": "undefined" + }, + { + "name": "REDESIGNED_SEND_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 1e3ffc39fe..6685b69953 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 @@ -19,7 +19,7 @@ enum class AppScreen(val isDialogFragment: Boolean = false) { OnboardingOther, Wallet, WalletDetails, - Send, + Send(isDialogFragment = true), Details, DetailsSecurity, CardSettings, diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index d1ef9b32da..456401a4a4 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -114,6 +114,7 @@ Submit Success Swap + Next terms and conditions Transaction failed Transactions diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/TangemBottomSheetDraggableHeader.kt b/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/TangemBottomSheetDraggableHeader.kt index 5b1e13f57a..0d2cbe9d4e 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/TangemBottomSheetDraggableHeader.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/TangemBottomSheetDraggableHeader.kt @@ -8,14 +8,15 @@ import androidx.compose.foundation.layout.size import androidx.compose.material.Surface import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import com.tangem.core.ui.res.TangemTheme @Composable -fun TangemBottomSheetDraggableHeader() { +fun TangemBottomSheetDraggableHeader(color: Color = TangemTheme.colors.background.primary) { Surface( modifier = Modifier .height(TangemTheme.dimens.size20), - color = TangemTheme.colors.background.primary, + color = color, ) { Box( modifier = Modifier diff --git a/core/ui/src/main/java/com/tangem/core/ui/res/TangemColors.kt b/core/ui/src/main/java/com/tangem/core/ui/res/TangemColors.kt index e814d46e20..6ef12bbd67 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/res/TangemColors.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/res/TangemColors.kt @@ -170,6 +170,7 @@ class TangemColors internal constructor( plain = other.plain action = other.action fade = other.fade + tertiary = other.tertiary } } diff --git a/core/ui/src/main/java/com/tangem/core/ui/res/TangemDimens.kt b/core/ui/src/main/java/com/tangem/core/ui/res/TangemDimens.kt index bd14bc7fab..eedda4c028 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/res/TangemDimens.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/res/TangemDimens.kt @@ -32,6 +32,7 @@ data class TangemDimens internal constructor( val radius16: Dp = 16.dp, val radius18: Dp = 18.dp, val radius24: Dp = 24.dp, + val radius26: Dp = 26.dp, val radius28: Dp = 28.dp, val radius36: Dp = 36.dp, // endregion Radius @@ -88,6 +89,7 @@ data class TangemDimens internal constructor( // region Spacing val spacing0: Dp = 0.dp, val spacing0_5: Dp = 0.5.dp, + val spacing1: Dp = 1.dp, val spacing2: Dp = 2.dp, val spacing3: Dp = 3.dp, val spacing4: Dp = 4.dp, diff --git a/core/ui/src/main/java/com/tangem/core/ui/res/TangemTheme.kt b/core/ui/src/main/java/com/tangem/core/ui/res/TangemTheme.kt index 92a10122db..db286e6d51 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/res/TangemTheme.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/res/TangemTheme.kt @@ -3,12 +3,7 @@ package com.tangem.core.ui.res import androidx.compose.material.Colors import androidx.compose.material.MaterialTheme import androidx.compose.material.ProvideTextStyle -import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.ReadOnlyComposable -import androidx.compose.runtime.Stable -import androidx.compose.runtime.remember -import androidx.compose.runtime.staticCompositionLocalOf +import androidx.compose.runtime.* // TODO: use isSystemInDarkTheme() for automatic color detection internal const val IS_SYSTEM_IN_DARK_THEME: Boolean = false diff --git a/features/send/api/src/main/kotlin/com/tangem/features/send/api/featuretoggles/SendFeatureToggles.kt b/features/send/api/src/main/kotlin/com/tangem/features/send/api/featuretoggles/SendFeatureToggles.kt new file mode 100644 index 0000000000..d80f08cf56 --- /dev/null +++ b/features/send/api/src/main/kotlin/com/tangem/features/send/api/featuretoggles/SendFeatureToggles.kt @@ -0,0 +1,10 @@ +package com.tangem.features.send.api.featuretoggles + +/** + * Send feature toggles + */ +interface SendFeatureToggles { + + /** Availability of redesigned send screen */ + val isRedesignedSendEnabled: Boolean +} \ No newline at end of file diff --git a/features/send/api/src/main/kotlin/com/tangem/features/send/navigation/SendRouter.kt b/features/send/api/src/main/kotlin/com/tangem/features/send/api/navigation/SendRouter.kt similarity index 80% rename from features/send/api/src/main/kotlin/com/tangem/features/send/navigation/SendRouter.kt rename to features/send/api/src/main/kotlin/com/tangem/features/send/api/navigation/SendRouter.kt index 0d0676b23b..692027bfe8 100644 --- a/features/send/api/src/main/kotlin/com/tangem/features/send/navigation/SendRouter.kt +++ b/features/send/api/src/main/kotlin/com/tangem/features/send/api/navigation/SendRouter.kt @@ -1,4 +1,4 @@ -package com.tangem.features.send.navigation +package com.tangem.features.send.api.navigation import androidx.fragment.app.Fragment diff --git a/features/send/impl/.gitignore b/features/send/impl/.gitignore new file mode 100644 index 0000000000..42afabfd2a --- /dev/null +++ b/features/send/impl/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/features/send/impl/build.gradle.kts b/features/send/impl/build.gradle.kts new file mode 100644 index 0000000000..3c6f6bd7f7 --- /dev/null +++ b/features/send/impl/build.gradle.kts @@ -0,0 +1,40 @@ +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.send.impl" +} + +dependencies { + /** AndroidX */ + implementation(deps.androidx.fragment.ktx) + implementation(deps.androidx.appCompat) + implementation(deps.material) + + /** Compose */ + implementation(deps.compose.accompanist.systemUiController) + implementation(deps.compose.material3) + implementation(deps.compose.foundation) + implementation(deps.compose.ui) + implementation(deps.compose.ui.tooling) + implementation(deps.compose.navigation) + + /** Core modules */ + implementation(projects.core.featuretoggles) + implementation(projects.core.ui) + + /** Domain modules */ + implementation(projects.domain.tokens.models) + + /** Feature modules */ + implementation(projects.features.send.api) + + /** DI */ + implementation(deps.hilt.android) + kapt(deps.hilt.kapt) +} \ No newline at end of file diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/di/SendFeatureTogglesModule.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/di/SendFeatureTogglesModule.kt new file mode 100644 index 0000000000..6b1465762c --- /dev/null +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/di/SendFeatureTogglesModule.kt @@ -0,0 +1,24 @@ +package com.tangem.features.send.impl.di + +import com.tangem.core.featuretoggle.manager.FeatureTogglesManager +import com.tangem.features.send.api.featuretoggles.SendFeatureToggles +import com.tangem.features.send.impl.featuretoggles.DefaultSendFeatureToggles +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +/** + * DI module provides implementation of [SendFeatureToggles] + */ +@Module +@InstallIn(SingletonComponent::class) +internal object SendFeatureTogglesModule { + + @Provides + @Singleton + fun provideSendFeatureToggles(featureTogglesManager: FeatureTogglesManager): SendFeatureToggles { + return DefaultSendFeatureToggles(featureTogglesManager = featureTogglesManager) + } +} \ No newline at end of file diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/di/SendRouterModule.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/di/SendRouterModule.kt new file mode 100644 index 0000000000..8bf19609d8 --- /dev/null +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/di/SendRouterModule.kt @@ -0,0 +1,23 @@ +package com.tangem.features.send.impl.di + +import com.tangem.features.send.api.navigation.SendRouter +import com.tangem.features.send.impl.navigation.DefaultSendRouter +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.components.ActivityComponent +import dagger.hilt.android.scopes.ActivityScoped + +/** + * DI module provides implementation of [SendRouter] + */ +@Module +@InstallIn(ActivityComponent::class) +internal object SendRouterModule { + + @Provides + @ActivityScoped + fun provideSendRouter(): SendRouter { + return DefaultSendRouter() + } +} \ No newline at end of file diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/featuretoggles/DefaultSendFeatureToggles.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/featuretoggles/DefaultSendFeatureToggles.kt new file mode 100644 index 0000000000..71f11c480d --- /dev/null +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/featuretoggles/DefaultSendFeatureToggles.kt @@ -0,0 +1,16 @@ +package com.tangem.features.send.impl.featuretoggles + +import com.tangem.core.featuretoggle.manager.FeatureTogglesManager +import com.tangem.features.send.api.featuretoggles.SendFeatureToggles + +/** + * Default implementation of Send feature toggles + * + * @property featureTogglesManager manager for getting information about the availability of feature toggles + */ +internal class DefaultSendFeatureToggles( + private val featureTogglesManager: FeatureTogglesManager, +) : SendFeatureToggles { + override val isRedesignedSendEnabled: Boolean + get() = featureTogglesManager.isFeatureEnabled(name = "REDESIGNED_SEND_SCREEN_ENABLED") +} \ No newline at end of file diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/navigation/DefaultSendRouter.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/navigation/DefaultSendRouter.kt new file mode 100644 index 0000000000..4db1a5a674 --- /dev/null +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/navigation/DefaultSendRouter.kt @@ -0,0 +1,9 @@ +package com.tangem.features.send.impl.navigation + +import androidx.fragment.app.Fragment +import com.tangem.features.send.api.navigation.SendRouter +import com.tangem.features.send.impl.presentation.SendFragment + +internal class DefaultSendRouter : SendRouter { + override fun getEntryFragment(): Fragment = SendFragment.create() +} \ No newline at end of file diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/SendFragment.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/SendFragment.kt new file mode 100644 index 0000000000..334bdc5aeb --- /dev/null +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/SendFragment.kt @@ -0,0 +1,41 @@ +package com.tangem.features.send.impl.presentation + +import androidx.activity.compose.BackHandler +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import com.tangem.core.ui.components.SystemBarsEffect +import com.tangem.core.ui.screen.ComposeBottomSheetFragment +import com.tangem.core.ui.theme.AppThemeModeHolder +import com.tangem.features.send.impl.presentation.send.ui.SendScreen +import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject + +/** + * Send fragment + */ +@AndroidEntryPoint +internal class SendFragment : ComposeBottomSheetFragment() { + + @Inject + override lateinit var appThemeModeHolder: AppThemeModeHolder + + override val expandedHeightFraction: Float = 1f + + @Composable + override fun ScreenContent(modifier: Modifier) { + SystemBarsEffect { + setSystemBarsColor(color = Color.Transparent) + } + BackHandler { + dismiss() + } + SendScreen() + } + + companion object { + + /** Create send fragment instance */ + fun create(): SendFragment = SendFragment() + } +} \ No newline at end of file diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/send/ui/SendBottomSheetConfig.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/send/ui/SendBottomSheetConfig.kt new file mode 100644 index 0000000000..73f5797f7b --- /dev/null +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/send/ui/SendBottomSheetConfig.kt @@ -0,0 +1,7 @@ +package com.tangem.features.send.impl.presentation.send.ui + +import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent + +data class SendBottomSheetConfig( + val currentState: SendStates, +) : TangemBottomSheetConfigContent \ No newline at end of file diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/send/ui/SendNavigationButtons.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/send/ui/SendNavigationButtons.kt new file mode 100644 index 0000000000..7630c89501 --- /dev/null +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/send/ui/SendNavigationButtons.kt @@ -0,0 +1,96 @@ +package com.tangem.features.send.impl.presentation.send.ui + +import androidx.compose.animation.AnimatedContent +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Icon +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import com.tangem.core.ui.R +import com.tangem.core.ui.components.PrimaryButton +import com.tangem.core.ui.components.PrimaryButtonIconEnd +import com.tangem.core.ui.res.TangemTheme + +@Composable +internal fun SendNavigationButtons(currentState: SendStates) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(bottom = TangemTheme.dimens.spacing12), + ) { + SendSecondaryNavigationButton(currentState) + SendPrimaryNavigationButton( + currentState, + modifier = Modifier + .weight(1f) + .padding(horizontal = TangemTheme.dimens.spacing16), + ) + } +} + +@Composable +private fun SendSecondaryNavigationButton(currentState: SendStates) { + AnimatedVisibility( + visible = currentState == SendStates.Recipient || currentState == SendStates.Fee, + ) { + Icon( + modifier = Modifier + .padding(start = TangemTheme.dimens.spacing16) + .clip(RoundedCornerShape(TangemTheme.dimens.radius16)) + .background(TangemTheme.colors.button.secondary) + .clickable { + // todo add prev click + } + .padding(TangemTheme.dimens.spacing12), + painter = painterResource(R.drawable.ic_back_24), + contentDescription = null, + ) + } +} + +@Composable +private fun SendPrimaryNavigationButton(currentState: SendStates, modifier: Modifier = Modifier) { + val buttonTextId = when (currentState) { + SendStates.Amount, + SendStates.Recipient, + SendStates.Fee, + -> R.string.common_next + SendStates.Filled -> R.string.common_send + SendStates.Done -> R.string.common_close + } + AnimatedContent( + targetState = buttonTextId, + label = "Update send screen state", + modifier = modifier, + ) { textId -> + when (currentState) { + SendStates.Amount, + SendStates.Recipient, + SendStates.Fee, + SendStates.Done, + -> PrimaryButton( + text = stringResource(textId), + onClick = { + // todo add next click + }, + ) + SendStates.Filled -> { + PrimaryButtonIconEnd( + text = stringResource(textId), + iconResId = R.drawable.ic_tangem_24, + onClick = { + // todo add next click + }, + ) + } + } + } +} \ No newline at end of file diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/send/ui/SendScreen.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/send/ui/SendScreen.kt new file mode 100644 index 0000000000..3ec40b3169 --- /dev/null +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/send/ui/SendScreen.kt @@ -0,0 +1,52 @@ +package com.tangem.features.send.impl.presentation.send.ui + +import androidx.compose.foundation.background +import androidx.compose.foundation.gestures.Orientation +import androidx.compose.foundation.gestures.scrollable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetDraggableHeader +import com.tangem.core.ui.res.TangemTheme + +@Composable +fun SendScreen() { + // todo will be removed + val config = remember { SendBottomSheetConfig(SendStates.Amount) } + + Column( + modifier = Modifier + .imePadding() + .background( + color = TangemTheme.colors.background.tertiary, + shape = RoundedCornerShape( + topStart = TangemTheme.dimens.radius24, + topEnd = TangemTheme.dimens.radius24, + ), + ), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + TangemBottomSheetDraggableHeader( + color = TangemTheme.colors.background.tertiary, + ) + Box( + modifier = Modifier + .weight(1f) + .scrollable(state = rememberScrollState(), orientation = Orientation.Vertical), + ) { + SendScreenContent() + } + SendNavigationButtons(config.currentState) + } +} + +@Composable +fun SendScreenContent() { + // todo work in progress +} \ No newline at end of file diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/send/ui/SendStates.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/send/ui/SendStates.kt new file mode 100644 index 0000000000..f0a3e9840b --- /dev/null +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/send/ui/SendStates.kt @@ -0,0 +1,34 @@ +package com.tangem.features.send.impl.presentation.send.ui + +/** + * Screen states of Send + */ +enum class SendStates { + Amount, + Recipient, + Fee, + Filled, + Done, + ; + + companion object { + + /** Get next [SendStates] */ + fun SendStates.next(): SendStates { + return if (this.ordinal < SendStates.values().last().ordinal) { + SendStates.values()[this.ordinal + 1] + } else { + this + } + } + + /** Get previous [SendStates] */ + fun SendStates.previous(): SendStates { + return if (this.ordinal > 0) { + SendStates.values()[this.ordinal - 1] + } else { + this + } + } + } +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 4a46fb5bad..71e2ea1147 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -93,6 +93,7 @@ include(":features:learn2earn:api") include(":features:learn2earn:impl") include(":features:send:api") +include(":features:send:impl") include(":features:manage-tokens:api") include(":features:manage-tokens:impl")