Compose text field crashing when trying to input accents via physical keyboard

594 Views Asked by At

I noticed my Compose app crashing when an accent input ( ´ ` ) is made via a physical keyboard to a TextField. As soon as the button is pressed the app crashes with a java.lang.IllegalArgumentException.

To reproduce:

  1. Connect a physical keyboard
  2. Focus the TextField
  3. Hit the ` ´ button

Tested with a bluetooth and usb keyboard on a Pixel 3a (API 31). I could reproduce it with the following minimal example (just an activity with a text field):

class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContent {
        AccentTestTheme {
            // A surface container using the 'background' color from the theme
            Surface(color = MaterialTheme.colors.background) {
                var text = remember { mutableStateOf("Hello") }

                TextField(
                    value = text.value,
                    onValueChange = { text.value = it },
                    label = { Text("Label") }
                )
            }
        }
    }
  }
}

Did anyone experience similar issues? You can work around it by using a standard Android text view but I was wondering if this could be solved in Compose alone. Here's the resulting exception

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.gaerner.time2write, PID: 22519
    java.lang.IllegalArgumentException
        at java.lang.AbstractStringBuilder.appendCodePoint(AbstractStringBuilder.java:800)
        at java.lang.StringBuilder.appendCodePoint(StringBuilder.java:236)
        at androidx.compose.foundation.text.StringHelpers_jvmKt.appendCodePointX(StringHelpers.jvm.kt:20)
        at androidx.compose.foundation.text.TextFieldKeyInput.typedCommand-ZmokQxo(TextFieldKeyInput.kt:78)
        at androidx.compose.foundation.text.TextFieldKeyInput.process-ZmokQxo(TextFieldKeyInput.kt:86)
        at androidx.compose.foundation.text.TextFieldKeyInputKt$textFieldKeyInput$2$1.invoke-ZmokQxo(TextFieldKeyInput.kt:255)
        at androidx.compose.foundation.text.TextFieldKeyInputKt$textFieldKeyInput$2$1.invoke(TextFieldKeyInput.kt:255)
        at androidx.compose.ui.input.key.KeyInputModifier.propagateKeyEvent-ZmokQxo(KeyInputModifier.kt:124)
        at androidx.compose.ui.input.key.KeyInputModifier.processKeyInput-ZmokQxo(KeyInputModifier.kt:103)
        at androidx.compose.ui.platform.AndroidComposeView.sendKeyEvent-ZmokQxo(AndroidComposeView.android.kt:620)
        at androidx.compose.ui.platform.AndroidComposeView.dispatchKeyEvent(AndroidComposeView.android.kt:628)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1964)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1964)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1964)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1964)
        at com.android.internal.policy.DecorView.superDispatchKeyEvent(DecorView.java:486)
        at com.android.internal.policy.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1880)
        at android.app.Activity.dispatchKeyEvent(Activity.java:4159)
        at androidx.core.app.ComponentActivity.superDispatchKeyEvent(ComponentActivity.java:124)
        at androidx.core.view.KeyEventDispatcher.dispatchKeyEvent(KeyEventDispatcher.java:86)
        at androidx.core.app.ComponentActivity.dispatchKeyEvent(ComponentActivity.java:142)
        at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:400)
        at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:6377)
        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:6243)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5725)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5782)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5748)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5913)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5756)
        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5970)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5729)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5782)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5748)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5756)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5729)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5782)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5748)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5946)
        at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:6104)
        at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:3159)
        at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:2723)
        at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:2714)
        at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:3136)
        at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:154)
        at android.os.MessageQueue.nativePollOnce(Native Method)
        at android.os.MessageQueue.next(MessageQueue.java:335)
E/AndroidRuntime:     at android.os.Looper.loopOnce(Looper.java:161)
        at android.os.Looper.loop(Looper.java:288)
        at android.app.ActivityThread.main(ActivityThread.java:7870)
        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)
I/Process: Sending signal. PID: 22519 SIG: 9
0

There are 0 best solutions below