diff --git a/dev/devicelab/lib/tasks/keyboard_hot_restart_test.dart b/dev/devicelab/lib/tasks/keyboard_hot_restart_test.dart index 7afae3090a4..d9c40266568 100644 --- a/dev/devicelab/lib/tasks/keyboard_hot_restart_test.dart +++ b/dev/devicelab/lib/tasks/keyboard_hot_restart_test.dart @@ -66,14 +66,22 @@ TaskFunction createKeyboardHotRestartTest({ final String newContents = oldContents.replaceFirst(forceKeyboardOff, forceKeyboardOn); mainFile.writeAsStringSync(newContents); - section('Launch app and wait for keyboard to be visible'); + section('Launch app'); - TestState state = TestState.waitUntilKeyboardOpen; + bool success = false; + TestState state = TestState.waitUntilDartVmAvailable; final int exitCode = await runApp( options: ['-d', deviceIdOverride!], onLine: (String line, Process process) { - if (state == TestState.waitUntilKeyboardOpen) { + if (state == TestState.waitUntilDartVmAvailable) { + if (!line.contains('A Dart VM Service') || !line.contains('is available at')) { + return; + } + + section('Wait until keyboard is visible'); + state = TestState.waitUntilKeyboardOpen; + } else if (state == TestState.waitUntilKeyboardOpen) { if (!line.contains('flutter: Keyboard is open')) { return; } @@ -84,10 +92,15 @@ TaskFunction createKeyboardHotRestartTest({ forceKeyboardOff, ); mainFile.writeAsStringSync(newContents); - - section('Hot restart the app'); process.stdin.writeln('R'); + section('Wait until the app hot restarts'); + state = TestState.waitUntilHotRestart; + } else if (state == TestState.waitUntilHotRestart) { + if (!line.contains('Restarted application in ')) { + return; + } + section('Wait until the keyboard is no longer visible'); state = TestState.waitUntilKeyboardClosed; } else if (state == TestState.waitUntilKeyboardClosed) { @@ -97,6 +110,7 @@ TaskFunction createKeyboardHotRestartTest({ // Quit the app. This makes the 'flutter run' process exit. process.stdin.writeln('q'); + success = true; } }, ); @@ -104,6 +118,10 @@ TaskFunction createKeyboardHotRestartTest({ if (exitCode != 0) { return TaskResult.failure('flutter run exited with non-zero exit code: $exitCode'); } + + if (!success) { + return TaskResult.failure('Test did not complete successfully'); + } } finally { mainFile.writeAsStringSync(oldContents); } @@ -113,7 +131,12 @@ TaskFunction createKeyboardHotRestartTest({ }; } -enum TestState { waitUntilKeyboardOpen, waitUntilKeyboardClosed } +enum TestState { + waitUntilDartVmAvailable, + waitUntilKeyboardOpen, + waitUntilHotRestart, + waitUntilKeyboardClosed, +} Future createAppProject() async { await exec(path.join(flutterDirectory.path, 'bin', 'flutter'), [ diff --git a/dev/integration_tests/keyboard_hot_restart/lib/main.dart b/dev/integration_tests/keyboard_hot_restart/lib/main.dart index 1c24d67a478..8a4dad7b13d 100644 --- a/dev/integration_tests/keyboard_hot_restart/lib/main.dart +++ b/dev/integration_tests/keyboard_hot_restart/lib/main.dart @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; + import 'package:flutter/material.dart'; // If true, the app autofocuses a text field, making the software keyboard visible. @@ -11,8 +13,27 @@ import 'package:flutter/material.dart'; // //dev/devicelab/lib/tasks/keyboard_hot_restart_test.dart const bool forceKeyboard = true; +bool? keyboardVisible; + void main() { runApp(const MyApp()); + unawaited(printKeyboardState()); +} + +Future printKeyboardState() async { + while (true) { + await Future.delayed(const Duration(seconds: 1)); + if (keyboardVisible == null) { + continue; + } + + // Print whether the keyboard is visible or not. + // If you change this line, update the test as well. + // See: + // //dev/devicelab/lib/tasks/keyboard_hot_restart_test.dart + // ignore: avoid_print + print('Keyboard is ${keyboardVisible! ? 'open' : 'closed'}'); + } } class MyApp extends StatelessWidget { @@ -31,12 +52,7 @@ class MyHomePage extends StatelessWidget { Widget build(BuildContext context) { final EdgeInsets insets = MediaQuery.of(context).viewInsets; - // Print whether the keyboard is visible or not. - // If you change this line, update the test as well. - // See: - // //dev/devicelab/lib/tasks/keyboard_hot_restart_test.dart - // ignore: avoid_print - print('Keyboard is ${insets.bottom > 0 ? 'open' : 'closed'}'); + keyboardVisible = insets.bottom > 0; return const Scaffold(body: Center(child: TextField(autofocus: forceKeyboard))); }