Fix touch event conversion bugs. (#19780)
These are bugs uncovered by the integration test for embedded Android
views:
* Some PointerEvents were constructed with radiusMinor set to
radiusMajor.
* Some PointerEvents were missing radiusMajor/radiusMinor.
* The pressure parameter was not passed to PointerUpEvent.
* radiusMin, radiusMax, radiusMinor, and radiusMajor were not
converted from physical pixels to logical.
Sending the fixes without a test as the bugs are covered by the integration
test that is going to land soon.
diff --git a/packages/flutter/lib/src/gestures/converter.dart b/packages/flutter/lib/src/gestures/converter.dart
index 8e8fecd..63d5f1e 100644
--- a/packages/flutter/lib/src/gestures/converter.dart
+++ b/packages/flutter/lib/src/gestures/converter.dart
@@ -63,6 +63,10 @@
static Iterable<PointerEvent> expand(Iterable<ui.PointerData> data, double devicePixelRatio) sync* {
for (ui.PointerData datum in data) {
final Offset position = new Offset(datum.physicalX, datum.physicalY) / devicePixelRatio;
+ final double radiusMinor = _toLogicalPixels(datum.radiusMinor, devicePixelRatio);
+ final double radiusMajor = _toLogicalPixels(datum.radiusMajor, devicePixelRatio);
+ final double radiusMin = _toLogicalPixels(datum.radiusMin, devicePixelRatio);
+ final double radiusMax = _toLogicalPixels(datum.radiusMax, devicePixelRatio);
final Duration timeStamp = datum.timeStamp;
final PointerDeviceKind kind = datum.kind;
assert(datum.change != null);
@@ -81,8 +85,8 @@
pressureMax: datum.pressureMax,
distance: datum.distance,
distanceMax: datum.distanceMax,
- radiusMin: datum.radiusMin,
- radiusMax: datum.radiusMax,
+ radiusMin: radiusMin,
+ radiusMax: radiusMax,
orientation: datum.orientation,
tilt: datum.tilt
);
@@ -103,8 +107,8 @@
pressureMax: datum.pressureMax,
distance: datum.distance,
distanceMax: datum.distanceMax,
- radiusMin: datum.radiusMin,
- radiusMax: datum.radiusMax,
+ radiusMin: radiusMin,
+ radiusMax: radiusMax,
orientation: datum.orientation,
tilt: datum.tilt
);
@@ -123,10 +127,10 @@
pressureMax: datum.pressureMax,
distance: datum.distance,
distanceMax: datum.distanceMax,
- radiusMajor: datum.radiusMajor,
- radiusMinor: datum.radiusMajor,
- radiusMin: datum.radiusMin,
- radiusMax: datum.radiusMax,
+ radiusMajor: radiusMajor,
+ radiusMinor: radiusMinor,
+ radiusMin: radiusMin,
+ radiusMax: radiusMax,
orientation: datum.orientation,
tilt: datum.tilt
);
@@ -148,8 +152,8 @@
pressureMax: datum.pressureMax,
distance: datum.distance,
distanceMax: datum.distanceMax,
- radiusMin: datum.radiusMin,
- radiusMax: datum.radiusMax,
+ radiusMin: radiusMin,
+ radiusMax: radiusMax,
orientation: datum.orientation,
tilt: datum.tilt
);
@@ -172,10 +176,10 @@
pressureMax: datum.pressureMax,
distance: datum.distance,
distanceMax: datum.distanceMax,
- radiusMajor: datum.radiusMajor,
- radiusMinor: datum.radiusMajor,
- radiusMin: datum.radiusMin,
- radiusMax: datum.radiusMax,
+ radiusMajor: radiusMajor,
+ radiusMinor: radiusMinor,
+ radiusMin: radiusMin,
+ radiusMax: radiusMax,
orientation: datum.orientation,
tilt: datum.tilt,
synthesized: true,
@@ -196,10 +200,10 @@
pressureMin: datum.pressureMin,
pressureMax: datum.pressureMax,
distanceMax: datum.distanceMax,
- radiusMajor: datum.radiusMajor,
- radiusMinor: datum.radiusMajor,
- radiusMin: datum.radiusMin,
- radiusMax: datum.radiusMax,
+ radiusMajor: radiusMajor,
+ radiusMinor: radiusMinor,
+ radiusMin: radiusMin,
+ radiusMax: radiusMax,
orientation: datum.orientation,
tilt: datum.tilt
);
@@ -226,10 +230,10 @@
pressureMin: datum.pressureMin,
pressureMax: datum.pressureMax,
distanceMax: datum.distanceMax,
- radiusMajor: datum.radiusMajor,
- radiusMinor: datum.radiusMajor,
- radiusMin: datum.radiusMin,
- radiusMax: datum.radiusMax,
+ radiusMajor: radiusMajor,
+ radiusMinor: radiusMinor,
+ radiusMin: radiusMin,
+ radiusMax: radiusMax,
orientation: datum.orientation,
tilt: datum.tilt
);
@@ -260,10 +264,10 @@
pressureMin: datum.pressureMin,
pressureMax: datum.pressureMax,
distanceMax: datum.distanceMax,
- radiusMajor: datum.radiusMajor,
- radiusMinor: datum.radiusMajor,
- radiusMin: datum.radiusMin,
- radiusMax: datum.radiusMax,
+ radiusMajor: radiusMajor,
+ radiusMinor: radiusMinor,
+ radiusMin: radiusMin,
+ radiusMax: radiusMax,
orientation: datum.orientation,
tilt: datum.tilt,
synthesized: true,
@@ -281,11 +285,15 @@
position: position,
buttons: datum.buttons,
obscured: datum.obscured,
+ pressure: datum.pressure,
+ pressureMin: datum.pressureMin,
pressureMax: datum.pressureMax,
distance: datum.distance,
distanceMax: datum.distanceMax,
- radiusMin: datum.radiusMin,
- radiusMax: datum.radiusMax,
+ radiusMajor: radiusMajor,
+ radiusMinor: radiusMinor,
+ radiusMin: radiusMin,
+ radiusMax: radiusMax,
orientation: datum.orientation,
tilt: datum.tilt
);
@@ -302,8 +310,10 @@
pressureMax: datum.pressureMax,
distance: datum.distance,
distanceMax: datum.distanceMax,
- radiusMin: datum.radiusMin,
- radiusMax: datum.radiusMax,
+ radiusMajor: radiusMajor,
+ radiusMinor: radiusMinor,
+ radiusMin: radiusMin,
+ radiusMax: radiusMax,
orientation: datum.orientation,
tilt: datum.tilt
);
@@ -325,8 +335,10 @@
pressureMax: datum.pressureMax,
distance: datum.distance,
distanceMax: datum.distanceMax,
- radiusMin: datum.radiusMin,
- radiusMax: datum.radiusMax,
+ radiusMajor: radiusMajor,
+ radiusMinor: radiusMinor,
+ radiusMin: radiusMin,
+ radiusMax: radiusMax,
orientation: datum.orientation,
tilt: datum.tilt
);
@@ -340,11 +352,14 @@
pressureMin: datum.pressureMin,
pressureMax: datum.pressureMax,
distanceMax: datum.distanceMax,
- radiusMin: datum.radiusMin,
- radiusMax: datum.radiusMax
+ radiusMin: radiusMin,
+ radiusMax: radiusMax
);
break;
}
}
}
+
+ static double _toLogicalPixels(double physicalPixels, double devicePixelRatio) =>
+ physicalPixels == null ? null : physicalPixels / devicePixelRatio;
}
diff --git a/packages/flutter/lib/src/gestures/events.dart b/packages/flutter/lib/src/gestures/events.dart
index 0ff1e30..5d31de7 100644
--- a/packages/flutter/lib/src/gestures/events.dart
+++ b/packages/flutter/lib/src/gestures/events.dart
@@ -519,10 +519,13 @@
Offset position = Offset.zero,
int buttons = 0,
bool obscured = false,
+ double pressure = 1.0,
double pressureMin = 1.0,
double pressureMax = 1.0,
double distance = 0.0,
double distanceMax = 0.0,
+ double radiusMajor = 0.0,
+ double radiusMinor = 0.0,
double radiusMin = 0.0,
double radiusMax = 0.0,
double orientation = 0.0,
@@ -536,10 +539,13 @@
buttons: buttons,
down: false,
obscured: obscured,
+ pressure: pressure,
pressureMin: pressureMin,
pressureMax: pressureMax,
distance: distance,
distanceMax: distanceMax,
+ radiusMajor: radiusMajor,
+ radiusMinor: radiusMinor,
radiusMin: radiusMin,
radiusMax: radiusMax,
orientation: orientation,
@@ -564,6 +570,8 @@
double pressureMax = 1.0,
double distance = 0.0,
double distanceMax = 0.0,
+ double radiusMajor = 0.0,
+ double radiusMinor = 0.0,
double radiusMin = 0.0,
double radiusMax = 0.0,
double orientation = 0.0,
@@ -581,6 +589,8 @@
pressureMax: pressureMax,
distance: distance,
distanceMax: distanceMax,
+ radiusMajor: radiusMajor,
+ radiusMinor: radiusMinor,
radiusMin: radiusMin,
radiusMax: radiusMax,
orientation: orientation,