Skip to content

Commit d735514

Browse files
feat(ad-hoc): Apply Netcetera 3DS SDK to PO screens (#324)
1 parent 60317e4 commit d735514

22 files changed

Lines changed: 123 additions & 210 deletions

build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,6 @@ ext {
9090

9191
netcetera3dsSdkVersion = '2.5.3.1'
9292
checkout3dsSdkVersion = '3.2.7'
93-
adyen3dsSdkVersion = '2.2.15' // This is a max supported version. Higher versions use unsupported certificates format.
9493

9594
junitVersion = '4.13.2'
9695
mockitoVersion = '5.19.0'

example/build.gradle

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,8 @@ def setBuildConfig(buildType, String projectId, String projectKey) {
8080
dependencies {
8181
implementation project(path: ':sdk')
8282
implementation project(path: ':ui')
83-
implementation project(path: ':checkout-3ds')
8483
implementation project(path: ':netcetera-3ds')
85-
86-
implementation "com.adyen.threeds:adyen-3ds2:$adyen3dsSdkVersion"
84+
implementation project(path: ':checkout-3ds')
8785

8886
implementation "androidx.core:core-ktx:$androidxCoreVersion"
8987
implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"

example/src/main/kotlin/com/processout/example/service/threeds/Checkout3DSServiceDelegate.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.processout.example.service.threeds
22

33
import android.app.Activity
4-
import android.net.Uri
4+
import androidx.core.net.toUri
55
import com.checkout.threeds.domain.model.UICustomization
66
import com.checkout.threeds.standalone.models.ConfigParameters
77
import com.checkout.threeds.standalone.models.ThreeDS2ServiceConfiguration
@@ -17,19 +17,21 @@ class Checkout3DSServiceDelegate(
1717
private val returnUrl: String
1818
) : POCheckout3DSServiceDelegate {
1919

20-
override fun configuration(parameters: ConfigParameters): ThreeDS2ServiceConfiguration {
21-
return ThreeDS2ServiceConfiguration(
20+
override fun configuration(parameters: ConfigParameters) =
21+
ThreeDS2ServiceConfiguration(
2222
context = activity,
2323
configParameters = parameters,
2424
// Optional properties.
2525
locale = Locale.UK,
2626
uiCustomization = UICustomization(),
27-
appUri = Uri.parse("https://my-app-url.com"),
27+
appUri = "https://my-app-url.com".toUri(),
2828
challengeTimeout = 300
2929
)
30-
}
3130

32-
override fun handle(redirect: PO3DSRedirect, callback: (ProcessOutResult<String>) -> Unit) {
31+
override fun handle(
32+
redirect: PO3DSRedirect,
33+
callback: (ProcessOutResult<String>) -> Unit
34+
) {
3335
customTabLauncher.launch(redirect, returnUrl, callback)
3436
}
3537
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.processout.example.service.threeds
2+
3+
import androidx.activity.ComponentActivity
4+
import com.processout.sdk.api.model.threeds.PO3DSRedirect
5+
import com.processout.sdk.core.ProcessOutResult
6+
import com.processout.sdk.netcetera.threeds.PONetcetera3DS2ServiceDelegate
7+
import com.processout.sdk.ui.threeds.PO3DSRedirectCustomTabLauncher
8+
9+
class Netcetera3DS2ServiceDelegate(
10+
private val provideActivity: () -> ComponentActivity?,
11+
private val customTabLauncher: PO3DSRedirectCustomTabLauncher,
12+
private val returnUrl: String
13+
) : PONetcetera3DS2ServiceDelegate {
14+
15+
override fun activity(): ComponentActivity? = provideActivity()
16+
17+
override fun handle(
18+
redirect: PO3DSRedirect,
19+
callback: (ProcessOutResult<String>) -> Unit
20+
) {
21+
customTabLauncher.launch(redirect, returnUrl, callback)
22+
}
23+
}

example/src/main/kotlin/com/processout/example/service/threeds/POAdyen3DSService.kt

Lines changed: 0 additions & 135 deletions
This file was deleted.

example/src/main/kotlin/com/processout/example/ui/screen/card/payment/CardPaymentFragment.kt

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ import androidx.fragment.app.viewModels
88
import androidx.lifecycle.Lifecycle
99
import androidx.lifecycle.lifecycleScope
1010
import androidx.lifecycle.repeatOnLifecycle
11-
import com.checkout.threeds.Environment
11+
import com.netcetera.threeds.sdk.api.transaction.Transaction.BridgingMessageExtensionVersion
1212
import com.processout.example.R
1313
import com.processout.example.databinding.FragmentCardPaymentBinding
1414
import com.processout.example.service.threeds.Checkout3DSServiceDelegate
15-
import com.processout.example.service.threeds.POAdyen3DSService
15+
import com.processout.example.service.threeds.Netcetera3DS2ServiceDelegate
1616
import com.processout.example.shared.Constants
1717
import com.processout.example.shared.toMessage
1818
import com.processout.example.ui.screen.MainActivity
@@ -25,12 +25,14 @@ import com.processout.sdk.checkout.threeds.POCheckout3DSService
2525
import com.processout.sdk.core.ProcessOutActivityResult
2626
import com.processout.sdk.core.onFailure
2727
import com.processout.sdk.core.onSuccess
28+
import com.processout.sdk.netcetera.threeds.PONetcetera3DS2Service
29+
import com.processout.sdk.netcetera.threeds.PONetcetera3DS2ServiceConfiguration
30+
import com.processout.sdk.ui.card.tokenization.POCardTokenizationActivity
2831
import com.processout.sdk.ui.card.tokenization.POCardTokenizationConfiguration
2932
import com.processout.sdk.ui.card.tokenization.POCardTokenizationConfiguration.CardScannerConfiguration
3033
import com.processout.sdk.ui.card.tokenization.POCardTokenizationLauncher
3134
import com.processout.sdk.ui.shared.view.dialog.POAlertDialog
3235
import com.processout.sdk.ui.threeds.PO3DSRedirectCustomTabLauncher
33-
import com.processout.sdk.ui.threeds.POTest3DSService
3436
import kotlinx.coroutines.Dispatchers
3537
import kotlinx.coroutines.launch
3638
import kotlinx.coroutines.withContext
@@ -101,21 +103,25 @@ class CardPaymentFragment : BaseFragment<FragmentCardPaymentBinding>(
101103
}
102104

103105
private fun create3DSService(): PO3DSService {
104-
val selected3DSService = with(binding.threedsServiceRadioGroup) {
105-
findViewById<RadioButton>(checkedRadioButtonId).text.toString()
106+
val selected3DSService = binding.threedsServiceRadioGroup.let {
107+
it.findViewById<RadioButton>(it.checkedRadioButtonId).text.toString()
106108
}
107109
return when (selected3DSService) {
108110
getString(R.string.threeds_service_checkout) -> createCheckout3DSService()
109-
getString(R.string.threeds_service_adyen) -> createAdyen3DSService()
110-
else -> createTest3DSService()
111+
else -> createNetcetera3DSService()
111112
}
112113
}
113114

114-
private fun createTest3DSService(): PO3DSService =
115-
POTest3DSService(
116-
activity = requireActivity(),
117-
customTabLauncher = customTabLauncher,
118-
returnUrl = Constants.RETURN_URL
115+
private fun createNetcetera3DSService(): PO3DSService =
116+
PONetcetera3DS2Service(
117+
delegate = Netcetera3DS2ServiceDelegate(
118+
provideActivity = { POCardTokenizationActivity.instance },
119+
customTabLauncher = customTabLauncher,
120+
returnUrl = Constants.RETURN_URL
121+
),
122+
configuration = PONetcetera3DS2ServiceConfiguration(
123+
bridgingExtensionVersion = BridgingMessageExtensionVersion.V20
124+
)
119125
)
120126

121127
private fun createCheckout3DSService(): PO3DSService =
@@ -126,16 +132,7 @@ class CardPaymentFragment : BaseFragment<FragmentCardPaymentBinding>(
126132
customTabLauncher = customTabLauncher,
127133
returnUrl = Constants.RETURN_URL
128134
)
129-
) // Optional parameter, by default Environment.PRODUCTION
130-
.with(environment = Environment.PRODUCTION)
131-
.build()
132-
133-
private fun createAdyen3DSService(): PO3DSService =
134-
POAdyen3DSService(
135-
activity = requireActivity(),
136-
customTabLauncher = customTabLauncher,
137-
returnUrl = Constants.RETURN_URL
138-
)
135+
).build()
139136

140137
private fun setOnClickListeners() {
141138
binding.authorizeInvoiceButton.setOnClickListener { onSubmitClick() }

example/src/main/kotlin/com/processout/example/ui/screen/checkout/DynamicCheckoutFragment.kt

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ import androidx.fragment.app.viewModels
77
import androidx.lifecycle.Lifecycle
88
import androidx.lifecycle.lifecycleScope
99
import androidx.lifecycle.repeatOnLifecycle
10+
import com.netcetera.threeds.sdk.api.transaction.Transaction.BridgingMessageExtensionVersion
1011
import com.processout.example.R
1112
import com.processout.example.databinding.FragmentDynamicCheckoutBinding
12-
import com.processout.example.service.threeds.Checkout3DSServiceDelegate
13+
import com.processout.example.service.threeds.Netcetera3DS2ServiceDelegate
1314
import com.processout.example.shared.Constants
1415
import com.processout.example.shared.toMessage
1516
import com.processout.example.ui.screen.MainActivity
@@ -18,11 +19,13 @@ import com.processout.example.ui.screen.checkout.DynamicCheckoutUiState.*
1819
import com.processout.sdk.api.ProcessOut
1920
import com.processout.sdk.api.model.request.POInvoiceRequest
2021
import com.processout.sdk.api.service.PO3DSService
21-
import com.processout.sdk.checkout.threeds.POCheckout3DSService
2222
import com.processout.sdk.core.POUnit
2323
import com.processout.sdk.core.ProcessOutActivityResult
2424
import com.processout.sdk.core.onFailure
2525
import com.processout.sdk.core.onSuccess
26+
import com.processout.sdk.netcetera.threeds.PONetcetera3DS2Service
27+
import com.processout.sdk.netcetera.threeds.PONetcetera3DS2ServiceConfiguration
28+
import com.processout.sdk.ui.checkout.PODynamicCheckoutActivity
2629
import com.processout.sdk.ui.checkout.PODynamicCheckoutConfiguration
2730
import com.processout.sdk.ui.checkout.PODynamicCheckoutConfiguration.AlternativePaymentConfiguration
2831
import com.processout.sdk.ui.checkout.PODynamicCheckoutLauncher
@@ -48,7 +51,7 @@ class DynamicCheckoutFragment : BaseFragment<FragmentDynamicCheckoutBinding>(
4851
)
4952
launcher = PODynamicCheckoutLauncher.create(
5053
from = this,
51-
threeDSService = createCheckout3DSService(
54+
threeDSService = createNetcetera3DSService(
5255
customTabLauncher = PO3DSRedirectCustomTabLauncher.create(from = this)
5356
),
5457
delegate = delegate,
@@ -102,16 +105,18 @@ class DynamicCheckoutFragment : BaseFragment<FragmentDynamicCheckoutBinding>(
102105
viewModel.onLaunched()
103106
}
104107

105-
private fun createCheckout3DSService(
108+
private fun createNetcetera3DSService(
106109
customTabLauncher: PO3DSRedirectCustomTabLauncher
107-
): PO3DSService = POCheckout3DSService.Builder(
108-
activity = requireActivity(),
109-
delegate = Checkout3DSServiceDelegate(
110-
activity = requireActivity(),
110+
): PO3DSService = PONetcetera3DS2Service(
111+
delegate = Netcetera3DS2ServiceDelegate(
112+
provideActivity = { PODynamicCheckoutActivity.instance },
111113
customTabLauncher = customTabLauncher,
112114
returnUrl = Constants.RETURN_URL
115+
),
116+
configuration = PONetcetera3DS2ServiceConfiguration(
117+
bridgingExtensionVersion = BridgingMessageExtensionVersion.V20
113118
)
114-
).build()
119+
)
115120

116121
private fun setOnClickListeners() {
117122
binding.authorizeInvoiceButton.setOnClickListener { onSubmitClick() }

example/src/main/res/layout/fragment_card_payment.xml

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -88,29 +88,21 @@
8888
android:id="@+id/threeds_service_radio_group"
8989
android:layout_width="match_parent"
9090
android:layout_height="wrap_content"
91-
android:checkedButton="@id/threeds_service_checkout">
91+
android:checkedButton="@id/threeds_service_netcetera">
9292

9393
<RadioButton
94-
android:id="@+id/threeds_service_test"
94+
android:id="@+id/threeds_service_netcetera"
9595
android:layout_width="match_parent"
9696
android:layout_height="wrap_content"
97-
android:text="@string/threeds_service_test"
98-
android:textAppearance="@style/TextAppearance.ProcessOut.Fixed.Body"
99-
android:visibility="gone" />
97+
android:text="@string/threeds_service_netcetera"
98+
android:textAppearance="@style/TextAppearance.ProcessOut.Fixed.Body" />
10099

101100
<RadioButton
102101
android:id="@+id/threeds_service_checkout"
103102
android:layout_width="match_parent"
104103
android:layout_height="wrap_content"
105104
android:text="@string/threeds_service_checkout"
106105
android:textAppearance="@style/TextAppearance.ProcessOut.Fixed.Body" />
107-
108-
<RadioButton
109-
android:id="@+id/threeds_service_adyen"
110-
android:layout_width="match_parent"
111-
android:layout_height="wrap_content"
112-
android:text="@string/threeds_service_adyen"
113-
android:textAppearance="@style/TextAppearance.ProcessOut.Fixed.Body" />
114106
</RadioGroup>
115107
</LinearLayout>
116108
</androidx.core.widget.NestedScrollView>

0 commit comments

Comments
 (0)