// Copyright 2016 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:io'; import 'package:path/path.dart' as path; import '../android/android_device.dart'; import '../application_package.dart'; import '../cache.dart'; import '../flx.dart'; import '../globals.dart'; import '../runner/flutter_command.dart'; class RefreshCommand extends FlutterCommand { @override final String name = 'refresh'; @override final String description = 'Build and deploy the Dart code in a Flutter app (Android only).'; RefreshCommand() { usesTargetOption(); argParser.addOption('activity', help: 'The Android activity that will be told to reload the Flutter code.' ); } @override bool get androidOnly => true; @override bool get requiresDevice => true; @override Future runInProject() async { Directory tempDir = await Directory.systemTemp.createTemp('flutter_tools'); try { String snapshotPath = path.join(tempDir.path, 'snapshot_blob.bin'); int result = await createSnapshot(mainPath: targetFile, snapshotPath: snapshotPath); if (result != 0) { printError('Failed to run the Flutter compiler. Exit code: $result'); return result; } Cache.releaseLockEarly(); AndroidDevice device = deviceForCommand; String activity = argResults['activity']; if (activity == null) { AndroidApk apk = applicationPackages.getPackageForPlatform(device.platform); if (apk != null) { activity = apk.launchActivity; } else { printError('Unable to find the activity to be refreshed.'); return 1; } } bool success = await device.refreshSnapshot(activity, snapshotPath); if (!success) { printError('Error refreshing snapshot on $device.'); return 1; } return 0; } finally { tempDir.deleteSync(recursive: true); } } }