Commit b6c3ae37 authored by Devon Carew's avatar Devon Carew Committed by GitHub

send supportsRestart flag when starting an app (#4513)

* send supportsRestart flag when starting an app

* remove unused imports

* review comments
parent 187ff002
......@@ -388,6 +388,9 @@ class AndroidDevice extends Device {
);
}
@override
bool get supportsRestart => true;
@override
Future<bool> restartApp(
ApplicationPackage package,
......
......@@ -284,7 +284,7 @@ class AppDomain extends Domain {
Future<Map<String, dynamic>> start(Map<String, dynamic> args) async {
String deviceId = _getStringArg(args, 'deviceId', required: true);
String projectDirectory = _getStringArg(args, 'projectDirectory', required: true);
bool startPaused = _getBoolArg(args, 'startPaused');
bool startPaused = _getBoolArg(args, 'startPaused') ?? false;
String route = _getStringArg(args, 'route');
String mode = _getStringArg(args, 'mode');
String target = _getStringArg(args, 'target');
......@@ -325,8 +325,9 @@ class AppDomain extends Domain {
AppInstance app = new AppInstance(_getNextAppId(), runner);
_apps.add(app);
_sendAppEvent(app, 'start', <String, dynamic>{
'deviceId': deviceId,
'directory': projectDirectory,
'deviceId': deviceId
'supportsRestart': device.supportsRestart
});
Completer<int> observatoryPortCompleter;
......@@ -349,7 +350,12 @@ class AppDomain extends Domain {
});
});
return <String, dynamic>{ 'appId': app.id };
return <String, dynamic>{
'appId': app.id,
'deviceId': deviceId,
'directory': projectDirectory,
'supportsRestart': device.supportsRestart
};
}
Future<bool> restart(Map<String, dynamic> args) async {
......@@ -585,17 +591,18 @@ class _AppRunLogger extends Logger {
AppDomain domain;
final AppInstance app;
int _nextProgressId = 0;
@override
void printError(String message, [StackTrace stackTrace]) {
if (stackTrace != null) {
domain?._sendAppEvent(app, 'log', <String, dynamic>{
_sendLogEvent(<String, dynamic>{
'log': message,
'stackTrace': stackTrace.toString(),
'error': true
});
} else {
domain?._sendAppEvent(app, 'log', <String, dynamic>{
_sendLogEvent(<String, dynamic>{
'log': message,
'error': true
});
......@@ -604,7 +611,7 @@ class _AppRunLogger extends Logger {
@override
void printStatus(String message, { bool emphasis: false, bool newline: true }) {
domain?._sendAppEvent(app, 'log', <String, dynamic>{ 'log': message });
_sendLogEvent(<String, dynamic>{ 'log': message });
}
@override
......@@ -612,13 +619,52 @@ class _AppRunLogger extends Logger {
@override
Status startProgress(String message) {
printStatus(message);
return new Status();
int id = _nextProgressId++;
_sendLogEvent(<String, dynamic>{
'log': message,
'progress': true,
'id': id.toString()
});
return new _AppLoggerStatus(this, id);
}
void close() {
domain = null;
}
void _sendLogEvent(Map<String, dynamic> event) {
if (domain == null)
printStatus('event sent after app closed: $event');
else
domain._sendAppEvent(app, 'log', event);
}
}
class _AppLoggerStatus implements Status {
_AppLoggerStatus(this.logger, this.id);
final _AppRunLogger logger;
final int id;
@override
void stop({ bool showElapsedTime: false }) {
_sendFinished();
}
@override
void cancel() {
_sendFinished();
}
void _sendFinished() {
logger._sendLogEvent(<String, dynamic>{
'progress': true,
'id': id.toString(),
'finished': true
});
}
}
class LogMessage {
......
......@@ -189,6 +189,8 @@ abstract class Device {
Map<String, dynamic> platformArgs
});
bool get supportsRestart => false;
/// Restart the given app; the application will already have been launched with
/// [startApp].
Future<bool> restartApp(
......@@ -196,7 +198,9 @@ abstract class Device {
LaunchResult result, {
String mainPath,
Observatory observatory
});
}) async {
throw 'unsupported';
}
/// Stop an app package on the current device.
Future<bool> stopApp(ApplicationPackage app);
......
......@@ -12,7 +12,6 @@ import '../base/process.dart';
import '../build_info.dart';
import '../device.dart';
import '../globals.dart';
import '../observatory.dart';
import 'mac.dart';
const String _ideviceinstallerInstructions =
......@@ -213,21 +212,6 @@ class IOSDevice extends Device {
return new LaunchResult.succeeded();
}
@override
Future<bool> restartApp(
ApplicationPackage package,
LaunchResult result, {
String mainPath,
Observatory observatory
}) async {
return observatory.isolateReload(observatory.firstIsolateId).then((Response response) {
return true;
}).catchError((dynamic error) {
printError('Error restarting app: $error');
return false;
});
}
@override
Future<bool> stopApp(ApplicationPackage app) async {
// Currently we don't have a way to stop an app running on iOS.
......
......@@ -16,7 +16,6 @@ import '../build_info.dart';
import '../device.dart';
import '../flx.dart' as flx;
import '../globals.dart';
import '../observatory.dart';
import '../protocol_discovery.dart';
import 'mac.dart';
......@@ -574,21 +573,6 @@ class IOSSimulator extends Device {
return (await flx.build(precompiledSnapshot: true)) == 0;
}
@override
Future<bool> restartApp(
ApplicationPackage package,
LaunchResult result, {
String mainPath,
Observatory observatory
}) {
return observatory.isolateReload(observatory.firstIsolateId).then((Response response) {
return true;
}).catchError((dynamic error) {
printError('Error restarting app: $error');
return false;
});
}
@override
Future<bool> stopApp(ApplicationPackage app) async {
// Currently we don't have a way to stop an app running on iOS.
......@@ -780,7 +764,7 @@ class _IOSSimulatorLogReader extends DeviceLogReader {
if (_lastLine != null) {
int repeat = int.parse(multi.group(1));
repeat = math.max(0, math.min(100, repeat));
for (int i = 0; i < repeat; i++)
for (int i = 1; i < repeat; i++)
_linesController.add(_lastLine);
}
} else {
......
......@@ -243,8 +243,10 @@ class RunAndStayResident {
// F1, help
_printHelp();
} else if (lower == 'r' || code == AnsiTerminal.KEY_F5) {
if (device.supportsRestart) {
// F5, restart
restart();
}
} else if (lower == 'q' || code == AnsiTerminal.KEY_F10) {
// F10, exit
_stopApp();
......@@ -287,7 +289,8 @@ class RunAndStayResident {
}
void _printHelp() {
printStatus('Type "h" or F1 for help, "r" or F5 to restart the app, and "q", F10, or ctrl-c to quit.');
String restartText = device.supportsRestart ? ', "r" or F5 to restart the app,' : '';
printStatus('Type "h" or F1 for help$restartText and "q", F10, or ctrl-c to quit.');
}
void _stopLogger() {
......
......@@ -5,5 +5,3 @@ path: lib/main.dart
flutter:
# The starting route for the app.
route:
# Additional args for the flutter run command.
args:
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment