diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 2184e183d3..c2a2f7b7e9 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -f22ac9da9c78215a3caf038b2205444dc2ee3d0d +d0d6a4c2362d2ed478006bb3b01c34c0e96033b4 diff --git a/dev/integration_tests/android_views/lib/wm_integrations.dart b/dev/integration_tests/android_views/lib/wm_integrations.dart index b12c5a9fc2..9112353994 100644 --- a/dev/integration_tests/android_views/lib/wm_integrations.dart +++ b/dev/integration_tests/android_views/lib/wm_integrations.dart @@ -219,6 +219,7 @@ class WindowManagerBodyState extends State { eventTime: 723657071, action: 0, xPrecision: 1.0, + motionEventId: 1, ), AndroidMotionEvent( downTime: 723657071, @@ -252,6 +253,7 @@ class WindowManagerBodyState extends State { edgeFlags: 0, source: 4098, flags: 0, + motionEventId: 2, ), ]; } diff --git a/packages/flutter/lib/src/gestures/converter.dart b/packages/flutter/lib/src/gestures/converter.dart index 481e6600ca..85eec8c092 100644 --- a/packages/flutter/lib/src/gestures/converter.dart +++ b/packages/flutter/lib/src/gestures/converter.dart @@ -74,6 +74,7 @@ class PointerEventConverter { radiusMax: radiusMax, orientation: datum.orientation, tilt: datum.tilt, + embedderId: datum.embedderId, ); break; case ui.PointerChange.hover: @@ -97,6 +98,7 @@ class PointerEventConverter { orientation: datum.orientation, tilt: datum.tilt, synthesized: datum.synthesized, + embedderId: datum.embedderId, ); break; case ui.PointerChange.down: @@ -119,6 +121,7 @@ class PointerEventConverter { radiusMax: radiusMax, orientation: datum.orientation, tilt: datum.tilt, + embedderId: datum.embedderId, ); break; case ui.PointerChange.move: @@ -144,6 +147,7 @@ class PointerEventConverter { tilt: datum.tilt, platformData: datum.platformData, synthesized: datum.synthesized, + embedderId: datum.embedderId, ); break; case ui.PointerChange.up: @@ -167,6 +171,7 @@ class PointerEventConverter { radiusMax: radiusMax, orientation: datum.orientation, tilt: datum.tilt, + embedderId: datum.embedderId, ); break; case ui.PointerChange.cancel: @@ -189,6 +194,7 @@ class PointerEventConverter { radiusMax: radiusMax, orientation: datum.orientation, tilt: datum.tilt, + embedderId: datum.embedderId, ); break; case ui.PointerChange.remove: @@ -203,6 +209,7 @@ class PointerEventConverter { distanceMax: datum.distanceMax, radiusMin: radiusMin, radiusMax: radiusMax, + embedderId: datum.embedderId, ); break; } @@ -217,6 +224,7 @@ class PointerEventConverter { device: datum.device, position: position, scrollDelta: scrollDelta, + embedderId: datum.embedderId, ); break; case ui.PointerSignalKind.none: diff --git a/packages/flutter/lib/src/gestures/events.dart b/packages/flutter/lib/src/gestures/events.dart index 055fabc50d..9e041cc74a 100644 --- a/packages/flutter/lib/src/gestures/events.dart +++ b/packages/flutter/lib/src/gestures/events.dart @@ -202,6 +202,7 @@ abstract class PointerEvent with Diagnosticable { /// Abstract const constructor. This constructor enables subclasses to provide /// const constructors so that they can be used in const expressions. const PointerEvent({ + this.embedderId = 0, this.timeStamp = Duration.zero, this.pointer = 0, this.kind = PointerDeviceKind.touch, @@ -232,6 +233,14 @@ abstract class PointerEvent with Diagnosticable { }) : localPosition = localPosition ?? position, localDelta = localDelta ?? delta; + /// Unique identifier that ties the [PointerEvent] to the embedder event that created it. + /// + /// No two pointer events can have the same [embedderId] on platforms that set it. + /// This is different from [pointer] identifier - used for hit-testing, + /// whereas [embedderId] is used to identify the platform event. + /// + /// On Android this is ID of the underlying [MotionEvent](https://developer.android.com/reference/android/view/MotionEvent). + final int embedderId; /// Time of event dispatch, relative to an arbitrary timeline. final Duration timeStamp; @@ -504,6 +513,7 @@ abstract class PointerEvent with Diagnosticable { properties.add(IntProperty('platformData', platformData, defaultValue: 0, level: DiagnosticLevel.debug)); properties.add(FlagProperty('obscured', value: obscured, ifTrue: 'obscured', level: DiagnosticLevel.debug)); properties.add(FlagProperty('synthesized', value: synthesized, ifTrue: 'synthesized', level: DiagnosticLevel.debug)); + properties.add(IntProperty('embedderId', embedderId, defaultValue: 0, level: DiagnosticLevel.debug)); } /// Returns a complete textual description of this event. @@ -592,6 +602,7 @@ class PointerAddedEvent extends PointerEvent { double tilt = 0.0, Matrix4 transform, PointerAddedEvent original, + int embedderId = 0, }) : super( timeStamp: timeStamp, kind: kind, @@ -610,6 +621,7 @@ class PointerAddedEvent extends PointerEvent { tilt: tilt, transform: transform, original: original, + embedderId: embedderId, ); @override @@ -634,6 +646,7 @@ class PointerAddedEvent extends PointerEvent { tilt: tilt, transform: transform, original: original as PointerAddedEvent ?? this, + embedderId: embedderId, ); } } @@ -660,6 +673,7 @@ class PointerRemovedEvent extends PointerEvent { double radiusMax = 0.0, Matrix4 transform, PointerRemovedEvent original, + int embedderId = 0, }) : super( timeStamp: timeStamp, kind: kind, @@ -675,6 +689,7 @@ class PointerRemovedEvent extends PointerEvent { radiusMax: radiusMax, transform: transform, original: original, + embedderId: embedderId, ); @override @@ -696,6 +711,7 @@ class PointerRemovedEvent extends PointerEvent { radiusMax: radiusMax, transform: transform, original: original as PointerRemovedEvent ?? this, + embedderId: embedderId, ); } } @@ -738,6 +754,7 @@ class PointerHoverEvent extends PointerEvent { bool synthesized = false, Matrix4 transform, PointerHoverEvent original, + int embedderId = 0, }) : super( timeStamp: timeStamp, kind: kind, @@ -764,6 +781,7 @@ class PointerHoverEvent extends PointerEvent { synthesized: synthesized, transform: transform, original: original, + embedderId: embedderId, ); @override @@ -801,6 +819,7 @@ class PointerHoverEvent extends PointerEvent { synthesized: synthesized, transform: transform, original: original as PointerHoverEvent ?? this, + embedderId: embedderId, ); } } @@ -844,6 +863,7 @@ class PointerEnterEvent extends PointerEvent { bool synthesized = false, Matrix4 transform, PointerEnterEvent original, + int embedderId = 0, }) : super( timeStamp: timeStamp, kind: kind, @@ -870,6 +890,7 @@ class PointerEnterEvent extends PointerEvent { synthesized: synthesized, transform: transform, original: original, + embedderId: embedderId, ); /// Creates an enter event from a [PointerHoverEvent]. @@ -947,6 +968,7 @@ class PointerEnterEvent extends PointerEvent { synthesized: synthesized, transform: transform, original: original as PointerEnterEvent ?? this, + embedderId: embedderId, ); } } @@ -990,6 +1012,7 @@ class PointerExitEvent extends PointerEvent { bool synthesized = false, Matrix4 transform, PointerExitEvent original, + int embedderId = 0, }) : super( timeStamp: timeStamp, kind: kind, @@ -1016,6 +1039,7 @@ class PointerExitEvent extends PointerEvent { synthesized: synthesized, transform: transform, original: original, + embedderId: embedderId, ); /// Creates an exit event from a [PointerHoverEvent]. @@ -1093,6 +1117,7 @@ class PointerExitEvent extends PointerEvent { synthesized: synthesized, transform: transform, original: original as PointerExitEvent ?? this, + embedderId: embedderId, ); } } @@ -1124,6 +1149,7 @@ class PointerDownEvent extends PointerEvent { double tilt = 0.0, Matrix4 transform, PointerDownEvent original, + int embedderId = 0, }) : super( timeStamp: timeStamp, pointer: pointer, @@ -1148,6 +1174,7 @@ class PointerDownEvent extends PointerEvent { tilt: tilt, transform: transform, original: original, + embedderId: embedderId, ); @override @@ -1177,6 +1204,7 @@ class PointerDownEvent extends PointerEvent { tilt: tilt, transform: transform, original: original as PointerDownEvent ?? this, + embedderId: embedderId, ); } } @@ -1218,6 +1246,7 @@ class PointerMoveEvent extends PointerEvent { bool synthesized = false, Matrix4 transform, PointerMoveEvent original, + int embedderId = 0, }) : super( timeStamp: timeStamp, pointer: pointer, @@ -1246,6 +1275,7 @@ class PointerMoveEvent extends PointerEvent { synthesized: synthesized, transform: transform, original: original, + embedderId: embedderId, ); @override @@ -1286,6 +1316,7 @@ class PointerMoveEvent extends PointerEvent { synthesized: synthesized, transform: transform, original: original as PointerMoveEvent ?? this, + embedderId: embedderId, ); } } @@ -1320,6 +1351,7 @@ class PointerUpEvent extends PointerEvent { double tilt = 0.0, Matrix4 transform, PointerUpEvent original, + int embedderId = 0, }) : super( timeStamp: timeStamp, pointer: pointer, @@ -1344,6 +1376,7 @@ class PointerUpEvent extends PointerEvent { tilt: tilt, transform: transform, original: original, + embedderId: embedderId, ); @override @@ -1374,6 +1407,7 @@ class PointerUpEvent extends PointerEvent { tilt: tilt, transform: transform, original: original as PointerUpEvent ?? this, + embedderId: embedderId, ); } } @@ -1395,6 +1429,7 @@ abstract class PointerSignalEvent extends PointerEvent { Offset localPosition, Matrix4 transform, PointerSignalEvent original, + int embedderId = 0, }) : super( timeStamp: timeStamp, pointer: pointer, @@ -1404,6 +1439,7 @@ abstract class PointerSignalEvent extends PointerEvent { localPosition: localPosition, transform: transform, original: original, + embedderId: embedderId, ); } @@ -1424,6 +1460,7 @@ class PointerScrollEvent extends PointerSignalEvent { this.scrollDelta = Offset.zero, Matrix4 transform, PointerScrollEvent original, + int embedderId = 0, }) : assert(timeStamp != null), assert(kind != null), assert(device != null), @@ -1437,6 +1474,7 @@ class PointerScrollEvent extends PointerSignalEvent { localPosition: localPosition, transform: transform, original: original, + embedderId: embedderId, ); /// The amount to scroll, in logical pixels. @@ -1456,6 +1494,7 @@ class PointerScrollEvent extends PointerSignalEvent { scrollDelta: scrollDelta, transform: transform, original: original as PointerScrollEvent ?? this, + embedderId: embedderId, ); } @@ -1493,6 +1532,7 @@ class PointerCancelEvent extends PointerEvent { double tilt = 0.0, Matrix4 transform, PointerCancelEvent original, + int embedderId = 0, }) : super( timeStamp: timeStamp, pointer: pointer, @@ -1517,6 +1557,7 @@ class PointerCancelEvent extends PointerEvent { tilt: tilt, transform: transform, original: original, + embedderId: embedderId, ); @override @@ -1546,6 +1587,7 @@ class PointerCancelEvent extends PointerEvent { tilt: tilt, transform: transform, original: original as PointerCancelEvent ?? this, + embedderId: embedderId, ); } } diff --git a/packages/flutter/lib/src/services/platform_views.dart b/packages/flutter/lib/src/services/platform_views.dart index 97699cd197..b3fe37be66 100644 --- a/packages/flutter/lib/src/services/platform_views.dart +++ b/packages/flutter/lib/src/services/platform_views.dart @@ -368,6 +368,7 @@ class AndroidMotionEvent { @required this.edgeFlags, @required this.source, @required this.flags, + @required this.motionEventId, }) : assert(downTime != null), assert(eventTime != null), assert(action != null), @@ -449,6 +450,9 @@ class AndroidMotionEvent { /// See Android's [MotionEvent#getFlags](https://developer.android.com/reference/android/view/MotionEvent.html#getFlags()). final int flags; + /// Used to identify this [MotionEvent](https://developer.android.com/reference/android/view/MotionEvent.html) uniquely in the Flutter Engine. + final int motionEventId; + List _asList(int viewId) { return [ viewId, @@ -466,6 +470,7 @@ class AndroidMotionEvent { edgeFlags, source, flags, + motionEventId, ]; } @@ -602,6 +607,7 @@ class _AndroidMotionEventConverter { edgeFlags: 0, source: 0, flags: 0, + motionEventId: event.embedderId, ); }