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,26 +568,21 @@ class _AndroidMotionEventConverter { ...@@ -568,26 +568,21 @@ 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);
break; } else if (event is PointerUpEvent) {
case PointerUpEvent:
action = numPointers == 1 action = numPointers == 1
? AndroidViewController.kActionUp ? AndroidViewController.kActionUp
: AndroidViewController.pointerAction( : AndroidViewController.pointerAction(
pointerIdx, AndroidViewController.kActionPointerUp); pointerIdx, AndroidViewController.kActionPointerUp);
break; } else if (event is PointerMoveEvent) {
case PointerMoveEvent:
action = AndroidViewController.kActionMove; action = AndroidViewController.kActionMove;
break; } else if (event is PointerCancelEvent) {
case PointerCancelEvent:
action = AndroidViewController.kActionCancel; action = AndroidViewController.kActionCancel;
break; } else {
default:
return null; return null;
} }
......
...@@ -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