Unverified Commit 371667ec authored by David Reveman's avatar David Reveman Committed by GitHub

Fix resampling of down, up, and remove events. (#67080)

This adds the neccessary synthetic move/hover events to
resampler, which is needed for position to not change as
part of a down, up, or remove event.
Co-authored-by: 's avatarDavid Reveman <reveman@google.com>
parent e45157fc
......@@ -106,6 +106,18 @@ class PointerEventResampler {
);
}
PointerEvent _toMoveOrHoverEvent(
PointerEvent event,
Offset position,
Offset delta,
int pointerIdentifier,
Duration timeStamp,
bool isDown,
) {
return isDown ? _toMoveEvent(event, position, delta, pointerIdentifier, timeStamp)
: _toHoverEvent(event, position, delta, timeStamp);
}
Offset _positionAt(Duration sampleTime) {
// Use `next` position by default.
double x = _next?.position.dx ?? 0.0;
......@@ -224,13 +236,21 @@ class PointerEventResampler {
// Skip `move` and `hover` events as they are automatically
// generated when the position has changed.
if (event is! PointerMoveEvent && event is! PointerHoverEvent) {
// Add synthetics `move` or `hover` event if position has changed.
// Note: Devices without `hover` events are expected to always have
// `add` and `down` events with the same position and this logic will
// therefor never produce `hover` events.
if (position != _position) {
final Offset delta = position - _position;
callback(_toMoveOrHoverEvent(event, position, delta, _pointerIdentifier, sampleTime, wasDown));
_position = position;
}
callback(event.copyWith(
position: position,
delta: position - _position,
delta: Offset.zero,
pointer: pointerIdentifier,
timeStamp: sampleTime,
));
_position = position;
}
_queuedEvents.removeFirst();
......@@ -248,10 +268,7 @@ class PointerEventResampler {
final PointerEvent? next = _next;
if (position != _position && next != null) {
final Offset delta = position - _position;
final PointerEvent event = _isDown
? _toMoveEvent(next, position, delta, _pointerIdentifier, sampleTime)
: _toHoverEvent(next, position, delta, sampleTime);
callback(event);
callback(_toMoveOrHoverEvent(next, position, delta, _pointerIdentifier, sampleTime, _isDown));
_position = position;
}
}
......
......@@ -97,9 +97,13 @@ void main() {
// Now the system time is epoch + 11ms
await tester.pump(const Duration(milliseconds: 2));
expect(events.length, 3);
expect(events.length, 4);
expect(events[2].timeStamp, currentTestFrameTime() + kSamplingOffset);
expect(events[2].runtimeType, equals(PointerUpEvent));
expect(events[2].runtimeType, equals(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].position, Offset(40.0 / ui.window.devicePixelRatio, 0.0));
});
}
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