Updated on 2026-08-14

This commit is contained in:
Tangem 2022-10-20 22:20:27 +05:00
parent eb1a711732
commit cee1bec47e
6 changed files with 246 additions and 280 deletions

View file

@ -84,9 +84,9 @@
<inspection_tool class="SimpleRedundantLet" enabled="true" level="ERROR" enabled_by_default="true" /> <inspection_tool class="SimpleRedundantLet" enabled="true" level="ERROR" enabled_by_default="true" />
<inspection_tool class="SimplifyWhenWithBooleanConstantCondition" enabled="true" level="ERROR" enabled_by_default="true" /> <inspection_tool class="SimplifyWhenWithBooleanConstantCondition" enabled="true" level="ERROR" enabled_by_default="true" />
<inspection_tool class="UnnecessaryOptInAnnotation" enabled="true" level="ERROR" enabled_by_default="true" /> <inspection_tool class="UnnecessaryOptInAnnotation" enabled="true" level="ERROR" enabled_by_default="true" />
<inspection_tool class="UnnecessaryVariable" enabled="true" level="ERROR" enabled_by_default="true" /> <inspection_tool class="UnnecessaryVariable" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="UnusedReceiverParameter" enabled="true" level="ERROR" enabled_by_default="true" /> <inspection_tool class="UnusedReceiverParameter" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="UnusedSymbol" enabled="true" level="ERROR" enabled_by_default="true" /> <inspection_tool class="UnusedSymbol" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="WhenWithOnlyElse" enabled="true" level="ERROR" enabled_by_default="true" /> <inspection_tool class="WhenWithOnlyElse" enabled="true" level="ERROR" enabled_by_default="true" />
</profile> </profile>
</component> </component>

View file

