blob: 252208ecdb287f7ca09157c60b4d7efe91331a9e [file] [log] [blame]
// 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 'package:async/async.dart';
import '../base/io.dart';
import '../convert.dart';
/// Default factory that creates a real Android console connection.
///
/// The default implementation will create real connections to a device.
/// Override this in tests with an implementation that returns mock responses.
Future<Socket> kAndroidConsoleSocketFactory(String host, int port) => Socket.connect(host, port);
/// Currently active implementation of the AndroidConsoleFactory.
///
/// The default implementation will create real connections to a device.
/// Override this in tests with an implementation that returns mock responses.
typedef AndroidConsoleSocketFactory = Future<Socket> Function(String host, int port);
/// Creates a console connection to an Android emulator that can be used to run
/// commands such as "avd name" which are not available to ADB.
///
/// See documentation at
/// https://developer.android.com/studio/run/emulator-console
class AndroidConsole {
AndroidConsole(this._socket);
Socket? _socket;
StreamQueue<String>? _queue;
Future<void> connect() async {
assert(_socket != null);
assert(_queue == null);
_queue = StreamQueue<String>(_socket!.asyncMap(ascii.decode));
// Discard any initial connection text.
await _readResponse();
}
Future<String?> getAvdName() async {
if (_queue == null) {
return null;
}
_write('avd name\n');
return _readResponse();
}
void destroy() {
_socket?.destroy();
_socket = null;
_queue = null;
}
Future<String?> _readResponse() async {
if (_queue == null) {
return null;
}
final StringBuffer output = StringBuffer();
while (true) {
if (!await _queue!.hasNext) {
destroy();
return null;
}
final String text = await _queue!.next;
final String trimmedText = text.trim();
if (trimmedText == 'OK') {
break;
}
if (trimmedText.endsWith('\nOK')) {
output.write(trimmedText.substring(0, trimmedText.length - 3));
break;
}
output.write(text);
}
return output.toString().trim();
}
void _write(String text) {
_socket?.add(ascii.encode(text));
}
}