Skip to content

Commit ed06cda

Browse files
authored
Merge pull request #391 from paypal/feature/app_switch
Feature/app switch
2 parents 83fda0b + 259e74b commit ed06cda

File tree

53 files changed

+3343
-828
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+3343
-828
lines changed

.idea/misc.xml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

CHANGELOG.md

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,18 @@
11
# PayPal Android SDK Release Notes
22

3-
## 2.3.0 (2025-11-03)
3+
## Unreleased
4+
5+
* Adds new property `appSwitchWhenEligible`in `PayPalWebCheckoutRequest` to control app switch
6+
behavior
7+
* Adds new property `appSwitchWhenEligible`in `PayPalWebVaultRequest` to control app switch behavior
8+
* Adds new property `appLinkUrl` in `PayPalWebCheckoutRequest` to specify app link url that will be
9+
used to re-open app after approving order
10+
* Adds new property `appLinkUrl` in `PayPalWebVaultRequest` to specify app link url that will be
11+
used to re-open app after vaulting
12+
* Deprecates `urlScheme` property in `PayPalWebCheckoutClient` instead use `fallbackUrlScheme` in
13+
`PayPalWebCheckoutRequest` and `PayPalWebVaultRequest`
414

15+
## 2.3.0 (2025-11-03)
516
* PayPalWebPayments
617
* Add `PayPalWebCheckoutClient.start(activity, request, callback)` method with asynchronous
718
callback support

CardPayments/src/main/java/com/paypal/android/cardpayments/DataVaultPaymentMethodTokensAPI.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,9 @@ internal class DataVaultPaymentMethodTokensAPI internal constructor(
7878
)
7979

