| // Copyright 2015 The Chromium 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:async'; |
| import 'dart:typed_data'; |
| |
| import 'package:flutter/services.dart'; |
| |
| import 'widget_tester.dart'; |
| |
| const String _kTextInputClientChannel = 'flutter/textinputclient'; |
| |
| /// A testing stub for the system's onscreen keyboard. |
| /// |
| /// Typical app tests will not need to use this class directly. |
| /// |
| /// See also: |
| /// |
| /// * [WidgetTester.enterText], which uses this class to simulate keyboard input. |
| /// * [WidgetTester.showKeyboard], which uses this class to simulate showing the |
| /// popup keyboard and initializing its text. |
| class TestTextInput { |
| /// Installs this object as a mock handler for [SystemChannels.textInput]. |
| void register() { |
| SystemChannels.textInput.setMockMethodCallHandler(_handleTextInputCall); |
| } |
| |
| int _client = 0; |
| Map<String, dynamic> editingState; |
| |
| Future<dynamic> _handleTextInputCall(MethodCall methodCall) async { |
| switch (methodCall.method) { |
| case 'TextInput.setClient': |
| _client = methodCall.arguments[0]; |
| break; |
| case 'TextInput.clearClient': |
| _client = 0; |
| _isVisible = false; |
| break; |
| case 'TextInput.setEditingState': |
| editingState = methodCall.arguments; |
| break; |
| case 'TextInput.show': |
| _isVisible = true; |
| break; |
| case 'TextInput.hide': |
| _isVisible = false; |
| break; |
| } |
| } |
| |
| /// Whether the onscreen keyboard is visible to the user. |
| bool get isVisible => _isVisible; |
| bool _isVisible = false; |
| |
| /// Simulates the user changing the [TextEditingValue] to the given value. |
| void updateEditingValue(TextEditingValue value) { |
| expect(_client, isNonZero); |
| BinaryMessages.handlePlatformMessage( |
| SystemChannels.textInput.name, |
| SystemChannels.textInput.codec.encodeMethodCall( |
| new MethodCall( |
| 'TextInputClient.updateEditingState', |
| <dynamic>[_client, value.toJSON()], |
| ), |
| ), |
| (ByteData data) { /* response from framework is discarded */ }, |
| ); |
| } |
| |
| /// Simulates the user typing the given text. |
| void enterText(String text) { |
| updateEditingValue(new TextEditingValue( |
| text: text, |
| composing: new TextRange(start: 0, end: text.length), |
| )); |
| } |
| |
| /// Simulates the user hiding the onscreen keyboard. |
| void hide() { |
| _isVisible = false; |
| } |
| } |