stripe-react-native
stripe-react-native copied to clipboard
Crash on Android when entering expiration date in CardField
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:
- Render a
<CardField />component from @stripe/stripe-react-native in your React Native app. - Focus on the expiration date input field.
- Enter two digits for the year (e.g., 25).
- Start typing the first digit of the month (e.g., 0 for 05).
- 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)