From c40cb176e3042fe480e44cd653bcf8c3cc348bec Mon Sep 17 00:00:00 2001 From: Ian Hickson Date: Fri, 6 Nov 2015 22:48:25 -0800 Subject: [PATCH] Fix tapcancel on slop. Make sure to send tapcancel when the primary pointer fails because of slop, even if the gesture won by default. Also, minor cleanup and clarification of an invariant. --- packages/flutter/lib/src/gestures/arena.dart | 5 ++--- packages/flutter/lib/src/gestures/recognizer.dart | 2 +- packages/flutter/lib/src/gestures/tap.dart | 9 +++++++++ packages/unit/test/gestures/tap_test.dart | 9 +++++++++ 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/packages/flutter/lib/src/gestures/arena.dart b/packages/flutter/lib/src/gestures/arena.dart index 50c7a5b00cd..df7b585734d 100644 --- a/packages/flutter/lib/src/gestures/arena.dart +++ b/packages/flutter/lib/src/gestures/arena.dart @@ -146,8 +146,7 @@ class GestureArena { } else { assert(disposition == GestureDisposition.accepted); if (state.isOpen) { - if (state.eagerWinner == null) - state.eagerWinner = member; + state.eagerWinner ??= member; } else { _resolveInFavorOf(key, state, member); } @@ -166,4 +165,4 @@ class GestureArena { } member.acceptGesture(key); } -} \ No newline at end of file +} diff --git a/packages/flutter/lib/src/gestures/recognizer.dart b/packages/flutter/lib/src/gestures/recognizer.dart index 5c5c5a8abaf..bfa1c6fb518 100644 --- a/packages/flutter/lib/src/gestures/recognizer.dart +++ b/packages/flutter/lib/src/gestures/recognizer.dart @@ -112,7 +112,7 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni // TODO(abarth): Maybe factor the slop handling out into a separate class? if (event.type == 'pointermove' && _getDistance(event) > kTouchSlop) { resolve(GestureDisposition.rejected); - stopTrackingPointer(event.pointer); + stopTrackingPointer(primaryPointer); } else { handlePrimaryPointer(event); } diff --git a/packages/flutter/lib/src/gestures/tap.dart b/packages/flutter/lib/src/gestures/tap.dart index c4304fe91ac..8523558de4f 100644 --- a/packages/flutter/lib/src/gestures/tap.dart +++ b/packages/flutter/lib/src/gestures/tap.dart @@ -43,6 +43,15 @@ class TapGestureRecognizer extends PrimaryPointerGestureRecognizer { } } + void resolve(GestureDisposition disposition) { + if (_wonArena && disposition == GestureDisposition.rejected) { + if (onTapCancel != null) + onTapCancel(); + _reset(); + } + super.resolve(disposition); + } + void didExceedDeadline() { _checkDown(); } diff --git a/packages/unit/test/gestures/tap_test.dart b/packages/unit/test/gestures/tap_test.dart index 4ddabffd7e4..d1b8b7e054f 100644 --- a/packages/unit/test/gestures/tap_test.dart +++ b/packages/unit/test/gestures/tap_test.dart @@ -161,19 +161,28 @@ void main() { tap.onTap = () { tapRecognized = true; }; + bool tapCanceled = false; + tap.onTapCancel = () { + tapCanceled = true; + }; tap.addPointer(down3); GestureArena.instance.close(3); expect(tapRecognized, isFalse); + expect(tapCanceled, isFalse); router.route(down3); expect(tapRecognized, isFalse); + expect(tapCanceled, isFalse); router.route(move3); expect(tapRecognized, isFalse); + expect(tapCanceled, isTrue); router.route(up3); expect(tapRecognized, isFalse); + expect(tapCanceled, isTrue); GestureArena.instance.sweep(3); expect(tapRecognized, isFalse); + expect(tapCanceled, isTrue); tap.dispose(); });