Add `embedderId` to `PointerEvent` (#60930)
This field is used to look-up the event in the platform
that resuted a given `PointerEvent`. This is currently only
used on Android, where the `embedderId` is set to be the
`motionEventId` for a given `MotionEvent`.
Roll engine to d0d6a4c2362d2ed478006bb3b01c34c0e96033b4
diff --git a/bin/internal/engine.version b/bin/internal/engine.version
index 2184e18..c2a2f7b 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 b12c5a9..9112353 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 @@
eventTime: 723657071,
action: 0,
xPrecision: 1.0,
+ motionEventId: 1,
),
AndroidMotionEvent(
downTime: 723657071,
@@ -252,6 +253,7 @@
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 481e660..85eec8c 100644
--- a/packages/flutter/lib/src/gestures/converter.dart
+++ b/packages/flutter/lib/src/gestures/converter.dart
@@ -74,6 +74,7 @@
radiusMax: radiusMax,
orientation: datum.orientation,
tilt: datum.tilt,
+ embedderId: datum.embedderId,
);
break;
case ui.PointerChange.hover:
@@ -97,6 +98,7 @@
orientation: datum.orientation,
tilt: datum.tilt,
synthesized: datum.synthesized,
+ embedderId: datum.embedderId,
);
break;
case ui.PointerChange.down:
@@ -119,6 +121,7 @@
radiusMax: radiusMax,
orientation: datum.orientation,
tilt: datum.tilt,
+ embedderId: datum.embedderId,
);
break;
case ui.PointerChange.move:
@@ -144,6 +147,7 @@
tilt: datum.tilt,
platformData: datum.platformData,
synthesized: datum.synthesized,
+ embedderId: datum.embedderId,
);
break;
case ui.PointerChange.up:
@@ -167,6 +171,7 @@
radiusMax: radiusMax,
orientation: datum.orientation,
tilt: datum.tilt,
+ embedderId: datum.embedderId,
);
break;
case ui.PointerChange.cancel:
@@ -189,6 +194,7 @@
radiusMax: radiusMax,
orientation: datum.orientation,
tilt: datum.tilt,
+ embedderId: datum.embedderId,
);
break;
case ui.PointerChange.remove:
@@ -203,6 +209,7 @@
distanceMax: datum.distanceMax,
radiusMin: radiusMin,
radiusMax: radiusMax,
+ embedderId: datum.embedderId,
);
break;
}
@@ -217,6 +224,7 @@
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 055fabc..9e041cc 100644
--- a/packages/flutter/lib/src/gestures/events.dart
+++ b/packages/flutter/lib/src/gestures/events.dart
@@ -202,6 +202,7 @@
/// 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 @@
}) : 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 @@
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 @@
double tilt = 0.0,
Matrix4 transform,
PointerAddedEvent original,
+ int embedderId = 0,
}) : super(
timeStamp: timeStamp,
kind: kind,
@@ -610,6 +621,7 @@
tilt: tilt,
transform: transform,
original: original,
+ embedderId: embedderId,
);
@override
@@ -634,6 +646,7 @@
tilt: tilt,
transform: transform,
original: original as PointerAddedEvent ?? this,
+ embedderId: embedderId,
);
}
}
@@ -660,6 +673,7 @@
double radiusMax = 0.0,
Matrix4 transform,
PointerRemovedEvent original,
+ int embedderId = 0,
}) : super(
timeStamp: timeStamp,
kind: kind,
@@ -675,6 +689,7 @@
radiusMax: radiusMax,
transform: transform,
original: original,
+ embedderId: embedderId,
);
@override
@@ -696,6 +711,7 @@
radiusMax: radiusMax,
transform: transform,
original: original as PointerRemovedEvent ?? this,
+ embedderId: embedderId,
);
}
}
@@ -738,6 +754,7 @@
bool synthesized = false,
Matrix4 transform,
PointerHoverEvent original,
+ int embedderId = 0,
}) : super(
timeStamp: timeStamp,
kind: kind,
@@ -764,6 +781,7 @@
synthesized: synthesized,
transform: transform,
original: original,
+ embedderId: embedderId,
);
@override
@@ -801,6 +819,7 @@
synthesized: synthesized,
transform: transform,
original: original as PointerHoverEvent ?? this,
+ embedderId: embedderId,
);
}
}
@@ -844,6 +863,7 @@
bool synthesized = false,
Matrix4 transform,
PointerEnterEvent original,
+ int embedderId = 0,
}) : super(
timeStamp: timeStamp,
kind: kind,
@@ -870,6 +890,7 @@
synthesized: synthesized,
transform: transform,
original: original,
+ embedderId: embedderId,
);
/// Creates an enter event from a [PointerHoverEvent].
@@ -947,6 +968,7 @@
synthesized: synthesized,
transform: transform,
original: original as PointerEnterEvent ?? this,
+ embedderId: embedderId,
);
}
}
@@ -990,6 +1012,7 @@
bool synthesized = false,
Matrix4 transform,
PointerExitEvent original,
+ int embedderId = 0,
}) : super(
timeStamp: timeStamp,
kind: kind,
@@ -1016,6 +1039,7 @@
synthesized: synthesized,
transform: transform,
original: original,
+ embedderId: embedderId,
);
/// Creates an exit event from a [PointerHoverEvent].
@@ -1093,6 +1117,7 @@
synthesized: synthesized,
transform: transform,
original: original as PointerExitEvent ?? this,
+ embedderId: embedderId,
);
}
}
@@ -1124,6 +1149,7 @@
double tilt = 0.0,
Matrix4 transform,
PointerDownEvent original,
+ int embedderId = 0,
}) : super(
timeStamp: timeStamp,
pointer: pointer,
@@ -1148,6 +1174,7 @@
tilt: tilt,
transform: transform,
original: original,
+ embedderId: embedderId,
);
@override
@@ -1177,6 +1204,7 @@
tilt: tilt,
transform: transform,
original: original as PointerDownEvent ?? this,
+ embedderId: embedderId,
);
}
}
@@ -1218,6 +1246,7 @@
bool synthesized = false,
Matrix4 transform,
PointerMoveEvent original,
+ int embedderId = 0,
}) : super(
timeStamp: timeStamp,
pointer: pointer,
@@ -1246,6 +1275,7 @@
synthesized: synthesized,
transform: transform,
original: original,
+ embedderId: embedderId,
);
@override
@@ -1286,6 +1316,7 @@
synthesized: synthesized,
transform: transform,
original: original as PointerMoveEvent ?? this,
+ embedderId: embedderId,
);
}
}
@@ -1320,6 +1351,7 @@
double tilt = 0.0,
Matrix4 transform,
PointerUpEvent original,
+ int embedderId = 0,
}) : super(
timeStamp: timeStamp,
pointer: pointer,
@@ -1344,6 +1376,7 @@
tilt: tilt,
transform: transform,
original: original,
+ embedderId: embedderId,
);
@override
@@ -1374,6 +1407,7 @@
tilt: tilt,
transform: transform,
original: original as PointerUpEvent ?? this,
+ embedderId: embedderId,
);
}
}
@@ -1395,6 +1429,7 @@
Offset localPosition,
Matrix4 transform,
PointerSignalEvent original,
+ int embedderId = 0,
}) : super(
timeStamp: timeStamp,
pointer: pointer,
@@ -1404,6 +1439,7 @@
localPosition: localPosition,
transform: transform,
original: original,
+ embedderId: embedderId,
);
}
@@ -1424,6 +1460,7 @@
this.scrollDelta = Offset.zero,
Matrix4 transform,
PointerScrollEvent original,
+ int embedderId = 0,
}) : assert(timeStamp != null),
assert(kind != null),
assert(device != null),
@@ -1437,6 +1474,7 @@
localPosition: localPosition,
transform: transform,
original: original,
+ embedderId: embedderId,
);
/// The amount to scroll, in logical pixels.
@@ -1456,6 +1494,7 @@
scrollDelta: scrollDelta,
transform: transform,
original: original as PointerScrollEvent ?? this,
+ embedderId: embedderId,
);
}
@@ -1493,6 +1532,7 @@
double tilt = 0.0,
Matrix4 transform,
PointerCancelEvent original,
+ int embedderId = 0,
}) : super(
timeStamp: timeStamp,
pointer: pointer,
@@ -1517,6 +1557,7 @@
tilt: tilt,
transform: transform,
original: original,
+ embedderId: embedderId,
);
@override
@@ -1546,6 +1587,7 @@
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 97699cd..b3fe37b 100644
--- a/packages/flutter/lib/src/services/platform_views.dart
+++ b/packages/flutter/lib/src/services/platform_views.dart
@@ -368,6 +368,7 @@
@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 @@
/// 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<dynamic> _asList(int viewId) {
return <dynamic>[
viewId,
@@ -466,6 +470,7 @@
edgeFlags,
source,
flags,
+ motionEventId,
];
}
@@ -602,6 +607,7 @@
edgeFlags: 0,
source: 0,
flags: 0,
+ motionEventId: event.embedderId,
);
}