From 93cfcc216640bb4a83cc6cd04a4b49ff29e4dfc2 Mon Sep 17 00:00:00 2001 From: Emmanuel Garcia Date: Tue, 14 Jul 2020 15:56:02 -0700 Subject: [PATCH] Account for MotionEvent instance mutations (#61417) --- .../androidviews/MainActivity.java | 1 + .../android_views/lib/wm_integrations.dart | 124 ++---------------- .../android_views/test_driver/main_test.dart | 5 +- 3 files changed, 15 insertions(+), 115 deletions(-) diff --git a/dev/integration_tests/android_views/android/app/src/main/java/io/flutter/integration/androidviews/MainActivity.java b/dev/integration_tests/android_views/android/app/src/main/java/io/flutter/integration/androidviews/MainActivity.java index 349b309552..d590db1c3d 100644 --- a/dev/integration_tests/android_views/android/app/src/main/java/io/flutter/integration/androidviews/MainActivity.java +++ b/dev/integration_tests/android_views/android/app/src/main/java/io/flutter/integration/androidviews/MainActivity.java @@ -52,6 +52,7 @@ public class MainActivity extends FlutterActivity implements MethodChannel.Metho .registerViewFactory("simple_view", new SimpleViewFactory(executor)); mMethodChannel = new MethodChannel(executor, "android_views_integration"); mMethodChannel.setMethodCallHandler(this); + GeneratedPluginRegistrant.registerWith(flutterEngine); } @Override diff --git a/dev/integration_tests/android_views/lib/wm_integrations.dart b/dev/integration_tests/android_views/lib/wm_integrations.dart index c49ea510f8..ac5aa851f1 100644 --- a/dev/integration_tests/android_views/lib/wm_integrations.dart +++ b/dev/integration_tests/android_views/lib/wm_integrations.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:io'; import 'dart:ui'; import 'package:flutter/material.dart'; @@ -16,7 +17,6 @@ class WindowManagerIntegrationsPage extends PageWidget { @override Widget build(BuildContext context) => WindowManagerBody(); - } class WindowManagerBody extends StatefulWidget { @@ -133,15 +133,17 @@ class WindowManagerBodyState extends State { } } - Future onTapWindowPressed() async { await Future.delayed(const Duration(seconds: 1)); - for (final AndroidMotionEvent event in _tapSequence) { - await SystemChannels.platform_views.invokeMethod( - 'touch', - _motionEventasList(event, id), - ); - } + + // Dispatch a tap event on the child view inside the platform view. + // + // Android mutates `MotionEvent` instances, so in this case *do not* dispatch + // new instances as it won't cover the `MotionEventTracker` class in the embedding + // which tracks events. + // + // See the issue this prevents: https://github.com/flutter/flutter/issues/61169 + await Process.run('input', const ['tap', '250', '550']); } void onPlatformViewCreated(int id) { @@ -151,110 +153,4 @@ class WindowManagerBodyState extends State { }); } - - static List _pointerCoordsAsList(AndroidPointerCoords coords) { - return [ - coords.orientation, - coords.pressure, - coords.size, - coords.toolMajor, - coords.toolMinor, - coords.touchMajor, - coords.touchMinor, - coords.x, - coords.y, - ]; - } - - static List _motionEventasList(AndroidMotionEvent event, int viewId) { - return [ - viewId, - event.downTime, - event.eventTime, - event.action, - event.pointerCount, - event.pointerProperties.map>((AndroidPointerProperties p) => [p.id, p.toolType]).toList(), - event.pointerCoords.map>((AndroidPointerCoords p) => _pointerCoordsAsList(p)).toList(), - event.metaState, - event.buttonState, - event.xPrecision, - event.yPrecision, - event.deviceId, - event.edgeFlags, - event.source, - event.flags, - event.motionEventId, - ]; - } - - static final List _tapSequence = [ - AndroidMotionEvent( - downTime: 723657071, - pointerCount: 1, - pointerCoords: [ - const AndroidPointerCoords( - orientation: 0.0, - touchMajor: 5.0, - size: 0.019607843831181526, - x: 180.0, - y: 200.0, - touchMinor: 5.0, - pressure: 1.0, - toolMajor: 5.0, - toolMinor: 5.0, - ), - ], - yPrecision: 1.0, - buttonState: 0, - flags: 0, - source: 4098, - deviceId: 4, - metaState: 0, - pointerProperties: [ - const AndroidPointerProperties( - id: 0, - toolType: 1, - ), - ], - edgeFlags: 0, - eventTime: 723657071, - action: 0, - xPrecision: 1.0, - motionEventId: 1, - ), - AndroidMotionEvent( - downTime: 723657071, - eventTime: 723657137, - action: 1, - pointerCount: 1, - pointerProperties: [ - const AndroidPointerProperties( - id: 0, - toolType: 1, - ), - ], - pointerCoords: [ - const AndroidPointerCoords( - orientation: 0.0, - touchMajor: 5.0, - size: 0.019607843831181526, - x: 180.0, - y: 200.0, - touchMinor: 5.0, - pressure: 1.0, - toolMajor: 5.0, - toolMinor: 5.0, - ) - ], - metaState: 0, - buttonState: 0, - xPrecision: 1.0, - yPrecision: 1.0, - deviceId: 4, - edgeFlags: 0, - source: 4098, - flags: 0, - motionEventId: 2, - ), - ]; } diff --git a/dev/integration_tests/android_views/test_driver/main_test.dart b/dev/integration_tests/android_views/test_driver/main_test.dart index f0ddc27255..ffa50ede9b 100644 --- a/dev/integration_tests/android_views/test_driver/main_test.dart +++ b/dev/integration_tests/android_views/test_driver/main_test.dart @@ -58,7 +58,10 @@ Future main() async { await driver.tap(addWindow); final SerializableFinder tapWindow = find.byValueKey('TapWindow'); await driver.tap(tapWindow); - final String windowClickCount = await driver.getText(find.byValueKey('WindowClickCount')); + final String windowClickCount = await driver.getText( + find.byValueKey('WindowClickCount'), + timeout: const Duration(seconds: 5), + ); expect(windowClickCount, 'Click count: 1'); }); });