From 4e7c052b63aa57237c16cabb16e8f128a0e63b31 Mon Sep 17 00:00:00 2001 From: Todd Volkert Date: Wed, 28 Apr 2021 09:11:13 -0700 Subject: [PATCH] Fix bug in LongPressGestureRecognizer (#81340) It was incorrectly resetting state when it received a non-allowed pointer but had already accepted a gesture. https://github.com/flutter/flutter/issues/81339 --- .../flutter/lib/src/gestures/recognizer.dart | 7 ++++++ .../test/gestures/long_press_test.dart | 23 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/packages/flutter/lib/src/gestures/recognizer.dart b/packages/flutter/lib/src/gestures/recognizer.dart index ba620aa38f..3d41f8e6ed 100644 --- a/packages/flutter/lib/src/gestures/recognizer.dart +++ b/packages/flutter/lib/src/gestures/recognizer.dart @@ -463,6 +463,13 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni } } + @override + void handleNonAllowedPointer(PointerDownEvent event) { + if (!_gestureAccepted) { + super.handleNonAllowedPointer(event); + } + } + @override void handleEvent(PointerEvent event) { assert(state != GestureRecognizerState.ready); diff --git a/packages/flutter/test/gestures/long_press_test.dart b/packages/flutter/test/gestures/long_press_test.dart index 943c57adc8..81ee4e4f7b 100644 --- a/packages/flutter/test/gestures/long_press_test.dart +++ b/packages/flutter/test/gestures/long_press_test.dart @@ -288,6 +288,29 @@ void main() { longPress.dispose(); }); + + testGesture('non-allowed pointer does not inadvertently reset the recognizer', (GestureTester tester) { + longPress = LongPressGestureRecognizer(kind: PointerDeviceKind.touch)..onLongPress = () {}; + + // Accept a long-press gesture + longPress.addPointer(down); + tester.closeArena(5); + tester.route(down); + tester.async.elapse(const Duration(milliseconds: 500)); + + // Add a non-allowed pointer (doesn't match the kind filter) + longPress.addPointer(const PointerDownEvent( + pointer: 101, + kind: PointerDeviceKind.mouse, + position: Offset(10, 10), + )); + + // Moving the primary pointer should result in a normal event + tester.route(const PointerMoveEvent( + pointer: 5, + position: Offset(15, 15), + )); + }); }); group('long press drag', () {