diff --git a/CHANGELOG.md b/CHANGELOG.md
index f7d529f..4f02dce 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
# Changelog
+## 3.1.2 October 15 2024
+
+- Prevent entering recovery mode for single-use multipass URLs.
+
## 3.1.1 October 2, 2024
- Ensure that cached WebView instances don't have existing parents before trying to add them to their container.
diff --git a/README.md b/README.md
index e050b51..a2e4f2e 100644
--- a/README.md
+++ b/README.md
@@ -23,7 +23,7 @@ your project:
#### Gradle
```groovy
-implementation "com.shopify:checkout-sheet-kit:3.1.1"
+implementation "com.shopify:checkout-sheet-kit:3.1.2"
```
#### Maven
@@ -33,7 +33,7 @@ implementation "com.shopify:checkout-sheet-kit:3.1.1"
com.shopify
checkout-sheet-kit
- 3.1.1
+ 3.1.2
```
diff --git a/lib/build.gradle b/lib/build.gradle
index 753473c..2d6dd89 100644
--- a/lib/build.gradle
+++ b/lib/build.gradle
@@ -14,7 +14,7 @@ def resolveEnvVarValue(name, defaultValue) {
return rawValue ? rawValue : defaultValue
}
-def versionName = resolveEnvVarValue("CHECKOUT_SHEET_KIT_VERSION", "3.1.1")
+def versionName = resolveEnvVarValue("CHECKOUT_SHEET_KIT_VERSION", "3.1.2")
ext {
app_compat_version = '1.6.1'
diff --git a/lib/src/main/java/com/shopify/checkoutsheetkit/CheckoutDialog.kt b/lib/src/main/java/com/shopify/checkoutsheetkit/CheckoutDialog.kt
index 34c6411..7483c62 100644
--- a/lib/src/main/java/com/shopify/checkoutsheetkit/CheckoutDialog.kt
+++ b/lib/src/main/java/com/shopify/checkoutsheetkit/CheckoutDialog.kt
@@ -151,7 +151,9 @@ internal class CheckoutDialog(
internal fun closeCheckoutDialogWithError(exception: CheckoutException) {
checkoutEventProcessor.onCheckoutFailed(exception)
- if (ShopifyCheckoutSheetKit.configuration.errorRecovery.shouldRecoverFromError(exception)) {
+
+ val isOneTimeUseURL = this.checkoutUrl.contains("multipass")
+ if (!isOneTimeUseURL && ShopifyCheckoutSheetKit.configuration.errorRecovery.shouldRecoverFromError(exception)) {
attemptToRecoverFromError(exception)
} else {
dismiss()
diff --git a/lib/src/test/java/com/shopify/checkoutsheetkit/CheckoutDialogTest.kt b/lib/src/test/java/com/shopify/checkoutsheetkit/CheckoutDialogTest.kt
index f672816..33f6e76 100644
--- a/lib/src/test/java/com/shopify/checkoutsheetkit/CheckoutDialogTest.kt
+++ b/lib/src/test/java/com/shopify/checkoutsheetkit/CheckoutDialogTest.kt
@@ -189,6 +189,24 @@ class CheckoutDialogTest {
verify(mockEventProcessor).onCheckoutFailed(any())
}
+ @Test
+ fun `does not call attemptToRecoverFromError if closeCheckoutDialogWithError is called when url contains multipass`() {
+ val mockEventProcessor = mock()
+ ShopifyCheckoutSheetKit.present("https://shopify.com/a/b/c/multipass", activity, mockEventProcessor)
+
+ val checkoutDialog = ShadowDialog.getLatestDialog() as CheckoutDialog
+ assertThat(checkoutDialog.containsChildOfType(CheckoutWebView::class.java)).isTrue()
+
+ checkoutDialog.closeCheckoutDialogWithError(checkoutException(isRecoverable = true))
+ shadowOf(Looper.getMainLooper()).runToEndOfTasks()
+
+ // attemptToRecoverFromError creates a FallbackWebView and removes the CheckoutWebView
+ assertThat(checkoutDialog.containsChildOfType(FallbackWebView::class.java)).isFalse()
+ assertThat(checkoutDialog.containsChildOfType(CheckoutWebView::class.java)).isFalse()
+ verify(mockEventProcessor, never()).onCheckoutCanceled()
+ verify(mockEventProcessor).onCheckoutFailed(any())
+ }
+
@Test
fun `can disable fallback behaviour via shouldRecoverFromError`() {
val mockEventProcessor = mock()