292 Commits

Author SHA1 Message Date
Callum Moffat
e05d0dd21f
ScaleGestureRecognizer pointerCount=2 for trackpad gestures (#140745)
Now trackpad gestures will count as pointerCount=2 instead of 1. It makes it easier for people who want to have different behaviour for single-finger drag vs two-finger pan/zoom. Also fixed up `scale_test.dart` to verify `pointerCount` in more places.

Related: https://github.com/flutter/flutter/issues/13102
Fixes https://github.com/flutter/flutter/issues/140730
2024-01-18 20:15:38 +00:00
Anis Alibegić
81d80c587d
Fixed a lot of typos (#141431)
Fair amount of typos spotted and fixed. Some of them are in comments, some of them are in code and some of them are in nondart files.

There is no need for issues since it's a typo fix.

I have doubts about [packages/flutter_tools/lib/src/ios/core_devices.dart](https://github.com/flutter/flutter/compare/master...anisalibegic:flutter:master#diff-fdbc1496b4bbe7e2b445a567fd385677af861c0093774e3d8cc460fdd5b794fa), I have a feeling it might broke some things on the other end, even though it's a typo.
2024-01-12 22:10:25 +00:00
Polina Cherkasova
0f2618ff4f
Fix or except leaks. (#141081)
Contributes to https://github.com/flutter/devtools/issues/6909.
2024-01-10 00:17:33 +00:00
Polina Cherkasova
baf739c8e6
Remove usage of testWidgetsWithLeakTracking. (#140239) 2023-12-15 14:13:31 -08:00
LongCatIsLooong
f2c6f03ca3
Catch Stopwatch with static analysis (#140019)
I did not include the `'// flutter_ignore_for_file: stopwatch (see analyze.dart)'` directive since it's currently not used, and adding that shouldn't be too difficult.
2023-12-14 00:31:49 +00:00
Kostia Sokolovskyi
b619b7016d
MultiDragPointerState should dispatch creation and disposal events. (#138807) 2023-12-07 13:02:40 -08:00
xubaolin
d49dcaa697
Introduce multi-touch drag strategies for DragGestureRecognizer (#136708)
Fixes #11884

As #38926 pointed out, the current Flutter implementation of multi-finger drag behavior is different from iOS and Android.
This change introduces the `MultitouchDragStrategy` attribute, which implements the Android behavior and can be controlled through `ScrollBehavior`, while retaining the ability to extend iOS behavior in the future.
2023-11-30 09:22:19 +00:00
yakagami
443d8617f7
add sourceTimeStamp to ScaleUpdateDetails (#135936)
This PR adds the ability to get the `sourceTimeStamp` from `ScaleUpdateDetails` in a `GestureScaleUpdateCallback` like so:

```dart
onScaleUpdate: (ScaleUpdateDetails details){
  print(details.sourceTimeStamp);
}
```

`sourceTimeStamp` is necessary when tracking velocity eg.

```dart
VelocityTracker tracker = VelocityTracker.withKind(PointerDeviceKind.touch);
///...
onScaleUpdate: (ScaleUpdateDetails details){
  tracker.addPosition(details.sourceTimeStamp!, details.focalPoint);
}
```

The docs say:

>Having both a pan gesture recognizer and a scale gesture recognizer is redundant; scale is a superset of pan. Just use the scale gesture recognizer.

Currently this is not entirely accurate, and should be fixed, as noted in https://github.com/flutter/flutter/issues/43833#issuecomment-548133779. This PR does not add `sourceTimeStamp` to `ScaleStartDetails` because it is more involved. Specifically, `ScaleStartDetails` can be created in `acceptGesture` which does not have access to the `PointerEvent` to get the `event.timeStamp` (54fa255432/packages/flutter/lib/src/gestures/scale.dart (L730C5-L730C5)).

fixes https://github.com/flutter/flutter/issues/135873. See also https://github.com/flutter/flutter/issues/43833 which added delta and https://github.com/flutter/flutter/issues/49025 which added `numPointers` to `ScaleUpdateDetails` for the reason given above. `sourceTimeStamp` should probably be added to `ScaleStartDetails` as well because it exists in `DragStartDetails` and therefore in `onPanStart`.

I am not sure how to add tests for this, any input about this PR would be appreciated.

- [] All existing and new tests are passing.
2023-11-29 20:09:21 +00:00
Kate Lovett
8ba459ce9f
Update VelocityTracker (4) (#139166)
This updates the implementation to use the stopwatch from the Clock object and pipes it through to the TestWidgetsFlutterBinding so it will be kept in sync with FakeAsync.

Relands https://github.com/flutter/flutter/pull/138843 attempted to reland https://github.com/flutter/flutter/pull/137381 which attempted to reland #132291
Fixes https://github.com/flutter/flutter/issues/97761

1. The original change was reverted due to flakiness it introduced in tests that use fling gestures.
  * Using a mocked clock through the test binding fixes this now
2. It was reverted a second time because a change at tip of tree broke it, exposing memory leaks, but it was not rebased before landing. 
  * These leaks are now fixed
3. It was reverted a third time, because we were so excellently quick to revert those other times, that we did not notice the broken benchmark that only runs in postsubmit.
  * The benchmark is now fixed
2023-11-29 14:59:13 +00:00
Jackson Gardner
b186c69684
Revert "Reland VelocityTracker update (again)" (#138863)
Reverts flutter/flutter#138843

This has broken the Mac_ios microbenchmarks_ios. Example failure:
https://ci.chromium.org/ui/p/flutter/builders/prod/Mac_ios%20microbenchmarks_ios/9339/overview
2023-11-21 19:17:46 -08:00
Kate Lovett
3e4e280914
Reland VelocityTracker update (again) (#138843)
This updates the implementation to use the stopwatch from the Clock object and piping it through to the TestWidgetsFlutterBinding so it will be kept in sync with FakeAsync.

Relands https://github.com/flutter/flutter/pull/137381 which attempted to reland #132291
Fixes https://github.com/flutter/flutter/issues/97761

The original change was reverted due to flakiness it introduced in tests that use fling gestures.
* https://github.com/flutter/flutter/issues/135728

It was reverted again due to a change in the leak tracking tests that broke it.
2023-11-21 22:21:22 +00:00
auto-submit[bot]
82a7a62b45
Reverts "Reland VelocityTracker update (#132291)" (#138512)
Reverts flutter/flutter#137381
Initiated by: Piinks
This change reverts the following previous change:
Original Description:
This updates the implementation to use the stopwatch from the Clock object and piping it through to the TestWidgetsFlutterBinding so it will be kept in sync with FakeAsync.

Relands #132291
Fixes https://github.com/flutter/flutter/issues/97761

The change was reverted due to flakiness it introduced in tests that use fling gestures.
* https://github.com/flutter/flutter/issues/135728
2023-11-15 21:22:19 +00:00
Kate Lovett
1ac73332bc
Reland VelocityTracker update (#132291) (#137381)
This updates the implementation to use the stopwatch from the Clock object and piping it through to the TestWidgetsFlutterBinding so it will be kept in sync with FakeAsync.

Relands #132291
Fixes https://github.com/flutter/flutter/issues/97761

The change was reverted due to flakiness it introduced in tests that use fling gestures.
* https://github.com/flutter/flutter/issues/135728
2023-11-15 19:31:48 +00:00
Kostia Sokolovskyi
a6aaad3487
GestureRecognizer should dispatch creation and disposal events. (#138223) 2023-11-10 13:14:14 -08:00
Todd Volkert
cb9a3f698c
Add timeline events for post frame callbacks (#136435)
Before this change, long-running post-frame callbacks wouldn't show up in the timeline at all.  This adds a timeline event for post-frame callbacks, with a debug flag that will add timeline events for each individual callback.

#testexempt -- we have no way to test calls to the timeline.
2023-10-22 20:46:21 +00:00
Kate Lovett
548843b9f9
Revert "[Velocity Tracker] Fix: Issue 97761: Flutter Scrolling does not match iOS; inadvertent scrolling when user lifts up finger" (#136905)
Reverts flutter/flutter#132291

We have found this introduced flakiness in many of our tests.

Fixes https://github.com/flutter/flutter/issues/135728
2023-10-19 22:10:14 +00:00
droidbg
3df6078bc4
[leak-tracking] Cover testwidgets with leak tracking in test/gestures (#136166) 2023-10-09 13:09:24 -07:00
Chip Weinberger
fffbbf279e
[Velocity Tracker] Fix: Issue 97761: Flutter Scrolling does not match iOS; inadvertent scrolling when user lifts up finger (#132291)
## Issue

**Issue:** https://github.com/flutter/flutter/issues/97761

https://github.com/flutter/flutter/assets/1863934/53c5e0df-b85a-483c-a17d-bddd18db3aa9

## The Cause:

The bug is very simple to understand - `velocity_tracker.dart` **only adds new samples while your finger is moving**.

**Therefore**, if you move your finger quickly & (important) stop suddenly with no extra movement, the last 3 samples will all be > 0 dy. Regardless of how long you wait, you will get movement when you lift up your finger.

**Logs from velocity_tracker.dart:**
Notice: all 3 `_previousVelocityAt` are `dy > 0` despite a 2 second delay since the last scroll
```
// start moving finger
flutter: addPosition dy:-464.0
flutter: addPosition dy:-465.0
flutter: addPosition dy:-466.0
flutter: addPosition dy:-467.0
flutter: addPosition dy:-468.0
flutter: addPosition dy:-469.0
flutter: addPosition dy:-470.0
// stop moving finger here, keep it still for 2 seconds & lift it up
flutter: _previousVelocityAt(-2) samples(-467.0, -468.0)) dy:-176.772140710624
flutter: _previousVelocityAt(-1) samples(-468.0, -469.0)) dy:-375.0937734433609
flutter: _previousVelocityAt(0) samples(-469.0, -470.0)) dy:-175.71604287471447
flutter: primaryVelocity DragEndDetails(Velocity(0.0, -305.5)).primaryVelocity
flutter: createBallisticSimulation pixels 464.16666666666663 velocity 305.4699824197211
```

## The Fix

**There are 3 options to fix it:**
A. sample uniformly *per unit time* (a larger more risky change, hurts battery life)
B. consider elapsed time since the last sample. If greater than X, assume no more velocity. (easy & just as valid)
C. similar to B, but instead add "ghost samples" of velocity zero, and run calculations as normal (a bit tricker, of dubious benefit imo)

**For Option B I considered two approaches:**
1. _get the current timestamp and compare to event timestamp._  This is tricky because events are documented to use an arbitrary timescale & I wasn't able to find the code that generates the timestamps. This approach could be considered more.
2. _get a new timestamp using Stopwatch and compare now vs when the last sample was added._ This is the solution implemented here.  There is a limitation in that we don't know when addSamples is called relative to the event. But, this estimation is already on a very low latency path & still it gives us a *minimum* time bound which is sufficient for comparison. 

**This PR chooses the simplest of the all solutions. Please try it our yourself, it completely solves the problem 😀** Option _B.1_ would be a nice alternative as well, if we can define and access the same timesource as the pointer tracker in a maintainable simple way.

## After Fix

https://github.com/flutter/flutter/assets/1863934/be50d8e7-d5da-495a-a4af-c71bc541cbe3
2023-09-25 19:09:51 +00:00
Kohei Seino
82cb74932f
ScaleGestureRecognizer: make pointerCount public (#127310)
make `pointCount` in `ScaleGestureRecognizer` public to handle pointer event depending on the number of pointers.

https://github.com/flutter/flutter/issues/127309
2023-09-12 01:01:38 +00:00
Greg Spencer
301577a34f
Fixing a memory leak in About box/dialog overlays (#130842)
## Description

Fix three memory leaks detected by `about_test.dart`, but were really in the `Route` and `OverlayEntry` classes.

## Related Issues
 - Fixes https://github.com/flutter/flutter/issues/130354

## Tests
 - Updates about_test.dart to not ignore the leaks anymore.
2023-08-15 21:58:21 +00:00
Polina Cherkasova
a7b69b069f
Unpin leak_tracker and handle breaking changes in API. (#132352) 2023-08-14 10:05:20 -07:00
Zachary Anderson
f4c25bbb35
Revert "Handle breaking changes in leak_tracker." (#132223)
Reverts flutter/flutter#131998

Reverting for https://github.com/flutter/flutter/issues/132222
2023-08-09 08:14:39 -07:00
Polina Cherkasova
acd636f7ba
Handle breaking changes in leak_tracker. (#131998) 2023-08-08 09:39:19 -07:00
Tomasz Gucio
e4e9dde4ed
Move TapAndDragGestureRecognizer code under gestures (#119508) 2023-07-19 11:48:01 +02:00
Ian Hickson
bc49cd1bca
Allow long-press gestures to continue even if buttons change. (#127877)
Previously, if you changed buttons during a long-press gesture, if it was before the gesture was accepted we would discard it, and if it was after the gesture was accepted we would silently end it without firing any of the relevant events.

This silent cancelation behavior is terrible because it means there's no way for consumers to know what state they're in, so you end up with widgets that thing they're still being long-pressed even though nothing is happening.

We could change the behavior in three ways, as far as I can tell:

- we could send a cancel event when you change buttons. This would introduce a new kind of transition (start->cancel) which I don't think we currently require people to support. This would therefore not fix existing code and would make future code more complicated to handle a really obscure user action that it seems unlikely anyone cares about.

- we could send an end event when you change buttons. This would mean the action commits, even though the user is still holding the mouse button down. This seems slightly better than the previous option but still not ideal as it means nudging the mouse button commits you even though you're still holding the button down.

- we could ignore button changes after the long-press has been accepted.

I implemented the last one in this PR.
2023-07-06 00:42:57 +00:00
Michael Goderbauer
cff67336d0
Add viewId to PointerEvents (#128287)
Follow-up to https://github.com/flutter/engine/pull/42493.
2023-06-06 19:16:02 -07:00
Renzo Olivares
83f19be250
Fix bottom sheet rebuilding when tapping (#127526)
This fixes an issue where the bottom sheet would rebuild when `enableDrag` is set to true on every tap. This is because `DragGestureRecognizer` would win the arena by default and dispatch the `drag` callbacks (in `acceptGesture`) even though it had not met the drag threshold. This changes keep the default behavior of `DragGestureRecognizer` the same, but adds a parameter `onlyAcceptDragOnThreshold` that a user can use to stop drag callbacks from being fired when the drag threshold has not been met.

Fixes #126833
2023-05-31 20:21:55 +00:00
Michael Goderbauer
58454e9e31
Remove dead code (#126266)
Dead code was flagged by `unreachable_from_main` lint, which is still experimental and not ready to be enabled yet.
2023-05-09 15:47:16 +00:00
Michael Goderbauer
9b230d239a
Fix leaks (#126144)
Fixes https://github.com/flutter/flutter/issues/126096.
Fixes https://github.com/flutter/flutter/issues/126097.
Fixes https://github.com/flutter/flutter/issues/126102.
Fixes https://github.com/flutter/flutter/issues/126098.
Fixes https://github.com/flutter/flutter/issues/126147.
Work towards https://github.com/flutter/flutter/issues/126100.

Does not fix the OverlyEntry/ModalRoute leak (https://github.com/flutter/flutter/issues/126100).
2023-05-08 09:11:23 +00:00
Polina Cherkasova
5a80f8d637
Define testWidgetsWithLeakTracking. (#125063) 2023-05-04 12:09:41 -07:00
Michael Goderbauer
c65bfe9a5a
Fix velocity_tracker_test.dart (#123559)
Fix velocity_tracker_test.dart
2023-03-27 23:02:43 +00:00
Greg Price
0117de40d8
Give PolynomialFit more docs, and a debug toString (#122333)
Give PolynomialFit more docs, and a debug toString
2023-03-20 18:08:17 +00:00
Greg Price
328f088aeb
Fix interference in fling-scrolling from cross-axis motion (#122338)
Fix interference in fling-scrolling from cross-axis motion
2023-03-17 20:51:58 +00:00
Michael Goderbauer
a599c08c32
Remvoe last few references to window singleton (#122644)
Remove last few references to window singleton
2023-03-15 00:34:34 +00:00
pdblasi-google
87c2ed1854
Reland: Updates flutter/test/gestures to no longer reference TestWindow (#122619)
Reland: Updates `flutter/test/gestures` to no longer reference `TestWindow`
2023-03-14 19:02:37 +00:00
Michael Goderbauer
473fa38f77
Reland "Remove references to BindingBase.window (#122119 & #122341)" (#122412)
Reland "Remove references to BindingBase.window (#122119 & #122341)"
2023-03-14 16:48:07 +00:00
Casey Hillers
1f42612323
Revert PRs relating to single window assumption (#122369)
* Revert "Remove references to BindingBase.window (#122119)"

This reverts commit c7681f00cf1fb1c63bebb27d715f29feb77b78b7.

* Revert "Remove another reference to BindingBase.window (#122341)"

This reverts commit 6ec444506375cfa94535a45c2320e01094c295e0.

* Revert "Reland (2): Removes single window assumptions from `flutter_test` (#122233)"

This reverts commit eb3d317ea06e59fadc379210f5c6e685505d8e0f.

* Revert "Remove single view assumption from TestViewConfiguration (#122352)"

This reverts commit 927289fb4e5b25a71f794bc808a8c31554859a50.

* Revert "Updates `flutter/test/cupertino` to no longer use `TestWindow` (#122325)"

This reverts commit 67e17e45f05271c6c409183c1d33806683cb9e4d.

* Revert "Updates `flutter/test/gestures` to no longer reference `TestWindow` (#122327)"

This reverts commit c2a5111cc0f9bcb104982b38a1a0a9c4210b601f.

* Revert "Updates `flutter/test/rendering` to no longer use `TestWindow` (#122347)"

This reverts commit 28b65e089b3f8e8c21572cd8a73184858b6360c3.

* Revert "Updates `flutter_localizations/test` to stop using `TestWindow` (#122321)"

This reverts commit 01367d52d7886f51a8921c9dc4a8e4c541686e98.
2023-03-09 22:53:38 -08:00
pdblasi-google
c2a5111cc0
Updates flutter/test/gestures to no longer reference TestWindow (#122327)
Updates `flutter/test/gestures` to no longer reference `TestWindow`
2023-03-09 22:21:34 +00:00
Michael Goderbauer
c7681f00cf
Remove references to BindingBase.window (#122119)
Remove references to BindingBase.window
2023-03-09 19:14:34 +00:00
Bernardo Ferrari
a5061bf9d2
Fix GestureRecognizer allowedButtonsFilter. (#122227) 2023-03-09 00:37:22 +01:00
Michael Goderbauer
92a1a8ba09
Migrate to FlutterView.gestureSettings (#121749) 2023-03-02 10:17:29 -08:00
Dan Field
c8aa37d1ea
Fix for #112403 and b/249091367 (#121615)
Fix monodrag gestures for #112403 and b/249091367
2023-02-28 20:14:33 +00:00
Lioness100
26b6c1bedd
Fix typos (#121171)
* Fix typos

* lowercase animated & opacity

* Undo typo fix

---------

Co-authored-by: Michael Goderbauer <goderbauer@google.com>
2023-02-23 19:43:21 +00:00
Kate Lovett
3570cce58e
Remove deprecated kind in GestureRecognizer et al (#119572)
* Remove deprecated kind in GestureRecognizer et al

* Fix null case
2023-02-03 01:34:17 +00:00
Ian Hickson
578edfc856
Catch errors thrown while handling pointer events (#119577) 2023-02-01 22:25:57 +00:00
chunhtai
54405bfa38
fixes PointerEventConverter to handle malformed scrolling event (#118124)
* fixes PointerEventConverter to handle malformed scrolling event

* update
2023-01-30 19:33:01 +00:00
Michael Goderbauer
e9ca9cc146
Remove references to dart:ui's window singelton (#119296) 2023-01-27 21:36:54 +00:00
Michael Goderbauer
bb73121cb4
Remove unnecessary null checks in flutter/test (#118905) 2023-01-20 22:09:06 +00:00
Bernardo Ferrari
0752af841e
Add allowedButtonsFilter to prevent Draggable from appearing with secondary click. (#111852)
* DragTarget part 1.

[WIP] Change GestureRecognizer. Sorry.

[WIP] Move from GestureRecognizer to MultiDragGestureRecognizer.

Make it a `Set<int>?`

Get bitwise operations working.

Fix test. Rename to allowedInputPointers.

Convert into a builder.

Improve code with default funciton.

Refactor everything again.

Rename to buttonEventFilter.

Use static function.

Fix analyzer.

Fix private reference.

Use // in private method.

* Fix Renzo request.

* Add `allowedButtonsFilter` everywhere.

* Refactor monoDrag for multi pointer support.

* Fix tests?

* Change default to always true.

* Fix PR comments.

* Completely refactor long press.

* Add forgotten class.

* Revert "Completely refactor long press."

This reverts commit 5038e8603e250e8c928b0f1754fb794b7b75738b.

* Add default value to LongPress

* Refactor doubleTap.

* Relax double tap.

* Write comment in LongPress.

* Use template.
2023-01-13 05:45:49 +00:00
Callum Moffat
7ddf42eae5
InteractiveViewer parameter to return to pre-3.3 trackpad/Magic Mouse behaviour (#114280)
* trackpadPanShouldActAsZoom

* Address feedback

* Move constant, add blank lines
2023-01-06 22:44:44 +00:00