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,
     );
   }