From e458fd08d99df663bcb32898588bcd3a34cc199a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20Fedory=C5=84ski?= Date: Thu, 24 Oct 2019 20:06:03 +0200 Subject: [PATCH] Add repeatCount to RawKeyEventDataAndroid (#42861) * Add repeatCount to RawKeyEventDataAndroid Adds a new field to RawKeyEventDataAndroid and sets it to the value passed from the engine. It is the value returned by KeyEvent.getRepeatCount(). This allows us to differentiate between events generated by a new keypress and repeated events when a key is held down. * Add test for RawKeyEventDataAndroid.repeatCount --- dev/manual_tests/lib/raw_keyboard.dart | 1 + .../flutter/lib/src/services/raw_keyboard.dart | 1 + .../lib/src/services/raw_keyboard_android.dart | 8 +++++++- .../flutter/test/services/raw_keyboard_test.dart | 16 ++++++++++++++++ 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/dev/manual_tests/lib/raw_keyboard.dart b/dev/manual_tests/lib/raw_keyboard.dart index 1ec8dec8487..305b7fd25af 100644 --- a/dev/manual_tests/lib/raw_keyboard.dart +++ b/dev/manual_tests/lib/raw_keyboard.dart @@ -102,6 +102,7 @@ class _HardwareKeyDemoState extends State { dataText.add(Text('vendorId: ${data.vendorId} (${_asHex(data.vendorId)})')); dataText.add(Text('productId: ${data.productId} (${_asHex(data.productId)})')); dataText.add(Text('flags: ${data.flags} (${_asHex(data.flags)})')); + dataText.add(Text('repeatCount: ${data.repeatCount} (${_asHex(data.repeatCount)})')); } else if (data is RawKeyEventDataFuchsia) { dataText.add(Text('codePoint: ${data.codePoint} (${_asHex(data.codePoint)})')); dataText.add(Text('hidUsage: ${data.hidUsage} (${_asHex(data.hidUsage)})')); diff --git a/packages/flutter/lib/src/services/raw_keyboard.dart b/packages/flutter/lib/src/services/raw_keyboard.dart index ec5fad1a3d0..eaea10ed8ad 100644 --- a/packages/flutter/lib/src/services/raw_keyboard.dart +++ b/packages/flutter/lib/src/services/raw_keyboard.dart @@ -261,6 +261,7 @@ abstract class RawKeyEvent extends Diagnosticable { vendorId: message['vendorId'] ?? 0, productId: message['productId'] ?? 0, deviceId: message['deviceId'] ?? 0, + repeatCount: message['repeatCount'] ?? 0, ); break; case 'fuchsia': diff --git a/packages/flutter/lib/src/services/raw_keyboard_android.dart b/packages/flutter/lib/src/services/raw_keyboard_android.dart index 99ee8055f94..2492ffbc22e 100644 --- a/packages/flutter/lib/src/services/raw_keyboard_android.dart +++ b/packages/flutter/lib/src/services/raw_keyboard_android.dart @@ -37,6 +37,7 @@ class RawKeyEventDataAndroid extends RawKeyEventData { this.vendorId = 0, this.productId = 0, this.deviceId = 0, + this.repeatCount = 0, }) : assert(flags != null), assert(codePoint != null), assert(keyCode != null), @@ -128,12 +129,17 @@ class RawKeyEventDataAndroid extends RawKeyEventData { /// for the numerical values of the `productId`. final int productId; - /// The ID of the device that produced the event. /// /// See https://developer.android.com/reference/android/view/InputDevice.html#getId() final int deviceId; + /// The repeat count of the event. + /// + /// See + /// for more information. + final int repeatCount; + // The source code that indicates that an event came from a joystick. // from https://developer.android.com/reference/android/view/InputDevice.html#SOURCE_JOYSTICK static const int _sourceJoystick = 0x01000010; diff --git a/packages/flutter/test/services/raw_keyboard_test.dart b/packages/flutter/test/services/raw_keyboard_test.dart index 1f080e3766b..86b52451ae6 100644 --- a/packages/flutter/test/services/raw_keyboard_test.dart +++ b/packages/flutter/test/services/raw_keyboard_test.dart @@ -225,6 +225,22 @@ void main() { final RawKeyEventDataAndroid data = joystickDpadCenter.data; expect(data.deviceId, equals(10)); }); + test('Repeat count is passed correctly', () { + final RawKeyEvent repeatCountEvent = RawKeyEvent.fromMessage({ + 'type': 'keydown', + 'keymap': 'android', + 'keyCode': 29, + 'plainCodePoint': 'a'.codeUnitAt(0), + 'codePoint': 'A'.codeUnitAt(0), + 'character': 'A', + 'scanCode': 30, + 'metaState': 0x0, + 'source': 0x101, // Keyboard source. + 'repeatCount': 42, + }); + final RawKeyEventDataAndroid data = repeatCountEvent.data; + expect(data.repeatCount, equals(42)); + }); }); group('RawKeyEventDataFuchsia', () { const Map modifierTests = {