Test creation of Android AlertDialogs with a platform view context (#53980)
diff --git a/dev/integration_tests/android_views/android/app/src/main/java/io/flutter/integration/androidviews/SimplePlatformView.java b/dev/integration_tests/android_views/android/app/src/main/java/io/flutter/integration/androidviews/SimplePlatformView.java
index 263ca75..4e391e1 100644
--- a/dev/integration_tests/android_views/android/app/src/main/java/io/flutter/integration/androidviews/SimplePlatformView.java
+++ b/dev/integration_tests/android_views/android/app/src/main/java/io/flutter/integration/androidviews/SimplePlatformView.java
@@ -4,35 +4,37 @@
package io.flutter.integration.platformviews;
+import android.app.AlertDialog;
import android.content.Context;
import android.view.MotionEvent;
import android.view.View;
+import android.widget.TextView;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.platform.PlatformView;
public class SimplePlatformView implements PlatformView, MethodChannel.MethodCallHandler {
- private final View mView;
- private final MethodChannel mMethodChannel;
- private final TouchPipe mTouchPipe;
+ private final View view;
+ private final MethodChannel methodChannel;
+ private final io.flutter.integration.platformviews.TouchPipe touchPipe;
SimplePlatformView(Context context, MethodChannel methodChannel) {
- mMethodChannel = methodChannel;
- mView = new View(context) {
+ this.methodChannel = methodChannel;
+ view = new View(context) {
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
};
- mView.setBackgroundColor(0xff0000ff);
- mMethodChannel.setMethodCallHandler(this);
- mTouchPipe = new TouchPipe(mMethodChannel, mView);
+ view.setBackgroundColor(0xff0000ff);
+ this.methodChannel.setMethodCallHandler(this);
+ touchPipe = new io.flutter.integration.platformviews.TouchPipe(this.methodChannel, view);
}
@Override
public View getView() {
- return mView;
+ return view;
}
@Override
@@ -43,14 +45,28 @@
public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {
switch(methodCall.method) {
case "pipeTouchEvents":
- mTouchPipe.enable();
+ touchPipe.enable();
result.success(null);
return;
case "stopTouchEvents":
- mTouchPipe.disable();
+ touchPipe.disable();
result.success(null);
return;
+ case "showAlertDialog":
+ showAlertDialog(result);
+ return;
}
result.notImplemented();
}
+
+ private void showAlertDialog(MethodChannel.Result result) {
+ Context context = view.getContext();
+ AlertDialog.Builder builder = new AlertDialog.Builder(context);
+ TextView textView = new TextView(context);
+ textView.setText("Alert!");
+ builder.setView(textView);
+ final AlertDialog alertDialog = builder.show();
+ result.success(null);
+ }
+
}
diff --git a/dev/integration_tests/android_views/lib/main.dart b/dev/integration_tests/android_views/lib/main.dart
index 5ff6505..7bfc493 100644
--- a/dev/integration_tests/android_views/lib/main.dart
+++ b/dev/integration_tests/android_views/lib/main.dart
@@ -4,11 +4,14 @@
import 'package:flutter/material.dart';
import 'package:flutter_driver/driver_extension.dart';
+
import 'motion_events_page.dart';
import 'page.dart';
+import 'wm_integrations.dart';
final List<PageWidget> _allPages = <PageWidget>[
const MotionEventsPage(),
+ const WindowManagerIntegrationsPage(),
];
void main() {
@@ -20,17 +23,20 @@
@override
Widget build(BuildContext context) {
return Scaffold(
- body: ListView.builder(
- itemCount: _allPages.length,
- itemBuilder: (_, int index) => ListTile(
- title: Text(_allPages[index].title),
- key: _allPages[index].tileKey,
- onTap: () => _pushPage(context, _allPages[index]),
- ),
+ body: ListView(
+ children: _allPages.map((PageWidget p) => _buildPageListTile(context, p)).toList(),
),
);
}
+ Widget _buildPageListTile(BuildContext context, PageWidget page) {
+ return ListTile(
+ title: Text(page.title),
+ key: page.tileKey,
+ onTap: () { _pushPage(context, page); },
+ );
+ }
+
void _pushPage(BuildContext context, PageWidget page) {
Navigator.of(context).push(MaterialPageRoute<void>(
builder: (_) => Scaffold(
diff --git a/dev/integration_tests/android_views/lib/wm_integrations.dart b/dev/integration_tests/android_views/lib/wm_integrations.dart
new file mode 100644
index 0000000..3faea13
--- /dev/null
+++ b/dev/integration_tests/android_views/lib/wm_integrations.dart
@@ -0,0 +1,104 @@
+// Copyright 2014 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'dart:ui';
+
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter/widgets.dart';
+
+import 'page.dart';
+
+class WindowManagerIntegrationsPage extends PageWidget {
+ const WindowManagerIntegrationsPage()
+ : super('Window Manager Integrations Tests', const ValueKey<String>('WmIntegrationsListTile'));
+
+ @override
+ Widget build(BuildContext context) => WindowManagerBody();
+
+}
+
+class WindowManagerBody extends StatefulWidget {
+ @override
+ State<WindowManagerBody> createState() => WindowManagerBodyState();
+}
+
+enum _LastTestStatus {
+ pending,
+ success,
+ error
+}
+
+class WindowManagerBodyState extends State<WindowManagerBody> {
+
+ MethodChannel viewChannel;
+ _LastTestStatus lastTestStatus = _LastTestStatus.pending;
+ String lastError;
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ title: const Text('Window Manager Integrations'),
+ ),
+ body: Column(
+ children: <Widget>[
+ SizedBox(
+ height: 300,
+ child: AndroidView(
+ viewType: 'simple_view',
+ onPlatformViewCreated: onPlatformViewCreated,
+ ),
+ ),
+ if (lastTestStatus != _LastTestStatus.pending) _statusWidget(),
+ if (viewChannel != null) RaisedButton(
+ key: const ValueKey<String>('ShowAlertDialog'),
+ child: const Text('SHOW ALERT DIALOG'),
+ onPressed: onShowAlertDialogPressed,
+ ),
+ ],
+ ),
+ );
+ }
+
+ Widget _statusWidget() {
+ assert(lastTestStatus != _LastTestStatus.pending);
+ final String message = lastTestStatus == _LastTestStatus.success ? 'Success' : lastError;
+ return Container(
+ color: lastTestStatus == _LastTestStatus.success ? Colors.green : Colors.red,
+ child: Text(
+ message,
+ key: const ValueKey<String>('Status'),
+ style: TextStyle(
+ color: lastTestStatus == _LastTestStatus.error ? Colors.yellow : null,
+ ),
+ ),
+ );
+ }
+
+ Future<void> onShowAlertDialogPressed() async {
+ if (lastTestStatus != _LastTestStatus.pending) {
+ setState(() {
+ lastTestStatus = _LastTestStatus.pending;
+ });
+ }
+ try {
+ await viewChannel.invokeMethod<void>('showAlertDialog');
+ setState(() {
+ lastTestStatus = _LastTestStatus.success;
+ });
+ } catch(e) {
+ setState(() {
+ lastTestStatus = _LastTestStatus.error;
+ lastError = '$e';
+ });
+ }
+ }
+
+ void onPlatformViewCreated(int id) {
+ setState(() {
+ viewChannel = MethodChannel('simple_view/$id');
+ });
+ }
+}
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 e12b07f..d4aea33 100644
--- a/dev/integration_tests/android_views/test_driver/main_test.dart
+++ b/dev/integration_tests/android_views/test_driver/main_test.dart
@@ -17,16 +17,29 @@
driver.close();
});
- group('MotionEvents tests ', () {
- test('recomposition', () async {
- final SerializableFinder motionEventsListTile =
- find.byValueKey('MotionEventsListTile');
- await driver.tap(motionEventsListTile);
- await driver.waitFor(find.byValueKey('PlatformView'));
- final String errorMessage = await driver.requestData('run test');
- expect(errorMessage, '');
- },
- // TODO(amirh): enable this test https://github.com/flutter/flutter/issues/54022
- skip: true);
- });
+ test('MotionEvent recomposition', () async {
+ final SerializableFinder motionEventsListTile =
+ find.byValueKey('MotionEventsListTile');
+ await driver.tap(motionEventsListTile);
+ await driver.waitFor(find.byValueKey('PlatformView'));
+ final String errorMessage = await driver.requestData('run test');
+ expect(errorMessage, '');
+ },
+ // TODO(amirh): enable this test https://github.com/flutter/flutter/issues/54022
+ skip: true);
+
+ test('AlertDialog from platform view context', () async {
+ final SerializableFinder wmListTile =
+ find.byValueKey('WmIntegrationsListTile');
+ await driver.tap(wmListTile);
+
+ final SerializableFinder showAlertDialog = find.byValueKey('ShowAlertDialog');
+ await driver.waitFor(showAlertDialog);
+ await driver.tap(showAlertDialog);
+ final String status = await driver.getText(find.byValueKey('Status'));
+ expect(status, 'Success');
+ },
+ // TODO(amirh): enable this test when https://github.com/flutter/flutter/issues/34248 is fixed.
+ skip: true,
+ );
}