diff --git a/PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/UpdateClientConfigAPI.kt b/CorePayments/src/main/java/com/paypal/android/corepayments/UpdateClientConfigAPI.kt similarity index 74% rename from PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/UpdateClientConfigAPI.kt rename to CorePayments/src/main/java/com/paypal/android/corepayments/UpdateClientConfigAPI.kt index d33de6b3f..1792e1766 100644 --- a/PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/UpdateClientConfigAPI.kt +++ b/CorePayments/src/main/java/com/paypal/android/corepayments/UpdateClientConfigAPI.kt @@ -1,23 +1,30 @@ -package com.paypal.android.paypalwebpayments +package com.paypal.android.corepayments import android.content.Context import androidx.annotation.RawRes -import com.paypal.android.corepayments.CoreConfig -import com.paypal.android.corepayments.LoadRawResourceResult -import com.paypal.android.corepayments.PayPalSDKError -import com.paypal.android.corepayments.ResourceLoader +import androidx.annotation.RestrictTo import com.paypal.android.corepayments.graphql.GraphQLClient import com.paypal.android.corepayments.graphql.GraphQLResult import org.json.JSONException import org.json.JSONObject -internal class UpdateClientConfigAPI( +/** + * @suppress + */ +@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) +class UpdateClientConfigAPI( private val coreConfig: CoreConfig, private val applicationContext: Context, private val graphQLClient: GraphQLClient, private val resourceLoader: ResourceLoader ) { + private object Defaults { + const val INTEGRATION_ARTIFACT = "MOBILE_SDK" + const val USER_EXPERIENCE_FLOW = "INCONTEXT" + const val PRODUCT_FLOW = "HERMES" + } + constructor(context: Context, coreConfig: CoreConfig) : this( coreConfig, context.applicationContext, @@ -25,18 +32,11 @@ internal class UpdateClientConfigAPI( ResourceLoader() ) - suspend fun updateClientConfig( - orderId: String, - fundingSource: PayPalWebCheckoutFundingSource - ): UpdateClientConfigResult { + suspend fun updateClientConfig(params: UpdateClientConfigParams): UpdateClientConfigResult { @RawRes val resId = R.raw.graphql_query_update_client_config return when (val result = resourceLoader.loadRawResource(applicationContext, resId)) { is LoadRawResourceResult.Success -> - sendUpdateClientConfigGraphQLRequest( - query = result.value, - orderId = orderId, - fundingSource = fundingSource - ) + sendUpdateClientConfigGraphQLRequest(query = result.value, params = params) is LoadRawResourceResult.Failure -> UpdateClientConfigResult.Failure( PayPalSDKError(0, "TODO: implement") @@ -46,15 +46,14 @@ internal class UpdateClientConfigAPI( private suspend fun sendUpdateClientConfigGraphQLRequest( query: String, - orderId: String, - fundingSource: PayPalWebCheckoutFundingSource + params: UpdateClientConfigParams ): UpdateClientConfigResult { val variables = JSONObject() - .put("orderID", orderId) - .put("fundingSource", fundingSource.value) - .put("integrationArtifact", "PAYPAL_JS_SDK") - .put("userExperienceFlow", "INCONTEXT") - .put("productFlow", "SMART_PAYMENT_BUTTONS") + .put("orderID", params.orderId) + .put("fundingSource", params.fundingSource) + .put("integrationArtifact", Defaults.INTEGRATION_ARTIFACT) + .put("userExperienceFlow", Defaults.USER_EXPERIENCE_FLOW) + .put("productFlow", Defaults.PRODUCT_FLOW) .put("buttonSessionId", JSONObject.NULL) val graphQLRequest = JSONObject() diff --git a/CorePayments/src/main/java/com/paypal/android/corepayments/UpdateClientConfigParams.kt b/CorePayments/src/main/java/com/paypal/android/corepayments/UpdateClientConfigParams.kt new file mode 100644 index 000000000..54cf5c34f --- /dev/null +++ b/CorePayments/src/main/java/com/paypal/android/corepayments/UpdateClientConfigParams.kt @@ -0,0 +1,12 @@ +package com.paypal.android.corepayments + +import androidx.annotation.RestrictTo + +/** + * @suppress + */ +@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) +data class UpdateClientConfigParams( + val orderId: String, + val fundingSource: String +) diff --git a/PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/UpdateClientConfigResult.kt b/CorePayments/src/main/java/com/paypal/android/corepayments/UpdateClientConfigResult.kt similarity index 58% rename from PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/UpdateClientConfigResult.kt rename to CorePayments/src/main/java/com/paypal/android/corepayments/UpdateClientConfigResult.kt index 521110fb6..ba8f8039c 100644 --- a/PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/UpdateClientConfigResult.kt +++ b/CorePayments/src/main/java/com/paypal/android/corepayments/UpdateClientConfigResult.kt @@ -1,7 +1,11 @@ -package com.paypal.android.paypalwebpayments +package com.paypal.android.corepayments -import com.paypal.android.corepayments.PayPalSDKError +import androidx.annotation.RestrictTo +/** + * @suppress + */ +@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) sealed class UpdateClientConfigResult { data class Success(val clientConfig: String) : UpdateClientConfigResult() diff --git a/PayPalWebPayments/src/main/res/raw/graphql_query_update_client_config.graphql b/CorePayments/src/main/res/raw/graphql_query_update_client_config.graphql similarity index 100% rename from PayPalWebPayments/src/main/res/raw/graphql_query_update_client_config.graphql rename to CorePayments/src/main/res/raw/graphql_query_update_client_config.graphql diff --git a/PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/PayPalWebCheckoutClient.kt b/PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/PayPalWebCheckoutClient.kt index 9441c7af4..2bc0bc9fc 100644 --- a/PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/PayPalWebCheckoutClient.kt +++ b/PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/PayPalWebCheckoutClient.kt @@ -4,6 +4,8 @@ import android.content.Context import android.content.Intent import androidx.activity.ComponentActivity import com.paypal.android.corepayments.CoreConfig +import com.paypal.android.corepayments.UpdateClientConfigAPI +import com.paypal.android.corepayments.UpdateClientConfigParams import com.paypal.android.corepayments.analytics.AnalyticsService import com.paypal.android.paypalwebpayments.analytics.CheckoutEvent import com.paypal.android.paypalwebpayments.analytics.PayPalWebAnalytics @@ -55,11 +57,7 @@ class PayPalWebCheckoutClient internal constructor( ): PayPalPresentAuthChallengeResult { checkoutOrderId = request.orderId analytics.notify(CheckoutEvent.STARTED, checkoutOrderId) - - if (request.fundingSource == PayPalWebCheckoutFundingSource.CARD) { - // TODO: consider returning an error immediately - } - + updateCCO(request) val result = payPalWebLauncher.launchPayPalWebCheckout(activity, request) when (result) { is PayPalPresentAuthChallengeResult.Success -> analytics.notify( @@ -73,53 +71,6 @@ class PayPalWebCheckoutClient internal constructor( return result } - /** - * Confirm PayPal payment source for an order. - * - * @param request [PayPalWebCheckoutRequest] for requesting an order approval - */ - fun start( - activity: ComponentActivity, - request: PayPalWebCheckoutRequest, - callback: PayPalWebStartCallback - ) { - CoroutineScope(dispatcher).launch { - checkoutOrderId = request.orderId - analytics.notify(CheckoutEvent.STARTED, checkoutOrderId) - - if (request.fundingSource == PayPalWebCheckoutFundingSource.CARD) { - val updateConfigResult = request.run { - updateClientConfigAPI.updateClientConfig( - orderId = orderId, - fundingSource = fundingSource - ) - } - if (updateConfigResult is UpdateClientConfigResult.Failure) { - // notify failure - callback.onPayPalWebStartResult( - PayPalPresentAuthChallengeResult.Failure(updateConfigResult.error) - ) - return@launch - } - } - - val result = payPalWebLauncher.launchPayPalWebCheckout(activity, request) - when (result) { - is PayPalPresentAuthChallengeResult.Success -> analytics.notify( - CheckoutEvent.AUTH_CHALLENGE_PRESENTATION_SUCCEEDED, - checkoutOrderId - ) - - is PayPalPresentAuthChallengeResult.Failure -> - analytics.notify( - CheckoutEvent.AUTH_CHALLENGE_PRESENTATION_FAILED, - checkoutOrderId - ) - } - callback.onPayPalWebStartResult(result) - } - } - /** * Vault PayPal as a payment method. * @@ -205,4 +156,18 @@ class PayPalWebCheckoutClient internal constructor( } return result } + + private fun updateCCO(request: PayPalWebCheckoutRequest) { + CoroutineScope(dispatcher).launch { + val fundingSource = when (request.fundingSource) { + PayPalWebCheckoutFundingSource.PAYPAL -> "payPal" + else -> request.fundingSource.value + } + val params = + UpdateClientConfigParams(orderId = request.orderId, fundingSource = fundingSource) + // ignore result; in the rare occasion this call fails, we will still allow + // the transaction to proceed + updateClientConfigAPI.updateClientConfig(params = params) + } + } } diff --git a/PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/PayPalWebStartCallback.kt b/PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/PayPalWebStartCallback.kt deleted file mode 100644 index 76df40d5a..000000000 --- a/PayPalWebPayments/src/main/java/com/paypal/android/paypalwebpayments/PayPalWebStartCallback.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.paypal.android.paypalwebpayments - -import androidx.annotation.MainThread - -fun interface PayPalWebStartCallback { - - /** - * Called when the result of a PayPal web launch is available. - */ - @MainThread - fun onPayPalWebStartResult(result: PayPalPresentAuthChallengeResult) -} diff --git a/PayPalWebPayments/src/test/java/com/paypal/android/paypalwebpayments/PayPalWebCheckoutClientUnitTest.kt b/PayPalWebPayments/src/test/java/com/paypal/android/paypalwebpayments/PayPalWebCheckoutClientUnitTest.kt index 56effe635..2841beff3 100644 --- a/PayPalWebPayments/src/test/java/com/paypal/android/paypalwebpayments/PayPalWebCheckoutClientUnitTest.kt +++ b/PayPalWebPayments/src/test/java/com/paypal/android/paypalwebpayments/PayPalWebCheckoutClientUnitTest.kt @@ -3,6 +3,7 @@ package com.paypal.android.paypalwebpayments import android.content.Intent import androidx.fragment.app.FragmentActivity import com.paypal.android.corepayments.PayPalSDKError +import com.paypal.android.corepayments.UpdateClientConfigAPI import com.paypal.android.paypalwebpayments.analytics.PayPalWebAnalytics import io.mockk.every import io.mockk.mockk