Skip to content

Commit f88d2d9

Browse files
authored
Revert 20917 platform view arena (flutter#21086)
This reverts commit c594696.
1 parent 3313f51 commit f88d2d9

File tree

3 files changed

+6
-232
lines changed

3 files changed

+6
-232
lines changed

packages/flutter/lib/src/rendering/platform_view.dart

Lines changed: 3 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,7 @@ enum _PlatformViewState {
4242
/// Android [View](https://developer.android.com/reference/android/view/View).
4343
///
4444
/// The render object's layout behavior is to fill all available space, the parent of this object must
45-
/// provide bounded layout constraints.
46-
///
47-
/// RenderAndroidView participates in Flutter's [GestureArena]s, and dispatches touch events to the
48-
/// Android view iff it won the arena. Specific gestures that should be dispatched to the Android
49-
/// view can be specified in [RenderAndroidView.gestureRecognizers]. If
50-
/// [RenderAndroidView.gestureRecognizers] is empty, the gesture will be dispatched to the Android
51-
/// view iff it was not claimed by any other gesture recognizer.
45+
/// provide bounded layout constraints
5246
///
5347
/// See also:
5448
/// * [AndroidView] which is a widget that is used to show an Android view.
@@ -59,14 +53,10 @@ class RenderAndroidView extends RenderBox {
5953
RenderAndroidView({
6054
@required AndroidViewController viewController,
6155
@required this.hitTestBehavior,
62-
List<OneSequenceGestureRecognizer> gestureRecognizers = const <OneSequenceGestureRecognizer> [],
6356
}) : assert(viewController != null),
6457
assert(hitTestBehavior != null),
65-
assert(gestureRecognizers != null),
66-
_viewController = viewController
67-
{
58+
_viewController = viewController {
6859
_motionEventsDispatcher = new _MotionEventsDispatcher(globalToLocal, viewController);
69-
this.gestureRecognizers = gestureRecognizers;
7060
}
7161

7262
_PlatformViewState _state = _PlatformViewState.uninitialized;
@@ -90,18 +80,6 @@ class RenderAndroidView extends RenderBox {
9080
// any newly arriving events there's nothing we need to invalidate.
9181
PlatformViewHitTestBehavior hitTestBehavior;
9282

93-
/// Which gestures should be forwarded to the Android view.
94-
///
95-
/// The gesture recognizers on this list participate in the gesture arena for each pointer
96-
/// that was put down on the render box. If any of the recognizers on this list wins the
97-
/// gesture arena, the entire pointer event sequence starting from the pointer down event
98-
/// will be dispatched to the Android view.
99-
set gestureRecognizers(List<OneSequenceGestureRecognizer> recognizers) {
100-
assert(recognizers != null);
101-
_gestureRecognizer?.dispose();
102-
_gestureRecognizer = new _AndroidViewGestureRecognizer(_motionEventsDispatcher, recognizers);
103-
}
104-
10583
@override
10684
bool get sizedByParent => true;
10785

@@ -113,8 +91,6 @@ class RenderAndroidView extends RenderBox {
11391

11492
_MotionEventsDispatcher _motionEventsDispatcher;
11593

116-
_AndroidViewGestureRecognizer _gestureRecognizer;
117-
11894
@override
11995
void performResize() {
12096
size = constraints.biggest;
@@ -193,109 +169,7 @@ class RenderAndroidView extends RenderBox {
193169

194170
@override
195171
void handleEvent(PointerEvent event, HitTestEntry entry) {
196-
if (event is PointerDownEvent) {
197-
_gestureRecognizer.addPointer(event);
198-
}
199-
}
200-
201-
@override
202-
void detach() {
203-
_gestureRecognizer.reset();
204-
super.detach();
205-
}
206-
}
207-
208-
class _AndroidViewGestureRecognizer extends OneSequenceGestureRecognizer {
209-
_AndroidViewGestureRecognizer(this.dispatcher, List<OneSequenceGestureRecognizer> gestureRecognizers) {
210-
this.gestureRecognizers = gestureRecognizers;
211-
}
212-
213-
final _MotionEventsDispatcher dispatcher;
214-
215-
// Maps a pointer to a list of its cached pointer events.
216-
// Before the arena for a pointer is resolved all events are cached here, if we win the arena
217-
// the cached events are dispatched to the view, if we lose the arena we clear the cache for
218-
// the pointer.
219-
final Map<int, List<PointerEvent>> cachedEvents = <int, List<PointerEvent>> {};
220-
221-
// Pointer for which we have already won the arena, events for pointers in this set are
222-
// immediately dispatched to the Android view.
223-
final Set<int> forwardedPointers = new Set<int>();
224-
225-
// We use OneSequenceGestureRecognizers as they support gesture arena teams.
226-
// TODO(amirh): get a list of GestureRecognizers here.
227-
// https://github.com/flutter/flutter/issues/20953
228-
List<OneSequenceGestureRecognizer> _gestureRecognizers;
229-
set gestureRecognizers(List<OneSequenceGestureRecognizer> recognizers) {
230-
_gestureRecognizers = recognizers;
231-
team = new GestureArenaTeam();
232-
team.captain = this;
233-
for (OneSequenceGestureRecognizer recognizer in _gestureRecognizers) {
234-
recognizer.team = team;
235-
}
236-
}
237-
238-
@override
239-
void addPointer(PointerDownEvent event) {
240-
startTrackingPointer(event.pointer);
241-
for (OneSequenceGestureRecognizer recognizer in _gestureRecognizers) {
242-
recognizer.addPointer(event);
243-
}
244-
}
245-
246-
@override
247-
String get debugDescription => 'Android view';
248-
249-
@override
250-
void didStopTrackingLastPointer(int pointer) {
251-
resolve(GestureDisposition.rejected);
252-
}
253-
254-
@override
255-
void handleEvent(PointerEvent event) {
256-
if (!forwardedPointers.contains(event.pointer)) {
257-
cacheEvent(event);
258-
} else {
259-
dispatcher.handlePointerEvent(event);
260-
}
261-
stopTrackingIfPointerNoLongerDown(event);
262-
}
263-
264-
@override
265-
void acceptGesture(int pointer) {
266-
flushPointerCache(pointer);
267-
forwardedPointers.add(pointer);
268-
}
269-
270-
@override
271-
void rejectGesture(int pointer) {
272-
stopTrackingPointer(pointer);
273-
cachedEvents.remove(pointer);
274-
}
275-
276-
void cacheEvent(PointerEvent event) {
277-
if (!cachedEvents.containsKey(event.pointer)) {
278-
cachedEvents[event.pointer] = <PointerEvent> [];
279-
}
280-
cachedEvents[event.pointer].add(event);
281-
}
282-
283-
void flushPointerCache(int pointer) {
284-
cachedEvents.remove(pointer)?.forEach(dispatcher.handlePointerEvent);
285-
}
286-
287-
@override
288-
void stopTrackingPointer(int pointer) {
289-
super.stopTrackingPointer(pointer);
290-
forwardedPointers.remove(pointer);
291-
}
292-
293-
void reset() {
294-
forwardedPointers.forEach(super.stopTrackingPointer);
295-
forwardedPointers.clear();
296-
cachedEvents.keys.forEach(super.stopTrackingPointer);
297-
cachedEvents.clear();
298-
resolve(GestureDisposition.rejected);
172+
_motionEventsDispatcher.handlePointerEvent(event);
299173
}
300174
}
301175

packages/flutter/lib/src/widgets/platform_view.dart

Lines changed: 3 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
// found in the LICENSE file.
44

55
import 'package:flutter/foundation.dart';
6-
import 'package:flutter/gestures.dart';
76
import 'package:flutter/rendering.dart';
87
import 'package:flutter/services.dart';
98

@@ -22,12 +21,6 @@ import 'framework.dart';
2221
/// The widget fill all available space, the parent of this object must provide bounded layout
2322
/// constraints.
2423
///
25-
/// AndroidView participates in Flutter's [GestureArena]s, and dispatches touch events to the
26-
/// Android view iff it won the arena. Specific gestures that should be dispatched to the Android
27-
/// view can be specified in [AndroidView.gestureRecognizers]. If
28-
/// [AndroidView.gestureRecognizers] is empty, the gesture will be dispatched to the Android
29-
/// view iff it was not claimed by any other gesture recognizer.
30-
///
3124
/// The Android view object is created using a [PlatformViewFactory](/javadoc/io/flutter/plugin/platform/PlatformViewFactory.html).
3225
/// Plugins can register platform view factories with [PlatformViewRegistry#registerViewFactory](/javadoc/io/flutter/plugin/platform/PlatformViewRegistry.html#registerViewFactory-java.lang.String-io.flutter.plugin.platform.PlatformViewFactory-).
3326
///
@@ -48,20 +41,18 @@ import 'framework.dart';
4841
class AndroidView extends StatefulWidget {
4942
/// Creates a widget that embeds an Android view.
5043
///
51-
/// The `viewType`, `hitTestBehavior`, and `gestureRecognizers` parameters must not be null.
44+
/// The `viewType` and `hitTestBehavior` parameters must not be null.
5245
/// If `creationParams` is not null then `creationParamsCodec` must not be null.
5346
AndroidView({
5447
Key key,
5548
@required this.viewType,
5649
this.onPlatformViewCreated,
5750
this.hitTestBehavior = PlatformViewHitTestBehavior.opaque,
5851
this.layoutDirection,
59-
this.gestureRecognizers = const <OneSequenceGestureRecognizer> [],
6052
this.creationParams,
6153
this.creationParamsCodec
6254
}) : assert(viewType != null),
6355
assert(hitTestBehavior != null),
64-
assert(gestureRecognizers != null),
6556
assert(creationParams == null || creationParamsCodec != null),
6657
super(key: key);
6758

@@ -87,17 +78,6 @@ class AndroidView extends StatefulWidget {
8778
/// If this is null, the ambient [Directionality] is used instead.
8879
final TextDirection layoutDirection;
8980

90-
/// Which gestures should be forwarded to the Android view.
91-
///
92-
/// The gesture recognizers on this list participate in the gesture arena for each pointer
93-
/// that was put down on the widget. If any of the recognizers on this list wins the
94-
/// gesture arena, the entire pointer event sequence starting from the pointer down event
95-
/// will be dispatched to the Android view.
96-
// We use OneSequenceGestureRecognizers as they support gesture arena teams.
97-
// TODO(amirh): get a list of GestureRecognizers here.
98-
// https://github.com/flutter/flutter/issues/20953
99-
final List<OneSequenceGestureRecognizer> gestureRecognizers;
100-
10181
/// Passed as the args argument of [PlatformViewFactory#create](/javadoc/io/flutter/plugin/platform/PlatformViewFactory.html#create-android.content.Context-int-java.lang.Object-)
10282
///
10383
/// This can be used by plugins to pass constructor parameters to the embedded Android view.
@@ -125,8 +105,7 @@ class _AndroidViewState extends State<AndroidView> {
125105
Widget build(BuildContext context) {
126106
return new _AndroidPlatformView(
127107
controller: _controller,
128-
hitTestBehavior: widget.hitTestBehavior,
129-
gestureRecognizers: widget.gestureRecognizers,
108+
hitTestBehavior: widget.hitTestBehavior
130109
);
131110
}
132111

@@ -203,28 +182,20 @@ class _AndroidPlatformView extends LeafRenderObjectWidget {
203182
Key key,
204183
@required this.controller,
205184
@required this.hitTestBehavior,
206-
@required this.gestureRecognizers,
207185
}) : assert(controller != null),
208186
assert(hitTestBehavior != null),
209-
assert(gestureRecognizers != null),
210187
super(key: key);
211188

212189
final AndroidViewController controller;
213190
final PlatformViewHitTestBehavior hitTestBehavior;
214-
final List<OneSequenceGestureRecognizer> gestureRecognizers;
215191

216192
@override
217193
RenderObject createRenderObject(BuildContext context) =>
218-
new RenderAndroidView(
219-
viewController: controller,
220-
hitTestBehavior: hitTestBehavior,
221-
gestureRecognizers: gestureRecognizers,
222-
);
194+
new RenderAndroidView(viewController: controller, hitTestBehavior: hitTestBehavior);
223195

224196
@override
225197
void updateRenderObject(BuildContext context, RenderAndroidView renderObject) {
226198
renderObject.viewController = controller;
227199
renderObject.hitTestBehavior = hitTestBehavior;
228-
renderObject.gestureRecognizers = gestureRecognizers;
229200
}
230201
}

packages/flutter/test/widgets/platform_view_test.dart

Lines changed: 0 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -513,75 +513,4 @@ void main() {
513513
]),
514514
);
515515
});
516-
517-
testWidgets('Android view can lose gesture arenas', (WidgetTester tester) async {
518-
final int currentViewId = platformViewsRegistry.getNextPlatformViewId();
519-
final FakePlatformViewsController viewsController = new FakePlatformViewsController(TargetPlatform.android);
520-
viewsController.registerViewType('webview');
521-
bool verticalDragAcceptedByParent = false;
522-
await tester.pumpWidget(
523-
new Align(
524-
alignment: Alignment.topLeft,
525-
child: new Container(
526-
margin: const EdgeInsets.all(10.0),
527-
child: GestureDetector(
528-
onVerticalDragStart: (DragStartDetails d) { verticalDragAcceptedByParent = true; },
529-
child: SizedBox(
530-
width: 200.0,
531-
height: 100.0,
532-
child: AndroidView(viewType: 'webview', layoutDirection: TextDirection.ltr),
533-
),
534-
),
535-
),
536-
),
537-
);
538-
539-
final TestGesture gesture = await tester.startGesture(const Offset(50.0, 50.0));
540-
await gesture.moveBy(const Offset(0.0, 100.0));
541-
await gesture.up();
542-
543-
expect(verticalDragAcceptedByParent, true);
544-
expect(
545-
viewsController.motionEvents[currentViewId + 1],
546-
isNull,
547-
);
548-
});
549-
550-
testWidgets('Android view gesture recognizers', (WidgetTester tester) async {
551-
final int currentViewId = platformViewsRegistry.getNextPlatformViewId();
552-
final FakePlatformViewsController viewsController = new FakePlatformViewsController(TargetPlatform.android);
553-
viewsController.registerViewType('webview');
554-
bool verticalDragAcceptedByParent = false;
555-
await tester.pumpWidget(
556-
new Align(
557-
alignment: Alignment.topLeft,
558-
child: GestureDetector(
559-
onVerticalDragStart: (DragStartDetails d) { verticalDragAcceptedByParent = true; },
560-
child: SizedBox(
561-
width: 200.0,
562-
height: 100.0,
563-
child: AndroidView(
564-
viewType: 'webview',
565-
gestureRecognizers: <OneSequenceGestureRecognizer> [new VerticalDragGestureRecognizer()],
566-
layoutDirection: TextDirection.ltr,
567-
),
568-
),
569-
),
570-
),
571-
);
572-
573-
final TestGesture gesture = await tester.startGesture(const Offset(50.0, 50.0));
574-
await gesture.moveBy(const Offset(0.0, 100.0));
575-
await gesture.up();
576-
577-
expect(verticalDragAcceptedByParent, false);
578-
expect(
579-
viewsController.motionEvents[currentViewId + 1],
580-
orderedEquals(<FakeMotionEvent> [
581-
const FakeMotionEvent(AndroidViewController.kActionDown, <int> [0], <Offset> [Offset(50.0, 50.0)]),
582-
const FakeMotionEvent(AndroidViewController.kActionMove, <int> [0], <Offset> [Offset(50.0, 150.0)]),
583-
const FakeMotionEvent(AndroidViewController.kActionUp, <int> [0], <Offset> [Offset(50.0, 150.0)]),
584-
]),
585-
);
586-
});
587516
}

0 commit comments

Comments
 (0)