8080
val graphQLRequest = GraphQLRequest(query, variables, "UpdateVaultSetupToken")
81-
val graphQLResponse =
82-
graphQLClient.send<UpdateSetupTokenResponse, UpdateSetupTokenVariables>(graphQLRequest)
81+
val graphQLResponse = graphQLClient.send<
82+
UpdateSetupTokenResponse,
83+
UpdateSetupTokenVariables>(graphQLRequest)
8384
return when (graphQLResponse) {
8485
is GraphQLResult.Success -> {
8586
val response = graphQLResponse.response

CorePayments/api/CorePayments.api

Lines changed: 118 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -112,18 +112,6 @@ public final class com/paypal/android/corepayments/UpdateClientConfigAPI$Default
112112
public static final field USER_EXPERIENCE_FLOW Ljava/lang/String;
113113
}
114114

115-
public final class com/paypal/android/corepayments/UpdateClientConfigResponse {
116-
public static final field Companion Lcom/paypal/android/corepayments/UpdateClientConfigResponse$Companion;
117-
public fun <init> (Ljava/lang/String;)V
118-
public final fun component1 ()Ljava/lang/String;
119-
public final fun copy (Ljava/lang/String;)Lcom/paypal/android/corepayments/UpdateClientConfigResponse;
120-
public static synthetic fun copy$default (Lcom/paypal/android/corepayments/UpdateClientConfigResponse;Ljava/lang/String;ILjava/lang/Object;)Lcom/paypal/android/corepayments/UpdateClientConfigResponse;
121-
public fun equals (Ljava/lang/Object;)Z
122-
public final fun getUpdateClientConfig ()Ljava/lang/String;
123-
public fun hashCode ()I
124-
public fun toString ()Ljava/lang/String;
125-
}
126-
127115
public final class com/paypal/android/corepayments/UpdateClientConfigResponse$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
128116
public static final field INSTANCE Lcom/paypal/android/corepayments/UpdateClientConfigResponse$$serializer;
129117
public fun childSerializers ()[Lkotlinx/serialization/KSerializer;
@@ -139,9 +127,6 @@ public final class com/paypal/android/corepayments/UpdateClientConfigResponse$Co
139127
public final fun serializer ()Lkotlinx/serialization/KSerializer;
140128
}
141129

142-
public abstract class com/paypal/android/corepayments/UpdateClientConfigResult {
143-
}
144-
145130
public final class com/paypal/android/corepayments/UpdateClientConfigResult$Failure : com/paypal/android/corepayments/UpdateClientConfigResult {
146131
public fun <init> (Lcom/paypal/android/corepayments/PayPalSDKError;)V
147132
public final fun component1 ()Lcom/paypal/android/corepayments/PayPalSDKError;
@@ -160,29 +145,6 @@ public final class com/paypal/android/corepayments/UpdateClientConfigResult$Succ
160145
public fun toString ()Ljava/lang/String;
161146
}
162147

163-
public final class com/paypal/android/corepayments/UpdateClientConfigVariables {
164-
public static final field Companion Lcom/paypal/android/corepayments/UpdateClientConfigVariables$Companion;
165-
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
166-
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
167-
public final fun component1 ()Ljava/lang/String;
168-
public final fun component2 ()Ljava/lang/String;
169-
public final fun component3 ()Ljava/lang/String;
170-
public final fun component4 ()Ljava/lang/String;
171-
public final fun component5 ()Ljava/lang/String;
172-
public final fun component6 ()Ljava/lang/String;
173-
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;
174-
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;
175-
public fun equals (Ljava/lang/Object;)Z
176-
public final fun getButtonSessionId ()Ljava/lang/String;
177-
public final fun getFundingSource ()Ljava/lang/String;
178-
public final fun getIntegrationArtifact ()Ljava/lang/String;
179-
public final fun getProductFlow ()Ljava/lang/String;
180-
public final fun getToken ()Ljava/lang/String;
181-
public final fun getUserExperienceFlow ()Ljava/lang/String;
182-
public fun hashCode ()I
183-
public fun toString ()Ljava/lang/String;
184-
}
185-
186148
public final class com/paypal/android/corepayments/UpdateClientConfigVariables$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
187149
public static final field INSTANCE Lcom/paypal/android/corepayments/UpdateClientConfigVariables$$serializer;
188150
public fun childSerializers ()[Lkotlinx/serialization/KSerializer;
@@ -198,6 +160,12 @@ public final class com/paypal/android/corepayments/UpdateClientConfigVariables$C
198160
public final fun serializer ()Lkotlinx/serialization/KSerializer;
199161
}
200162

163+
public final class com/paypal/android/corepayments/api/PatchCCOWithAppSwitchEligibility$Companion {
164+
}
165+
166+
public final class com/paypal/android/corepayments/common/DeviceInspector$Companion {
167+
}
168+
201169
public final class com/paypal/android/corepayments/graphql/GraphQLClient$Companion {
202170
}
203171

@@ -286,3 +254,115 @@ public final class com/paypal/android/corepayments/graphql/GraphQLResult$Success
286254
public fun toString ()Ljava/lang/String;
287255
}
288256

