Unverified Commit 74fe6bff authored by Tong Mu's avatar Tong Mu Committed by GitHub

Lazily compute PointerEvent's transformed positions (#63813)

* PointerEvent.local* properties are calculated lazily; other properties are delegated to original.
* Transformed PointerEvent becomes a subclass of its original class.
* Unnamed constructors no longer accepts transform and origin.
parent 76c0d69b
...@@ -568,27 +568,22 @@ class _AndroidMotionEventConverter { ...@@ -568,27 +568,22 @@ class _AndroidMotionEventConverter {
} }
int action; int action;
switch (event.runtimeType) { if (event is PointerDownEvent) {
case PointerDownEvent: action = numPointers == 1
action = numPointers == 1 ? AndroidViewController.kActionDown
? AndroidViewController.kActionDown : AndroidViewController.pointerAction(
: AndroidViewController.pointerAction( pointerIdx, AndroidViewController.kActionPointerDown);
pointerIdx, AndroidViewController.kActionPointerDown); } else if (event is PointerUpEvent) {
break; action = numPointers == 1
case PointerUpEvent: ? AndroidViewController.kActionUp
action = numPointers == 1 : AndroidViewController.pointerAction(
? AndroidViewController.kActionUp pointerIdx, AndroidViewController.kActionPointerUp);
: AndroidViewController.pointerAction( } else if (event is PointerMoveEvent) {
pointerIdx, AndroidViewController.kActionPointerUp); action = AndroidViewController.kActionMove;
break; } else if (event is PointerCancelEvent) {
case PointerMoveEvent: action = AndroidViewController.kActionCancel;
action = AndroidViewController.kActionMove; } else {
break; return null;
case PointerCancelEvent:
action = AndroidViewController.kActionCancel;
break;
default:
return null;
} }
return AndroidMotionEvent( return AndroidMotionEvent(
......
...@@ -83,7 +83,7 @@ void main() { ...@@ -83,7 +83,7 @@ void main() {
await tester.pump(const Duration(milliseconds: 7)); await tester.pump(const Duration(milliseconds: 7));
expect(events.length, 1); expect(events.length, 1);
expect(events[0].runtimeType, equals(PointerDownEvent)); expect(events[0], isA<PointerDownEvent>());
expect(events[0].timeStamp, currentTestFrameTime() + kSamplingOffset); expect(events[0].timeStamp, currentTestFrameTime() + kSamplingOffset);
expect(events[0].position, Offset(5.0 / ui.window.devicePixelRatio, 0.0)); expect(events[0].position, Offset(5.0 / ui.window.devicePixelRatio, 0.0));
...@@ -91,7 +91,7 @@ void main() { ...@@ -91,7 +91,7 @@ void main() {
await tester.pump(const Duration(milliseconds: 2)); await tester.pump(const Duration(milliseconds: 2));
expect(events.length, 2); expect(events.length, 2);
expect(events[1].timeStamp, currentTestFrameTime() + kSamplingOffset); expect(events[1].timeStamp, currentTestFrameTime() + kSamplingOffset);
expect(events[1].runtimeType, equals(PointerMoveEvent)); expect(events[1], isA<PointerMoveEvent>());
expect(events[1].position, Offset(25.0 / ui.window.devicePixelRatio, 0.0)); expect(events[1].position, Offset(25.0 / ui.window.devicePixelRatio, 0.0));
expect(events[1].delta, Offset(20.0 / ui.window.devicePixelRatio, 0.0)); expect(events[1].delta, Offset(20.0 / ui.window.devicePixelRatio, 0.0));
...@@ -99,11 +99,11 @@ void main() { ...@@ -99,11 +99,11 @@ void main() {
await tester.pump(const Duration(milliseconds: 2)); await tester.pump(const Duration(milliseconds: 2));
expect(events.length, 4); expect(events.length, 4);
expect(events[2].timeStamp, currentTestFrameTime() + kSamplingOffset); expect(events[2].timeStamp, currentTestFrameTime() + kSamplingOffset);
expect(events[2].runtimeType, equals(PointerMoveEvent)); expect(events[2], isA<PointerMoveEvent>());
expect(events[2].position, Offset(40.0 / ui.window.devicePixelRatio, 0.0)); expect(events[2].position, Offset(40.0 / ui.window.devicePixelRatio, 0.0));
expect(events[2].delta, Offset(15.0 / ui.window.devicePixelRatio, 0.0)); expect(events[2].delta, Offset(15.0 / ui.window.devicePixelRatio, 0.0));
expect(events[3].timeStamp, currentTestFrameTime() + kSamplingOffset); expect(events[3].timeStamp, currentTestFrameTime() + kSamplingOffset);
expect(events[3].runtimeType, equals(PointerUpEvent)); expect(events[3], isA<PointerUpEvent>());
expect(events[3].position, Offset(40.0 / ui.window.devicePixelRatio, 0.0)); expect(events[3].position, Offset(40.0 / ui.window.devicePixelRatio, 0.0));
}); });
} }
...@@ -63,8 +63,8 @@ void main() { ...@@ -63,8 +63,8 @@ void main() {
ui.window.onPointerDataPacket(packet); ui.window.onPointerDataPacket(packet);
expect(events.length, 2); expect(events.length, 2);
expect(events[0].runtimeType, equals(PointerDownEvent)); expect(events[0], isA<PointerDownEvent>());
expect(events[1].runtimeType, equals(PointerUpEvent)); expect(events[1], isA<PointerUpEvent>());
}); });
test('Pointer move events', () { test('Pointer move events', () {
...@@ -81,9 +81,9 @@ void main() { ...@@ -81,9 +81,9 @@ void main() {
ui.window.onPointerDataPacket(packet); ui.window.onPointerDataPacket(packet);
expect(events.length, 3); expect(events.length, 3);
expect(events[0].runtimeType, equals(PointerDownEvent)); expect(events[0], isA<PointerDownEvent>());
expect(events[1].runtimeType, equals(PointerMoveEvent)); expect(events[1], isA<PointerMoveEvent>());
expect(events[2].runtimeType, equals(PointerUpEvent)); expect(events[2], isA<PointerUpEvent>());
}); });
test('Pointer hover events', () { test('Pointer hover events', () {
...@@ -108,12 +108,12 @@ void main() { ...@@ -108,12 +108,12 @@ void main() {
expect(events.length, 0); expect(events.length, 0);
expect(pointerRouterEvents.length, 6, expect(pointerRouterEvents.length, 6,
reason: 'pointerRouterEvents contains: $pointerRouterEvents'); reason: 'pointerRouterEvents contains: $pointerRouterEvents');
expect(pointerRouterEvents[0].runtimeType, equals(PointerAddedEvent)); expect(pointerRouterEvents[0], isA<PointerAddedEvent>());
expect(pointerRouterEvents[1].runtimeType, equals(PointerHoverEvent)); expect(pointerRouterEvents[1], isA<PointerHoverEvent>());
expect(pointerRouterEvents[2].runtimeType, equals(PointerHoverEvent)); expect(pointerRouterEvents[2], isA<PointerHoverEvent>());
expect(pointerRouterEvents[3].runtimeType, equals(PointerRemovedEvent)); expect(pointerRouterEvents[3], isA<PointerRemovedEvent>());
expect(pointerRouterEvents[4].runtimeType, equals(PointerAddedEvent)); expect(pointerRouterEvents[4], isA<PointerAddedEvent>());
expect(pointerRouterEvents[5].runtimeType, equals(PointerHoverEvent)); expect(pointerRouterEvents[5], isA<PointerHoverEvent>());
}); });
test('Pointer cancel events', () { test('Pointer cancel events', () {
...@@ -129,8 +129,8 @@ void main() { ...@@ -129,8 +129,8 @@ void main() {
ui.window.onPointerDataPacket(packet); ui.window.onPointerDataPacket(packet);
expect(events.length, 2); expect(events.length, 2);
expect(events[0].runtimeType, equals(PointerDownEvent)); expect(events[0], isA<PointerDownEvent>());
expect(events[1].runtimeType, equals(PointerCancelEvent)); expect(events[1], isA<PointerCancelEvent>());
}); });
test('Can cancel pointers', () { test('Can cancel pointers', () {
...@@ -150,8 +150,8 @@ void main() { ...@@ -150,8 +150,8 @@ void main() {
ui.window.onPointerDataPacket(packet); ui.window.onPointerDataPacket(packet);
expect(events.length, 2); expect(events.length, 2);
expect(events[0].runtimeType, equals(PointerDownEvent)); expect(events[0], isA<PointerDownEvent>());
expect(events[1].runtimeType, equals(PointerCancelEvent)); expect(events[1], isA<PointerCancelEvent>());
}); });
test('Can expand add and hover pointers', () { test('Can expand add and hover pointers', () {
...@@ -169,11 +169,11 @@ void main() { ...@@ -169,11 +169,11 @@ void main() {
packet.data, ui.window.devicePixelRatio).toList(); packet.data, ui.window.devicePixelRatio).toList();
expect(events.length, 5); expect(events.length, 5);
expect(events[0].runtimeType, equals(PointerAddedEvent)); expect(events[0], isA<PointerAddedEvent>());
expect(events[1].runtimeType, equals(PointerHoverEvent)); expect(events[1], isA<PointerHoverEvent>());
expect(events[2].runtimeType, equals(PointerRemovedEvent)); expect(events[2], isA<PointerRemovedEvent>());
expect(events[3].runtimeType, equals(PointerAddedEvent)); expect(events[3], isA<PointerAddedEvent>());
expect(events[4].runtimeType, equals(PointerHoverEvent)); expect(events[4], isA<PointerHoverEvent>());
}); });
test('Can expand pointer scroll events', () { test('Can expand pointer scroll events', () {
...@@ -188,8 +188,8 @@ void main() { ...@@ -188,8 +188,8 @@ void main() {
packet.data, ui.window.devicePixelRatio).toList(); packet.data, ui.window.devicePixelRatio).toList();
expect(events.length, 2); expect(events.length, 2);
expect(events[0].runtimeType, equals(PointerAddedEvent)); expect(events[0], isA<PointerAddedEvent>());
expect(events[1].runtimeType, equals(PointerScrollEvent)); expect(events[1], isA<PointerScrollEvent>());
}); });
test('Should synthesize kPrimaryButton for touch', () { test('Should synthesize kPrimaryButton for touch', () {
...@@ -209,15 +209,15 @@ void main() { ...@@ -209,15 +209,15 @@ void main() {
packet.data, ui.window.devicePixelRatio).toList(); packet.data, ui.window.devicePixelRatio).toList();
expect(events.length, 5); expect(events.length, 5);
expect(events[0].runtimeType, equals(PointerAddedEvent)); expect(events[0], isA<PointerAddedEvent>());
expect(events[0].buttons, equals(0)); expect(events[0].buttons, equals(0));
expect(events[1].runtimeType, equals(PointerHoverEvent)); expect(events[1], isA<PointerHoverEvent>());
expect(events[1].buttons, equals(0)); expect(events[1].buttons, equals(0));
expect(events[2].runtimeType, equals(PointerDownEvent)); expect(events[2], isA<PointerDownEvent>());
expect(events[2].buttons, equals(kPrimaryButton)); expect(events[2].buttons, equals(kPrimaryButton));
expect(events[3].runtimeType, equals(PointerMoveEvent)); expect(events[3], isA<PointerMoveEvent>());
expect(events[3].buttons, equals(kPrimaryButton)); expect(events[3].buttons, equals(kPrimaryButton));
expect(events[4].runtimeType, equals(PointerUpEvent)); expect(events[4], isA<PointerUpEvent>());
expect(events[4].buttons, equals(0)); expect(events[4].buttons, equals(0));
}); });
...@@ -242,15 +242,15 @@ void main() { ...@@ -242,15 +242,15 @@ void main() {
packet.data, ui.window.devicePixelRatio).toList(); packet.data, ui.window.devicePixelRatio).toList();
expect(events.length, 5); expect(events.length, 5);
expect(events[0].runtimeType, equals(PointerAddedEvent)); expect(events[0], isA<PointerAddedEvent>());
expect(events[0].buttons, equals(0)); expect(events[0].buttons, equals(0));
expect(events[1].runtimeType, equals(PointerHoverEvent)); expect(events[1], isA<PointerHoverEvent>());
expect(events[1].buttons, equals(0)); expect(events[1].buttons, equals(0));
expect(events[2].runtimeType, equals(PointerDownEvent)); expect(events[2], isA<PointerDownEvent>());
expect(events[2].buttons, equals(kPrimaryButton)); expect(events[2].buttons, equals(kPrimaryButton));
expect(events[3].runtimeType, equals(PointerMoveEvent)); expect(events[3], isA<PointerMoveEvent>());
expect(events[3].buttons, equals(kPrimaryButton | kSecondaryStylusButton)); expect(events[3].buttons, equals(kPrimaryButton | kSecondaryStylusButton));
expect(events[4].runtimeType, equals(PointerUpEvent)); expect(events[4], isA<PointerUpEvent>());
expect(events[4].buttons, equals(0)); expect(events[4].buttons, equals(0));
} }
}); });
...@@ -272,15 +272,15 @@ void main() { ...@@ -272,15 +272,15 @@ void main() {
packet.data, ui.window.devicePixelRatio).toList(); packet.data, ui.window.devicePixelRatio).toList();
expect(events.length, 5); expect(events.length, 5);
expect(events[0].runtimeType, equals(PointerAddedEvent)); expect(events[0], isA<PointerAddedEvent>());
expect(events[0].buttons, equals(0)); expect(events[0].buttons, equals(0));
expect(events[1].runtimeType, equals(PointerHoverEvent)); expect(events[1], isA<PointerHoverEvent>());
expect(events[1].buttons, equals(0)); expect(events[1].buttons, equals(0));
expect(events[2].runtimeType, equals(PointerDownEvent)); expect(events[2], isA<PointerDownEvent>());
expect(events[2].buttons, equals(kPrimaryButton)); expect(events[2].buttons, equals(kPrimaryButton));
expect(events[3].runtimeType, equals(PointerMoveEvent)); expect(events[3], isA<PointerMoveEvent>());
expect(events[3].buttons, equals(kPrimaryButton)); expect(events[3].buttons, equals(kPrimaryButton));
expect(events[4].runtimeType, equals(PointerUpEvent)); expect(events[4], isA<PointerUpEvent>());
expect(events[4].buttons, equals(0)); expect(events[4].buttons, equals(0));
}); });
...@@ -303,15 +303,15 @@ void main() { ...@@ -303,15 +303,15 @@ void main() {
packet.data, ui.window.devicePixelRatio).toList(); packet.data, ui.window.devicePixelRatio).toList();
expect(events.length, 5); expect(events.length, 5);
expect(events[0].runtimeType, equals(PointerAddedEvent)); expect(events[0], isA<PointerAddedEvent>());
expect(events[0].buttons, equals(0)); expect(events[0].buttons, equals(0));
expect(events[1].runtimeType, equals(PointerHoverEvent)); expect(events[1], isA<PointerHoverEvent>());
expect(events[1].buttons, equals(0)); expect(events[1].buttons, equals(0));
expect(events[2].runtimeType, equals(PointerDownEvent)); expect(events[2], isA<PointerDownEvent>());
expect(events[2].buttons, equals(kMiddleMouseButton)); expect(events[2].buttons, equals(kMiddleMouseButton));
expect(events[3].runtimeType, equals(PointerMoveEvent)); expect(events[3], isA<PointerMoveEvent>());
expect(events[3].buttons, equals(kMiddleMouseButton | kSecondaryMouseButton)); expect(events[3].buttons, equals(kMiddleMouseButton | kSecondaryMouseButton));
expect(events[4].runtimeType, equals(PointerUpEvent)); expect(events[4], isA<PointerUpEvent>());
expect(events[4].buttons, equals(0)); expect(events[4].buttons, equals(0));
} }
}); });
......
...@@ -59,7 +59,7 @@ void main() { ...@@ -59,7 +59,7 @@ void main() {
}); });
expect(tested, isTrue); expect(tested, isTrue);
expect(events.length, 2); expect(events.length, 2);
expect(events[0].runtimeType, equals(PointerDownEvent)); expect(events[0], isA<PointerDownEvent>());
expect(events[1].runtimeType, equals(PointerUpEvent)); expect(events[1], isA<PointerUpEvent>());
}); });
} }
...@@ -2552,7 +2552,7 @@ void main() { ...@@ -2552,7 +2552,7 @@ void main() {
await gesture.moveTo(const Offset(400, 300)); await gesture.moveTo(const Offset(400, 300));
expect(logs, <String>['enter1']); expect(logs, <String>['enter1']);
expect(controller.dispatchedPointerEvents, hasLength(1)); expect(controller.dispatchedPointerEvents, hasLength(1));
expect(controller.dispatchedPointerEvents[0].runtimeType, PointerHoverEvent); expect(controller.dispatchedPointerEvents[0], isA<PointerHoverEvent>());
logs.clear(); logs.clear();
controller.dispatchedPointerEvents.clear(); controller.dispatchedPointerEvents.clear();
...@@ -2582,7 +2582,7 @@ void main() { ...@@ -2582,7 +2582,7 @@ void main() {
await gesture.moveBy(const Offset(1, 1)); await gesture.moveBy(const Offset(1, 1));
expect(logs, isEmpty); expect(logs, isEmpty);
expect(controller.dispatchedPointerEvents, hasLength(1)); expect(controller.dispatchedPointerEvents, hasLength(1));
expect(controller.dispatchedPointerEvents[0].runtimeType, PointerHoverEvent); expect(controller.dispatchedPointerEvents[0], isA<PointerHoverEvent>());
expect(controller.dispatchedPointerEvents[0].position, const Offset(401, 301)); expect(controller.dispatchedPointerEvents[0].position, const Offset(401, 301));
expect(controller.dispatchedPointerEvents[0].localPosition, const Offset(101, 101)); expect(controller.dispatchedPointerEvents[0].localPosition, const Offset(101, 101));
controller.dispatchedPointerEvents.clear(); controller.dispatchedPointerEvents.clear();
...@@ -2617,6 +2617,6 @@ void main() { ...@@ -2617,6 +2617,6 @@ void main() {
await gesture.moveBy(const Offset(1, 1)); await gesture.moveBy(const Offset(1, 1));
expect(logs, isEmpty); expect(logs, isEmpty);
expect(controller.dispatchedPointerEvents, hasLength(1)); expect(controller.dispatchedPointerEvents, hasLength(1));
expect(controller.dispatchedPointerEvents[0].runtimeType, PointerHoverEvent); expect(controller.dispatchedPointerEvents[0], isA<PointerHoverEvent>());
}); });
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment