Updated on 2026-08-14

This commit is contained in:
Tangem 2023-06-26 20:02:31 +03:00
parent b5dde35172
commit 5841bc65f4
13 changed files with 68 additions and 30 deletions

View file

@ -138,9 +138,9 @@
android:name="com.tangem.tap.features.sprinklr.ui.SprinklrActivity"
android:theme="@style/AppTheme" />
<activity android:name="com.tangem.feature.learn2earn.presentation.Learn2earnWebViewActivity"/>
<activity android:name="com.tangem.feature.learn2earn.presentation.Learn2earnWebViewActivity"/>
<activity
android:name="com.tangem.feature.learn2earn.presentation.webView.Learn2earnWebViewActivity"
android:theme="@style/Theme.MaterialComponents.Light.NoActionBar" />
<provider
android:name="androidx.core.content.FileProvider"

View file

@ -3,6 +3,7 @@ package com.tangem.tap
import android.app.Application
import android.content.Context
import android.content.pm.PackageManager
import androidx.compose.ui.text.intl.Locale
import coil.ImageLoader
import coil.ImageLoaderFactory
import com.tangem.Log
@ -245,6 +246,7 @@ class TapApplication : Application(), ImageLoaderFactory {
shopService = TangemShopService(this, config.shopify!!)
initAnalytics(this, config)
initFeedbackManager(this, preferencesStorage, foregroundActivityObserver, store)
learn2earnSetupAdditionalDependencies(config)
}
private fun initAnalytics(application: Application, config: Config) {
@ -307,6 +309,13 @@ class TapApplication : Application(), ImageLoaderFactory {
store.dispatch(GlobalAction.SetFeedbackManager(feedbackManager))
}
private fun learn2earnSetupAdditionalDependencies(config: Config) {
learn2ernInteractor.setupDependencies(
authCredentials = config.tangemComAuthorization,
countryCodeProvider = { store.state.globalState.userCountryCode ?: Locale.current.language },
)
}
private fun initWarningMessagesManager() {
store.dispatch(GlobalAction.SetWarningManager(WarningMessagesManager()))
}

View file

@ -12,7 +12,7 @@ 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.viewModels
import androidx.fragment.app.activityViewModels
import com.tangem.core.analytics.Analytics
import com.tangem.core.ui.res.TangemTheme
import com.tangem.feature.learn2earn.presentation.Learn2earnViewModel
@ -33,13 +33,13 @@ class HomeFragment : Fragment(), StoreSubscriber<HomeState> {
private var homeState: MutableState<HomeState> = mutableStateOf(store.state.homeState)
private val learn2earnViewModel by viewModels<Learn2earnViewModel>()
private val learn2earnViewModel by activityViewModels<Learn2earnViewModel>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
store.dispatch(HomeAction.OnCreate)
store.dispatch(HomeAction.Init)
if (learn2earnViewModel.isNeedToShowViewOnStoriesScreen()) {
if (learn2earnViewModel.uiState.storyScreenState.isVisible) {
store.dispatch(HomeAction.InsertStory(position = 0, Stories.OneInchPromo))
// re init homeState after inserting learn2earn story
homeState = mutableStateOf(store.state.homeState)
@ -90,10 +90,8 @@ class HomeFragment : Fragment(), StoreSubscriber<HomeState> {
@Composable
private fun ScreenContent() {
StoriesScreen(
homeState,
onLearn2earnClick = {
learn2earnViewModel.onStoriesClick()
},
homeState = homeState,
onLearn2earnClick = learn2earnViewModel.uiState.storyScreenState.onClick,
onScanButtonClick = {
Analytics.send(IntroductionProcess.ButtonScanCard())
store.dispatch(HomeAction.ReadCard())

View file

@ -26,7 +26,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.google.accompanist.systemuicontroller.rememberSystemUiController
import com.tangem.core.ui.res.TangemTheme
import com.tangem.feature.learn2earn.presentation.ui.StoriesScreen
import com.tangem.feature.learn2earn.presentation.ui.Learn2earnStoriesScreen
import com.tangem.tap.features.home.compose.content.*
import com.tangem.tap.features.home.compose.views.HomeButtons
import com.tangem.tap.features.home.compose.views.StoriesProgressBar
@ -54,8 +54,11 @@ fun StoriesScreen(
currentStory = state.stories[max(0, currentStep() - 1)]
}
val goToNextScreen = {
currentStory =
if (currentStep() < state.stories.lastIndex) state.stories[currentStep() + 1] else state.firstStory
currentStory = if (currentStep() < state.stories.lastIndex) {
state.stories[currentStep() + 1]
} else {
state.firstStory
}
}
val isPressed = remember { mutableStateOf(false) }
@ -153,7 +156,7 @@ fun StoriesScreen(
colorFilter = if (currentStory.isDarkBackground) null else ColorFilter.tint(Color.Black),
)
when (currentStory) {
Stories.OneInchPromo -> StoriesScreen(onLearn2earnClick)
Stories.OneInchPromo -> Learn2earnStoriesScreen(onLearn2earnClick)
Stories.TangemIntro -> FirstStoriesContent(isPaused, currentStory.duration) { hideContent.value = it }
Stories.RevolutionaryWallet -> StoriesRevolutionaryWallet(currentStory.duration)
Stories.UltraSecureBackup -> StoriesUltraSecureBackup(isPaused, currentStory.duration)

View file

@ -8,7 +8,9 @@ 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
@ -22,12 +24,16 @@ import coil.size.Scale
import com.badoo.mvicore.modelWatcher
import com.tangem.core.analytics.Analytics
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
@ -73,6 +79,7 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), SafeStoreSubscriber<W
private var walletView: WalletView = MultiWalletView()
private val learn2earnViewModel by activityViewModels<Learn2earnViewModel>()
private val viewModel by viewModels<WalletViewModel>()
private val totalBalanceWatcher = modelWatcher {
@ -102,6 +109,7 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), SafeStoreSubscriber<W
val inflater = TransitionInflater.from(requireContext())
enterTransition = inflater.inflateTransition(R.transition.slide_right)
exitTransition = inflater.inflateTransition(R.transition.fade)
learn2earnViewModel.onMainScreenCreated()
}
override fun onStart() {
@ -199,6 +207,23 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), SafeStoreSubscriber<W
binding.toolbar.setNavigationIcon(
if (state.canSaveUserWallets) R.drawable.ic_wallet_24 else R.drawable.ic_tap_card_24,
)
showLearn2earnView()
}
private fun showLearn2earnView() {
val isShowing = learn2earnViewModel.uiState.mainScreenState.isVisible
if (!isShowing) return
binding.composeLearnToEarnContainer.show(true) { binding.llWarnings.beginDelayedTransition() }
binding.composeLearnToEarnContainer.apply {
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
setContent {
TangemTheme {
Learn2earnMainPageScreen(learn2earnViewModel)
}
}
}
}
private fun setupPullToRefreshLayout(state: WalletState) {

View file

@ -113,14 +113,11 @@
android:paddingTop="8dp"
app:layout_constraintTop_toBottomOf="@id/rv_warning_messages">
<FrameLayout
android:id="@+id/fl_learn_to_earn_container"
<androidx.compose.ui.platform.ComposeView
android:id="@+id/compose_learn_to_earn_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="8dp" />
android:visibility="gone" />
<include
android:id="@+id/l_wallet_rescan_warning"

View file

@ -1,9 +1,11 @@
package com.tangem.core.ui.extensions
import androidx.annotation.PluralsRes
import androidx.annotation.StringRes
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Immutable
import androidx.compose.runtime.ReadOnlyComposable
import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.res.stringResource
/**
@ -24,6 +26,8 @@ sealed interface TextReference {
*/
data class Res(@StringRes val id: Int, val formatArgs: WrappedList<Any> = WrappedList(emptyList())) : TextReference
data class PluralRes(@PluralsRes val id: Int, val count: Int, val formatArgs: WrappedList<Any>) : TextReference
/**
* Text string
*
@ -38,6 +42,7 @@ sealed interface TextReference {
fun TextReference.resolveReference(): String {
return when (this) {
is TextReference.Res -> stringResource(id, *formatArgs.toTypedArray())
is TextReference.PluralRes -> pluralStringResource(id, count, *formatArgs.toTypedArray())
is TextReference.Str -> value
}
}

View file

@ -15,7 +15,6 @@ import com.tangem.feature.learn2earn.domain.models.toDomainError
import com.tangem.lib.crypto.DerivationManager
import com.tangem.lib.crypto.UserWalletManager
import com.tangem.lib.crypto.models.Currency
import java.text.DecimalFormat
/**
[REDACTED_AUTHOR]
@ -62,7 +61,7 @@ class DefaultLearn2earnInteractor(
return repository.getUserData().isRegisteredInPromotion
}
override fun getAwardAmount(): String {
override fun getAwardAmount(): Pair<Int, String> {
val userInfo = repository.getUserData()
val promotionInfo = promotion.getPromotionInfo()
@ -70,9 +69,9 @@ class DefaultLearn2earnInteractor(
promotionInfo.awardForOldCard
} else {
promotionInfo.awardForNewCard
}
}.toInt()
return DecimalFormat("0.#").format(awardAmount)
return awardAmount to awardAmount.toString()
}
@Throws(IllegalArgumentException::class)

View file

@ -21,7 +21,7 @@ interface Learn2earnInteractor : WebViewRedirectHandler {
fun isUserRegisteredInPromotion(): Boolean
fun getAwardAmount(): String
fun getAwardAmount(): Pair<Int, String>
@Throws(IllegalArgumentException::class)
suspend fun requestAward(): Result<Unit>

View file

@ -109,7 +109,8 @@ class Learn2earnViewModel @Inject constructor(
return if (interactor.isUserRegisteredInPromotion()) {
MainScreenState.Description.GetBonus
} else {
MainScreenState.Description.Learn(interactor.getAwardAmount())
val (count, award) = interactor.getAwardAmount()
MainScreenState.Description.Learn(count, award)
}
}

View file

@ -146,6 +146,6 @@ private fun OneInchStoriesContentPreview_Dark() {
private fun makePreviewState(): MainScreenState = MainScreenState(
isVisible = true,
onClick = {},
description = MainScreenState.Description.Learn("0"),
description = MainScreenState.Description.Learn(0, "0"),
showProgress = false,
)

View file

@ -1,6 +1,7 @@
package com.tangem.feature.learn2earn.presentation.ui.state
import com.tangem.core.ui.extensions.TextReference
import com.tangem.core.ui.extensions.WrappedList
import com.tangem.feature.learn2earn.domain.models.PromotionError
import com.tangem.feature.learn2earn.impl.R
@ -30,9 +31,9 @@ data class MainScreenState(
sealed class Description(val title: TextReference, val subtitle: TextReference) {
class Learn(awardAmount: String) : Description(
class Learn(count: Int, award: String) : Description(
TextReference.Res(R.string.main_learn_title),
TextReference.Res(R.string.main_learn_subtitle, listOf(awardAmount)),
TextReference.PluralRes(R.plurals.main_learn_subtitle, count, WrappedList(listOf(award))),
)
object GetBonus : Description(

View file

@ -12,7 +12,7 @@ internal fun Learn2earnState.Companion.init(uiActions: UiActions): Learn2earnSta
mainScreenState = MainScreenState(
isVisible = false,
onClick = uiActions.buttonMainClick,
description = MainScreenState.Description.Learn("0"),
description = MainScreenState.Description.Learn(0, "0"),
showProgress = false,
),
)