@ -1,19 +1,14 @@
package com.tangem.tap.features.onboarding.products.note package com.tangem.tap.features.onboarding.products.note
import android.graphics.Bitmap
import android.graphics.drawable.BitmapDrawable
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.view.animation.OvershootInterpolator import android.view.animation.OvershootInterpolator
import android.widget.ImageView
import androidx.annotation.LayoutRes import androidx.annotation.LayoutRes
import androidx.constraintlayout.widget.ConstraintSet import androidx.constraintlayout.widget.ConstraintSet
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.transition.TransitionManager import androidx.transition.TransitionManager
import coil.load import coil.load
import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.Blockchain
import com.tangem.tangem_sdk_new.extensions.fadeIn
import com.tangem.tangem_sdk_new.extensions.fadeOut
import com.tangem.tap.common.extensions.getDrawableCompat import com.tangem.tap.common.extensions.getDrawableCompat
import com.tangem.tap.common.extensions.stripZeroPlainString import com.tangem.tap.common.extensions.stripZeroPlainString
import com.tangem.tap.common.redux.navigation.ShareElement import com.tangem.tap.common.redux.navigation.ShareElement
@ -33,23 +28,18 @@ import com.tangem.wallet.R
class OnboardingNoteFragment : BaseOnboardingFragment<OnboardingNoteState>() { class OnboardingNoteFragment : BaseOnboardingFragment<OnboardingNoteState>() {
private var previousStep: OnboardingNoteStep = OnboardingNoteStep.None private var previousStep: OnboardingNoteStep = OnboardingNoteStep.None
private val mainBinding by lazy { binding.vMain }
private lateinit var btnRefreshBalanceWidget: RefreshBalanceWidget private lateinit var btnRefreshBalanceWidget: RefreshBalanceWidget
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
postponeEnterTransition()
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
addBackPressHandler(this) addBackPressHandler(this)
binding.onboardingTopContainer.imvFrontCard.transitionName = ShareElement.imvFrontCard mainBinding.onboardingTopContainer.imvFrontCard.transitionName = ShareElement.imvFrontCard
startPostponedEnterTransition()
binding.toolbar.setTitle(R.string.onboarding_title) binding.toolbar.setTitle(R.string.onboarding_title)
btnRefreshBalanceWidget = RefreshBalanceWidget(binding.onboardingTopContainer.onboardingWalletContainer) btnRefreshBalanceWidget = RefreshBalanceWidget(mainBinding.onboardingTopContainer.onboardingWalletContainer)
store.dispatch(OnboardingNoteAction.LoadCardArtwork) store.dispatch(OnboardingNoteAction.LoadCardArtwork)
store.dispatch(OnboardingNoteAction.DetermineStepOfScreen) store.dispatch(OnboardingNoteAction.DetermineStepOfScreen)
@ -67,7 +57,7 @@ class OnboardingNoteFragment : BaseOnboardingFragment<OnboardingNoteState>() {
override fun newState(state: OnboardingNoteState) { override fun newState(state: OnboardingNoteState) {
if (activity == null || view == null) return if (activity == null || view == null) return
binding.onboardingTopContainer.imvFrontCard.load(state.cardArtworkUrl) { mainBinding.onboardingTopContainer.imvFrontCard.load(state.cardArtworkUrl) {
placeholder(R.drawable.card_placeholder_black) placeholder(R.drawable.card_placeholder_black)
error(R.drawable.card_placeholder_black) error(R.drawable.card_placeholder_black)
fallback(R.drawable.card_placeholder_black) fallback(R.drawable.card_placeholder_black)
@ -90,7 +80,7 @@ class OnboardingNoteFragment : BaseOnboardingFragment<OnboardingNoteState>() {
private fun setBalance(state: OnboardingNoteState) { private fun setBalance(state: OnboardingNoteState) {
if (state.walletBalance.currency.blockchain == Blockchain.Unknown) return if (state.walletBalance.currency.blockchain == Blockchain.Unknown) return
with (binding.onboardingTopContainer.onboardingTvBalance) { with(mainBinding.onboardingTopContainer.onboardingTvBalance) {
if (state.balanceCriticalError == null) { if (state.balanceCriticalError == null) {
val balanceValue = state.walletBalance.value.stripZeroPlainString() val balanceValue = state.walletBalance.value.stripZeroPlainString()
tvBalanceValue.text = balanceValue tvBalanceValue.text = balanceValue
@ -102,7 +92,7 @@ class OnboardingNoteFragment : BaseOnboardingFragment<OnboardingNoteState>() {
} }
} }
private fun setupNoneState() = with(binding.onboardingActionContainer) { private fun setupNoneState() = with(mainBinding.onboardingActionContainer) {
btnMainAction.isVisible = false btnMainAction.isVisible = false
btnAlternativeAction.isVisible = false btnAlternativeAction.isVisible = false
btnRefreshBalanceWidget.show(false) btnRefreshBalanceWidget.show(false)
@ -116,7 +106,7 @@ class OnboardingNoteFragment : BaseOnboardingFragment<OnboardingNoteState>() {
} }
private fun setupCreateWalletState(state: OnboardingNoteState) = private fun setupCreateWalletState(state: OnboardingNoteState) =
with(binding.onboardingActionContainer) { with(mainBinding.onboardingActionContainer) {
btnMainAction.setText(R.string.onboarding_create_wallet_button_create_wallet) btnMainAction.setText(R.string.onboarding_create_wallet_button_create_wallet)
btnMainAction.setOnClickListener { store.dispatch(OnboardingNoteAction.CreateWallet) } btnMainAction.setOnClickListener { store.dispatch(OnboardingNoteAction.CreateWallet) }
btnAlternativeAction.setText(R.string.onboarding_button_what_does_it_mean) btnAlternativeAction.setText(R.string.onboarding_button_what_does_it_mean)
@ -127,15 +117,15 @@ class OnboardingNoteFragment : BaseOnboardingFragment<OnboardingNoteState>() {
tvHeader.setText(R.string.onboarding_create_wallet_header) tvHeader.setText(R.string.onboarding_create_wallet_header)
tvBody.setText(R.string.onboarding_create_wallet_body) tvBody.setText(R.string.onboarding_create_wallet_body)
binding.onboardingTopContainer.imvCardBackground.setBackgroundDrawable( mainBinding.onboardingTopContainer.imvCardBackground.setBackgroundDrawable(
requireContext().getDrawableCompat(R.drawable.shape_circle) requireContext().getDrawableCompat(R.drawable.shape_circle),
) )
updateConstraints(state.currentStep, R.layout.lp_onboarding_create_wallet) updateConstraints(state.currentStep, R.layout.lp_onboarding_create_wallet)
btnAlternativeAction.isVisible = false // temporary btnAlternativeAction.isVisible = false // temporary
} }
private fun setupTopUpWalletState(state: OnboardingNoteState) = with(binding.onboardingActionContainer) { private fun setupTopUpWalletState(state: OnboardingNoteState) = with(mainBinding.onboardingActionContainer) {
if (state.isBuyAllowed) { if (state.isBuyAllowed) {
btnMainAction.setText(R.string.onboarding_top_up_button_but_crypto) btnMainAction.setText(R.string.onboarding_top_up_button_but_crypto)
btnMainAction.setOnClickListener { btnMainAction.setOnClickListener {
@ -163,7 +153,7 @@ class OnboardingNoteFragment : BaseOnboardingFragment<OnboardingNoteState>() {
state.walletBalance.amountToCreateAccount?.let { amount -> state.walletBalance.amountToCreateAccount?.let { amount ->
val tvBodyMessage = getString( val tvBodyMessage = getString(
R.string.onboarding_top_up_body_no_account_error, R.string.onboarding_top_up_body_no_account_error,
amount, state.walletBalance.currency.currencySymbol amount, state.walletBalance.currency.currencySymbol,
) )
tvBody.text = tvBodyMessage tvBody.text = tvBodyMessage
} }
@ -175,12 +165,13 @@ class OnboardingNoteFragment : BaseOnboardingFragment<OnboardingNoteState>() {
store.dispatch(OnboardingNoteAction.Balance.Update) store.dispatch(OnboardingNoteAction.Balance.Update)
} }
} }
binding.onboardingTopContainer.imvCardBackground
.setBackgroundDrawable(requireContext().getDrawableCompat(R.drawable.shape_rectangle_rounded_8)) val drawable = requireContext().getDrawableCompat(R.drawable.shape_rectangle_rounded_8)
mainBinding.onboardingTopContainer.imvCardBackground.setBackgroundDrawable(drawable)
updateConstraints(state.currentStep, R.layout.lp_onboarding_topup_wallet) updateConstraints(state.currentStep, R.layout.lp_onboarding_topup_wallet)
} }
private fun setupDoneState(state: OnboardingNoteState) = with(binding.onboardingActionContainer) { private fun setupDoneState(state: OnboardingNoteState) = with(mainBinding.onboardingActionContainer) {
btnMainAction.setText(R.string.onboarding_done_button_continue) btnMainAction.setText(R.string.onboarding_done_button_continue)
btnMainAction.setOnClickListener { btnMainAction.setOnClickListener {
showConfetti(false) showConfetti(false)
@ -188,15 +179,15 @@ class OnboardingNoteFragment : BaseOnboardingFragment<OnboardingNoteState>() {
} }
btnAlternativeAction.isVisible = false btnAlternativeAction.isVisible = false
btnAlternativeAction.setText("") btnAlternativeAction.text = ""
btnAlternativeAction.setOnClickListener { } btnAlternativeAction.setOnClickListener { }
btnRefreshBalanceWidget.mainView.setOnClickListener(null) btnRefreshBalanceWidget.mainView.setOnClickListener(null)
tvHeader.setText(R.string.onboarding_done_header) tvHeader.setText(R.string.onboarding_done_header)
tvBody.setText(R.string.onboarding_done_body) tvBody.setText(R.string.onboarding_done_body)
binding.onboardingTopContainer.imvCardBackground.setBackgroundDrawable( mainBinding.onboardingTopContainer.imvCardBackground.setBackgroundDrawable(
requireContext().getDrawableCompat(R.drawable.shape_rectangle_rounded_8) requireContext().getDrawableCompat(R.drawable.shape_rectangle_rounded_8),
) )
updateConstraints(state.currentStep, R.layout.lp_onboarding_done_activation) updateConstraints(state.currentStep, R.layout.lp_onboarding_done_activation)
} }
@ -204,7 +195,7 @@ class OnboardingNoteFragment : BaseOnboardingFragment<OnboardingNoteState>() {
private fun updateConstraints(currentStep: OnboardingNoteStep, @LayoutRes layoutId: Int) { private fun updateConstraints(currentStep: OnboardingNoteStep, @LayoutRes layoutId: Int) {
if (this.previousStep == currentStep) return if (this.previousStep == currentStep) return
with(binding.onboardingTopContainer) { with(mainBinding.onboardingTopContainer) {
val constraintSet = ConstraintSet() val constraintSet = ConstraintSet()
constraintSet.clone(requireContext(), layoutId) constraintSet.clone(requireContext(), layoutId)
constraintSet.applyTo(onboardingWalletContainer) constraintSet.applyTo(onboardingWalletContainer)
@ -214,12 +205,3 @@ class OnboardingNoteFragment : BaseOnboardingFragment<OnboardingNoteState>() {
} }
} }
} }
fun ImageView.swapToBitmapDrawable(bitmap: Bitmap?, duration: Long = 200) {
if (drawable is BitmapDrawable && (drawable as BitmapDrawable).bitmap == bitmap) return
fadeOut(duration) {
setImageBitmap(bitmap)
fadeIn(duration)
}
}

View file

@ -24,17 +24,13 @@ import com.tangem.wallet.R
*/ */
class OnboardingOtherCardsFragment : BaseOnboardingFragment<OnboardingOtherCardsState>() { class OnboardingOtherCardsFragment : BaseOnboardingFragment<OnboardingOtherCardsState>() {
override fun onCreate(savedInstanceState: Bundle?) { private val mainBinding by lazy { binding.vMain }
super.onCreate(savedInstanceState)
postponeEnterTransition()
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
addBackPressHandler(this) addBackPressHandler(this)
binding.onboardingTopContainer.imvFrontCard.transitionName = ShareElement.imvFrontCard mainBinding.onboardingTopContainer.imvFrontCard.transitionName = ShareElement.imvFrontCard
startPostponedEnterTransition()
binding.toolbar.setTitle(R.string.onboarding_title) binding.toolbar.setTitle(R.string.onboarding_title)
store.dispatch(OnboardingOtherCardsAction.LoadCardArtwork) store.dispatch(OnboardingOtherCardsAction.LoadCardArtwork)
@ -54,7 +50,7 @@ class OnboardingOtherCardsFragment : BaseOnboardingFragment<OnboardingOtherCards
if (activity == null || view == null) return if (activity == null || view == null) return
if (state.currentStep == OnboardingOtherCardsStep.None) return if (state.currentStep == OnboardingOtherCardsStep.None) return
binding.onboardingTopContainer.imvFrontCard.load(state.cardArtworkUrl) { mainBinding.onboardingTopContainer.imvFrontCard.load(state.cardArtworkUrl) {
placeholder(R.drawable.card_placeholder_black) placeholder(R.drawable.card_placeholder_black)
error(R.drawable.card_placeholder_black) error(R.drawable.card_placeholder_black)
fallback(R.drawable.card_placeholder_black) fallback(R.drawable.card_placeholder_black)
@ -70,9 +66,7 @@ class OnboardingOtherCardsFragment : BaseOnboardingFragment<OnboardingOtherCards
showConfetti(state.showConfetti) showConfetti(state.showConfetti)
} }
private fun setupCreateWalletState() = with(binding) { private fun setupCreateWalletState() = with(mainBinding.onboardingActionContainer) {
with(onboardingActionContainer) {
btnMainAction.setText(R.string.onboarding_create_wallet_button_create_wallet) btnMainAction.setText(R.string.onboarding_create_wallet_button_create_wallet)
btnMainAction.setOnClickListener { store.dispatch(OnboardingOtherCardsAction.CreateWallet) } btnMainAction.setOnClickListener { store.dispatch(OnboardingOtherCardsAction.CreateWallet) }
btnAlternativeAction.setText(R.string.onboarding_button_what_does_it_mean) btnAlternativeAction.setText(R.string.onboarding_button_what_does_it_mean)
@ -82,17 +76,15 @@ class OnboardingOtherCardsFragment : BaseOnboardingFragment<OnboardingOtherCards
tvBody.setText(R.string.onboarding_create_wallet_body) tvBody.setText(R.string.onboarding_create_wallet_body)
btnAlternativeAction.isVisible = false // temporary btnAlternativeAction.isVisible = false // temporary
}
mainBinding.onboardingTopContainer.imvCardBackground.setBackgroundDrawable(
binding.onboardingTopContainer.imvCardBackground.setBackgroundDrawable( requireContext().getDrawableCompat(R.drawable.shape_circle),
requireContext().getDrawableCompat(R.drawable.shape_circle)
) )
updateConstraints(R.layout.lp_onboarding_create_wallet) updateConstraints(R.layout.lp_onboarding_create_wallet)
} }
private fun setupDoneState() = with(binding.onboardingActionContainer) { private fun setupDoneState() = with(mainBinding.onboardingActionContainer) {
btnMainAction.setText(R.string.onboarding_done_button_continue) btnMainAction.setText(R.string.onboarding_done_button_continue)
btnMainAction.setOnClickListener { btnMainAction.setOnClickListener {
showConfetti(false) showConfetti(false)
@ -106,14 +98,13 @@ class OnboardingOtherCardsFragment : BaseOnboardingFragment<OnboardingOtherCards
tvHeader.setText(R.string.onboarding_done_header) tvHeader.setText(R.string.onboarding_done_header)
tvBody.setText(R.string.onboarding_done_body) tvBody.setText(R.string.onboarding_done_body)
binding.onboardingTopContainer.imvCardBackground?.setBackgroundDrawable( mainBinding.onboardingTopContainer.imvCardBackground?.setBackgroundDrawable(
requireContext().getDrawableCompat(R.drawable.shape_rectangle_rounded_8) requireContext().getDrawableCompat(R.drawable.shape_rectangle_rounded_8),
) )
updateConstraints(R.layout.lp_onboarding_done) updateConstraints(R.layout.lp_onboarding_done)
} }
private fun updateConstraints(@LayoutRes layoutId: Int) { private fun updateConstraints(@LayoutRes layoutId: Int) = with(mainBinding.onboardingTopContainer) {
with(binding.onboardingTopContainer) {
val constraintSet = ConstraintSet() val constraintSet = ConstraintSet()
constraintSet.clone(requireContext(), layoutId) constraintSet.clone(requireContext(), layoutId)
constraintSet.applyTo(onboardingWalletContainer) constraintSet.applyTo(onboardingWalletContainer)
@ -122,4 +113,3 @@ class OnboardingOtherCardsFragment : BaseOnboardingFragment<OnboardingOtherCards
TransitionManager.beginDelayedTransition(onboardingWalletContainer, transition) TransitionManager.beginDelayedTransition(onboardingWalletContainer, transition)
} }
} }
}

View file

@ -40,6 +40,7 @@ import com.tangem.wallet.databinding.LayoutOnboardingContainerTopBinding
class TwinsCardsFragment : BaseOnboardingFragment<TwinCardsState>() { class TwinsCardsFragment : BaseOnboardingFragment<TwinCardsState>() {
private val mainBinding by lazy { binding.vMain }
private var previousStep = TwinCardsStep.None private var previousStep = TwinCardsStep.None
private lateinit var twinsWidget: TwinsCardWidget private lateinit var twinsWidget: TwinsCardWidget
@ -47,7 +48,6 @@ class TwinsCardsFragment : BaseOnboardingFragment<TwinCardsState>() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
postponeEnterTransition()
store.dispatch(TwinCardsAction.Init) store.dispatch(TwinCardsAction.Init)
} }
@ -66,30 +66,30 @@ class TwinsCardsFragment : BaseOnboardingFragment<TwinCardsState>() {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
addBackPressHandler(this) addBackPressHandler(this)
reconfigureLayoutForTwins(binding.onboardingTopContainer) reconfigureLayoutForTwins(mainBinding.onboardingTopContainer)
val typedValue = TypedValue() val typedValue = TypedValue()
resources.getValue(R.dimen.device_scale_factor_for_twins_welcome, typedValue, true) resources.getValue(R.dimen.device_scale_factor_for_twins_welcome, typedValue, true)
val deviceScaleFactorForWelcomeState = typedValue.float val deviceScaleFactorForWelcomeState = typedValue.float
twinsWidget = TwinsCardWidget( twinsWidget = TwinsCardWidget(
LeapfrogWidget(binding.onboardingTopContainer.cardsContainer), LeapfrogWidget(mainBinding.onboardingTopContainer.cardsContainer),
deviceScaleFactorForWelcomeState deviceScaleFactorForWelcomeState,
) { ) {
285f * deviceScaleFactorForWelcomeState 285f * deviceScaleFactorForWelcomeState
} }
btnRefreshBalanceWidget = btnRefreshBalanceWidget =
RefreshBalanceWidget(binding.onboardingTopContainer.onboardingWalletContainer) RefreshBalanceWidget(mainBinding.onboardingTopContainer.onboardingWalletContainer)
binding.toolbar.title = getText(R.string.twins_recreate_toolbar) binding.toolbar.title = getText(R.string.twins_recreate_toolbar)
binding.onboardingTopContainer.imvTwinFrontCard.load(Artwork.TWIN_CARD_1) { mainBinding.onboardingTopContainer.imvTwinFrontCard.load(Artwork.TWIN_CARD_1) {
placeholder(R.drawable.card_placeholder_black) placeholder(R.drawable.card_placeholder_black)
error(R.drawable.card_placeholder_black) error(R.drawable.card_placeholder_black)
fallback(R.drawable.card_placeholder_black) fallback(R.drawable.card_placeholder_black)
} }
binding.onboardingTopContainer.imvTwinBackCard.load(Artwork.TWIN_CARD_2) { mainBinding.onboardingTopContainer.imvTwinBackCard.load(Artwork.TWIN_CARD_2) {
placeholder(R.drawable.card_placeholder_white) placeholder(R.drawable.card_placeholder_white)
error(R.drawable.card_placeholder_white) error(R.drawable.card_placeholder_white)
fallback(R.drawable.card_placeholder_white) fallback(R.drawable.card_placeholder_white)
@ -143,7 +143,7 @@ class TwinsCardsFragment : BaseOnboardingFragment<TwinCardsState>() {
private fun setBalance(state: TwinCardsState) { private fun setBalance(state: TwinCardsState) {
if (state.walletBalance.currency.blockchain == Blockchain.Unknown) return if (state.walletBalance.currency.blockchain == Blockchain.Unknown) return
with(binding.onboardingTopContainer.onboardingTvBalance) { with(mainBinding.onboardingTopContainer.onboardingTvBalance) {
if (state.balanceCriticalError == null) { if (state.balanceCriticalError == null) {
val balanceValue = state.walletBalance.value.stripZeroPlainString() val balanceValue = state.walletBalance.value.stripZeroPlainString()
tvBalanceValue.text = balanceValue tvBalanceValue.text = balanceValue
@ -167,26 +167,26 @@ class TwinsCardsFragment : BaseOnboardingFragment<TwinCardsState>() {
} }
private fun setupWelcomeState(state: TwinCardsState, mainAction: VoidCallback) = private fun setupWelcomeState(state: TwinCardsState, mainAction: VoidCallback) =
with(binding.onboardingActionContainer) { with(mainBinding.onboardingActionContainer) {
twinsWidget.toWelcome(false) { startPostponedEnterTransition() } twinsWidget.toWelcome(false)
binding.onboardingTopContainer.onboardingTwinsWelcomeBg.root.show() mainBinding.onboardingTopContainer.onboardingTwinsWelcomeBg.root.show()
pbBinding.pbState.hide() pbBinding.pbState.hide()
tvHeader.setText(R.string.twins_onboarding_subtitle) tvHeader.setText(R.string.twins_onboarding_subtitle)
tvBody.text = getString( tvBody.text = getString(
R.string.twins_onboarding_description_format, R.string.twins_onboarding_description_format,
state.cardNumber?.pairIndexNumber() state.cardNumber?.pairIndexNumber(),
) )
btnMainAction.setText(R.string.common_continue) btnMainAction.setText(R.string.common_continue)
btnMainAction.setOnClickListener { mainAction() } btnMainAction.setOnClickListener { mainAction() }
} }
private fun setupWarningState(state: TwinCardsState) = with(binding.onboardingActionContainer) { private fun setupWarningState(state: TwinCardsState) = with(mainBinding.onboardingActionContainer) {
twinsWidget.toWelcome(false) { startPostponedEnterTransition() } twinsWidget.toWelcome(false)
binding.onboardingTopContainer.onboardingTwinsWelcomeBg.root.hide() mainBinding.onboardingTopContainer.onboardingTwinsWelcomeBg.root.hide()
pbBinding.pbState.hide() pbBinding.pbState.hide()
chbUnderstand.show() chbUnderstand.show()
@ -203,27 +203,26 @@ class TwinsCardsFragment : BaseOnboardingFragment<TwinCardsState>() {
} }
} }
private fun setupCreateFirstWalletState(state: TwinCardsState) = private fun setupCreateFirstWalletState(state: TwinCardsState) = with(mainBinding.onboardingActionContainer) {
with(binding.onboardingActionContainer) { mainBinding.onboardingTopContainer.onboardingTwinsWelcomeBg.root.hide()
binding.onboardingTopContainer.onboardingTwinsWelcomeBg.root.hide() mainBinding.onboardingTopContainer.onboardingTwinsWelcomeBg.bgCircleLarge.hide()
binding.onboardingTopContainer.onboardingTwinsWelcomeBg.bgCircleLarge.hide() mainBinding.onboardingTopContainer.onboardingTwinsWelcomeBg.bgCircleMedium.hide()
binding.onboardingTopContainer.onboardingTwinsWelcomeBg.bgCircleMedium.hide() mainBinding.onboardingTopContainer.onboardingTwinsWelcomeBg.bgCircleMin.hide()
binding.onboardingTopContainer.onboardingTwinsWelcomeBg.bgCircleMin.hide()
chbUnderstand.hide() chbUnderstand.hide()
pbBinding.pbState.show() pbBinding.pbState.show()
binding.onboardingTopContainer.onboardingWalletContainer.beginDelayedTransition() mainBinding.onboardingTopContainer.onboardingWalletContainer.beginDelayedTransition()
when (previousStep) { when (previousStep) {
TwinCardsStep.None -> { TwinCardsStep.None -> {
twinsWidget.toLeapfrog(false) { twinsWidget.toLeapfrog(false) {
when (state.cardNumber) { when (state.cardNumber) {
TwinCardNumber.First -> startPostponedEnterTransition() TwinCardNumber.First -> {}
TwinCardNumber.Second -> { TwinCardNumber.Second -> {
switchToCard( switchToCard(
state.cardNumber, state.cardNumber,
false false,
) { startPostponedEnterTransition() } )
} }
} }
} }
@ -243,7 +242,7 @@ class TwinsCardsFragment : BaseOnboardingFragment<TwinCardsState>() {
TwinCardsAction.Wallet.LaunchFirstStep( TwinCardsAction.Wallet.LaunchFirstStep(
Message(getString(R.string.twins_recreate_title_format, twinIndexNumber)), Message(getString(R.string.twins_recreate_title_format, twinIndexNumber)),
AndroidAssetReader(requireContext()), AndroidAssetReader(requireContext()),
) ),
) )
} }
@ -251,8 +250,7 @@ class TwinsCardsFragment : BaseOnboardingFragment<TwinCardsState>() {
btnAlternativeAction.isClickable = false btnAlternativeAction.isClickable = false
} }
private fun setupCreateSecondWalletState(state: TwinCardsState) = private fun setupCreateSecondWalletState(state: TwinCardsState) = with(mainBinding.onboardingActionContainer) {
with(binding.onboardingActionContainer) {
switchToCard(state.cardNumber?.pairNumber()) switchToCard(state.cardNumber?.pairNumber())
val twinPairIndexNumber = state.cardNumber?.pairIndexNumber() val twinPairIndexNumber = state.cardNumber?.pairIndexNumber()
@ -267,18 +265,17 @@ class TwinsCardsFragment : BaseOnboardingFragment<TwinCardsState>() {
Message( Message(
getString( getString(
R.string.twins_recreate_title_format, R.string.twins_recreate_title_format,
twinPairIndexNumber twinPairIndexNumber,
) ),
), ),
Message(getString(R.string.twins_recreate_title_preparing)), Message(getString(R.string.twins_recreate_title_preparing)),
Message(getString(R.string.twins_recreate_title_creating_wallet)), Message(getString(R.string.twins_recreate_title_creating_wallet)),
) ),
) )
} }
} }
private fun setupCreateThirdWalletState(state: TwinCardsState) = private fun setupCreateThirdWalletState(state: TwinCardsState) = with(mainBinding.onboardingActionContainer) {
with(binding.onboardingActionContainer) {
switchToCard(state.cardNumber) switchToCard(state.cardNumber)
val twinIndexNumber = state.cardNumber?.indexNumber() val twinIndexNumber = state.cardNumber?.indexNumber()
@ -289,29 +286,24 @@ class TwinsCardsFragment : BaseOnboardingFragment<TwinCardsState>() {
btnMainAction.setOnClickListener { btnMainAction.setOnClickListener {
store.dispatch( store.dispatch(
TwinCardsAction.Wallet.LaunchThirdStep( TwinCardsAction.Wallet.LaunchThirdStep(
Message(getString(R.string.twins_recreate_title_format, twinIndexNumber)) Message(getString(R.string.twins_recreate_title_format, twinIndexNumber)),
) ),
) )
} }
} }
private fun setupTopUpWalletState(state: TwinCardsState) = with(mainBinding.onboardingActionContainer) {
private fun setupTopUpWalletState(state: TwinCardsState) =
with(binding.onboardingActionContainer) {
when (previousStep) { when (previousStep) {
TwinCardsStep.None -> { TwinCardsStep.None -> {
when (state.cardNumber) { when (state.cardNumber) {
TwinCardNumber.First -> { TwinCardNumber.First -> {
twinsWidget.leapfrogWidget.unfold(false) { twinsWidget.leapfrogWidget.unfold(false) {
twinsWidget.toActivate(false) { twinsWidget.toActivate(false)
startPostponedEnterTransition()
}
} }
} }
TwinCardNumber.Second -> { TwinCardNumber.Second -> {
switchToCard(state.cardNumber, false) { switchToCard(state.cardNumber, false) {
twinsWidget.toActivate(false) twinsWidget.toActivate(false)
startPostponedEnterTransition()
} }
} }
} }
@ -350,14 +342,13 @@ class TwinsCardsFragment : BaseOnboardingFragment<TwinCardsState>() {
store.dispatch(TwinCardsAction.Balance.Update) store.dispatch(TwinCardsAction.Balance.Update)
} }
} }
binding.onboardingTopContainer.imvCardBackground.setBackgroundDrawable( mainBinding.onboardingTopContainer.imvCardBackground.setBackgroundDrawable(
requireContext().getDrawableCompat(R.drawable.shape_rectangle_rounded_8) requireContext().getDrawableCompat(R.drawable.shape_rectangle_rounded_8),
) )
updateConstraints(state.currentStep, R.layout.lp_onboarding_topup_wallet_twins) updateConstraints(state.currentStep, R.layout.lp_onboarding_topup_wallet_twins)
} }
private fun setupDoneState(state: TwinCardsState) = private fun setupDoneState(state: TwinCardsState) = with(mainBinding.onboardingActionContainer) {
with(binding.onboardingActionContainer) {
btnMainAction.setText(R.string.onboarding_done_button_continue) btnMainAction.setText(R.string.onboarding_done_button_continue)
btnMainAction.setOnClickListener { btnMainAction.setOnClickListener {
store.dispatch(TwinCardsAction.Confetti.Hide) store.dispatch(TwinCardsAction.Confetti.Hide)
@ -380,7 +371,7 @@ class TwinsCardsFragment : BaseOnboardingFragment<TwinCardsState>() {
private fun updateConstraints(currentStep: TwinCardsStep, @LayoutRes layoutId: Int) { private fun updateConstraints(currentStep: TwinCardsStep, @LayoutRes layoutId: Int) {
if (this.previousStep == currentStep) return if (this.previousStep == currentStep) return
with(binding.onboardingTopContainer) { with(mainBinding.onboardingTopContainer) {
val constraintSet = ConstraintSet() val constraintSet = ConstraintSet()
constraintSet.clone(requireContext(), layoutId) constraintSet.clone(requireContext(), layoutId)
constraintSet.applyTo(onboardingWalletContainer) constraintSet.applyTo(onboardingWalletContainer)
@ -390,11 +381,7 @@ class TwinsCardsFragment : BaseOnboardingFragment<TwinCardsState>() {
} }
} }
private fun switchToCard( private fun switchToCard(cardNumber: TwinCardNumber?, animate: Boolean = true, onEnd: VoidCallback = {}) {
cardNumber: TwinCardNumber?,
animate: Boolean = true,
onEnd: VoidCallback = {}
) {
val position = cardNumber?.number ?: return val position = cardNumber?.number ?: return
if (twinsWidget.leapfrogWidget.getViewPositionByIndex(1) != position - 1) { if (twinsWidget.leapfrogWidget.getViewPositionByIndex(1) != position - 1) {
@ -405,12 +392,14 @@ class TwinsCardsFragment : BaseOnboardingFragment<TwinCardsState>() {
} }
override fun handleOnBackPressed() { override fun handleOnBackPressed() {
store.dispatch(TwinCardsAction.Wallet.HandleOnBackPressed { should, popAction -> store.dispatch(
TwinCardsAction.Wallet.HandleOnBackPressed { should, popAction ->
store.dispatch(TwinCardsAction.Confetti.Hide) store.dispatch(TwinCardsAction.Confetti.Hide)
showConfetti(false) showConfetti(false)
if (should) switchToCard(TwinCardNumber.First, true, popAction) if (should) switchToCard(TwinCardNumber.First, true, popAction)
else popAction() else popAction()
}) },
)
} }
} }

View file

@ -27,29 +27,9 @@
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false"
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<include <include
android:id="@+id/onboarding_top_container" android:id="@+id/v_main"
layout="@layout/layout_onboarding_container_top" layout="@layout/layout_onboarding_main" />
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="@dimen/home_top_weight"
android:clipChildren="false" />
<include
android:id="@+id/onboarding_action_container"
layout="@layout/layout_onboarding_container_bottom"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="@dimen/home_bottom_weight" />
</androidx.appcompat.widget.LinearLayoutCompat>
<include <include
android:id="@+id/v_confetti" android:id="@+id/v_confetti"

View file

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false"
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<include
android:id="@+id/onboarding_top_container"
layout="@layout/layout_onboarding_container_top"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="@dimen/home_top_weight"
android:clipChildren="false" />
<include
android:id="@+id/onboarding_action_container"
layout="@layout/layout_onboarding_container_bottom"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="@dimen/home_bottom_weight" />
</androidx.appcompat.widget.LinearLayoutCompat>