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 @@ -8,6 +8,9 @@ internal object UIComponentsAnalytics {
const val VENMO_BUTTON_PRESENTED = "ui-components:venmo-button:presented"
const val VENMO_BUTTON_SELECTED = "ui-components:venmo-button:selected"

const val CARD_FIELDS_PRESENTED = "ui-components:card-fields:presented"
const val CARD_FIELDS_VALIDATED = "ui-components:card-fields:validated"

const val UI_TYPE_COMPOSE = "compose"
const val UI_TYPE_XML_VIEW = "xml"
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,11 @@ import android.widget.FrameLayout
import com.braintreepayments.api.card.Card
import com.braintreepayments.api.card.CardClient
import com.braintreepayments.api.card.CardResult
import com.braintreepayments.api.core.AnalyticsClient
import com.braintreepayments.api.core.AnalyticsEventParams
import com.braintreepayments.api.core.BraintreeException
import com.braintreepayments.api.uicomponents.R
import com.braintreepayments.api.uicomponents.UIComponentsAnalytics
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.cancel
Expand All @@ -23,7 +26,8 @@ class CardFields internal constructor(
attrs: AttributeSet? = null,
defStyleAttr: Int = 0,
private val viewModel: CardFieldsViewModel = CardFieldsViewModel(),
private var cardClient: CardClient? = null
private var cardClient: CardClient? = null,
private val analyticsClient: AnalyticsClient = AnalyticsClient.lazyInstance.value
) : FrameLayout(context, attrs, defStyleAttr) {

@JvmOverloads
Expand Down Expand Up @@ -91,6 +95,10 @@ class CardFields internal constructor(
*/
fun initialize(authorization: String) {
cardClient = CardClient(context, authorization)
analyticsClient.sendEvent(
UIComponentsAnalytics.CARD_FIELDS_PRESENTED,
AnalyticsEventParams(uiType = UIComponentsAnalytics.UI_TYPE_XML_VIEW)
)
}

/**
Expand Down Expand Up @@ -127,6 +135,10 @@ class CardFields internal constructor(
)
return
}
analyticsClient.sendEvent(
UIComponentsAnalytics.CARD_FIELDS_VALIDATED,
AnalyticsEventParams(uiType = UIComponentsAnalytics.UI_TYPE_XML_VIEW)
)
client.tokenize(buildCard()) { cardResult ->
val result = when (cardResult) {
is CardResult.Success -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,11 @@ import com.braintreepayments.api.card.CardClient
import com.braintreepayments.api.card.CardNonce
import com.braintreepayments.api.card.CardResult
import com.braintreepayments.api.card.CardTokenizeCallback
import com.braintreepayments.api.core.AnalyticsClient
import com.braintreepayments.api.core.AnalyticsEventParams
import com.braintreepayments.api.core.BraintreeException
import com.braintreepayments.api.uicomponents.R
import com.braintreepayments.api.uicomponents.UIComponentsAnalytics
import com.braintreepayments.api.uicomponents.util.CoroutineTestRule
import io.mockk.Runs
import io.mockk.every
Expand Down Expand Up @@ -44,6 +47,7 @@ class CardFieldsUnitTest {
private lateinit var activity: Activity
private lateinit var viewModel: CardFieldsViewModel
private val cardClient: CardClient = mockk(relaxed = true)
private val analyticsClient: AnalyticsClient = mockk(relaxed = true)

// Controllable backing flows so each test can drive the ViewModel's outputs directly.
private val cardNumberValidation = MutableStateFlow<ValidationResult>(ValidationResult.Validating)
Expand All @@ -64,10 +68,11 @@ class CardFieldsUnitTest {
every { viewModel.isFormValid } returns isFormValid
}

private fun createCardFields() = CardFields(activity, viewModel = viewModel)
private fun createCardFields() =
CardFields(activity, viewModel = viewModel, analyticsClient = analyticsClient)

private fun createCardFieldsWithClient() =
CardFields(activity, viewModel = viewModel, cardClient = cardClient)
CardFields(activity, viewModel = viewModel, cardClient = cardClient, analyticsClient = analyticsClient)

private fun CardFields.attach() = activity.setContentView(this)

Expand Down Expand Up @@ -476,6 +481,53 @@ class CardFieldsUnitTest {

// endregion

// region Analytics

@Test
fun `initialize sends the card fields presented event`() {
val cardFields = createCardFields()

cardFields.initialize("fake-authorization")

verify {
analyticsClient.sendEvent(
UIComponentsAnalytics.CARD_FIELDS_PRESENTED,
AnalyticsEventParams(uiType = UIComponentsAnalytics.UI_TYPE_XML_VIEW)
)
}
}

@Test
fun `submit sends the card fields validated event`() {
val cardFields = createCardFieldsWithClient()

cardFields.submit()

verify {
analyticsClient.sendEvent(
UIComponentsAnalytics.CARD_FIELDS_VALIDATED,
AnalyticsEventParams(uiType = UIComponentsAnalytics.UI_TYPE_XML_VIEW)
)
}
}

@Test
fun `submit before initialize does not send the validated event`() {
val cardFields = createCardFields()
cardFields.setCardFieldsResultCallback { }

cardFields.submit()

verify(exactly = 0) {
analyticsClient.sendEvent(
UIComponentsAnalytics.CARD_FIELDS_VALIDATED,
any()
)
}
}

// endregion

private fun EditText.lengthFilterMax(): Int =
filters.filterIsInstance<InputFilter.LengthFilter>().first().max
}
Loading