257+
public final class com/paypal/android/corepayments/model/APIResult$Failure : com/paypal/android/corepayments/model/APIResult {
258+
public fun <init> (Lcom/paypal/android/corepayments/PayPalSDKError;)V
259+
public final fun component1 ()Lcom/paypal/android/corepayments/PayPalSDKError;
260+
public final fun copy (Lcom/paypal/android/corepayments/PayPalSDKError;)Lcom/paypal/android/corepayments/model/APIResult$Failure;
261+
public static synthetic fun copy$default (Lcom/paypal/android/corepayments/model/APIResult$Failure;Lcom/paypal/android/corepayments/PayPalSDKError;ILjava/lang/Object;)Lcom/paypal/android/corepayments/model/APIResult$Failure;
262+
public fun equals (Ljava/lang/Object;)Z
263+
public final fun getError ()Lcom/paypal/android/corepayments/PayPalSDKError;
264+
public fun hashCode ()I
265+
public fun toString ()Ljava/lang/String;
266+
}
267+
268+
public final class com/paypal/android/corepayments/model/APIResult$Success : com/paypal/android/corepayments/model/APIResult {
269+
public fun <init> (Ljava/lang/Object;)V
270+
public final fun component1 ()Ljava/lang/Object;
271+
public final fun copy (Ljava/lang/Object;)Lcom/paypal/android/corepayments/model/APIResult$Success;
272+
public static synthetic fun copy$default (Lcom/paypal/android/corepayments/model/APIResult$Success;Ljava/lang/Object;ILjava/lang/Object;)Lcom/paypal/android/corepayments/model/APIResult$Success;
273+
public fun equals (Ljava/lang/Object;)Z
274+
public final fun getData ()Ljava/lang/Object;
275+
public fun hashCode ()I
276+
public fun toString ()Ljava/lang/String;
277+
}
278+
279+
public final class com/paypal/android/corepayments/model/AppSwitchEligibilityData$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
280+
public static final field INSTANCE Lcom/paypal/android/corepayments/model/AppSwitchEligibilityData$$serializer;
281+
public fun childSerializers ()[Lkotlinx/serialization/KSerializer;
282+
public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/paypal/android/corepayments/model/AppSwitchEligibilityData;
283+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
284+
public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
285+
public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/paypal/android/corepayments/model/AppSwitchEligibilityData;)V
286+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
287+
public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
288+
}
289+
290+
public final class com/paypal/android/corepayments/model/AppSwitchEligibilityData$Companion {
291+
public final fun serializer ()Lkotlinx/serialization/KSerializer;
292+
}
293+
294+
public final class com/paypal/android/corepayments/model/ExperimentationContext$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
295+
public static final field INSTANCE Lcom/paypal/android/corepayments/model/ExperimentationContext$$serializer;
296+
public fun childSerializers ()[Lkotlinx/serialization/KSerializer;
297+
public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/paypal/android/corepayments/model/ExperimentationContext;
298+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
299+
public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
300+
public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/paypal/android/corepayments/model/ExperimentationContext;)V
301+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
302+
public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
303+
}
304+
305+
public final class com/paypal/android/corepayments/model/ExperimentationContext$Companion {
306+
public final fun serializer ()Lkotlinx/serialization/KSerializer;
307+
}
308+
309+
public final class com/paypal/android/corepayments/model/ExternalData$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
310+
public static final field INSTANCE Lcom/paypal/android/corepayments/model/ExternalData$$serializer;
311+
public fun childSerializers ()[Lkotlinx/serialization/KSerializer;
312+
public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/paypal/android/corepayments/model/ExternalData;
313+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
314+
public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
315+
public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/paypal/android/corepayments/model/ExternalData;)V
316+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
317+
public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
318+
}
319+
320+
public final class com/paypal/android/corepayments/model/ExternalData$Companion {
321+
public final fun serializer ()Lkotlinx/serialization/KSerializer;
322+
}
323+
324+
public final class com/paypal/android/corepayments/model/PatchCcoData$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
325+
public static final field INSTANCE Lcom/paypal/android/corepayments/model/PatchCcoData$$serializer;
326+
public fun childSerializers ()[Lkotlinx/serialization/KSerializer;
327+
public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/paypal/android/corepayments/model/PatchCcoData;
328+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
329+
public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
330+
public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/paypal/android/corepayments/model/PatchCcoData;)V
331+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
332+
public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
333+
}
334+
335+
public final class com/paypal/android/corepayments/model/PatchCcoData$Companion {
336+
public final fun serializer ()Lkotlinx/serialization/KSerializer;
337+
}
338+
339+
public final class com/paypal/android/corepayments/model/PatchCcoWithAppSwitchEligibilityResponse$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
340+
public static final field INSTANCE Lcom/paypal/android/corepayments/model/PatchCcoWithAppSwitchEligibilityResponse$$serializer;
341+
public fun childSerializers ()[Lkotlinx/serialization/KSerializer;
342+
public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/paypal/android/corepayments/model/PatchCcoWithAppSwitchEligibilityResponse;
343+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
344+
public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
345+
public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/paypal/android/corepayments/model/PatchCcoWithAppSwitchEligibilityResponse;)V
346+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
347+
public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
348+
}
349+
350+
public final class com/paypal/android/corepayments/model/PatchCcoWithAppSwitchEligibilityResponse$Companion {
351+
public final fun serializer ()Lkotlinx/serialization/KSerializer;
352+
}
353+
354+
public final class com/paypal/android/corepayments/model/PatchCcoWithAppSwitchEligibilityVariables$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
355+
public static final field INSTANCE Lcom/paypal/android/corepayments/model/PatchCcoWithAppSwitchEligibilityVariables$$serializer;
356+
public fun childSerializers ()[Lkotlinx/serialization/KSerializer;
357+
public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/paypal/android/corepayments/model/PatchCcoWithAppSwitchEligibilityVariables;
358+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
359+
public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
360+
public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/paypal/android/corepayments/model/PatchCcoWithAppSwitchEligibilityVariables;)V
361+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
362+
public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
363+
}
364+
365+
public final class com/paypal/android/corepayments/model/PatchCcoWithAppSwitchEligibilityVariables$Companion {
366+
public final fun serializer ()Lkotlinx/serialization/KSerializer;
367+
}
368+

