Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,8 @@ class DefaultCardDelegate(

private var publicKey: String? = null

private var isCardScanningAvailable = false

private val _outputDataFlow = MutableStateFlow(createOutputData())
override val outputDataFlow: Flow<CardOutputData> = _outputDataFlow

Expand Down Expand Up @@ -433,6 +435,7 @@ class DefaultCardDelegate(
cardBrands = getCardBrands(filteredDetectedCardTypes),
kcpBirthDateOrTaxNumberHint = getKcpBirthDateOrTaxNumberHint(inputData.kcpBirthDateOrTaxNumber),
isCardListVisible = isCardListVisible(getCardBrands(detectedCardTypes), filteredDetectedCardTypes),
isCardScanningVisible = isCardScanningAvailable && inputData.cardNumber.isEmpty(),
dualBrandData = dualBrandedCardHandler.processDetectedCardTypes(
detectedCardTypes,
inputData.selectedCardBrand,
Expand Down Expand Up @@ -906,6 +909,8 @@ class DefaultCardDelegate(
CardEvents.cardScannerUnavailable(getPaymentMethodType())
}
analyticsManager.trackEvent(event)
isCardScanningAvailable = isAvailable
updateOutputData()
}

override fun onCardScanningDisplayed(didDisplay: Boolean) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,7 @@ internal class StoredCardDelegate(
cardBrands = emptyList(),
kcpBirthDateOrTaxNumberHint = null,
isCardListVisible = false,
isCardScanningVisible = false,
dualBrandData = null,
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ data class CardOutputData(
@StringRes
val kcpBirthDateOrTaxNumberHint: Int?,
val isCardListVisible: Boolean,
val isCardScanningVisible: Boolean,
) : OutputData {

override val isValid: Boolean
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,16 @@ internal class CardScanningFragment : Fragment() {
resetScanner()
}

fun setScanButtonVisibility(visible: Boolean) {
_binding?.scanButton?.isVisible = visible
}
Comment thread
araratthehero marked this conversation as resolved.

private fun resetScanner() {
val cardScanner = cardScanner ?: return
val delegate = delegate ?: return
cardScanner.terminate()
viewLifecycleOwner.lifecycleScope.launch {
val didInitialize = cardScanner.initialize(requireContext(), delegate.componentParams.environment)
binding.scanButton.isVisible = didInitialize
delegate.onCardScanningAvailability(didInitialize)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ class CardView @JvmOverloads constructor(

private var installmentListAdapter: InstallmentListAdapter? = null
private var cardListAdapter: CardListAdapter? = null
private var cardScanningFragment: CardScanningFragment? = null
private lateinit var localizedContext: Context

private lateinit var cardDelegate: CardDelegate
Expand Down Expand Up @@ -192,6 +193,7 @@ class CardView @JvmOverloads constructor(
cardOutputData.detectedCardTypes,
cardOutputData.dualBrandData,
cardDelegate.componentParams.environment,
cardOutputData.isCardScanningVisible,
)
onExpiryDateValidated(cardOutputData.expiryDateState)
setSocialSecurityNumberVisibility(cardOutputData.isSocialSecurityNumberRequired)
Expand Down Expand Up @@ -327,8 +329,11 @@ class CardView @JvmOverloads constructor(
private fun setCardBrands(
detectedCardTypes: List<DetectedCardType>,
dualBrandData: DualBrandData?,
environment: Environment
environment: Environment,
isCardScanningVisible: Boolean,
) {
binding.brandView.isVisible = !isCardScanningVisible
cardScanningFragment?.setScanButtonVisibility(isCardScanningVisible)
binding.brandView.update(detectedCardTypes, dualBrandData, environment)
}

Expand Down Expand Up @@ -554,7 +559,8 @@ class CardView @JvmOverloads constructor(
}

private fun initCardScanning(delegate: CardDelegate) {
binding.fragmentContainerCardScanning.getFragment<CardScanningFragment?>()?.initialize(delegate)
cardScanningFragment = binding.fragmentContainerCardScanning.getFragment()
cardScanningFragment?.initialize(delegate)
}

private fun updateInstallments(cardOutputData: CardOutputData) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -379,6 +379,47 @@ internal class DefaultCardDelegateTest(
}
}

@Test
fun `When scanner is available and card number is empty, isCardScanningVisible should be true`() = runTest {
delegate.initialize(CoroutineScope(UnconfinedTestDispatcher()))

delegate.outputDataFlow.test {
delegate.onCardScanningAvailability(true)
delegate.updateInputData { cardNumber = "" }
with(expectMostRecentItem()) {
assertTrue(isCardScanningVisible)
}
}
}

@Test
fun `When scanner is available and card number is not empty, isCardScanningVisible should be false`() =
runTest {
delegate.initialize(CoroutineScope(UnconfinedTestDispatcher()))

delegate.outputDataFlow.test {
delegate.onCardScanningAvailability(true)
delegate.updateInputData { cardNumber = "4111" }
with(expectMostRecentItem()) {
assertFalse(isCardScanningVisible)
}
}
}

@Test
fun `When scanner is not available and card number is empty, isCardScanningVisible should be false`() =
runTest {
delegate.initialize(CoroutineScope(UnconfinedTestDispatcher()))

delegate.outputDataFlow.test {
delegate.onCardScanningAvailability(false)
delegate.updateInputData { cardNumber = "" }
with(expectMostRecentItem()) {
assertFalse(isCardScanningVisible)
}
}
}

@Test
fun `detect card type repository returns supported cards, then output data should contain them`() = runTest {
val supportedCardBrands = listOf(
Expand Down Expand Up @@ -1550,6 +1591,7 @@ internal class DefaultCardDelegateTest(
),
isCardListVisible: Boolean = true,
dualBrandData: DualBrandData? = null,
isCardScanningVisible: Boolean = false,
): CardOutputData {
return CardOutputData(
cardNumberState = cardNumberState,
Expand All @@ -1575,6 +1617,7 @@ internal class DefaultCardDelegateTest(
kcpBirthDateOrTaxNumberHint = kcpBirthDateOrTaxNumberHint,
isCardListVisible = isCardListVisible,
dualBrandData = dualBrandData,
isCardScanningVisible = isCardScanningVisible,
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -665,6 +665,7 @@ internal class StoredCardDelegateTest(
kcpBirthDateOrTaxNumberHint = null,
isCardListVisible = isCardListVisible,
dualBrandData = null,
isCardScanningVisible = false,
)
}

Expand Down
Loading