Skip to content

Commit

Permalink
ExperimentalAnalyticEventCallbackApi
Browse files Browse the repository at this point in the history
  • Loading branch information
cttsai-stripe committed Jan 28, 2025
1 parent 4311cf3 commit 6e73161
Show file tree
Hide file tree
Showing 9 changed files with 60 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import com.stripe.android.customersheet.CustomerSheetResult
import com.stripe.android.customersheet.rememberCustomerSheet
import com.stripe.android.model.PaymentMethod
import com.stripe.android.paymentelement.AnalyticEvent
import com.stripe.android.paymentelement.ExperimentalAnalyticEventCallbackApi
import com.stripe.android.paymentsheet.ExperimentalCustomerSessionApi
import com.stripe.android.paymentsheet.ExternalPaymentMethodConfirmHandler
import com.stripe.android.paymentsheet.PaymentSheet
Expand Down Expand Up @@ -79,7 +80,7 @@ internal class PaymentSheetPlaygroundActivity : AppCompatActivity(), ExternalPay
viewModel.onEmbeddedResult(success)
}

@OptIn(ExperimentalCustomerSessionApi::class)
@OptIn(ExperimentalCustomerSessionApi::class, ExperimentalAnalyticEventCallbackApi::class)
@Suppress("LongMethod")
override fun onCreate(savedInstanceState: Bundle?) {
enableEdgeToEdge()
Expand Down
23 changes: 22 additions & 1 deletion paymentsheet/api/paymentsheet.api
Original file line number Diff line number Diff line change
Expand Up @@ -556,41 +556,62 @@ public abstract class com/stripe/android/paymentelement/AnalyticEvent {

public final class com/stripe/android/paymentelement/AnalyticEvent$CompletedPaymentMethodForm : com/stripe/android/paymentelement/AnalyticEvent {
public static final field $stable I
public fun equals (Ljava/lang/Object;)Z
public final fun getPaymentMethodType ()Ljava/lang/String;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}

public final class com/stripe/android/paymentelement/AnalyticEvent$DisplayedPaymentMethodForm : com/stripe/android/paymentelement/AnalyticEvent {
public static final field $stable I
public fun equals (Ljava/lang/Object;)Z
public final fun getPaymentMethodType ()Ljava/lang/String;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}

public final class com/stripe/android/paymentelement/AnalyticEvent$PresentPaymentSheet : com/stripe/android/paymentelement/AnalyticEvent {
public final class com/stripe/android/paymentelement/AnalyticEvent$PresentedSheet : com/stripe/android/paymentelement/AnalyticEvent {
public static final field $stable I
}

public final class com/stripe/android/paymentelement/AnalyticEvent$RemovedSavedPaymentMethod : com/stripe/android/paymentelement/AnalyticEvent {
public static final field $stable I
public fun equals (Ljava/lang/Object;)Z
public final fun getPaymentMethodType ()Ljava/lang/String;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}

public final class com/stripe/android/paymentelement/AnalyticEvent$SelectedPaymentMethodType : com/stripe/android/paymentelement/AnalyticEvent {
public static final field $stable I
public fun equals (Ljava/lang/Object;)Z
public final fun getPaymentMethodType ()Ljava/lang/String;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}

public final class com/stripe/android/paymentelement/AnalyticEvent$SelectedSavedPaymentMethod : com/stripe/android/paymentelement/AnalyticEvent {
public static final field $stable I
public fun equals (Ljava/lang/Object;)Z
public final fun getPaymentMethodType ()Ljava/lang/String;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}

public final class com/stripe/android/paymentelement/AnalyticEvent$StartedInteractionWithPaymentMethodForm : com/stripe/android/paymentelement/AnalyticEvent {
public static final field $stable I
public fun equals (Ljava/lang/Object;)Z
public final fun getPaymentMethodType ()Ljava/lang/String;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}

public final class com/stripe/android/paymentelement/AnalyticEvent$TappedConfirmButton : com/stripe/android/paymentelement/AnalyticEvent {
public static final field $stable I
public fun equals (Ljava/lang/Object;)Z
public final fun getPaymentMethodType ()Ljava/lang/String;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}

public abstract interface class com/stripe/android/paymentelement/AnalyticEventCallback {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,12 @@ import kotlinx.coroutines.flow.asSharedFlow
*
* @param event the [AnalyticEvent] that was emitted
*/
@ExperimentalAnalyticEventCallbackApi
fun interface AnalyticEventCallback {
fun onEvent(event: AnalyticEvent)
}


@ExperimentalAnalyticEventCallbackApi
abstract class AnalyticEvent internal constructor() {

@Override
Expand Down Expand Up @@ -55,6 +56,7 @@ abstract class AnalyticEvent internal constructor() {
class RemovedSavedPaymentMethod internal constructor(val paymentMethodType: String) : AnalyticEvent()
}

@OptIn(ExperimentalAnalyticEventCallbackApi::class)
internal object AnalyticsManager {
private val _events = MutableSharedFlow<AnalyticEvent>()
val events = _events.asSharedFlow()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ class EmbeddedPaymentElement private constructor(
*
* Creation can be completed with [rememberEmbeddedPaymentElement].
*/
@OptIn(ExperimentalAnalyticEventCallbackApi::class)
@ExperimentalEmbeddedPaymentElementApi
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
class Builder(
Expand All @@ -105,13 +106,23 @@ class EmbeddedPaymentElement private constructor(
) {
internal var externalPaymentMethodConfirmHandler: ExternalPaymentMethodConfirmHandler? = null
private set
internal var analyticEventCallback: AnalyticEventCallback? = null
private set

/**
* Called when a user confirms payment for an external payment method.
*/
fun externalPaymentMethodConfirmHandler(handler: ExternalPaymentMethodConfirmHandler) = apply {
this.externalPaymentMethodConfirmHandler = handler
}

/**
* Called when an analytic event is emitted.
*/
@ExperimentalAnalyticEventCallbackApi
fun analyticEventCallback(callback: AnalyticEventCallback) = apply {
analyticEventCallback = callback
}
}

/** Configuration for [EmbeddedPaymentElement] **/
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.stripe.android.paymentelement

import androidx.annotation.RestrictTo

@RequiresOptIn(
level = RequiresOptIn.Level.ERROR,
message = "This API is under construction. It can be changed or removed at any time (use at your own risk)."
)
@Retention(AnnotationRetention.BINARY)
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
annotation class ExperimentalAnalyticEventCallbackApi
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.stripe.android.paymentsheet

import com.stripe.android.paymentelement.AnalyticEventCallback
import com.stripe.android.paymentelement.ExperimentalAnalyticEventCallbackApi

@OptIn(ExperimentalAnalyticEventCallbackApi::class)
internal object AnalyticEventInterceptor {
var analyticEventCallback: AnalyticEventCallback? = null
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import com.stripe.android.paymentelement.AnalyticsManager
import com.stripe.android.paymentelement.ExperimentalAnalyticEventCallbackApi
import com.stripe.android.paymentelement.confirmation.intent.IntentConfirmationInterceptor
import com.stripe.android.paymentsheet.state.PaymentElementLoader
import com.stripe.android.uicore.utils.AnimationConstants
Expand All @@ -25,6 +26,7 @@ import org.jetbrains.annotations.TestOnly
* This is used internally for integrations that don't use Jetpack Compose and are
* able to pass in an activity.
*/
@OptIn(ExperimentalAnalyticEventCallbackApi::class)
internal class DefaultPaymentSheetLauncher(
private val activityResultLauncher: ActivityResultLauncher<PaymentSheetContractV2.Args>,
private val activity: Activity,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import com.stripe.android.model.CardBrand
import com.stripe.android.model.PaymentIntent
import com.stripe.android.model.SetupIntent
import com.stripe.android.paymentelement.AnalyticEventCallback
import com.stripe.android.paymentelement.ExperimentalAnalyticEventCallbackApi
import com.stripe.android.paymentelement.ExperimentalEmbeddedPaymentElementApi
import com.stripe.android.paymentelement.confirmation.intent.IntentConfirmationInterceptor
import com.stripe.android.paymentsheet.addresselement.AddressDetails
Expand Down Expand Up @@ -190,6 +191,7 @@ class PaymentSheet internal constructor(
*
* @param resultCallback Called with the result of the payment after [PaymentSheet] is dismissed.
*/
@OptIn(ExperimentalAnalyticEventCallbackApi::class)
class Builder(internal val resultCallback: PaymentSheetResultCallback) {
internal var externalPaymentMethodConfirmHandler: ExternalPaymentMethodConfirmHandler? = null
private set
Expand Down Expand Up @@ -217,6 +219,7 @@ class PaymentSheet internal constructor(
/**
* @param callback Called when an analytic event occurs.
*/
@ExperimentalAnalyticEventCallbackApi
fun analyticEventCallback(callback: AnalyticEventCallback) = apply {
analyticEventCallback = callback
}
Expand Down Expand Up @@ -2094,6 +2097,7 @@ class PaymentSheet internal constructor(
* @param resultCallback Called when a [PaymentSheetResult] is available.
* @param paymentOptionCallback Called when the customer's desired payment method changes.
*/
@OptIn(ExperimentalAnalyticEventCallbackApi::class)
class Builder(
internal val resultCallback: PaymentSheetResultCallback,
internal val paymentOptionCallback: PaymentOptionCallback
Expand Down Expand Up @@ -2122,6 +2126,7 @@ class PaymentSheet internal constructor(
/**
* @param callback If specified, called when an analytic event occurs.
*/
@ExperimentalAnalyticEventCallbackApi
fun analyticEventCallback(callback: AnalyticEventCallback) = apply {
analyticEventCallback = callback
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.stripe.android.model.PaymentMethodCode
import com.stripe.android.networking.PaymentAnalyticsRequestFactory
import com.stripe.android.paymentelement.AnalyticEvent
import com.stripe.android.paymentelement.AnalyticsManager
import com.stripe.android.paymentelement.ExperimentalAnalyticEventCallbackApi
import com.stripe.android.paymentelement.confirmation.intent.DeferredIntentConfirmationType
import com.stripe.android.paymentsheet.PaymentSheet
import com.stripe.android.paymentsheet.model.PaymentSelection
Expand All @@ -18,6 +19,7 @@ import kotlinx.coroutines.launch
import javax.inject.Inject
import kotlin.coroutines.CoroutineContext

@OptIn(ExperimentalAnalyticEventCallbackApi::class)
internal class DefaultEventReporter @Inject internal constructor(
private val mode: EventReporter.Mode,
private val analyticsRequestExecutor: AnalyticsRequestExecutor,
Expand Down

0 comments on commit 6e73161

Please sign in to comment.