CorePayments/src/main/AndroidManifest.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,8 @@
44
<uses-permission android:name="android.permission.INTERNET" />
55
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
66

7+
<queries>
8+
<package android:name="com.paypal.android.p2pmobile" />
9+
</queries>
10+
711
</manifest>

CorePayments/src/main/java/com/paypal/android/corepayments/APIClientError.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ import androidx.annotation.RestrictTo
99
object APIClientError {
1010

1111
// 0. An unknown error occurred.
12-
fun unknownError(correlationId: String? = null) = PayPalSDKError(
12+
fun unknownError(correlationId: String? = null, throwable: Throwable? = null) = PayPalSDKError(
1313
code = PayPalSDKErrorCode.UNKNOWN.ordinal,
1414
errorDescription = "An unknown error occurred. Contact developer.paypal.com/support.",
15+
reason = throwable,
1516
correlationId = correlationId
1617
)
1718

@@ -91,4 +92,9 @@ object APIClientError {
9192
)
9293
return error
9394
}
95+
96+
fun graphQLRequestLoadError() = PayPalSDKError(
97+
code = PayPalSDKErrorCode.GRAPHQL_CREATE_REQUEST_ERROR.ordinal,
98+
errorDescription = "Error creating GraphQL request"
99+
)
94100
}

CorePayments/src/main/java/com/paypal/android/corepayments/APIRequest.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,9 @@ import androidx.annotation.RestrictTo
66
* @suppress
77
*/
88
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
9-
data class APIRequest(val path: String, val method: HttpMethod, val body: String? = null)
9+
data class APIRequest(
10+
val path: String,
11+
val method: HttpMethod,
12+
val body: String? = null,
13+
val headers: Map<String, String>? = null
14+
)

CorePayments/src/main/java/com/paypal/android/corepayments/PayPalSDKErrorCode.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,7 @@ enum class PayPalSDKErrorCode {
1515
SERVER_RESPONSE_ERROR,
1616
CHECKOUT_ERROR,
1717
NATIVE_CHECKOUT_ERROR,
18-
GRAPHQL_JSON_INVALID_ERROR
18+
GRAPHQL_JSON_INVALID_ERROR,
19+
NO_ACCESS_TOKEN_ERROR,
20+
GRAPHQL_CREATE_REQUEST_ERROR,
1921
}

CorePayments/src/main/java/com/paypal/android/corepayments/UpdateClientConfigAPI.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ class UpdateClientConfigAPI(
9696

9797
@Serializable
9898
@OptIn(InternalSerializationApi::class)
99+
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
99100
data class UpdateClientConfigVariables(
100101
val token: String,
101102
val fundingSource: String,
@@ -107,10 +108,12 @@ data class UpdateClientConfigVariables(
107108

108109
@Serializable
109110
@OptIn(InternalSerializationApi::class)
111+
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
110112
data class UpdateClientConfigResponse(
111113
val updateClientConfig: String
112114
)
113115

116+
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
114117
sealed class UpdateClientConfigResult {
115118
data object Success : UpdateClientConfigResult()
116119
data class Failure(val error: PayPalSDKError) : UpdateClientConfigResult()

0 commit comments

Comments
 (0)