From 26e0ebf8dd5bd3a9cb8fedd6a09963397d4b2058 Mon Sep 17 00:00:00 2001 From: Joshua Rogers Date: Tue, 3 Feb 2026 20:15:42 +0800 Subject: [PATCH 1/2] onActivityResult can hang forever if OK but data == null, and pending promise is not cleared (cherry picked from commit a330c1ee2261f192103ac4e7a2fa5d86e2c59b7f) --- .../java/com/expensify/wallet/WalletModule.kt | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/android/src/main/java/com/expensify/wallet/WalletModule.kt b/android/src/main/java/com/expensify/wallet/WalletModule.kt index 368f31f2..d25e038c 100644 --- a/android/src/main/java/com/expensify/wallet/WalletModule.kt +++ b/android/src/main/java/com/expensify/wallet/WalletModule.kt @@ -69,23 +69,29 @@ class WalletModule internal constructor(context: ReactApplicationContext) : pendingCreateWalletPromise?.resolve(resultCode == RESULT_OK) pendingCreateWalletPromise = null } else if (requestCode == REQUEST_CODE_PUSH_TOKENIZE) { + val localPromise = pendingPushTokenizePromise + pendingPushTokenizePromise = null if (resultCode == RESULT_OK) { - data?.let { - val tokenId = it.getStringExtra(TapAndPay.EXTRA_ISSUER_TOKEN_ID).toString() - sendEvent( - context, - OnCardActivatedEvent.NAME, - OnCardActivatedEvent("active", tokenId).toMap() - ) - pendingPushTokenizePromise?.resolve(TokenizationStatus.SUCCESS.code) + if (data == null) { + localPromise?.reject(E_OPERATION_FAILED, "Tokenization returned RESULT_OK but intent data was null") + return } + val tokenId = data.getStringExtra(TapAndPay.EXTRA_ISSUER_TOKEN_ID).toString() + sendEvent( + context, + OnCardActivatedEvent.NAME, + OnCardActivatedEvent("active", tokenId).toMap() + ) + localPromise?.resolve(TokenizationStatus.SUCCESS.code) } else if (resultCode == RESULT_CANCELED) { sendEvent( context, OnCardActivatedEvent.NAME, OnCardActivatedEvent("canceled", null).toMap() ) - pendingPushTokenizePromise?.resolve(TokenizationStatus.CANCELED.code) + localPromise?.resolve(TokenizationStatus.CANCELED.code) + } else { + localPromise?.reject(E_OPERATION_FAILED, "Tokenization failed with resultCode=$resultCode") } } } From f002d46f800ef3e753ab1566024dfb2e9ac73926 Mon Sep 17 00:00:00 2001 From: Joshua Rogers Date: Thu, 8 Oct 2026 20:23:46 -0700 Subject: [PATCH 2/2] Resolve on RESULT_OK without data and return ERROR for other result codes --- .../src/main/java/com/expensify/wallet/WalletModule.kt | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/android/src/main/java/com/expensify/wallet/WalletModule.kt b/android/src/main/java/com/expensify/wallet/WalletModule.kt index c8570e5c..dfa1a398 100644 --- a/android/src/main/java/com/expensify/wallet/WalletModule.kt +++ b/android/src/main/java/com/expensify/wallet/WalletModule.kt @@ -79,11 +79,7 @@ class WalletModule internal constructor(context: ReactApplicationContext) : val localPromise = pendingPushTokenizePromise pendingPushTokenizePromise = null if (resultCode == RESULT_OK) { - if (data == null) { - localPromise?.reject(E_OPERATION_FAILED, "Tokenization returned RESULT_OK but intent data was null") - return - } - val tokenId = data.getStringExtra(TapAndPay.EXTRA_ISSUER_TOKEN_ID).toString() + val tokenId = data?.getStringExtra(TapAndPay.EXTRA_ISSUER_TOKEN_ID) sendEvent( context, OnCardActivatedEvent.NAME, @@ -98,7 +94,7 @@ class WalletModule internal constructor(context: ReactApplicationContext) : ) localPromise?.resolve(TokenizationStatus.CANCELED.code) } else { - localPromise?.reject(E_OPERATION_FAILED, "Tokenization failed with resultCode=$resultCode") + localPromise?.resolve(TokenizationStatus.ERROR.code) } } }