Skip to content

Commit d67923f

Browse files
Pass text input key events to the EventResponder if they do not yield characters (flutter#20912)
If the InputConnectionAdaptor receives a key event that does not move the caret or produce a text character (such as the back button), then the event should be given to the EventResponder which will forward it to the view. Fixes flutter#64864
1 parent 1bd9b8e commit d67923f

File tree

3 files changed

+23
-8
lines changed

3 files changed

+23
-8
lines changed

shell/platform/android/io/flutter/plugin/editing/InputConnectionAdaptor.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -402,15 +402,16 @@ public boolean sendKeyEvent(KeyEvent event) {
402402
} else {
403403
// Enter a character.
404404
int character = event.getUnicodeChar();
405-
if (character != 0) {
406-
int selStart = Math.max(0, Selection.getSelectionStart(mEditable));
407-
int selEnd = Math.max(0, Selection.getSelectionEnd(mEditable));
408-
int selMin = Math.min(selStart, selEnd);
409-
int selMax = Math.max(selStart, selEnd);
410-
if (selMin != selMax) mEditable.delete(selMin, selMax);
411-
mEditable.insert(selMin, String.valueOf((char) character));
412-
setSelection(selMin + 1, selMin + 1);
405+
if (character == 0) {
406+
return false;
413407
}
408+
int selStart = Math.max(0, Selection.getSelectionStart(mEditable));
409+
int selEnd = Math.max(0, Selection.getSelectionEnd(mEditable));
410+
int selMin = Math.min(selStart, selEnd);
411+
int selMax = Math.max(selStart, selEnd);
412+
if (selMin != selMax) mEditable.delete(selMin, selMax);
413+
mEditable.insert(selMin, String.valueOf((char) character));
414+
setSelection(selMin + 1, selMin + 1);
414415
return true;
415416
}
416417
}

shell/platform/android/test/io/flutter/plugin/editing/InputConnectionAdaptorTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1106,6 +1106,17 @@ public void testSendKeyEvent_delKeyDeletesBackwardComplexEmojis() {
11061106
assertEquals(Selection.getSelectionStart(editable), 0);
11071107
}
11081108

1109+
@Test
1110+
public void testDoesNotConsumeBackButton() {
1111+
Editable editable = sampleEditable(0, 0);
1112+
InputConnectionAdaptor adaptor = sampleInputConnectionAdaptor(editable);
1113+
1114+
FakeKeyEvent keyEvent = new FakeKeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK);
1115+
boolean didConsume = adaptor.sendKeyEvent(keyEvent);
1116+
1117+
assertFalse(didConsume);
1118+
}
1119+
11091120
private static final String SAMPLE_TEXT =
11101121
"Lorem ipsum dolor sit amet," + "\nconsectetur adipiscing elit.";
11111122

shell/platform/android/test/io/flutter/util/FakeKeyEvent.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ public FakeKeyEvent(int action, int keyCode) {
1010
}
1111

1212
public final int getUnicodeChar() {
13+
if (getKeyCode() == KeyEvent.KEYCODE_BACK) {
14+
return 0;
15+
}
1316
return 1;
1417
}
1518
}

0 commit comments

Comments
 (0)