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 50c7a5b00c..df7b585734 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 5c5c5a8aba..bfa1c6fb51 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 c4304fe91a..8523558de4 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 4ddabffd7e..d1b8b7e054 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(); });