Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 10 additions & 5 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,17 @@

## Unreleased

* Add overloaded functions with callbacks for `start` and `vault` methods in
`PayPalWebCheckoutClient`
* Modify `PayPalWebCheckoutRequest` to include `appSwitchWhenEligible` property to control app
* Adds new property `appSwitchWhenEligible`in `PayPalWebCheckoutRequest` to include to control app
switch behavior
* Breaking Changes
* Make start and vault functions in `PayPalWebCheckoutClient` suspend functions
* Adds new property `appSwitchWhenEligible`in `PayPalWebVaultRequest` to include to control app
switch behavior
* Adds new property `appLinkUrl` in `PayPalWebCheckoutRequest` to specify app link url that will be
used to recognize app after approving order
* Adds new property `appLinkUrl` in `PayPalWebVaultRequest` to specify app link url that will be
used to recognize app after vaulting
* Deprecates `urlScheme` property in `PayPalWebCheckoutClient`
* Adds new functions `startAsync` and `vaultAsync` in `PayPalWebCheckoutClient` to support Kotlin
coroutines

## 2.3.0 (2025-11-03)
* PayPalWebPayments
Expand Down
38 changes: 0 additions & 38 deletions CorePayments/api/CorePayments.api
Original file line number Diff line number Diff line change
Expand Up @@ -112,18 +112,6 @@ public final class com/paypal/android/corepayments/UpdateClientConfigAPI$Default
public static final field USER_EXPERIENCE_FLOW Ljava/lang/String;
}

public final class com/paypal/android/corepayments/UpdateClientConfigResponse {
public static final field Companion Lcom/paypal/android/corepayments/UpdateClientConfigResponse$Companion;
public fun <init> (Ljava/lang/String;)V
public final fun component1 ()Ljava/lang/String;
public final fun copy (Ljava/lang/String;)Lcom/paypal/android/corepayments/UpdateClientConfigResponse;
public static synthetic fun copy$default (Lcom/paypal/android/corepayments/UpdateClientConfigResponse;Ljava/lang/String;ILjava/lang/Object;)Lcom/paypal/android/corepayments/UpdateClientConfigResponse;
public fun equals (Ljava/lang/Object;)Z
public final fun getUpdateClientConfig ()Ljava/lang/String;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}

public final class com/paypal/android/corepayments/UpdateClientConfigResponse$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
public static final field INSTANCE Lcom/paypal/android/corepayments/UpdateClientConfigResponse$$serializer;
public fun childSerializers ()[Lkotlinx/serialization/KSerializer;
Expand All @@ -139,9 +127,6 @@ public final class com/paypal/android/corepayments/UpdateClientConfigResponse$Co
public final fun serializer ()Lkotlinx/serialization/KSerializer;
}

public abstract class com/paypal/android/corepayments/UpdateClientConfigResult {
}

public final class com/paypal/android/corepayments/UpdateClientConfigResult$Failure : com/paypal/android/corepayments/UpdateClientConfigResult {
public fun <init> (Lcom/paypal/android/corepayments/PayPalSDKError;)V
public final fun component1 ()Lcom/paypal/android/corepayments/PayPalSDKError;
Expand All @@ -160,29 +145,6 @@ public final class com/paypal/android/corepayments/UpdateClientConfigResult$Succ
public fun toString ()Ljava/lang/String;
}

