Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 1a7af62

Browse files
committed
Android Input Failed When TextInputType Is Phone, Number
1 parent 18566b7 commit 1a7af62

File tree

3 files changed

+67
-8
lines changed

3 files changed

+67
-8
lines changed

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

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,8 @@ public boolean handleKeyEvent(KeyEvent event) {
287287
return handleVerticalMovement(false, event.isShiftPressed());
288288
// When the enter key is pressed on a non-multiline field, consider it a
289289
// submit instead of a newline.
290+
} else if (event.getKeyCode() == KeyEvent.KEYCODE_DEL) {
291+
return handleDelete();
290292
} else if ((event.getKeyCode() == KeyEvent.KEYCODE_ENTER
291293
|| event.getKeyCode() == KeyEvent.KEYCODE_NUMPAD_ENTER)
292294
&& (InputType.TYPE_TEXT_FLAG_MULTI_LINE & mEditorInfo.inputType) == 0) {
@@ -297,12 +299,12 @@ public boolean handleKeyEvent(KeyEvent event) {
297299
final int selStart = Selection.getSelectionStart(mEditable);
298300
final int selEnd = Selection.getSelectionEnd(mEditable);
299301
final int character = event.getUnicodeChar();
300-
if (selStart < 0 || selEnd < 0 || character == 0) {
302+
if (character == 0) {
301303
return false;
302304
}
303305

304-
final int selMin = Math.min(selStart, selEnd);
305-
final int selMax = Math.max(selStart, selEnd);
306+
final int selMin = Math.max(Math.min(selStart, selEnd), 0);
307+
final int selMax = Math.max(Math.max(selStart, selEnd), 0);
306308
beginBatchEdit();
307309
if (selMin != selMax) mEditable.delete(selMin, selMax);
308310
mEditable.insert(selMin, String.valueOf((char) character));
@@ -375,6 +377,20 @@ private boolean handleVerticalMovement(boolean isUp, boolean isShiftPressed) {
375377
return true;
376378
}
377379

380+
private boolean handleDelete() {
381+
final int selStart = Selection.getSelectionStart(mEditable);
382+
final int selEnd = Selection.getSelectionEnd(mEditable);
383+
384+
if (selStart <= 0 || selEnd <= 0) {
385+
return false;
386+
}
387+
beginBatchEdit();
388+
mEditable.delete(selStart - 1, selEnd);
389+
setSelection(selStart - 1, selEnd - 1);
390+
endBatchEdit();
391+
return true;
392+
}
393+
378394
@Override
379395
public boolean performContextMenuAction(int id) {
380396
beginBatchEdit();

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

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
4343
import io.flutter.plugin.common.MethodCall;
4444
import io.flutter.util.FakeKeyEvent;
4545
import java.nio.ByteBuffer;
46+
import java.util.ArrayList;
47+
import java.util.List;
4648
import org.json.JSONArray;
4749
import org.json.JSONException;
4850
import org.junit.Before;
@@ -1104,16 +1106,25 @@ public void testSendKeyEvent_sendHardwareKeyEvents() {
11041106

11051107
@Test
11061108
public void testSendKeyEvent_delKeyNotConsumed() {
1107-
ListenableEditingState editable = sampleEditable(5, 5);
1109+
ListenableEditingState editable = sampleEditable(5, 5, "01234");
11081110
InputConnectionAdaptor adaptor = sampleInputConnectionAdaptor(editable);
11091111

1110-
KeyEvent downKeyDown = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL);
1112+
KeyEvent downKeyUP = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL);
11111113

11121114
for (int i = 0; i < 4; i++) {
1113-
boolean didConsume = adaptor.handleKeyEvent(downKeyDown);
1115+
boolean didConsume = adaptor.handleKeyEvent(downKeyUP);
11141116
assertFalse(didConsume);
11151117
}
11161118
assertEquals(5, Selection.getSelectionStart(editable));
1119+
1120+
// delete character
1121+
KeyEvent downKeyDown = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL);
1122+
for (int i = 0; i < 5; i++) {
1123+
boolean didConsume = adaptor.handleKeyEvent(downKeyDown);
1124+
assertTrue(didConsume);
1125+
}
1126+
assertEquals(0, Selection.getSelectionStart(editable));
1127+
assertEquals("", editable.toString());
11171128
}
11181129

11191130
@Test
@@ -1127,6 +1138,22 @@ public void testDoesNotConsumeBackButton() {
11271138
assertFalse(didConsume);
11281139
}
11291140

1141+
@Test
1142+
public void testInputKeycode() {
1143+
ListenableEditingState editable = sampleEditable(0, 0, "");
1144+
InputConnectionAdaptor adaptor = sampleInputConnectionAdaptor(editable);
1145+
1146+
List<FakeKeyEvent> keyEvents = new ArrayList<>();
1147+
keyEvents.add(new FakeKeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_1));
1148+
keyEvents.add(new FakeKeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_2));
1149+
keyEvents.add(new FakeKeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_3));
1150+
1151+
for (FakeKeyEvent keyEvent : keyEvents) {
1152+
adaptor.handleKeyEvent(keyEvent);
1153+
}
1154+
assertEquals("123", editable.toString());
1155+
}
1156+
11301157
@Test
11311158
public void testCleanUpBatchEndsOnCloseConnection() {
11321159
final ListenableEditingState editable = sampleEditable(0, 0);
Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,34 @@
11
package io.flutter.util;
22

33
import android.view.KeyEvent;
4+
import java.util.HashMap;
5+
import java.util.Map;
46

57
// In the test environment, keyEvent.getUnicodeChar throws an exception. This
68
// class works around the exception by hardcoding the returned value.
79
public class FakeKeyEvent extends KeyEvent {
10+
11+
private Map<Integer, Integer> keyCodeMap = new HashMap<>();
12+
813
public FakeKeyEvent(int action, int keyCode) {
914
super(action, keyCode);
15+
keyCodeMap.put(KEYCODE_1, (int) '1');
16+
keyCodeMap.put(KEYCODE_2, (int) '2');
17+
keyCodeMap.put(KEYCODE_3, (int) '3');
18+
keyCodeMap.put(KEYCODE_4, (int) '4');
19+
keyCodeMap.put(KEYCODE_5, (int) '5');
20+
keyCodeMap.put(KEYCODE_6, (int) '6');
21+
keyCodeMap.put(KEYCODE_7, (int) '7');
22+
keyCodeMap.put(KEYCODE_8, (int) '8');
23+
keyCodeMap.put(KEYCODE_9, (int) '9');
24+
keyCodeMap.put(KEYCODE_0, (int) '0');
1025
}
1126

1227
public final int getUnicodeChar() {
13-
if (getKeyCode() == KeyEvent.KEYCODE_BACK) {
28+
int code = getKeyCode();
29+
if (code == KeyEvent.KEYCODE_BACK) {
1430
return 0;
1531
}
16-
return 1;
32+
return keyCodeMap.getOrDefault(code, 1);
1733
}
1834
}

0 commit comments

Comments
 (0)