From fd810c1c9059dec5d0346073bed8d956c7fe3d43 Mon Sep 17 00:00:00 2001 From: Chengtin Tsai Date: Thu, 13 Feb 2025 14:39:06 -0500 Subject: [PATCH] Adopt DI and remove channel --- .../android/link/injection/NativeLinkModule.kt | 8 ++++++++ .../paymentelement/AnalyticEventCallback.kt | 12 ------------ .../embedded/SharedPaymentElementViewModel.kt | 7 +++++++ .../paymentsheet/DefaultPaymentSheetLauncher.kt | 15 --------------- .../analytics/DefaultEventReporter.kt | 5 +++-- .../injection/PaymentSheetCommonModule.kt | 7 +++++++ 6 files changed, 25 insertions(+), 29 deletions(-) diff --git a/paymentsheet/src/main/java/com/stripe/android/link/injection/NativeLinkModule.kt b/paymentsheet/src/main/java/com/stripe/android/link/injection/NativeLinkModule.kt index d658eee3dda..f118f064632 100644 --- a/paymentsheet/src/main/java/com/stripe/android/link/injection/NativeLinkModule.kt +++ b/paymentsheet/src/main/java/com/stripe/android/link/injection/NativeLinkModule.kt @@ -30,10 +30,13 @@ import com.stripe.android.link.repositories.LinkApiRepository import com.stripe.android.link.repositories.LinkRepository import com.stripe.android.networking.StripeApiRepository import com.stripe.android.networking.StripeRepository +import com.stripe.android.paymentelement.AnalyticEventCallback +import com.stripe.android.paymentelement.ExperimentalAnalyticEventCallbackApi import com.stripe.android.paymentelement.confirmation.ALLOWS_MANUAL_CONFIRMATION import com.stripe.android.payments.core.analytics.ErrorReporter import com.stripe.android.payments.core.analytics.RealErrorReporter import com.stripe.android.payments.core.injection.PRODUCT_USAGE +import com.stripe.android.paymentsheet.AnalyticEventInterceptor import com.stripe.android.paymentsheet.analytics.DefaultEventReporter import com.stripe.android.paymentsheet.analytics.EventReporter import com.stripe.android.repository.ConsumersApiService @@ -164,5 +167,10 @@ internal interface NativeLinkModule { @Provides @NativeLinkScope fun provideEventReporterMode(): EventReporter.Mode = EventReporter.Mode.Custom + + @OptIn(ExperimentalAnalyticEventCallbackApi::class) + @Provides + @NativeLinkScope + fun provideAnalyticEventCallback(): AnalyticEventCallback? = AnalyticEventInterceptor.analyticEventCallback } } diff --git a/paymentsheet/src/main/java/com/stripe/android/paymentelement/AnalyticEventCallback.kt b/paymentsheet/src/main/java/com/stripe/android/paymentelement/AnalyticEventCallback.kt index 1de7c1a3722..94c12d4035e 100644 --- a/paymentsheet/src/main/java/com/stripe/android/paymentelement/AnalyticEventCallback.kt +++ b/paymentsheet/src/main/java/com/stripe/android/paymentelement/AnalyticEventCallback.kt @@ -1,8 +1,6 @@ package com.stripe.android.paymentelement import dev.drewhamilton.poko.Poko -import kotlinx.coroutines.channels.Channel -import kotlinx.coroutines.flow.receiveAsFlow /** * Called when an analytic event is emitted. @@ -55,13 +53,3 @@ abstract class AnalyticEvent internal constructor() { @Poko class RemovedSavedPaymentMethod internal constructor(val paymentMethodType: String) : AnalyticEvent() } - -@OptIn(ExperimentalAnalyticEventCallbackApi::class) -internal object AnalyticManager { - private val _events = Channel(Channel.BUFFERED) - val events = _events.receiveAsFlow() - - suspend fun produceEvent(event: AnalyticEvent) { - _events.send(event) - } -} diff --git a/paymentsheet/src/main/java/com/stripe/android/paymentelement/embedded/SharedPaymentElementViewModel.kt b/paymentsheet/src/main/java/com/stripe/android/paymentelement/embedded/SharedPaymentElementViewModel.kt index 5a50b7ec864..b1dde72ab6c 100644 --- a/paymentsheet/src/main/java/com/stripe/android/paymentelement/embedded/SharedPaymentElementViewModel.kt +++ b/paymentsheet/src/main/java/com/stripe/android/paymentelement/embedded/SharedPaymentElementViewModel.kt @@ -29,9 +29,11 @@ import com.stripe.android.link.LinkConfigurationCoordinator import com.stripe.android.link.RealLinkConfigurationCoordinator import com.stripe.android.link.injection.LinkAnalyticsComponent import com.stripe.android.link.injection.LinkComponent +import com.stripe.android.paymentelement.AnalyticEventCallback import com.stripe.android.paymentelement.EmbeddedPaymentElement import com.stripe.android.paymentelement.EmbeddedPaymentElement.ConfigureResult import com.stripe.android.paymentelement.EmbeddedPaymentElement.PaymentOptionDisplayData +import com.stripe.android.paymentelement.ExperimentalAnalyticEventCallbackApi import com.stripe.android.paymentelement.ExperimentalEmbeddedPaymentElementApi import com.stripe.android.paymentelement.confirmation.ALLOWS_MANUAL_CONFIRMATION import com.stripe.android.paymentelement.confirmation.ConfirmationHandler @@ -41,6 +43,7 @@ import com.stripe.android.payments.core.analytics.RealErrorReporter import com.stripe.android.payments.core.injection.PRODUCT_USAGE import com.stripe.android.payments.core.injection.STATUS_BAR_COLOR import com.stripe.android.payments.core.injection.StripeRepositoryModule +import com.stripe.android.paymentsheet.AnalyticEventInterceptor import com.stripe.android.paymentsheet.BuildConfig import com.stripe.android.paymentsheet.DefaultPrefsRepository import com.stripe.android.paymentsheet.PaymentSheet @@ -342,5 +345,9 @@ internal interface SharedPaymentElementViewModelModule { fun provideStripeImageLoader(context: Context): StripeImageLoader { return StripeImageLoader(context) } + + @OptIn(ExperimentalAnalyticEventCallbackApi::class) + @Provides + fun provideAnalyticEventCallback(): AnalyticEventCallback? = AnalyticEventInterceptor.analyticEventCallback } } diff --git a/paymentsheet/src/main/java/com/stripe/android/paymentsheet/DefaultPaymentSheetLauncher.kt b/paymentsheet/src/main/java/com/stripe/android/paymentsheet/DefaultPaymentSheetLauncher.kt index db38005fe03..20523753dc1 100644 --- a/paymentsheet/src/main/java/com/stripe/android/paymentsheet/DefaultPaymentSheetLauncher.kt +++ b/paymentsheet/src/main/java/com/stripe/android/paymentsheet/DefaultPaymentSheetLauncher.kt @@ -9,15 +9,10 @@ import androidx.core.app.ActivityOptionsCompat import androidx.fragment.app.Fragment import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner -import androidx.lifecycle.lifecycleScope -import com.stripe.android.paymentelement.AnalyticManager 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 -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import org.jetbrains.annotations.TestOnly /** @@ -44,16 +39,6 @@ internal class DefaultPaymentSheetLauncher( } } ) - lifecycleOwner.lifecycleScope.launch { -// lifecycleOwner.lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { - AnalyticManager.events.collect { event -> - withContext(Dispatchers.Default) { - AnalyticEventInterceptor.analyticEventCallback - ?.onEvent(event) - } - } -// } - } } constructor( diff --git a/paymentsheet/src/main/java/com/stripe/android/paymentsheet/analytics/DefaultEventReporter.kt b/paymentsheet/src/main/java/com/stripe/android/paymentsheet/analytics/DefaultEventReporter.kt index e422a8f391f..3975521bf75 100644 --- a/paymentsheet/src/main/java/com/stripe/android/paymentsheet/analytics/DefaultEventReporter.kt +++ b/paymentsheet/src/main/java/com/stripe/android/paymentsheet/analytics/DefaultEventReporter.kt @@ -8,7 +8,7 @@ import com.stripe.android.model.LinkMode import com.stripe.android.model.PaymentMethodCode import com.stripe.android.networking.PaymentAnalyticsRequestFactory import com.stripe.android.paymentelement.AnalyticEvent -import com.stripe.android.paymentelement.AnalyticManager +import com.stripe.android.paymentelement.AnalyticEventCallback import com.stripe.android.paymentelement.ExperimentalAnalyticEventCallbackApi import com.stripe.android.paymentelement.confirmation.intent.DeferredIntentConfirmationType import com.stripe.android.paymentsheet.PaymentSheet @@ -25,6 +25,7 @@ internal class DefaultEventReporter @Inject internal constructor( private val analyticsRequestExecutor: AnalyticsRequestExecutor, private val paymentAnalyticsRequestFactory: PaymentAnalyticsRequestFactory, private val durationProvider: DurationProvider, + private val analyticEventCallback: AnalyticEventCallback?, @IOContext private val workContext: CoroutineContext ) : EventReporter { @@ -139,7 +140,7 @@ internal class DefaultEventReporter @Inject internal constructor( override fun onShowNewPaymentOptions() { CoroutineScope(workContext).launch { - AnalyticManager.produceEvent(AnalyticEvent.PresentedSheet()) + analyticEventCallback?.onEvent(AnalyticEvent.PresentedSheet()) } fireEvent( PaymentSheetEvent.ShowNewPaymentOptions( diff --git a/paymentsheet/src/main/java/com/stripe/android/paymentsheet/injection/PaymentSheetCommonModule.kt b/paymentsheet/src/main/java/com/stripe/android/paymentsheet/injection/PaymentSheetCommonModule.kt index 82d55d4b381..a2fd6b4b418 100644 --- a/paymentsheet/src/main/java/com/stripe/android/paymentsheet/injection/PaymentSheetCommonModule.kt +++ b/paymentsheet/src/main/java/com/stripe/android/paymentsheet/injection/PaymentSheetCommonModule.kt @@ -19,8 +19,11 @@ import com.stripe.android.link.LinkConfigurationCoordinator import com.stripe.android.link.RealLinkConfigurationCoordinator import com.stripe.android.link.injection.LinkAnalyticsComponent import com.stripe.android.link.injection.LinkComponent +import com.stripe.android.paymentelement.AnalyticEventCallback +import com.stripe.android.paymentelement.ExperimentalAnalyticEventCallbackApi import com.stripe.android.payments.core.analytics.ErrorReporter import com.stripe.android.payments.core.analytics.RealErrorReporter +import com.stripe.android.paymentsheet.AnalyticEventInterceptor import com.stripe.android.paymentsheet.BuildConfig import com.stripe.android.paymentsheet.DefaultPrefsRepository import com.stripe.android.paymentsheet.PaymentSheet @@ -162,5 +165,9 @@ internal abstract class PaymentSheetCommonModule { fun providesCvcRecollectionInteractorFactory(): CvcRecollectionInteractor.Factory { return DefaultCvcRecollectionInteractor.Factory } + + @OptIn(ExperimentalAnalyticEventCallbackApi::class) + @Provides + fun provideAnalyticEventCallback(): AnalyticEventCallback? = AnalyticEventInterceptor.analyticEventCallback } }