public final class com/paypal/android/corepayments/UpdateClientConfigVariables {
public static final field Companion Lcom/paypal/android/corepayments/UpdateClientConfigVariables$Companion;
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1 ()Ljava/lang/String;
public final fun component2 ()Ljava/lang/String;
public final fun component3 ()Ljava/lang/String;
public final fun component4 ()Ljava/lang/String;
public final fun component5 ()Ljava/lang/String;
public final fun component6 ()Ljava/lang/String;
public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/paypal/android/corepayments/UpdateClientConfigVariables;
public static synthetic fun copy$default (Lcom/paypal/android/corepayments/UpdateClientConfigVariables;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/paypal/android/corepayments/UpdateClientConfigVariables;
public fun equals (Ljava/lang/Object;)Z
public final fun getButtonSessionId ()Ljava/lang/String;
public final fun getFundingSource ()Ljava/lang/String;
public final fun getIntegrationArtifact ()Ljava/lang/String;
public final fun getProductFlow ()Ljava/lang/String;
public final fun getToken ()Ljava/lang/String;
public final fun getUserExperienceFlow ()Ljava/lang/String;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}

public final class com/paypal/android/corepayments/UpdateClientConfigVariables$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
public static final field INSTANCE Lcom/paypal/android/corepayments/UpdateClientConfigVariables$$serializer;
public fun childSerializers ()[Lkotlinx/serialization/KSerializer;
Expand Down
11 changes: 11 additions & 0 deletions Demo/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,17 @@
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />

<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />

<data
android:host="ppcp-mobile-demo-sandbox-87bbd7f0a27f.herokuapp.com"
android:pathPrefix="/"
android:scheme="https" />
</intent-filter>
</activity>
</application>

Expand Down
2 changes: 1 addition & 1 deletion Demo/src/main/java/com/paypal/android/DemoConstants.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.paypal.android

object DemoConstants {
const val APP_URL = "com.paypal.android.demo://"
const val APP_URL = "https://ppcp-mobile-demo-sandbox-87bbd7f0a27f.herokuapp.com/"
const val SUCCESS_URL = "${APP_URL}success"
const val CANCEL_URL = "${APP_URL}cancel"
const val VAULT_SUCCESS_URL = "${APP_URL}vault/success"
Expand Down
7 changes: 7 additions & 0 deletions Demo/src/main/java/com/paypal/android/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.paypal.android

import android.content.Intent
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
Expand All @@ -21,4 +22,10 @@ class MainActivity : ComponentActivity() {
DemoApp()
}
}

override fun onNewIntent(intent: Intent?) {
println("MainActivity: $intent")
println("MainActivity: ${intent?.data}")
super.onNewIntent(intent)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import android.util.Log
import androidx.activity.ComponentActivity
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.paypal.android.DemoConstants.APP_URL
import com.paypal.android.api.model.Order
import com.paypal.android.api.model.OrderIntent
import com.paypal.android.api.services.SDKSampleServerAPI
Expand Down Expand Up @@ -43,7 +44,7 @@ class PayPalCheckoutViewModel @Inject constructor(
private val coreConfig = CoreConfig(SDKSampleServerAPI.clientId)
private val payPalDataCollector = PayPalDataCollector(coreConfig)
private val paypalClient =
PayPalWebCheckoutClient(applicationContext, coreConfig, "com.paypal.android.demo")
PayPalWebCheckoutClient(applicationContext, coreConfig)

private val _uiState = MutableStateFlow(PayPalUiState())
val uiState = _uiState.asStateFlow()
Expand Down Expand Up @@ -116,8 +117,8 @@ class PayPalCheckoutViewModel @Inject constructor(
payPalWebCheckoutState = ActionState.Loading

val checkoutRequest =
PayPalWebCheckoutRequest(orderId, fundingSource, appSwitchWhenEligible)
when (val startResult = paypalClient.start(activity, checkoutRequest)) {
PayPalWebCheckoutRequest(orderId, fundingSource, appSwitchWhenEligible, APP_URL)
when (val startResult = paypalClient.startAsync(activity, checkoutRequest)) {
is PayPalPresentAuthChallengeResult.Success -> {
// do nothing; wait for user to authenticate PayPal checkout in Chrome Custom Tab
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import android.content.Intent
import androidx.activity.ComponentActivity
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.paypal.android.DemoConstants.APP_URL
import com.paypal.android.api.model.PayPalSetupToken
import com.paypal.android.api.services.SDKSampleServerAPI
import com.paypal.android.corepayments.CoreConfig
Expand Down Expand Up @@ -35,7 +36,7 @@ class PayPalVaultViewModel @Inject constructor(
}

private val coreConfig = CoreConfig(SDKSampleServerAPI.clientId)
private val paypalClient = PayPalWebCheckoutClient(applicationContext, coreConfig, URL_SCHEME)
private val paypalClient = PayPalWebCheckoutClient(applicationContext, coreConfig)

private val _uiState = MutableStateFlow(PayPalVaultUiState())
val uiState = _uiState.asStateFlow()
Expand Down Expand Up @@ -83,7 +84,8 @@ class PayPalVaultViewModel @Inject constructor(
viewModelScope.launch {
val request = PayPalWebVaultRequest(
setupTokenId,
appSwitchWhenEligible
appSwitchWhenEligible,
APP_URL
)
vaultSetupTokenWithRequest(activity, request)
}
Expand All @@ -97,7 +99,7 @@ class PayPalVaultViewModel @Inject constructor(
vaultPayPalState = ActionState.Loading

viewModelScope.launch {
when (val result = paypalClient.vault(activity, request)) {
when (val result = paypalClient.vaultAsync(activity, request)) {
is PayPalPresentAuthChallengeResult.Success -> {
// do nothing; wait for user to authenticate PayPal vault in Chrome Custom Tab
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import android.content.Intent
import androidx.activity.ComponentActivity
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.paypal.android.DemoConstants
import com.paypal.android.DemoConstants.RETURN_URL
import com.paypal.android.api.model.CardSetupToken
import com.paypal.android.api.services.SDKSampleServerAPI
import com.paypal.android.cardpayments.Card
Expand Down Expand Up @@ -123,8 +123,7 @@ class VaultCardViewModel @Inject constructor(
private fun updateSetupTokenWithId(activity: ComponentActivity, setupTokenId: String) {
updateSetupTokenState = ActionState.Loading
val card = parseCard(_uiState.value)
val returnUrl = DemoConstants.RETURN_URL
val cardVaultRequest = CardVaultRequest(setupTokenId, card, returnUrl)
val cardVaultRequest = CardVaultRequest(setupTokenId, card, RETURN_URL)
cardClient.vault(cardVaultRequest) { result ->
when (result) {
is CardVaultResult.Success -> {
Expand Down
25 changes: 17 additions & 8 deletions PayPalWebPayments/api/PayPalWebPayments.api
Original file line number Diff line number Diff line change
Expand Up @@ -35,17 +35,20 @@ public abstract interface class com/paypal/android/paypalwebpayments/PayPalWebCh
}

public final class com/paypal/android/paypalwebpayments/PayPalWebCheckoutClient {
public fun <init> (Landroid/content/Context;Lcom/paypal/android/corepayments/CoreConfig;)V
public fun <init> (Landroid/content/Context;Lcom/paypal/android/corepayments/CoreConfig;Ljava/lang/String;)V
public final fun finishStart (Landroid/content/Intent;)Lcom/paypal/android/paypalwebpayments/PayPalWebCheckoutFinishStartResult;
public final fun finishStart (Landroid/content/Intent;Ljava/lang/String;)Lcom/paypal/android/paypalwebpayments/PayPalWebCheckoutFinishStartResult;
public final fun finishVault (Landroid/content/Intent;)Lcom/paypal/android/paypalwebpayments/PayPalWebCheckoutFinishVaultResult;
public final fun finishVault (Landroid/content/Intent;Ljava/lang/String;)Lcom/paypal/android/paypalwebpayments/PayPalWebCheckoutFinishVaultResult;
public final fun getInstanceState ()Ljava/lang/String;
public final fun restore (Ljava/lang/String;)V
public final fun start (Landroid/app/Activity;Lcom/paypal/android/paypalwebpayments/PayPalWebCheckoutRequest;)Lcom/paypal/android/paypalwebpayments/PayPalPresentAuthChallengeResult;
public final fun start (Landroid/app/Activity;Lcom/paypal/android/paypalwebpayments/PayPalWebCheckoutRequest;Lcom/paypal/android/paypalwebpayments/PayPalWebStartCallback;)V
public final fun start (Landroid/app/Activity;Lcom/paypal/android/paypalwebpayments/PayPalWebCheckoutRequest;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public final fun vault (Landroid/app/Activity;Lcom/paypal/android/paypalwebpayments/PayPalWebVaultRequest;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public final fun startAsync (Landroid/app/Activity;Lcom/paypal/android/paypalwebpayments/PayPalWebCheckoutRequest;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public final fun vault (Landroid/app/Activity;Lcom/paypal/android/paypalwebpayments/PayPalWebVaultRequest;)Lcom/paypal/android/paypalwebpayments/PayPalPresentAuthChallengeResult;
public final fun vault (Landroidx/activity/ComponentActivity;Lcom/paypal/android/paypalwebpayments/PayPalWebVaultRequest;Lcom/paypal/android/paypalwebpayments/PayPalWebVaultCallback;)V
public final fun vaultAsync (Landroid/app/Activity;Lcom/paypal/android/paypalwebpayments/PayPalWebVaultRequest;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
}

public abstract class com/paypal/android/paypalwebpayments/PayPalWebCheckoutFinishStartResult {
Expand Down Expand Up @@ -116,13 +119,16 @@ public final class com/paypal/android/paypalwebpayments/PayPalWebCheckoutRequest
public fun <init> (Ljava/lang/String;)V
public fun <init> (Ljava/lang/String;Lcom/paypal/android/paypalwebpayments/PayPalWebCheckoutFundingSource;)V
public fun <init> (Ljava/lang/String;Lcom/paypal/android/paypalwebpayments/PayPalWebCheckoutFundingSource;Z)V
public synthetic fun <init> (Ljava/lang/String;Lcom/paypal/android/paypalwebpayments/PayPalWebCheckoutFundingSource;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun <init> (Ljava/lang/String;Lcom/paypal/android/paypalwebpayments/PayPalWebCheckoutFundingSource;ZLjava/lang/String;)V
public synthetic fun <init> (Ljava/lang/String;Lcom/paypal/android/paypalwebpayments/PayPalWebCheckoutFundingSource;ZLjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1 ()Ljava/lang/String;
public final fun component2 ()Lcom/paypal/android/paypalwebpayments/PayPalWebCheckoutFundingSource;
public final fun component3 ()Z
public final fun copy (Ljava/lang/String;Lcom/paypal/android/paypalwebpayments/PayPalWebCheckoutFundingSource;Z)Lcom/paypal/android/paypalwebpayments/PayPalWebCheckoutRequest;
public static synthetic fun copy$default (Lcom/paypal/android/paypalwebpayments/PayPalWebCheckoutRequest;Ljava/lang/String;Lcom/paypal/android/paypalwebpayments/PayPalWebCheckoutFundingSource;ZILjava/lang/Object;)Lcom/paypal/android/paypalwebpayments/PayPalWebCheckoutRequest;
public final fun component4 ()Ljava/lang/String;
public final fun copy (Ljava/lang/String;Lcom/paypal/android/paypalwebpayments/PayPalWebCheckoutFundingSource;ZLjava/lang/String;)Lcom/paypal/android/paypalwebpayments/PayPalWebCheckoutRequest;
public static synthetic fun copy$default (Lcom/paypal/android/paypalwebpayments/PayPalWebCheckoutRequest;Ljava/lang/String;Lcom/paypal/android/paypalwebpayments/PayPalWebCheckoutFundingSource;ZLjava/lang/String;ILjava/lang/Object;)Lcom/paypal/android/paypalwebpayments/PayPalWebCheckoutRequest;
public fun equals (Ljava/lang/Object;)Z
public final fun getAppLinkUrl ()Ljava/lang/String;
public final fun getAppSwitchWhenEligible ()Z
public final fun getFundingSource ()Lcom/paypal/android/paypalwebpayments/PayPalWebCheckoutFundingSource;
public final fun getOrderId ()Ljava/lang/String;
Expand All @@ -139,15 +145,18 @@ public abstract interface class com/paypal/android/paypalwebpayments/PayPalWebVa
}

public final class com/paypal/android/paypalwebpayments/PayPalWebVaultRequest {
public fun <init> (Ljava/lang/String;)V
public fun <init> (Ljava/lang/String;ZLjava/lang/String;)V
public synthetic fun <init> (Ljava/lang/String;ZLjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun <init> (Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;)V
public synthetic fun <init> (Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1 ()Ljava/lang/String;
public final fun component2 ()Z
public final fun component3 ()Ljava/lang/String;
public final fun copy (Ljava/lang/String;ZLjava/lang/String;)Lcom/paypal/android/paypalwebpayments/PayPalWebVaultRequest;
public static synthetic fun copy$default (Lcom/paypal/android/paypalwebpayments/PayPalWebVaultRequest;Ljava/lang/String;ZLjava/lang/String;ILjava/lang/Object;)Lcom/paypal/android/paypalwebpayments/PayPalWebVaultRequest;
public final fun component4 ()Ljava/lang/String;
public final fun copy (Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;)Lcom/paypal/android/paypalwebpayments/PayPalWebVaultRequest;
public static synthetic fun copy$default (Lcom/paypal/android/paypalwebpayments/PayPalWebVaultRequest;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/paypal/android/paypalwebpayments/PayPalWebVaultRequest;
public fun equals (Ljava/lang/Object;)Z
public final fun getAppLinkUrl ()Ljava/lang/String;
public final fun getAppSwitchWhenEligible ()Z
public final fun getApproveVaultHref ()Ljava/lang/String;
public final fun getSetupTokenId ()Ljava/lang/String;
Expand Down
Loading