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 {
}
int action;
switch (event.runtimeType) {
case PointerDownEvent:
action = numPointers == 1
? AndroidViewController.kActionDown
: AndroidViewController.pointerAction(
pointerIdx, AndroidViewController.kActionPointerDown);
break;
case PointerUpEvent:
action = numPointers == 1
? AndroidViewController.kActionUp
: AndroidViewController.pointerAction(
pointerIdx, AndroidViewController.kActionPointerUp);
break;
case PointerMoveEvent:
action = AndroidViewController.kActionMove;
break;
case PointerCancelEvent:
action = AndroidViewController.kActionCancel;
break;
default:
return null;
if (event is PointerDownEvent) {
action = numPointers == 1
? AndroidViewController.kActionDown
: AndroidViewController.pointerAction(
pointerIdx, AndroidViewController.kActionPointerDown);
} else if (event is PointerUpEvent) {
action = numPointers == 1
? AndroidViewController.kActionUp
: AndroidViewController.pointerAction(
pointerIdx, AndroidViewController.kActionPointerUp);
} else if (event is PointerMoveEvent) {
action = AndroidViewController.kActionMove;
} else if (event is PointerCancelEvent) {
action = AndroidViewController.kActionCancel;
} else {
return null;
}
return AndroidMotionEvent(
......
......@@ -83,7 +83,7 @@ void main() {
await tester.pump(const Duration(milliseconds: 7));
expect(events.length, 1);
expect(events[0].runtimeType, equals(PointerDownEvent));
expect(events[0], isA<PointerDownEvent>());
expect(events[0].timeStamp, currentTestFrameTime() + kSamplingOffset);
expect(events[0].position, Offset(5.0 / ui.window.devicePixelRatio, 0.0));
......@@ -91,7 +91,7 @@ void main() {
await tester.pump(const Duration(milliseconds: 2));
expect(events.length, 2);
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].delta, Offset(20.0 / ui.window.devicePixelRatio, 0.0));
......@@ -99,11 +99,11 @@ void main() {
await tester.pump(const Duration(milliseconds: 2));
expect(events.length, 4);
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].delta, Offset(15.0 / ui.window.devicePixelRatio, 0.0));
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));
});
}
......@@ -63,8 +63,8 @@ void main() {
ui.window.onPointerDataPacket(packet);
expect(events.length, 2);
expect(events[0].runtimeType, equals(PointerDownEvent));
expect(events[1].runtimeType, equals(PointerUpEvent));
expect(events[0], isA<PointerDownEvent>());
expect(events[1], isA<PointerUpEvent>());
});
test('Pointer move events', () {
......@@ -81,9 +81,9 @@ void main() {
ui.window.onPointerDataPacket(packet);
expect(events.length, 3);
expect(events[0].runtimeType, equals(PointerDownEvent));
expect(events[1].runtimeType, equals(PointerMoveEvent));
expect(events[2].runtimeType, equals(PointerUpEvent));
expect(events[0], isA<PointerDownEvent>());
expect(events[1], isA<PointerMoveEvent>());
expect(events[2], isA<PointerUpEvent>());
});
test('Pointer hover events', () {
......@@ -108,12 +108,12 @@ void main() {
expect(events.length, 0);
expect(pointerRouterEvents.length, 6,
reason: 'pointerRouterEvents contains: $pointerRouterEvents');
expect(pointerRouterEvents[0].runtimeType, equals(PointerAddedEvent));
expect(pointerRouterEvents[1].runtimeType, equals(PointerHoverEvent));
expect(pointerRouterEvents[2].runtimeType, equals(PointerHoverEvent));
expect(pointerRouterEvents[3].runtimeType, equals(PointerRemovedEvent));
expect(pointerRouterEvents[4].runtimeType, equals(PointerAddedEvent));
expect(pointerRouterEvents[5].runtimeType, equals(PointerHoverEvent));
expect(pointerRouterEvents[0], isA<PointerAddedEvent>());
expect(pointerRouterEvents[1], isA<PointerHoverEvent>());
expect(pointerRouterEvents[2], isA<PointerHoverEvent>());
expect(pointerRouterEvents[3], isA<PointerRemovedEvent>());
expect(pointerRouterEvents[4], isA<PointerAddedEvent>());
expect(pointerRouterEvents[5], isA<PointerHoverEvent>());
});
test('Pointer cancel events', () {
......@@ -129,8 +129,8 @@ void main() {
ui.window.onPointerDataPacket(packet);
expect(events.length, 2);
expect(events[0].runtimeType, equals(PointerDownEvent));
expect(events[1].runtimeType, equals(PointerCancelEvent));
expect(events[0], isA<PointerDownEvent>());
expect(events[1], isA<PointerCancelEvent>());
});
test('Can cancel pointers', () {
......@@ -150,8 +150,8 @@ void main() {
ui.window.onPointerDataPacket(packet);
expect(events.length, 2);
expect(events[0].runtimeType, equals(PointerDownEvent));
expect(events[1].runtimeType, equals(PointerCancelEvent));
expect(events[0], isA<PointerDownEvent>());
expect(events[1], isA<PointerCancelEvent>());
});
test('Can expand add and hover pointers', () {
......@@ -169,11 +169,11 @@ void main() {
packet.data, ui.window.devicePixelRatio).toList();
expect(events.length, 5);
expect(events[0].runtimeType, equals(PointerAddedEvent));
expect(events[1].runtimeType, equals(PointerHoverEvent));
expect(events[2].runtimeType, equals(PointerRemovedEvent));
expect(events[3].runtimeType, equals(PointerAddedEvent));
expect(events[4].runtimeType, equals(PointerHoverEvent));
expect(events[0], isA<PointerAddedEvent>());
expect(events[1], isA<PointerHoverEvent>());
expect(events[2], isA<PointerRemovedEvent>());
expect(events[3], isA<PointerAddedEvent>());
expect(events[4], isA<PointerHoverEvent>());
});
test('Can expand pointer scroll events', () {
......@@ -188,8 +188,8 @@ void main() {
packet.data, ui.window.devicePixelRatio).toList();
expect(events.length, 2);
expect(events[0].runtimeType, equals(PointerAddedEvent));
expect(events[1].runtimeType, equals(PointerScrollEvent));
expect(events[0], isA<PointerAddedEvent>());
expect(events[1], isA<PointerScrollEvent>());
});
test('Should synthesize kPrimaryButton for touch', () {
......@@ -209,15 +209,15 @@ void main() {
packet.data, ui.window.devicePixelRatio).toList();
expect(events.length, 5);
expect(events[0].runtimeType, equals(PointerAddedEvent));
expect(events[0], isA<PointerAddedEvent>());
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[2].runtimeType, equals(PointerDownEvent));
expect(events[2], isA<PointerDownEvent>());
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[4].runtimeType, equals(PointerUpEvent));
expect(events[4], isA<PointerUpEvent>());
expect(events[4].buttons, equals(0));
});
......@@ -242,15 +242,15 @@ void main() {
packet.data, ui.window.devicePixelRatio).toList();
expect(events.length, 5);
expect(events[0].runtimeType, equals(PointerAddedEvent));
expect(events[0], isA<PointerAddedEvent>());
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[2].runtimeType, equals(PointerDownEvent));
expect(events[2], isA<PointerDownEvent>());
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[4].runtimeType, equals(PointerUpEvent));
expect(events[4], isA<PointerUpEvent>());
expect(events[4].buttons, equals(0));
}
});
......@@ -272,15 +272,15 @@ void main() {
packet.data, ui.window.devicePixelRatio).toList();
expect(events.length, 5);
expect(events[0].runtimeType, equals(PointerAddedEvent));
expect(events[0], isA<PointerAddedEvent>());
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[2].runtimeType, equals(PointerDownEvent));
expect(events[2], isA<PointerDownEvent>());
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[4].runtimeType, equals(PointerUpEvent));
expect(events[4], isA<PointerUpEvent>());
expect(events[4].buttons, equals(0));
});
......@@ -303,15 +303,15 @@ void main() {
packet.data, ui.window.devicePixelRatio).toList();
expect(events.length, 5);
expect(events[0].runtimeType, equals(PointerAddedEvent));
expect(events[0], isA<PointerAddedEvent>());
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[2].runtimeType, equals(PointerDownEvent));
expect(events[2], isA<PointerDownEvent>());
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[4].runtimeType, equals(PointerUpEvent));
expect(events[4], isA<PointerUpEvent>());
expect(events[4].buttons, equals(0));
}
});
......
......@@ -59,7 +59,7 @@ void main() {
});
expect(tested, isTrue);
expect(events.length, 2);
expect(events[0].runtimeType, equals(PointerDownEvent));
expect(events[1].runtimeType, equals(PointerUpEvent));
expect(events[0], isA<PointerDownEvent>());
expect(events[1], isA<PointerUpEvent>());
});
}
......@@ -2552,7 +2552,7 @@ void main() {
await gesture.moveTo(const Offset(400, 300));
expect(logs, <String>['enter1']);
expect(controller.dispatchedPointerEvents, hasLength(1));
expect(controller.dispatchedPointerEvents[0].runtimeType, PointerHoverEvent);
expect(controller.dispatchedPointerEvents[0], isA<PointerHoverEvent>());
logs.clear();
controller.dispatchedPointerEvents.clear();
......@@ -2582,7 +2582,7 @@ void main() {
await gesture.moveBy(const Offset(1, 1));
expect(logs, isEmpty);
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].localPosition, const Offset(101, 101));
controller.dispatchedPointerEvents.clear();
......@@ -2617,6 +2617,6 @@ void main() {
await gesture.moveBy(const Offset(1, 1));
expect(logs, isEmpty);
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