From c80b2b0e73f3a97d6fd7ba975c5ee82ee92f7687 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 2 Mar 2022 15:52:54 +0300 Subject: [PATCH 01/13] Updated on 2026-08-14 --- app/src/main/assets/tangem-app-config | 2 +- .../stateSubscribers/SendStateSubscriber.kt | 2 +- app/src/main/res/layout/layout_send_fee.xml | 59 +++++++++++-------- 3 files changed, 36 insertions(+), 27 deletions(-) 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/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/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"> - + - + - + + + + Date: Wed, 2 Mar 2022 19:29:13 +0300 Subject: [PATCH 02/13] Updated on 2026-08-14 --- .../tap/common/analytics/AnalyticsHandler.kt | 15 +++++++++- .../analytics/AppsFlyerAnalyticsHandler.kt | 29 +++++++++++++++++++ .../analytics/FirebaseAnalyticsHandler.kt | 28 ++++++++++++++++++ .../analytics/GlobalAnalyticsHandler.kt | 13 +++++++++ .../tap/common/shop/TangemShopService.kt | 14 +++++++++ .../tap/features/shop/redux/ShopAction.kt | 2 ++ .../tap/features/shop/redux/ShopMiddleware.kt | 11 +++++++ .../tap/features/shop/redux/ShopReducer.kt | 1 + .../tap/features/shop/ui/ShopFragment.kt | 2 +- 9 files changed, 113 insertions(+), 2 deletions(-) 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/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) } }) } From 551c37ad14e5280c45e01f727c659072ae4f9915 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 2 Mar 2022 19:29:53 +0300 Subject: [PATCH 03/13] Updated on 2026-08-14 --- .../onboarding/products/twins/ui/TwinsCardsFragment.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) 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..e2c923a947 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 @@ -6,7 +6,6 @@ import android.view.View import android.view.animation.OvershootInterpolator import androidx.annotation.LayoutRes import androidx.constraintlayout.widget.ConstraintSet -import androidx.core.view.isVisible import androidx.transition.TransitionInflater import androidx.transition.TransitionManager import com.squareup.picasso.Picasso @@ -332,8 +331,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) } From 8389b17926f72b16a0039792233db5825848564b Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 2 Mar 2022 19:30:35 +0300 Subject: [PATCH 04/13] Updated on 2026-08-14 --- app/src/main/java/com/tangem/tap/domain/TapWorkarounds.kt | 2 ++ 1 file changed, 2 insertions(+) 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, ) } From 8de3e41b928d76e6dacaf66d4c92186925cc9954 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 2 Mar 2022 19:31:33 +0300 Subject: [PATCH 05/13] Updated on 2026-08-14 --- app/src/main/res/layout/layout_wallet_long_buttons.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/layout_wallet_long_buttons.xml b/app/src/main/res/layout/layout_wallet_long_buttons.xml index d63cb4681a..fa2a403d60 100644 --- a/app/src/main/res/layout/layout_wallet_long_buttons.xml +++ b/app/src/main/res/layout/layout_wallet_long_buttons.xml @@ -27,7 +27,7 @@ android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintGuide_percent="0.37" /> + app:layout_constraintGuide_percent="0.5" /> Date: Wed, 2 Mar 2022 19:32:59 +0300 Subject: [PATCH 06/13] Updated on 2026-08-14 --- .../com/tangem/tap/common/shop/shopify/ShopifyService.kt | 3 +-- .../products/wallet/redux/OnboardingWalletMiddleware.kt | 9 +++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) 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..e97662d28f 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 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) { From 0ba9f528e1dfa5ac2e63cbfbfb65c9bb99a7c5cc Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 2 Mar 2022 19:34:09 +0300 Subject: [PATCH 07/13] Updated on 2026-08-14 --- .../products/wallet/ui/OnboardingWalletFragment.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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) } From 5a1828e9bd89f77d11969a5012d15a4be6b0895d Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 2 Mar 2022 19:35:14 +0300 Subject: [PATCH 08/13] Updated on 2026-08-14 --- .../tasks/product/CreateProductWalletTask.kt | 15 ++++++++++++++- .../tap/domain/tasks/product/ScanProductTask.kt | 3 +-- 2 files changed, 15 insertions(+), 3 deletions(-) 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( From 531affeb7c8ffe23309e9903ac2f09061babb6cd Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 2 Mar 2022 19:37:10 +0300 Subject: [PATCH 09/13] Updated on 2026-08-14 --- .../tap/features/home/compose/AutoSizeText.kt | 45 +++++++++++++++++++ .../home/compose/FirstStoriesContent.kt | 33 ++++++-------- .../tap/features/home/compose/HomeButtons.kt | 15 ++++--- .../tap/features/home/compose/Stories.kt | 14 ++---- .../home/compose/StoriesGeneralContent.kt | 2 +- 5 files changed, 72 insertions(+), 37 deletions(-) create mode 100644 app/src/main/java/com/tangem/tap/features/home/compose/AutoSizeText.kt 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..761ca5dd22 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 @@ -87,9 +87,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 +110,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 +123,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() ) } From 542c1d341f495032b2872ce83eb1e7702e6bb4b9 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 2 Mar 2022 19:42:49 +0300 Subject: [PATCH 10/13] Updated on 2026-08-14 --- .../tap/features/home/compose/Stories.kt | 60 ++++++++++++------- .../products/twins/ui/TwinsCardsFragment.kt | 1 + 2 files changed, 40 insertions(+), 21 deletions(-) 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 761ca5dd22..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), 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 e2c923a947..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 @@ -6,6 +6,7 @@ import android.view.View import android.view.animation.OvershootInterpolator import androidx.annotation.LayoutRes import androidx.constraintlayout.widget.ConstraintSet +import androidx.core.view.isVisible import androidx.transition.TransitionInflater import androidx.transition.TransitionManager import com.squareup.picasso.Picasso From a2e468b93131b7c8b17315ad66bea62d265ffb41 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 2 Mar 2022 19:43:37 +0300 Subject: [PATCH 11/13] Updated on 2026-08-14 --- app/src/main/res/layout/fragment_shop.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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" /> From 531c3a84fb0dbcadf1a5c00100dc0def02d5a4d8 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 2 Mar 2022 19:52:18 +0300 Subject: [PATCH 12/13] Updated on 2026-08-14 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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" From 654b8d11b3341ef928096061164eefac5f461b1f Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 2 Mar 2022 20:01:20 +0300 Subject: [PATCH 13/13] Updated on 2026-08-14 --- .../java/com/tangem/tap/common/shop/shopify/ShopifyService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 e97662d28f..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 @@ -84,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 }