Updated on 2026-08-14

This commit is contained in:
Tangem 2023-06-28 15:54:43 +03:00
parent 54d8ce26bf
commit 1b486b730c
15 changed files with 99 additions and 49 deletions

View file

@ -3,7 +3,6 @@ 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
@ -146,7 +145,7 @@ class TapApplication : Application(), ImageLoaderFactory {
lateinit var walletConnectSessionsRepository: WalletConnectSessionsRepository
@Inject
lateinit var learn2ernInteractor: Learn2earnInteractor
lateinit var learn2earnInteractor: Learn2earnInteractor
override fun onCreate() {
super.onCreate()
@ -205,7 +204,7 @@ class TapApplication : Application(), ImageLoaderFactory {
// [REDACTED_JIRA]
runBlocking {
featureTogglesManager.init()
learn2ernInteractor.init()
learn2earnInteractor.init()
}
initTopUpController()
@ -246,7 +245,6 @@ class TapApplication : Application(), ImageLoaderFactory {
shopService = TangemShopService(this, config.shopify!!)
initAnalytics(this, config)
initFeedbackManager(this, preferencesStorage, foregroundActivityObserver, store)
setupLearn2earnAdditionalDependencies(config)
}
private fun initAnalytics(application: Application, config: Config) {
@ -309,13 +307,6 @@ class TapApplication : Application(), ImageLoaderFactory {
store.dispatch(GlobalAction.SetFeedbackManager(feedbackManager))
}
private fun setupLearn2earnAdditionalDependencies(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

@ -217,7 +217,11 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), SafeStoreSubscriber<W
binding.composeLearnToEarnContainer.show(true) { binding.llWarnings.beginDelayedTransition() }
binding.composeLearnToEarnContainer.apply {
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
setViewCompositionStrategy(
strategy = ViewCompositionStrategy.DisposeOnLifecycleDestroyed(
lifecycle = this@WalletFragment.lifecycle,
),
)
setContent {
TangemTheme {
Learn2earnMainPageScreen(learn2earnViewModel.uiState)

View file

@ -1,6 +1,8 @@
package com.tangem.tap.proxy.di
import androidx.compose.ui.text.intl.Locale
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.feature.learn2earn.domain.api.Learn2earnDependencyProvider
import com.tangem.lib.crypto.DerivationManager
import com.tangem.lib.crypto.TransactionManager
import com.tangem.lib.crypto.UserWalletManager
@ -48,4 +50,20 @@ class ProxyModule {
appStateHolder = appStateHolder,
)
}
// regions FeatureConsumers
@Provides
@Singleton
fun provideLear2earnDependencies(appStateHolder: AppStateHolder): Learn2earnDependencyProvider {
return object : Learn2earnDependencyProvider {
override fun getUserCountryCodeProvider(): () -> String = {
appStateHolder.mainStore?.state?.globalState?.userCountryCode ?: Locale.current.language
}
override fun getWebViewAuthCredentialsProvider(): () -> String? = {
appStateHolder.mainStore?.state?.globalState?.configManager?.config?.tangemComAuthorization
}
}
}
// endregion FeatureConsumers
}

View file

@ -5,10 +5,7 @@ import com.tangem.datasource.api.promotion.models.AbstractPromotionResponse
import com.tangem.datasource.api.promotion.models.PromotionInfoResponse
import com.tangem.feature.learn2earn.data.api.Learn2earnRepository
import com.tangem.feature.learn2earn.data.models.PromoUserData
import com.tangem.feature.learn2earn.domain.api.Learn2earnInteractor
import com.tangem.feature.learn2earn.domain.api.RedirectConsequences
import com.tangem.feature.learn2earn.domain.api.WebViewResult
import com.tangem.feature.learn2earn.domain.api.WebViewResultHandler
import com.tangem.feature.learn2earn.domain.api.*
import com.tangem.feature.learn2earn.domain.models.Promotion
import com.tangem.feature.learn2earn.domain.models.PromotionError
import com.tangem.feature.learn2earn.domain.models.toDomainError
@ -23,20 +20,18 @@ class DefaultLearn2earnInteractor(
private val repository: Learn2earnRepository,
private val userWalletManager: UserWalletManager,
private val derivationManager: DerivationManager,
dependencyProvider: Learn2earnDependencyProvider,
) : Learn2earnInteractor {
override var webViewResultHandler: WebViewResultHandler? = null
private lateinit var webViewUriBuilder: WebViewUriBuilder
private lateinit var promotion: Promotion
override fun setupDependencies(authCredentials: String?, countryCodeProvider: () -> String) {
webViewUriBuilder = WebViewUriBuilder(
authCredentials = authCredentials,
userCountryCodeProvider = countryCodeProvider,
promoCodeProvider = { repository.getUserData().promoCode },
)
}
private val webViewUriBuilder: WebViewUriBuilder = WebViewUriBuilder(
authCredentialsProvider = dependencyProvider.getWebViewAuthCredentialsProvider(),
userCountryCodeProvider = dependencyProvider.getUserCountryCodeProvider(),
promoCodeProvider = { repository.getUserData().promoCode },
)
override suspend fun init() {
initPromotionInfo()

View file

@ -3,7 +3,9 @@ package com.tangem.feature.learn2earn.domain
import com.tangem.utils.converter.TwoWayConverter
/**
* A converter that helps prepare a list of headers to put in an intent and retrieve them later.
* A converter that helps prepare a list of headers to be added to the Bundle.
* ArrayList is used to prevent cast exceptions when the convert result is placed in a Bundle.
* @see Learn2earnRouter#openWebView() putStringArrayListExtra
*
[REDACTED_AUTHOR]
*/

View file

@ -7,7 +7,7 @@ import com.tangem.feature.learn2earn.impl.BuildConfig
[REDACTED_AUTHOR]
*/
internal class WebViewUriBuilder(
private val authCredentials: String?,
private val authCredentialsProvider: () -> String?,
private val userCountryCodeProvider: () -> String,
private val promoCodeProvider: () -> String?,
) {
@ -30,10 +30,13 @@ internal class WebViewUriBuilder(
return builder.build()
}
fun getBasicAuthHeaders(): Map<String, String> = if (authCredentials == null) {
mapOf()
} else {
mapOf("Authorization" to "Basic $authCredentials")
fun getBasicAuthHeaders(): Map<String, String> {
val credentials = authCredentialsProvider.invoke()
return if (credentials == null) {
mapOf()
} else {
mapOf("Authorization" to "Basic $credentials")
}
}
fun isPromoCodeRedirect(uri: Uri): Boolean {

View file

@ -0,0 +1,13 @@
package com.tangem.feature.learn2earn.domain.api
/**
* Interface, a wrapper that allows us to get values from the AppStateHolder located in the app module
*
[REDACTED_AUTHOR]
*/
interface Learn2earnDependencyProvider {
fun getUserCountryCodeProvider(): () -> String
fun getWebViewAuthCredentialsProvider(): () -> String?
}

View file

@ -9,8 +9,6 @@ interface Learn2earnInteractor : WebViewRedirectHandler {
var webViewResultHandler: WebViewResultHandler?
fun setupDependencies(authCredentials: String?, countryCodeProvider: () -> String)
suspend fun init()
fun isUserHadPromoCode(): Boolean

View file

@ -3,6 +3,7 @@ package com.tangem.feature.learn2earn.domain.di
import android.content.Context
import com.tangem.feature.learn2earn.data.api.Learn2earnRepository
import com.tangem.feature.learn2earn.domain.DefaultLearn2earnInteractor
import com.tangem.feature.learn2earn.domain.api.Learn2earnDependencyProvider
import com.tangem.feature.learn2earn.domain.api.Learn2earnInteractor
import com.tangem.feature.learn2earn.domain.api.WebViewRedirectHandler
import com.tangem.feature.learn2earn.presentation.Learn2earnRouter
@ -29,6 +30,7 @@ class Learn2earnDomainModule {
@Singleton
fun provideInteractor(
repository: Learn2earnRepository,
dependencyProvider: Learn2earnDependencyProvider,
userWalletManager: UserWalletManager,
derivationManager: DerivationManager,
): Learn2earnInteractor {
@ -36,6 +38,7 @@ class Learn2earnDomainModule {
repository = repository,
userWalletManager = userWalletManager,
derivationManager = derivationManager,
dependencyProvider = dependencyProvider,
)
}

View file

@ -29,7 +29,7 @@ class Learn2earnViewModel @Inject constructor(
var uiState: Learn2earnState by mutableStateOf(
Learn2earnState.init(
uiActions = UiActions(
uiActions = Learn2earnUiActions(
buttonStoryClick = ::buttonStoryClick,
buttonMainClick = ::buttonMainClick,
),

View file

@ -15,9 +15,12 @@ import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.datasource.CollectionPreviewParameterProvider
import androidx.compose.ui.unit.dp
import com.tangem.core.ui.components.SpacerH4
import com.tangem.core.ui.extensions.resolveReference
import com.tangem.core.ui.res.TangemColorPalette
import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.res.TangemTypography
import com.tangem.feature.learn2earn.impl.R
@ -57,7 +60,7 @@ internal fun GetBonusView(state: MainScreenState, modifier: Modifier = Modifier)
modifier = Modifier
.align(Alignment.Center)
.size(size = TangemTheme.dimens.size28),
color = Color.White,
color = TangemColorPalette.White,
strokeWidth = TangemTheme.dimens.size2,
)
}
@ -125,28 +128,46 @@ private fun ContentBackground(shape: Shape) {
@Preview
@Composable
private fun OneInchStoriesContentPreview_Light() {
private fun GetBonusViewPreview_Light(@PreviewParameter(GetBonusViewPreviewProvider::class) state: MainScreenState) {
TangemTheme(
isDark = false,
) {
GetBonusView(makePreviewState())
GetBonusView(state)
}
}
@Preview
@Composable
private fun OneInchStoriesContentPreview_Dark() {
private fun GetBonusViewPreview_Dark(@PreviewParameter(GetBonusViewPreviewProvider::class) state: MainScreenState) {
TangemTheme(
isDark = true,
) {
GetBonusView(makePreviewState())
GetBonusView(state)
}
}
private fun makePreviewState(): MainScreenState = MainScreenState(
isVisible = true,
onClick = {},
description = MainScreenState.Description.Learn(0),
logoState = MainScreenState.LogoState.Idle,
showProgress = false,
private class GetBonusViewPreviewProvider : CollectionPreviewParameterProvider<MainScreenState>(
collection = listOf(
MainScreenState(
isVisible = true,
onClick = {},
description = MainScreenState.Description.Learn(1),
logoState = MainScreenState.LogoState.Idle,
showProgress = false,
),
MainScreenState(
isVisible = true,
onClick = {},
description = MainScreenState.Description.Learn(2),
logoState = MainScreenState.LogoState.InProgress,
showProgress = true,
),
MainScreenState(
isVisible = true,
onClick = {},
description = MainScreenState.Description.GetBonus,
logoState = MainScreenState.LogoState.Idle,
showProgress = false,
),
),
)

View file

@ -106,7 +106,7 @@ private fun StoryDescription(headerText: String, bodyText: String, modifier: Mod
@Preview
@Composable
private fun OneInchStoriesContentPreview_Light() {
private fun Learn2earnStoriesScreenPreview_Light() {
TangemTheme(
isDark = false,
) {
@ -118,7 +118,7 @@ private fun OneInchStoriesContentPreview_Light() {
@Preview
@Composable
private fun OneInchStoriesContentPreview_Dark() {
private fun Learn2earnStoriesScreenPreview_Dark() {
TangemTheme(
isDark = true,
) {

View file

@ -68,7 +68,7 @@ data class MainScreenState(
}
}
class UiActions(
class Learn2earnUiActions(
val buttonStoryClick: () -> Unit,
val buttonMainClick: () -> Unit,
)

View file

@ -3,7 +3,7 @@ package com.tangem.feature.learn2earn.presentation.ui.state
/**
[REDACTED_AUTHOR]
*/
internal fun Learn2earnState.Companion.init(uiActions: UiActions): Learn2earnState {
internal fun Learn2earnState.Companion.init(uiActions: Learn2earnUiActions): Learn2earnState {
return Learn2earnState(
storyScreenState = StoryScreenState(
isVisible = false,

View file

@ -22,7 +22,9 @@ internal class WebViewViewModel @Inject constructor(
}
fun extractData(intent: Intent): WebViewData {
val uriString = intent.getStringExtra(Learn2earnWebViewActivity.EXTRA_WEB_URI)!!
val uriString = requireNotNull(intent.getStringExtra(Learn2earnWebViewActivity.EXTRA_WEB_URI)) {
"The Intent property EXTRA_WEB_URI is null"
}
val rawHeaders = intent.getStringArrayListExtra(Learn2earnWebViewActivity.EXTRA_WEB_HEADERS) ?: ArrayList()
return WebViewData(