diff --git a/shell/platform/android/io/flutter/embedding/android/KeyEmbedderResponder.java b/shell/platform/android/io/flutter/embedding/android/KeyEmbedderResponder.java index eb42164d833ad..de5af6b0ff013 100644 --- a/shell/platform/android/io/flutter/embedding/android/KeyEmbedderResponder.java +++ b/shell/platform/android/io/flutter/embedding/android/KeyEmbedderResponder.java @@ -369,7 +369,6 @@ private boolean handleEventImpl( output.physicalKey = physicalKey; output.character = character; output.synthesized = false; - output.deviceType = KeyData.DeviceType.kKeyboard; sendKeyEvent(output, onKeyEventHandledCallback); for (final Runnable postSyncEvent : postSynchronizeEvents) { diff --git a/shell/platform/android/test/io/flutter/embedding/android/KeyboardManagerTest.java b/shell/platform/android/test/io/flutter/embedding/android/KeyboardManagerTest.java index 8cf0c7e4629ab..d59d01ffb5e8c 100644 --- a/shell/platform/android/test/io/flutter/embedding/android/KeyboardManagerTest.java +++ b/shell/platform/android/test/io/flutter/embedding/android/KeyboardManagerTest.java @@ -14,6 +14,7 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import android.view.InputDevice; import android.view.KeyCharacterMap; import android.view.KeyEvent; import androidx.annotation.NonNull; @@ -88,7 +89,7 @@ enum Kind { /** * Construct an empty call record. * - *

Use the static functions to constuct specific types instead. + *

Use the static functions to construct specific types instead. */ private CallRecord() {} @@ -1921,4 +1922,88 @@ public void getKeyboardState() { new FakeKeyEvent(ACTION_UP, SCAN_KEY_A, KEYCODE_A, 0, 'a', 0)); assertEquals(tester.keyboardManager.getKeyboardState(), Map.of()); } + + @Test + public void deviceTypeFromInputDevice() { + final KeyboardTester tester = new KeyboardTester(); + final ArrayList calls = new ArrayList<>(); + + tester.recordEmbedderCallsTo(calls); + tester.respondToTextInputWith(true); + + // Keyboard + final KeyEvent keyboardEvent = + new FakeKeyEvent( + ACTION_DOWN, SCAN_KEY_A, KEYCODE_A, 0, 'a', 0, InputDevice.SOURCE_KEYBOARD); + assertEquals(true, tester.keyboardManager.handleEvent(keyboardEvent)); + verifyEmbedderEvents( + calls, + new KeyData[] { + buildKeyData(Type.kDown, PHYSICAL_KEY_A, LOGICAL_KEY_A, "a", false, DeviceType.kKeyboard), + }); + calls.clear(); + + // Directional pad + final KeyEvent directionalPadEvent = + new FakeKeyEvent( + ACTION_DOWN, SCAN_ARROW_LEFT, KEYCODE_DPAD_LEFT, 0, '\0', 0, InputDevice.SOURCE_DPAD); + assertEquals(true, tester.keyboardManager.handleEvent(directionalPadEvent)); + verifyEmbedderEvents( + calls, + new KeyData[] { + buildKeyData( + Type.kDown, + PHYSICAL_ARROW_LEFT, + LOGICAL_ARROW_LEFT, + null, + false, + DeviceType.kDirectionalPad), + }); + calls.clear(); + + // Gamepad + final KeyEvent gamepadEvent = + new FakeKeyEvent( + ACTION_DOWN, SCAN_ARROW_LEFT, KEYCODE_BUTTON_A, 0, '\0', 0, InputDevice.SOURCE_GAMEPAD); + assertEquals(true, tester.keyboardManager.handleEvent(gamepadEvent)); + verifyEmbedderEvents( + calls, + new KeyData[] { + buildKeyData( + Type.kUp, PHYSICAL_ARROW_LEFT, LOGICAL_ARROW_LEFT, null, true, DeviceType.kKeyboard), + buildKeyData( + Type.kDown, + PHYSICAL_ARROW_LEFT, + LOGICAL_GAME_BUTTON_A, + null, + false, + DeviceType.kGamepad), + }); + calls.clear(); + + // HDMI + final KeyEvent hdmiEvent = + new FakeKeyEvent( + ACTION_DOWN, SCAN_ARROW_LEFT, KEYCODE_BUTTON_A, 0, '\0', 0, InputDevice.SOURCE_HDMI); + assertEquals(true, tester.keyboardManager.handleEvent(hdmiEvent)); + verifyEmbedderEvents( + calls, + new KeyData[] { + buildKeyData( + Type.kUp, + PHYSICAL_ARROW_LEFT, + LOGICAL_GAME_BUTTON_A, + null, + true, + DeviceType.kKeyboard), + buildKeyData( + Type.kDown, + PHYSICAL_ARROW_LEFT, + LOGICAL_GAME_BUTTON_A, + null, + false, + DeviceType.kHdmi), + }); + calls.clear(); + } } diff --git a/shell/platform/android/test/io/flutter/util/FakeKeyEvent.java b/shell/platform/android/test/io/flutter/util/FakeKeyEvent.java index 4faa39107f50b..35ef6731d6ec8 100644 --- a/shell/platform/android/test/io/flutter/util/FakeKeyEvent.java +++ b/shell/platform/android/test/io/flutter/util/FakeKeyEvent.java @@ -20,6 +20,12 @@ public FakeKeyEvent( this.character = character; } + public FakeKeyEvent( + int action, int scancode, int code, int repeat, char character, int metaState, int source) { + super(0, 0, action, code, repeat, metaState, 0, scancode, 0, source); + this.character = character; + } + private char character = 0; public final int getUnicodeChar() {