braintree_android: Crash during 3DS when Android kills the app

General information

  • SDK/Library version: 4.14.0 (tested as reproducible also in 4.15.0)
  • Environment: Sandbox and Production
  • Android Version and Device: doesn’t matter
  • Braintree dependencies: "com.braintreepayments.api:three-d-secure:4.14.0"

Issue description

The issue appears during a 3DS checkout. If user put the app in background and Android kills the app’s process, when user returns to 3DS screen and proceed with 3DS the app crashes.

Step to reproduce

It’s reproducible using Demo app:

  1. enable 3D secure from Settings;
  2. start using a credit card;
  3. fill the form and click on purchase;
  4. when 3DS screen appears, put the app in background;
  5. emulate an Android kill process (run am kill com.braintreepayments.demo in an adb shell, or tap on Terminate Application from logcat in AS);
  6. reopen the app from multitasking pane;
  7. complete 3DS checkout.
  8. crash occurs.

https://user-images.githubusercontent.com/43886303/187188130-bed1649e-21a2-4968-83de-355c33eb904e.mov

Stack trace

2022-08-29 12:55:34.563 8901-8901/com.braintreepayments.demo E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.braintreepayments.demo, PID: 8901
    java.lang.NullPointerException: Attempt to read from field 'java.lang.String com.cardinalcommerce.a.configure.init' on a null object reference
        at com.cardinalcommerce.a.setEditableFactory.init(:2082)
        at com.cardinalcommerce.a.setOnEditorActionListener.Cardinal(:38564)
        at com.cardinalcommerce.a.setOnEditorActionListener$7.onClick(:389)
        at android.view.View.performClick(View.java:7441)
        at android.view.View.performClickInternal(View.java:7418)
        at android.view.View.access$3700(View.java:835)
        at android.view.View$PerformClick.run(View.java:28676)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loopOnce(Looper.java:201)
        at android.os.Looper.loop(Looper.java:288)
        at android.app.ActivityThread.main(ActivityThread.java:7839)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
2022-08-29 12:55:34.564 8901-8901/com.braintreepayments.demo E/Exception: Uncaught Exception
    java.lang.NullPointerException: Attempt to read from field 'java.lang.String com.cardinalcommerce.a.configure.init' on a null object reference
        at com.cardinalcommerce.a.setEditableFactory.init(:2082)
        at com.cardinalcommerce.a.setOnEditorActionListener.Cardinal(:38564)
        at com.cardinalcommerce.a.setOnEditorActionListener$7.onClick(:389)
        at android.view.View.performClick(View.java:7441)
        at android.view.View.performClickInternal(View.java:7418)
        at android.view.View.access$3700(View.java:835)
        at android.view.View$PerformClick.run(View.java:28676)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loopOnce(Looper.java:201)
        at android.os.Looper.loop(Looper.java:288)
        at android.app.ActivityThread.main(ActivityThread.java:7839)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
2022-08-29 12:55:35.148 8949-8949/com.braintreepayments.demo E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.braintreepayments.demo, PID: 8949
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.braintreepayments.demo/com.braintreepayments.api.ThreeDSecureActivity}: java.lang.NullPointerException: Attempt to read from field 'java.lang.String com.cardinalcommerce.a.configure.init' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3635)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loopOnce(Looper.java:201)
        at android.os.Looper.loop(Looper.java:288)
        at android.app.ActivityThread.main(ActivityThread.java:7839)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
     Caused by: java.lang.NullPointerException: Attempt to read from field 'java.lang.String com.cardinalcommerce.a.configure.init' on a null object reference
        at com.cardinalcommerce.cardinalmobilesdk.Cardinal.cca_continue(:21082)
        at com.braintreepayments.api.CardinalClient.continueLookup(CardinalClient.java:44)
        at com.braintreepayments.api.ThreeDSecureActivity.onCreateInternal(ThreeDSecureActivity.java:39)
        at com.braintreepayments.api.ThreeDSecureActivity.onCreate(ThreeDSecureActivity.java:28)
        at android.app.Activity.performCreate(Activity.java:8051)
        at android.app.Activity.performCreate(Activity.java:8031)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3608)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loopOnce(Looper.java:201) 
        at android.os.Looper.loop(Looper.java:288) 
        at android.app.ActivityThread.main(ActivityThread.java:7839) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) 

About this issue

  • Original URL
  • State: closed
  • Created 2 years ago
  • Reactions: 4
  • Comments: 20 (11 by maintainers)

Most upvoted comments

Happy Birthday to this issue!

Happy Birthday to this issue!

We were told a few days ago by our PayPal contact that Cardinal has an internal fix for this and hopefully we’ll finally be able to put this crash to bed. Here’s to hoping at least.

Hi @sshropshire, any update on this?

@sshropshire - at the moment, this accounts for roughly 10% of our crashes (our crash rate is relatively low, but this is definitely a standout). Is there information you’re looking for specifically in regards to overall impact? We’re nervous about any sort of crash related to 3DS since reproduction of the issues seems to be very dependent on the bank.

I will have our product team member reach out to the support team in the meantime - thank you for the link.