From 6449ade7cff6a7fb524201b9208484cb887fd0a3 Mon Sep 17 00:00:00 2001 From: Vitalii Vanziak Date: Wed, 1 Oct 2025 13:48:38 +0300 Subject: [PATCH 1/2] POEventDispatcher.instance --- .../processout/sdk/api/dispatcher/POEventDispatcher.kt | 8 +++++++- .../sdk/api/service/proxy3ds/PODefaultProxy3DSService.kt | 2 +- .../ui/card/tokenization/CardTokenizationInteractor.kt | 2 +- .../ui/card/tokenization/POCardTokenizationLauncher.kt | 2 +- .../component/POCardTokenizationViewComponent.kt | 2 +- .../processout/sdk/ui/card/update/CardUpdateViewModel.kt | 2 +- .../processout/sdk/ui/card/update/POCardUpdateLauncher.kt | 2 +- .../sdk/ui/checkout/DynamicCheckoutInteractor.kt | 2 +- .../sdk/ui/checkout/PODynamicCheckoutLauncher.kt | 7 ++++--- .../sdk/ui/napm/NativeAlternativePaymentInteractor.kt | 2 +- .../sdk/ui/napm/PONativeAlternativePaymentLauncher.kt | 2 +- .../savedpaymentmethods/POSavedPaymentMethodsLauncher.kt | 2 +- .../savedpaymentmethods/SavedPaymentMethodsInteractor.kt | 2 +- 13 files changed, 22 insertions(+), 15 deletions(-) diff --git a/sdk/src/main/kotlin/com/processout/sdk/api/dispatcher/POEventDispatcher.kt b/sdk/src/main/kotlin/com/processout/sdk/api/dispatcher/POEventDispatcher.kt index 9360baf09..4e45a520c 100644 --- a/sdk/src/main/kotlin/com/processout/sdk/api/dispatcher/POEventDispatcher.kt +++ b/sdk/src/main/kotlin/com/processout/sdk/api/dispatcher/POEventDispatcher.kt @@ -12,7 +12,13 @@ import java.util.UUID /** @suppress */ @ProcessOutInternalApi -object POEventDispatcher { +class POEventDispatcher { + + companion object { + val instance: POEventDispatcher by lazy { + POEventDispatcher() + } + } interface Request { val uuid: UUID diff --git a/sdk/src/main/kotlin/com/processout/sdk/api/service/proxy3ds/PODefaultProxy3DSService.kt b/sdk/src/main/kotlin/com/processout/sdk/api/service/proxy3ds/PODefaultProxy3DSService.kt index c371c24a9..4750af16b 100644 --- a/sdk/src/main/kotlin/com/processout/sdk/api/service/proxy3ds/PODefaultProxy3DSService.kt +++ b/sdk/src/main/kotlin/com/processout/sdk/api/service/proxy3ds/PODefaultProxy3DSService.kt @@ -21,7 +21,7 @@ class PODefaultProxy3DSService( ) : POProxy3DSService { private val uuid = UUID.randomUUID() - private val eventDispatcher = POEventDispatcher + private val eventDispatcher = POEventDispatcher.instance private var authenticationCallback: ((ProcessOutResult) -> Unit)? = null private var challengeCallback: ((ProcessOutResult) -> Unit)? = null diff --git a/ui/src/main/kotlin/com/processout/sdk/ui/card/tokenization/CardTokenizationInteractor.kt b/ui/src/main/kotlin/com/processout/sdk/ui/card/tokenization/CardTokenizationInteractor.kt index 71a29df67..b5ef1b063 100644 --- a/ui/src/main/kotlin/com/processout/sdk/ui/card/tokenization/CardTokenizationInteractor.kt +++ b/ui/src/main/kotlin/com/processout/sdk/ui/card/tokenization/CardTokenizationInteractor.kt @@ -60,7 +60,7 @@ internal class CardTokenizationInteractor( private val cardsRepository: POCardsRepository, private val cardSchemeProvider: CardSchemeProvider, private val addressSpecificationProvider: AddressSpecificationProvider, - private val eventDispatcher: POEventDispatcher = POEventDispatcher + private val eventDispatcher: POEventDispatcher = POEventDispatcher.instance ) : BaseInteractor() { private companion object { diff --git a/ui/src/main/kotlin/com/processout/sdk/ui/card/tokenization/POCardTokenizationLauncher.kt b/ui/src/main/kotlin/com/processout/sdk/ui/card/tokenization/POCardTokenizationLauncher.kt index 5bd82c5b5..076b23916 100644 --- a/ui/src/main/kotlin/com/processout/sdk/ui/card/tokenization/POCardTokenizationLauncher.kt +++ b/ui/src/main/kotlin/com/processout/sdk/ui/card/tokenization/POCardTokenizationLauncher.kt @@ -30,7 +30,7 @@ class POCardTokenizationLauncher private constructor( private val launcher: ActivityResultLauncher, private val activityOptions: ActivityOptionsCompat, private val delegate: POCardTokenizationDelegate, - private val eventDispatcher: POEventDispatcher = POEventDispatcher + private val eventDispatcher: POEventDispatcher = POEventDispatcher.instance ) { companion object { diff --git a/ui/src/main/kotlin/com/processout/sdk/ui/card/tokenization/component/POCardTokenizationViewComponent.kt b/ui/src/main/kotlin/com/processout/sdk/ui/card/tokenization/component/POCardTokenizationViewComponent.kt index 02fb1101a..b3daab62d 100644 --- a/ui/src/main/kotlin/com/processout/sdk/ui/card/tokenization/component/POCardTokenizationViewComponent.kt +++ b/ui/src/main/kotlin/com/processout/sdk/ui/card/tokenization/component/POCardTokenizationViewComponent.kt @@ -61,7 +61,7 @@ class POCardTokenizationViewComponent private constructor( private val cardScannerLauncher: POCardScannerLauncher, private val delegate: POCardTokenizationDelegate, private val callback: (ProcessOutResult) -> Unit, - private val eventDispatcher: POEventDispatcher = POEventDispatcher + private val eventDispatcher: POEventDispatcher = POEventDispatcher.instance ) { private val scope = lifecycleOwner.lifecycleScope diff --git a/ui/src/main/kotlin/com/processout/sdk/ui/card/update/CardUpdateViewModel.kt b/ui/src/main/kotlin/com/processout/sdk/ui/card/update/CardUpdateViewModel.kt index 4ea69b83a..8306129b2 100644 --- a/ui/src/main/kotlin/com/processout/sdk/ui/card/update/CardUpdateViewModel.kt +++ b/ui/src/main/kotlin/com/processout/sdk/ui/card/update/CardUpdateViewModel.kt @@ -58,7 +58,7 @@ internal class CardUpdateViewModel private constructor( app = app, configuration = configuration, cardsRepository = ProcessOut.instance.cards, - eventDispatcher = POEventDispatcher, + eventDispatcher = POEventDispatcher.instance, logAttributes = mapOf(POLogAttribute.CARD_ID to configuration.cardId) ) as T } diff --git a/ui/src/main/kotlin/com/processout/sdk/ui/card/update/POCardUpdateLauncher.kt b/ui/src/main/kotlin/com/processout/sdk/ui/card/update/POCardUpdateLauncher.kt index 95a9449d0..2bbeea2f5 100644 --- a/ui/src/main/kotlin/com/processout/sdk/ui/card/update/POCardUpdateLauncher.kt +++ b/ui/src/main/kotlin/com/processout/sdk/ui/card/update/POCardUpdateLauncher.kt @@ -25,7 +25,7 @@ class POCardUpdateLauncher private constructor( private val launcher: ActivityResultLauncher, private val activityOptions: ActivityOptionsCompat, private val delegate: POCardUpdateDelegate, - private val eventDispatcher: POEventDispatcher = POEventDispatcher + private val eventDispatcher: POEventDispatcher = POEventDispatcher.instance ) { companion object { diff --git a/ui/src/main/kotlin/com/processout/sdk/ui/checkout/DynamicCheckoutInteractor.kt b/ui/src/main/kotlin/com/processout/sdk/ui/checkout/DynamicCheckoutInteractor.kt index f385d647d..d0379d8fb 100644 --- a/ui/src/main/kotlin/com/processout/sdk/ui/checkout/DynamicCheckoutInteractor.kt +++ b/ui/src/main/kotlin/com/processout/sdk/ui/checkout/DynamicCheckoutInteractor.kt @@ -78,7 +78,7 @@ internal class DynamicCheckoutInteractor( private val googlePayService: POGooglePayService, private val cardTokenization: CardTokenizationViewModel, private val nativeAlternativePayment: NativeAlternativePaymentViewModel, - private val eventDispatcher: POEventDispatcher = POEventDispatcher, + private val eventDispatcher: POEventDispatcher = POEventDispatcher.instance, private var logAttributes: Map = logAttributes( invoiceId = configuration.invoiceRequest.invoiceId ) diff --git a/ui/src/main/kotlin/com/processout/sdk/ui/checkout/PODynamicCheckoutLauncher.kt b/ui/src/main/kotlin/com/processout/sdk/ui/checkout/PODynamicCheckoutLauncher.kt index b0d4ffc82..a39f875a3 100644 --- a/ui/src/main/kotlin/com/processout/sdk/ui/checkout/PODynamicCheckoutLauncher.kt +++ b/ui/src/main/kotlin/com/processout/sdk/ui/checkout/PODynamicCheckoutLauncher.kt @@ -9,7 +9,7 @@ import androidx.lifecycle.lifecycleScope import com.processout.sdk.R import com.processout.sdk.api.dispatcher.POEventDispatcher import com.processout.sdk.api.model.event.POCardTokenizationEvent -import com.processout.sdk.api.model.request.* +import com.processout.sdk.api.model.request.POCardTokenizationPreferredSchemeRequest import com.processout.sdk.api.model.response.toResponse import com.processout.sdk.api.service.PO3DSService import com.processout.sdk.api.service.proxy3ds.POProxy3DSServiceRequest @@ -24,7 +24,8 @@ import com.processout.sdk.ui.checkout.delegate.* import com.processout.sdk.ui.core.annotation.ProcessOutInternalApi import com.processout.sdk.ui.napm.delegate.PONativeAlternativePaymentEvent import com.processout.sdk.ui.savedpaymentmethods.delegate.POSavedPaymentMethodsEvent -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch /** * Launcher that starts [PODynamicCheckoutActivity] and provides the result. @@ -37,7 +38,7 @@ class PODynamicCheckoutLauncher private constructor( private val activityOptions: ActivityOptionsCompat, private val threeDSService: PO3DSService, private val delegate: PODynamicCheckoutDelegate, - private val eventDispatcher: POEventDispatcher = POEventDispatcher + private val eventDispatcher: POEventDispatcher = POEventDispatcher.instance ) { companion object { diff --git a/ui/src/main/kotlin/com/processout/sdk/ui/napm/NativeAlternativePaymentInteractor.kt b/ui/src/main/kotlin/com/processout/sdk/ui/napm/NativeAlternativePaymentInteractor.kt index 71affbca3..1aeb453dc 100644 --- a/ui/src/main/kotlin/com/processout/sdk/ui/napm/NativeAlternativePaymentInteractor.kt +++ b/ui/src/main/kotlin/com/processout/sdk/ui/napm/NativeAlternativePaymentInteractor.kt @@ -82,7 +82,7 @@ internal class NativeAlternativePaymentInteractor( private val barcodeBitmapProvider: BarcodeBitmapProvider, private val mediaStorageProvider: MediaStorageProvider, private val captureRetryStrategy: PORetryStrategy, - private val eventDispatcher: POEventDispatcher = POEventDispatcher, + private val eventDispatcher: POEventDispatcher = POEventDispatcher.instance, private var logAttributes: Map = logAttributes(configuration.flow) ) : BaseInteractor() { diff --git a/ui/src/main/kotlin/com/processout/sdk/ui/napm/PONativeAlternativePaymentLauncher.kt b/ui/src/main/kotlin/com/processout/sdk/ui/napm/PONativeAlternativePaymentLauncher.kt index 2fc6bd64c..276c83868 100644 --- a/ui/src/main/kotlin/com/processout/sdk/ui/napm/PONativeAlternativePaymentLauncher.kt +++ b/ui/src/main/kotlin/com/processout/sdk/ui/napm/PONativeAlternativePaymentLauncher.kt @@ -25,7 +25,7 @@ class PONativeAlternativePaymentLauncher private constructor( private val launcher: ActivityResultLauncher, private val activityOptions: ActivityOptionsCompat, private val delegate: PONativeAlternativePaymentDelegate, - private val eventDispatcher: POEventDispatcher = POEventDispatcher + private val eventDispatcher: POEventDispatcher = POEventDispatcher.instance ) { companion object { diff --git a/ui/src/main/kotlin/com/processout/sdk/ui/savedpaymentmethods/POSavedPaymentMethodsLauncher.kt b/ui/src/main/kotlin/com/processout/sdk/ui/savedpaymentmethods/POSavedPaymentMethodsLauncher.kt index a84bb675c..89db10939 100644 --- a/ui/src/main/kotlin/com/processout/sdk/ui/savedpaymentmethods/POSavedPaymentMethodsLauncher.kt +++ b/ui/src/main/kotlin/com/processout/sdk/ui/savedpaymentmethods/POSavedPaymentMethodsLauncher.kt @@ -25,7 +25,7 @@ class POSavedPaymentMethodsLauncher private constructor( private val launcher: ActivityResultLauncher, private val activityOptions: ActivityOptionsCompat, private val delegate: POSavedPaymentMethodsDelegate, - private val eventDispatcher: POEventDispatcher = POEventDispatcher + private val eventDispatcher: POEventDispatcher = POEventDispatcher.instance ) { companion object { diff --git a/ui/src/main/kotlin/com/processout/sdk/ui/savedpaymentmethods/SavedPaymentMethodsInteractor.kt b/ui/src/main/kotlin/com/processout/sdk/ui/savedpaymentmethods/SavedPaymentMethodsInteractor.kt index 3af68d297..b1327440a 100644 --- a/ui/src/main/kotlin/com/processout/sdk/ui/savedpaymentmethods/SavedPaymentMethodsInteractor.kt +++ b/ui/src/main/kotlin/com/processout/sdk/ui/savedpaymentmethods/SavedPaymentMethodsInteractor.kt @@ -42,7 +42,7 @@ internal class SavedPaymentMethodsInteractor( private val configuration: POSavedPaymentMethodsConfiguration, private val invoicesService: POInvoicesService, private val customerTokensService: POCustomerTokensService, - private val eventDispatcher: POEventDispatcher = POEventDispatcher, + private val eventDispatcher: POEventDispatcher = POEventDispatcher.instance, private var logAttributes: Map = logAttributes( invoiceId = configuration.invoiceRequest.invoiceId ) From 1ff5f901a6c67a79fddf7e55a1576693c1159612 Mon Sep 17 00:00:00 2001 From: Vitalii Vanziak Date: Wed, 1 Oct 2025 14:17:06 +0300 Subject: [PATCH 2/2] Create new instance of POEventDispatcher in POCardTokenizationViewComponent --- .../tokenization/CardTokenizationInteractor.kt | 2 +- .../tokenization/CardTokenizationViewModel.kt | 7 +++++-- .../component/POCardTokenizationViewComponent.kt | 16 +++++++++++----- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/ui/src/main/kotlin/com/processout/sdk/ui/card/tokenization/CardTokenizationInteractor.kt b/ui/src/main/kotlin/com/processout/sdk/ui/card/tokenization/CardTokenizationInteractor.kt index b5ef1b063..55fb9e03a 100644 --- a/ui/src/main/kotlin/com/processout/sdk/ui/card/tokenization/CardTokenizationInteractor.kt +++ b/ui/src/main/kotlin/com/processout/sdk/ui/card/tokenization/CardTokenizationInteractor.kt @@ -60,7 +60,7 @@ internal class CardTokenizationInteractor( private val cardsRepository: POCardsRepository, private val cardSchemeProvider: CardSchemeProvider, private val addressSpecificationProvider: AddressSpecificationProvider, - private val eventDispatcher: POEventDispatcher = POEventDispatcher.instance + private val eventDispatcher: POEventDispatcher ) : BaseInteractor() { private companion object { diff --git a/ui/src/main/kotlin/com/processout/sdk/ui/card/tokenization/CardTokenizationViewModel.kt b/ui/src/main/kotlin/com/processout/sdk/ui/card/tokenization/CardTokenizationViewModel.kt index 055d7c144..51d1c9fdf 100644 --- a/ui/src/main/kotlin/com/processout/sdk/ui/card/tokenization/CardTokenizationViewModel.kt +++ b/ui/src/main/kotlin/com/processout/sdk/ui/card/tokenization/CardTokenizationViewModel.kt @@ -12,6 +12,7 @@ import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import com.processout.sdk.R import com.processout.sdk.api.ProcessOut +import com.processout.sdk.api.dispatcher.POEventDispatcher import com.processout.sdk.ui.card.tokenization.CardTokenizationInteractorState.* import com.processout.sdk.ui.card.tokenization.CardTokenizationViewModelState.* import com.processout.sdk.ui.core.shared.image.PODrawableImage @@ -40,7 +41,8 @@ internal class CardTokenizationViewModel private constructor( class Factory( private val app: Application, - private val configuration: POCardTokenizationConfiguration + private val configuration: POCardTokenizationConfiguration, + private val eventDispatcher: POEventDispatcher = POEventDispatcher.instance ) : ViewModelProvider.Factory { @Suppress("UNCHECKED_CAST") override fun create(modelClass: Class): T = @@ -52,7 +54,8 @@ internal class CardTokenizationViewModel private constructor( configuration = configuration, cardsRepository = ProcessOut.instance.cards, cardSchemeProvider = CardSchemeProvider(), - addressSpecificationProvider = AddressSpecificationProvider(app) + addressSpecificationProvider = AddressSpecificationProvider(app), + eventDispatcher = eventDispatcher ) ) as T } diff --git a/ui/src/main/kotlin/com/processout/sdk/ui/card/tokenization/component/POCardTokenizationViewComponent.kt b/ui/src/main/kotlin/com/processout/sdk/ui/card/tokenization/component/POCardTokenizationViewComponent.kt index b3daab62d..4d99cfacd 100644 --- a/ui/src/main/kotlin/com/processout/sdk/ui/card/tokenization/component/POCardTokenizationViewComponent.kt +++ b/ui/src/main/kotlin/com/processout/sdk/ui/card/tokenization/component/POCardTokenizationViewComponent.kt @@ -61,7 +61,7 @@ class POCardTokenizationViewComponent private constructor( private val cardScannerLauncher: POCardScannerLauncher, private val delegate: POCardTokenizationDelegate, private val callback: (ProcessOutResult) -> Unit, - private val eventDispatcher: POEventDispatcher = POEventDispatcher.instance + private val eventDispatcher: POEventDispatcher ) { private val scope = lifecycleOwner.lifecycleScope @@ -78,10 +78,12 @@ class POCardTokenizationViewComponent private constructor( callback: (ProcessOutResult) -> Unit ): POCardTokenizationViewComponent { val configuration = configuration.map() + val eventDispatcher = POEventDispatcher() val viewModel: CardTokenizationViewModel by from.viewModels { CardTokenizationViewModel.Factory( app = from.requireActivity().application, - configuration = configuration + configuration = configuration, + eventDispatcher = eventDispatcher ) } return POCardTokenizationViewComponent( @@ -100,7 +102,8 @@ class POCardTokenizationViewComponent private constructor( } ), delegate = delegate, - callback = callback + callback = callback, + eventDispatcher = eventDispatcher ) } @@ -115,10 +118,12 @@ class POCardTokenizationViewComponent private constructor( callback: (ProcessOutResult) -> Unit ): POCardTokenizationViewComponent { val configuration = configuration.map() + val eventDispatcher = POEventDispatcher() val viewModel: CardTokenizationViewModel by from.viewModels { CardTokenizationViewModel.Factory( app = from.application, - configuration = configuration + configuration = configuration, + eventDispatcher = eventDispatcher ) } return POCardTokenizationViewComponent( @@ -137,7 +142,8 @@ class POCardTokenizationViewComponent private constructor( } ), delegate = delegate, - callback = callback + callback = callback, + eventDispatcher = eventDispatcher ) }