[ios][platform_view] Fix Platform view gesture recognizer with iPad pencil getting stuck (#55724)

## Summary 

I came across our the "gesture recognizer delegate" implementation and it is quite odd (see below). After fixing it, the problem is resolved. However, it's hard to reason about how it's related to iPad pencil, since it's internal logic that we don't know (see my research below). 

## Gesture recognizer delegate

### Existing odd implementation

- shouldBeRequiredToFailByGestureRecognizer: 

`otherGestureRecognizer != self` is always YES because the delegate set to self, hence `gestureRecognizer` must be self, hence `otherGestureRecognizer` must not be self. 

- shouldRequireFailureOfGestureRecognizer: 

`otherGestureRecognizer == self` is always NO, for the same reason described above. 

### new implementation: 

After digging into various PRs, the idea seems to be that we want to have a precedence of "Forwarding recognizer >  Delaying recognizer > Other recognizers in platform view". 

- shouldBeRequiredToFailByGestureRecognizer:

`return otherGestureRecognizer != _forwardingRecognizer` means Delaying recognizer needs to be higher precedence than all non-Forwarding recognizer. (aka "Delaying recognizer > Other recognizers in platform view")

- shouldRequireFailureOfGestureRecognizer:

`return otherGestureRecognizer == _forwardingRecognizer` means Delaying recognizer needs to have lower precedence than forwarding recognizer. (aka "Forwarding recognizer > Delaying recognizer"). 

## Some research

This is a tricky one since pencil and finger triggers exactly the same callbacks. It turns out that when pencil is involved after finger interaction, the platform view's "forwarding" gesture recognizer is stuck at failed state. This seems to be an iOS bug, because according to [the API doc](https://developer.apple.com/documentation/uikit/uigesturerecognizerstate/uigesturerecognizerstatefailed?language=objc), it should be reset back to "possible" state:

> No action message is sent and the gesture recognizer is reset to [UIGestureRecognizerStatePossible](https://developer.apple.com/documentation/uikit/uigesturerecognizerstate/uigesturerecognizerstatepossible?language=objc).

However, when iPad pencil is involved, the state is not reset. I tried to KVO the state property, and wasn't able to capture the change. This means the state change very likely happened internally within the recognizer via the backing ivar of the state property.

*List which issues are fixed by this PR. You must list at least one issue.*

Fixes https://github.com/flutter/flutter/issues/136244

*If you had to change anything in the [flutter/tests] repo, include a link to the migration guide as per the [breaking change policy].*

[C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style
2 files changed
tree: 6939a82ad76c076732d3ffd77e60fcf1f6ee6494
  1. .github/
  2. assets/
  3. benchmarking/
  4. bin/
  5. build/
  6. build_overrides/
  7. ci/
  8. common/
  9. display_list/
  10. docs/
  11. examples/
  12. flow/
  13. flutter_frontend_server/
  14. flutter_vma/
  15. fml/
  16. impeller/
  17. lib/
  18. runtime/
  19. shell/
  20. skia/
  21. sky/
  22. testing/
  23. third_party/
  24. tools/
  25. vulkan/
  26. wasm/
  27. web_sdk/
  28. .ci.yaml
  29. .clang-format
  30. .clang-tidy
  31. .engine-release.version
  32. .git-blame-ignore-revs
  33. .gitattributes
  34. .gitignore
  35. .pylintrc
  36. .style.yapf
  37. analysis_options.yaml
  38. AUTHORS
  39. BUILD.gn
  40. CODEOWNERS
  41. CONTRIBUTING.md
  42. DEPS
  43. Doxyfile
  44. engine.code-workspace
  45. LICENSE
  46. pubspec.yaml
  47. README.md
README.md

Flutter Engine

Flutter CI Status

Flutter is Google's SDK for crafting beautiful, fast user experiences for mobile, web, and desktop from a single codebase. Flutter works with existing code, is used by developers and organizations around the world, and is free and open source.

The Flutter Engine is a portable runtime for hosting Flutter applications. It implements Flutter's core libraries, including animation and graphics, file and network I/O, accessibility support, plugin architecture, and a Dart runtime and compile toolchain. Most developers will interact with Flutter via the Flutter Framework, which provides a modern, reactive framework, and a rich set of platform, layout and foundation widgets.

If you want to run/contribute to Flutter Web engine, more tooling can be found at felt. This is a tool written to make web engine development experience easy.

If you are new to Flutter, then you will find more general information on the Flutter project, including tutorials and samples, on our Web site at Flutter.dev. For specific information about Flutter's APIs, consider our API reference which can be found at the docs.flutter.dev.

Flutter is a fully open source project, and we welcome contributions. Information on how to get started can be found at our contributor guide.