diff --git a/app/src/main/java/com/tangem/tap/TapApplication.kt b/app/src/main/java/com/tangem/tap/TapApplication.kt index 28cd0f57de..fb12b1008f 100644 --- a/app/src/main/java/com/tangem/tap/TapApplication.kt +++ b/app/src/main/java/com/tangem/tap/TapApplication.kt @@ -27,7 +27,6 @@ import com.tangem.domain.appcurrency.repository.AppCurrencyRepository import com.tangem.domain.card.ScanCardProcessor import com.tangem.domain.common.LogConfig import com.tangem.domain.wallets.legacy.WalletManagersRepository -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 @@ -150,8 +149,8 @@ class TapApplication : Application(), ImageLoaderFactory { @Inject lateinit var walletConnectSessionsRepository: WalletConnectSessionsRepository - @Inject - lateinit var learn2earnInteractor: Learn2earnInteractor + // @Inject + // lateinit var learn2earnInteractor: Learn2earnInteractor @Inject lateinit var tokenDetailsFeatureToggles: TokenDetailsFeatureToggles @@ -232,7 +231,7 @@ class TapApplication : Application(), ImageLoaderFactory { // [REDACTED_JIRA] runBlocking { featureTogglesManager.init() - learn2earnInteractor.init() + // learn2earnInteractor.init() } initTopUpController() diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt index d26e36149c..0c90110fcb 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt @@ -2,10 +2,13 @@ package com.tangem.tap.common.redux.global import com.tangem.domain.redux.domainStore import com.tangem.domain.redux.global.DomainGlobalAction +import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.redux.AppState +import com.tangem.tap.features.home.redux.HomeAction import com.tangem.tap.features.onboarding.OnboardingManager import com.tangem.tap.preferencesStorage import com.tangem.tap.proxy.AppStateHolder +import com.tangem.tap.store import com.tangem.utils.extensions.replaceBy import org.rekotlin.Action @@ -82,9 +85,12 @@ fun globalReducer(action: Action, state: AppState, appStateHolder: AppStateHolde } is GlobalAction.SetIfCardVerifiedOnline -> globalState.copy(cardVerifiedOnline = action.verified) - is GlobalAction.FetchUserCountry.Success -> globalState.copy( - userCountryCode = action.countryCode, - ) + is GlobalAction.FetchUserCountry.Success -> { + store.dispatchOnMain(HomeAction.UpdateCountryCode(action.countryCode)) + globalState.copy( + userCountryCode = action.countryCode, + ) + } is GlobalAction.UpdateUserWalletsListManager -> { appStateHolder.userWalletsListManager = action.manager globalState.copy( 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 1f6f2abc69..ceb3ead5f5 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 @@ -12,18 +12,15 @@ import androidx.compose.ui.platform.ComposeView import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsControllerCompat import androidx.fragment.app.Fragment -import androidx.fragment.app.activityViewModels import androidx.lifecycle.lifecycleScope import com.tangem.core.analytics.Analytics import com.tangem.core.navigation.AppScreen import com.tangem.core.navigation.NavigationAction import com.tangem.core.ui.res.TangemTheme -import com.tangem.feature.learn2earn.presentation.Learn2earnViewModel import com.tangem.tap.common.analytics.events.IntroductionProcess import com.tangem.tap.features.home.compose.StoriesScreen import com.tangem.tap.features.home.redux.HomeAction import com.tangem.tap.features.home.redux.HomeState -import com.tangem.tap.features.home.redux.Stories import com.tangem.tap.features.tokens.legacy.redux.TokensAction import com.tangem.tap.store import dagger.hilt.android.AndroidEntryPoint @@ -35,7 +32,7 @@ class HomeFragment : Fragment(), StoreSubscriber { private var homeState: MutableState = mutableStateOf(store.state.homeState) - private val learn2earnViewModel by activityViewModels() + // private val learn2earnViewModel by activityViewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -45,10 +42,10 @@ class HomeFragment : Fragment(), StoreSubscriber { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { // sync adding story before screen creation - if (learn2earnViewModel.uiState.storyScreenState.isVisible) { - store.dispatch(HomeAction.InsertStory(position = 0, Stories.OneInchPromo)) - homeState.value = store.state.homeState - } + // if (learn2earnViewModel.uiState.storyScreenState.isVisible) { + // store.dispatch(HomeAction.InsertStory(position = 0, Stories.OneInchPromo)) + // homeState.value = store.state.homeState + // } return ComposeView(inflater.context).apply { setContent { TangemTheme { @@ -93,7 +90,7 @@ class HomeFragment : Fragment(), StoreSubscriber { private fun ScreenContent() { StoriesScreen( homeState = homeState, - onLearn2earnClick = learn2earnViewModel.uiState.storyScreenState.onClick, + onLearn2earnClick = {}, // learn2earnViewModel.uiState.storyScreenState.onClick, onScanButtonClick = { Analytics.send(IntroductionProcess.ButtonScanCard()) lifecycleScope.launch { diff --git a/app/src/main/java/com/tangem/tap/features/home/compose/StoriesScreen.kt b/app/src/main/java/com/tangem/tap/features/home/compose/StoriesScreen.kt index 64b737596f..cd4af4ff04 100644 --- a/app/src/main/java/com/tangem/tap/features/home/compose/StoriesScreen.kt +++ b/app/src/main/java/com/tangem/tap/features/home/compose/StoriesScreen.kt @@ -178,11 +178,19 @@ private fun StoriesScreenContent(config: StoriesScreenContentConfig, modifier: M ) when (config.currentStory) { Stories.OneInchPromo -> Learn2earnStoriesScreen(config.onLearn2earnClick) - Stories.TangemIntro -> FirstStoriesContent(isPaused, currentStoryDuration) { + Stories.TangemIntro -> FirstStoriesContent( + isPaused = isPaused, + duration = currentStoryDuration, + isNewWalletAvailable = config.currentStory.isNewWalletAvailable, + ) { hideContent = it } Stories.RevolutionaryWallet -> StoriesRevolutionaryWallet(currentStoryDuration) - Stories.UltraSecureBackup -> StoriesUltraSecureBackup(isPaused, currentStoryDuration) + is Stories.UltraSecureBackup -> StoriesUltraSecureBackup( + isPaused = isPaused, + stepDuration = currentStoryDuration, + isNewWalletAvailable = config.currentStory.isNewWalletAvailable, + ) Stories.Currencies -> StoriesCurrencies(isPaused, currentStoryDuration) Stories.Web3 -> StoriesWeb3(isPaused, currentStoryDuration) Stories.WalletForEveryone -> StoriesWalletForEveryone(currentStoryDuration) diff --git a/app/src/main/java/com/tangem/tap/features/home/compose/content/Content.kt b/app/src/main/java/com/tangem/tap/features/home/compose/content/Content.kt index 2c430b48db..406064b704 100644 --- a/app/src/main/java/com/tangem/tap/features/home/compose/content/Content.kt +++ b/app/src/main/java/com/tangem/tap/features/home/compose/content/Content.kt @@ -2,13 +2,12 @@ package com.tangem.tap.features.home.compose.content import androidx.annotation.DrawableRes import androidx.compose.foundation.Image -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.* import androidx.compose.material.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -56,7 +55,7 @@ fun StoriesRevolutionaryWallet(stepDuration: Int) { } @Composable -fun StoriesUltraSecureBackup(isPaused: Boolean, stepDuration: Int) { +fun StoriesUltraSecureBackup(isPaused: Boolean, stepDuration: Int, isNewWalletAvailable: MutableState) { val subtitleText = buildAnnotatedString { append(stringResource(id = R.string.story_backup_description_1)) append(" ") @@ -75,7 +74,11 @@ fun StoriesUltraSecureBackup(isPaused: Boolean, stepDuration: Int) { ) }, bottomContent = { - FloatingCardsContent(isPaused, stepDuration) + FloatingCardsContent( + isPaused = isPaused, + stepDuration = stepDuration, + isNewWalletAvailable = isNewWalletAvailable, + ) }, ) } @@ -230,7 +233,13 @@ private fun RevolutionaryWalletPreview() { @Preview @Composable private fun UltraSecureBackupPreview() { - StoriesUltraSecureBackup(false, 6000) + StoriesUltraSecureBackup( + false, + 6000, + remember { + mutableStateOf(true) + }, + ) } @Preview diff --git a/app/src/main/java/com/tangem/tap/features/home/compose/content/FirstStoriesContent.kt b/app/src/main/java/com/tangem/tap/features/home/compose/content/FirstStoriesContent.kt index 4904a47c5b..14f51add03 100644 --- a/app/src/main/java/com/tangem/tap/features/home/compose/content/FirstStoriesContent.kt +++ b/app/src/main/java/com/tangem/tap/features/home/compose/content/FirstStoriesContent.kt @@ -32,7 +32,12 @@ import com.tangem.wallet.R @Suppress("LongMethod", "ComplexMethod", "MagicNumber") @Composable -fun FirstStoriesContent(isPaused: Boolean, duration: Int, onHideContent: (Boolean) -> Unit) { +fun FirstStoriesContent( + isPaused: Boolean, + duration: Int, + isNewWalletAvailable: MutableState, + onHideContent: (Boolean) -> Unit, +) { val bottomInsetsPx = WindowInsets.navigationBars.getBottom(LocalDensity.current) val screenState = remember { mutableStateOf(StartingScreenState.INIT) } @@ -115,13 +120,18 @@ fun FirstStoriesContent(isPaused: Boolean, duration: Int, onHideContent: (Boolea .weight(1.2f) .wrapContentSize(), ) { + val painter = if (isNewWalletAvailable.value) { + painterResource(id = R.drawable.img_meet_tangem2) + } else { + painterResource(id = R.drawable.img_meet_tangem) + } StoriesBottomImageAnimation( totalDuration = duration, firstStepDuration = 400, ) { modifier -> Image( modifier = modifier.fillMaxWidth(), - painter = painterResource(id = R.drawable.img_meet_tangem), + painter = painter, contentDescription = "Tangem Wallet card", ) } @@ -178,5 +188,11 @@ private fun MutableState.isMeetTangemDisplaying(): Boolean @Preview @Composable private fun FirstStoriesPreview() { - FirstStoriesContent(false, 8000) {} + FirstStoriesContent( + false, + 8000, + remember { + mutableStateOf(false) + }, + ) {} } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/home/compose/content/FloatingCardsContent.kt b/app/src/main/java/com/tangem/tap/features/home/compose/content/FloatingCardsContent.kt index 81d26d4855..3731a0e13c 100644 --- a/app/src/main/java/com/tangem/tap/features/home/compose/content/FloatingCardsContent.kt +++ b/app/src/main/java/com/tangem/tap/features/home/compose/content/FloatingCardsContent.kt @@ -4,6 +4,7 @@ import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Brush @@ -21,9 +22,13 @@ import com.tangem.wallet.R [REDACTED_AUTHOR] */ @Composable -fun FloatingCardsContent(isPaused: Boolean, stepDuration: Int) { +fun FloatingCardsContent(isPaused: Boolean, stepDuration: Int, isNewWalletAvailable: MutableState) { val bottomInsetsPx = WindowInsets.navigationBars.getBottom(LocalDensity.current) - val imageBitmap = asImageBitmap(R.drawable.img_card_placeholder_wallet_2) + val imageBitmap = if (isNewWalletAvailable.value) { + asImageBitmap(R.drawable.img_card_placeholder_wallet_2) + } else { + asImageBitmap(R.drawable.card_placeholder_wallet) + } val cards = listOf( FloatingCard.first(), FloatingCard.second(), diff --git a/app/src/main/java/com/tangem/tap/features/home/redux/HomeAction.kt b/app/src/main/java/com/tangem/tap/features/home/redux/HomeAction.kt index 18fbd8f4fb..033171c4f4 100644 --- a/app/src/main/java/com/tangem/tap/features/home/redux/HomeAction.kt +++ b/app/src/main/java/com/tangem/tap/features/home/redux/HomeAction.kt @@ -29,5 +29,7 @@ sealed class HomeAction : Action { data class ScanInProgress(val scanInProgress: Boolean) : HomeAction() data class GoToShop(val userCountryCode: String?) : HomeAction() + data class UpdateCountryCode(val userCountryCode: String) : HomeAction() + data class ChangeScanCardButtonState(val state: IndeterminateProgressButton) : HomeAction() } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/home/redux/HomeReducer.kt b/app/src/main/java/com/tangem/tap/features/home/redux/HomeReducer.kt index 6843253f5a..81f1adee30 100644 --- a/app/src/main/java/com/tangem/tap/features/home/redux/HomeReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/home/redux/HomeReducer.kt @@ -7,10 +7,10 @@ object HomeReducer { fun reduce(action: Action, state: AppState): HomeState = internalReduce(action, state) } -private fun internalReduce(action: Action, state: AppState): HomeState { - if (action !is HomeAction) return state.homeState +private fun internalReduce(action: Action, appState: AppState): HomeState { + if (action !is HomeAction) return appState.homeState - var state = state.homeState + var state = appState.homeState when (action) { is HomeAction.InsertStory -> { state = state.copy( @@ -25,6 +25,9 @@ private fun internalReduce(action: Action, state: AppState): HomeState { is HomeAction.ChangeScanCardButtonState -> { state = state.copy(btnScanState = action.state) } + is HomeAction.UpdateCountryCode -> { + state.onCountryCodeUpdate(state, action.userCountryCode) + } else -> {} } diff --git a/app/src/main/java/com/tangem/tap/features/home/redux/HomeState.kt b/app/src/main/java/com/tangem/tap/features/home/redux/HomeState.kt index 415deb938d..3456bafb5d 100644 --- a/app/src/main/java/com/tangem/tap/features/home/redux/HomeState.kt +++ b/app/src/main/java/com/tangem/tap/features/home/redux/HomeState.kt @@ -1,9 +1,12 @@ package com.tangem.tap.features.home.redux +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableStateOf import com.tangem.tap.common.entities.IndeterminateProgressButton import com.tangem.tap.features.send.redux.states.ButtonState import com.tangem.tap.features.wallet.redux.ProgressState import org.rekotlin.StateType +import java.util.Locale data class HomeState( val scanInProgress: Boolean = false, @@ -19,7 +22,16 @@ data class HomeState( fun stepOf(story: Stories): Int = stories.indexOf(story) + fun onCountryCodeUpdate(homeState: HomeState, countryCode: String) { + val isNewWalletAvailable = !(countryCode == RUSSIA_COUNTRY_CODE || countryCode == BELARUS_COUNTRY_CODE) + homeState.stories.forEach { + it.isNewWalletAvailable.value = isNewWalletAvailable + } + } + companion object { + private const val RUSSIA_COUNTRY_CODE = "ru" + private const val BELARUS_COUNTRY_CODE = "by" fun initDefaultStories(): List = listOf( Stories.TangemIntro, Stories.RevolutionaryWallet, @@ -28,12 +40,18 @@ data class HomeState( Stories.Web3, Stories.WalletForEveryone, ) + + fun isNewWalletAvailableInit(): Boolean { + val locale = Locale.getDefault().language + return !(locale == RUSSIA_COUNTRY_CODE || locale == BELARUS_COUNTRY_CODE) + } } } sealed class Stories( val isDarkBackground: Boolean, val duration: Int, + val isNewWalletAvailable: MutableState = mutableStateOf(HomeState.isNewWalletAvailableInit()), ) { object OneInchPromo : Stories(true, duration = 8000) object TangemIntro : Stories(true, duration = 8000) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt index bcbad9fc7a..e96fa22bb3 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletFragment.kt @@ -8,9 +8,7 @@ import android.view.View import androidx.activity.OnBackPressedCallback import androidx.appcompat.app.AppCompatActivity import androidx.compose.runtime.mutableStateOf -import androidx.compose.ui.platform.ViewCompositionStrategy import androidx.fragment.app.Fragment -import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.lifecycle.Lifecycle import androidx.lifecycle.flowWithLifecycle @@ -26,16 +24,12 @@ import com.tangem.core.analytics.Analytics import com.tangem.core.navigation.AppScreen import com.tangem.core.navigation.NavigationAction import com.tangem.core.ui.fragments.setStatusBarColor -import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.utils.OneTouchClickListener import com.tangem.datasource.connection.NetworkConnectionManager -import com.tangem.feature.learn2earn.presentation.Learn2earnViewModel -import com.tangem.feature.learn2earn.presentation.ui.Learn2earnMainPageScreen import com.tangem.feature.swap.api.SwapFeatureToggleManager import com.tangem.feature.swap.domain.SwapInteractor import com.tangem.tap.MainActivity import com.tangem.tap.common.analytics.events.Portfolio -import com.tangem.tap.common.extensions.beginDelayedTransition import com.tangem.tap.common.extensions.show import com.tangem.tap.common.recyclerView.SpaceItemDecoration import com.tangem.tap.common.redux.global.GlobalAction @@ -79,7 +73,7 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), SafeStoreSubscriber() + // private val learn2earnViewModel by activityViewModels() private val viewModel by viewModels() private val totalBalanceWatcher = modelWatcher { @@ -109,7 +103,7 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), SafeStoreSubscriber) { diff --git a/app/src/main/res/drawable-hdpi/img_meet_tangem.webp b/app/src/main/res/drawable-hdpi/img_meet_tangem.webp index 38e70d91d4..e9b4ef6b19 100644 Binary files a/app/src/main/res/drawable-hdpi/img_meet_tangem.webp and b/app/src/main/res/drawable-hdpi/img_meet_tangem.webp differ diff --git a/app/src/main/res/drawable-hdpi/img_meet_tangem2.webp b/app/src/main/res/drawable-hdpi/img_meet_tangem2.webp new file mode 100644 index 0000000000..38e70d91d4 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/img_meet_tangem2.webp differ diff --git a/app/src/main/res/drawable-mdpi/img_meet_tangem.webp b/app/src/main/res/drawable-mdpi/img_meet_tangem.webp index 2e5371a066..7bd5ec80c5 100644 Binary files a/app/src/main/res/drawable-mdpi/img_meet_tangem.webp and b/app/src/main/res/drawable-mdpi/img_meet_tangem.webp differ diff --git a/app/src/main/res/drawable-mdpi/img_meet_tangem2.webp b/app/src/main/res/drawable-mdpi/img_meet_tangem2.webp new file mode 100644 index 0000000000..2e5371a066 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/img_meet_tangem2.webp differ diff --git a/app/src/main/res/drawable-xhdpi/img_meet_tangem.webp b/app/src/main/res/drawable-xhdpi/img_meet_tangem.webp index 48326d332c..9bc7cba662 100644 Binary files a/app/src/main/res/drawable-xhdpi/img_meet_tangem.webp and b/app/src/main/res/drawable-xhdpi/img_meet_tangem.webp differ diff --git a/app/src/main/res/drawable-xhdpi/img_meet_tangem2.webp b/app/src/main/res/drawable-xhdpi/img_meet_tangem2.webp new file mode 100644 index 0000000000..48326d332c Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/img_meet_tangem2.webp differ diff --git a/app/src/main/res/drawable-xxhdpi/img_meet_tangem.webp b/app/src/main/res/drawable-xxhdpi/img_meet_tangem.webp index c8d74aeffe..941a671afb 100644 Binary files a/app/src/main/res/drawable-xxhdpi/img_meet_tangem.webp and b/app/src/main/res/drawable-xxhdpi/img_meet_tangem.webp differ diff --git a/app/src/main/res/drawable-xxhdpi/img_meet_tangem2.webp b/app/src/main/res/drawable-xxhdpi/img_meet_tangem2.webp new file mode 100644 index 0000000000..c8d74aeffe Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/img_meet_tangem2.webp differ diff --git a/app/src/main/res/drawable-xxxhdpi/img_meet_tangem.webp b/app/src/main/res/drawable-xxxhdpi/img_meet_tangem2.webp similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/img_meet_tangem.webp rename to app/src/main/res/drawable-xxxhdpi/img_meet_tangem2.webp diff --git a/app/src/main/res/drawable-xxxhdpi/meet_tangem.webp b/app/src/main/res/drawable-xxxhdpi/meet_tangem.webp new file mode 100644 index 0000000000..8ca89394bc Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/meet_tangem.webp differ