diff --git a/app/build.gradle b/app/build.gradle index d23c578add..8d4485d03b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -80,8 +80,8 @@ dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' implementation 'com.tangem:blockchain:develop-64' - implementation 'com.tangem.tangem-sdk-kotlin:core:develop-132' - implementation 'com.tangem.tangem-sdk-kotlin:android:develop-132' + implementation 'com.tangem.tangem-sdk-kotlin:core:develop-134' + implementation 'com.tangem.tangem-sdk-kotlin:android:develop-134' // WebView implementation "androidx.browser:browser:1.3.0" diff --git a/app/src/main/assets/tangem-app-config b/app/src/main/assets/tangem-app-config index 180252680e..44ccf4e776 160000 --- a/app/src/main/assets/tangem-app-config +++ b/app/src/main/assets/tangem-app-config @@ -1 +1 @@ -Subproject commit 180252680e80b88f8fec9add783207d41d30e4e3 +Subproject commit 44ccf4e7766e51e869eabe8bc68026b5b7edd237 diff --git a/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsHandler.kt b/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsHandler.kt index caa5f0117b..424f06d9ce 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsHandler.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsHandler.kt @@ -1,5 +1,6 @@ package com.tangem.tap.common.analytics +import com.shopify.buy3.Storefront import com.tangem.common.card.Card import com.tangem.common.core.TangemSdkError import com.tangem.tap.common.extensions.filterNotNull @@ -13,6 +14,11 @@ abstract class AnalyticsHandler { params: Map = emptyMap() ) + abstract fun triggerEvent( + event: String, + params: Map + ) + abstract fun logCardSdkError( error: TangemSdkError, actionToLog: Analytics.ActionToLog, @@ -71,6 +77,13 @@ abstract class AnalyticsHandler { ) } } - } + + fun logShopifyOrder(order: Storefront.Order) { + triggerEvent(getOrderEvent(), getOrderParams(order)) + } + + protected abstract fun getOrderEvent(): String + + protected abstract fun getOrderParams(order: Storefront.Order): Map } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/analytics/AppsFlyerAnalyticsHandler.kt b/app/src/main/java/com/tangem/tap/common/analytics/AppsFlyerAnalyticsHandler.kt index 9692defe86..64beb11b4a 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/AppsFlyerAnalyticsHandler.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/AppsFlyerAnalyticsHandler.kt @@ -1,7 +1,10 @@ package com.tangem.tap.common.analytics import android.app.Application +import com.appsflyer.AFInAppEventParameterName +import com.appsflyer.AFInAppEventType import com.appsflyer.AppsFlyerLib +import com.shopify.buy3.Storefront import com.tangem.common.card.Card import com.tangem.common.core.TangemSdkError @@ -30,4 +33,30 @@ class AppsFlyerAnalyticsHandler(val context: Application): AnalyticsHandler() { //TODO } + override fun getOrderEvent(): String = AFInAppEventType.PURCHASE + + override fun getOrderParams(order: Storefront.Order): Map { + + val sku = order.lineItems.edges.firstOrNull()?.node?.variant?.sku ?: "unknown" + + val discountCode = + (order.discountApplications.edges.firstOrNull()?.node as? Storefront.DiscountCodeApplication)?.code + + val discountParams = if (discountCode != null ){ + mapOf(AFInAppEventParameterName.COUPON_CODE to discountCode) + } else { + mapOf() + } + + return mapOf( + AFInAppEventParameterName.CONTENT_ID to sku, + AFInAppEventParameterName.REVENUE to order.totalPriceV2.amount, + AFInAppEventParameterName.CURRENCY to order.currencyCode.name + ) + discountParams + } + + override fun triggerEvent(event: String, params: Map) { + AppsFlyerLib.getInstance().logEvent(context, event, params) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/analytics/FirebaseAnalyticsHandler.kt b/app/src/main/java/com/tangem/tap/common/analytics/FirebaseAnalyticsHandler.kt index 106c07aae9..4e0371206a 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/FirebaseAnalyticsHandler.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/FirebaseAnalyticsHandler.kt @@ -2,9 +2,11 @@ package com.tangem.tap.common.analytics import android.os.Bundle import androidx.core.os.bundleOf +import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.analytics.ktx.analytics import com.google.firebase.crashlytics.FirebaseCrashlytics import com.google.firebase.ktx.Firebase +import com.shopify.buy3.Storefront import com.tangem.common.card.Card import com.tangem.common.core.TangemSdkError @@ -57,4 +59,30 @@ object FirebaseAnalyticsHandler : AnalyticsHandler() { params.forEach { (key, value) -> FirebaseCrashlytics.getInstance().setCustomKey(key, value) } FirebaseCrashlytics.getInstance().recordException(error) } + + override fun getOrderEvent(): String = FirebaseAnalytics.Event.PURCHASE + + override fun getOrderParams(order: Storefront.Order): Map { + + val sku = order.lineItems.edges.firstOrNull()?.node?.variant?.sku ?: "unknown" + + val discountCode = + (order.discountApplications.edges.firstOrNull()?.node as? Storefront.DiscountCodeApplication)?.code + + val discountParams = if (discountCode != null ){ + mapOf(FirebaseAnalytics.Param.DISCOUNT to discountCode) + } else { + mapOf() + } + + return mapOf( + FirebaseAnalytics.Param.ITEM_ID to sku, + FirebaseAnalytics.Param.VALUE to order.totalPriceV2.amount, + FirebaseAnalytics.Param.CURRENCY to order.currencyCode.name + ) + discountParams + } + + override fun triggerEvent(event: String, params: Map) { + Firebase.analytics.logEvent(event, params.toBundle()) + } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsHandler.kt b/app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsHandler.kt index da77c37e05..b4824b60a3 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsHandler.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsHandler.kt @@ -1,6 +1,7 @@ package com.tangem.tap.common.analytics import android.app.Application +import com.shopify.buy3.Storefront import com.tangem.common.card.Card import com.tangem.common.core.TangemSdkError @@ -15,6 +16,10 @@ class GlobalAnalyticsHandler(val analyticsHandlers: List) : analyticsHandlers.forEach { it.triggerEvent(event, card, blockchain) } } + override fun triggerEvent(event: String, params: Map) { + analyticsHandlers.forEach { it.triggerEvent(event, params) } + } + override fun logCardSdkError( error: TangemSdkError, actionToLog: Analytics.ActionToLog, @@ -28,6 +33,14 @@ class GlobalAnalyticsHandler(val analyticsHandlers: List) : analyticsHandlers.forEach { it.logError(error, params) } } + override fun getOrderEvent(): String { + return "" + } + + override fun getOrderParams(order: Storefront.Order): Map { + return emptyMap() + } + companion object { fun createDefaultAnalyticHandlers(context: Application): GlobalAnalyticsHandler { return GlobalAnalyticsHandler( diff --git a/app/src/main/java/com/tangem/tap/common/shop/TangemShopService.kt b/app/src/main/java/com/tangem/tap/common/shop/TangemShopService.kt index d428a9d197..3da94dc568 100644 --- a/app/src/main/java/com/tangem/tap/common/shop/TangemShopService.kt +++ b/app/src/main/java/com/tangem/tap/common/shop/TangemShopService.kt @@ -4,9 +4,11 @@ import android.app.Application import android.content.Intent import com.google.android.gms.wallet.PaymentData import com.shopify.buy3.Storefront +import com.tangem.tap.common.analytics.AnalyticsHandler import com.tangem.tap.common.shop.data.ProductType import com.tangem.tap.common.shop.data.TangemProduct import com.tangem.tap.common.shop.data.TotalSum +import com.tangem.tap.common.shop.shopify.ShopifyService import com.tangem.tap.common.shop.shopify.ShopifyShop import com.tangem.tap.common.shop.shopify.data.CheckoutItem import kotlinx.coroutines.async @@ -197,6 +199,18 @@ class TangemShopService(application: Application, shopifyShop: ShopifyShop) { return checkouts[productType]!!.webUrl } + suspend fun waitForCheckout( + productType: ProductType, + analyticsHandler: AnalyticsHandler? + ) { + val result = shopifyService.checkout(true, checkouts[productType]!!.id) + result.onSuccess { + if (it.order != null) { + analyticsHandler?.logShopifyOrder(order = it.order) + } + } + } + companion object { const val TANGEM_WALLET_2_CARDS_SKU = "TG115x2" const val TANGEM_WALLET_3_CARDS_SKU = "TG115x3" diff --git a/app/src/main/java/com/tangem/tap/common/shop/shopify/ShopifyService.kt b/app/src/main/java/com/tangem/tap/common/shop/shopify/ShopifyService.kt index da24d1337d..a33fb82b84 100644 --- a/app/src/main/java/com/tangem/tap/common/shop/shopify/ShopifyService.kt +++ b/app/src/main/java/com/tangem/tap/common/shop/shopify/ShopifyService.kt @@ -1,4 +1,4 @@ -package com.tangem.tap.common.shop +package com.tangem.tap.common.shop.shopify import android.app.Application import com.shopify.buy3.GraphCallResult @@ -7,7 +7,6 @@ import com.shopify.buy3.RetryHandler import com.shopify.buy3.Storefront.* import com.shopify.graphql.support.ID import com.shopify.graphql.support.Input -import com.tangem.tap.common.shop.shopify.ShopifyShop import com.tangem.tap.common.shop.shopify.data.CheckoutItem import com.tangem.tap.common.shop.shopify.data.checkoutFieldsFragment import com.tangem.tap.common.shop.shopify.data.collectionFieldsFragment @@ -85,7 +84,7 @@ class ShopifyService(private val application: Application, val shop: ShopifyShop when (result) { is GraphCallResult.Success -> { val checkout = result.response.data?.node as? Checkout - checkout == null + checkout?.order == null } is GraphCallResult.Failure -> false } diff --git a/app/src/main/java/com/tangem/tap/domain/TapWorkarounds.kt b/app/src/main/java/com/tangem/tap/domain/TapWorkarounds.kt index ffc8df824c..c0f9c1e239 100644 --- a/app/src/main/java/com/tangem/tap/domain/TapWorkarounds.kt +++ b/app/src/main/java/com/tangem/tap/domain/TapWorkarounds.kt @@ -63,6 +63,8 @@ object TapWorkarounds { "AB04" to Blockchain.Dogecoin, "AB05" to Blockchain.BSC, "AB06" to Blockchain.XRP, + "AB07" to Blockchain.Bitcoin, + "AB08" to Blockchain.Ethereum, ) } diff --git a/app/src/main/java/com/tangem/tap/domain/tasks/product/CreateProductWalletTask.kt b/app/src/main/java/com/tangem/tap/domain/tasks/product/CreateProductWalletTask.kt index 29ae9d45bc..1d46b341ec 100644 --- a/app/src/main/java/com/tangem/tap/domain/tasks/product/CreateProductWalletTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/tasks/product/CreateProductWalletTask.kt @@ -145,7 +145,20 @@ private class CreateWalletTangemWallet : ProductCommandProcessor { primaryCard = result.data - deriveKeys(createWalletResponse, session, callback) + when { + card.settings.isHDWalletAllowed -> { + deriveKeys(createWalletResponse, session, callback) + } + else -> { + callback( + CompletionResult.Success( + CreateProductWalletTaskResponse( + card = session.environment.card!!, primaryCard = primaryCard + ) + ) + ) + } + } } is CompletionResult.Failure -> { callback(CompletionResult.Failure(result.error)) diff --git a/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt b/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt index 271b9bf761..31931af76f 100644 --- a/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt @@ -1,6 +1,5 @@ package com.tangem.tap.domain.tasks.product -import com.tangem.* import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.Token import com.tangem.common.CompletionResult @@ -241,7 +240,7 @@ private class ScanWalletProcessor( callback: (result: CompletionResult) -> Unit ) { val derivations = collectDerivations(card) - if (derivations.isEmpty()) { + if (derivations.isEmpty() || !card.settings.isHDWalletAllowed) { callback( CompletionResult.Success( ScanResponse( diff --git a/app/src/main/java/com/tangem/tap/features/home/compose/AutoSizeText.kt b/app/src/main/java/com/tangem/tap/features/home/compose/AutoSizeText.kt new file mode 100644 index 0000000000..a7d9b2b606 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/home/compose/AutoSizeText.kt @@ -0,0 +1,45 @@ +package com.tangem.tap.features.home.compose + +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.drawWithContent +import androidx.compose.ui.text.TextLayoutResult +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.unit.ExperimentalUnitApi + +@OptIn(ExperimentalUnitApi::class) +@Composable +fun AutoSizeText( + text: String, + textStyle: TextStyle, + modifier: Modifier = Modifier +) { + val scaledTextStyle = remember { mutableStateOf(textStyle) } + val readyToDraw = remember { mutableStateOf(false) } + + val onTextLayout: (TextLayoutResult) -> Unit = { result -> + if (result.didOverflowWidth) { + val fontSize = result.size.width / result.multiParagraph.width + scaledTextStyle.value = +// scaledTextStyle.value.copy(fontSize = TextUnit(fontSize, TextUnitType.Sp)) + scaledTextStyle.value.copy(fontSize = scaledTextStyle.value.fontSize * 0.9) + } else { + readyToDraw.value = true + } + } + + Text( + text = text, + modifier = modifier.drawWithContent { + if (readyToDraw.value) { + drawContent() + } + }, + softWrap = false, + onTextLayout = onTextLayout, + style = scaledTextStyle.value, + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/home/compose/FirstStoriesContent.kt b/app/src/main/java/com/tangem/tap/features/home/compose/FirstStoriesContent.kt index 9dab20b43f..92929c0027 100644 --- a/app/src/main/java/com/tangem/tap/features/home/compose/FirstStoriesContent.kt +++ b/app/src/main/java/com/tangem/tap/features/home/compose/FirstStoriesContent.kt @@ -9,7 +9,6 @@ import androidx.compose.animation.scaleIn import androidx.compose.animation.slideInVertically import androidx.compose.foundation.Image import androidx.compose.foundation.layout.* -import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.mutableStateOf @@ -21,6 +20,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview @@ -88,32 +88,27 @@ fun FirstStoriesContent( StartingScreenState.MEET_TANGEM -> R.string.story_meet_title } - if (screenState.value != StartingScreenState.MEET_TANGEM) { - Text( - text = text?.let { stringResource(text) } ?: "", - fontSize = 60.sp, - fontWeight = FontWeight.SemiBold, - modifier = Modifier - .padding(start = 40.dp, end = 40.dp) - .alpha(if (screenState.value == StartingScreenState.SHOW_CARD) 0f else 1f), - color = Color.White, - textAlign = TextAlign.Center, + val style = TextStyle( + fontSize = 60.sp, + fontWeight = FontWeight.SemiBold, + color = Color.White, + textAlign = TextAlign.Center, + ) - ) + if (screenState.value != StartingScreenState.MEET_TANGEM) { + AutoSizeText(text = text?.let { stringResource(text) } ?: "", textStyle = style, + modifier = Modifier + .padding(start = 40.dp, end = 40.dp) + .alpha(if (screenState.value == StartingScreenState.SHOW_CARD) 0f else 1f),) } AnimatedVisibility( visible = screenState.value == StartingScreenState.MEET_TANGEM, enter = slideInVertically() { it / 2 } ) { - Text( - text = text?.let { stringResource(text) } ?: "", - fontSize = 60.sp, - fontWeight = FontWeight.SemiBold, + AutoSizeText(text = text?.let { stringResource(text) } ?: "", textStyle = style, modifier = Modifier - .padding(start = 40.dp, end = 40.dp), - color = Color.White, - textAlign = TextAlign.Center + .padding(start = 40.dp, end = 40.dp) ) } diff --git a/app/src/main/java/com/tangem/tap/features/home/compose/HomeButtons.kt b/app/src/main/java/com/tangem/tap/features/home/compose/HomeButtons.kt index 0c223b4096..1791cf0455 100644 --- a/app/src/main/java/com/tangem/tap/features/home/compose/HomeButtons.kt +++ b/app/src/main/java/com/tangem/tap/features/home/compose/HomeButtons.kt @@ -9,10 +9,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.tangem.wallet.R -import androidx.compose.foundation.layout.fillMaxWidth as fillMaxWidth1 @Composable fun HomeButtons( @@ -25,13 +25,13 @@ fun HomeButtons( Row( horizontalArrangement = Arrangement.SpaceEvenly, - modifier = modifier.fillMaxWidth1() + modifier = modifier.fillMaxWidth() ) { - Spacer(modifier = Modifier.size(16.dp)) Button( modifier = Modifier .weight(1f) - .height(42.dp), + .height(42.dp) + , onClick = onScanButtonClick, colors = ButtonDefaults.textButtonColors( backgroundColor = if (isDarkBackground) darkColorBackground else Color.White, @@ -41,7 +41,8 @@ fun HomeButtons( Text( text = stringResource(id = R.string.home_button_scan), fontWeight = FontWeight.Medium, - fontSize = 16.sp + fontSize = 16.sp, + textAlign = TextAlign.Center ) } Spacer(modifier = Modifier.size(8.dp)) @@ -58,9 +59,9 @@ fun HomeButtons( Text( text = stringResource(id = R.string.home_button_order), fontWeight = FontWeight.Medium, - fontSize = 16.sp + fontSize = 16.sp, + textAlign = TextAlign.Center ) } - Spacer(modifier = Modifier.size(16.dp)) } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/home/compose/Stories.kt b/app/src/main/java/com/tangem/tap/features/home/compose/Stories.kt index 59b7355b6c..c1a434ade6 100644 --- a/app/src/main/java/com/tangem/tap/features/home/compose/Stories.kt +++ b/app/src/main/java/com/tangem/tap/features/home/compose/Stories.kt @@ -54,28 +54,46 @@ fun StoriesScreen( Modifier .fillMaxSize() .background(Color(0xFF090E13)) - .pointerInput(Unit) { - val maxWidth = this.size.width - detectTapGestures( - onPress = { - val pressStartTime = System.currentTimeMillis() - isPressed.value = true - this.tryAwaitRelease() - val pressEndTime = System.currentTimeMillis() - val totalPressTime = pressEndTime - pressStartTime - if (totalPressTime < 200) { - val isTapOnRightTwoTiers = (it.x > (maxWidth / 2)) - if (isTapOnRightTwoTiers) { - goToNextScreen() - } else { - goToPreviousScreen() - } - } - isPressed.value = false - }, - ) - } ) { + Row( + Modifier.fillMaxSize() + ) { + Box( + Modifier + .weight(1f) + .fillMaxHeight() + .pointerInput(isPressed) { + detectTapGestures( + onPress = { + val pressStartTime = System.currentTimeMillis() + isPressed.value = true + this.tryAwaitRelease() + val pressEndTime = System.currentTimeMillis() + val totalPressTime = pressEndTime - pressStartTime + if (totalPressTime < 200) goToPreviousScreen() + isPressed.value = false + }, + ) + } + ) + Box( + Modifier.weight(1f) + .fillMaxHeight() + .pointerInput(isPressed) { + detectTapGestures( + onPress = { + val pressStartTime = System.currentTimeMillis() + isPressed.value = true + this.tryAwaitRelease() + val pressEndTime = System.currentTimeMillis() + val totalPressTime = pressEndTime - pressStartTime + if (totalPressTime < 200) goToNextScreen() + isPressed.value = false + }, + ) + } + ) + } if (!isDarkBackground) { Image( painter = painterResource(id = R.drawable.ic_overlay), @@ -87,9 +105,8 @@ fun StoriesScreen( } Column( horizontalAlignment = Alignment.CenterHorizontally, - modifier = - Modifier - .fillMaxSize() + verticalArrangement = Arrangement.Center, + modifier = Modifier.fillMaxWidth() ) { Spacer(modifier = Modifier.size(24.dp)) StoriesProgressBar( @@ -111,12 +128,6 @@ fun StoriesScreen( .align(Alignment.Start), colorFilter = if (isDarkBackground) null else ColorFilter.tint(Color.Black) ) - } - Column( - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center, - modifier = Modifier.fillMaxWidth() - ) { when (currentStep.value) { 1 -> FirstStoriesContent(pause, stepDuration) { hideContent.value = it } 2 -> StoriesRevolutionaryWallet() @@ -130,7 +141,8 @@ fun StoriesScreen( isDarkBackground = isDarkBackground, modifier = Modifier .align(Alignment.BottomCenter) - .padding(37.dp), + .padding(37.dp) + .fillMaxWidth(), onScanButtonClick = onScanButtonClick, onShopButtonClick = onShopButtonClick ) diff --git a/app/src/main/java/com/tangem/tap/features/home/compose/StoriesGeneralContent.kt b/app/src/main/java/com/tangem/tap/features/home/compose/StoriesGeneralContent.kt index 3f9ba4c0a4..b12be36802 100644 --- a/app/src/main/java/com/tangem/tap/features/home/compose/StoriesGeneralContent.kt +++ b/app/src/main/java/com/tangem/tap/features/home/compose/StoriesGeneralContent.kt @@ -61,7 +61,7 @@ fun StoriesGeneralContent( Image( painter = painterResource(id = imageSource), contentDescription = null, - contentScale = ContentScale.FillWidth, + contentScale = if(isDarkBackground) ContentScale.Inside else ContentScale.FillWidth, modifier = Modifier.fillMaxWidth() ) } diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/ui/TwinsCardsFragment.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/ui/TwinsCardsFragment.kt index c16bc7476d..b1c97b64ee 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/ui/TwinsCardsFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/ui/TwinsCardsFragment.kt @@ -332,8 +332,8 @@ class TwinsCardsFragment : BaseOnboardingFragment() { store.dispatch(TwinCardsAction.ShowAddressInfoDialog) } } else { - btnAlternativeAction.setText(R.string.onboarding_button_receive_crypto) - btnAlternativeAction.setOnClickListener { + btnMainAction.setText(R.string.onboarding_button_receive_crypto) + btnMainAction.setOnClickListener { store.dispatch(TwinCardsAction.ShowAddressInfoDialog) } diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt index 70f062d9ea..9abbebd018 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt @@ -124,10 +124,15 @@ private fun handleWalletAction(action: Action) { } else { null } - BackupAction.IntroduceBackup(url) + if (walletState.backupState.backupStep == BackupStep.InitBackup || + walletState.backupState.backupStep == BackupStep.Finished) { + BackupAction.IntroduceBackup(url) + } else { + null + } } } - store.dispatch(newAction) + newAction?.let { store.dispatch(it) } } OnboardingWalletAction.OnBackPressed -> { when (walletState.backupState.backupStep) { diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt index fa2071d32d..056eb28b12 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt @@ -204,7 +204,7 @@ class OnboardingWalletFragment : Fragment(R.layout.fragment_onboarding_wallet), viewPagerBackupInfo.hide() tabLayoutBackupInfo.hide() - imvSecondBackupCard.show() + imvFirstBackupCard.show() imvSecondBackupCard.show() } @@ -236,12 +236,15 @@ class OnboardingWalletFragment : Fragment(R.layout.fragment_onboarding_wallet), tvHeader.text = getText(R.string.onboarding_title_one_backup_card) tvBody.text = getText(R.string.onboarding_subtitle_one_backup_card) + cardsWidget.toFan(false) cardsWidget.getFirstBackupCardView().animate().alpha(1f).setDuration(400) cardsWidget.getSecondBackupCardView().alpha = 0.2f } 2 -> { tvHeader.text = getText(R.string.onboarding_title_two_backup_cards) tvBody.text = getText(R.string.onboarding_subtitle_two_backup_cards) + + cardsWidget.toFan(false) cardsWidget.getFirstBackupCardView().alpha = 1f cardsWidget.getSecondBackupCardView().animate().alpha(1f).setDuration(400) } diff --git a/app/src/main/java/com/tangem/tap/features/send/ui/stateSubscribers/SendStateSubscriber.kt b/app/src/main/java/com/tangem/tap/features/send/ui/stateSubscribers/SendStateSubscriber.kt index ac785194fd..3c49da49fb 100644 --- a/app/src/main/java/com/tangem/tap/features/send/ui/stateSubscribers/SendStateSubscriber.kt +++ b/app/src/main/java/com/tangem/tap/features/send/ui/stateSubscribers/SendStateSubscriber.kt @@ -230,7 +230,7 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : } private fun handleFeeState(fg: SendFragment, state: FeeState) = with(fg.binding.clNetworkFee) { - chipGroup.fitChipsByGroupWidth() +// chipGroup.fitChipsByGroupWidth() fg.view?.findViewById(R.id.clNetworkFee)?.show(state.mainLayoutIsVisible) flExpandCollapse.imvExpandCollapse.rotation = if (state.controlsLayoutIsVisible) 0f else 180f llFeeControlsContainer.show(state.controlsLayoutIsVisible) diff --git a/app/src/main/java/com/tangem/tap/features/shop/redux/ShopAction.kt b/app/src/main/java/com/tangem/tap/features/shop/redux/ShopAction.kt index 9f7e7937b4..500cc39285 100644 --- a/app/src/main/java/com/tangem/tap/features/shop/redux/ShopAction.kt +++ b/app/src/main/java/com/tangem/tap/features/shop/redux/ShopAction.kt @@ -34,5 +34,7 @@ sealed class ShopAction : Action { data class SelectProduct(val productType: ProductType) : ShopAction() + object FinishSuccessfulOrder : ShopAction() + object ResetState : ShopAction() } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/shop/redux/ShopMiddleware.kt b/app/src/main/java/com/tangem/tap/features/shop/redux/ShopMiddleware.kt index 605d5fe9d2..464a99de96 100644 --- a/app/src/main/java/com/tangem/tap/features/shop/redux/ShopMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/shop/redux/ShopMiddleware.kt @@ -110,7 +110,18 @@ private fun handle(action: Action) { } ShopAction.StartWebCheckout -> { store.dispatchOpenUrl(shopService.getCheckoutUrl(shopState.selectedProduct)) + store.dispatch(ShopAction.FinishSuccessfulOrder) } + + is ShopAction.FinishSuccessfulOrder -> { + scope.launch { + shopService.waitForCheckout( + productType = shopState.selectedProduct, + analyticsHandler = store.state.globalState.analyticsHandlers + ) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/shop/redux/ShopReducer.kt b/app/src/main/java/com/tangem/tap/features/shop/redux/ShopReducer.kt index 8d4b4ff2a7..ee12f53109 100644 --- a/app/src/main/java/com/tangem/tap/features/shop/redux/ShopReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/shop/redux/ShopReducer.kt @@ -63,6 +63,7 @@ private fun internalReduce(action: Action, state: ShopState): ShopState { ShopAction.BuyWithGooglePay.UserCancelled -> { state } + ShopAction.FinishSuccessfulOrder -> state ShopAction.ResetState -> ShopState() } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/shop/ui/ShopFragment.kt b/app/src/main/java/com/tangem/tap/features/shop/ui/ShopFragment.kt index b8ce7afd51..96e2c8619c 100644 --- a/app/src/main/java/com/tangem/tap/features/shop/ui/ShopFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/shop/ui/ShopFragment.kt @@ -137,7 +137,7 @@ class ShopFragment : BaseStoreFragment(R.layout.fragment_shop), StoreSubscriber< .setListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator) { super.onAnimationEnd(animation) - imvThird?.show(show) + imvThird.show(show) } }) } diff --git a/app/src/main/res/layout/fragment_shop.xml b/app/src/main/res/layout/fragment_shop.xml index 9ad04edbdd..dbeba6afe6 100644 --- a/app/src/main/res/layout/fragment_shop.xml +++ b/app/src/main/res/layout/fragment_shop.xml @@ -53,7 +53,8 @@ android:layout_width="match_parent" android:layout_height="0dp" android:layout_marginStart="36dp" - android:layout_marginTop="24dp" + android:paddingTop="16dp" + android:paddingBottom="44dp" android:layout_marginEnd="36dp" android:layout_weight="1" app:layout_constraintBottom_toTopOf="@+id/tv_header" @@ -109,7 +110,6 @@ android:id="@+id/tv_header" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="44dp" android:layout_marginBottom="14dp" android:fontFamily="sans-serif-medium" android:text="@string/shop_one_wallet" @@ -343,7 +343,7 @@ android:layout_height="48sp" android:layout_marginStart="14dp" android:layout_marginEnd="14dp" - android:layout_marginBottom="70dp" + android:layout_marginBottom="20dp" android:text="@string/shop_buy_now" android:textAlignment="center" android:textSize="16sp" /> diff --git a/app/src/main/res/layout/layout_send_fee.xml b/app/src/main/res/layout/layout_send_fee.xml index d1c30381f6..f54f8f8bfe 100644 --- a/app/src/main/res/layout/layout_send_fee.xml +++ b/app/src/main/res/layout/layout_send_fee.xml @@ -1,6 +1,7 @@ - + android:clipChildren="false"> - + android:paddingStart="16dp" + android:paddingEnd="16dp" + android:translationY="-8dp" + app:selectionRequired="true" + app:singleLine="true" + app:singleSelection="true"> - + - + - + + + + + app:layout_constraintGuide_percent="0.5" />