Fix backspace crash on Chinese devices (#9734) (#9935)
diff --git a/shell/platform/android/io/flutter/plugin/editing/InputConnectionAdaptor.java b/shell/platform/android/io/flutter/plugin/editing/InputConnectionAdaptor.java
index 768900a..f0d337a 100644
--- a/shell/platform/android/io/flutter/plugin/editing/InputConnectionAdaptor.java
+++ b/shell/platform/android/io/flutter/plugin/editing/InputConnectionAdaptor.java
@@ -168,10 +168,21 @@
// isRTLCharAt() call below is returning blanket direction assumption
// based on the first character in the line.
boolean isRtl = mLayout.isRtlCharAt(mLayout.getLineForOffset(selStart));
- if (isRtl) {
- Selection.extendRight(mEditable, mLayout);
- } else {
- Selection.extendLeft(mEditable, mLayout);
+ try {
+ if (isRtl) {
+ Selection.extendRight(mEditable, mLayout);
+ } else {
+ Selection.extendLeft(mEditable, mLayout);
+ }
+ } catch (IndexOutOfBoundsException e) {
+ // On some Chinese devices (primarily Huawei, some Xiaomi),
+ // on initial app startup before focus is lost, the
+ // Selection.extendLeft and extendRight calls always extend
+ // from the index of the initial contents of mEditable. This
+ // try-catch will prevent crashing on Huawei devices by falling
+ // back to a simple way of deletion, although this a hack and
+ // will not handle emojis.
+ Selection.setSelection(mEditable, selStart, selStart - 1);
}
int newStart = clampIndexToEditable(Selection.getSelectionStart(mEditable), mEditable);
int newEnd = clampIndexToEditable(Selection.getSelectionEnd(mEditable), mEditable);