stripe-react-native icon indicating copy to clipboard operation
stripe-react-native copied to clipboard

Crash on Android when entering expiration date in CardField

Open mayone-du opened this issue 6 months ago • 0 comments
trafficstars

Describe the bug On Android, when using the CardField component from @stripe/stripe-react-native, the app crashes when entering the third character of the expiration date (YYMM).

To Reproduce Steps to reproduce the behavior:

  1. Render a <CardField /> component from @stripe/stripe-react-native in your React Native app.
  2. Focus on the expiration date input field.
  3. Enter two digits for the year (e.g., 25).
  4. Start typing the first digit of the month (e.g., 0 for 05).
  5. The app crashes immediately when entering the third character.

Expected behavior Entering the expiration date should not crash the app.

Screenshots If applicable, add screenshots to help explain your problem.

Desktop (please complete the following information):

  • OS: [e.g. iOS]
  • Browser [e.g. chrome, safari]
  • Version [e.g. 22]

Smartphone (please complete the following information):

  • Device: Xiaomi Redmi Note 10T
  • OS: Android 13 TKQ1.221013.002
  • Browser [e.g. stock browser, safari]
  • Version [e.g. 22]

Package version

react: "18.3.1" react-native: "0.76.7" expo: "52.0.40" @stripe/stripe-react-native: "0.38.6"

newArch: false

Additional context

crash log

 ERROR  Your app just crashed. See the error below.
java.lang.IndexOutOfBoundsException: Index: 9, Size: 9
  java.util.ArrayList.get(ArrayList.java:437)
  android.widget.TextView.sendAfterTextChanged(TextView.java:11086)
  android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:14177)
  android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:1278)
  android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:578)
  androidx.emoji2.text.SpannableBuilder.replace(SpannableBuilder.java:315)
  android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:508)
  androidx.emoji2.text.SpannableBuilder.replace(SpannableBuilder.java:305)
  androidx.emoji2.text.SpannableBuilder.replace(SpannableBuilder.java:49)
  android.text.method.NumberKeyListener.onKeyDown(NumberKeyListener.java:129)
  android.widget.TextView.doKeyDown(TextView.java:8818)
  android.widget.TextView.onKeyDown(TextView.java:8588)
  android.view.KeyEvent.dispatch(KeyEvent.java:2907)
  android.view.View.dispatchKeyEvent(View.java:14991)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  android.widget.ScrollView.dispatchKeyEvent(ScrollView.java:497)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  com.facebook.react.ReactRootView.dispatchKeyEvent(ReactRootView.java:300)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1973)
  com.android.internal.policy.DecorView.superDispatchKeyEvent(DecorView.java:559)
  com.android.internal.policy.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1889)
  android.app.Activity.dispatchKeyEvent(Activity.java:4370)
  androidx.core.app.ComponentActivity.superDispatchKeyEvent(ComponentActivity.kt:103)
  androidx.core.view.KeyEventDispatcher.dispatchKeyEvent(KeyEventDispatcher.java:85)
  androidx.core.app.ComponentActivity.dispatchKeyEvent(ComponentActivity.kt:117)
  androidx.appcompat.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:604)
  androidx.appcompat.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:59)
  androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.dispatchKeyEvent(AppCompatDelegateImpl.java:3397)
  com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:425)
  android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:6921)
  android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:6769)
  android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:6204)
  android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:6261)
  android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:6227)
  android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:6392)
  android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:6235)
  android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:6449)
  android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:6208)
  android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:6261)
  android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:6227)
  android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:6235)
  android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:6208)
  android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:9373)
  android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:9324)
  android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:9292)
  android.view.ViewRootImpl$ViewRootHandler.handleMessageImpl(ViewRootImpl.java:5969)
  android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:5835)
  android.os.Handler.dispatchMessage(Handler.java:106)
  android.os.Looper.loopOnce(Looper.java:211)
  android.os.Looper.loop(Looper.java:300)
  android.app.ActivityThread.main(ActivityThread.java:8296)
  java.lang.reflect.Method.invoke(Native Method)
  com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:559)
  com.android.internal.os.ZygoteInit.main(ZygoteInit.java:954)

mayone-du avatar Apr 28 '25 10:04 mayone-du