From adf45d1e4098c5453c3410798ae32cc5309bac59 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Tue, 9 Jul 2019 13:10:26 -0700 Subject: [PATCH 01/41] Refactor signal and command line handler from resident runner (#35406) --- .../lib/src/android/android_device.dart | 2 +- .../lib/src/commands/attach.dart | 16 +- .../lib/src/commands/daemon.dart | 4 +- .../flutter_tools/lib/src/commands/run.dart | 14 +- packages/flutter_tools/lib/src/device.dart | 2 +- .../lib/src/resident_runner.dart | 411 ++++++++++-------- .../lib/src/resident_web_runner.dart | 5 +- packages/flutter_tools/lib/src/run_cold.dart | 17 +- packages/flutter_tools/lib/src/run_hot.dart | 36 +- .../test/commands/attach_test.dart | 28 +- .../test/resident_runner_test.dart | 173 ++++---- .../test/terminal_handler_test.dart | 332 ++++++++++++++ 12 files changed, 702 insertions(+), 338 deletions(-) create mode 100644 packages/flutter_tools/test/terminal_handler_test.dart diff --git a/packages/flutter_tools/lib/src/android/android_device.dart b/packages/flutter_tools/lib/src/android/android_device.dart index ff3661adb4d..ef6eb69d69f 100644 --- a/packages/flutter_tools/lib/src/android/android_device.dart +++ b/packages/flutter_tools/lib/src/android/android_device.dart @@ -437,8 +437,8 @@ class AndroidDevice extends Device { DebuggingOptions debuggingOptions, Map platformArgs, bool prebuiltApplication = false, - bool usesTerminalUi = true, bool ipv6 = false, + bool usesTerminalUi = true, }) async { if (!await _checkForSupportedAdbVersion() || !await _checkForSupportedAndroidVersion()) return LaunchResult.failed(); diff --git a/packages/flutter_tools/lib/src/commands/attach.dart b/packages/flutter_tools/lib/src/commands/attach.dart index e06d1c938c0..b7a477d695c 100644 --- a/packages/flutter_tools/lib/src/commands/attach.dart +++ b/packages/flutter_tools/lib/src/commands/attach.dart @@ -277,7 +277,7 @@ class AttachCommand extends FlutterCommand { target: targetFile, debuggingOptions: debuggingOptions, packagesFilePath: globalResults['packages'], - usesTerminalUI: daemon == null, + usesTerminalUi: daemon == null, projectRootPath: argResults['project-root'], dillOutputPath: argResults['output-dill'], ipv6: usesIpv6, @@ -312,7 +312,15 @@ class AttachCommand extends FlutterCommand { result = await app.runner.waitForAppToFinish(); assert(result != null); } else { - result = await runner.attach(); + final Completer onAppStart = Completer.sync(); + unawaited(onAppStart.future.whenComplete(() { + TerminalHandler(runner) + ..setupTerminal() + ..registerSignalHandlers(); + })); + result = await runner.attach( + appStartedCompleter: onAppStart, + ); assert(result != null); } if (result != 0) { @@ -350,7 +358,7 @@ class HotRunnerFactory { List devices, { String target, DebuggingOptions debuggingOptions, - bool usesTerminalUI = true, + bool usesTerminalUi = true, bool benchmarkMode = false, File applicationBinary, bool hostIsIde = false, @@ -364,7 +372,7 @@ class HotRunnerFactory { devices, target: target, debuggingOptions: debuggingOptions, - usesTerminalUI: usesTerminalUI, + usesTerminalUi: usesTerminalUi, benchmarkMode: benchmarkMode, applicationBinary: applicationBinary, hostIsIde: hostIsIde, diff --git a/packages/flutter_tools/lib/src/commands/daemon.dart b/packages/flutter_tools/lib/src/commands/daemon.dart index dff4b34e731..a441ecf8786 100644 --- a/packages/flutter_tools/lib/src/commands/daemon.dart +++ b/packages/flutter_tools/lib/src/commands/daemon.dart @@ -419,7 +419,7 @@ class AppDomain extends Domain { [flutterDevice], target: target, debuggingOptions: options, - usesTerminalUI: false, + usesTerminalUi: false, applicationBinary: applicationBinary, projectRootPath: projectRootPath, packagesFilePath: packagesFilePath, @@ -432,8 +432,8 @@ class AppDomain extends Domain { [flutterDevice], target: target, debuggingOptions: options, - usesTerminalUI: false, applicationBinary: applicationBinary, + usesTerminalUi: false, ipv6: ipv6, ); } diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart index aeabe1f617d..35251f2e805 100644 --- a/packages/flutter_tools/lib/src/commands/run.dart +++ b/packages/flutter_tools/lib/src/commands/run.dart @@ -450,8 +450,8 @@ class RunCommand extends RunCommandBase { applicationBinary: applicationBinaryPath == null ? null : fs.file(applicationBinaryPath), - stayResident: stayResident, ipv6: ipv6, + stayResident: stayResident, ); } @@ -463,7 +463,14 @@ class RunCommand extends RunCommandBase { final Completer appStartedTimeRecorder = Completer.sync(); // This callback can't throw. unawaited(appStartedTimeRecorder.future.then( - (_) { appStartedTime = systemClock.now(); } + (_) { + appStartedTime = systemClock.now(); + if (stayResident) { + TerminalHandler(runner) + ..setupTerminal() + ..registerSignalHandlers(); + } + } )); final int result = await runner.run( @@ -471,8 +478,9 @@ class RunCommand extends RunCommandBase { route: route, shouldBuild: !runningWithPrebuiltApplication && argResults['build'], ); - if (result != 0) + if (result != 0) { throwToolExit(null, exitCode: result); + } return FlutterCommandResult( ExitStatus.success, timingLabelParts: [ diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart index 1bda14808bb..5865744ae7f 100644 --- a/packages/flutter_tools/lib/src/device.dart +++ b/packages/flutter_tools/lib/src/device.dart @@ -406,8 +406,8 @@ abstract class Device { DebuggingOptions debuggingOptions, Map platformArgs, bool prebuiltApplication = false, - bool usesTerminalUi = true, bool ipv6 = false, + bool usesTerminalUi = true, }); /// Whether this device implements support for hot reload. diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart index 2cb910947d3..94ab8821b48 100644 --- a/packages/flutter_tools/lib/src/resident_runner.dart +++ b/packages/flutter_tools/lib/src/resident_runner.dart @@ -115,7 +115,7 @@ class FlutterDevice { /// expressions requested during debugging of the application. /// This ensures that the reload process follows the normal orchestration of /// the Flutter Tools and not just the VM internal service. - Future _connect({ + Future connect({ ReloadSources reloadSources, Restart restart, CompileExpression compileExpression, @@ -375,7 +375,7 @@ class FlutterDevice { platformArgs: platformArgs, route: route, prebuiltApplication: prebuiltMode, - usesTerminalUi: hotRunner.usesTerminalUI, + usesTerminalUi: hotRunner.usesTerminalUi, ipv6: hotRunner.ipv6, ); @@ -437,7 +437,7 @@ class FlutterDevice { platformArgs: platformArgs, route: route, prebuiltApplication: prebuiltMode, - usesTerminalUi: coldRunner.usesTerminalUI, + usesTerminalUi: coldRunner.usesTerminalUi, ipv6: coldRunner.ipv6, ); @@ -509,11 +509,12 @@ abstract class ResidentRunner { this.flutterDevices, { this.target, this.debuggingOptions, - this.usesTerminalUI = true, String projectRootPath, String packagesFilePath, - this.stayResident, this.ipv6, + this.usesTerminalUi = true, + this.stayResident = true, + this.hotMode = true, }) { _mainPath = findMainDartFile(target); _projectRootPath = projectRootPath ?? fs.currentDirectory.path; @@ -525,11 +526,12 @@ abstract class ResidentRunner { final List flutterDevices; final String target; final DebuggingOptions debuggingOptions; - final bool usesTerminalUI; + final bool usesTerminalUi; final bool stayResident; final bool ipv6; final Completer _finished = Completer(); bool _exited = false; + bool hotMode ; String _packagesFilePath; String get packagesFilePath => _packagesFilePath; String _projectRootPath; @@ -601,68 +603,68 @@ abstract class ResidentRunner { await Future.wait(futures); } - Future _debugDumpApp() async { + Future debugDumpApp() async { await refreshViews(); for (FlutterDevice device in flutterDevices) await device.debugDumpApp(); } - Future _debugDumpRenderTree() async { + Future debugDumpRenderTree() async { await refreshViews(); for (FlutterDevice device in flutterDevices) await device.debugDumpRenderTree(); } - Future _debugDumpLayerTree() async { + Future debugDumpLayerTree() async { await refreshViews(); for (FlutterDevice device in flutterDevices) await device.debugDumpLayerTree(); } - Future _debugDumpSemanticsTreeInTraversalOrder() async { + Future debugDumpSemanticsTreeInTraversalOrder() async { await refreshViews(); for (FlutterDevice device in flutterDevices) await device.debugDumpSemanticsTreeInTraversalOrder(); } - Future _debugDumpSemanticsTreeInInverseHitTestOrder() async { + Future debugDumpSemanticsTreeInInverseHitTestOrder() async { await refreshViews(); for (FlutterDevice device in flutterDevices) await device.debugDumpSemanticsTreeInInverseHitTestOrder(); } - Future _debugToggleDebugPaintSizeEnabled() async { + Future debugToggleDebugPaintSizeEnabled() async { await refreshViews(); for (FlutterDevice device in flutterDevices) await device.toggleDebugPaintSizeEnabled(); } - Future _debugToggleDebugCheckElevationsEnabled() async { + Future debugToggleDebugCheckElevationsEnabled() async { await refreshViews(); for (FlutterDevice device in flutterDevices) await device.toggleDebugCheckElevationsEnabled(); } - Future _debugTogglePerformanceOverlayOverride() async { + Future debugTogglePerformanceOverlayOverride() async { await refreshViews(); for (FlutterDevice device in flutterDevices) await device.debugTogglePerformanceOverlayOverride(); } - Future _debugToggleWidgetInspector() async { + Future debugToggleWidgetInspector() async { await refreshViews(); for (FlutterDevice device in flutterDevices) await device.toggleWidgetInspector(); } - Future _debugToggleProfileWidgetBuilds() async { + Future debugToggleProfileWidgetBuilds() async { await refreshViews(); for (FlutterDevice device in flutterDevices) { await device.toggleProfileWidgetBuilds(); } } - Future _screenshot(FlutterDevice device) async { + Future screenshot(FlutterDevice device) async { final Status status = logger.startProgress('Taking screenshot for ${device.device.name}...', timeout: timeoutConfiguration.fastOperation); final File outputFile = getUniqueFile(fs.currentDirectory, 'flutter', 'png'); try { @@ -700,7 +702,7 @@ abstract class ResidentRunner { } } - Future _debugTogglePlatform() async { + Future debugTogglePlatform() async { await refreshViews(); final String from = await flutterDevices[0].views[0].uiIsolate.flutterPlatformOverride(); String to; @@ -709,39 +711,6 @@ abstract class ResidentRunner { printStatus('Switched operating system to $to'); } - void registerSignalHandlers() { - assert(stayResident); - io.ProcessSignal.SIGINT.watch().listen(_cleanUpAndExit); - io.ProcessSignal.SIGTERM.watch().listen(_cleanUpAndExit); - if (!supportsServiceProtocol || !supportsRestart) - return; - io.ProcessSignal.SIGUSR1.watch().listen(_handleSignal); - io.ProcessSignal.SIGUSR2.watch().listen(_handleSignal); - } - - Future _cleanUpAndExit(io.ProcessSignal signal) async { - _resetTerminal(); - await cleanupAfterSignal(); - io.exit(0); - } - - bool _processingUserRequest = false; - Future _handleSignal(io.ProcessSignal signal) async { - if (_processingUserRequest) { - printTrace('Ignoring signal: "$signal" because we are busy.'); - return; - } - _processingUserRequest = true; - - final bool fullRestart = signal == io.ProcessSignal.SIGUSR2; - - try { - await restart(fullRestart: fullRestart); - } finally { - _processingUserRequest = false; - } - } - Future stopEchoingDeviceLog() async { await Future.wait( flutterDevices.map>((FlutterDevice device) => device.stopEchoingDeviceLog()) @@ -764,7 +733,7 @@ abstract class ResidentRunner { bool viewFound = false; for (FlutterDevice device in flutterDevices) { - await device._connect( + await device.connect( reloadSources: reloadSources, restart: restart, compileExpression: compileExpression, @@ -805,125 +774,6 @@ abstract class ResidentRunner { return Future.error(error, stack); } - /// Returns [true] if the input has been handled by this function. - Future _commonTerminalInputHandler(String character) async { - - printStatus(''); // the key the user tapped might be on this line - switch(character) { - case 'a': - if (supportsServiceProtocol) { - await _debugToggleProfileWidgetBuilds(); - return true; - } - return false; - case 'd': - case 'D': - await detach(); - return true; - case 'h': - case 'H': - case '?': - // help - printHelp(details: true); - return true; - case 'i': - case 'I': - if (supportsServiceProtocol) { - await _debugToggleWidgetInspector(); - return true; - } - return false; - case 'L': - if (supportsServiceProtocol) { - await _debugDumpLayerTree(); - return true; - } - return false; - case 'o': - case 'O': - if (supportsServiceProtocol && isRunningDebug) { - await _debugTogglePlatform(); - return true; - } - return false; - case 'p': - if (supportsServiceProtocol && isRunningDebug) { - await _debugToggleDebugPaintSizeEnabled(); - return true; - } - return false; - case 'P': - if (supportsServiceProtocol) { - await _debugTogglePerformanceOverlayOverride(); - return true; - } - return false; - case 'q': - case 'Q': - // exit - await exit(); - return true; - case 's': - for (FlutterDevice device in flutterDevices) { - if (device.device.supportsScreenshot) - await _screenshot(device); - } - return true; - case 'S': - if (supportsServiceProtocol) { - await _debugDumpSemanticsTreeInTraversalOrder(); - return true; - } - return false; - case 't': - case 'T': - if (supportsServiceProtocol) { - await _debugDumpRenderTree(); - return true; - } - return false; - case 'U': - if (supportsServiceProtocol) { - await _debugDumpSemanticsTreeInInverseHitTestOrder(); - return true; - } - return false; - case 'w': - case 'W': - if (supportsServiceProtocol) { - await _debugDumpApp(); - return true; - } - return false; - case 'z': - case 'Z': - await _debugToggleDebugCheckElevationsEnabled(); - return true; - } - - return false; - } - - Future processTerminalInput(String command) async { - // When terminal doesn't support line mode, '\n' can sneak into the input. - command = command.trim(); - if (_processingUserRequest) { - printTrace('Ignoring terminal input: "$command" because we are busy.'); - return; - } - _processingUserRequest = true; - try { - final bool handled = await _commonTerminalInputHandler(command); - if (!handled) - await handleTerminalCommand(command); - } catch (error, st) { - printError('$error\n$st'); - await _cleanUpAndExit(null); - } finally { - _processingUserRequest = false; - } - } - void _serviceDisconnected() { if (_exited) { // User requested the application exit. @@ -932,7 +782,6 @@ abstract class ResidentRunner { if (_finished.isCompleted) return; printStatus('Lost connection to device.'); - _resetTerminal(); _finished.complete(0); } @@ -940,27 +789,9 @@ abstract class ResidentRunner { if (_finished.isCompleted) return; printStatus('Application finished.'); - _resetTerminal(); _finished.complete(0); } - void _resetTerminal() { - if (usesTerminalUI) - terminal.singleCharMode = false; - } - - void setupTerminal() { - assert(stayResident); - if (usesTerminalUI) { - if (!logger.quiet) { - printStatus(''); - printHelp(details: false); - } - terminal.singleCharMode = true; - terminal.keystrokes.listen(processTerminalInput); - } - } - Future waitForAppToFinish() async { final int exitCode = await _finished.future; assert(exitCode != null); @@ -1004,10 +835,38 @@ abstract class ResidentRunner { /// Called when a signal has requested we exit. Future cleanupAfterSignal(); + /// Called right before we exit. Future cleanupAtFinish(); + /// Called when the runner should handle a terminal command. - Future handleTerminalCommand(String code); + Future handleTerminalCommand(String code) async { + switch (code) { + case 'r': + final OperationResult result = await restart(fullRestart: false); + if (!result.isOk) { + printStatus('Try again after fixing the above error(s).', emphasis: true); + } + return; + case 'R': + // If hot restart is not supported for all devices, ignore the command. + if (!canHotRestart) { + return; + } + final OperationResult result = await restart(fullRestart: true); + if (!result.isOk) { + printStatus('Try again after fixing the above error(s).', emphasis: true); + } + return; + case 'l': + case 'L': + final List views = flutterDevices.expand((FlutterDevice d) => d.views).toList(); + printStatus('Connected ${pluralize('view', views.length)}:'); + for (FlutterView v in views) { + printStatus('${v.uiIsolate.name} (${v.uiIsolate.id})', indent: 2); + } + } + } } class OperationResult { @@ -1051,6 +910,176 @@ Future getMissingPackageHintForPlatform(TargetPlatform platform) async { } } +/// Redirects terminal commands to the correct resident runner methods. +class TerminalHandler { + TerminalHandler(this.residentRunner); + + final ResidentRunner residentRunner; + bool _processingUserRequest = false; + StreamSubscription subscription; + + void setupTerminal() { + if (!logger.quiet) { + printStatus(''); + residentRunner.printHelp(details: false); + } + terminal.singleCharMode = true; + subscription = terminal.keystrokes.listen(processTerminalInput); + } + + void registerSignalHandlers() { + assert(residentRunner.stayResident); + io.ProcessSignal.SIGINT.watch().listen(_cleanUpAndExit); + io.ProcessSignal.SIGTERM.watch().listen(_cleanUpAndExit); + if (!residentRunner.supportsServiceProtocol || !residentRunner.supportsRestart) + return; + io.ProcessSignal.SIGUSR1.watch().listen(_handleSignal); + io.ProcessSignal.SIGUSR2.watch().listen(_handleSignal); + } + + /// Returns [true] if the input has been handled by this function. + Future _commonTerminalInputHandler(String character) async { + printStatus(''); // the key the user tapped might be on this line + switch(character) { + case 'a': + if (residentRunner.supportsServiceProtocol) { + await residentRunner.debugToggleProfileWidgetBuilds(); + return true; + } + return false; + case 'd': + case 'D': + await residentRunner.detach(); + return true; + case 'h': + case 'H': + case '?': + // help + residentRunner.printHelp(details: true); + return true; + case 'i': + case 'I': + if (residentRunner.supportsServiceProtocol) { + await residentRunner.debugToggleWidgetInspector(); + return true; + } + return false; + case 'L': + if (residentRunner.supportsServiceProtocol) { + await residentRunner.debugDumpLayerTree(); + return true; + } + return false; + case 'o': + case 'O': + if (residentRunner.supportsServiceProtocol && residentRunner.isRunningDebug) { + await residentRunner.debugTogglePlatform(); + return true; + } + return false; + case 'p': + if (residentRunner.supportsServiceProtocol && residentRunner.isRunningDebug) { + await residentRunner.debugToggleDebugPaintSizeEnabled(); + return true; + } + return false; + case 'P': + if (residentRunner.supportsServiceProtocol) { + await residentRunner.debugTogglePerformanceOverlayOverride(); + return true; + } + return false; + case 'q': + case 'Q': + // exit + await residentRunner.exit(); + return true; + case 's': + for (FlutterDevice device in residentRunner.flutterDevices) { + if (device.device.supportsScreenshot) + await residentRunner.screenshot(device); + } + return true; + case 'S': + if (residentRunner.supportsServiceProtocol) { + await residentRunner.debugDumpSemanticsTreeInTraversalOrder(); + return true; + } + return false; + case 't': + case 'T': + if (residentRunner.supportsServiceProtocol) { + await residentRunner.debugDumpRenderTree(); + return true; + } + return false; + case 'U': + if (residentRunner.supportsServiceProtocol) { + await residentRunner.debugDumpSemanticsTreeInInverseHitTestOrder(); + return true; + } + return false; + case 'w': + case 'W': + if (residentRunner.supportsServiceProtocol) { + await residentRunner.debugDumpApp(); + return true; + } + return false; + case 'z': + case 'Z': + await residentRunner.debugToggleDebugCheckElevationsEnabled(); + return true; + } + + return false; + } + + + Future processTerminalInput(String command) async { + // When terminal doesn't support line mode, '\n' can sneak into the input. + command = command.trim(); + if (_processingUserRequest) { + printTrace('Ignoring terminal input: "$command" because we are busy.'); + return; + } + _processingUserRequest = true; + try { + final bool handled = await _commonTerminalInputHandler(command); + if (!handled) + await residentRunner.handleTerminalCommand(command); + } catch (error, st) { + printError('$error\n$st'); + await _cleanUpAndExit(null); + } finally { + _processingUserRequest = false; + } + } + + Future _handleSignal(io.ProcessSignal signal) async { + if (_processingUserRequest) { + printTrace('Ignoring signal: "$signal" because we are busy.'); + return; + } + _processingUserRequest = true; + + final bool fullRestart = signal == io.ProcessSignal.SIGUSR2; + + try { + await residentRunner.restart(fullRestart: fullRestart); + } finally { + _processingUserRequest = false; + } + } + + Future _cleanUpAndExit(io.ProcessSignal signal) async { + terminal.singleCharMode = false; + await subscription.cancel(); + await residentRunner.cleanupAfterSignal(); + io.exit(0); + } +} + class DebugConnectionInfo { DebugConnectionInfo({ this.httpUri, this.wsUri, this.baseUri }); diff --git a/packages/flutter_tools/lib/src/resident_web_runner.dart b/packages/flutter_tools/lib/src/resident_web_runner.dart index 36c3d1243b2..55dad48efee 100644 --- a/packages/flutter_tools/lib/src/resident_web_runner.dart +++ b/packages/flutter_tools/lib/src/resident_web_runner.dart @@ -37,10 +37,10 @@ class ResidentWebRunner extends ResidentRunner { }) : super( flutterDevices, target: target, - usesTerminalUI: true, - stayResident: true, debuggingOptions: debuggingOptions, ipv6: ipv6, + usesTerminalUi: true, + stayResident: true, ); WebAssetServer _server; @@ -54,7 +54,6 @@ class ResidentWebRunner extends ResidentRunner { {Completer connectionInfoCompleter, Completer appStartedCompleter}) async { connectionInfoCompleter?.complete(DebugConnectionInfo()); - setupTerminal(); final int result = await waitForAppToFinish(); await cleanupAtFinish(); return result; diff --git a/packages/flutter_tools/lib/src/run_cold.dart b/packages/flutter_tools/lib/src/run_cold.dart index b2f721447fc..ad91f56ab43 100644 --- a/packages/flutter_tools/lib/src/run_cold.dart +++ b/packages/flutter_tools/lib/src/run_cold.dart @@ -19,16 +19,17 @@ class ColdRunner extends ResidentRunner { List devices, { String target, DebuggingOptions debuggingOptions, - bool usesTerminalUI = true, this.traceStartup = false, this.awaitFirstFrameWhenTracing = true, this.applicationBinary, - bool stayResident = true, bool ipv6 = false, + bool usesTerminalUi = false, + bool stayResident = true, }) : super(devices, target: target, debuggingOptions: debuggingOptions, - usesTerminalUI: usesTerminalUI, + hotMode: false, + usesTerminalUi: usesTerminalUi, stayResident: stayResident, ipv6: ipv6); @@ -104,9 +105,6 @@ class ColdRunner extends ResidentRunner { ); } appFinished(); - } else if (stayResident) { - setupTerminal(); - registerSignalHandlers(); } appStartedCompleter?.complete(); @@ -138,10 +136,6 @@ class ColdRunner extends ResidentRunner { printTrace('Connected to $view.'); } } - if (stayResident) { - setupTerminal(); - registerSignalHandlers(); - } appStartedCompleter?.complete(); if (stayResident) { return waitForAppToFinish(); @@ -150,9 +144,6 @@ class ColdRunner extends ResidentRunner { return 0; } - @override - Future handleTerminalCommand(String code) async { } - @override Future cleanupAfterSignal() async { await stopEchoingDeviceLog(); diff --git a/packages/flutter_tools/lib/src/run_hot.dart b/packages/flutter_tools/lib/src/run_hot.dart index 767b4b5aaa1..c19057ecf9a 100644 --- a/packages/flutter_tools/lib/src/run_hot.dart +++ b/packages/flutter_tools/lib/src/run_hot.dart @@ -57,7 +57,7 @@ class HotRunner extends ResidentRunner { List devices, { String target, DebuggingOptions debuggingOptions, - bool usesTerminalUI = true, + bool usesTerminalUi = true, this.benchmarkMode = false, this.applicationBinary, this.hostIsIde = false, @@ -69,10 +69,11 @@ class HotRunner extends ResidentRunner { }) : super(devices, target: target, debuggingOptions: debuggingOptions, - usesTerminalUI: usesTerminalUI, + usesTerminalUi: usesTerminalUi, projectRootPath: projectRootPath, packagesFilePath: packagesFilePath, stayResident: stayResident, + hotMode: true, ipv6: ipv6); final bool benchmarkMode; @@ -194,11 +195,6 @@ class HotRunner extends ResidentRunner { printTrace('Connected to $view.'); } - if (stayResident) { - setupTerminal(); - registerSignalHandlers(); - } - appStartedCompleter?.complete(); if (benchmarkMode) { @@ -264,32 +260,6 @@ class HotRunner extends ResidentRunner { ); } - @override - Future handleTerminalCommand(String code) async { - final String lower = code.toLowerCase(); - if (lower == 'r') { - OperationResult result; - if (code == 'R') { - // If hot restart is not supported for all devices, ignore the command. - if (!canHotRestart) { - return; - } - result = await restart(fullRestart: true); - } else { - result = await restart(fullRestart: false); - } - if (!result.isOk) { - printStatus('Try again after fixing the above error(s).', emphasis: true); - } - } else if (lower == 'l') { - final List views = flutterDevices.expand((FlutterDevice d) => d.views).toList(); - printStatus('Connected ${pluralize('view', views.length)}:'); - for (FlutterView v in views) { - printStatus('${v.uiIsolate.name} (${v.uiIsolate.id})', indent: 2); - } - } - } - Future> _initDevFS() async { final String fsName = fs.path.basename(projectRootPath); final List devFSUris = []; diff --git a/packages/flutter_tools/test/commands/attach_test.dart b/packages/flutter_tools/test/commands/attach_test.dart index 769f31593f9..ecd9df9b2e8 100644 --- a/packages/flutter_tools/test/commands/attach_test.dart +++ b/packages/flutter_tools/test/commands/attach_test.dart @@ -24,15 +24,18 @@ import '../src/context.dart'; import '../src/mocks.dart'; void main() { - final StreamLogger logger = StreamLogger(); group('attach', () { - final FileSystem testFileSystem = MemoryFileSystem( - style: platform.isWindows ? FileSystemStyle.windows : FileSystemStyle - .posix, - ); + StreamLogger logger; + FileSystem testFileSystem; setUp(() { Cache.disableLocking(); + logger = StreamLogger(); + testFileSystem = MemoryFileSystem( + style: platform.isWindows + ? FileSystemStyle.windows + : FileSystemStyle.posix, + ); testFileSystem.directory('lib').createSync(); testFileSystem.file(testFileSystem.path.join('lib', 'main.dart')).createSync(); }); @@ -108,7 +111,8 @@ void main() { const String outputDill = '/tmp/output.dill'; final MockHotRunner mockHotRunner = MockHotRunner(); - when(mockHotRunner.attach()).thenAnswer((_) async => 0); + when(mockHotRunner.attach(appStartedCompleter: anyNamed('appStartedCompleter'))) + .thenAnswer((_) async => 0); final MockHotRunnerFactory mockHotRunnerFactory = MockHotRunnerFactory(); when( @@ -119,7 +123,7 @@ void main() { dillOutputPath: anyNamed('dillOutputPath'), debuggingOptions: anyNamed('debuggingOptions'), packagesFilePath: anyNamed('packagesFilePath'), - usesTerminalUI: anyNamed('usesTerminalUI'), + usesTerminalUi: anyNamed('usesTerminalUi'), flutterProject: anyNamed('flutterProject'), ipv6: false, ), @@ -151,7 +155,7 @@ void main() { dillOutputPath: outputDill, debuggingOptions: anyNamed('debuggingOptions'), packagesFilePath: anyNamed('packagesFilePath'), - usesTerminalUI: anyNamed('usesTerminalUI'), + usesTerminalUi: anyNamed('usesTerminalUi'), flutterProject: anyNamed('flutterProject'), ipv6: false, ), @@ -219,14 +223,14 @@ void main() { .thenReturn([ForwardedPort(hostPort, devicePort)]); when(portForwarder.unforward(any)) .thenAnswer((_) async => null); - when(mockHotRunner.attach()) - .thenAnswer((_) async => 0); + when(mockHotRunner.attach(appStartedCompleter: anyNamed('appStartedCompleter'))) + .thenAnswer((_) async => 0); when(mockHotRunnerFactory.build( any, target: anyNamed('target'), debuggingOptions: anyNamed('debuggingOptions'), packagesFilePath: anyNamed('packagesFilePath'), - usesTerminalUI: anyNamed('usesTerminalUI'), + usesTerminalUi: anyNamed('usesTerminalUi'), flutterProject: anyNamed('flutterProject'), ipv6: false, )).thenReturn(mockHotRunner); @@ -256,7 +260,7 @@ void main() { target: foo.path, debuggingOptions: anyNamed('debuggingOptions'), packagesFilePath: anyNamed('packagesFilePath'), - usesTerminalUI: anyNamed('usesTerminalUI'), + usesTerminalUi: anyNamed('usesTerminalUi'), flutterProject: anyNamed('flutterProject'), ipv6: false, )).called(1); diff --git a/packages/flutter_tools/test/resident_runner_test.dart b/packages/flutter_tools/test/resident_runner_test.dart index a4c96b39d71..024d08a8470 100644 --- a/packages/flutter_tools/test/resident_runner_test.dart +++ b/packages/flutter_tools/test/resident_runner_test.dart @@ -3,91 +3,114 @@ // found in the LICENSE file. import 'dart:async'; + import 'package:flutter_tools/src/build_info.dart'; +import 'package:flutter_tools/src/devfs.dart'; import 'package:flutter_tools/src/device.dart'; import 'package:flutter_tools/src/resident_runner.dart'; +import 'package:flutter_tools/src/run_hot.dart'; +import 'package:flutter_tools/src/vmservice.dart'; import 'package:mockito/mockito.dart'; import 'src/common.dart'; -import 'src/context.dart'; - -class TestRunner extends ResidentRunner { - TestRunner(List devices) - : super(devices); - - bool hasHelpBeenPrinted = false; - String receivedCommand; - - @override - Future cleanupAfterSignal() async { } - - @override - Future cleanupAtFinish() async { } - - @override - Future handleTerminalCommand(String code) async { - receivedCommand = code; - } - - @override - void printHelp({ bool details }) { - hasHelpBeenPrinted = true; - } - - @override - Future run({ - Completer connectionInfoCompleter, - Completer appStartedCompleter, - String route, - bool shouldBuild = true, - }) async => null; - - @override - Future attach({ - Completer connectionInfoCompleter, - Completer appStartedCompleter, - }) async => null; -} +import 'src/testbed.dart'; void main() { - TestRunner createTestRunner() { - // TODO(jacobr): make these tests run with `trackWidgetCreation: true` as - // well as the default flags. - return TestRunner( - [FlutterDevice(MockDevice(), trackWidgetCreation: false, buildMode: BuildMode.debug)], - ); - } + group('ResidentRunner', () { + final Uri testUri = Uri.parse('foo://bar'); + Testbed testbed; + MockDevice mockDevice; + MockVMService mockVMService; + MockDevFS mockDevFS; + ResidentRunner residentRunner; - group('keyboard input handling', () { - testUsingContext('single help character', () async { - final TestRunner testRunner = createTestRunner(); - expect(testRunner.hasHelpBeenPrinted, isFalse); - await testRunner.processTerminalInput('h'); - expect(testRunner.hasHelpBeenPrinted, isTrue); - }); - testUsingContext('help character surrounded with newlines', () async { - final TestRunner testRunner = createTestRunner(); - expect(testRunner.hasHelpBeenPrinted, isFalse); - await testRunner.processTerminalInput('\nh\n'); - expect(testRunner.hasHelpBeenPrinted, isTrue); - }); - testUsingContext('reload character with trailing newline', () async { - final TestRunner testRunner = createTestRunner(); - expect(testRunner.receivedCommand, isNull); - await testRunner.processTerminalInput('r\n'); - expect(testRunner.receivedCommand, equals('r')); - }); - testUsingContext('newlines', () async { - final TestRunner testRunner = createTestRunner(); - expect(testRunner.receivedCommand, isNull); - await testRunner.processTerminalInput('\n\n'); - expect(testRunner.receivedCommand, equals('')); + setUp(() { + testbed = Testbed(setup: () { + residentRunner = HotRunner( + [ + mockDevice, + ], + stayResident: false, + debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), + ); + }); + mockDevice = MockDevice(); + mockVMService = MockVMService(); + mockDevFS = MockDevFS(); + // DevFS Mocks + when(mockDevFS.lastCompiled).thenReturn(DateTime(2000)); + when(mockDevFS.sources).thenReturn([]); + when(mockDevFS.destroy()).thenAnswer((Invocation invocation) async { }); + // FlutterDevice Mocks. + when(mockDevice.updateDevFS( + // Intentionally provide empty list to match above mock. + invalidatedFiles: [], + mainPath: anyNamed('mainPath'), + target: anyNamed('target'), + bundle: anyNamed('bundle'), + firstBuildTime: anyNamed('firstBuildTime'), + bundleFirstUpload: anyNamed('bundleFirstUpload'), + bundleDirty: anyNamed('bundleDirty'), + fullRestart: anyNamed('fullRestart'), + projectRootPath: anyNamed('projectRootPath'), + pathToReload: anyNamed('pathToReload'), + )).thenAnswer((Invocation invocation) async { + return UpdateFSReport( + success: true, + syncedBytes: 0, + invalidatedSourcesCount: 0, + ); + }); + when(mockDevice.devFS).thenReturn(mockDevFS); + when(mockDevice.views).thenReturn([ + MockFlutterView(), + ]); + when(mockDevice.stopEchoingDeviceLog()).thenAnswer((Invocation invocation) async { }); + when(mockDevice.observatoryUris).thenReturn([ + testUri, + ]); + when(mockDevice.connect( + reloadSources: anyNamed('reloadSources'), + restart: anyNamed('restart'), + compileExpression: anyNamed('compileExpression') + )).thenAnswer((Invocation invocation) async { }); + when(mockDevice.setupDevFS(any, any, packagesFilePath: anyNamed('packagesFilePath'))) + .thenAnswer((Invocation invocation) async { + return testUri; + }); + when(mockDevice.vmServices).thenReturn([ + mockVMService, + ]); + when(mockDevice.refreshViews()).thenAnswer((Invocation invocation) async { }); + // VMService mocks. + when(mockVMService.wsAddress).thenReturn(testUri); + when(mockVMService.done).thenAnswer((Invocation invocation) { + final Completer result = Completer.sync(); + return result.future; + }); }); + + test('Can attach to device successfully', () => testbed.run(() async { + final Completer onConnectionInfo = Completer.sync(); + final Completer onAppStart = Completer.sync(); + final Future result = residentRunner.attach( + appStartedCompleter: onAppStart, + connectionInfoCompleter: onConnectionInfo, + ); + final Future connectionInfo = onConnectionInfo.future; + + expect(await result, 0); + + verify(mockDevice.initLogReader()).called(1); + + expect(onConnectionInfo.isCompleted, true); + expect((await connectionInfo).baseUri, 'foo://bar'); + expect(onAppStart.isCompleted, true); + })); }); } -class MockDevice extends Mock implements Device { - MockDevice() { - when(isSupported()).thenReturn(true); - } -} +class MockDevice extends Mock implements FlutterDevice {} +class MockFlutterView extends Mock implements FlutterView {} +class MockVMService extends Mock implements VMService {} +class MockDevFS extends Mock implements DevFS {} diff --git a/packages/flutter_tools/test/terminal_handler_test.dart b/packages/flutter_tools/test/terminal_handler_test.dart new file mode 100644 index 00000000000..088c7129be3 --- /dev/null +++ b/packages/flutter_tools/test/terminal_handler_test.dart @@ -0,0 +1,332 @@ +// Copyright 2017 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 'package:flutter_tools/src/build_info.dart'; +import 'package:flutter_tools/src/device.dart'; +import 'package:flutter_tools/src/resident_runner.dart'; +import 'package:mockito/mockito.dart'; + +import 'src/common.dart'; +import 'src/context.dart'; + +void main() { + TestRunner createTestRunner() { + // TODO(jacobr): make these tests run with `trackWidgetCreation: true` as + // well as the default flags. + return TestRunner( + [FlutterDevice(MockDevice(), trackWidgetCreation: false, buildMode: BuildMode.debug)], + ); + } + + group('keyboard input handling', () { + testUsingContext('single help character', () async { + final TestRunner testRunner = createTestRunner(); + final TerminalHandler terminalHandler = TerminalHandler(testRunner); + expect(testRunner.hasHelpBeenPrinted, isFalse); + await terminalHandler.processTerminalInput('h'); + expect(testRunner.hasHelpBeenPrinted, isTrue); + }); + + testUsingContext('help character surrounded with newlines', () async { + final TestRunner testRunner = createTestRunner(); + final TerminalHandler terminalHandler = TerminalHandler(testRunner); + expect(testRunner.hasHelpBeenPrinted, isFalse); + await terminalHandler.processTerminalInput('\nh\n'); + expect(testRunner.hasHelpBeenPrinted, isTrue); + }); + + testUsingContext('reload character with trailing newline', () async { + final TestRunner testRunner = createTestRunner(); + final TerminalHandler terminalHandler = TerminalHandler(testRunner); + expect(testRunner.receivedCommand, isNull); + await terminalHandler.processTerminalInput('r\n'); + expect(testRunner.receivedCommand, equals('r')); + }); + + testUsingContext('newlines', () async { + final TestRunner testRunner = createTestRunner(); + final TerminalHandler terminalHandler = TerminalHandler(testRunner); + expect(testRunner.receivedCommand, isNull); + await terminalHandler.processTerminalInput('\n\n'); + expect(testRunner.receivedCommand, equals('')); + }); + }); + + group('keycode verification, brought to you by the letter r', () { + MockResidentRunner mockResidentRunner; + TerminalHandler terminalHandler; + + setUp(() { + mockResidentRunner = MockResidentRunner(); + terminalHandler = TerminalHandler(mockResidentRunner); + when(mockResidentRunner.supportsServiceProtocol).thenReturn(true); + when(mockResidentRunner.handleTerminalCommand(any)).thenReturn(null); + }); + + testUsingContext('a - debugToggleProfileWidgetBuilds with service protocol', () async { + await terminalHandler.processTerminalInput('a'); + + verify(mockResidentRunner.debugToggleProfileWidgetBuilds()).called(1); + }); + + testUsingContext('a - debugToggleProfileWidgetBuilds without service protocol', () async { + when(mockResidentRunner.supportsServiceProtocol).thenReturn(false); + await terminalHandler.processTerminalInput('a'); + + verifyNever(mockResidentRunner.debugToggleProfileWidgetBuilds()); + }); + + + testUsingContext('a - debugToggleProfileWidgetBuilds', () async { + when(mockResidentRunner.supportsServiceProtocol).thenReturn(true); + await terminalHandler.processTerminalInput('a'); + + verify(mockResidentRunner.debugToggleProfileWidgetBuilds()).called(1); + }); + + testUsingContext('d,D - detach', () async { + await terminalHandler.processTerminalInput('d'); + await terminalHandler.processTerminalInput('D'); + + verify(mockResidentRunner.detach()).called(2); + }); + + testUsingContext('h,H,? - printHelp', () async { + await terminalHandler.processTerminalInput('h'); + await terminalHandler.processTerminalInput('H'); + await terminalHandler.processTerminalInput('?'); + + verify(mockResidentRunner.printHelp(details: true)).called(3); + }); + + testUsingContext('i, I - debugToggleWidgetInspector with service protocol', () async { + await terminalHandler.processTerminalInput('i'); + await terminalHandler.processTerminalInput('I'); + + verify(mockResidentRunner.debugToggleWidgetInspector()).called(2); + }); + + testUsingContext('i, I - debugToggleWidgetInspector without service protocol', () async { + when(mockResidentRunner.supportsServiceProtocol).thenReturn(false); + await terminalHandler.processTerminalInput('i'); + await terminalHandler.processTerminalInput('I'); + + verifyNever(mockResidentRunner.debugToggleWidgetInspector()); + }); + + testUsingContext('L - debugDumpLayerTree with service protocol', () async { + await terminalHandler.processTerminalInput('L'); + + verify(mockResidentRunner.debugDumpLayerTree()).called(1); + }); + + testUsingContext('L - debugDumpLayerTree without service protocol', () async { + when(mockResidentRunner.supportsServiceProtocol).thenReturn(false); + await terminalHandler.processTerminalInput('L'); + + verifyNever(mockResidentRunner.debugDumpLayerTree()); + }); + + testUsingContext('o,O - debugTogglePlatform with service protocol and debug mode', () async { + when(mockResidentRunner.isRunningDebug).thenReturn(true); + await terminalHandler.processTerminalInput('o'); + await terminalHandler.processTerminalInput('O'); + + verify(mockResidentRunner.debugTogglePlatform()).called(2); + }); + + testUsingContext('o,O - debugTogglePlatform without service protocol', () async { + when(mockResidentRunner.supportsServiceProtocol).thenReturn(false); + when(mockResidentRunner.isRunningDebug).thenReturn(true); + await terminalHandler.processTerminalInput('o'); + await terminalHandler.processTerminalInput('O'); + + verifyNever(mockResidentRunner.debugTogglePlatform()); + }); + + testUsingContext('p - debugToggleDebugPaintSizeEnabled with service protocol and debug mode', () async { + when(mockResidentRunner.isRunningDebug).thenReturn(true); + await terminalHandler.processTerminalInput('p'); + + verify(mockResidentRunner.debugToggleDebugPaintSizeEnabled()).called(1); + }); + + testUsingContext('p - debugTogglePlatform without service protocol', () async { + when(mockResidentRunner.supportsServiceProtocol).thenReturn(false); + when(mockResidentRunner.isRunningDebug).thenReturn(true); + await terminalHandler.processTerminalInput('p'); + + verifyNever(mockResidentRunner.debugToggleDebugPaintSizeEnabled()); + }); + + testUsingContext('p - debugToggleDebugPaintSizeEnabled with service protocol and debug mode', () async { + when(mockResidentRunner.isRunningDebug).thenReturn(true); + await terminalHandler.processTerminalInput('p'); + + verify(mockResidentRunner.debugToggleDebugPaintSizeEnabled()).called(1); + }); + + testUsingContext('p - debugTogglePlatform without service protocol', () async { + when(mockResidentRunner.supportsServiceProtocol).thenReturn(false); + when(mockResidentRunner.isRunningDebug).thenReturn(true); + await terminalHandler.processTerminalInput('p'); + + verifyNever(mockResidentRunner.debugToggleDebugPaintSizeEnabled()); + }); + + testUsingContext('P - debugTogglePerformanceOverlayOverride with service protocol', () async { + await terminalHandler.processTerminalInput('P'); + + verify(mockResidentRunner.debugTogglePerformanceOverlayOverride()).called(1); + }); + + testUsingContext('P - debugTogglePerformanceOverlayOverride without service protocol', () async { + when(mockResidentRunner.supportsServiceProtocol).thenReturn(false); + await terminalHandler.processTerminalInput('P'); + + verifyNever(mockResidentRunner.debugTogglePerformanceOverlayOverride()); + }); + + testUsingContext('q,Q - exit', () async { + await terminalHandler.processTerminalInput('q'); + await terminalHandler.processTerminalInput('Q'); + + verify(mockResidentRunner.exit()).called(2); + }); + + testUsingContext('s - screenshot', () async { + final MockDevice mockDevice = MockDevice(); + final MockFlutterDevice mockFlutterDevice = MockFlutterDevice(); + when(mockResidentRunner.isRunningDebug).thenReturn(true); + when(mockResidentRunner.flutterDevices).thenReturn([mockFlutterDevice]); + when(mockFlutterDevice.device).thenReturn(mockDevice); + when(mockDevice.supportsScreenshot).thenReturn(true); + + await terminalHandler.processTerminalInput('s'); + + verify(mockResidentRunner.screenshot(mockFlutterDevice)).called(1); + }); + + testUsingContext('S - debugDumpSemanticsTreeInTraversalOrder with service protocol', () async { + await terminalHandler.processTerminalInput('S'); + + verify(mockResidentRunner.debugDumpSemanticsTreeInTraversalOrder()).called(1); + }); + + testUsingContext('S - debugDumpSemanticsTreeInTraversalOrder without service protocol', () async { + when(mockResidentRunner.supportsServiceProtocol).thenReturn(false); + await terminalHandler.processTerminalInput('S'); + + verifyNever(mockResidentRunner.debugDumpSemanticsTreeInTraversalOrder()); + }); + + testUsingContext('t,T - debugDumpRenderTree with service protocol', () async { + await terminalHandler.processTerminalInput('t'); + await terminalHandler.processTerminalInput('T'); + + verify(mockResidentRunner.debugDumpRenderTree()).called(2); + }); + + testUsingContext('t,T - debugDumpSemanticsTreeInTraversalOrder without service protocol', () async { + when(mockResidentRunner.supportsServiceProtocol).thenReturn(false); + await terminalHandler.processTerminalInput('t'); + await terminalHandler.processTerminalInput('T'); + + verifyNever(mockResidentRunner.debugDumpRenderTree()); + }); + + testUsingContext('U - debugDumpRenderTree with service protocol', () async { + await terminalHandler.processTerminalInput('U'); + + verify(mockResidentRunner.debugDumpSemanticsTreeInInverseHitTestOrder()).called(1); + }); + + testUsingContext('U - debugDumpSemanticsTreeInTraversalOrder without service protocol', () async { + when(mockResidentRunner.supportsServiceProtocol).thenReturn(false); + await terminalHandler.processTerminalInput('U'); + + verifyNever(mockResidentRunner.debugDumpSemanticsTreeInInverseHitTestOrder()); + }); + + testUsingContext('w,W - debugDumpApp with service protocol', () async { + await terminalHandler.processTerminalInput('w'); + await terminalHandler.processTerminalInput('W'); + + verify(mockResidentRunner.debugDumpApp()).called(2); + }); + + testUsingContext('w,W - debugDumpApp without service protocol', () async { + when(mockResidentRunner.supportsServiceProtocol).thenReturn(false); + await terminalHandler.processTerminalInput('w'); + await terminalHandler.processTerminalInput('W'); + + verifyNever(mockResidentRunner.debugDumpApp()); + }); + + testUsingContext('z,Z - debugToggleDebugCheckElevationsEnabled with service protocol', () async { + await terminalHandler.processTerminalInput('z'); + await terminalHandler.processTerminalInput('Z'); + + verify(mockResidentRunner.debugToggleDebugCheckElevationsEnabled()).called(2); + }); + + testUsingContext('z,Z - debugToggleDebugCheckElevationsEnabled without service protocol', () async { + when(mockResidentRunner.supportsServiceProtocol).thenReturn(false); + await terminalHandler.processTerminalInput('z'); + await terminalHandler.processTerminalInput('Z'); + + // This should probably be disable when the service protocol is not enabled. + verify(mockResidentRunner.debugToggleDebugCheckElevationsEnabled()).called(2); + }); + }); +} + +class MockDevice extends Mock implements Device { + MockDevice() { + when(isSupported()).thenReturn(true); + } +} + +class MockResidentRunner extends Mock implements ResidentRunner {} + +class MockFlutterDevice extends Mock implements FlutterDevice {} + +class TestRunner extends ResidentRunner { + TestRunner(List devices) + : super(devices); + + bool hasHelpBeenPrinted = false; + String receivedCommand; + + @override + Future cleanupAfterSignal() async { } + + @override + Future cleanupAtFinish() async { } + + @override + Future handleTerminalCommand(String code) async { + receivedCommand = code; + } + + @override + void printHelp({ bool details }) { + hasHelpBeenPrinted = true; + } + + @override + Future run({ + Completer connectionInfoCompleter, + Completer appStartedCompleter, + String route, + bool shouldBuild = true, + }) async => null; + + @override + Future attach({ + Completer connectionInfoCompleter, + Completer appStartedCompleter, + }) async => null; +} From 42a01befa0648e2e400f29e357b334b85bb3f1a9 Mon Sep 17 00:00:00 2001 From: Gary Qian Date: Tue, 9 Jul 2019 14:24:47 -0700 Subject: [PATCH 02/41] Roll engine e695a516f..75387dbc1 (8 commits) (#35814) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 18b2cd15c1e..17966d739cf 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -e695a516f148cef9c7850a6e00151f00bfadf0d4 +75387dbc147d1cee8164f5d61582eab8ba1e5058 From af1bd09c781e86e127c6fe503b988e0737a0cd36 Mon Sep 17 00:00:00 2001 From: Darren Austin Date: Tue, 9 Jul 2019 15:26:42 -0700 Subject: [PATCH 03/41] Added MaterialApp.themeMode to control which theme is used. (#35499) Added support for a themeMode property to the MaterialApp to control how the light or dark theme is selected. --- packages/flutter/lib/src/material/app.dart | 74 +++++++++--- packages/flutter/test/material/app_test.dart | 120 ++++++++++++++++++- 2 files changed, 178 insertions(+), 16 deletions(-) diff --git a/packages/flutter/lib/src/material/app.dart b/packages/flutter/lib/src/material/app.dart index e1b0771e372..22c1c6a0bd7 100644 --- a/packages/flutter/lib/src/material/app.dart +++ b/packages/flutter/lib/src/material/app.dart @@ -34,6 +34,19 @@ const TextStyle _errorTextStyle = TextStyle( debugLabel: 'fallback style; consider putting your text in a Material', ); +/// Describes which theme will be used by [MaterialApp]. +enum ThemeMode { + /// Use either the light or dark theme based on what the user has selected in + /// the system settings. + system, + + /// Always use the light mode regardless of system preference. + light, + + /// Always use the dark mode (if available) regardless of system preference. + dark, +} + /// An application that uses material design. /// /// A convenience widget that wraps a number of widgets that are commonly @@ -99,6 +112,7 @@ class MaterialApp extends StatefulWidget { this.color, this.theme, this.darkTheme, + this.themeMode = ThemeMode.system, this.locale, this.localizationsDelegates, this.localeListResolutionCallback, @@ -169,13 +183,15 @@ class MaterialApp extends StatefulWidget { /// Default visual properties, like colors fonts and shapes, for this app's /// material widgets. /// - /// A second [darkTheme] [ThemeData] value, which is used when the underlying - /// platform requests a "dark mode" UI, can also be specified. + /// A second [darkTheme] [ThemeData] value, which is used to provide a dark + /// version of the user interface can also be specified. [themeMode] will + /// control which theme will be used if a [darkTheme] is provided. /// /// The default value of this property is the value of [ThemeData.light()]. /// /// See also: /// + /// * [themeMode], which controls which theme to use. /// * [MediaQueryData.platformBrightness], which indicates the platform's /// desired brightness and is used to automatically toggle between [theme] /// and [darkTheme] in [MaterialApp]. @@ -183,20 +199,21 @@ class MaterialApp extends StatefulWidget { /// colors. final ThemeData theme; - /// The [ThemeData] to use when the platform specifically requests a dark - /// themed UI. + /// The [ThemeData] to use when a 'dark mode' is requested by the system. /// - /// Host platforms such as Android Pie can request a system-wide "dark mode" - /// when entering battery saver mode. + /// Some host platforms allow the users to select a system-wide 'dark mode', + /// or the application may want to offer the user the ability to choose a + /// dark theme just for this application. This is theme that will be used for + /// such cases. [themeMode] will control which theme will be used. /// - /// When the host platform requests a [Brightness.dark] mode, you may want to - /// supply a [ThemeData.brightness] that's also [Brightness.dark]. + /// This theme should have a [ThemeData.brightness] set to [Brightness.dark]. /// /// Uses [theme] instead when null. Defaults to the value of /// [ThemeData.light()] when both [darkTheme] and [theme] are null. /// /// See also: /// + /// * [themeMode], which controls which theme to use. /// * [MediaQueryData.platformBrightness], which indicates the platform's /// desired brightness and is used to automatically toggle between [theme] /// and [darkTheme] in [MaterialApp]. @@ -204,6 +221,32 @@ class MaterialApp extends StatefulWidget { /// [MediaQueryData.platformBrightness]. final ThemeData darkTheme; + /// Determines which theme will be used by the application if both [theme] + /// and [darkTheme] are provided. + /// + /// If set to [ThemeMode.system], the choice of which theme to use will + /// be based on the user's system preferences. If the [MediaQuery.platformBrightnessOf] + /// is [Brightness.light], [theme] will be used. If it is [Brightness.dark], + /// [darkTheme] will be used (unless it is [null], in which case [theme] + /// will be used. + /// + /// If set to [ThemeMode.light] the [theme] will always be used, + /// regardless of the user's system preference. + /// + /// If set to [ThemeMode.dark] the [darkTheme] will be used + /// regardless of the user's system preference. If [darkTheme] is [null] + /// then it will fallback to using [theme]. + /// + /// The default value is [ThemeMode.system]. + /// + /// See also: + /// + /// * [theme], which is used when a light mode is selected. + /// * [darkTheme], which is used when a dark mode is selected. + /// * [ThemeData.brightness], which indicates to various parts of the + /// system what kind of theme is being used. + final ThemeMode themeMode; + /// {@macro flutter.widgets.widgetsApp.color} final Color color; @@ -454,15 +497,16 @@ class _MaterialAppState extends State { onUnknownRoute: widget.onUnknownRoute, builder: (BuildContext context, Widget child) { // Use a light theme, dark theme, or fallback theme. + final ThemeMode mode = widget.themeMode ?? ThemeMode.system; ThemeData theme; - final ui.Brightness platformBrightness = MediaQuery.platformBrightnessOf(context); - if (platformBrightness == ui.Brightness.dark && widget.darkTheme != null) { - theme = widget.darkTheme; - } else if (widget.theme != null) { - theme = widget.theme; - } else { - theme = ThemeData.fallback(); + if (widget.darkTheme != null) { + final ui.Brightness platformBrightness = MediaQuery.platformBrightnessOf(context); + if (mode == ThemeMode.dark || + (mode == ThemeMode.system && platformBrightness == ui.Brightness.dark)) { + theme = widget.darkTheme; + } } + theme ??= widget.theme ?? ThemeData.fallback(); return AnimatedTheme( data: theme, diff --git a/packages/flutter/test/material/app_test.dart b/packages/flutter/test/material/app_test.dart index 56c9fa7659d..4135b2827ea 100644 --- a/packages/flutter/test/material/app_test.dart +++ b/packages/flutter/test/material/app_test.dart @@ -447,7 +447,99 @@ void main() { expect(find.text('Select All'), findsOneWidget); }); - testWidgets('MaterialApp uses regular theme when platformBrightness is light', (WidgetTester tester) async { + testWidgets('MaterialApp uses regular theme when themeMode is light', (WidgetTester tester) async { + // Mock the Window to explicitly report a light platformBrightness. + tester.binding.window.platformBrightnessTestValue = Brightness.light; + + ThemeData appliedTheme; + await tester.pumpWidget( + MaterialApp( + theme: ThemeData( + brightness: Brightness.light + ), + darkTheme: ThemeData( + brightness: Brightness.dark, + ), + themeMode: ThemeMode.light, + home: Builder( + builder: (BuildContext context) { + appliedTheme = Theme.of(context); + return const SizedBox(); + }, + ), + ), + ); + expect(appliedTheme.brightness, Brightness.light); + + // Mock the Window to explicitly report a dark platformBrightness. + tester.binding.window.platformBrightnessTestValue = Brightness.dark; + await tester.pumpWidget( + MaterialApp( + theme: ThemeData( + brightness: Brightness.light + ), + darkTheme: ThemeData( + brightness: Brightness.dark, + ), + themeMode: ThemeMode.light, + home: Builder( + builder: (BuildContext context) { + appliedTheme = Theme.of(context); + return const SizedBox(); + }, + ), + ), + ); + expect(appliedTheme.brightness, Brightness.light); + }); + + testWidgets('MaterialApp uses darkTheme when themeMode is dark', (WidgetTester tester) async { + // Mock the Window to explicitly report a light platformBrightness. + tester.binding.window.platformBrightnessTestValue = Brightness.light; + + ThemeData appliedTheme; + await tester.pumpWidget( + MaterialApp( + theme: ThemeData( + brightness: Brightness.light + ), + darkTheme: ThemeData( + brightness: Brightness.dark, + ), + themeMode: ThemeMode.dark, + home: Builder( + builder: (BuildContext context) { + appliedTheme = Theme.of(context); + return const SizedBox(); + }, + ), + ), + ); + expect(appliedTheme.brightness, Brightness.dark); + + // Mock the Window to explicitly report a dark platformBrightness. + tester.binding.window.platformBrightnessTestValue = Brightness.dark; + await tester.pumpWidget( + MaterialApp( + theme: ThemeData( + brightness: Brightness.light + ), + darkTheme: ThemeData( + brightness: Brightness.dark, + ), + themeMode: ThemeMode.dark, + home: Builder( + builder: (BuildContext context) { + appliedTheme = Theme.of(context); + return const SizedBox(); + }, + ), + ), + ); + expect(appliedTheme.brightness, Brightness.dark); + }); + + testWidgets('MaterialApp uses regular theme when themeMode is system and platformBrightness is light', (WidgetTester tester) async { // Mock the Window to explicitly report a light platformBrightness. final TestWidgetsFlutterBinding binding = tester.binding; binding.window.platformBrightnessTestValue = Brightness.light; @@ -462,6 +554,7 @@ void main() { darkTheme: ThemeData( brightness: Brightness.dark, ), + themeMode: ThemeMode.system, home: Builder( builder: (BuildContext context) { appliedTheme = Theme.of(context); @@ -474,6 +567,31 @@ void main() { expect(appliedTheme.brightness, Brightness.light); }); + testWidgets('MaterialApp uses darkTheme when themeMode is system and platformBrightness is dark', (WidgetTester tester) async { + // Mock the Window to explicitly report a dark platformBrightness. + tester.binding.window.platformBrightnessTestValue = Brightness.dark; + + ThemeData appliedTheme; + await tester.pumpWidget( + MaterialApp( + theme: ThemeData( + brightness: Brightness.light + ), + darkTheme: ThemeData( + brightness: Brightness.dark, + ), + themeMode: ThemeMode.system, + home: Builder( + builder: (BuildContext context) { + appliedTheme = Theme.of(context); + return const SizedBox(); + }, + ), + ), + ); + expect(appliedTheme.brightness, Brightness.dark); + }); + testWidgets('MaterialApp uses light theme when platformBrightness is dark but no dark theme is provided', (WidgetTester tester) async { // Mock the Window to explicitly report a dark platformBrightness. final TestWidgetsFlutterBinding binding = tester.binding; From 871b58986d6d401efb8dd66af67814bf37c42cd1 Mon Sep 17 00:00:00 2001 From: John Ryan Date: Tue, 9 Jul 2019 15:34:39 -0700 Subject: [PATCH 04/41] add sample code for AnimatedContainer (#35225) * add sample code for AnimatedContainer * use stateful_widget_scaffold snippet template * add sample explanation * add setState() to example assumptions for analyzer * update description * use snippet instead of sample * change sample to match assets-for-api-docs * remove constant * update AnimatedContainer sample description add indication the example is depicted by the video and animates when tapped * fix example formatting * make sample conform to 80 col limit * add "implemented below" to illustration description * formatting for readability --- .../lib/src/widgets/implicit_animations.dart | 38 ++++++++++++++++++- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/packages/flutter/lib/src/widgets/implicit_animations.dart b/packages/flutter/lib/src/widgets/implicit_animations.dart index 5ec919d1b85..8360a95c4d7 100644 --- a/packages/flutter/lib/src/widgets/implicit_animations.dart +++ b/packages/flutter/lib/src/widgets/implicit_animations.dart @@ -22,6 +22,7 @@ import 'transitions.dart'; // @override // MyWidgetState createState() => MyWidgetState(); // } +// void setState(VoidCallback fn) { } /// An interpolation between two [BoxConstraints]. /// @@ -521,10 +522,43 @@ abstract class AnimatedWidgetBaseState exten /// /// {@youtube 560 315 https://www.youtube.com/watch?v=yI-8QHpGIP4} /// -/// Here's an illustration of what using this widget looks like, using a [curve] -/// of [Curves.fastOutSlowIn]. +/// Here's an illustration (implemented below) of what using this widget looks +/// like, using a [curve] of [Curves.fastOutSlowIn]. /// {@animation 250 266 https://flutter.github.io/assets-for-api-docs/assets/widgets/animated_container.mp4} /// +/// {@tool snippet --template=stateful_widget_scaffold} +/// +/// The following example (depicted above) transitions an AnimatedContainer +/// between two states. It adjusts the [height], [width], [color], and +/// [alignment] properties when tapped. +/// +/// ```dart +/// bool selected = false; +/// +/// @override +/// Widget build(BuildContext context) { +/// return GestureDetector( +/// onTap: () { +/// setState(() { +/// selected = !selected; +/// }); +/// }, +/// child: Center( +/// child: AnimatedContainer( +/// width: selected ? 200.0 : 100.0, +/// height: selected ? 100.0 : 200.0, +/// color: selected ? Colors.red : Colors.blue, +/// alignment: selected ? Alignment.center : AlignmentDirectional.topCenter, +/// duration: Duration(seconds: 2), +/// curve: Curves.fastOutSlowIn, +/// child: FlutterLogo(size: 75), +/// ), +/// ), +/// ); +/// } +/// ``` +/// {@end-tool} +/// /// See also: /// /// * [AnimatedPadding], which is a subset of this widget that only From 2ad5376a06ee138e63266bd55dc3d33fc7b1c3eb Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Tue, 9 Jul 2019 16:00:33 -0700 Subject: [PATCH 05/41] Build all example projects in CI build smoke test (#35778) --- dev/bots/test.dart | 29 ++--- .../ios/Runner.xcodeproj/project.pbxproj | 8 +- .../ios/Runner.xcodeproj/project.pbxproj | 29 ++--- .../android/app/build.gradle | 60 +++++++++++ .../ExampleInstrumentedTest.java | 94 ++++++++++++++++ .../android/app/src/main/AndroidManifest.xml | 25 +++++ .../example/platformchannel/MainActivity.java | 101 ++++++++++++++++++ .../app/src/main/res/values/strings.xml | 5 + .../android/build.gradle | 29 +++++ .../android/gradle.properties | 1 + .../gradle/wrapper/gradle-wrapper.properties | 6 ++ .../android/settings.gradle | 15 +++ examples/platform_view/ios/Podfile.lock | 6 +- .../ios/Runner.xcodeproj/project.pbxproj | 8 +- 14 files changed, 380 insertions(+), 36 deletions(-) create mode 100644 examples/platform_channel_swift/android/app/build.gradle create mode 100644 examples/platform_channel_swift/android/app/src/androidTest/java/com/example/platformchannel/ExampleInstrumentedTest.java create mode 100644 examples/platform_channel_swift/android/app/src/main/AndroidManifest.xml create mode 100644 examples/platform_channel_swift/android/app/src/main/java/com/example/platformchannel/MainActivity.java create mode 100644 examples/platform_channel_swift/android/app/src/main/res/values/strings.xml create mode 100644 examples/platform_channel_swift/android/build.gradle create mode 100644 examples/platform_channel_swift/android/gradle.properties create mode 100644 examples/platform_channel_swift/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 examples/platform_channel_swift/android/settings.gradle diff --git a/dev/bots/test.dart b/dev/bots/test.dart index 7cb5d2df9bc..19256fcdb4e 100644 --- a/dev/bots/test.dart +++ b/dev/bots/test.dart @@ -258,22 +258,25 @@ Future _runToolTests() async { print('${bold}DONE: All tests successful.$reset'); } -/// Verifies that AOT, APK, and IPA (if on macOS) builds of some -/// examples apps finish without crashing. It does not actually +/// Verifies that AOT, APK, and IPA (if on macOS) builds the +/// examples apps without crashing. It does not actually /// launch the apps. That happens later in the devicelab. This is /// just a smoke-test. In particular, this will verify we can build /// when there are spaces in the path name for the Flutter SDK and /// target app. Future _runBuildTests() async { - final List paths = [ - path.join('examples', 'hello_world'), - path.join('examples', 'flutter_gallery'), - path.join('examples', 'flutter_view'), - ]; - for (String path in paths) { - await _flutterBuildAot(path); - await _flutterBuildApk(path); - await _flutterBuildIpa(path); + final Stream exampleDirectories = Directory(path.join(flutterRoot, 'examples')).list(); + await for (FileSystemEntity fileEntity in exampleDirectories) { + if (fileEntity is! Directory) { + continue; + } + final String examplePath = fileEntity.path; + final String basename = path.basename(examplePath); + final bool expectIpaBuildFailure = basename == 'platform_channel_swift'; // Remove when https://github.com/flutter/flutter/issues/35773 is fixed. + + await _flutterBuildAot(examplePath); + await _flutterBuildApk(examplePath); + await _flutterBuildIpa(examplePath, expectIpaBuildFailure: expectIpaBuildFailure); } await _flutterBuildDart2js(path.join('dev', 'integration_tests', 'web')); @@ -318,7 +321,7 @@ Future _flutterBuildApk(String relativePathToApplication) async { print('Done.'); } -Future _flutterBuildIpa(String relativePathToApplication) async { +Future _flutterBuildIpa(String relativePathToApplication, {bool expectIpaBuildFailure = false}) async { if (!Platform.isMacOS) { return; } @@ -337,7 +340,7 @@ Future _flutterBuildIpa(String relativePathToApplication) async { await runCommand(flutter, ['build', 'ios', '--no-codesign', '--debug', '-v'], workingDirectory: path.join(flutterRoot, relativePathToApplication), - expectNonZeroExit: false, + expectNonZeroExit: expectIpaBuildFailure, timeout: _kShortTimeout, ); print('Done.'); diff --git a/examples/flutter_gallery/ios/Runner.xcodeproj/project.pbxproj b/examples/flutter_gallery/ios/Runner.xcodeproj/project.pbxproj index e2bd6ae9ac5..252987cabc0 100644 --- a/examples/flutter_gallery/ios/Runner.xcodeproj/project.pbxproj +++ b/examples/flutter_gallery/ios/Runner.xcodeproj/project.pbxproj @@ -38,6 +38,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 26D36078B4738B64685A0B6F /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 2D9222431EC1E1BA007564B0 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 2D9222441EC1E1BA007564B0 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; @@ -55,6 +56,8 @@ 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; C77CA0BBC4B57129484236F4 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + DC01738FBE39EADD5AC4BF42 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + ECF490DDAB8ABCEEFB1780BE /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -138,6 +141,9 @@ E54E8B7296D73DD9B2385312 /* Pods */ = { isa = PBXGroup; children = ( + ECF490DDAB8ABCEEFB1780BE /* Pods-Runner.debug.xcconfig */, + 26D36078B4738B64685A0B6F /* Pods-Runner.release.xcconfig */, + DC01738FBE39EADD5AC4BF42 /* Pods-Runner.profile.xcconfig */, ); name = Pods; sourceTree = ""; @@ -273,7 +279,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ diff --git a/examples/flutter_view/ios/Runner.xcodeproj/project.pbxproj b/examples/flutter_view/ios/Runner.xcodeproj/project.pbxproj index 42d6b8fca46..edc2bcc0688 100644 --- a/examples/flutter_view/ios/Runner.xcodeproj/project.pbxproj +++ b/examples/flutter_view/ios/Runner.xcodeproj/project.pbxproj @@ -48,6 +48,7 @@ 2DE332E81E55C6F100393FD5 /* MainViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MainViewController.h; sourceTree = ""; }; 3B3967011E83382E004F5970 /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; 3B3967041E83383D004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 63EC5EC13E843CD861057871 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; @@ -60,6 +61,8 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C50B4FE91C29B0DE9DD62DD3 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + EADA814501F2EF49C9E6C636 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -79,6 +82,9 @@ 840012C8B5EDBCF56B0E4AC1 /* Pods */ = { isa = PBXGroup; children = ( + 63EC5EC13E843CD861057871 /* Pods-Runner.debug.xcconfig */, + C50B4FE91C29B0DE9DD62DD3 /* Pods-Runner.release.xcconfig */, + EADA814501F2EF49C9E6C636 /* Pods-Runner.profile.xcconfig */, ); name = Pods; sourceTree = ""; @@ -165,7 +171,6 @@ 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, D7EBAA0AD2D4385BA6FA83BA /* [CP] Embed Pods Frameworks */, - 0273455D92E89802918C824F /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -226,21 +231,6 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 0273455D92E89802918C824F /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -275,13 +265,16 @@ files = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); name = "[CP] Check Pods Manifest.lock"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; D7EBAA0AD2D4385BA6FA83BA /* [CP] Embed Pods Frameworks */ = { @@ -296,7 +289,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ diff --git a/examples/platform_channel_swift/android/app/build.gradle b/examples/platform_channel_swift/android/app/build.gradle new file mode 100644 index 00000000000..50c275da632 --- /dev/null +++ b/examples/platform_channel_swift/android/app/build.gradle @@ -0,0 +1,60 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 28 + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + applicationId "io.flutter.examples.platform_channel_swift" + minSdkVersion 16 + targetSdkVersion 28 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies { + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' +} diff --git a/examples/platform_channel_swift/android/app/src/androidTest/java/com/example/platformchannel/ExampleInstrumentedTest.java b/examples/platform_channel_swift/android/app/src/androidTest/java/com/example/platformchannel/ExampleInstrumentedTest.java new file mode 100644 index 00000000000..8c1bf37ee2b --- /dev/null +++ b/examples/platform_channel_swift/android/app/src/androidTest/java/com/example/platformchannel/ExampleInstrumentedTest.java @@ -0,0 +1,94 @@ +package com.example.platformchannel; + +import android.graphics.Bitmap; +import android.support.test.InstrumentationRegistry; +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; + +import io.flutter.view.FlutterView; + +import android.app.Instrumentation; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Rule + public ActivityTestRule activityRule = + new ActivityTestRule<>(MainActivity.class); + + + @Test + public void testBitmap() { + final Instrumentation instr = InstrumentationRegistry.getInstrumentation(); + final BitmapPoller poller = new BitmapPoller(5); + instr.runOnMainSync(new Runnable() { + public void run() { + final FlutterView flutterView = activityRule.getActivity().getFlutterView(); + + // Call onPostResume to start the engine's renderer even if the activity + // is paused in the test environment. + flutterView.onPostResume(); + + poller.start(flutterView); + } + }); + + Bitmap bitmap = null; + try { + bitmap = poller.waitForBitmap(); + } catch (InterruptedException e) { + fail(e.getMessage()); + } + + assertNotNull(bitmap); + assertTrue(bitmap.getWidth() > 0); + assertTrue(bitmap.getHeight() > 0); + + // Check that a pixel matches the default Material background color. + assertTrue(bitmap.getPixel(bitmap.getWidth() - 1, bitmap.getHeight() - 1) == 0xFFFAFAFA); + } + + // Waits on a FlutterView until it is able to produce a bitmap. + private class BitmapPoller { + private int triesPending; + private int waitMsec; + private FlutterView flutterView; + private Bitmap bitmap; + private CountDownLatch latch = new CountDownLatch(1); + + private final int delayMsec = 1000; + + BitmapPoller(int tries) { + triesPending = tries; + waitMsec = delayMsec * tries + 100; + } + + void start(FlutterView flutterView) { + this.flutterView = flutterView; + flutterView.postDelayed(checkBitmap, delayMsec); + } + + Bitmap waitForBitmap() throws InterruptedException { + latch.await(waitMsec, TimeUnit.MILLISECONDS); + return bitmap; + } + + private Runnable checkBitmap = new Runnable() { + public void run() { + bitmap = flutterView.getBitmap(); + triesPending--; + if (bitmap != null || triesPending == 0) { + latch.countDown(); + } else { + flutterView.postDelayed(checkBitmap, delayMsec); + } + } + }; + } +} diff --git a/examples/platform_channel_swift/android/app/src/main/AndroidManifest.xml b/examples/platform_channel_swift/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..fe87a8a9dfe --- /dev/null +++ b/examples/platform_channel_swift/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + diff --git a/examples/platform_channel_swift/android/app/src/main/java/com/example/platformchannel/MainActivity.java b/examples/platform_channel_swift/android/app/src/main/java/com/example/platformchannel/MainActivity.java new file mode 100644 index 00000000000..19db0603723 --- /dev/null +++ b/examples/platform_channel_swift/android/app/src/main/java/com/example/platformchannel/MainActivity.java @@ -0,0 +1,101 @@ +// Copyright 2017 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. + +package com.example.platformchannel; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.ContextWrapper; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.BatteryManager; +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; +import android.os.Bundle; + +import io.flutter.app.FlutterActivity; +import io.flutter.plugin.common.EventChannel; +import io.flutter.plugin.common.EventChannel.EventSink; +import io.flutter.plugin.common.EventChannel.StreamHandler; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugin.common.MethodChannel.MethodCallHandler; +import io.flutter.plugin.common.MethodChannel.Result; +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugins.GeneratedPluginRegistrant; + +public class MainActivity extends FlutterActivity { + private static final String BATTERY_CHANNEL = "samples.flutter.io/battery"; + private static final String CHARGING_CHANNEL = "samples.flutter.io/charging"; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + GeneratedPluginRegistrant.registerWith(this); + new EventChannel(getFlutterView(), CHARGING_CHANNEL).setStreamHandler( + new StreamHandler() { + private BroadcastReceiver chargingStateChangeReceiver; + @Override + public void onListen(Object arguments, EventSink events) { + chargingStateChangeReceiver = createChargingStateChangeReceiver(events); + registerReceiver( + chargingStateChangeReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + } + + @Override + public void onCancel(Object arguments) { + unregisterReceiver(chargingStateChangeReceiver); + chargingStateChangeReceiver = null; + } + } + ); + + new MethodChannel(getFlutterView(), BATTERY_CHANNEL).setMethodCallHandler( + new MethodCallHandler() { + @Override + public void onMethodCall(MethodCall call, Result result) { + if (call.method.equals("getBatteryLevel")) { + int batteryLevel = getBatteryLevel(); + + if (batteryLevel != -1) { + result.success(batteryLevel); + } else { + result.error("UNAVAILABLE", "Battery level not available.", null); + } + } else { + result.notImplemented(); + } + } + } + ); + } + + private BroadcastReceiver createChargingStateChangeReceiver(final EventSink events) { + return new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); + + if (status == BatteryManager.BATTERY_STATUS_UNKNOWN) { + events.error("UNAVAILABLE", "Charging status unavailable", null); + } else { + boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || + status == BatteryManager.BATTERY_STATUS_FULL; + events.success(isCharging ? "charging" : "discharging"); + } + } + }; + } + + private int getBatteryLevel() { + if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) { + BatteryManager batteryManager = (BatteryManager) getSystemService(BATTERY_SERVICE); + return batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY); + } else { + Intent intent = new ContextWrapper(getApplicationContext()). + registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + return (intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) * 100) / + intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); + } + } +} diff --git a/examples/platform_channel_swift/android/app/src/main/res/values/strings.xml b/examples/platform_channel_swift/android/app/src/main/res/values/strings.xml new file mode 100644 index 00000000000..e3aeb2f2fbb --- /dev/null +++ b/examples/platform_channel_swift/android/app/src/main/res/values/strings.xml @@ -0,0 +1,5 @@ + + + Platform Channel + Flutter Application + diff --git a/examples/platform_channel_swift/android/build.gradle b/examples/platform_channel_swift/android/build.gradle new file mode 100644 index 00000000000..bb8a303898c --- /dev/null +++ b/examples/platform_channel_swift/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.2.1' + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/examples/platform_channel_swift/android/gradle.properties b/examples/platform_channel_swift/android/gradle.properties new file mode 100644 index 00000000000..8bd86f68051 --- /dev/null +++ b/examples/platform_channel_swift/android/gradle.properties @@ -0,0 +1 @@ +org.gradle.jvmargs=-Xmx1536M diff --git a/examples/platform_channel_swift/android/gradle/wrapper/gradle-wrapper.properties b/examples/platform_channel_swift/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000000..2819f022f1f --- /dev/null +++ b/examples/platform_channel_swift/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip diff --git a/examples/platform_channel_swift/android/settings.gradle b/examples/platform_channel_swift/android/settings.gradle new file mode 100644 index 00000000000..115da6cb4f4 --- /dev/null +++ b/examples/platform_channel_swift/android/settings.gradle @@ -0,0 +1,15 @@ +include ':app' + +def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() + +def plugins = new Properties() +def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') +if (pluginsFile.exists()) { + pluginsFile.withInputStream { stream -> plugins.load(stream) } +} + +plugins.each { name, path -> + def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() + include ":$name" + project(":$name").projectDir = pluginDirectory +} diff --git a/examples/platform_view/ios/Podfile.lock b/examples/platform_view/ios/Podfile.lock index 1d0239cc659..b8ac2f42073 100644 --- a/examples/platform_view/ios/Podfile.lock +++ b/examples/platform_view/ios/Podfile.lock @@ -15,9 +15,9 @@ EXTERNAL SOURCES: :path: ".symlinks/flutter/ios" SPEC CHECKSUMS: - Flutter: 9d0fac939486c9aba2809b7982dfdbb47a7b0296 + Flutter: 58dd7d1b27887414a370fcccb9e645c08ffd7a6a MaterialControls: 1c6b29e78d3a13d8dd6a67ed31b6d26eb5de8f72 -PODFILE CHECKSUM: 4a320bf98e7f7e414d7d7f5079edf1b2d6679c9b +PODFILE CHECKSUM: 80af51c01ee3f0969ddbf2d1f0dcd6f44fad2c52 -COCOAPODS: 1.5.2 +COCOAPODS: 1.7.1 diff --git a/examples/platform_view/ios/Runner.xcodeproj/project.pbxproj b/examples/platform_view/ios/Runner.xcodeproj/project.pbxproj index 6682cd134f7..92a4706708b 100644 --- a/examples/platform_view/ios/Runner.xcodeproj/project.pbxproj +++ b/examples/platform_view/ios/Runner.xcodeproj/project.pbxproj @@ -40,11 +40,13 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 0F803D4F4B1DB3E426346AD7 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 2DAF064A1ED38C2300716BEE /* PlatformViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlatformViewController.h; sourceTree = ""; }; 2DAF064B1ED38C3E00716BEE /* PlatformViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PlatformViewController.m; sourceTree = ""; }; 2DAF064D1ED4224F00716BEE /* ic_add.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ic_add.png; sourceTree = ""; }; + 3036634A71F5F09C1B6453EC /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; 6E6555FD3971FC12A9802782 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -60,6 +62,7 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9D6BF03EDD3895D7B4DA4D7D /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -79,6 +82,9 @@ 5A56E2F315C4CB64895375DA /* Pods */ = { isa = PBXGroup; children = ( + 3036634A71F5F09C1B6453EC /* Pods-Runner.debug.xcconfig */, + 9D6BF03EDD3895D7B4DA4D7D /* Pods-Runner.release.xcconfig */, + 0F803D4F4B1DB3E426346AD7 /* Pods-Runner.profile.xcconfig */, ); name = Pods; sourceTree = ""; @@ -236,7 +242,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { From e3a08d2392478b5fd3795d2be36e157b3b16d6a8 Mon Sep 17 00:00:00 2001 From: Greg Spencer Date: Wed, 10 Jul 2019 08:18:26 -0700 Subject: [PATCH 06/41] Remove reverseDuration from implicitly animated widgets, since it's ignored. (#35785) When I added reverseDuration to animation controllers in #32730, I also added it to the implicit animations that Flutter has. However, as @efortuna pointed out to me, it doesn't actually do anything there, since all of the intrinsic animations run forwards, not in the reverse direction, and there's no way to reverse them. So, this PR removes the reverseDuration argument from the implicit animations to avoid confusion. Fixes #35769 --- .../lib/src/widgets/implicit_animations.dart | 37 +++++-------------- 1 file changed, 9 insertions(+), 28 deletions(-) diff --git a/packages/flutter/lib/src/widgets/implicit_animations.dart b/packages/flutter/lib/src/widgets/implicit_animations.dart index 8360a95c4d7..78da4db41fa 100644 --- a/packages/flutter/lib/src/widgets/implicit_animations.dart +++ b/packages/flutter/lib/src/widgets/implicit_animations.dart @@ -232,7 +232,6 @@ abstract class ImplicitlyAnimatedWidget extends StatefulWidget { Key key, this.curve = Curves.linear, @required this.duration, - this.reverseDuration, }) : assert(curve != null), assert(duration != null), super(key: key); @@ -243,12 +242,6 @@ abstract class ImplicitlyAnimatedWidget extends StatefulWidget { /// The duration over which to animate the parameters of this container. final Duration duration; - /// The duration over which to animate the parameters of this container when - /// the animation is going in the reverse direction. - /// - /// Defaults to [duration] if not specified. - final Duration reverseDuration; - @override ImplicitlyAnimatedWidgetState createState(); @@ -256,7 +249,6 @@ abstract class ImplicitlyAnimatedWidget extends StatefulWidget { void debugFillProperties(DiagnosticPropertiesBuilder properties) { super.debugFillProperties(properties); properties.add(IntProperty('duration', duration.inMilliseconds, unit: 'ms')); - properties.add(IntProperty('reverseDuration', reverseDuration?.inMilliseconds, unit: 'ms', defaultValue: null)); } } @@ -317,7 +309,6 @@ abstract class ImplicitlyAnimatedWidgetState super.initState(); _controller = AnimationController( duration: widget.duration, - reverseDuration: widget.reverseDuration, debugLabel: kDebugMode ? '${widget.toStringShort()}' : null, vsync: this, ); @@ -332,7 +323,6 @@ abstract class ImplicitlyAnimatedWidgetState if (widget.curve != oldWidget.curve) _updateCurve(); _controller.duration = widget.duration; - _controller.reverseDuration = widget.reverseDuration; if (_constructTweens()) { forEachTween((Tween tween, dynamic targetValue, TweenConstructor constructor) { _updateTween(tween, targetValue); @@ -590,7 +580,6 @@ class AnimatedContainer extends ImplicitlyAnimatedWidget { this.child, Curve curve = Curves.linear, @required Duration duration, - Duration reverseDuration, }) : assert(margin == null || margin.isNonNegative), assert(padding == null || padding.isNonNegative), assert(decoration == null || decoration.debugAssertIsValid()), @@ -605,7 +594,7 @@ class AnimatedContainer extends ImplicitlyAnimatedWidget { ? constraints?.tighten(width: width, height: height) ?? BoxConstraints.tightFor(width: width, height: height) : constraints, - super(key: key, curve: curve, duration: duration, reverseDuration: reverseDuration); + super(key: key, curve: curve, duration: duration); /// The [child] contained by the container. /// @@ -747,10 +736,9 @@ class AnimatedPadding extends ImplicitlyAnimatedWidget { this.child, Curve curve = Curves.linear, @required Duration duration, - Duration reverseDuration, }) : assert(padding != null), assert(padding.isNonNegative), - super(key: key, curve: curve, duration: duration, reverseDuration: reverseDuration); + super(key: key, curve: curve, duration: duration); /// The amount of space by which to inset the child. final EdgeInsetsGeometry padding; @@ -819,9 +807,8 @@ class AnimatedAlign extends ImplicitlyAnimatedWidget { this.child, Curve curve = Curves.linear, @required Duration duration, - Duration reverseDuration, }) : assert(alignment != null), - super(key: key, curve: curve, duration: duration, reverseDuration: reverseDuration); + super(key: key, curve: curve, duration: duration); /// How to align the child. /// @@ -920,10 +907,9 @@ class AnimatedPositioned extends ImplicitlyAnimatedWidget { this.height, Curve curve = Curves.linear, @required Duration duration, - Duration reverseDuration, }) : assert(left == null || right == null || width == null), assert(top == null || bottom == null || height == null), - super(key: key, curve: curve, duration: duration, reverseDuration: reverseDuration); + super(key: key, curve: curve, duration: duration); /// Creates a widget that animates the rectangle it occupies implicitly. /// @@ -934,14 +920,13 @@ class AnimatedPositioned extends ImplicitlyAnimatedWidget { Rect rect, Curve curve = Curves.linear, @required Duration duration, - Duration reverseDuration, }) : left = rect.left, top = rect.top, width = rect.width, height = rect.height, right = null, bottom = null, - super(key: key, curve: curve, duration: duration, reverseDuration: reverseDuration); + super(key: key, curve: curve, duration: duration); /// The widget below this widget in the tree. /// @@ -1073,10 +1058,9 @@ class AnimatedPositionedDirectional extends ImplicitlyAnimatedWidget { this.height, Curve curve = Curves.linear, @required Duration duration, - Duration reverseDuration, }) : assert(start == null || end == null || width == null), assert(top == null || bottom == null || height == null), - super(key: key, curve: curve, duration: duration, reverseDuration: reverseDuration); + super(key: key, curve: curve, duration: duration); /// The widget below this widget in the tree. /// @@ -1228,9 +1212,8 @@ class AnimatedOpacity extends ImplicitlyAnimatedWidget { @required this.opacity, Curve curve = Curves.linear, @required Duration duration, - Duration reverseDuration, }) : assert(opacity != null && opacity >= 0.0 && opacity <= 1.0), - super(key: key, curve: curve, duration: duration, reverseDuration: reverseDuration); + super(key: key, curve: curve, duration: duration); /// The widget below this widget in the tree. /// @@ -1304,13 +1287,12 @@ class AnimatedDefaultTextStyle extends ImplicitlyAnimatedWidget { this.maxLines, Curve curve = Curves.linear, @required Duration duration, - Duration reverseDuration, }) : assert(style != null), assert(child != null), assert(softWrap != null), assert(overflow != null), assert(maxLines == null || maxLines > 0), - super(key: key, curve: curve, duration: duration, reverseDuration: reverseDuration); + super(key: key, curve: curve, duration: duration); /// The widget below this widget in the tree. /// @@ -1420,7 +1402,6 @@ class AnimatedPhysicalModel extends ImplicitlyAnimatedWidget { this.animateShadowColor = true, Curve curve = Curves.linear, @required Duration duration, - Duration reverseDuration, }) : assert(child != null), assert(shape != null), assert(clipBehavior != null), @@ -1430,7 +1411,7 @@ class AnimatedPhysicalModel extends ImplicitlyAnimatedWidget { assert(shadowColor != null), assert(animateColor != null), assert(animateShadowColor != null), - super(key: key, curve: curve, duration: duration, reverseDuration: reverseDuration); + super(key: key, curve: curve, duration: duration); /// The widget below this widget in the tree. /// From 2b20345bb8dc6d12ad431303c257a1041ba5d472 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Wed, 10 Jul 2019 08:48:01 -0700 Subject: [PATCH 07/41] use pub run for create test and remove [INFO] logs (#35839) --- dev/bots/run_command.dart | 10 ++++++++-- dev/bots/test.dart | 8 ++++++-- packages/flutter_tools/dart_test.yaml | 5 +++++ 3 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 packages/flutter_tools/dart_test.yaml diff --git a/dev/bots/run_command.dart b/dev/bots/run_command.dart index c97a08136dc..83cf52ae7be 100644 --- a/dev/bots/run_command.dart +++ b/dev/bots/run_command.dart @@ -87,6 +87,7 @@ Future runCommand(String executable, List arguments, { bool skip = false, bool expectFlaky = false, Duration timeout = _kLongTimeout, + bool Function(String) removeLine, }) async { final String commandDescription = '${path.relative(executable, from: workingDirectory)} ${arguments.join(' ')}'; final String relativeWorkingDir = path.relative(workingDirectory); @@ -103,13 +104,18 @@ Future runCommand(String executable, List arguments, { ); Future>> savedStdout, savedStderr; + final Stream> stdoutSource = process.stdout + .transform(const Utf8Decoder()) + .transform(const LineSplitter()) + .where((String line) => removeLine == null || !removeLine(line)) + .transform(const Utf8Encoder()); if (printOutput) { await Future.wait(>[ - stdout.addStream(process.stdout), + stdout.addStream(stdoutSource), stderr.addStream(process.stderr), ]); } else { - savedStdout = process.stdout.toList(); + savedStdout = stdoutSource.toList(); savedStderr = process.stderr.toList(); } diff --git a/dev/bots/test.dart b/dev/bots/test.dart index 19256fcdb4e..fc739f1a96d 100644 --- a/dev/bots/test.dart +++ b/dev/bots/test.dart @@ -240,7 +240,8 @@ Future _runToolTests() async { File(path.join(flutterRoot, 'bin', 'cache', 'flutter_tools.snapshot')).deleteSync(); File(path.join(flutterRoot, 'bin', 'cache', 'flutter_tools.stamp')).deleteSync(); } - if (noUseBuildRunner) { + // reduce overhead of build_runner in the create case. + if (noUseBuildRunner || Platform.environment['SUBSHARD'] == 'create') { await _pubRunTest( path.join(flutterRoot, 'packages', 'flutter_tools'), tableData: bigqueryApi?.tabledata, @@ -591,6 +592,9 @@ Future _pubRunTest( case 'tool': args.addAll(['--exclude-tags', 'integration']); break; + case 'create': + args.addAll([path.join('test', 'commands', 'create_test.dart')]); + break; } if (useFlutterTestFormatter) { @@ -606,7 +610,7 @@ Future _pubRunTest( await runCommand( pub, args, - workingDirectory:workingDirectory, + workingDirectory: workingDirectory, ); } } diff --git a/packages/flutter_tools/dart_test.yaml b/packages/flutter_tools/dart_test.yaml new file mode 100644 index 00000000000..cd8c697cba8 --- /dev/null +++ b/packages/flutter_tools/dart_test.yaml @@ -0,0 +1,5 @@ +tags: + "no_coverage": + "create": + "integration": + From e7ef75680ece2afde363f39a2f218574aada104d Mon Sep 17 00:00:00 2001 From: Shi-Hao Hong Date: Wed, 10 Jul 2019 08:50:24 -0700 Subject: [PATCH 08/41] Update Dark Theme disabledColor to White38 (#35136) * Add Colors.white38 * Update ThemeData.disabledColor and ButtonThemeData.disabledColor to Colors.white38 * Update pre-existing tests to expect Colors.white38 instead of Colors.white30 * Update API documentation to reflect these changes --- examples/stocks/test/icon_color_test.dart | 2 +- .../lib/src/material/button_theme.dart | 14 +++------ packages/flutter/lib/src/material/colors.dart | 30 +++++++++++++------ .../flutter/lib/src/material/data_table.dart | 2 +- .../flutter/lib/src/material/expand_icon.dart | 2 +- .../flutter/lib/src/material/stepper.dart | 2 +- .../flutter/lib/src/material/theme_data.dart | 2 +- .../test/material/expand_icon_test.dart | 2 +- 8 files changed, 31 insertions(+), 25 deletions(-) diff --git a/examples/stocks/test/icon_color_test.dart b/examples/stocks/test/icon_color_test.dart index 5dedeb4a7f8..b36b214ae47 100644 --- a/examples/stocks/test/icon_color_test.dart +++ b/examples/stocks/test/icon_color_test.dart @@ -85,7 +85,7 @@ void main() { // check the color of the icon - dark mode checkIconColor(tester, 'Stock List', Colors.redAccent); // theme accent color - checkIconColor(tester, 'Account Balance', Colors.white30); // disabled + checkIconColor(tester, 'Account Balance', Colors.white38); // disabled checkIconColor(tester, 'About', Colors.white); // enabled }); } diff --git a/packages/flutter/lib/src/material/button_theme.dart b/packages/flutter/lib/src/material/button_theme.dart index 742f9e2b9c1..0102034a1c4 100644 --- a/packages/flutter/lib/src/material/button_theme.dart +++ b/packages/flutter/lib/src/material/button_theme.dart @@ -468,18 +468,12 @@ class ButtonThemeData extends Diagnosticable { return button.textTheme ?? textTheme; } - Color _getDisabledColor(MaterialButton button) { - return getBrightness(button) == Brightness.dark - ? colorScheme.onSurface.withOpacity(0.30) // default == Colors.white30 - : colorScheme.onSurface.withOpacity(0.38); // default == Colors.black38; - } - /// The foreground color of the [button]'s text and icon when /// [MaterialButton.onPressed] is null (when MaterialButton.enabled is false). /// /// Returns the button's [MaterialButton.disabledColor] if it is non-null. /// Otherwise the color scheme's [ColorScheme.onSurface] color is returned - /// with its opacity set to 0.30 if [getBrightness] is dark, 0.38 otherwise. + /// with its opacity set to 0.38. /// /// If [MaterialButton.textColor] is a [MaterialStateProperty], it will be /// used as the `disabledTextColor`. It will be resolved in the [MaterialState.disabled] state. @@ -488,7 +482,7 @@ class ButtonThemeData extends Diagnosticable { return button.textColor; if (button.disabledTextColor != null) return button.disabledTextColor; - return _getDisabledColor(button); + return colorScheme.onSurface.withOpacity(0.38); } /// The [button]'s background color when [MaterialButton.onPressed] is null @@ -500,13 +494,13 @@ class ButtonThemeData extends Diagnosticable { /// is returned, if it is non-null. /// /// Otherwise the color scheme's [ColorScheme.onSurface] color is returned - /// with its opacity set to 0.3 if [getBrightness] is dark, 0.38 otherwise. + /// with its opacity set to 0.38. Color getDisabledFillColor(MaterialButton button) { if (button.disabledColor != null) return button.disabledColor; if (_disabledColor != null) return _disabledColor; - return _getDisabledColor(button); + return colorScheme.onSurface.withOpacity(0.38); } /// The button's background fill color or null for buttons that don't have diff --git a/packages/flutter/lib/src/material/colors.dart b/packages/flutter/lib/src/material/colors.dart index 7f2131d6c0b..6c2fbd75cd4 100644 --- a/packages/flutter/lib/src/material/colors.dart +++ b/packages/flutter/lib/src/material/colors.dart @@ -303,7 +303,7 @@ class Colors { /// * [Typography.white], which uses this color for its text styles. /// * [Theme.of], which allows you to select colors from the current theme /// rather than hard-coding colors in your build methods. - /// * [white70, white60, white54, white30, white12, white10], which are variants on this color + /// * [white70, white60, white54, white38, white30, white12, white10], which are variants on this color /// but with different opacities. /// * [black], a solid black color. /// * [transparent], a fully-transparent color. @@ -320,7 +320,7 @@ class Colors { /// * [Typography.white], which uses this color for its text styles. /// * [Theme.of], which allows you to select colors from the current theme /// rather than hard-coding colors in your build methods. - /// * [white, white60, white54, white30, white12, white10], which are variants on this color + /// * [white, white60, white54, white38, white30, white12, white10], which are variants on this color /// but with different opacities. static const Color white70 = Color(0xB3FFFFFF); @@ -336,7 +336,7 @@ class Colors { /// * [ExpandIcon], which uses this color for dark themes. /// * [Theme.of], which allows you to select colors from the current theme /// rather than hard-coding colors in your build methods. - /// * [white, white54, white30, white12, white10], which are variants on this color + /// * [white, white54, white30, white38, white12, white10], which are variants on this color /// but with different opacities. static const Color white60 = Color(0x99FFFFFF); @@ -348,11 +348,11 @@ class Colors { /// /// * [Theme.of], which allows you to select colors from the current theme /// rather than hard-coding colors in your build methods. - /// * [white, white60, white30, white12, white10], which are variants on this color + /// * [white, white60, white38, white30, white12, white10], which are variants on this color /// but with different opacities. static const Color white54 = Color(0x8AFFFFFF); - /// White with 30% opacity. + /// White with 38% opacity. /// /// Used for disabled radio buttons and the text of disabled flat buttons in dark themes. /// @@ -363,7 +363,19 @@ class Colors { /// * [ThemeData.disabledColor], which uses this color by default in dark themes. /// * [Theme.of], which allows you to select colors from the current theme /// rather than hard-coding colors in your build methods. - /// * [white, white60, white54, white70, white12, white10], which are variants on this color + /// * [white, white60, white54, white70, white30, white12, white10], which are variants on this color + /// but with different opacities. + static const Color white38 = Color(0x62FFFFFF); + + /// White with 30% opacity. + /// + /// ![](https://flutter.github.io/assets-for-api-docs/assets/material/Colors.whites.png) + /// + /// See also: + /// + /// * [Theme.of], which allows you to select colors from the current theme + /// rather than hard-coding colors in your build methods. + /// * [white, white60, white54, white70, white38, white12, white10], which are variants on this color /// but with different opacities. static const Color white30 = Color(0x4DFFFFFF); @@ -375,7 +387,7 @@ class Colors { /// /// See also: /// - /// * [white, white60, white54, white70, white30, white10], which are variants on this color + /// * [white, white60, white54, white70, white38, white30, white10], which are variants on this color /// but with different opacities. static const Color white24 = Color(0x3DFFFFFF); @@ -387,7 +399,7 @@ class Colors { /// /// See also: /// - /// * [white, white60, white54, white70, white30, white10], which are variants on this color + /// * [white, white60, white54, white70, white38, white30, white10], which are variants on this color /// but with different opacities. static const Color white12 = Color(0x1FFFFFFF); @@ -397,7 +409,7 @@ class Colors { /// /// See also: /// - /// * [white, white60, white54, white70, white30, white12], which are variants on this color + /// * [white, white60, white54, white70, white38, white30, white12], which are variants on this color /// but with different opacities. /// * [transparent], a fully-transparent color, not far from this one. static const Color white10 = Color(0x1AFFFFFF); diff --git a/packages/flutter/lib/src/material/data_table.dart b/packages/flutter/lib/src/material/data_table.dart index 47ad31fce06..60822095313 100644 --- a/packages/flutter/lib/src/material/data_table.dart +++ b/packages/flutter/lib/src/material/data_table.dart @@ -505,7 +505,7 @@ class DataTable extends StatelessWidget { fontSize: 13.0, color: isLightTheme ? (placeholder ? Colors.black38 : Colors.black87) - : (placeholder ? Colors.white30 : Colors.white70), + : (placeholder ? Colors.white38 : Colors.white70), ), child: IconTheme.merge( data: IconThemeData( diff --git a/packages/flutter/lib/src/material/expand_icon.dart b/packages/flutter/lib/src/material/expand_icon.dart index 6f6e52f464c..488f3df38d8 100644 --- a/packages/flutter/lib/src/material/expand_icon.dart +++ b/packages/flutter/lib/src/material/expand_icon.dart @@ -81,7 +81,7 @@ class ExpandIcon extends StatefulWidget { /// /// Defaults to [Colors.black38] when the theme's /// [ThemeData.brightness] is [Brightness.light] and to - /// [Colors.white30] when it is [Brightness.dark]. This adheres to the + /// [Colors.white38] when it is [Brightness.dark]. This adheres to the /// Material Design specifications for [icons](https://material.io/design/iconography/system-icons.html#color) /// and for [dark theme](https://material.io/design/color/dark-theme.html#ui-application) final Color disabledColor; diff --git a/packages/flutter/lib/src/material/stepper.dart b/packages/flutter/lib/src/material/stepper.dart index 291c445d924..a63a7dada9c 100644 --- a/packages/flutter/lib/src/material/stepper.dart +++ b/packages/flutter/lib/src/material/stepper.dart @@ -62,7 +62,7 @@ final Color _kErrorDark = Colors.red.shade400; const Color _kCircleActiveLight = Colors.white; const Color _kCircleActiveDark = Colors.black87; const Color _kDisabledLight = Colors.black38; -const Color _kDisabledDark = Colors.white30; +const Color _kDisabledDark = Colors.white38; const double _kStepSize = 24.0; const double _kTriangleHeight = _kStepSize * 0.866025; // Triangle height. sqrt(3.0) / 2.0 diff --git a/packages/flutter/lib/src/material/theme_data.dart b/packages/flutter/lib/src/material/theme_data.dart index 62cb7a53ac3..53dc55883c7 100644 --- a/packages/flutter/lib/src/material/theme_data.dart +++ b/packages/flutter/lib/src/material/theme_data.dart @@ -249,7 +249,7 @@ class ThemeData extends Diagnosticable { splashColor: splashColor, materialTapTargetSize: materialTapTargetSize, ); - disabledColor ??= isDark ? Colors.white30 : Colors.black38; + disabledColor ??= isDark ? Colors.white38 : Colors.black38; highlightColor ??= isDark ? _kDarkThemeHighlightColor : _kLightThemeHighlightColor; splashColor ??= isDark ? _kDarkThemeSplashColor : _kLightThemeSplashColor; diff --git a/packages/flutter/test/material/expand_icon_test.dart b/packages/flutter/test/material/expand_icon_test.dart index 16dc6de25d0..9cf2b6200e0 100644 --- a/packages/flutter/test/material/expand_icon_test.dart +++ b/packages/flutter/test/material/expand_icon_test.dart @@ -92,7 +92,7 @@ void main() { await tester.pumpAndSettle(); iconTheme = tester.firstWidget(find.byType(IconTheme).last); - expect(iconTheme.data.color, equals(Colors.white30)); + expect(iconTheme.data.color, equals(Colors.white38)); }); testWidgets('ExpandIcon test isExpanded does not trigger callback', (WidgetTester tester) async { From ec2c3f2116197a3e6ad8d092e905144843256ef7 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Wed, 10 Jul 2019 10:40:15 -0700 Subject: [PATCH 09/41] Disable CocoaPods input and output paths in Xcode build phase for ephemeral add2app (#35833) --- .../module/ios/host_app_ephemeral_cocoapods/Podfile.copy.tmpl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral_cocoapods/Podfile.copy.tmpl b/packages/flutter_tools/templates/module/ios/host_app_ephemeral_cocoapods/Podfile.copy.tmpl index 3457cfd81b3..b2b9a405b6d 100644 --- a/packages/flutter_tools/templates/module/ios/host_app_ephemeral_cocoapods/Podfile.copy.tmpl +++ b/packages/flutter_tools/templates/module/ios/host_app_ephemeral_cocoapods/Podfile.copy.tmpl @@ -4,3 +4,6 @@ target 'Runner' do flutter_application_path = '../' eval(File.read(File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')), binding) end + +# Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system. +install! 'cocoapods', :disable_input_output_paths => true From 176ebfd53e3ca9a63ca3a99ff198a529d2513db3 Mon Sep 17 00:00:00 2001 From: Ian Hickson Date: Wed, 10 Jul 2019 12:10:28 -0700 Subject: [PATCH 10/41] flutter/tests support (#33140) This introduces a script that implements the conventions described in https://github.com/flutter/tests/pull/1. --- .cirrus.yml | 127 +++++---- dev/automated_tests/pubspec.yaml | 6 +- dev/benchmarks/complex_layout/pubspec.yaml | 6 +- dev/benchmarks/macrobenchmarks/pubspec.yaml | 6 +- dev/benchmarks/microbenchmarks/pubspec.yaml | 8 +- dev/bots/pubspec.yaml | 8 +- dev/customer_testing/pubspec.yaml | 20 ++ dev/customer_testing/run_tests.dart | 263 ++++++++++++++++++ dev/devicelab/pubspec.yaml | 6 +- .../android_semantics_testing/pubspec.yaml | 6 +- .../android_views/pubspec.yaml | 8 +- dev/integration_tests/channels/pubspec.yaml | 6 +- dev/integration_tests/codegen/pubspec.yaml | 6 +- .../external_ui/pubspec.yaml | 6 +- dev/integration_tests/flavors/pubspec.yaml | 6 +- .../image_loading/pubspec.yaml | 6 +- .../platform_interaction/pubspec.yaml | 6 +- .../simple_codegen/pubspec.yaml | 4 +- dev/integration_tests/ui/pubspec.yaml | 6 +- dev/snippets/pubspec.yaml | 8 +- examples/catalog/pubspec.yaml | 6 +- examples/flutter_gallery/pubspec.yaml | 8 +- examples/platform_channel/pubspec.yaml | 6 +- examples/platform_channel_swift/pubspec.yaml | 4 +- examples/stocks/pubspec.yaml | 8 +- packages/flutter_driver/pubspec.yaml | 4 +- packages/flutter_tools/pubspec.yaml | 16 +- .../pubspec.yaml | 4 +- 28 files changed, 445 insertions(+), 129 deletions(-) create mode 100644 dev/customer_testing/pubspec.yaml create mode 100644 dev/customer_testing/run_tests.dart diff --git a/.cirrus.yml b/.cirrus.yml index 69d6f3a088d..204112cec3d 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -219,7 +219,11 @@ task: - ./dev/bots/firebase_testlab.sh - export CIRRUS_CHANGE_MESSAGE=`cat /tmp/cirrus_change_message.txt` - export CIRRUS_COMMIT_MESSAGE=`cat /tmp/cirrus_commit_message.txt` - + - name: customer_testing-linux + script: + - rm -rf bin/cache/pkg/tests + - git clone https://github.com/flutter/tests.git bin/cache/pkg/tests + - dart --enable-asserts dev/customer_testing/run_tests.dart --skip-on-fetch-failure --skip-template bin/cache/pkg/tests/registry/*.test task: use_compute_credits: $CIRRUS_USER_COLLABORATOR == 'true' && $CIRRUS_PR == '' @@ -229,6 +233,7 @@ task: cpu: 4 env: CIRRUS_WORKING_DIR: "C:\\Windows\\Temp\\flutter sdk" + PATH: "$CIRRUS_WORKING_DIR/bin;$CIRRUS_WORKING_DIR/bin/cache/dart-sdk/bin;$PATH" git_fetch_script: - git clean -xfd - git fetch origin @@ -244,12 +249,12 @@ task: folder: bin\cache\artifacts fingerprint_script: echo %OS% & type bin\internal\engine.version setup_script: - - bin\flutter.bat config --no-analytics - - bin\flutter.bat doctor -v - - bin\flutter.bat update-packages + - flutter config --no-analytics + - flutter doctor -v + - flutter update-packages - git fetch origin master test_all_script: - - bin\cache\dart-sdk\bin\dart.exe --enable-asserts dev\bots\test.dart + - dart --enable-asserts dev\bots\test.dart matrix: # all of the tests except test/integration and test/commands/create_test for packages/flutter_tools - name: tool_tests-windows @@ -279,6 +284,7 @@ task: cpu: 4 env: CIRRUS_WORKING_DIR: "C:\\Windows\\Temp\\flutter sdk" + PATH: "$CIRRUS_WORKING_DIR/bin;$CIRRUS_WORKING_DIR/bin/cache/dart-sdk/bin;$PATH" git_fetch_script: - git clean -xfd - git fetch origin @@ -294,40 +300,53 @@ task: folder: bin\cache\artifacts fingerprint_script: echo %OS% & type bin\internal\engine.version setup_script: - - bin\flutter.bat config --no-analytics - - bin\flutter.bat doctor -v - - bin\flutter.bat update-packages + - flutter config --no-analytics + - flutter doctor -v + - flutter update-packages - git fetch origin master - test_all_script: - - bin\cache\dart-sdk\bin\dart.exe --enable-asserts dev\bots\test.dart matrix: - name: tests_widgets-windows env: GCLOUD_SERVICE_ACCOUNT_KEY: ENCRYPTED[f12abe60f5045d619ef4c79b83dd1e0722a0b0b13dbea95fbe334e2db7fffbcd841a5a92da8824848b539a19afe0c9fb] SHARD: tests SUBSHARD: widgets + test_all_script: + - dart --enable-asserts dev\bots\test.dart - name: tests_framework_other-windows env: GCLOUD_SERVICE_ACCOUNT_KEY: ENCRYPTED[f12abe60f5045d619ef4c79b83dd1e0722a0b0b13dbea95fbe334e2db7fffbcd841a5a92da8824848b539a19afe0c9fb] SHARD: tests SUBSHARD: framework_other + test_all_script: + - dart --enable-asserts dev\bots\test.dart - name: tests_extras-windows env: GCLOUD_SERVICE_ACCOUNT_KEY: ENCRYPTED[f12abe60f5045d619ef4c79b83dd1e0722a0b0b13dbea95fbe334e2db7fffbcd841a5a92da8824848b539a19afe0c9fb] SHARD: tests SUBSHARD: extras + test_all_script: + - dart --enable-asserts dev\bots\test.dart - name: build_tests-windows env: SHARD: build_tests container: cpu: 4 memory: 12G + test_all_script: + - dart --enable-asserts dev\bots\test.dart - name: integration_tests-windows env: SHARD: integration_tests container: cpu: 4 memory: 12G + test_all_script: + - dart --enable-asserts dev\bots\test.dart + - name: customer_testing-windows + test_script: + - CMD /S /C "IF EXIST "bin\cache\pkg\tests\" RMDIR /S /Q bin\cache\pkg\tests" + - git clone https://github.com/flutter/tests.git bin\cache\pkg\tests + - dart --enable-asserts dev\customer_testing\run_tests.dart --skip-on-fetch-failure --skip-template bin/cache/pkg/tests/registry/*.test task: use_compute_credits: $CIRRUS_USER_COLLABORATOR == 'true' @@ -395,9 +414,9 @@ task: - bin/flutter config --no-analytics - bin/flutter doctor -v - bin/flutter update-packages - test_all_script: | - ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976 - bin/cache/dart-sdk/bin/dart --enable-asserts dev/bots/test.dart + test_all_script: + - ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976 + - bin/cache/dart-sdk/bin/dart --enable-asserts dev/bots/test.dart matrix: # all of the tests except test/integration and test/commands/create_test for packages/flutter_tools - name: tool_tests-macos @@ -428,37 +447,7 @@ task: env: CIRRUS_WORKING_DIR: "/tmp/flutter sdk" COCOAPODS_DISABLE_STATS: true - matrix: - - name: tests_widgets-macos - env: - GCLOUD_SERVICE_ACCOUNT_KEY: ENCRYPTED[f12abe60f5045d619ef4c79b83dd1e0722a0b0b13dbea95fbe334e2db7fffbcd841a5a92da8824848b539a19afe0c9fb] - SHARD: tests - SUBSHARD: widgets - - name: tests_framework_other-macos - env: - GCLOUD_SERVICE_ACCOUNT_KEY: ENCRYPTED[f12abe60f5045d619ef4c79b83dd1e0722a0b0b13dbea95fbe334e2db7fffbcd841a5a92da8824848b539a19afe0c9fb] - SHARD: tests - SUBSHARD: framework_other - - name: tests_extras-macos - env: - GCLOUD_SERVICE_ACCOUNT_KEY: ENCRYPTED[f12abe60f5045d619ef4c79b83dd1e0722a0b0b13dbea95fbe334e2db7fffbcd841a5a92da8824848b539a19afe0c9fb] - SHARD: tests - SUBSHARD: extras - - name: $SHARD-macos - env: - matrix: - # The flakiness of this target has increased beyond tolerable levels. Until we can stabilize it, - # keep the shard disabled. - # - SHARD: integration_tests - - SHARD: build_tests - COCOAPODS_DISABLE_STATS: true - FLUTTER_FRAMEWORK_DIR: "/tmp/flutter sdk/bin/cache/artifacts/engine/ios/" - osx_instance: - image: mojave-flutter - remove_preinstalled_fluuter_script: rm -rf $FLUTTER_HOME - - name: add2app-macos - env: - SHARD: add2app_test + PATH: "$CIRRUS_WORKING_DIR/bin:$CIRRUS_WORKING_DIR/bin/cache/dart-sdk/bin:$PATH" # occasionally the clock on these machines is out of sync # with the actual time - this should help to verify print_date_script: @@ -482,9 +471,53 @@ task: - bin/flutter config --no-analytics - bin/flutter doctor -v - bin/flutter update-packages - test_all_script: | - ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976 - bin/cache/dart-sdk/bin/dart --enable-asserts dev/bots/test.dart + matrix: + - name: tests_widgets-macos + env: + GCLOUD_SERVICE_ACCOUNT_KEY: ENCRYPTED[f12abe60f5045d619ef4c79b83dd1e0722a0b0b13dbea95fbe334e2db7fffbcd841a5a92da8824848b539a19afe0c9fb] + SHARD: tests + SUBSHARD: widgets + test_all_script: + - ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976 + - dart --enable-asserts dev/bots/test.dart + - name: tests_framework_other-macos + env: + GCLOUD_SERVICE_ACCOUNT_KEY: ENCRYPTED[f12abe60f5045d619ef4c79b83dd1e0722a0b0b13dbea95fbe334e2db7fffbcd841a5a92da8824848b539a19afe0c9fb] + SHARD: tests + SUBSHARD: framework_other + test_all_script: + - ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976 + - dart --enable-asserts dev/bots/test.dart + - name: tests_extras-macos + env: + GCLOUD_SERVICE_ACCOUNT_KEY: ENCRYPTED[f12abe60f5045d619ef4c79b83dd1e0722a0b0b13dbea95fbe334e2db7fffbcd841a5a92da8824848b539a19afe0c9fb] + SHARD: tests + SUBSHARD: extras + test_all_script: + - ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976 + - dart --enable-asserts dev/bots/test.dart + - name: build_tests-macos + env: + SHARD: build_tests # we should also enable integration_tests at some point, but it's too flaky right now + COCOAPODS_DISABLE_STATS: true + FLUTTER_FRAMEWORK_DIR: "/tmp/flutter sdk/bin/cache/artifacts/engine/ios/" + osx_instance: + image: mojave-flutter + remove_preinstalled_flutter_script: rm -rf $FLUTTER_HOME + test_all_script: + - ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976 + - dart --enable-asserts dev/bots/test.dart + - name: add2app-macos + env: + SHARD: add2app_test + test_all_script: + - ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976 + - dart --enable-asserts dev/bots/test.dart + - name: customer_testing-macos + test_script: + - rm -rf bin/cache/pkg/tests + - git clone https://github.com/flutter/tests.git bin/cache/pkg/tests + - dart --enable-asserts dev/customer_testing/run_tests.dart --skip-on-fetch-failure --skip-template bin/cache/pkg/tests/registry/*.test docker_builder: # Only build a new docker image when we tag a release (for dev, beta, or release.) diff --git a/dev/automated_tests/pubspec.yaml b/dev/automated_tests/pubspec.yaml index e663cf8c24b..12a9096f7d4 100644 --- a/dev/automated_tests/pubspec.yaml +++ b/dev/automated_tests/pubspec.yaml @@ -19,7 +19,7 @@ dependencies: collection: 1.14.11 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - csslib: 0.16.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" html: 0.14.0+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -59,10 +59,10 @@ dependencies: vector_math: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" watcher: 0.9.7+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - web_socket_channel: 1.0.13 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + web_socket_channel: 1.0.14 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" yaml: 2.1.16 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 6e23 +# PUBSPEC CHECKSUM: 4625 diff --git a/dev/benchmarks/complex_layout/pubspec.yaml b/dev/benchmarks/complex_layout/pubspec.yaml index 865f34a6195..c70f16dfe9e 100644 --- a/dev/benchmarks/complex_layout/pubspec.yaml +++ b/dev/benchmarks/complex_layout/pubspec.yaml @@ -35,7 +35,7 @@ dependencies: typed_data: 1.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" vector_math: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - web_socket_channel: 1.0.13 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + web_socket_channel: 1.0.14 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" dev_dependencies: flutter_test: @@ -45,7 +45,7 @@ dev_dependencies: analyzer: 0.36.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" args: 1.5.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - csslib: 0.16.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" html: 0.14.0+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -82,4 +82,4 @@ flutter: - packages/flutter_gallery_assets/people/square/ali.png - packages/flutter_gallery_assets/places/india_chettinad_silk_maker.png -# PUBSPEC CHECKSUM: 3eb2 +# PUBSPEC CHECKSUM: 86b4 diff --git a/dev/benchmarks/macrobenchmarks/pubspec.yaml b/dev/benchmarks/macrobenchmarks/pubspec.yaml index 842f7cc6031..e5d0613357b 100644 --- a/dev/benchmarks/macrobenchmarks/pubspec.yaml +++ b/dev/benchmarks/macrobenchmarks/pubspec.yaml @@ -35,7 +35,7 @@ dependencies: typed_data: 1.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" vector_math: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - web_socket_channel: 1.0.13 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + web_socket_channel: 1.0.14 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" dev_dependencies: flutter_test: @@ -45,7 +45,7 @@ dev_dependencies: analyzer: 0.36.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" args: 1.5.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - csslib: 0.16.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" html: 0.14.0+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -79,4 +79,4 @@ dev_dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 3eb2 +# PUBSPEC CHECKSUM: 86b4 diff --git a/dev/benchmarks/microbenchmarks/pubspec.yaml b/dev/benchmarks/microbenchmarks/pubspec.yaml index e8c6564675c..42e71f6c755 100644 --- a/dev/benchmarks/microbenchmarks/pubspec.yaml +++ b/dev/benchmarks/microbenchmarks/pubspec.yaml @@ -23,8 +23,8 @@ dependencies: collection: 1.14.11 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - csslib: 0.16.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - dart_style: 1.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + dart_style: 1.2.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" html: 0.14.0+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -67,10 +67,10 @@ dependencies: vector_math: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" watcher: 0.9.7+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - web_socket_channel: 1.0.13 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + web_socket_channel: 1.0.14 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" yaml: 2.1.16 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 1f87 +# PUBSPEC CHECKSUM: e88a diff --git a/dev/bots/pubspec.yaml b/dev/bots/pubspec.yaml index 35d0193d074..152eaf0d536 100644 --- a/dev/bots/pubspec.yaml +++ b/dev/bots/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: http: 0.12.0+2 http_parser: 3.1.3 test: 1.6.3 - googleapis: 0.53.0 + googleapis: 0.54.0 googleapis_auth: 0.2.8 _discoveryapis_commons: 0.1.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -25,7 +25,7 @@ dependencies: collection: 1.14.11 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - csslib: 0.16.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -60,11 +60,11 @@ dependencies: typed_data: 1.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" watcher: 0.9.7+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - web_socket_channel: 1.0.13 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + web_socket_channel: 1.0.14 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" yaml: 2.1.16 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" dev_dependencies: mockito: 4.1.0 test_api: 0.2.5 -# PUBSPEC CHECKSUM: ca5a +# PUBSPEC CHECKSUM: 245d diff --git a/dev/customer_testing/pubspec.yaml b/dev/customer_testing/pubspec.yaml new file mode 100644 index 00000000000..5fd49f885f4 --- /dev/null +++ b/dev/customer_testing/pubspec.yaml @@ -0,0 +1,20 @@ +name: customer_testing +description: Tool to run the tests listed in the flutter/tests repository. + +environment: + sdk: any + +dependencies: + args: 1.5.2 + path: 1.6.2 + glob: 1.1.7 + meta: 1.1.6 + + async: 2.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + collection: 1.14.11 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + source_span: 1.5.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + string_scanner: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + term_glyph: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + +# PUBSPEC CHECKSUM: f971 diff --git a/dev/customer_testing/run_tests.dart b/dev/customer_testing/run_tests.dart new file mode 100644 index 00000000000..9d0b62ea7d3 --- /dev/null +++ b/dev/customer_testing/run_tests.dart @@ -0,0 +1,263 @@ +// Copyright 2017 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:convert'; +import 'dart:io'; + +import 'package:args/args.dart'; +import 'package:glob/glob.dart'; +import 'package:meta/meta.dart'; +import 'package:path/path.dart' as path; + +Future main(List arguments) async { + exit(await run(arguments) ? 0 : 1); +} + +Future run(List arguments) async { + final ArgParser argParser = ArgParser( + allowTrailingOptions: false, + usageLineLength: 72, + ) + ..addOption( + 'repeat', + defaultsTo: '1', + help: 'How many times to run each test. Set to a high value to look for flakes.', + valueHelp: 'count', + ) + ..addFlag( + 'skip-on-fetch-failure', + defaultsTo: false, + help: 'Whether to skip tests that we fail to download.', + ) + ..addFlag( + 'skip-template', + defaultsTo: false, + help: 'Whether to skip tests named "template.test".', + ) + ..addFlag( + 'verbose', + defaultsTo: false, + help: 'Describe what is happening in detail.', + ) + ..addFlag( + 'help', + defaultsTo: false, + negatable: false, + help: 'Print this help message.', + ); + + final ArgResults parsedArguments = argParser.parse(arguments); + + final int repeat = int.tryParse(parsedArguments['repeat']); + final bool skipOnFetchFailure = parsedArguments['skip-on-fetch-failure']; + final bool skipTemplate = parsedArguments['skip-template']; + final bool verbose = parsedArguments['verbose']; + final bool help = parsedArguments['help']; + final List files = parsedArguments + .rest + .expand((String path) => Glob(path).listSync()) + .whereType() + .where((File file) => !skipTemplate || path.basename(file.path) != 'template.test') + .toList(); + + if (help || repeat == null || files.isEmpty) { + print('run_tests.dart [options...] path/to/file1.test path/to/file2.test...'); + print('For details on the test registry format, see:'); + print(' https://github.com/flutter/tests/blob/master/registry/template.test'); + print(''); + print(argParser.usage); + print(''); + return help; + } + + if (verbose) + print('Starting run_tests.dart...'); + + int failures = 0; + + if (verbose) { + final String s = files.length == 1 ? '' : 's'; + print('${files.length} file$s specified.'); + print(''); + } + + for (File file in files) { + if (verbose) + print('Processing ${file.path}...'); + TestFile instructions; + try { + instructions = TestFile(file); + } on FormatException catch (error) { + print('ERROR: ${error.message}'); + print(''); + failures += 1; + continue; + } on FileSystemException catch (error) { + print('ERROR: ${error.message}'); + print(' ${file.path}'); + print(''); + failures += 1; + continue; + } + + final Directory checkout = Directory.systemTemp.createTempSync('flutter_customer_testing.${path.basenameWithoutExtension(file.path)}.'); + if (verbose) + print('Created temporary directory: ${checkout.path}'); + try { + bool success; + bool showContacts = false; + for (String fetchCommand in instructions.fetch) { + success = await shell(fetchCommand, checkout, verbose: verbose, silentFailure: skipOnFetchFailure); + if (!success) { + if (skipOnFetchFailure) { + if (verbose) { + print('Skipping (fetch failed).'); + } else { + print('Skipping ${file.path} (fetch failed).'); + } + } else { + print('ERROR: Failed to fetch repository.'); + failures += 1; + showContacts = true; + } + break; + } + } + assert(success != null); + if (success) { + if (verbose) + print('Running tests...'); + final Directory tests = Directory(path.join(checkout.path, 'tests')); + // TODO(ianh): Once we have a way to update source code, run that command in each directory of instructions.update + for (int iteration = 0; iteration < repeat; iteration += 1) { + if (verbose && repeat > 1) + print('Round ${iteration + 1} of $repeat.'); + for (String testCommand in instructions.tests) { + success = await shell(testCommand, tests, verbose: verbose); + if (!success) { + print('ERROR: One or more tests from ${path.basenameWithoutExtension(file.path)} failed.'); + failures += 1; + showContacts = true; + break; + } + } + } + if (verbose && success) + print('Tests finished.'); + } + if (showContacts) { + final String s = instructions.contacts.length == 1 ? '' : 's'; + print('Contact$s: ${instructions.contacts.join(", ")}'); + } + } finally { + if (verbose) + print('Deleting temporary directory...'); + checkout.deleteSync(recursive: true); + } + if (verbose) + print(''); + } + if (failures > 0) { + final String s = failures == 1 ? '' : 's'; + print('$failures failure$s.'); + return false; + } + if (verbose) { + print('All tests passed!'); + } + return true; +} + +@immutable +class TestFile { + factory TestFile(File file) { + final String errorPrefix = 'Could not parse: ${file.path}\n'; + final List contacts = []; + final List fetch = []; + final List update = []; + final List test = []; + for (String line in file.readAsLinesSync().map((String line) => line.trim())) { + if (line.isEmpty) { + // blank line + } else if (line.startsWith('#')) { + // comment + } else if (line.startsWith('contact=')) { + contacts.add(line.substring(8)); + } else if (line.startsWith('fetch=')) { + fetch.add(line.substring(6)); + } else if (line.startsWith('update=')) { + update.add(Directory(line.substring(7))); + } else if (line.startsWith('test=')) { + test.add(line.substring(5)); + } else { + throw FormatException('${errorPrefix}Unexpected directive:\n$line'); + } + } + if (contacts.isEmpty) + throw FormatException('${errorPrefix}No contacts specified. At least one contact e-mail address must be specified.'); + for (String email in contacts) { + if (!email.contains(_email) || email.endsWith('@example.com')) + throw FormatException('${errorPrefix}The following e-mail address appears to be an invalid e-mail address: $email'); + } + if (fetch.isEmpty) + throw FormatException('${errorPrefix}No "fetch" directives specified. Two lines are expected: "git clone https://github.com/USERNAME/REPOSITORY.git tests" and "git -C tests checkout HASH".'); + if (fetch.length < 2) + throw FormatException('${errorPrefix}Only one "fetch" directive specified. Two lines are expected: "git clone https://github.com/USERNAME/REPOSITORY.git tests" and "git -C tests checkout HASH".'); + if (!fetch[0].contains(_fetch1)) + throw FormatException('${errorPrefix}First "fetch" directive does not match expected pattern (expected "git clone https://github.com/USERNAME/REPOSITORY.git tests").'); + if (!fetch[1].contains(_fetch2)) + throw FormatException('${errorPrefix}Second "fetch" directive does not match expected pattern (expected "git -C tests checkout HASH").'); + if (update.isEmpty) + throw FormatException('${errorPrefix}No "update" directives specified. At least one directory must be specified. (It can be "." to just upgrade the root of the repository.)'); + if (test.isEmpty) + throw FormatException('${errorPrefix}No "test" directives specified. At least one command must be specified to run tests.'); + return TestFile._( + List.unmodifiable(contacts), + List.unmodifiable(fetch), + List.unmodifiable(update), + List.unmodifiable(test), + ); + } + + const TestFile._(this.contacts, this.fetch, this.update, this.tests); + + // (e-mail regexp from HTML standard) + static final RegExp _email = RegExp(r'''^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$'''); + static final RegExp _fetch1 = RegExp(r'^git clone https://github.com/[-a-zA-Z0-9]+/[-_a-zA-Z0-9]+.git tests$'); + static final RegExp _fetch2 = RegExp(r'^git -C tests checkout [0-9a-f]+$'); + + final List contacts; + final List fetch; + final List update; + final List tests; +} + +final RegExp _spaces = RegExp(r' +'); + +Future shell(String command, Directory directory, { bool verbose = false, bool silentFailure = false }) async { + if (verbose) + print('>> $command'); + Process process; + if (Platform.isWindows) { + process = await Process.start('CMD.EXE', ['/S', '/C', '$command'], workingDirectory: directory.path); + } else { + final List segments = command.trim().split(_spaces); + process = await Process.start(segments.first, segments.skip(1).toList(), workingDirectory: directory.path); + } + final List output = []; + utf8.decoder.bind(process.stdout).transform(const LineSplitter()).listen(verbose ? printLog : output.add); + utf8.decoder.bind(process.stderr).transform(const LineSplitter()).listen(verbose ? printLog : output.add); + final bool success = await process.exitCode == 0; + if (success || silentFailure) + return success; + if (!verbose) { + print('>> $command'); + output.forEach(printLog); + } + return success; +} + +void printLog(String line) { + print('| $line'.trimRight()); +} diff --git a/dev/devicelab/pubspec.yaml b/dev/devicelab/pubspec.yaml index cd7193f3a44..739df888522 100644 --- a/dev/devicelab/pubspec.yaml +++ b/dev/devicelab/pubspec.yaml @@ -34,7 +34,7 @@ dependencies: stream_channel: 2.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" term_glyph: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" typed_data: 1.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - web_socket_channel: 1.0.13 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + web_socket_channel: 1.0.14 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" xml: 3.5.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" dev_dependencies: @@ -43,7 +43,7 @@ dev_dependencies: analyzer: 0.36.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - csslib: 0.16.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" html: 0.14.0+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -73,4 +73,4 @@ dev_dependencies: watcher: 0.9.7+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" yaml: 2.1.16 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" -# PUBSPEC CHECKSUM: 9ffc +# PUBSPEC CHECKSUM: 2cfe diff --git a/dev/integration_tests/android_semantics_testing/pubspec.yaml b/dev/integration_tests/android_semantics_testing/pubspec.yaml index 9f9b97dec74..c816b7653d9 100644 --- a/dev/integration_tests/android_semantics_testing/pubspec.yaml +++ b/dev/integration_tests/android_semantics_testing/pubspec.yaml @@ -16,7 +16,7 @@ dependencies: collection: 1.14.11 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - csslib: 0.16.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -57,10 +57,10 @@ dependencies: vector_math: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" watcher: 0.9.7+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - web_socket_channel: 1.0.13 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + web_socket_channel: 1.0.14 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" yaml: 2.1.16 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 42c8 +# PUBSPEC CHECKSUM: 32ca diff --git a/dev/integration_tests/android_views/pubspec.yaml b/dev/integration_tests/android_views/pubspec.yaml index 5339b245a52..cf862fe9197 100644 --- a/dev/integration_tests/android_views/pubspec.yaml +++ b/dev/integration_tests/android_views/pubspec.yaml @@ -7,7 +7,7 @@ dependencies: sdk: flutter flutter_driver: sdk: flutter - path_provider: 1.1.0 + path_provider: 1.1.2 collection: 1.14.11 assets_for_android_views: git: @@ -32,7 +32,7 @@ dependencies: typed_data: 1.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" vector_math: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - web_socket_channel: 1.0.13 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + web_socket_channel: 1.0.14 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" dev_dependencies: flutter_test: @@ -42,7 +42,7 @@ dev_dependencies: analyzer: 0.36.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" args: 1.5.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - csslib: 0.16.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" html: 0.14.0+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -76,4 +76,4 @@ dev_dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: dd79 +# PUBSPEC CHECKSUM: 017d diff --git a/dev/integration_tests/channels/pubspec.yaml b/dev/integration_tests/channels/pubspec.yaml index 57c44de7615..d890ca60e66 100644 --- a/dev/integration_tests/channels/pubspec.yaml +++ b/dev/integration_tests/channels/pubspec.yaml @@ -20,7 +20,7 @@ dependencies: collection: 1.14.11 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - csslib: 0.16.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -61,10 +61,10 @@ dependencies: vector_math: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" watcher: 0.9.7+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - web_socket_channel: 1.0.13 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + web_socket_channel: 1.0.14 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" yaml: 2.1.16 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 42c8 +# PUBSPEC CHECKSUM: 32ca diff --git a/dev/integration_tests/codegen/pubspec.yaml b/dev/integration_tests/codegen/pubspec.yaml index 1768fec2a6b..1f28fea8d00 100644 --- a/dev/integration_tests/codegen/pubspec.yaml +++ b/dev/integration_tests/codegen/pubspec.yaml @@ -29,7 +29,7 @@ dependencies: typed_data: 1.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" vector_math: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - web_socket_channel: 1.0.13 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + web_socket_channel: 1.0.14 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" dev_dependencies: test: 1.6.3 @@ -37,7 +37,7 @@ dev_dependencies: analyzer: 0.36.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" args: 1.5.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - csslib: 0.16.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" html: 0.14.0+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -74,4 +74,4 @@ builders: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 42c8 +# PUBSPEC CHECKSUM: 32ca diff --git a/dev/integration_tests/external_ui/pubspec.yaml b/dev/integration_tests/external_ui/pubspec.yaml index 032ecb02629..c5d54a431e2 100644 --- a/dev/integration_tests/external_ui/pubspec.yaml +++ b/dev/integration_tests/external_ui/pubspec.yaml @@ -20,7 +20,7 @@ dependencies: collection: 1.14.11 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - csslib: 0.16.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -61,10 +61,10 @@ dependencies: vector_math: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" watcher: 0.9.7+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - web_socket_channel: 1.0.13 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + web_socket_channel: 1.0.14 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" yaml: 2.1.16 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 42c8 +# PUBSPEC CHECKSUM: 32ca diff --git a/dev/integration_tests/flavors/pubspec.yaml b/dev/integration_tests/flavors/pubspec.yaml index b20cd9fef62..44221897c0b 100644 --- a/dev/integration_tests/flavors/pubspec.yaml +++ b/dev/integration_tests/flavors/pubspec.yaml @@ -20,7 +20,7 @@ dependencies: collection: 1.14.11 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - csslib: 0.16.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -61,10 +61,10 @@ dependencies: vector_math: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" watcher: 0.9.7+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - web_socket_channel: 1.0.13 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + web_socket_channel: 1.0.14 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" yaml: 2.1.16 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 42c8 +# PUBSPEC CHECKSUM: 32ca diff --git a/dev/integration_tests/image_loading/pubspec.yaml b/dev/integration_tests/image_loading/pubspec.yaml index fe83bd39a05..1e5e0c108ef 100644 --- a/dev/integration_tests/image_loading/pubspec.yaml +++ b/dev/integration_tests/image_loading/pubspec.yaml @@ -15,7 +15,7 @@ dependencies: collection: 1.14.11 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - csslib: 0.16.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" html: 0.14.0+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -54,10 +54,10 @@ dependencies: vector_math: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" watcher: 0.9.7+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - web_socket_channel: 1.0.13 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + web_socket_channel: 1.0.14 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" yaml: 2.1.16 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 967d +# PUBSPEC CHECKSUM: 707f diff --git a/dev/integration_tests/platform_interaction/pubspec.yaml b/dev/integration_tests/platform_interaction/pubspec.yaml index b501a43f20b..e4784f50cb6 100644 --- a/dev/integration_tests/platform_interaction/pubspec.yaml +++ b/dev/integration_tests/platform_interaction/pubspec.yaml @@ -20,7 +20,7 @@ dependencies: collection: 1.14.11 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - csslib: 0.16.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -61,10 +61,10 @@ dependencies: vector_math: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" watcher: 0.9.7+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - web_socket_channel: 1.0.13 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + web_socket_channel: 1.0.14 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" yaml: 2.1.16 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 42c8 +# PUBSPEC CHECKSUM: 32ca diff --git a/dev/integration_tests/simple_codegen/pubspec.yaml b/dev/integration_tests/simple_codegen/pubspec.yaml index 5249293102f..dfaeabc9761 100644 --- a/dev/integration_tests/simple_codegen/pubspec.yaml +++ b/dev/integration_tests/simple_codegen/pubspec.yaml @@ -11,7 +11,7 @@ dependencies: collection: 1.14.11 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - csslib: 0.16.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" html: 0.14.0+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -32,4 +32,4 @@ environment: # The pub client defaults to an <2.0.0 sdk constraint which we need to explicitly overwrite. sdk: ">=2.0.0-dev.68.0 <3.0.0" -# PUBSPEC CHECKSUM: db9f +# PUBSPEC CHECKSUM: b4a0 diff --git a/dev/integration_tests/ui/pubspec.yaml b/dev/integration_tests/ui/pubspec.yaml index 0b9ab4606b2..8010d9eb5f7 100644 --- a/dev/integration_tests/ui/pubspec.yaml +++ b/dev/integration_tests/ui/pubspec.yaml @@ -22,7 +22,7 @@ dependencies: collection: 1.14.11 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - csslib: 0.16.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -63,7 +63,7 @@ dependencies: vector_math: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" watcher: 0.9.7+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - web_socket_channel: 1.0.13 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + web_socket_channel: 1.0.14 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" xml: 3.5.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" yaml: 2.1.16 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -77,4 +77,4 @@ dev_dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: ce0d +# PUBSPEC CHECKSUM: 3d0f diff --git a/dev/snippets/pubspec.yaml b/dev/snippets/pubspec.yaml index b7127ea2603..38487b51653 100644 --- a/dev/snippets/pubspec.yaml +++ b/dev/snippets/pubspec.yaml @@ -14,7 +14,7 @@ dartdoc: dependencies: args: 1.5.2 - dart_style: 1.2.8 + dart_style: 1.2.9 meta: 1.1.6 platform: 2.2.0 @@ -24,7 +24,7 @@ dependencies: collection: 1.14.11 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - csslib: 0.16.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" html: 0.14.0+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -67,7 +67,7 @@ dev_dependencies: test_api: 0.2.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" test_core: 0.2.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - web_socket_channel: 1.0.13 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + web_socket_channel: 1.0.14 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" executables: snippets: null @@ -98,4 +98,4 @@ executables: vm_service_client: 0.2.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" web_socket_channel: 1.0.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" -# PUBSPEC CHECKSUM: 198b +# PUBSPEC CHECKSUM: 918e diff --git a/examples/catalog/pubspec.yaml b/examples/catalog/pubspec.yaml index e38ba0ef3ee..0a92756dcde 100644 --- a/examples/catalog/pubspec.yaml +++ b/examples/catalog/pubspec.yaml @@ -29,7 +29,7 @@ dev_dependencies: charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - csslib: 0.16.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -67,10 +67,10 @@ dev_dependencies: test_core: 0.2.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" watcher: 0.9.7+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - web_socket_channel: 1.0.13 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + web_socket_channel: 1.0.14 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" yaml: 2.1.16 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" flutter: uses-material-design: true -# PUBSPEC CHECKSUM: a7b3 +# PUBSPEC CHECKSUM: b1b5 diff --git a/examples/flutter_gallery/pubspec.yaml b/examples/flutter_gallery/pubspec.yaml index 1e544e22ef9..b070e6998d4 100644 --- a/examples/flutter_gallery/pubspec.yaml +++ b/examples/flutter_gallery/pubspec.yaml @@ -10,7 +10,7 @@ dependencies: collection: 1.14.11 device_info: 0.4.0+2 intl: 0.15.8 - connectivity: 0.4.3+2 + connectivity: 0.4.3+4 string_scanner: 1.0.4 url_launcher: 5.0.3 cupertino_icons: 0.1.2 @@ -44,7 +44,7 @@ dev_dependencies: boolean_selector: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - csslib: 0.16.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -80,7 +80,7 @@ dev_dependencies: test_core: 0.2.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" watcher: 0.9.7+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - web_socket_channel: 1.0.13 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + web_socket_channel: 1.0.14 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" yaml: 2.1.16 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" flutter: @@ -254,4 +254,4 @@ flutter: - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Regular.ttf - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Light.ttf -# PUBSPEC CHECKSUM: bd7b +# PUBSPEC CHECKSUM: 967f diff --git a/examples/platform_channel/pubspec.yaml b/examples/platform_channel/pubspec.yaml index 1805d9ab8ef..45ecc282293 100644 --- a/examples/platform_channel/pubspec.yaml +++ b/examples/platform_channel/pubspec.yaml @@ -27,7 +27,7 @@ dev_dependencies: charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - csslib: 0.16.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -66,10 +66,10 @@ dev_dependencies: test_core: 0.2.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" watcher: 0.9.7+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - web_socket_channel: 1.0.13 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + web_socket_channel: 1.0.14 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" yaml: 2.1.16 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" flutter: uses-material-design: true -# PUBSPEC CHECKSUM: a7b3 +# PUBSPEC CHECKSUM: b1b5 diff --git a/examples/platform_channel_swift/pubspec.yaml b/examples/platform_channel_swift/pubspec.yaml index d735a37e245..7ec81cdaa84 100644 --- a/examples/platform_channel_swift/pubspec.yaml +++ b/examples/platform_channel_swift/pubspec.yaml @@ -39,9 +39,9 @@ dev_dependencies: term_glyph: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" test_api: 0.2.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - web_socket_channel: 1.0.13 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + web_socket_channel: 1.0.14 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 3ffa +# PUBSPEC CHECKSUM: 40fb diff --git a/examples/stocks/pubspec.yaml b/examples/stocks/pubspec.yaml index da48be70780..16dc3231e6b 100644 --- a/examples/stocks/pubspec.yaml +++ b/examples/stocks/pubspec.yaml @@ -21,8 +21,8 @@ dependencies: collection: 1.14.11 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - csslib: 0.16.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - dart_style: 1.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + dart_style: 1.2.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" html: 0.14.0+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -57,9 +57,9 @@ dev_dependencies: stream_channel: 2.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" test_api: 0.2.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - web_socket_channel: 1.0.13 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + web_socket_channel: 1.0.14 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 4c79 +# PUBSPEC CHECKSUM: a57c diff --git a/packages/flutter_driver/pubspec.yaml b/packages/flutter_driver/pubspec.yaml index 15993722dd3..b58f3f622a2 100644 --- a/packages/flutter_driver/pubspec.yaml +++ b/packages/flutter_driver/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: json_rpc_2: 2.1.0 meta: 1.1.6 path: 1.6.2 - web_socket_channel: 1.0.13 + web_socket_channel: 1.0.14 vm_service_client: 0.2.6+2 flutter: sdk: flutter @@ -46,4 +46,4 @@ dev_dependencies: mockito: 4.1.0 quiver: 2.0.3 -# PUBSPEC CHECKSUM: fc49 +# PUBSPEC CHECKSUM: fd4a diff --git a/packages/flutter_tools/pubspec.yaml b/packages/flutter_tools/pubspec.yaml index 533718d790e..2a8a7ebd4db 100644 --- a/packages/flutter_tools/pubspec.yaml +++ b/packages/flutter_tools/pubspec.yaml @@ -13,7 +13,7 @@ dependencies: args: 1.5.2 bsdiff: 0.1.0 completion: 0.2.1+1 - coverage: 0.12.4 + coverage: 0.13.0 crypto: 2.0.6 file: 5.0.8+1 http: 0.12.0+2 @@ -32,7 +32,7 @@ dependencies: stream_channel: 2.0.0 usage: 3.4.1 vm_service_client: 0.2.6+2 - web_socket_channel: 1.0.13 + web_socket_channel: 1.0.14 webkit_inspection_protocol: 0.4.2 xml: 3.5.0 yaml: 2.1.16 @@ -47,7 +47,7 @@ dependencies: # Code generation dependencies build_runner_core: 3.0.6 - dart_style: 1.2.8 + dart_style: 1.2.9 code_builder: 3.2.0 build: 1.1.4 build_modules: 2.3.0 @@ -61,10 +61,10 @@ dependencies: build_config: 0.4.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" build_resolvers: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" built_collection: 4.2.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - built_value: 6.6.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + built_value: 6.7.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - csslib: 0.16.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" fixnum: 0.10.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -83,7 +83,7 @@ dependencies: pedantic: 1.8.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" petitparser: 2.4.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" pool: 1.4.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - protobuf: 0.13.12 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + protobuf: 0.13.15 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" pub_semver: 1.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" pubspec_parse: 0.1.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" scratch_space: 0.0.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -103,7 +103,7 @@ dev_dependencies: collection: 1.14.11 mockito: 4.1.0 file_testing: 2.1.0 - vm_service_lib: 3.21.0 + vm_service_lib: 3.22.0 test: 1.6.3 build_runner: 1.6.1 build_vm_compilers: 1.0.0 @@ -119,4 +119,4 @@ dartdoc: # Exclude this package from the hosted API docs. nodoc: true -# PUBSPEC CHECKSUM: f11f +# PUBSPEC CHECKSUM: 7d24 diff --git a/packages/fuchsia_remote_debug_protocol/pubspec.yaml b/packages/fuchsia_remote_debug_protocol/pubspec.yaml index 1ea1fed8971..69e44469b42 100644 --- a/packages/fuchsia_remote_debug_protocol/pubspec.yaml +++ b/packages/fuchsia_remote_debug_protocol/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: json_rpc_2: 2.1.0 process: 3.0.9 - web_socket_channel: 1.0.13 + web_socket_channel: 1.0.14 flutter_test: sdk: flutter flutter_driver: @@ -44,4 +44,4 @@ dependencies: dev_dependencies: mockito: 4.1.0 -# PUBSPEC CHECKSUM: fc49 +# PUBSPEC CHECKSUM: fd4a From 14e4565fa4c104fba03c7bb4a3a06a802aa3efc6 Mon Sep 17 00:00:00 2001 From: Kate Lovett Date: Wed, 10 Jul 2019 12:40:35 -0700 Subject: [PATCH 11/41] Doc fixes (#35892) * Fixed assets embedding * ++ * Completed snippet audit * Analyzer --- packages/flutter/lib/src/painting/text_style.dart | 4 ---- packages/flutter/lib/src/widgets/basic.dart | 9 +++++---- packages/flutter/lib/src/widgets/form.dart | 2 +- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/packages/flutter/lib/src/painting/text_style.dart b/packages/flutter/lib/src/painting/text_style.dart index 7f8a9969302..fb9fa670f26 100644 --- a/packages/flutter/lib/src/painting/text_style.dart +++ b/packages/flutter/lib/src/painting/text_style.dart @@ -130,14 +130,10 @@ const String _kColorBackgroundWarning = 'Cannot provide both a backgroundColor a /// ``` /// {@end-tool} /// -/// {@tool sample} -/// /// Examples of the resulting heights from different values of `TextStyle.height`: /// /// ![Text height comparison diagram](https://flutter.github.io/assets-for-api-docs/assets/painting/text_height_comparison_diagram.png) /// -/// {@end-tool} -/// /// ### Wavy red underline with black text /// /// {@tool sample} diff --git a/packages/flutter/lib/src/widgets/basic.dart b/packages/flutter/lib/src/widgets/basic.dart index 12f910f0def..3e6f2e52ed6 100644 --- a/packages/flutter/lib/src/widgets/basic.dart +++ b/packages/flutter/lib/src/widgets/basic.dart @@ -4713,13 +4713,14 @@ class Wrap extends MultiChildRenderObjectWidget { /// children. /// * The [catalog of layout widgets](https://flutter.dev/widgets/layout/). /// +/// +/// {@animation 450 100 https://flutter.github.io/assets-for-api-docs/assets/widgets/flow_menu.mp4} +/// /// {@tool snippet --template=freeform} /// /// This example uses the [Flow] widget to create a menu that opens and closes -/// as it is interacted with. The color of the button in the menu changes to -/// indicate which one has been selected. -/// -/// {@animation 450 100 https://flutter.github.io/assets-for-api-docs/assets/widgets/flow_menu.mp4} +/// as it is interacted with, shown above. The color of the button in the menu +/// changes to indicate which one has been selected. /// /// ```dart main /// import 'package:flutter/material.dart'; diff --git a/packages/flutter/lib/src/widgets/form.dart b/packages/flutter/lib/src/widgets/form.dart index 28cea99bcd9..d351a031c8d 100644 --- a/packages/flutter/lib/src/widgets/form.dart +++ b/packages/flutter/lib/src/widgets/form.dart @@ -16,7 +16,7 @@ import 'will_pop_scope.dart'; /// with a context whose ancestor is the [Form], or pass a [GlobalKey] to the /// [Form] constructor and call [GlobalKey.currentState]. /// -/// {@tool snippet --template=stateful_widget_material} +/// {@tool snippet --template=stateful_widget_scaffold} /// This example shows a [Form] with one [TextFormField] and a [RaisedButton]. A /// [GlobalKey] is used here to identify the [Form] and validate input. /// From 70bb5d1d5a6c7d4df466581ac43d92f6b9c96c9b Mon Sep 17 00:00:00 2001 From: rami-a <2364772+rami-a@users.noreply.github.com> Date: Wed, 10 Jul 2019 16:07:15 -0400 Subject: [PATCH 12/41] Add flag to use root navigator for showModalBottomSheet (#35878) * Add flag to use root navigator for showModalBottomSheet * Add documentation * Add tests * Address feedback and fix analyzer issues * Address feedback * Update comments --- .../lib/src/material/bottom_sheet.dart | 9 +- .../test/material/bottom_sheet_test.dart | 87 +++++++++++++++++++ 2 files changed, 95 insertions(+), 1 deletion(-) diff --git a/packages/flutter/lib/src/material/bottom_sheet.dart b/packages/flutter/lib/src/material/bottom_sheet.dart index 8f9ca2aae71..7ede1d9864b 100644 --- a/packages/flutter/lib/src/material/bottom_sheet.dart +++ b/packages/flutter/lib/src/material/bottom_sheet.dart @@ -400,6 +400,11 @@ class _ModalBottomSheetRoute extends PopupRoute { /// a [GridView] and have the bottom sheet be draggable, you should set this /// parameter to true. /// +/// The `useRootNavigator` parameter ensures that the root navigator is used to +/// display the [BottomSheet] when set to `true`. This is useful in the case +/// that a modal [BottomSheet] needs to be displayed above all other content +/// but the caller is inside another [Navigator]. +/// /// Returns a `Future` that resolves to the value (if any) that was passed to /// [Navigator.pop] when the modal bottom sheet was closed. /// @@ -417,14 +422,16 @@ Future showModalBottomSheet({ double elevation, ShapeBorder shape, bool isScrollControlled = false, + bool useRootNavigator = false, }) { assert(context != null); assert(builder != null); assert(isScrollControlled != null); + assert(useRootNavigator != null); assert(debugCheckHasMediaQuery(context)); assert(debugCheckHasMaterialLocalizations(context)); - return Navigator.push(context, _ModalBottomSheetRoute( + return Navigator.of(context, rootNavigator: useRootNavigator).push(_ModalBottomSheetRoute( builder: builder, theme: Theme.of(context, shadowThemeOnly: true), isScrollControlled: isScrollControlled, diff --git a/packages/flutter/test/material/bottom_sheet_test.dart b/packages/flutter/test/material/bottom_sheet_test.dart index 15cca8e8ac1..f0cf7e6a054 100644 --- a/packages/flutter/test/material/bottom_sheet_test.dart +++ b/packages/flutter/test/material/bottom_sheet_test.dart @@ -361,4 +361,91 @@ void main() { ), ignoreTransform: true, ignoreRect: true, ignoreId: true)); semantics.dispose(); }); + + testWidgets('showModalBottomSheet does not use root Navigator by default', (WidgetTester tester) async { + await tester.pumpWidget(MaterialApp( + home: Scaffold( + body: Navigator(onGenerateRoute: (RouteSettings settings) => MaterialPageRoute(builder: (_) { + return const _TestPage(); + })), + bottomNavigationBar: BottomNavigationBar( + items: const [ + BottomNavigationBarItem( + icon: Icon(Icons.ac_unit), + title: Text('Item 1'), + ), + BottomNavigationBarItem( + icon: Icon(Icons.style), + title: Text('Item 2'), + ) + ], + ), + ), + )); + + await tester.tap(find.text('Show bottom sheet')); + await tester.pumpAndSettle(); + + // Bottom sheet is displayed in correct position within the inner navigator + // and above the BottomNavigationBar. + expect(tester.getBottomLeft(find.byType(BottomSheet)).dy, 544.0); + }); + + testWidgets('showModalBottomSheet uses root Navigator when specified', (WidgetTester tester) async { + await tester.pumpWidget(MaterialApp( + home: Scaffold( + body: Navigator(onGenerateRoute: (RouteSettings settings) => MaterialPageRoute(builder: (_) { + return const _TestPage(useRootNavigator: true); + })), + bottomNavigationBar: BottomNavigationBar( + items: const [ + BottomNavigationBarItem( + icon: Icon(Icons.ac_unit), + title: Text('Item 1'), + ), + BottomNavigationBarItem( + icon: Icon(Icons.style), + title: Text('Item 2'), + ) + ], + ), + ), + )); + + await tester.tap(find.text('Show bottom sheet')); + await tester.pumpAndSettle(); + + // Bottom sheet is displayed in correct position above all content including + // the BottomNavigationBar. + expect(tester.getBottomLeft(find.byType(BottomSheet)).dy, 600.0); + }); +} + +class _TestPage extends StatelessWidget { + const _TestPage({Key key, this.useRootNavigator}) : super(key: key); + + final bool useRootNavigator; + + @override + Widget build(BuildContext context) { + return Center( + child: FlatButton( + child: const Text('Show bottom sheet'), + onPressed: () { + if (useRootNavigator != null) { + showModalBottomSheet( + useRootNavigator: useRootNavigator, + context: context, + builder: (_) => const Text('Modal bottom sheet'), + ); + } else { + showModalBottomSheet( + context: context, + builder: (_) => const Text('Modal bottom sheet'), + ); + } + } + ), + ); + } } From 3122786ad52ae33009ee696896b8ab7b0a1ae93d Mon Sep 17 00:00:00 2001 From: gaaclarke <30870216+gaaclarke@users.noreply.github.com> Date: Wed, 10 Jul 2019 13:10:05 -0700 Subject: [PATCH 13/41] Fixed build of example code to use new binary messenger API. (#35825) Fixed build of example code to use new binary messenger API. --- dev/bots/test.dart | 8 +++----- .../platform_channel_swift/ios/Runner/AppDelegate.swift | 4 ++-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/dev/bots/test.dart b/dev/bots/test.dart index fc739f1a96d..7818b77c9c5 100644 --- a/dev/bots/test.dart +++ b/dev/bots/test.dart @@ -272,12 +272,10 @@ Future _runBuildTests() async { continue; } final String examplePath = fileEntity.path; - final String basename = path.basename(examplePath); - final bool expectIpaBuildFailure = basename == 'platform_channel_swift'; // Remove when https://github.com/flutter/flutter/issues/35773 is fixed. await _flutterBuildAot(examplePath); await _flutterBuildApk(examplePath); - await _flutterBuildIpa(examplePath, expectIpaBuildFailure: expectIpaBuildFailure); + await _flutterBuildIpa(examplePath); } await _flutterBuildDart2js(path.join('dev', 'integration_tests', 'web')); @@ -322,7 +320,7 @@ Future _flutterBuildApk(String relativePathToApplication) async { print('Done.'); } -Future _flutterBuildIpa(String relativePathToApplication, {bool expectIpaBuildFailure = false}) async { +Future _flutterBuildIpa(String relativePathToApplication) async { if (!Platform.isMacOS) { return; } @@ -341,7 +339,7 @@ Future _flutterBuildIpa(String relativePathToApplication, {bool expectIpaB await runCommand(flutter, ['build', 'ios', '--no-codesign', '--debug', '-v'], workingDirectory: path.join(flutterRoot, relativePathToApplication), - expectNonZeroExit: expectIpaBuildFailure, + expectNonZeroExit: false, timeout: _kShortTimeout, ); print('Done.'); diff --git a/examples/platform_channel_swift/ios/Runner/AppDelegate.swift b/examples/platform_channel_swift/ios/Runner/AppDelegate.swift index 04ca3676644..937c8197465 100644 --- a/examples/platform_channel_swift/ios/Runner/AppDelegate.swift +++ b/examples/platform_channel_swift/ios/Runner/AppDelegate.swift @@ -31,7 +31,7 @@ enum MyFlutterErrorCode { fatalError("rootViewController is not type FlutterViewController") } let batteryChannel = FlutterMethodChannel(name: ChannelName.battery, - binaryMessenger: controller) + binaryMessenger: controller.binaryMessenger) batteryChannel.setMethodCallHandler({ [weak self] (call: FlutterMethodCall, result: FlutterResult) -> Void in guard call.method == "getBatteryLevel" else { @@ -42,7 +42,7 @@ enum MyFlutterErrorCode { }) let chargingChannel = FlutterEventChannel(name: ChannelName.charging, - binaryMessenger: controller) + binaryMessenger: controller.binaryMessenger) chargingChannel.setStreamHandler(self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } From ef42c36ab0cdde74232e31ee895588b096ba2b0e Mon Sep 17 00:00:00 2001 From: Tom Robinson Date: Wed, 10 Jul 2019 13:54:27 -0700 Subject: [PATCH 14/41] Cleanup widgets/sliver_persistent_header.dart with resolution of dart-lang/sdk#31543 (#35828) * Remove extra classes. Now that https://github.com/dart-lang/sdk/issues/31543 is fixed, we can remove extra classes. * Add snapConfiguration to parameters for _RenderSliverFloatingPersistentHeaderForWidgets and _RenderSliverFloatingPinnedPersistentHeaderForWidgets constructors. --- .../src/widgets/sliver_persistent_header.dart | 40 ++++++++----------- 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/packages/flutter/lib/src/widgets/sliver_persistent_header.dart b/packages/flutter/lib/src/widgets/sliver_persistent_header.dart index be4f5f18744..1547c3e2f30 100644 --- a/packages/flutter/lib/src/widgets/sliver_persistent_header.dart +++ b/packages/flutter/lib/src/widgets/sliver_persistent_header.dart @@ -284,10 +284,7 @@ class _SliverScrollingPersistentHeader extends _SliverPersistentHeaderRenderObje } } -// This class exists to work around https://github.com/dart-lang/sdk/issues/31543 -abstract class _RenderSliverScrollingPersistentHeader extends RenderSliverScrollingPersistentHeader { } - -class _RenderSliverScrollingPersistentHeaderForWidgets extends _RenderSliverScrollingPersistentHeader +class _RenderSliverScrollingPersistentHeaderForWidgets extends RenderSliverScrollingPersistentHeader with _RenderSliverPersistentHeaderForWidgetsMixin { } class _SliverPinnedPersistentHeader extends _SliverPersistentHeaderRenderObjectWidget { @@ -302,10 +299,7 @@ class _SliverPinnedPersistentHeader extends _SliverPersistentHeaderRenderObjectW } } -// This class exists to work around https://github.com/dart-lang/sdk/issues/31543 -abstract class _RenderSliverPinnedPersistentHeader extends RenderSliverPinnedPersistentHeader { } - -class _RenderSliverPinnedPersistentHeaderForWidgets extends _RenderSliverPinnedPersistentHeader with _RenderSliverPersistentHeaderForWidgetsMixin { } +class _RenderSliverPinnedPersistentHeaderForWidgets extends RenderSliverPinnedPersistentHeader with _RenderSliverPersistentHeaderForWidgetsMixin { } class _SliverFloatingPersistentHeader extends _SliverPersistentHeaderRenderObjectWidget { const _SliverFloatingPersistentHeader({ @@ -315,10 +309,7 @@ class _SliverFloatingPersistentHeader extends _SliverPersistentHeaderRenderObjec @override _RenderSliverPersistentHeaderForWidgetsMixin createRenderObject(BuildContext context) { - // Not passing this snapConfiguration as a constructor parameter to avoid the - // additional layers added due to https://github.com/dart-lang/sdk/issues/31543 - return _RenderSliverFloatingPersistentHeaderForWidgets() - ..snapConfiguration = delegate.snapConfiguration; + return _RenderSliverFloatingPersistentHeaderForWidgets(snapConfiguration: delegate.snapConfiguration); } @override @@ -327,10 +318,12 @@ class _SliverFloatingPersistentHeader extends _SliverPersistentHeaderRenderObjec } } -// This class exists to work around https://github.com/dart-lang/sdk/issues/31543 -abstract class _RenderSliverFloatingPinnedPersistentHeader extends RenderSliverFloatingPinnedPersistentHeader { } - -class _RenderSliverFloatingPinnedPersistentHeaderForWidgets extends _RenderSliverFloatingPinnedPersistentHeader with _RenderSliverPersistentHeaderForWidgetsMixin { } +class _RenderSliverFloatingPinnedPersistentHeaderForWidgets extends RenderSliverFloatingPinnedPersistentHeader with _RenderSliverPersistentHeaderForWidgetsMixin { + _RenderSliverFloatingPinnedPersistentHeaderForWidgets({ + RenderBox child, + FloatingHeaderSnapConfiguration snapConfiguration, + }) : super(child: child, snapConfiguration: snapConfiguration); +} class _SliverFloatingPinnedPersistentHeader extends _SliverPersistentHeaderRenderObjectWidget { const _SliverFloatingPinnedPersistentHeader({ @@ -340,10 +333,7 @@ class _SliverFloatingPinnedPersistentHeader extends _SliverPersistentHeaderRende @override _RenderSliverPersistentHeaderForWidgetsMixin createRenderObject(BuildContext context) { - // Not passing this snapConfiguration as a constructor parameter to avoid the - // additional layers added due to https://github.com/dart-lang/sdk/issues/31543 - return _RenderSliverFloatingPinnedPersistentHeaderForWidgets() - ..snapConfiguration = delegate.snapConfiguration; + return _RenderSliverFloatingPinnedPersistentHeaderForWidgets(snapConfiguration: delegate.snapConfiguration); } @override @@ -352,7 +342,9 @@ class _SliverFloatingPinnedPersistentHeader extends _SliverPersistentHeaderRende } } -// This class exists to work around https://github.com/dart-lang/sdk/issues/31543 -abstract class _RenderSliverFloatingPersistentHeader extends RenderSliverFloatingPersistentHeader { } - -class _RenderSliverFloatingPersistentHeaderForWidgets extends _RenderSliverFloatingPersistentHeader with _RenderSliverPersistentHeaderForWidgetsMixin { } +class _RenderSliverFloatingPersistentHeaderForWidgets extends RenderSliverFloatingPersistentHeader with _RenderSliverPersistentHeaderForWidgetsMixin { + _RenderSliverFloatingPersistentHeaderForWidgets({ + RenderBox child, + FloatingHeaderSnapConfiguration snapConfiguration, + }) : super(child: child, snapConfiguration: snapConfiguration); +} From ff53fbe194298eb37de356f5ddef529ad3f5786c Mon Sep 17 00:00:00 2001 From: Justin McCandless Date: Wed, 10 Jul 2019 14:08:14 -0700 Subject: [PATCH 15/41] Text selection menu show/hide cases (#35219) Show and hide the text selection menu at the correct time with various gestures in the text field. --- .../flutter/lib/src/material/text_field.dart | 1 + .../lib/src/widgets/editable_text.dart | 5 +- .../test/cupertino/text_field_test.dart | 26 ++ .../test/material/text_field_test.dart | 88 ++++++- .../editable_text_show_on_screen_test.dart | 42 ++-- .../test/widgets/editable_text_test.dart | 36 +-- packages/flutter/test/widgets/form_test.dart | 224 ++++++++++-------- 7 files changed, 268 insertions(+), 154 deletions(-) diff --git a/packages/flutter/lib/src/material/text_field.dart b/packages/flutter/lib/src/material/text_field.dart index cce50a12caf..8b98affeafd 100644 --- a/packages/flutter/lib/src/material/text_field.dart +++ b/packages/flutter/lib/src/material/text_field.dart @@ -762,6 +762,7 @@ class _TextFieldState extends State with AutomaticKeepAliveClientMixi } void _handleSingleTapUp(TapUpDetails details) { + _editableTextKey.currentState.hideToolbar(); if (widget.selectionEnabled) { switch (Theme.of(context).platform) { case TargetPlatform.iOS: diff --git a/packages/flutter/lib/src/widgets/editable_text.dart b/packages/flutter/lib/src/widgets/editable_text.dart index 36809a859de..6cb99d4f797 100644 --- a/packages/flutter/lib/src/widgets/editable_text.dart +++ b/packages/flutter/lib/src/widgets/editable_text.dart @@ -1447,7 +1447,7 @@ class EditableTextState extends State with AutomaticKeepAliveClien _showCaretOnScreen(); if (!_value.selection.isValid) { // Place cursor at the end if the selection is invalid when we receive focus. - widget.controller.selection = TextSelection.collapsed(offset: _value.text.length); + _handleSelectionChanged(TextSelection.collapsed(offset: _value.text.length), renderEditable, null); } } else { WidgetsBinding.instance.removeObserver(this); @@ -1500,6 +1500,9 @@ class EditableTextState extends State with AutomaticKeepAliveClien @override void hideToolbar() { + if (_selectionOverlay == null || !_selectionOverlay.toolbarIsVisible) { + return; + } _selectionOverlay?.hide(); } diff --git a/packages/flutter/test/cupertino/text_field_test.dart b/packages/flutter/test/cupertino/text_field_test.dart index d0c2cc195aa..a4ebbd131be 100644 --- a/packages/flutter/test/cupertino/text_field_test.dart +++ b/packages/flutter/test/cupertino/text_field_test.dart @@ -3650,5 +3650,31 @@ void main() { expect(tester.getTopLeft(find.byType(EditableText)).dy, closeTo(329.0, .0001)); }); }); + + testWidgets( + 'Long press on an autofocused field shows the selection menu', + (WidgetTester tester) async { + await tester.pumpWidget( + CupertinoApp( + home: Center( + child: ConstrainedBox( + constraints: BoxConstraints.loose(const Size(200, 200)), + child: const CupertinoTextField( + autofocus: true, + ), + ), + ), + ), + ); + // This extra pump allows the selection set by autofocus to propagate to + // the RenderEditable. + await tester.pump(); + + // Long press shows the selection menu. + await tester.longPressAt(textOffsetToPosition(tester, 0)); + await tester.pump(); + expect(find.text('Paste'), findsOneWidget); + }, + ); }); } diff --git a/packages/flutter/test/material/text_field_test.dart b/packages/flutter/test/material/text_field_test.dart index 0605c0a8527..a432de80439 100644 --- a/packages/flutter/test/material/text_field_test.dart +++ b/packages/flutter/test/material/text_field_test.dart @@ -92,19 +92,21 @@ Widget overlayWithEntry(OverlayEntry entry) { } Widget boilerplate({ Widget child }) { - return Localizations( - locale: const Locale('en', 'US'), - delegates: >[ - WidgetsLocalizationsDelegate(), - MaterialLocalizationsDelegate(), - ], - child: Directionality( - textDirection: TextDirection.ltr, - child: MediaQuery( - data: const MediaQueryData(size: Size(800.0, 600.0)), - child: Center( - child: Material( - child: child, + return MaterialApp( + home: Localizations( + locale: const Locale('en', 'US'), + delegates: >[ + WidgetsLocalizationsDelegate(), + MaterialLocalizationsDelegate(), + ], + child: Directionality( + textDirection: TextDirection.ltr, + child: MediaQuery( + data: const MediaQueryData(size: Size(800.0, 600.0)), + child: Center( + child: Material( + child: child, + ), ), ), ), @@ -5341,6 +5343,66 @@ void main() { }, ); + testWidgets( + 'A single tap hides the selection menu', + (WidgetTester tester) async { + final TextEditingController controller = TextEditingController( + text: '', + ); + await tester.pumpWidget( + MaterialApp( + home: Material( + child: Center( + child: TextField( + controller: controller, + ), + ), + ), + ), + ); + + // Long press shows the selection menu. + await tester.longPress(find.byType(TextField)); + await tester.pump(); + expect(find.text('PASTE'), findsOneWidget); + + // Tap hides the selection menu. + await tester.tap(find.byType(TextField)); + await tester.pump(); + expect(find.text('PASTE'), findsNothing); + }, + ); + + testWidgets( + 'Long press on an autofocused field shows the selection menu', + (WidgetTester tester) async { + final TextEditingController controller = TextEditingController( + text: '', + ); + await tester.pumpWidget( + MaterialApp( + home: Material( + child: Center( + child: TextField( + autofocus: true, + controller: controller, + ), + ), + ), + ), + ); + // This extra pump allows the selection set by autofocus to propagate to + // the RenderEditable. + await tester.pump(); + + // Long press shows the selection menu. + expect(find.text('PASTE'), findsNothing); + await tester.longPress(find.byType(TextField)); + await tester.pump(); + expect(find.text('PASTE'), findsOneWidget); + }, + ); + testWidgets( 'double tap hold selects word (iOS)', (WidgetTester tester) async { diff --git a/packages/flutter/test/widgets/editable_text_show_on_screen_test.dart b/packages/flutter/test/widgets/editable_text_show_on_screen_test.dart index b0977213bc9..e778c75e59a 100644 --- a/packages/flutter/test/widgets/editable_text_show_on_screen_test.dart +++ b/packages/flutter/test/widgets/editable_text_show_on_screen_test.dart @@ -202,27 +202,29 @@ void main() { final PageController pageController = PageController(initialPage: 1); await tester.pumpWidget( - MediaQuery( - data: const MediaQueryData(devicePixelRatio: 1.0), - child: Directionality( - textDirection: TextDirection.ltr, - child: Material( - child: PageView( - controller: pageController, - children: [ - Container( - color: Colors.red, - ), - Container( - child: TextField( - controller: textController, + MaterialApp( + home: MediaQuery( + data: const MediaQueryData(devicePixelRatio: 1.0), + child: Directionality( + textDirection: TextDirection.ltr, + child: Material( + child: PageView( + controller: pageController, + children: [ + Container( + color: Colors.red, ), - color: Colors.green, - ), - Container( - color: Colors.red, - ), - ], + Container( + child: TextField( + controller: textController, + ), + color: Colors.green, + ), + Container( + color: Colors.red, + ), + ], + ), ), ), ), diff --git a/packages/flutter/test/widgets/editable_text_test.dart b/packages/flutter/test/widgets/editable_text_test.dart index 0f5dce95799..8b66e89150f 100644 --- a/packages/flutter/test/widgets/editable_text_test.dart +++ b/packages/flutter/test/widgets/editable_text_test.dart @@ -809,23 +809,25 @@ void main() { return StatefulBuilder( builder: (BuildContext context, StateSetter setter) { setState = setter; - return MediaQuery( - data: const MediaQueryData(devicePixelRatio: 1.0), - child: Directionality( - textDirection: TextDirection.ltr, - child: Center( - child: Material( - child: EditableText( - backgroundCursorColor: Colors.grey, - controller: currentController, - focusNode: focusNode, - style: Typography(platform: TargetPlatform.android) - .black - .subhead, - cursorColor: Colors.blue, - selectionControls: materialTextSelectionControls, - keyboardType: TextInputType.text, - onChanged: (String value) { }, + return MaterialApp( + home: MediaQuery( + data: const MediaQueryData(devicePixelRatio: 1.0), + child: Directionality( + textDirection: TextDirection.ltr, + child: Center( + child: Material( + child: EditableText( + backgroundCursorColor: Colors.grey, + controller: currentController, + focusNode: focusNode, + style: Typography(platform: TargetPlatform.android) + .black + .subhead, + cursorColor: Colors.blue, + selectionControls: materialTextSelectionControls, + keyboardType: TextInputType.text, + onChanged: (String value) { }, + ), ), ), ), diff --git a/packages/flutter/test/widgets/form_test.dart b/packages/flutter/test/widgets/form_test.dart index 73cf0307620..33b2e7bc957 100644 --- a/packages/flutter/test/widgets/form_test.dart +++ b/packages/flutter/test/widgets/form_test.dart @@ -11,16 +11,18 @@ void main() { String fieldValue; Widget builder() { - return MediaQuery( - data: const MediaQueryData(devicePixelRatio: 1.0), - child: Directionality( - textDirection: TextDirection.ltr, - child: Center( - child: Material( - child: Form( - key: formKey, - child: TextFormField( - onSaved: (String value) { fieldValue = value; }, + return MaterialApp( + home: MediaQuery( + data: const MediaQueryData(devicePixelRatio: 1.0), + child: Directionality( + textDirection: TextDirection.ltr, + child: Center( + child: Material( + child: Form( + key: formKey, + child: TextFormField( + onSaved: (String value) { fieldValue = value; }, + ), ), ), ), @@ -36,7 +38,7 @@ void main() { Future checkText(String testValue) async { await tester.enterText(find.byType(TextFormField), testValue); formKey.currentState.save(); - // pump'ing is unnecessary because callback happens regardless of frames + // Pumping is unnecessary because callback happens regardless of frames. expect(fieldValue, equals(testValue)); } @@ -48,15 +50,17 @@ void main() { String fieldValue; Widget builder() { - return MediaQuery( - data: const MediaQueryData(devicePixelRatio: 1.0), - child: Directionality( - textDirection: TextDirection.ltr, - child: Center( - child: Material( - child: Form( - child: TextField( - onChanged: (String value) { fieldValue = value; }, + return MaterialApp( + home: MediaQuery( + data: const MediaQueryData(devicePixelRatio: 1.0), + child: Directionality( + textDirection: TextDirection.ltr, + child: Center( + child: Material( + child: Form( + child: TextField( + onChanged: (String value) { fieldValue = value; }, + ), ), ), ), @@ -84,17 +88,19 @@ void main() { String errorText(String value) => value + '/error'; Widget builder(bool autovalidate) { - return MediaQuery( - data: const MediaQueryData(devicePixelRatio: 1.0), - child: Directionality( - textDirection: TextDirection.ltr, - child: Center( - child: Material( - child: Form( - key: formKey, - autovalidate: autovalidate, - child: TextFormField( - validator: errorText, + return MaterialApp( + home: MediaQuery( + data: const MediaQueryData(devicePixelRatio: 1.0), + child: Directionality( + textDirection: TextDirection.ltr, + child: Center( + child: Material( + child: Form( + key: formKey, + autovalidate: autovalidate, + child: TextFormField( + validator: errorText, + ), ), ), ), @@ -138,24 +144,26 @@ void main() { String errorText(String input) => '${fieldKey.currentState.value}/error'; Widget builder() { - return MediaQuery( - data: const MediaQueryData(devicePixelRatio: 1.0), - child: Directionality( - textDirection: TextDirection.ltr, - child: Center( - child: Material( - child: Form( - key: formKey, - autovalidate: true, - child: ListView( - children: [ - TextFormField( - key: fieldKey, - ), - TextFormField( - validator: errorText, - ), - ], + return MaterialApp( + home: MediaQuery( + data: const MediaQueryData(devicePixelRatio: 1.0), + child: Directionality( + textDirection: TextDirection.ltr, + child: Center( + child: Material( + child: Form( + key: formKey, + autovalidate: true, + child: ListView( + children: [ + TextFormField( + key: fieldKey, + ), + TextFormField( + validator: errorText, + ), + ], + ), ), ), ), @@ -184,16 +192,18 @@ void main() { final GlobalKey> inputKey = GlobalKey>(); Widget builder() { - return MediaQuery( - data: const MediaQueryData(devicePixelRatio: 1.0), - child: Directionality( - textDirection: TextDirection.ltr, - child: Center( - child: Material( - child: Form( - child: TextFormField( - key: inputKey, - initialValue: 'hello', + return MaterialApp( + home: MediaQuery( + data: const MediaQueryData(devicePixelRatio: 1.0), + child: Directionality( + textDirection: TextDirection.ltr, + child: Center( + child: Material( + child: Form( + child: TextFormField( + key: inputKey, + initialValue: 'hello', + ), ), ), ), @@ -227,16 +237,18 @@ void main() { final GlobalKey> inputKey = GlobalKey>(); Widget builder() { - return MediaQuery( - data: const MediaQueryData(devicePixelRatio: 1.0), - child: Directionality( - textDirection: TextDirection.ltr, - child: Center( - child: Material( - child: Form( - child: TextFormField( - key: inputKey, - controller: controller, + return MaterialApp( + home: MediaQuery( + data: const MediaQueryData(devicePixelRatio: 1.0), + child: Directionality( + textDirection: TextDirection.ltr, + child: Center( + child: Material( + child: Form( + child: TextFormField( + key: inputKey, + controller: controller, + ), ), ), ), @@ -272,18 +284,20 @@ void main() { final TextEditingController controller = TextEditingController(text: 'Plover'); Widget builder() { - return MediaQuery( - data: const MediaQueryData(devicePixelRatio: 1.0), - child: Directionality( - textDirection: TextDirection.ltr, - child: Center( - child: Material( - child: Form( - key: formKey, - child: TextFormField( - key: inputKey, - controller: controller, - // initialValue is 'Plover' + return MaterialApp( + home: MediaQuery( + data: const MediaQueryData(devicePixelRatio: 1.0), + child: Directionality( + textDirection: TextDirection.ltr, + child: Center( + child: Material( + child: Form( + key: formKey, + child: TextFormField( + key: inputKey, + controller: controller, + // initialValue is 'Plover' + ), ), ), ), @@ -322,16 +336,18 @@ void main() { return StatefulBuilder( builder: (BuildContext context, StateSetter setter) { setState = setter; - return MediaQuery( - data: const MediaQueryData(devicePixelRatio: 1.0), - child: Directionality( - textDirection: TextDirection.ltr, - child: Center( - child: Material( - child: Form( - child: TextFormField( - key: inputKey, - controller: currentController, + return MaterialApp( + home: MediaQuery( + data: const MediaQueryData(devicePixelRatio: 1.0), + child: Directionality( + textDirection: TextDirection.ltr, + child: Center( + child: Material( + child: Form( + child: TextFormField( + key: inputKey, + controller: currentController, + ), ), ), ), @@ -420,18 +436,20 @@ void main() { String fieldValue; Widget builder(bool remove) { - return MediaQuery( - data: const MediaQueryData(devicePixelRatio: 1.0), - child: Directionality( - textDirection: TextDirection.ltr, - child: Center( - child: Material( - child: Form( - key: formKey, - child: remove ? Container() : TextFormField( - autofocus: true, - onSaved: (String value) { fieldValue = value; }, - validator: (String value) { return value.isEmpty ? null : 'yes'; }, + return MaterialApp( + home: MediaQuery( + data: const MediaQueryData(devicePixelRatio: 1.0), + child: Directionality( + textDirection: TextDirection.ltr, + child: Center( + child: Material( + child: Form( + key: formKey, + child: remove ? Container() : TextFormField( + autofocus: true, + onSaved: (String value) { fieldValue = value; }, + validator: (String value) { return value.isEmpty ? null : 'yes'; }, + ), ), ), ), From b5c1b61c73b826eb66ea0cd4662ee05efb4af44c Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Wed, 10 Jul 2019 14:13:01 -0700 Subject: [PATCH 16/41] Add platform_interaction_test_swift to devicelab (#35775) --- .../tasks/platform_channel_sample_test_swift.dart | 14 ++++++++++++++ dev/devicelab/lib/tasks/integration_tests.dart | 7 +++++++ dev/devicelab/manifest.yaml | 9 ++++++++- 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 dev/devicelab/bin/tasks/platform_channel_sample_test_swift.dart diff --git a/dev/devicelab/bin/tasks/platform_channel_sample_test_swift.dart b/dev/devicelab/bin/tasks/platform_channel_sample_test_swift.dart new file mode 100644 index 00000000000..18a1d59c921 --- /dev/null +++ b/dev/devicelab/bin/tasks/platform_channel_sample_test_swift.dart @@ -0,0 +1,14 @@ +// Copyright 2019 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 'package:flutter_devicelab/framework/adb.dart'; +import 'package:flutter_devicelab/framework/framework.dart'; +import 'package:flutter_devicelab/tasks/integration_tests.dart'; + +Future main() async { + deviceOperatingSystem = DeviceOperatingSystem.ios; + await task(createPlatformChannelSwiftSampleTest()); +} diff --git a/dev/devicelab/lib/tasks/integration_tests.dart b/dev/devicelab/lib/tasks/integration_tests.dart index 116403eb94f..a940a24c8ac 100644 --- a/dev/devicelab/lib/tasks/integration_tests.dart +++ b/dev/devicelab/lib/tasks/integration_tests.dart @@ -47,6 +47,13 @@ TaskFunction createPlatformChannelSampleTest() { ); } +TaskFunction createPlatformChannelSwiftSampleTest() { + return DriverTest( + '${flutterDirectory.path}/examples/platform_channel_swift', + 'test_driver/button_tap.dart', + ); +} + TaskFunction createEmbeddedAndroidViewsIntegrationTest() { return DriverTest( '${flutterDirectory.path}/dev/integration_tests/android_views', diff --git a/dev/devicelab/manifest.yaml b/dev/devicelab/manifest.yaml index 579508ae92c..5cafc980263 100644 --- a/dev/devicelab/manifest.yaml +++ b/dev/devicelab/manifest.yaml @@ -414,10 +414,17 @@ tasks: platform_channel_sample_test_ios: description: > - Runs a driver test on the Platform Channel sample app on iPhone 6. + Runs a driver test on the Platform Channel sample app on iPhone 6 Objective-C project. stage: devicelab_ios required_agent_capabilities: ["mac/ios"] + platform_channel_sample_test_swift: + description: > + Runs a driver test on the Platform Channel sample app on iPhone 6 Swift project. + stage: devicelab_ios + required_agent_capabilities: ["mac/ios"] + flaky: true + platform_view_ios__start_up: description: > Verifies that Platform View can be used from an iOS project. From 67ee3e191e37199a0efdf5cf41990ae7258402f6 Mon Sep 17 00:00:00 2001 From: Greg Spencer Date: Wed, 10 Jul 2019 16:48:20 -0700 Subject: [PATCH 17/41] Add anchors to samples (#35906) This adds an "anchor button" to each of the samples so that the user can link to individual samples instead of having to link to just the page. Clicking on the anchor button jumps to the anchor, as well as copying the anchor URL to the clipboard. There is some oddness in the implementation: because dartdoc uses a tag, the href for the link can't just be "#id", it has to calculate the URL from the current window href. I do that in the onmouseenter and onclick because onload doesn't get triggered for tags (and onmouseenter doesn't get triggered for mobile platforms), but I still want the href to be updated before someone right-clicks it to copy the URL. --- dev/docs/assets/snippets.css | 20 ++++++++++++++++ dev/docs/assets/snippets.js | 24 +++++++++++++++++++ .../config/skeletons/application.html | 9 +++++++ dev/snippets/config/skeletons/sample.html | 9 +++++++ dev/snippets/lib/main.dart | 2 +- dev/snippets/lib/snippets.dart | 23 +++++++++++------- dev/snippets/test/snippets_test.dart | 15 ++++++++---- 7 files changed, 87 insertions(+), 15 deletions(-) diff --git a/dev/docs/assets/snippets.css b/dev/docs/assets/snippets.css index 4fb200addbc..e5ee48f170b 100644 --- a/dev/docs/assets/snippets.css +++ b/dev/docs/assets/snippets.css @@ -83,6 +83,26 @@ font-family: courier, lucidia; } +.anchor-container { + position: relative; +} + +.anchor-button-overlay { + position: absolute; + top: 0px; + right: 5px; + height: 28px; + width: 28px; + transition: .3s ease; + background-color: #2372a3; +} + +.anchor-button { + border-style: none; + background: none; + cursor: pointer; +} + /* Styles for the copy-to-clipboard button */ .copyable-container { position: relative; diff --git a/dev/docs/assets/snippets.js b/dev/docs/assets/snippets.js index 9d4da921dac..86e9a2c1174 100644 --- a/dev/docs/assets/snippets.js +++ b/dev/docs/assets/snippets.js @@ -57,6 +57,30 @@ function supportsCopying() { !!document.queryCommandSupported('copy'); } +// Copies the given string to the clipboard. +function copyStringToClipboard(string) { + var textArea = document.createElement("textarea"); + textArea.value = string; + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + + if (!supportsCopying()) { + alert('Unable to copy to clipboard (not supported by browser)'); + return; + } + + try { + document.execCommand('copy'); + } finally { + document.body.removeChild(textArea); + } +} + +function fixHref(anchor, id) { + anchor.href = window.location.href.replace(/#.*$/, '') + '#' + id; +} + // Copies the text inside the currently visible snippet to the clipboard, or the // given element, if any. function copyTextToClipboard(element) { diff --git a/dev/snippets/config/skeletons/application.html b/dev/snippets/config/skeletons/application.html index 7d7e17bab47..56b648cc033 100644 --- a/dev/snippets/config/skeletons/application.html +++ b/dev/snippets/config/skeletons/application.html @@ -1,4 +1,13 @@ {@inject-html} + +
diff --git a/dev/snippets/lib/main.dart b/dev/snippets/lib/main.dart index 786833d161b..996b186c9bb 100644 --- a/dev/snippets/lib/main.dart +++ b/dev/snippets/lib/main.dart @@ -152,13 +152,13 @@ void main(List argList) { input, snippetType, template: template, - id: id.join('.'), output: args[_kOutputOption] != null ? File(args[_kOutputOption]) : null, metadata: { 'sourcePath': environment['SOURCE_PATH'], 'sourceLine': environment['SOURCE_LINE'] != null ? int.tryParse(environment['SOURCE_LINE']) : null, + 'id': id.join('.'), 'serial': serial, 'package': packageName, 'library': libraryName, diff --git a/dev/snippets/lib/snippets.dart b/dev/snippets/lib/snippets.dart index 9f69daec2a2..05d54f4c169 100644 --- a/dev/snippets/lib/snippets.dart +++ b/dev/snippets/lib/snippets.dart @@ -5,8 +5,9 @@ import 'dart:convert'; import 'dart:io'; -import 'package:path/path.dart' as path; import 'package:dart_style/dart_style.dart'; +import 'package:meta/meta.dart'; +import 'package:path/path.dart' as path; import 'configuration.dart'; @@ -128,13 +129,12 @@ class SnippetGenerator { 'code': htmlEscape.convert(result.join('\n')), 'language': language ?? 'dart', 'serial': '', - 'id': '', + 'id': metadata['id'], 'app': '', }; if (type == SnippetType.application) { substitutions - ..['serial'] = metadata['serial'].toString() ?? '0' - ..['id'] = injections.firstWhere((_ComponentTuple tuple) => tuple.name == 'id').mergedContent + ..['serial'] = metadata['serial']?.toString() ?? '0' ..['app'] = htmlEscape.convert(injections.firstWhere((_ComponentTuple tuple) => tuple.name == 'app').mergedContent); } return skeleton.replaceAllMapped(RegExp('{{(${substitutions.keys.join('|')})}}'), (Match match) { @@ -209,9 +209,15 @@ class SnippetGenerator { /// The [id] is a string ID to use for the output file, and to tell the user /// about in the `flutter create` hint. It must not be null if the [type] is /// [SnippetType.application]. - String generate(File input, SnippetType type, {String template, String id, File output, Map metadata}) { + String generate( + File input, + SnippetType type, { + String template, + File output, + @required Map metadata, + }) { assert(template != null || type != SnippetType.application); - assert(id != null || type != SnippetType.application); + assert(metadata != null && metadata['id'] != null); assert(input != null); final List<_ComponentTuple> snippetData = parseInput(_loadFileAsUtf8(input)); switch (type) { @@ -227,7 +233,6 @@ class SnippetGenerator { 'The template $template was not found in the templates directory ${templatesDir.path}'); exit(1); } - snippetData.add(_ComponentTuple('id', [id])); final String templateContents = _loadFileAsUtf8(templateFile); String app = interpolateTemplate(snippetData, templateContents); @@ -239,7 +244,7 @@ class SnippetGenerator { } snippetData.add(_ComponentTuple('app', app.split('\n'))); - final File outputFile = output ?? getOutputFile(id); + final File outputFile = output ?? getOutputFile(metadata['id']); stderr.writeln('Writing to ${outputFile.absolute.path}'); outputFile.writeAsStringSync(app); @@ -252,7 +257,7 @@ class SnippetGenerator { ); metadata ??= {}; metadata.addAll({ - 'id': id, + 'id': metadata['id'], 'file': path.basename(outputFile.path), 'description': description?.mergedContent, }); diff --git a/dev/snippets/test/snippets_test.dart b/dev/snippets/test/snippets_test.dart index 6408623cac4..f3cb758a3cc 100644 --- a/dev/snippets/test/snippets_test.dart +++ b/dev/snippets/test/snippets_test.dart @@ -74,8 +74,14 @@ void main() { ``` '''); - final String html = - generator.generate(inputFile, SnippetType.application, template: 'template', id: 'id'); + final String html = generator.generate( + inputFile, + SnippetType.application, + template: 'template', + metadata: { + 'id': 'id', + }, + ); expect(html, contains('
HTML Bits
')); expect(html, contains('
More HTML Bits
')); expect(html, contains('print('The actual \$name.');')); @@ -103,7 +109,7 @@ void main() { ``` '''); - final String html = generator.generate(inputFile, SnippetType.sample); + final String html = generator.generate(inputFile, SnippetType.sample, metadata: {'id': 'id'}); expect(html, contains('
HTML Bits
')); expect(html, contains('
More HTML Bits
')); expect(html, contains(' print('The actual \$name.');')); @@ -135,9 +141,8 @@ void main() { inputFile, SnippetType.application, template: 'template', - id: 'id', output: outputFile, - metadata: {'sourcePath': 'some/path.dart'}, + metadata: {'sourcePath': 'some/path.dart', 'id': 'id'}, ); expect(expectedMetadataFile.existsSync(), isTrue); final Map json = jsonDecode(expectedMetadataFile.readAsStringSync()); From 3b945da00d69698ab09f4375da16e13918508afc Mon Sep 17 00:00:00 2001 From: Greg Spencer Date: Wed, 10 Jul 2019 16:49:32 -0700 Subject: [PATCH 18/41] Change focus example to be more canonical (and correct), listening to the focus node for changes. (#35913) This changes the example for FocusNode to be more correct, listening to the focus node for changes, instead of assuming that it is the only one doing the changing. --- .../lib/src/widgets/focus_manager.dart | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/packages/flutter/lib/src/widgets/focus_manager.dart b/packages/flutter/lib/src/widgets/focus_manager.dart index 572e21886b5..5f00e0610c7 100644 --- a/packages/flutter/lib/src/widgets/focus_manager.dart +++ b/packages/flutter/lib/src/widgets/focus_manager.dart @@ -236,6 +236,7 @@ class FocusAttachment { /// /// class _ColorfulButtonState extends State { /// FocusNode _node; +/// bool _focused = false; /// FocusAttachment _nodeAttachment; /// Color _color = Colors.white; /// @@ -243,9 +244,18 @@ class FocusAttachment { /// void initState() { /// super.initState(); /// _node = FocusNode(debugLabel: 'Button'); +/// _node.addListener(_handleFocusChange); /// _nodeAttachment = _node.attach(context, onKey: _handleKeyPress); /// } /// +/// void _handleFocusChange() { +/// if (_node.hasFocus != _focused) { +/// setState(() { +/// _focused = _node.hasFocus; +/// }); +/// } +/// } +/// /// bool _handleKeyPress(FocusNode node, RawKeyEvent event) { /// if (event is RawKeyDownEvent) { /// print('Focus node ${node.debugLabel} got key event: ${event.logicalKey}'); @@ -274,6 +284,7 @@ class FocusAttachment { /// /// @override /// void dispose() { +/// _node.removeListener(_handleFocusChange); /// // The attachment will automatically be detached in dispose(). /// _node.dispose(); /// super.dispose(); @@ -284,24 +295,20 @@ class FocusAttachment { /// _nodeAttachment.reparent(); /// return GestureDetector( /// onTap: () { -/// if (_node.hasFocus) { -/// setState(() { +/// if (_focused) { /// _node.unfocus(); -/// }); /// } else { -/// setState(() { -/// _node.requestFocus(); -/// }); +/// _node.requestFocus(); /// } /// }, /// child: Center( /// child: Container( /// width: 400, /// height: 100, -/// color: _node.hasFocus ? _color : Colors.white, +/// color: _focused ? _color : Colors.white, /// alignment: Alignment.center, /// child: Text( -/// _node.hasFocus ? "I'm in color! Press R,G,B!" : 'Press to focus'), +/// _focused ? "I'm in color! Press R,G,B!" : 'Press to focus'), /// ), /// ), /// ); From 0a39d8d92ed43a0b7efcc93742a17660a14d78aa Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Wed, 10 Jul 2019 19:17:14 -0700 Subject: [PATCH 19/41] Use test instead of test_api package in platform_channel_swift example tests (#35942) --- examples/platform_channel_swift/pubspec.yaml | 30 ++++++++++++++++++- .../test_driver/button_tap_test.dart | 12 ++++---- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/examples/platform_channel_swift/pubspec.yaml b/examples/platform_channel_swift/pubspec.yaml index 7ec81cdaa84..41aebd92fb3 100644 --- a/examples/platform_channel_swift/pubspec.yaml +++ b/examples/platform_channel_swift/pubspec.yaml @@ -18,30 +18,58 @@ dev_dependencies: sdk: flutter flutter_driver: sdk: flutter + test: 1.6.3 + analyzer: 0.36.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + args: 1.5.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" async: 2.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + html: 0.14.0+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + http: 0.12.0+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + http_multi_server: 2.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + http_parser: 3.1.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" intl: 0.15.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + io: 0.3.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + js: 0.6.1+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" json_rpc_2: 2.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + kernel: 0.3.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" matcher: 0.12.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + mime: 0.9.6+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + multi_server_socket: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + node_preamble: 1.4.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + package_config: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + package_resolver: 1.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" path: 1.6.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" pedantic: 1.8.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + pool: 1.4.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" pub_semver: 1.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" quiver: 2.0.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + shelf: 0.7.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + shelf_packages_handler: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + shelf_static: 0.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + shelf_web_socket: 0.2.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + source_map_stack_trace: 1.1.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + source_maps: 0.10.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" source_span: 1.5.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" stack_trace: 1.9.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" stream_channel: 2.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" string_scanner: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" term_glyph: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" test_api: 0.2.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + test_core: 0.2.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + watcher: 0.9.7+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" web_socket_channel: 1.0.14 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + yaml: 2.1.16 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 40fb +# PUBSPEC CHECKSUM: b1b5 diff --git a/examples/platform_channel_swift/test_driver/button_tap_test.dart b/examples/platform_channel_swift/test_driver/button_tap_test.dart index 974975990ad..b2e38b2ed13 100644 --- a/examples/platform_channel_swift/test_driver/button_tap_test.dart +++ b/examples/platform_channel_swift/test_driver/button_tap_test.dart @@ -3,7 +3,7 @@ // found in the LICENSE file. import 'package:flutter_driver/flutter_driver.dart'; -import 'package:test_api/test_api.dart' hide TypeMatcher, isInstanceOf; +import 'package:test/test.dart' hide TypeMatcher, isInstanceOf; void main() { group('button tap test', () { @@ -19,18 +19,20 @@ void main() { }); test('tap on the button, verify result', () async { - final SerializableFinder batteryLevelLabel = find.byValueKey('Battery level label'); + final SerializableFinder batteryLevelLabel = + find.byValueKey('Battery level label'); expect(batteryLevelLabel, isNotNull); - final SerializableFinder button = find.text('Get Battery Level'); + final SerializableFinder button = find.text('Refresh'); await driver.waitFor(button); await driver.tap(button); String batteryLevel; - while (batteryLevel == null || batteryLevel.isEmpty) { + while (batteryLevel == null || batteryLevel.contains('unknown')) { batteryLevel = await driver.getText(batteryLevelLabel); } - expect(batteryLevel, isNotEmpty); + + expect(batteryLevel.contains('%'), isTrue); }); }); } From b69feb5340f3b50864fae8786b5176ae1dd06bdd Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Thu, 11 Jul 2019 01:56:27 -0400 Subject: [PATCH 20/41] Roll engine 75387dbc147d..49445ce4949b (32 commits) (#35952) https://github.com/flutter/engine/compare/75387dbc147d...49445ce4949b git log 75387dbc147d1cee8164f5d61582eab8ba1e5058..49445ce4949bf0d28506a6b22e28b4264f624e5f --no-merges --oneline 49445ce49 FLEViewController/Engine API changes (flutter/engine#9750) 2a79462fd Add Fuchsia build CI presubmit steps (flutter/engine#9736) 67cebdb92 Roll fuchsia/sdk/core/linux-amd64 from KGmm_RIJoXS19zTm2crjM3RYpmp5Y03-fLUeVdylbTYC to ehWVT9QJbC-vFMM6SkkQM9HJ9oITFCws7FC9JnrFq2gC (flutter/engine#9765) 089c74084 Roll fuchsia/sdk/core/mac-amd64 from lCQWEeR_Ert7t_qAbMRycwrRyZC-dIprYPyPJzwPmg4C to EYnRdXFT9l-d8Qkz4zeTRXnqfV3KQzpQhoPs1r0-740C (flutter/engine#9759) b22410ef6 Include SkParagraph headers only when the enable-skshaper flag is on (flutter/engine#9758) 2cd650d26 Minimal integration with the Skia text shaper module (flutter/engine#9556) f775f5e4d Re-enable the Wuffs GIF decoder (flutter/engine#9466) aca048236 Make all shell unit tests use the OpenGL rasterizer. (flutter/engine#9746) bc57291ff Make FLEViewController's view an internal detail (flutter/engine#9741) 9776043ea Synchronize main thread and gpu thread for first render frame (flutter/engine#9506) f600ae830 Use libc++ variant of string view and remove the FML variant. (flutter/engine#9737) 564f53f0a Revert "Improve caching limits for Skia (#9503)" (flutter/engine#9740) b453d3c3d libtxt: fix reference counting of SkFontStyleSets held by font asset providers (flutter/engine#9561) fa7627d17 Fix backspace crash on Chinese devices (flutter/engine#9734) 56885f79b Let pushColorFilter accept all types of ColorFilters (flutter/engine#9641) 6dccb21e6 Roll src/third_party/skia 96fdfe0fe88e..af4e7b6cf616 (1 commits) (flutter/engine#9735) 8511d9b47 Roll fuchsia/sdk/core/mac-amd64 from byM-kyxL4bemlTYNqhKUfJfZoIUrCSzS6XzsFr4n9-MC to lCQWEeR_Ert7t_qAbMRycwrRyZC-dIprYPyPJzwPmg4C (flutter/engine#9742) b3bf0a182 Roll fuchsia/sdk/core/linux-amd64 from I2Qe1zxgckzIzMBTztvzeWYsDgcb9Fw-idSI16oIlx8C to KGmm_RIJoXS19zTm2crjM3RYpmp5Y03-fLUeVdylbTYC (flutter/engine#9743) 7e568232a Fix windows test by not attempting to open a directory as a file. (flutter/engine#9745) 6cf0d1350 Roll src/third_party/skia a3ffaabcc4f2..96fdfe0fe88e (5 commits) (flutter/engine#9731) 49a00aed8 Fix Fuchsia build. (flutter/engine#9730) b3bb39b0b Roll src/third_party/dart 06c3d7ad3a...09fc76bc51 (flutter/engine#9728) 2284210f4 Make the license script compatible with recently changed Dart I/O stream APIs (flutter/engine#9725) ad582b508 Rework image & texture management to use concurrent message queues. (flutter/engine#9486) 1dcd5f52b Roll src/third_party/skia 6b82cf638682..a3ffaabcc4f2 (24 commits) (flutter/engine#9726) 129979cab Revert "Roll src/third_party/dart 06c3d7ad3a..7acecda2cc (12 commits)" (flutter/engine#9724) 8020d7e43 Roll src/third_party/skia 56065d9b875f..6b82cf638682 (3 commits) (flutter/engine#9718) e24bd7846 Roll src/third_party/dart 06c3d7ad3a..7acecda2cc (12 commits) 3d2668c35 Reland isolate group changes 802bd1518 iOS platform view opacity (flutter/engine#9667) 3b6265b74 Roll src/third_party/dart b5aeaa6796..06c3d7ad3a (44 commits) 887e05233 Refactor ColorFilter to have a native wrapper (flutter/engine#9668) The AutoRoll server is located here: https://autoroll.skia.org/r/flutter-engine-flutter-autoroll Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+/master/autoroll/README.md If the roll is causing failures, please contact the current sheriff (garyq@google.com), and stop the roller if necessary. --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 17966d739cf..b944f1d5c86 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -75387dbc147d1cee8164f5d61582eab8ba1e5058 +49445ce4949bf0d28506a6b22e28b4264f624e5f From e8fbdd85f02108db66688fde41ded773ee03b7a7 Mon Sep 17 00:00:00 2001 From: Greg Spencer Date: Thu, 11 Jul 2019 07:56:30 -0700 Subject: [PATCH 21/41] Add example showing how to move from one field to the next. (#35926) This adds an example of how to move to the "next" field when using TextInputAction.next. This is all that is needed to have "next field" functionality in a field. I thought about making it the default when handling the "next" or "previous" actions, but it's better that the developer has control over whether or not they actually move to the next field, and within which scope. --- .../flutter/lib/src/cupertino/text_field.dart | 6 ++ .../flutter/lib/src/material/text_field.dart | 6 ++ .../lib/src/widgets/editable_text.dart | 59 ++++++++++++++++++- 3 files changed, 70 insertions(+), 1 deletion(-) diff --git a/packages/flutter/lib/src/cupertino/text_field.dart b/packages/flutter/lib/src/cupertino/text_field.dart index 3c357f1d205..6a77c118ab6 100644 --- a/packages/flutter/lib/src/cupertino/text_field.dart +++ b/packages/flutter/lib/src/cupertino/text_field.dart @@ -411,6 +411,12 @@ class CupertinoTextField extends StatefulWidget { final VoidCallback onEditingComplete; /// {@macro flutter.widgets.editableText.onSubmitted} + /// + /// See also: + /// + /// * [EditableText.onSubmitted] for an example of how to handle moving to + /// the next/previous field when using [TextInputAction.next] and + /// [TextInputAction.previous] for [textInputAction]. final ValueChanged onSubmitted; /// {@macro flutter.widgets.editableText.inputFormatters} diff --git a/packages/flutter/lib/src/material/text_field.dart b/packages/flutter/lib/src/material/text_field.dart index 8b98affeafd..0a1d29a9521 100644 --- a/packages/flutter/lib/src/material/text_field.dart +++ b/packages/flutter/lib/src/material/text_field.dart @@ -388,6 +388,12 @@ class TextField extends StatefulWidget { final VoidCallback onEditingComplete; /// {@macro flutter.widgets.editableText.onSubmitted} + /// + /// See also: + /// + /// * [EditableText.onSubmitted] for an example of how to handle moving to + /// the next/previous field when using [TextInputAction.next] and + /// [TextInputAction.previous] for [textInputAction]. final ValueChanged onSubmitted; /// {@macro flutter.widgets.editableText.inputFormatters} diff --git a/packages/flutter/lib/src/widgets/editable_text.dart b/packages/flutter/lib/src/widgets/editable_text.dart index 6cb99d4f797..468b0a834b5 100644 --- a/packages/flutter/lib/src/widgets/editable_text.dart +++ b/packages/flutter/lib/src/widgets/editable_text.dart @@ -101,7 +101,7 @@ const int _kObscureShowLatestCharCursorTicks = 3; /// padding: const EdgeInsets.all(6), /// child: TextFormField( /// controller: _controller, -/// decoration: InputDecoration(border: OutlineInputBorder()), +/// decoration: InputDecoration(border: OutlineInputBorder()), /// ), /// ), /// ); @@ -688,6 +688,63 @@ class EditableText extends StatefulWidget { /// Called when the user indicates that they are done editing the text in the /// field. /// {@endtemplate} + /// + /// {@tool snippet --template=stateful_widget_material} + /// When a non-completion action is pressed, such as "next" or "previous", it + /// is often desirable to move the focus to the next or previous field. To do + /// this, handle it as in this example, by calling [FocusNode.focusNext] in + /// the [TextFormField.onFieldSubmitted] callback ([TextFormField] wraps + /// [EditableText] internally, and uses the value of `onFieldSubmitted` as its + /// [onSubmitted]). + /// + /// ```dart + /// FocusScopeNode _focusScopeNode = FocusScopeNode(); + /// final _controller1 = TextEditingController(); + /// final _controller2 = TextEditingController(); + /// + /// void dispose() { + /// _focusScopeNode.dispose(); + /// _controller1.dispose(); + /// _controller2.dispose(); + /// super.dispose(); + /// } + /// + /// void _handleSubmitted(String value) { + /// _focusScopeNode.nextFocus(); + /// } + /// + /// Widget build(BuildContext context) { + /// return Scaffold( + /// body: FocusScope( + /// node: _focusScopeNode, + /// child: Column( + /// mainAxisAlignment: MainAxisAlignment.center, + /// children: [ + /// Padding( + /// padding: const EdgeInsets.all(8.0), + /// child: TextFormField( + /// textInputAction: TextInputAction.next, + /// onFieldSubmitted: _handleSubmitted, + /// controller: _controller1, + /// decoration: InputDecoration(border: OutlineInputBorder()), + /// ), + /// ), + /// Padding( + /// padding: const EdgeInsets.all(8.0), + /// child: TextFormField( + /// textInputAction: TextInputAction.next, + /// onFieldSubmitted: _handleSubmitted, + /// controller: _controller2, + /// decoration: InputDecoration(border: OutlineInputBorder()), + /// ), + /// ), + /// ], + /// ), + /// ), + /// ); + /// } + /// ``` + /// {@end-tool} final ValueChanged onSubmitted; /// Called when the user changes the selection of text (including the cursor From d200dc150bb069ff7ec6c50c00d25f2b1a3ed631 Mon Sep 17 00:00:00 2001 From: sjindel-google Date: Thu, 11 Jul 2019 18:56:48 +0200 Subject: [PATCH 22/41] Keep LLDB connection to iOS device alive while running from CLI. (#35731) --- packages/flutter_tools/lib/src/ios/devices.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/flutter_tools/lib/src/ios/devices.dart b/packages/flutter_tools/lib/src/ios/devices.dart index 3ac80c57f45..5b8eac2ae6b 100644 --- a/packages/flutter_tools/lib/src/ios/devices.dart +++ b/packages/flutter_tools/lib/src/ios/devices.dart @@ -45,7 +45,7 @@ class IOSDeploy { '--bundle', bundlePath, '--no-wifi', - '--justlaunch', + '--no-interactive', ]; if (launchArguments.isNotEmpty) { launchCommand.add('--args'); From ae8ff41abffabb0176a27ab991ef1240b11ecdc5 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Thu, 11 Jul 2019 10:44:41 -0700 Subject: [PATCH 23/41] Revert "Keep LLDB connection to iOS device alive while running from CLI. (#35731)" (#35996) This reverts commit d200dc150bb069ff7ec6c50c00d25f2b1a3ed631. --- packages/flutter_tools/lib/src/ios/devices.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/flutter_tools/lib/src/ios/devices.dart b/packages/flutter_tools/lib/src/ios/devices.dart index 5b8eac2ae6b..3ac80c57f45 100644 --- a/packages/flutter_tools/lib/src/ios/devices.dart +++ b/packages/flutter_tools/lib/src/ios/devices.dart @@ -45,7 +45,7 @@ class IOSDeploy { '--bundle', bundlePath, '--no-wifi', - '--no-interactive', + '--justlaunch', ]; if (launchArguments.isNotEmpty) { launchCommand.add('--args'); From d7f01757f860061620a1555eab5d73c2a57169fc Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Thu, 11 Jul 2019 14:29:27 -0400 Subject: [PATCH 24/41] Roll engine 49445ce4949b..0f6229ab1d39 (6 commits) (#35990) https://github.com/flutter/engine/compare/49445ce4949b...0f6229ab1d39 git log 49445ce4949bf0d28506a6b22e28b4264f624e5f..0f6229ab1d3915bac6967f08a8074d58ebfeb656 --no-merges --oneline 0f6229ab1 Roll fuchsia/sdk/core/mac-amd64 from lKQ0yBPnk1oXLyNM7XhqSDl5llP6Cx2GWkQjS0ExozcC to XOXaWqvr4OuJ6O3uPefSwSFjZMaEmDHy5JQm3Q8Oc0wC (flutter/engine#9786) e40149eaf Roll src/third_party/skia af4e7b6cf616..f9fcf7ffa89a (33 commits) (flutter/engine#9784) 009b1d5a9 Roll fuchsia/sdk/core/mac-amd64 from 1F71B9KuZAVZz0LDQW_g0bbfWsxEgQkDpHPKrkc97xYC to lKQ0yBPnk1oXLyNM7XhqSDl5llP6Cx2GWkQjS0ExozcC (flutter/engine#9779) fbe50c6a6 Roll fuchsia/sdk/core/mac-amd64 from bYFmlYp6Mc82r7dw58IaEny3_mnq-yZW06Ccr19j0lIC to 1F71B9KuZAVZz0LDQW_g0bbfWsxEgQkDpHPKrkc97xYC (flutter/engine#9778) 51c3c11b8 fix objcdoc generation (flutter/engine#9772) f076a60c9 Roll fuchsia/sdk/core/mac-amd64 from EYnRdXFT9l-d8Qkz4zeTRXnqfV3KQzpQhoPs1r0-740C to bYFmlYp6Mc82r7dw58IaEny3_mnq-yZW06Ccr19j0lIC (flutter/engine#9771) The AutoRoll server is located here: https://autoroll.skia.org/r/flutter-engine-flutter-autoroll Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+/master/autoroll/README.md If the roll is causing failures, please contact the current sheriff (garyq@google.com), and stop the roller if necessary. --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index b944f1d5c86..980818d411f 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -49445ce4949bf0d28506a6b22e28b4264f624e5f +0f6229ab1d3915bac6967f08a8074d58ebfeb656 From 7ea7f1c62be23dcba519328ed09582517111cfb8 Mon Sep 17 00:00:00 2001 From: Matt Carroll Date: Thu, 11 Jul 2019 12:04:10 -0700 Subject: [PATCH 25/41] Upgraded framework packages with 'flutter update-packages --force-upgrade'. (#35932) --- examples/flutter_gallery/pubspec.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/flutter_gallery/pubspec.yaml b/examples/flutter_gallery/pubspec.yaml index b070e6998d4..31f9e280d39 100644 --- a/examples/flutter_gallery/pubspec.yaml +++ b/examples/flutter_gallery/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: intl: 0.15.8 connectivity: 0.4.3+4 string_scanner: 1.0.4 - url_launcher: 5.0.3 + url_launcher: 5.0.5 cupertino_icons: 0.1.2 video_player: 0.10.1+3 scoped_model: 1.0.1 @@ -254,4 +254,4 @@ flutter: - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Regular.ttf - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Light.ttf -# PUBSPEC CHECKSUM: 967f +# PUBSPEC CHECKSUM: 7e81 From 735352a8c0a462b234a20ee6ed50bc03d4a20079 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Thu, 11 Jul 2019 13:09:30 -0700 Subject: [PATCH 26/41] Deflake ImageProvider.evict test (#35999) --- .../flutter/test/painting/image_provider_test.dart | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/flutter/test/painting/image_provider_test.dart b/packages/flutter/test/painting/image_provider_test.dart index de62119d4b7..656edfce92c 100644 --- a/packages/flutter/test/painting/image_provider_test.dart +++ b/packages/flutter/test/painting/image_provider_test.dart @@ -44,11 +44,19 @@ void main() { final ImageCache otherCache = ImageCache(); final Uint8List bytes = Uint8List.fromList(kTransparentImage); final MemoryImage imageProvider = MemoryImage(bytes); - otherCache.putIfAbsent(imageProvider, () => imageProvider.load(imageProvider)); + final ImageStreamCompleter cacheStream = otherCache.putIfAbsent( + imageProvider, () => imageProvider.load(imageProvider), + ); final ImageStream stream = imageProvider.resolve(ImageConfiguration.empty); final Completer completer = Completer(); - stream.addListener(ImageStreamListener((ImageInfo info, bool syncCall) => completer.complete())); - await completer.future; + final Completer cacheCompleter = Completer(); + stream.addListener(ImageStreamListener((ImageInfo info, bool syncCall) { + completer.complete(); + })); + cacheStream.addListener(ImageStreamListener((ImageInfo info, bool syncCall) { + cacheCompleter.complete(); + })); + await Future.wait(>[completer.future, cacheCompleter.future]); expect(otherCache.currentSize, 1); expect(imageCache.currentSize, 1); From b1a8637028e1f85a421a8a46a90235276a4e1188 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Thu, 11 Jul 2019 16:37:27 -0400 Subject: [PATCH 27/41] Roll engine 0f6229ab1d39..3b944102a56e (3 commits) (#36000) https://github.com/flutter/engine/compare/0f6229ab1d39...3b944102a56e git log 0f6229ab1d3915bac6967f08a8074d58ebfeb656..3b944102a56e8f4182e6601113fc36538edf3de9 --no-merges --oneline 3b944102a Un-deprecated FlutterViewController's binaryMessenger. (flutter/engine#9767) 7e65b81cc Roll src/third_party/dart 09fc76bc51..24725a8559 (43 commits) a03e74743 Add hooks for InputConnection lock and unlocking (flutter/engine#9727) The AutoRoll server is located here: https://autoroll.skia.org/r/flutter-engine-flutter-autoroll Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+/master/autoroll/README.md If the roll is causing failures, please contact the current sheriff (garyq@google.com), and stop the roller if necessary. --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 980818d411f..4cc7c1660df 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -0f6229ab1d3915bac6967f08a8074d58ebfeb656 +3b944102a56e8f4182e6601113fc36538edf3de9 From 539f09f801f5f42e59c40c1ed6883638e94e311b Mon Sep 17 00:00:00 2001 From: LongCatIsLooong <31859944+LongCatIsLooong@users.noreply.github.com> Date: Thu, 11 Jul 2019 13:54:51 -0700 Subject: [PATCH 28/41] Remove `_debugWillReattachChildren` assertions from `_TableElement` (#34202) --- packages/flutter/lib/src/widgets/table.dart | 20 +-------- packages/flutter/test/widgets/table_test.dart | 45 +++++++++++++++++++ 2 files changed, 46 insertions(+), 19 deletions(-) diff --git a/packages/flutter/lib/src/widgets/table.dart b/packages/flutter/lib/src/widgets/table.dart index d5f9564f13a..7f823fc144a 100644 --- a/packages/flutter/lib/src/widgets/table.dart +++ b/packages/flutter/lib/src/widgets/table.dart @@ -250,13 +250,9 @@ class _TableElement extends RenderObjectElement { List<_TableElementRow> _children = const<_TableElementRow>[]; - bool _debugWillReattachChildren = false; - @override void mount(Element parent, dynamic newSlot) { super.mount(parent, newSlot); - assert(!_debugWillReattachChildren); - assert(() { _debugWillReattachChildren = true; return true; }()); _children = widget.children.map<_TableElementRow>((TableRow row) { return _TableElementRow( key: row.key, @@ -266,32 +262,20 @@ class _TableElement extends RenderObjectElement { }).toList(growable: false), ); }).toList(growable: false); - assert(() { _debugWillReattachChildren = false; return true; }()); _updateRenderObjectChildren(); } @override void insertChildRenderObject(RenderObject child, Element slot) { - assert(_debugWillReattachChildren); renderObject.setupParentData(child); } @override void moveChildRenderObject(RenderObject child, dynamic slot) { - assert(_debugWillReattachChildren); } @override void removeChildRenderObject(RenderObject child) { - assert(() { - if (_debugWillReattachChildren) - return true; - for (Element forgottenChild in _forgottenChildren) { - if (forgottenChild.renderObject == child) - return true; - } - return false; - }()); final TableCellParentData childParentData = child.parentData; renderObject.setChild(childParentData.x, childParentData.y, null); } @@ -300,8 +284,6 @@ class _TableElement extends RenderObjectElement { @override void update(Table newWidget) { - assert(!_debugWillReattachChildren); - assert(() { _debugWillReattachChildren = true; return true; }()); final Map> oldKeyedRows = >{}; for (_TableElementRow row in _children) { if (row.key != null) { @@ -330,7 +312,7 @@ class _TableElement extends RenderObjectElement { updateChildren(oldUnkeyedRows.current.children, const [], forgottenChildren: _forgottenChildren); for (List oldChildren in oldKeyedRows.values.where((List list) => !taken.contains(list))) updateChildren(oldChildren, const [], forgottenChildren: _forgottenChildren); - assert(() { _debugWillReattachChildren = false; return true; }()); + _children = newChildren; _updateRenderObjectChildren(); _forgottenChildren.clear(); diff --git a/packages/flutter/test/widgets/table_test.dart b/packages/flutter/test/widgets/table_test.dart index e96c1ada904..3614d1e22b3 100644 --- a/packages/flutter/test/widgets/table_test.dart +++ b/packages/flutter/test/widgets/table_test.dart @@ -19,6 +19,24 @@ class TestStatefulWidgetState extends State { Widget build(BuildContext context) => Container(); } +class TestChildWidget extends StatefulWidget { + const TestChildWidget({ Key key }) : super(key: key); + + @override + TestChildState createState() => TestChildState(); +} + +class TestChildState extends State { + bool toggle = true; + + void toggleMe() { + setState(() { toggle = !toggle; }); + } + + @override + Widget build(BuildContext context) => toggle ? const SizedBox() : const Text('CRASHHH'); +} + void main() { testWidgets('Table widget - empty', (WidgetTester tester) async { await tester.pumpWidget( @@ -855,5 +873,32 @@ void main() { ); }); + // Regression test for https://github.com/flutter/flutter/issues/31473. + testWidgets( + 'Does not crash if a child RenderObject is replaced by another RenderObject of a different type', + (WidgetTester tester) async { + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: Table(children: const [TableRow(children: [TestChildWidget()])]), + ), + ); + expect(find.text('CRASHHH'), findsNothing); + + final TestChildState state = tester.state(find.byType(TestChildWidget)); + state.toggleMe(); + + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: Table(children: const [TableRow(children: [TestChildWidget()])]), + ), + ); + + // Should not crash. + expect(find.text('CRASHHH'), findsOneWidget); + } + ); + // TODO(ianh): Test handling of TableCell object } From 7a20148548b7e1050722b64414a59010cb84ad88 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Thu, 11 Jul 2019 15:49:51 -0700 Subject: [PATCH 29/41] Add colorFilterLayer/Widget (#35468) --- bin/internal/goldens.version | 3 +- packages/flutter/lib/src/rendering/layer.dart | 39 +++++++++++ .../flutter/lib/src/rendering/object.dart | 18 +++++ .../flutter/lib/src/widgets/color_filter.dart | 60 ++++++++++++++++ packages/flutter/lib/widgets.dart | 1 + .../flutter/test/rendering/layers_test.dart | 9 +++ .../test/widgets/color_filter_test.dart | 69 +++++++++++++++++++ 7 files changed, 198 insertions(+), 1 deletion(-) create mode 100644 packages/flutter/lib/src/widgets/color_filter.dart create mode 100644 packages/flutter/test/widgets/color_filter_test.dart diff --git a/bin/internal/goldens.version b/bin/internal/goldens.version index d264de3f438..3299376f669 100644 --- a/bin/internal/goldens.version +++ b/bin/internal/goldens.version @@ -1 +1,2 @@ -b2cef0060add1b33bf65c97aaf80146b54cf7b86 +09a19be7d0cd25eb7602b6ead198e8cf234a9ed2 + diff --git a/packages/flutter/lib/src/rendering/layer.dart b/packages/flutter/lib/src/rendering/layer.dart index e41b6c0a509..22ef5d0d700 100644 --- a/packages/flutter/lib/src/rendering/layer.dart +++ b/packages/flutter/lib/src/rendering/layer.dart @@ -1196,6 +1196,45 @@ class ClipPathLayer extends ContainerLayer { } } +/// A composite layer that applies a [ColorFilter] to its children. +class ColorFilterLayer extends ContainerLayer { + /// Creates a layer that applies a [ColorFilter] to its children. + /// + /// The [ColorFilter] property must be non-null before the compositing phase + /// of the pipeline. + ColorFilterLayer({ + @required ColorFilter colorFilter, + }) : _colorFilter = colorFilter, + assert(colorFilter != null); + + /// The color filter to apply to children. + /// + /// The scene must be explicitly recomposited after this property is changed + /// (as described at [Layer]). + ColorFilter get colorFilter => _colorFilter; + ColorFilter _colorFilter; + set colorFilter(ColorFilter value) { + if (value != _colorFilter) { + _colorFilter = value; + markNeedsAddToScene(); + } + } + + @override + ui.EngineLayer addToScene(ui.SceneBuilder builder, [ Offset layerOffset = Offset.zero ]) { + builder.pushColorFilter(colorFilter); + addChildrenToScene(builder, layerOffset); + builder.pop(); + return null; // this does not return an engine layer yet. + } + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties.add(DiagnosticsProperty('colorFilter', colorFilter)); + } +} + /// A composited layer that applies a given transformation matrix to its /// children. /// diff --git a/packages/flutter/lib/src/rendering/object.dart b/packages/flutter/lib/src/rendering/object.dart index 3aeb6d83dde..8d9424f3512 100644 --- a/packages/flutter/lib/src/rendering/object.dart +++ b/packages/flutter/lib/src/rendering/object.dart @@ -444,6 +444,24 @@ class PaintingContext extends ClipContext { } } + /// Blend further painting with a color filter. + /// + /// * `offset` is the offset from the origin of the canvas' coordinate system + /// to the origin of the caller's coordinate system. + /// * `colorFilter` is the [ColorFilter] value to use when blending the + /// painting done by `painter`. + /// * `painter` is a callback that will paint with the `colorFilter` applied. + /// This function calls the `painter` synchronously. + /// + /// A [RenderObject] that uses this function is very likely to require its + /// [RenderObject.alwaysNeedsCompositing] property to return true. That informs + /// ancestor render objects that this render object will include a composited + /// layer, which, for example, causes them to use composited clips. + void pushColorFilter(Offset offset, ColorFilter colorFilter, PaintingContextCallback painter) { + assert(colorFilter != null); + pushLayer(ColorFilterLayer(colorFilter: colorFilter), painter, offset); + } + /// Transform further painting using a matrix. /// /// * `needsCompositing` is whether the child needs compositing. Typically diff --git a/packages/flutter/lib/src/widgets/color_filter.dart b/packages/flutter/lib/src/widgets/color_filter.dart new file mode 100644 index 00000000000..923784d23a2 --- /dev/null +++ b/packages/flutter/lib/src/widgets/color_filter.dart @@ -0,0 +1,60 @@ +// Copyright 2019 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 'dart:ui'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/rendering.dart'; + +import 'framework.dart'; + +/// Applies a [ColorFilter] to its child. +@immutable +class ColorFiltered extends SingleChildRenderObjectWidget { + /// Creates a widget that applies a [ColorFilter] to its child. + /// + /// The [colorFilter] must not be null. + const ColorFiltered({@required this.colorFilter, Widget child, Key key}) + : assert(colorFilter != null), + super(key: key, child: child); + + /// The color filter to apply to the child of this widvget. + final ColorFilter colorFilter; + + @override + RenderObject createRenderObject(BuildContext context) => _ColorFilterRenderObject(colorFilter); + + @override + void updateRenderObject(BuildContext context, _ColorFilterRenderObject renderObject) { + renderObject..colorFilter = colorFilter; + } + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties.add(DiagnosticsProperty('colorFilter', colorFilter)); + } +} + +class _ColorFilterRenderObject extends RenderProxyBox { + _ColorFilterRenderObject(this._colorFilter); + + ColorFilter get colorFilter => _colorFilter; + ColorFilter _colorFilter; + set colorFilter(ColorFilter value) { + assert(value != null); + if (value != _colorFilter) { + _colorFilter = value; + markNeedsPaint(); + } + } + + @override + bool get alwaysNeedsCompositing => child != null; + + @override + void paint(PaintingContext context, Offset offset) { + context.pushColorFilter(offset, colorFilter, super.paint); + } +} diff --git a/packages/flutter/lib/widgets.dart b/packages/flutter/lib/widgets.dart index d0871cfa1ae..5c8e006e4c4 100644 --- a/packages/flutter/lib/widgets.dart +++ b/packages/flutter/lib/widgets.dart @@ -27,6 +27,7 @@ export 'src/widgets/banner.dart'; export 'src/widgets/basic.dart'; export 'src/widgets/binding.dart'; export 'src/widgets/bottom_navigation_bar_item.dart'; +export 'src/widgets/color_filter.dart'; export 'src/widgets/container.dart'; export 'src/widgets/debug.dart'; export 'src/widgets/dismissible.dart'; diff --git a/packages/flutter/test/rendering/layers_test.dart b/packages/flutter/test/rendering/layers_test.dart index 8abcf84da5b..0137209973f 100644 --- a/packages/flutter/test/rendering/layers_test.dart +++ b/packages/flutter/test/rendering/layers_test.dart @@ -250,6 +250,15 @@ void main() { }); }); + test('mutating ColorFilterLayer fields triggers needsAddToScene', () { + final ColorFilterLayer layer = ColorFilterLayer( + colorFilter: const ColorFilter.mode(Color(0xFFFF0000), BlendMode.color), + ); + checkNeedsAddToScene(layer, () { + layer.colorFilter = const ColorFilter.mode(Color(0xFF00FF00), BlendMode.color); + }); + }); + test('mutating ShaderMaskLayer fields triggers needsAddToScene', () { const Gradient gradient = RadialGradient(colors: [Color(0x00000000), Color(0x00000001)]); final Shader shader = gradient.createShader(Rect.zero); diff --git a/packages/flutter/test/widgets/color_filter_test.dart b/packages/flutter/test/widgets/color_filter_test.dart new file mode 100644 index 00000000000..2f09cd15eba --- /dev/null +++ b/packages/flutter/test/widgets/color_filter_test.dart @@ -0,0 +1,69 @@ +// Copyright 2019 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:flutter_test/flutter_test.dart'; +import 'package:flutter/material.dart'; + +void main() { + testWidgets('Color filter - red', (WidgetTester tester) async { + await tester.pumpWidget( + const RepaintBoundary( + child: ColorFiltered( + colorFilter: ColorFilter.mode(Colors.red, BlendMode.color), + child: Placeholder(), + ), + ), + ); + await expectLater( + find.byType(ColorFiltered), + matchesGoldenFile( + 'color_filter_red.png', + version: 1, + ), + skip: !isLinux + ); + }); + + testWidgets('Color filter - sepia', (WidgetTester tester) async { + // TODO(dnfield): This should be const. https://github.com/dart-lang/sdk/issues/37503 + final ColorFilter sepia = ColorFilter.matrix([ + 0.39, 0.769, 0.189, 0, 0, // + 0.349, 0.686, 0.168, 0, 0, // + 0.272, 0.534, 0.131, 0, 0, // + 0, 0, 0, 1, 0, // + ]); + await tester.pumpWidget( + RepaintBoundary( + child: ColorFiltered( + colorFilter: sepia, + child: MaterialApp( + title: 'Flutter Demo', + theme: ThemeData(primarySwatch: Colors.blue), + home: Scaffold( + appBar: AppBar( + title: const Text('Sepia ColorFilter Test'), + ), + body: const Center( + child:Text('Hooray!'), + ), + floatingActionButton: FloatingActionButton( + onPressed: () { }, + tooltip: 'Increment', + child: const Icon(Icons.add), + ), + ), + ), + ), + ) + ); + await expectLater( + find.byType(ColorFiltered), + matchesGoldenFile( + 'color_filter_sepia.png', + version: 1, + ), + skip: !isLinux + ); + }); +} \ No newline at end of file From 8d81c30a7c0dacb6d3ddc7f04a96a8d5911ceae1 Mon Sep 17 00:00:00 2001 From: Ben Konyi Date: Mon, 8 Jul 2019 15:09:17 -0700 Subject: [PATCH 30/41] [WIP] Use public _registerService RPC --- packages/flutter_tools/lib/src/vmservice.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/flutter_tools/lib/src/vmservice.dart b/packages/flutter_tools/lib/src/vmservice.dart index 31dd3697096..b05aa2ddd06 100644 --- a/packages/flutter_tools/lib/src/vmservice.dart +++ b/packages/flutter_tools/lib/src/vmservice.dart @@ -140,7 +140,7 @@ class VMService { // If the Flutter Engine doesn't support service registration this will // have no effect - _peer.sendNotification('_registerService', { + _peer.sendNotification('registerService', { 'service': 'reloadSources', 'alias': 'Flutter Tools', }); @@ -166,7 +166,7 @@ class VMService { // If the Flutter Engine doesn't support service registration this will // have no effect - _peer.sendNotification('_registerService', { + _peer.sendNotification('registerService', { 'service': 'hotRestart', 'alias': 'Flutter Tools', }); @@ -204,7 +204,7 @@ class VMService { } }); - _peer.sendNotification('_registerService', { + _peer.sendNotification('registerService', { 'service': 'compileExpression', 'alias': 'Flutter Tools', }); From fb9ff9296e0a9962385b416faac99d8be10fc758 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Thu, 11 Jul 2019 16:52:14 -0700 Subject: [PATCH 31/41] fix linesplitter (#36006) --- dev/bots/run_command.dart | 1 + dev/bots/test.dart | 1 + 2 files changed, 2 insertions(+) diff --git a/dev/bots/run_command.dart b/dev/bots/run_command.dart index 83cf52ae7be..507ce595943 100644 --- a/dev/bots/run_command.dart +++ b/dev/bots/run_command.dart @@ -108,6 +108,7 @@ Future runCommand(String executable, List arguments, { .transform(const Utf8Decoder()) .transform(const LineSplitter()) .where((String line) => removeLine == null || !removeLine(line)) + .map((String line) => '$line\n') .transform(const Utf8Encoder()); if (printOutput) { await Future.wait(>[ diff --git a/dev/bots/test.dart b/dev/bots/test.dart index 7818b77c9c5..9bdbef1b9ce 100644 --- a/dev/bots/test.dart +++ b/dev/bots/test.dart @@ -554,6 +554,7 @@ Future _buildRunnerTest( args, workingDirectory:workingDirectory, environment:pubEnvironment, + removeLine: (String line) => line.contains('[INFO]') ); } } From e91b98a41fcbb60872ecb78f0c8d11356abbf4d5 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Thu, 11 Jul 2019 16:53:17 -0700 Subject: [PATCH 32/41] Add initial implementation of flutter assemble (#32816) --- packages/flutter_tools/lib/executable.dart | 2 + packages/flutter_tools/lib/src/artifacts.dart | 44 ++ .../flutter_tools/lib/src/base/build.dart | 30 - .../flutter_tools/lib/src/build_info.dart | 26 + .../lib/src/build_system/build_system.dart | 686 ++++++++++++++++++ .../lib/src/build_system/exceptions.dart | 95 +++ .../lib/src/build_system/file_hash_store.dart | 111 +++ .../lib/src/build_system/filecache.pb.dart | 96 +++ .../src/build_system/filecache.pbjson.dart | 25 + .../lib/src/build_system/filecache.proto | 18 + .../lib/src/build_system/source.dart | 228 ++++++ .../lib/src/build_system/targets/assets.dart | 95 +++ .../lib/src/build_system/targets/dart.dart | 283 ++++++++ .../lib/src/build_system/targets/ios.dart | 43 ++ .../lib/src/build_system/targets/linux.dart | 46 ++ .../lib/src/build_system/targets/macos.dart | 100 +++ .../lib/src/build_system/targets/windows.dart | 50 ++ .../lib/src/commands/assemble.dart | 221 ++++++ .../flutter_tools/lib/src/context_runner.dart | 2 + packages/flutter_tools/pubspec.yaml | 2 +- .../test/build_system/build_system_test.dart | 554 ++++++++++++++ .../test/build_system/exceptions_test.dart | 72 ++ .../build_system/targets/assets_test.dart | 70 ++ .../test/build_system/targets/dart_test.dart | 224 ++++++ .../test/build_system/targets/linux_test.dart | 84 +++ .../test/build_system/targets/macos_test.dart | 115 +++ .../build_system/targets/windows_test.dart | 97 +++ .../test/commands/assemble_test.dart | 84 +++ packages/flutter_tools/test/src/testbed.dart | 2 +- 29 files changed, 3473 insertions(+), 32 deletions(-) create mode 100644 packages/flutter_tools/lib/src/build_system/build_system.dart create mode 100644 packages/flutter_tools/lib/src/build_system/exceptions.dart create mode 100644 packages/flutter_tools/lib/src/build_system/file_hash_store.dart create mode 100644 packages/flutter_tools/lib/src/build_system/filecache.pb.dart create mode 100644 packages/flutter_tools/lib/src/build_system/filecache.pbjson.dart create mode 100644 packages/flutter_tools/lib/src/build_system/filecache.proto create mode 100644 packages/flutter_tools/lib/src/build_system/source.dart create mode 100644 packages/flutter_tools/lib/src/build_system/targets/assets.dart create mode 100644 packages/flutter_tools/lib/src/build_system/targets/dart.dart create mode 100644 packages/flutter_tools/lib/src/build_system/targets/ios.dart create mode 100644 packages/flutter_tools/lib/src/build_system/targets/linux.dart create mode 100644 packages/flutter_tools/lib/src/build_system/targets/macos.dart create mode 100644 packages/flutter_tools/lib/src/build_system/targets/windows.dart create mode 100644 packages/flutter_tools/lib/src/commands/assemble.dart create mode 100644 packages/flutter_tools/test/build_system/build_system_test.dart create mode 100644 packages/flutter_tools/test/build_system/exceptions_test.dart create mode 100644 packages/flutter_tools/test/build_system/targets/assets_test.dart create mode 100644 packages/flutter_tools/test/build_system/targets/dart_test.dart create mode 100644 packages/flutter_tools/test/build_system/targets/linux_test.dart create mode 100644 packages/flutter_tools/test/build_system/targets/macos_test.dart create mode 100644 packages/flutter_tools/test/build_system/targets/windows_test.dart create mode 100644 packages/flutter_tools/test/commands/assemble_test.dart diff --git a/packages/flutter_tools/lib/executable.dart b/packages/flutter_tools/lib/executable.dart index 42c18082a73..25b39042faa 100644 --- a/packages/flutter_tools/lib/executable.dart +++ b/packages/flutter_tools/lib/executable.dart @@ -14,6 +14,7 @@ import 'src/build_runner/web_compilation_delegate.dart'; import 'src/codegen.dart'; import 'src/commands/analyze.dart'; +import 'src/commands/assemble.dart'; import 'src/commands/attach.dart'; import 'src/commands/build.dart'; import 'src/commands/channel.dart'; @@ -61,6 +62,7 @@ Future main(List args) async { await runner.run(args, [ AnalyzeCommand(verboseHelp: verboseHelp), + AssembleCommand(), AttachCommand(verboseHelp: verboseHelp), BuildCommand(verboseHelp: verboseHelp), ChannelCommand(verboseHelp: verboseHelp), diff --git a/packages/flutter_tools/lib/src/artifacts.dart b/packages/flutter_tools/lib/src/artifacts.dart index 1c7c17896be..65a8b630f6e 100644 --- a/packages/flutter_tools/lib/src/artifacts.dart +++ b/packages/flutter_tools/lib/src/artifacts.dart @@ -14,10 +14,13 @@ import 'dart/sdk.dart'; import 'globals.dart'; enum Artifact { + /// The tool which compiles a dart kernel file into native code. genSnapshot, + /// The flutter tester binary. flutterTester, snapshotDart, flutterFramework, + /// The framework directory of the macOS desktop. flutterMacOSFramework, vmSnapshotData, isolateSnapshotData, @@ -25,12 +28,24 @@ enum Artifact { platformLibrariesJson, flutterPatchedSdkPath, frontendServerSnapshotForEngineDartSdk, + /// The root directory of the dartk SDK. engineDartSdkPath, + /// The dart binary used to execute any of the required snapshots. engineDartBinary, + /// The dart snapshot of the dart2js compiler. dart2jsSnapshot, + /// The dart snapshot of the dartdev compiler. dartdevcSnapshot, + /// The dart snpashot of the kernel worker compiler. kernelWorkerSnapshot, + /// The root of the web implementation of the dart SDK. flutterWebSdk, + /// The root of the Linux desktop sources. + linuxDesktopPath, + /// The root of the Windows desktop sources. + windowsDesktopPath, + /// The root of the sky_engine package + skyEnginePath, } String _artifactToFileName(Artifact artifact, [ TargetPlatform platform, BuildMode mode ]) { @@ -47,6 +62,10 @@ String _artifactToFileName(Artifact artifact, [ TargetPlatform platform, BuildMo case Artifact.flutterFramework: return 'Flutter.framework'; case Artifact.flutterMacOSFramework: + if (platform != TargetPlatform.darwin_x64) { + throw Exception('${getNameForTargetPlatform(platform)} does not support' + ' macOS desktop development'); + } return 'FlutterMacOS.framework'; case Artifact.vmSnapshotData: return 'vm_isolate_snapshot.bin'; @@ -74,6 +93,20 @@ String _artifactToFileName(Artifact artifact, [ TargetPlatform platform, BuildMo return 'dartdevc.dart.snapshot'; case Artifact.kernelWorkerSnapshot: return 'kernel_worker.dart.snapshot'; + case Artifact.linuxDesktopPath: + if (platform != TargetPlatform.linux_x64) { + throw Exception('${getNameForTargetPlatform(platform)} does not support' + ' Linux desktop development'); + } + return ''; + case Artifact.windowsDesktopPath: + if (platform != TargetPlatform.windows_x64) { + throw Exception('${getNameForTargetPlatform(platform)} does not support' + ' Windows desktop development'); + } + return ''; + case Artifact.skyEnginePath: + return 'sky_engine'; } assert(false, 'Invalid artifact $artifact.'); return null; @@ -209,9 +242,14 @@ class CachedArtifacts extends Artifacts { case Artifact.kernelWorkerSnapshot: return fs.path.join(dartSdkPath, 'bin', 'snapshots', _artifactToFileName(artifact)); case Artifact.flutterMacOSFramework: + case Artifact.linuxDesktopPath: + case Artifact.windowsDesktopPath: final String engineArtifactsPath = cache.getArtifactDirectory('engine').path; final String platformDirName = getNameForTargetPlatform(platform); return fs.path.join(engineArtifactsPath, platformDirName, _artifactToFileName(artifact, platform, mode)); + case Artifact.skyEnginePath: + final Directory dartPackageDirectory = cache.getCacheDir('pkg'); + return fs.path.join(dartPackageDirectory.path, _artifactToFileName(artifact)); default: assert(false, 'Artifact $artifact not available for platform $platform.'); return null; @@ -302,6 +340,12 @@ class LocalEngineArtifacts extends Artifacts { return fs.path.join(dartSdkPath, 'bin', 'snapshots', _artifactToFileName(artifact)); case Artifact.kernelWorkerSnapshot: return fs.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', 'snapshots', _artifactToFileName(artifact)); + case Artifact.linuxDesktopPath: + return fs.path.join(_hostEngineOutPath, _artifactToFileName(artifact)); + case Artifact.windowsDesktopPath: + return fs.path.join(_hostEngineOutPath, _artifactToFileName(artifact)); + case Artifact.skyEnginePath: + return fs.path.join(_hostEngineOutPath, 'gen', 'dart-pkg', _artifactToFileName(artifact)); } assert(false, 'Invalid artifact $artifact.'); return null; diff --git a/packages/flutter_tools/lib/src/base/build.dart b/packages/flutter_tools/lib/src/base/build.dart index 8d2338af660..00264f3c572 100644 --- a/packages/flutter_tools/lib/src/base/build.dart +++ b/packages/flutter_tools/lib/src/base/build.dart @@ -9,7 +9,6 @@ import 'package:meta/meta.dart'; import '../artifacts.dart'; import '../build_info.dart'; import '../bundle.dart'; -import '../cache.dart'; import '../compile.dart'; import '../dart/package_map.dart'; import '../globals.dart'; @@ -95,10 +94,6 @@ class AOTSnapshotter { IOSArch iosArch, List extraGenSnapshotOptions = const [], }) async { - FlutterProject flutterProject; - if (fs.file('pubspec.yaml').existsSync()) { - flutterProject = FlutterProject.current(); - } if (!_isValidAotPlatform(platform, buildMode)) { printError('${getNameForTargetPlatform(platform)} does not support AOT compilation.'); return 1; @@ -122,8 +117,6 @@ class AOTSnapshotter { final List inputPaths = [uiPath, vmServicePath, mainPath]; final Set outputPaths = {}; - - final String depfilePath = fs.path.join(outputDir.path, 'snapshot.d'); final List genSnapshotArgs = [ '--deterministic', ]; @@ -165,26 +158,6 @@ class AOTSnapshotter { return 1; } - // If inputs and outputs have not changed since last run, skip the build. - final Fingerprinter fingerprinter = Fingerprinter( - fingerprintPath: '$depfilePath.fingerprint', - paths: [mainPath, ...inputPaths, ...outputPaths], - properties: { - 'buildMode': buildMode.toString(), - 'targetPlatform': platform.toString(), - 'entryPoint': mainPath, - 'extraGenSnapshotOptions': extraGenSnapshotOptions.join(' '), - 'engineHash': Cache.instance.engineRevision, - 'buildersUsed': '${flutterProject != null && flutterProject.hasBuilders}', - }, - depfilePaths: [], - ); - // TODO(jonahwilliams): re-enable once this can be proved correct. - // if (await fingerprinter.doesFingerprintMatch()) { - // printTrace('Skipping AOT snapshot build. Fingerprint match.'); - // return 0; - // } - final SnapshotType snapshotType = SnapshotType(platform, buildMode); final int genSnapshotExitCode = await _timedStep('snapshot(CompileTime)', 'aot-snapshot', @@ -210,9 +183,6 @@ class AOTSnapshotter { if (result.exitCode != 0) return result.exitCode; } - - // Compute and record build fingerprint. - await fingerprinter.writeFingerprint(); return 0; } diff --git a/packages/flutter_tools/lib/src/build_info.dart b/packages/flutter_tools/lib/src/build_info.dart index 87361354e5c..ac0489a3638 100644 --- a/packages/flutter_tools/lib/src/build_info.dart +++ b/packages/flutter_tools/lib/src/build_info.dart @@ -115,6 +115,32 @@ enum BuildMode { release, } +const List _kBuildModes = [ + 'debug', + 'profile', + 'release', + 'dynamic-profile', + 'dynamic-release', +]; + +/// Return the name for the build mode, or "any" if null. +String getNameForBuildMode(BuildMode buildMode) { + return _kBuildModes[buildMode.index]; +} + +/// Returns the [BuildMode] for a particular `name`. +BuildMode getBuildModeForName(String name) { + switch (name) { + case 'debug': + return BuildMode.debug; + case 'profile': + return BuildMode.profile; + case 'release': + return BuildMode.release; + } + return null; +} + String validatedBuildNumberForPlatform(TargetPlatform targetPlatform, String buildNumber) { if (buildNumber == null) { return null; diff --git a/packages/flutter_tools/lib/src/build_system/build_system.dart b/packages/flutter_tools/lib/src/build_system/build_system.dart new file mode 100644 index 00000000000..c0f9d224e2e --- /dev/null +++ b/packages/flutter_tools/lib/src/build_system/build_system.dart @@ -0,0 +1,686 @@ +// Copyright 2019 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 'package:async/async.dart'; +import 'package:convert/convert.dart'; +import 'package:crypto/crypto.dart'; +import 'package:meta/meta.dart'; +import 'package:pool/pool.dart'; + +import '../base/file_system.dart'; +import '../base/platform.dart'; +import '../cache.dart'; +import '../convert.dart'; +import '../globals.dart'; +import 'exceptions.dart'; +import 'file_hash_store.dart'; +import 'source.dart'; +import 'targets/assets.dart'; +import 'targets/dart.dart'; +import 'targets/ios.dart'; +import 'targets/linux.dart'; +import 'targets/macos.dart'; +import 'targets/windows.dart'; + +export 'source.dart'; + +/// The function signature of a build target which can be invoked to perform +/// the underlying task. +typedef BuildAction = FutureOr Function( + Map inputs, Environment environment); + +/// A description of the update to each input file. +enum ChangeType { + /// The file was added. + Added, + /// The file was deleted. + Removed, + /// The file was modified. + Modified, +} + +/// Configuration for the build system itself. +class BuildSystemConfig { + /// Create a new [BuildSystemConfig]. + const BuildSystemConfig({this.resourcePoolSize}); + + /// The maximum number of concurrent tasks the build system will run. + /// + /// If not provided, defaults to [platform.numberOfProcessors]. + final int resourcePoolSize; +} + +/// A Target describes a single step during a flutter build. +/// +/// The target inputs are required to be files discoverable via a combination +/// of at least one of the environment values and zero or more local values. +/// +/// To determine if the action for a target needs to be executed, the +/// [BuildSystem] performs a hash of the file contents for both inputs and +/// outputs. This is tracked separately in the [FileHashStore]. +/// +/// A Target has both implicit and explicit inputs and outputs. Only the +/// later are safe to evaluate before invoking the [buildAction]. For example, +/// a wildcard output pattern requires the outputs to exist before it can +/// glob files correctly. +/// +/// - All listed inputs are considered explicit inputs. +/// - Outputs which are provided as [Source.pattern]. +/// without wildcards are considered explicit. +/// - The remaining outputs are considered implicit. +/// +/// For each target, executing its action creates a corresponding stamp file +/// which records both the input and output files. This file is read by +/// subsequent builds to determine which file hashes need to be checked. If the +/// stamp file is missing, the target's action is always rerun. +/// +/// file: `example_target.stamp` +/// +/// { +/// "inputs": [ +/// "absolute/path/foo", +/// "absolute/path/bar", +/// ... +/// ], +/// "outputs": [ +/// "absolute/path/fizz" +/// ] +/// } +/// +/// ## Code review +/// +/// ### Targes should only depend on files that are provided as inputs +/// +/// Example: gen_snapshot must be provided as an input to the aot_elf +/// build steps, even though it isn't a source file. This ensures that changes +/// to the gen_snapshot binary (during a local engine build) correctly +/// trigger a corresponding build update. +/// +/// Example: aot_elf has a dependency on the dill and packages file +/// produced by the kernel_snapshot step. +/// +/// ### Targest should declare all outputs produced +/// +/// If a target produces an output it should be listed, even if it is not +/// intended to be consumed by another target. +/// +/// ## Unit testing +/// +/// Most targets will invoke an external binary which makes unit testing +/// trickier. It is recommend that for unit testing that a Fake is used and +/// provided via the dependency injection system. a [Testbed] may be used to +/// set up the environment before the test is run. Unit tests should fully +/// exercise the rule, ensuring that the existing input and output verification +/// logic can run, as well as verifying it correctly handles provided defines +/// and meets any additional contracts present in the target. +class Target { + const Target({ + @required this.name, + @required this.inputs, + @required this.outputs, + @required this.buildAction, + this.dependencies = const [], + }); + + /// The user-readable name of the target. + /// + /// This information is surfaced in the assemble commands and used as an + /// argument to build a particular target. + final String name; + + /// The dependencies of this target. + final List dependencies; + + /// The input [Source]s which are diffed to determine if a target should run. + final List inputs; + + /// The output [Source]s which we attempt to verify are correctly produced. + final List outputs; + + /// The action which performs this build step. + final BuildAction buildAction; + + /// Collect hashes for all inputs to determine if any have changed. + Future> computeChanges( + List inputs, + Environment environment, + FileHashStore fileHashStore, + ) async { + final Map updates = {}; + final File stamp = _findStampFile(environment); + final Set previousInputs = {}; + final List previousOutputs = []; + + // If the stamp file doesn't exist, we haven't run this step before and + // all inputs were added. + if (stamp.existsSync()) { + final String content = stamp.readAsStringSync(); + // Something went wrong writing the stamp file. + if (content == null || content.isEmpty) { + stamp.deleteSync(); + } else { + final Map values = json.decode(content); + final List inputs = values['inputs']; + final List outputs = values['outputs']; + inputs.cast().forEach(previousInputs.add); + outputs.cast().forEach(previousOutputs.add); + } + } + + // For each input type, first determine if we've already computed the hash + // for it. If not and it is a directory we skip hashing and instead use a + // timestamp. If it is a file we collect it to be sent off for hashing as + // a group. + final List sourcesToHash = []; + final List missingInputs = []; + for (File file in inputs) { + if (!file.existsSync()) { + missingInputs.add(file); + continue; + } + + final String absolutePath = file.resolveSymbolicLinksSync(); + final String previousHash = fileHashStore.previousHashes[absolutePath]; + if (fileHashStore.currentHashes.containsKey(absolutePath)) { + final String currentHash = fileHashStore.currentHashes[absolutePath]; + if (currentHash != previousHash) { + updates[absolutePath] = previousInputs.contains(absolutePath) + ? ChangeType.Modified + : ChangeType.Added; + } + } else { + sourcesToHash.add(file); + } + } + // Check if any outputs were deleted or modified from the previous run. + for (String previousOutput in previousOutputs) { + final File file = fs.file(previousOutput); + if (!file.existsSync()) { + updates[previousOutput] = ChangeType.Removed; + continue; + } + final String absolutePath = file.resolveSymbolicLinksSync(); + final String previousHash = fileHashStore.previousHashes[absolutePath]; + if (fileHashStore.currentHashes.containsKey(absolutePath)) { + final String currentHash = fileHashStore.currentHashes[absolutePath]; + if (currentHash != previousHash) { + updates[absolutePath] = previousInputs.contains(absolutePath) + ? ChangeType.Modified + : ChangeType.Added; + } + } else { + sourcesToHash.add(file); + } + } + + if (missingInputs.isNotEmpty) { + throw MissingInputException(missingInputs, name); + } + + // If we have files to hash, compute them asynchronously and then + // update the result. + if (sourcesToHash.isNotEmpty) { + final List dirty = await fileHashStore.hashFiles(sourcesToHash); + for (File file in dirty) { + final String absolutePath = file.resolveSymbolicLinksSync(); + updates[absolutePath] = previousInputs.contains(absolutePath) + ? ChangeType.Modified + : ChangeType.Added; + } + } + + // Find which, if any, inputs have been deleted. + final Set currentInputPaths = Set.from( + inputs.map((File entity) => entity.resolveSymbolicLinksSync()) + ); + for (String previousInput in previousInputs) { + if (!currentInputPaths.contains(previousInput)) { + updates[previousInput] = ChangeType.Removed; + } + } + return updates; + } + + /// Invoke to remove the stamp file if the [buildAction] threw an exception; + void clearStamp(Environment environment) { + final File stamp = _findStampFile(environment); + if (stamp.existsSync()) { + stamp.deleteSync(); + } + } + + void _writeStamp( + List inputs, + List outputs, + Environment environment, + ) { + final File stamp = _findStampFile(environment); + final List inputPaths = []; + for (File input in inputs) { + inputPaths.add(input.resolveSymbolicLinksSync()); + } + final List outputPaths = []; + for (File output in outputs) { + outputPaths.add(output.resolveSymbolicLinksSync()); + } + final Map result = { + 'inputs': inputPaths, + 'outputs': outputPaths, + }; + if (!stamp.existsSync()) { + stamp.createSync(); + } + stamp.writeAsStringSync(json.encode(result)); + } + + /// Resolve the set of input patterns and functions into a concrete list of + /// files. + List resolveInputs( + Environment environment, + ) { + return _resolveConfiguration(inputs, environment, implicit: true, inputs: true); + } + + /// Find the current set of declared outputs, including wildcard directories. + /// + /// The [implicit] flag controls whether it is safe to evaluate [Source]s + /// which uses functions, behaviors, or patterns. + List resolveOutputs( + Environment environment, + { bool implicit = true, } + ) { + final List outputEntities = _resolveConfiguration(outputs, environment, implicit: implicit, inputs: false); + if (implicit) { + verifyOutputDirectories(outputEntities, environment, this); + } + return outputEntities; + } + + /// Performs a fold across this target and its dependencies. + T fold(T initialValue, T combine(T previousValue, Target target)) { + final T dependencyResult = dependencies.fold( + initialValue, (T prev, Target t) => t.fold(prev, combine)); + return combine(dependencyResult, this); + } + + /// Convert the target to a JSON structure appropriate for consumption by + /// external systems. + /// + /// This requires constants from the [Environment] to resolve the paths of + /// inputs and the output stamp. + Map toJson(Environment environment) { + return { + 'name': name, + 'dependencies': dependencies.map((Target target) => target.name).toList(), + 'inputs': resolveInputs(environment) + .map((File file) => file.resolveSymbolicLinksSync()) + .toList(), + 'outputs': resolveOutputs(environment, implicit: false) + .map((File file) => file.path) + .toList(), + 'stamp': _findStampFile(environment).absolute.path, + }; + } + + /// Locate the stamp file for a particular target name and environment. + File _findStampFile(Environment environment) { + final String fileName = '$name.stamp'; + return environment.buildDir.childFile(fileName); + } + + static List _resolveConfiguration( + List config, Environment environment, { bool implicit = true, bool inputs = true }) { + final SourceVisitor collector = SourceVisitor(environment, inputs); + for (Source source in config) { + source.accept(collector); + } + return collector.sources; + } +} + +/// The [Environment] defines several constants for use during the build. +/// +/// The environment contains configuration and file paths that are safe to +/// depend on and reference during the build. +/// +/// Example (Good): +/// +/// Use the environment to determine where to write an output file. +/// +/// environment.buildDir.childFile('output') +/// ..createSync() +/// ..writeAsStringSync('output data'); +/// +/// Example (Bad): +/// +/// Use a hard-coded path or directory relative to the current working +/// directory to write an output file. +/// +/// fs.file('build/linux/out') +/// ..createSync() +/// ..writeAsStringSync('output data'); +/// +/// Example (Good): +/// +/// Using the build mode to produce different output. Note that the action +/// is still responsible for outputting a different file, as defined by the +/// corresponding output [Source]. +/// +/// final BuildMode buildMode = getBuildModeFromDefines(environment.defines); +/// if (buildMode == BuildMode.debug) { +/// environment.buildDir.childFile('debug.output') +/// ..createSync() +/// ..writeAsStringSync('debug'); +/// } else { +/// environment.buildDir.childFile('non_debug.output') +/// ..createSync() +/// ..writeAsStringSync('non_debug'); +/// } +class Environment { + /// Create a new [Environment] object. + /// + /// Only [projectDir] is required. The remaining environment locations have + /// defaults based on it. + factory Environment({ + @required Directory projectDir, + Directory buildDir, + Map defines = const {}, + }) { + // Compute a unique hash of this build's particular environment. + // Sort the keys by key so that the result is stable. We always + // include the engine and dart versions. + String buildPrefix; + final List keys = defines.keys.toList()..sort(); + final StringBuffer buffer = StringBuffer(); + for (String key in keys) { + buffer.write(key); + buffer.write(defines[key]); + } + // in case there was no configuration, provide some value. + buffer.write('Flutter is awesome'); + final String output = buffer.toString(); + final Digest digest = md5.convert(utf8.encode(output)); + buildPrefix = hex.encode(digest.bytes); + + final Directory rootBuildDir = buildDir ?? projectDir.childDirectory('build'); + final Directory buildDirectory = rootBuildDir.childDirectory(buildPrefix); + return Environment._( + projectDir: projectDir, + buildDir: buildDirectory, + rootBuildDir: rootBuildDir, + cacheDir: Cache.instance.getRoot(), + defines: defines, + ); + } + + Environment._({ + @required this.projectDir, + @required this.buildDir, + @required this.rootBuildDir, + @required this.cacheDir, + @required this.defines, + }); + + /// The [Source] value which is substituted with the path to [projectDir]. + static const String kProjectDirectory = '{PROJECT_DIR}'; + + /// The [Source] value which is substituted with the path to [buildDir]. + static const String kBuildDirectory = '{BUILD_DIR}'; + + /// The [Source] value which is substituted with the path to [cacheDir]. + static const String kCacheDirectory = '{CACHE_DIR}'; + + /// The [Source] value which is substituted with a path to the flutter root. + static const String kFlutterRootDirectory = '{FLUTTER_ROOT}'; + + /// The `PROJECT_DIR` environment variable. + /// + /// This should be root of the flutter project where a pubspec and dart files + /// can be located. + final Directory projectDir; + + /// The `BUILD_DIR` environment variable. + /// + /// Defaults to `{PROJECT_ROOT}/build`. The root of the output directory where + /// build step intermediates and outputs are written. + final Directory buildDir; + + /// The `CACHE_DIR` environment variable. + /// + /// Defaults to `{FLUTTER_ROOT}/bin/cache`. The root of the artifact cache for + /// the flutter tool. + final Directory cacheDir; + + /// Additional configuration passed to the build targets. + /// + /// Setting values here forces a unique build directory to be chosen + /// which prevents the config from leaking into different builds. + final Map defines; + + /// The root build directory shared by all builds. + final Directory rootBuildDir; +} + +/// The result information from the build system. +class BuildResult { + BuildResult(this.success, this.exceptions, this.performance); + + final bool success; + final Map exceptions; + final Map performance; + + bool get hasException => exceptions.isNotEmpty; +} + +/// The build system is responsible for invoking and ordering [Target]s. +class BuildSystem { + BuildSystem([Map targets]) + : targets = targets ?? _defaultTargets; + + /// All currently registered targets. + static final Map _defaultTargets = { + unpackMacos.name: unpackMacos, + macosApplication.name: macosApplication, + macoReleaseApplication.name: macoReleaseApplication, + unpackLinux.name: unpackLinux, + unpackWindows.name: unpackWindows, + copyAssets.name: copyAssets, + kernelSnapshot.name: kernelSnapshot, + aotElfProfile.name: aotElfProfile, + aotElfRelease.name: aotElfRelease, + aotAssemblyProfile.name: aotAssemblyProfile, + aotAssemblyRelease.name: aotAssemblyRelease, + releaseIosApplication.name: releaseIosApplication, + profileIosApplication.name: profileIosApplication, + debugIosApplication.name: debugIosApplication, + }; + + final Map targets; + + /// Build the target `name` and all of its dependencies. + Future build( + String name, + Environment environment, + BuildSystemConfig buildSystemConfig, + ) async { + final Target target = _getNamedTarget(name); + environment.buildDir.createSync(recursive: true); + + // Load file hash store from previous builds. + final FileHashStore fileCache = FileHashStore(environment) + ..initialize(); + + // Perform sanity checks on build. + checkCycles(target); + + final _BuildInstance buildInstance = _BuildInstance(environment, fileCache, buildSystemConfig); + bool passed = true; + try { + passed = await buildInstance.invokeTarget(target); + } finally { + // Always persist the file cache to disk. + fileCache.persist(); + } + return BuildResult( + passed, + buildInstance.exceptionMeasurements, + buildInstance.stepTimings, + ); + } + + /// Describe the target `name` and all of its dependencies. + List> describe( + String name, + Environment environment, + ) { + final Target target = _getNamedTarget(name); + environment.buildDir.createSync(recursive: true); + checkCycles(target); + // Cheat a bit and re-use the same map. + Map> fold(Map> accumulation, Target current) { + accumulation[current.name] = current.toJson(environment); + return accumulation; + } + + final Map> result = + >{}; + final Map> targets = target.fold(result, fold); + return targets.values.toList(); + } + + // Returns the corresponding target or throws. + Target _getNamedTarget(String name) { + final Target target = targets[name]; + if (target == null) { + throw Exception('No registered target:$name.'); + } + return target; + } +} + +/// An active instance of a build. +class _BuildInstance { + _BuildInstance(this.environment, this.fileCache, this.buildSystemConfig) + : resourcePool = Pool(buildSystemConfig.resourcePoolSize ?? platform?.numberOfProcessors ?? 1); + + final BuildSystemConfig buildSystemConfig; + final Pool resourcePool; + final Map> pending = >{}; + final Environment environment; + final FileHashStore fileCache; + + // Timings collected during target invocation. + final Map stepTimings = {}; + + // Exceptions caught during the build process. + final Map exceptionMeasurements = {}; + + Future invokeTarget(Target target) async { + final List results = await Future.wait(target.dependencies.map(invokeTarget)); + if (results.any((bool result) => !result)) { + return false; + } + final AsyncMemoizer memoizer = pending[target.name] ??= AsyncMemoizer(); + return memoizer.runOnce(() => _invokeInternal(target)); + } + + Future _invokeInternal(Target target) async { + final PoolResource resource = await resourcePool.request(); + final Stopwatch stopwatch = Stopwatch()..start(); + bool passed = true; + bool skipped = false; + try { + final List inputs = target.resolveInputs(environment); + final Map updates = await target.computeChanges(inputs, environment, fileCache); + if (updates.isEmpty) { + skipped = true; + printStatus('Skipping target: ${target.name}'); + } else { + printStatus('${target.name}: Starting'); + // build actions may be null. + await target?.buildAction(updates, environment); + printStatus('${target.name}: Complete'); + + final List outputs = target.resolveOutputs(environment); + // Update hashes for output files. + await fileCache.hashFiles(outputs); + target._writeStamp(inputs, outputs, environment); + } + } catch (exception, stackTrace) { + // TODO(jonahwilliams): test + target.clearStamp(environment); + passed = false; + skipped = false; + exceptionMeasurements[target.name] = ExceptionMeasurement( + target.name, exception, stackTrace); + } finally { + resource.release(); + stopwatch.stop(); + stepTimings[target.name] = PerformanceMeasurement( + target.name, stopwatch.elapsedMilliseconds, skipped, passed); + } + return passed; + } +} + +/// Helper class to collect exceptions. +class ExceptionMeasurement { + ExceptionMeasurement(this.target, this.exception, this.stackTrace); + + final String target; + final dynamic exception; + final StackTrace stackTrace; +} + +/// Helper class to collect measurement data. +class PerformanceMeasurement { + PerformanceMeasurement(this.target, this.elapsedMilliseconds, this.skiped, this.passed); + final int elapsedMilliseconds; + final String target; + final bool skiped; + final bool passed; +} + +/// Check if there are any dependency cycles in the target. +/// +/// Throws a [CycleException] if one is encountered. +void checkCycles(Target initial) { + void checkInternal(Target target, Set visited, Set stack) { + if (stack.contains(target)) { + throw CycleException(stack..add(target)); + } + if (visited.contains(target)) { + return; + } + visited.add(target); + stack.add(target); + for (Target dependency in target.dependencies) { + checkInternal(dependency, visited, stack); + } + stack.remove(target); + } + checkInternal(initial, {}, {}); +} + +/// Verifies that all files exist and are in a subdirectory of [Environment.buildDir]. +void verifyOutputDirectories(List outputs, Environment environment, Target target) { + final String buildDirectory = environment.buildDir.resolveSymbolicLinksSync(); + final String projectDirectory = environment.projectDir.resolveSymbolicLinksSync(); + final List missingOutputs = []; + for (File sourceFile in outputs) { + if (!sourceFile.existsSync()) { + missingOutputs.add(sourceFile); + continue; + } + final String path = sourceFile.resolveSymbolicLinksSync(); + if (!path.startsWith(buildDirectory) && !path.startsWith(projectDirectory)) { + throw MisplacedOutputException(path, target.name); + } + } + if (missingOutputs.isNotEmpty) { + throw MissingOutputException(missingOutputs, target.name); + } +} diff --git a/packages/flutter_tools/lib/src/build_system/exceptions.dart b/packages/flutter_tools/lib/src/build_system/exceptions.dart new file mode 100644 index 00000000000..918c0517814 --- /dev/null +++ b/packages/flutter_tools/lib/src/build_system/exceptions.dart @@ -0,0 +1,95 @@ +// Copyright 2019 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 '../base/file_system.dart'; + +import 'build_system.dart'; + +/// An exception thrown when a rule declares an input that does not exist on +/// disk. +class MissingInputException implements Exception { + const MissingInputException(this.missing, this.target); + + /// The file or directory we expected to find. + final List missing; + + /// The name of the target this file should have been output from. + final String target; + + @override + String toString() { + final String files = missing.map((File file) => file.path).join(', '); + return '$files were declared as an inputs, but did not exist. ' + 'Check the definition of target:$target for errors'; + } +} + +/// An exception thrown if we detect a cycle in the dependencies of a target. +class CycleException implements Exception { + CycleException(this.targets); + + final Set targets; + + @override + String toString() => 'Dependency cycle detected in build: ' + '${targets.map((Target target) => target.name).join(' -> ')}'; +} + +/// An exception thrown when a pattern is invalid. +class InvalidPatternException implements Exception { + InvalidPatternException(this.pattern); + + final String pattern; + + @override + String toString() => 'The pattern "$pattern" is not valid'; +} + +/// An exception thrown when a rule declares an output that was not produced +/// by the invocation. +class MissingOutputException implements Exception { + const MissingOutputException(this.missing, this.target); + + /// The files we expected to find. + final List missing; + + /// The name of the target this file should have been output from. + final String target; + + @override + String toString() { + final String files = missing.map((File file) => file.path).join(', '); + return '$files were declared as outputs, but were not generated by ' + 'the action. Check the definition of target:$target for errors'; + } +} + +/// An exception thrown when in output is placed outside of +/// [Environment.buildDir]. +class MisplacedOutputException implements Exception { + MisplacedOutputException(this.path, this.target); + + final String path; + final String target; + + @override + String toString() { + return 'Target $target produced an output at $path' + ' which is outside of the current build or project directory'; + } +} + +/// An exception thrown if a build action is missing a required define. +class MissingDefineException implements Exception { + MissingDefineException(this.define, this.target); + + final String define; + final String target; + + @override + String toString() { + return 'Target $target required define $define ' + 'but it was not provided'; + } +} diff --git a/packages/flutter_tools/lib/src/build_system/file_hash_store.dart b/packages/flutter_tools/lib/src/build_system/file_hash_store.dart new file mode 100644 index 00000000000..398f95f45e7 --- /dev/null +++ b/packages/flutter_tools/lib/src/build_system/file_hash_store.dart @@ -0,0 +1,111 @@ +// Copyright 2019 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:collection'; +import 'dart:typed_data'; + +import 'package:crypto/crypto.dart'; + +import '../base/file_system.dart'; +import '../globals.dart'; +import 'build_system.dart'; +import 'filecache.pb.dart' as pb; + +/// A globally accessible cache of file hashes. +/// +/// In cases where multiple targets read the same source files as inputs, we +/// avoid recomputing or storing multiple copies of hashes by delegating +/// through this class. All file hashes are held in memory during a build +/// operation, and persisted to cache in the root build directory. +/// +/// The format of the file store is subject to change and not part of its API. +/// +/// To regenerate the protobuf entries used to construct the cache: +/// 1. If not already installed, https://developers.google.com/protocol-buffers/docs/downloads +/// 2. pub global active `protoc-gen-dart` +/// 3. protoc -I=lib/src/build_system/ --dart_out=lib/src/build_system/ lib/src/build_system/filecache.proto +/// 4. Add licenses headers to the newly generated file and check-in. +/// +/// See also: https://developers.google.com/protocol-buffers/docs/darttutorial +// TODO(jonahwilliams): find a better way to clear out old entries, perhaps +// track the last access or modification date? +class FileHashStore { + FileHashStore(this.environment); + + final Environment environment; + final HashMap previousHashes = HashMap(); + final HashMap currentHashes = HashMap(); + + // The name of the file which stores the file hashes. + static const String _kFileCache = '.filecache'; + + // The current version of the file cache storage format. + static const int _kVersion = 1; + + /// Read file hashes from disk. + void initialize() { + printTrace('Initializing file store'); + if (!_cacheFile.existsSync()) { + return; + } + final List data = _cacheFile.readAsBytesSync(); + final pb.FileStorage fileStorage = pb.FileStorage.fromBuffer(data); + if (fileStorage.version != _kVersion) { + _cacheFile.deleteSync(); + return; + } + for (pb.FileHash fileHash in fileStorage.files) { + previousHashes[fileHash.path] = fileHash.hash; + } + printTrace('Done initializing file store'); + } + + /// Persist file hashes to disk. + void persist() { + printTrace('Persisting file store'); + final pb.FileStorage fileStorage = pb.FileStorage(); + fileStorage.version = _kVersion; + final File file = _cacheFile; + if (!file.existsSync()) { + file.createSync(); + } + for (MapEntry entry in currentHashes.entries) { + previousHashes[entry.key] = entry.value; + } + for (MapEntry entry in previousHashes.entries) { + final pb.FileHash fileHash = pb.FileHash(); + fileHash.path = entry.key; + fileHash.hash = entry.value; + fileStorage.files.add(fileHash); + } + final Uint8List buffer = fileStorage.writeToBuffer(); + file.writeAsBytesSync(buffer); + printTrace('Done persisting file store'); + } + + /// Computes a hash of the provided files and returns a list of entities + /// that were dirty. + // TODO(jonahwilliams): compare hash performance with md5 tool on macOS and + // linux and certutil on Windows, as well as dividing up computation across + // isolates. This also related to the current performance issue with checking + // APKs before installing them on device. + Future> hashFiles(List files) async { + final List dirty = []; + for (File file in files) { + final String absolutePath = file.resolveSymbolicLinksSync(); + final String previousHash = previousHashes[absolutePath]; + final List bytes = file.readAsBytesSync(); + final String currentHash = md5.convert(bytes).toString(); + + if (currentHash != previousHash) { + dirty.add(file); + } + currentHashes[absolutePath] = currentHash; + } + return dirty; + } + + File get _cacheFile => environment.rootBuildDir.childFile(_kFileCache); +} diff --git a/packages/flutter_tools/lib/src/build_system/filecache.pb.dart b/packages/flutter_tools/lib/src/build_system/filecache.pb.dart new file mode 100644 index 00000000000..4c095acef54 --- /dev/null +++ b/packages/flutter_tools/lib/src/build_system/filecache.pb.dart @@ -0,0 +1,96 @@ +// Copyright 2019 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. + +/// +// Generated code. Do not modify. +// source: lib/src/build_system/filecache.proto +/// +// ignore_for_file: camel_case_types,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name, sort_constructors_first + +import 'dart:core' as $core show bool, Deprecated, double, int, List, Map, override, pragma, String, dynamic; + +import 'package:protobuf/protobuf.dart' as $pb; + +class FileHash extends $pb.GeneratedMessage { + factory FileHash() => create(); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo('FileHash', package: const $pb.PackageName('flutter_tools')) + ..aOS(1, 'path') + ..aOS(2, 'hash') + ..hasRequiredFields = false; + + FileHash._() : super(); + + factory FileHash.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + + factory FileHash.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + @$core.override + FileHash clone() => FileHash()..mergeFromMessage(this); + + @$core.override + FileHash copyWith(void Function(FileHash) updates) => super.copyWith(($core.dynamic message) => updates(message as FileHash)); + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static FileHash create() => FileHash._(); + + @$core.override + FileHash createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + static FileHash getDefault() => _defaultInstance ??= create()..freeze(); + static FileHash _defaultInstance; + + $core.String get path => $_getS(0, ''); + set path($core.String v) { $_setString(0, v); } + $core.bool hasPath() => $_has(0); + void clearPath() => clearField(1); + + $core.String get hash => $_getS(1, ''); + set hash($core.String v) { $_setString(1, v); } + $core.bool hasHash() => $_has(1); + void clearHash() => clearField(2); +} + +class FileStorage extends $pb.GeneratedMessage { + factory FileStorage() => create(); + static final $pb.BuilderInfo _i = $pb.BuilderInfo('FileHashStore', package: const $pb.PackageName('flutter_tools')) + ..a<$core.int>(1, 'version', $pb.PbFieldType.O3) + ..pc(2, 'files', $pb.PbFieldType.PM,FileHash.create) + ..hasRequiredFields = false; + + FileStorage._() : super(); + factory FileStorage.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory FileStorage.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + @$core.override + FileStorage clone() => FileStorage()..mergeFromMessage(this); + + @$core.override + FileStorage copyWith(void Function(FileStorage) updates) => super.copyWith(($core.dynamic message) => updates(message as FileStorage)); + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static FileStorage create() => FileStorage._(); + + @$core.override + FileStorage createEmptyInstance() => create(); + + static $pb.PbList createRepeated() => $pb.PbList(); + + static FileStorage getDefault() => _defaultInstance ??= create()..freeze(); + + static FileStorage _defaultInstance; + + $core.int get version => $_get(0, 0); + set version($core.int v) { $_setSignedInt32(0, v); } + $core.bool hasVersion() => $_has(0); + void clearVersion() => clearField(1); + + $core.List get files => $_getList(1); +} diff --git a/packages/flutter_tools/lib/src/build_system/filecache.pbjson.dart b/packages/flutter_tools/lib/src/build_system/filecache.pbjson.dart new file mode 100644 index 00000000000..32f6f9eafc9 --- /dev/null +++ b/packages/flutter_tools/lib/src/build_system/filecache.pbjson.dart @@ -0,0 +1,25 @@ +// Copyright 2019 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. + +/// +// Generated code. Do not modify. +// source: lib/src/build_system/filecache.proto +/// +// ignore_for_file: camel_case_types,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name + +const Map FileHash$json = { + '1': 'FileHash', + '2': >[ + {'1': 'path', '3': 1, '4': 1, '5': 9, '10': 'path'}, + {'1': 'hash', '3': 2, '4': 1, '5': 9, '10': 'hash'}, + ], +}; + +const Map FileStorage$json = { + '1': 'FileHashStore', + '2': >[ + {'1': 'version', '3': 1, '4': 1, '5': 5, '10': 'version'}, + {'1': 'files', '3': 2, '4': 3, '5': 11, '6': '.flutter_tools.FileHash', '10': 'files'}, + ], +}; diff --git a/packages/flutter_tools/lib/src/build_system/filecache.proto b/packages/flutter_tools/lib/src/build_system/filecache.proto new file mode 100644 index 00000000000..63be878f4fc --- /dev/null +++ b/packages/flutter_tools/lib/src/build_system/filecache.proto @@ -0,0 +1,18 @@ +syntax = "proto3"; +package flutter_tools; + +message FileHash { + // The absolute path to the file on disk. + string path = 1; + + // The last computed file hash. + string hash = 2; +} + +message FileStorage { + // The current version of the file store. + int32 version = 1; + + // All currently stored files. + repeated FileHash files = 2; +} diff --git a/packages/flutter_tools/lib/src/build_system/source.dart b/packages/flutter_tools/lib/src/build_system/source.dart new file mode 100644 index 00000000000..e9f1e1642cb --- /dev/null +++ b/packages/flutter_tools/lib/src/build_system/source.dart @@ -0,0 +1,228 @@ +// Copyright 2019 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 '../artifacts.dart'; +import '../base/file_system.dart'; +import '../build_info.dart'; +import '../globals.dart'; +import 'build_system.dart'; +import 'exceptions.dart'; + +/// An input function produces a list of additional input files for an +/// [Environment]. +typedef InputFunction = List Function(Environment environment); + +/// Collects sources for a [Target] into a single list of [FileSystemEntities]. +class SourceVisitor { + /// Create a new [SourceVisitor] from an [Environment]. + SourceVisitor(this.environment, [this.inputs = true]); + + /// The current environment. + final Environment environment; + + /// Whether we are visiting inputs or outputs. + /// + /// Defaults to `true`. + final bool inputs; + + /// The entities are populated after visiting each source. + final List sources = []; + + /// Visit a [Source] which contains a function. + /// + /// The function is expected to produce a list of [FileSystemEntities]s. + void visitFunction(InputFunction function) { + sources.addAll(function(environment)); + } + + /// Visit a [Source] which contains a file uri. + /// + /// The uri may that may include constants defined in an [Environment]. + void visitPattern(String pattern) { + // perform substitution of the environmental values and then + // of the local values. + final List segments = []; + final List rawParts = pattern.split('/'); + final bool hasWildcard = rawParts.last.contains('*'); + String wildcardFile; + if (hasWildcard) { + wildcardFile = rawParts.removeLast(); + } + // If the pattern does not start with an env variable, then we have nothing + // to resolve it to, error out. + switch (rawParts.first) { + case Environment.kProjectDirectory: + segments.addAll( + fs.path.split(environment.projectDir.resolveSymbolicLinksSync())); + break; + case Environment.kBuildDirectory: + segments.addAll(fs.path.split( + environment.buildDir.resolveSymbolicLinksSync())); + break; + case Environment.kCacheDirectory: + segments.addAll( + fs.path.split(environment.cacheDir.resolveSymbolicLinksSync())); + break; + case Environment.kFlutterRootDirectory: + segments.addAll( + fs.path.split(environment.cacheDir.resolveSymbolicLinksSync())); + break; + default: + throw InvalidPatternException(pattern); + } + rawParts.skip(1).forEach(segments.add); + final String filePath = fs.path.joinAll(segments); + if (hasWildcard) { + // Perform a simple match by splitting the wildcard containing file one + // the `*`. For example, for `/*.dart`, we get [.dart]. We then check + // that part of the file matches. If there are values before and after + // the `*` we need to check that both match without overlapping. For + // example, `foo_*_.dart`. We want to match `foo_b_.dart` but not + // `foo_.dart`. To do so, we first subtract the first section from the + // string if the first segment matches. + final List segments = wildcardFile.split('*'); + if (segments.length > 2) { + throw InvalidPatternException(pattern); + } + if (!fs.directory(filePath).existsSync()) { + throw Exception('$filePath does not exist!'); + } + for (FileSystemEntity entity in fs.directory(filePath).listSync()) { + final String filename = fs.path.basename(entity.path); + if (segments.isEmpty) { + sources.add(fs.file(entity.absolute)); + } else if (segments.length == 1) { + if (filename.startsWith(segments[0]) || + filename.endsWith(segments[0])) { + sources.add(entity.absolute); + } + } else if (filename.startsWith(segments[0])) { + if (filename.substring(segments[0].length).endsWith(segments[1])) { + sources.add(entity.absolute); + } + } + } + } else { + sources.add(fs.file(fs.path.normalize(filePath))); + } + } + + /// Visit a [Source] which contains a [SourceBehavior]. + void visitBehavior(SourceBehavior sourceBehavior) { + if (inputs) { + sources.addAll(sourceBehavior.inputs(environment)); + } else { + sources.addAll(sourceBehavior.outputs(environment)); + } + } + + /// Visit a [Source] which is defined by an [Artifact] from the flutter cache. + /// + /// If the [Artifact] points to a directory then all child files are included. + void visitArtifact(Artifact artifact, TargetPlatform platform, BuildMode mode) { + final String path = artifacts.getArtifactPath(artifact, platform: platform, mode: mode); + if (fs.isDirectorySync(path)) { + sources.addAll([ + for (FileSystemEntity entity in fs.directory(path).listSync(recursive: true)) + if (entity is File) + entity + ]); + } else { + sources.add(fs.file(path)); + } + } +} + +/// A description of an input or output of a [Target]. +abstract class Source { + /// This source is a file-uri which contains some references to magic + /// environment variables. + const factory Source.pattern(String pattern) = _PatternSource; + + /// This source is produced by invoking the provided function. + const factory Source.function(InputFunction function) = _FunctionSource; + + /// This source is produced by the [SourceBehavior] class. + const factory Source.behavior(SourceBehavior behavior) = _SourceBehavior; + + /// The source is provided by an [Artifact]. + /// + /// If [artifact] points to a directory then all child files are included. + const factory Source.artifact(Artifact artifact, {TargetPlatform platform, + BuildMode mode}) = _ArtifactSource; + + /// Visit the particular source type. + void accept(SourceVisitor visitor); + + /// Whether the output source provided can be known before executing the rule. + /// + /// This does not apply to inputs, which are always explicit and must be + /// evaluated before the build. + /// + /// For example, [Source.pattern] and [Source.version] are not implicit + /// provided they do not use any wildcards. [Source.behavior] and + /// [Source.function] are always implicit. + bool get implicit; +} + +/// An interface for describing input and output copies together. +abstract class SourceBehavior { + const SourceBehavior(); + + /// The inputs for a particular target. + List inputs(Environment environment); + + /// The outputs for a particular target. + List outputs(Environment environment); +} + +class _SourceBehavior implements Source { + const _SourceBehavior(this.value); + + final SourceBehavior value; + + @override + void accept(SourceVisitor visitor) => visitor.visitBehavior(value); + + @override + bool get implicit => true; +} + +class _FunctionSource implements Source { + const _FunctionSource(this.value); + + final InputFunction value; + + @override + void accept(SourceVisitor visitor) => visitor.visitFunction(value); + + @override + bool get implicit => true; +} + +class _PatternSource implements Source { + const _PatternSource(this.value); + + final String value; + + @override + void accept(SourceVisitor visitor) => visitor.visitPattern(value); + + @override + bool get implicit => value.contains('*'); +} + +class _ArtifactSource implements Source { + const _ArtifactSource(this.artifact, { this.platform, this.mode }); + + final Artifact artifact; + final TargetPlatform platform; + final BuildMode mode; + + @override + void accept(SourceVisitor visitor) => visitor.visitArtifact(artifact, platform, mode); + + @override + bool get implicit => false; +} diff --git a/packages/flutter_tools/lib/src/build_system/targets/assets.dart b/packages/flutter_tools/lib/src/build_system/targets/assets.dart new file mode 100644 index 00000000000..e5545db43df --- /dev/null +++ b/packages/flutter_tools/lib/src/build_system/targets/assets.dart @@ -0,0 +1,95 @@ +// Copyright 2019 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 'package:pool/pool.dart'; + +import '../../asset.dart'; +import '../../base/file_system.dart'; +import '../../devfs.dart'; +import '../build_system.dart'; + +/// The copying logic for flutter assets. +// TODO(jonahwilliams): combine the asset bundle logic with this rule so that +// we can compute the key for deleted assets. This is required to remove assets +// from build directories that are no longer part of the manifest and to unify +// the update/diff logic. +class AssetBehavior extends SourceBehavior { + const AssetBehavior(); + + @override + List inputs(Environment environment) { + final AssetBundle assetBundle = AssetBundleFactory.instance.createBundle(); + assetBundle.build( + manifestPath: environment.projectDir.childFile('pubspec.yaml').path, + packagesPath: environment.projectDir.childFile('.packages').path, + ); + final List results = []; + final Iterable files = assetBundle.entries.values.whereType(); + for (DevFSFileContent devFsContent in files) { + results.add(fs.file(devFsContent.file.path)); + } + return results; + } + + @override + List outputs(Environment environment) { + final AssetBundle assetBundle = AssetBundleFactory.instance.createBundle(); + assetBundle.build( + manifestPath: environment.projectDir.childFile('pubspec.yaml').path, + packagesPath: environment.projectDir.childFile('.packages').path, + ); + final List results = []; + for (MapEntry entry in assetBundle.entries.entries) { + final File file = fs.file(fs.path.join(environment.buildDir.path, 'flutter_assets', entry.key)); + results.add(file); + } + return results; + } +} + +/// Copies the asset files from the [copyAssets] rule into place. +Future copyAssetsInvocation(Map updates, Environment environment) async { + final Directory output = environment + .buildDir + .childDirectory('flutter_assets'); + if (output.existsSync()) { + output.deleteSync(recursive: true); + } + output.createSync(recursive: true); + final AssetBundle assetBundle = AssetBundleFactory.instance.createBundle(); + await assetBundle.build( + manifestPath: environment.projectDir.childFile('pubspec.yaml').path, + packagesPath: environment.projectDir.childFile('.packages').path, + ); + // Limit number of open files to avoid running out of file descriptors. + final Pool pool = Pool(64); + await Future.wait( + assetBundle.entries.entries.map>((MapEntry entry) async { + final PoolResource resource = await pool.request(); + try { + final File file = fs.file(fs.path.join(output.path, entry.key)); + file.parent.createSync(recursive: true); + await file.writeAsBytes(await entry.value.contentsAsBytes()); + } finally { + resource.release(); + } + })); +} + +/// Copy the assets used in the application into a build directory. +const Target copyAssets = Target( + name: 'copy_assets', + inputs: [ + Source.pattern('{PROJECT_DIR}/pubspec.yaml'), + Source.behavior(AssetBehavior()), + ], + outputs: [ + Source.pattern('{BUILD_DIR}/flutter_assets/AssetManifest.json'), + Source.pattern('{BUILD_DIR}/flutter_assets/FontManifest.json'), + Source.pattern('{BUILD_DIR}/flutter_assets/LICENSE'), + Source.behavior(AssetBehavior()), // <- everything in this subdirectory. + ], + dependencies: [], + buildAction: copyAssetsInvocation, +); diff --git a/packages/flutter_tools/lib/src/build_system/targets/dart.dart b/packages/flutter_tools/lib/src/build_system/targets/dart.dart new file mode 100644 index 00000000000..f7d17f66431 --- /dev/null +++ b/packages/flutter_tools/lib/src/build_system/targets/dart.dart @@ -0,0 +1,283 @@ +// Copyright 2019 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 '../../artifacts.dart'; +import '../../base/build.dart'; +import '../../base/file_system.dart'; +import '../../base/io.dart'; +import '../../base/platform.dart'; +import '../../base/process_manager.dart'; +import '../../build_info.dart'; +import '../../compile.dart'; +import '../../dart/package_map.dart'; +import '../../globals.dart'; +import '../../project.dart'; +import '../build_system.dart'; +import '../exceptions.dart'; + +/// The define to pass a [BuildMode]. +const String kBuildMode= 'BuildMode'; + +/// The define to pass whether we compile 64-bit android-arm code. +const String kTargetPlatform = 'TargetPlatform'; + +/// The define to control what target file is used. +const String kTargetFile = 'TargetFile'; + +/// The define to control what iOS architectures are built for. +/// +/// This is expected to be a comma-separated list of architectures. If not +/// provided, defaults to arm64. +/// +/// The other supported value is armv7, the 32-bit iOS architecture. +const String kIosArchs = 'IosArchs'; + +/// Supports compiling dart source to kernel with a subset of flags. +/// +/// This is a non-incremental compile so the specific [updates] are ignored. +Future compileKernel(Map updates, Environment environment) async { + final KernelCompiler compiler = await kernelCompilerFactory.create( + FlutterProject.fromDirectory(environment.projectDir), + ); + if (environment.defines[kBuildMode] == null) { + throw MissingDefineException(kBuildMode, 'kernel_snapshot'); + } + final BuildMode buildMode = getBuildModeForName(environment.defines[kBuildMode]); + final String targetFile = environment.defines[kTargetFile] ?? fs.path.join('lib', 'main.dart'); + + final CompilerOutput output = await compiler.compile( + sdkRoot: artifacts.getArtifactPath(Artifact.flutterPatchedSdkPath, mode: buildMode), + aot: buildMode != BuildMode.debug, + trackWidgetCreation: false, + targetModel: TargetModel.flutter, + targetProductVm: buildMode == BuildMode.release, + outputFilePath: environment + .buildDir + .childFile('main.app.dill') + .path, + depFilePath: null, + mainPath: targetFile, + ); + if (output.errorCount != 0) { + throw Exception('Errors during snapshot creation: $output'); + } +} + +/// Supports compiling a dart kernel file to an ELF binary. +Future compileAotElf(Map updates, Environment environment) async { + final AOTSnapshotter snapshotter = AOTSnapshotter(reportTimings: false); + final String outputPath = environment.buildDir.path; + if (environment.defines[kBuildMode] == null) { + throw MissingDefineException(kBuildMode, 'aot_elf'); + } + if (environment.defines[kTargetPlatform] == null) { + throw MissingDefineException(kTargetPlatform, 'aot_elf'); + } + final BuildMode buildMode = getBuildModeForName(environment.defines[kBuildMode]); + final TargetPlatform targetPlatform = getTargetPlatformForName(environment.defines[kTargetPlatform]); + final int snapshotExitCode = await snapshotter.build( + platform: targetPlatform, + buildMode: buildMode, + mainPath: environment.buildDir.childFile('main.app.dill').path, + packagesPath: environment.projectDir.childFile('.packages').path, + outputPath: outputPath, + ); + if (snapshotExitCode != 0) { + throw Exception('AOT snapshotter exited with code $snapshotExitCode'); + } +} + +/// Finds the locations of all dart files within the project. +/// +/// This does not attempt to determine if a file is used or imported, so it +/// may otherwise report more files than strictly necessary. +List listDartSources(Environment environment) { + final Map packageMap = PackageMap(environment.projectDir.childFile('.packages').path).map; + final List dartFiles = []; + for (Uri uri in packageMap.values) { + final Directory libDirectory = fs.directory(uri.toFilePath(windows: platform.isWindows)); + for (FileSystemEntity entity in libDirectory.listSync(recursive: true)) { + if (entity is File && entity.path.endsWith('.dart')) { + dartFiles.add(entity); + } + } + } + return dartFiles; +} + +/// Supports compiling a dart kernel file to an assembly file. +/// +/// If more than one iOS arch is provided, then this rule will +/// produce a univeral binary. +Future compileAotAssembly(Map updates, Environment environment) async { + final AOTSnapshotter snapshotter = AOTSnapshotter(reportTimings: false); + final String outputPath = environment.buildDir.path; + if (environment.defines[kBuildMode] == null) { + throw MissingDefineException(kBuildMode, 'aot_assembly'); + } + if (environment.defines[kTargetPlatform] == null) { + throw MissingDefineException(kTargetPlatform, 'aot_assembly'); + } + final BuildMode buildMode = getBuildModeForName(environment.defines[kBuildMode]); + final TargetPlatform targetPlatform = getTargetPlatformForName(environment.defines[kTargetPlatform]); + final List iosArchs = environment.defines[kIosArchs]?.split(',')?.map(getIOSArchForName)?.toList() + ?? [IOSArch.arm64]; + if (targetPlatform != TargetPlatform.ios) { + throw Exception('aot_assembly is only supported for iOS applications'); + } + + // If we're building for a single architecture (common), then skip the lipo. + if (iosArchs.length == 1) { + final int snapshotExitCode = await snapshotter.build( + platform: targetPlatform, + buildMode: buildMode, + mainPath: environment.buildDir.childFile('main.app.dill').path, + packagesPath: environment.projectDir.childFile('.packages').path, + outputPath: outputPath, + iosArch: iosArchs.single, + ); + if (snapshotExitCode != 0) { + throw Exception('AOT snapshotter exited with code $snapshotExitCode'); + } + } else { + // If we're building multiple iOS archs the binaries need to be lipo'd + // together. + final List> pending = >[]; + for (IOSArch iosArch in iosArchs) { + pending.add(snapshotter.build( + platform: targetPlatform, + buildMode: buildMode, + mainPath: environment.buildDir.childFile('main.app.dill').path, + packagesPath: environment.projectDir.childFile('.packages').path, + outputPath: fs.path.join(outputPath, getNameForIOSArch(iosArch)), + iosArch: iosArch, + )); + } + final List results = await Future.wait(pending); + if (results.any((int result) => result != 0)) { + throw Exception('AOT snapshotter exited with code ${results.join()}'); + } + final ProcessResult result = await processManager.run([ + 'lipo', + ...iosArchs.map((IOSArch iosArch) => + fs.path.join(outputPath, getNameForIOSArch(iosArch), 'App.framework', 'App')), + '-create', + '-output', + fs.path.join(outputPath, 'App.framework', 'App'), + ]); + if (result.exitCode != 0) { + throw Exception('lipo exited with code ${result.exitCode}'); + } + } +} + +/// Generate a snapshot of the dart code used in the program. +const Target kernelSnapshot = Target( + name: 'kernel_snapshot', + inputs: [ + Source.function(listDartSources), // <- every dart file under {PROJECT_DIR}/lib and in .packages + Source.artifact(Artifact.platformKernelDill), + Source.artifact(Artifact.engineDartBinary), + Source.artifact(Artifact.frontendServerSnapshotForEngineDartSdk), + ], + outputs: [ + Source.pattern('{BUILD_DIR}/main.app.dill'), + ], + dependencies: [], + buildAction: compileKernel, +); + +/// Generate an ELF binary from a dart kernel file in profile mode. +const Target aotElfProfile = Target( + name: 'aot_elf_profile', + inputs: [ + Source.pattern('{BUILD_DIR}/main.app.dill'), + Source.pattern('{PROJECT_DIR}/.packages'), + Source.artifact(Artifact.engineDartBinary), + Source.artifact(Artifact.skyEnginePath), + Source.artifact(Artifact.genSnapshot, + platform: TargetPlatform.android_arm, + mode: BuildMode.profile, + ), + ], + outputs: [ + Source.pattern('{BUILD_DIR}/app.so'), + ], + dependencies: [ + kernelSnapshot, + ], + buildAction: compileAotElf, +); + +/// Generate an ELF binary from a dart kernel file in release mode. +const Target aotElfRelease= Target( + name: 'aot_elf_release', + inputs: [ + Source.pattern('{BUILD_DIR}/main.app.dill'), + Source.pattern('{PROJECT_DIR}/.packages'), + Source.artifact(Artifact.engineDartBinary), + Source.artifact(Artifact.skyEnginePath), + Source.artifact(Artifact.genSnapshot, + platform: TargetPlatform.android_arm, + mode: BuildMode.release, + ), + ], + outputs: [ + Source.pattern('{BUILD_DIR}/app.so'), + ], + dependencies: [ + kernelSnapshot, + ], + buildAction: compileAotElf, +); + +/// Generate an assembly target from a dart kernel file in profile mode. +const Target aotAssemblyProfile = Target( + name: 'aot_assembly_profile', + inputs: [ + Source.pattern('{BUILD_DIR}/main.app.dill'), + Source.pattern('{PROJECT_DIR}/.packages'), + Source.artifact(Artifact.engineDartBinary), + Source.artifact(Artifact.skyEnginePath), + Source.artifact(Artifact.genSnapshot, + platform: TargetPlatform.ios, + mode: BuildMode.profile, + ), + ], + outputs: [ + // TODO(jonahwilliams): are these used or just a side effect? + // Source.pattern('{BUILD_DIR}/snapshot_assembly.S'), + // Source.pattern('{BUILD_DIR}/snapshot_assembly.o'), + Source.pattern('{BUILD_DIR}/App.framework/App'), + ], + dependencies: [ + kernelSnapshot, + ], + buildAction: compileAotAssembly, +); + +/// Generate an assembly target from a dart kernel file in release mode. +const Target aotAssemblyRelease = Target( + name: 'aot_assembly_release', + inputs: [ + Source.pattern('{BUILD_DIR}/main.app.dill'), + Source.pattern('{PROJECT_DIR}/.packages'), + Source.artifact(Artifact.engineDartBinary), + Source.artifact(Artifact.skyEnginePath), + Source.artifact(Artifact.genSnapshot, + platform: TargetPlatform.ios, + mode: BuildMode.release, + ), + ], + outputs: [ + // TODO(jonahwilliams): are these used or just a side effect? + // Source.pattern('{BUILD_DIR}/snapshot_assembly.S'), + // Source.pattern('{BUILD_DIR}/snapshot_assembly.o'), + Source.pattern('{BUILD_DIR}/App.framework/App'), + ], + dependencies: [ + kernelSnapshot, + ], + buildAction: compileAotAssembly, +); diff --git a/packages/flutter_tools/lib/src/build_system/targets/ios.dart b/packages/flutter_tools/lib/src/build_system/targets/ios.dart new file mode 100644 index 00000000000..19e38ea484b --- /dev/null +++ b/packages/flutter_tools/lib/src/build_system/targets/ios.dart @@ -0,0 +1,43 @@ +// Copyright 2019 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 '../build_system.dart'; +import 'assets.dart'; +import 'dart.dart'; + +/// Create an iOS debug application. +const Target debugIosApplication = Target( + name: 'debug_ios_application', + buildAction: null, + inputs: [], + outputs: [], + dependencies: [ + copyAssets, + kernelSnapshot, + ] +); + +/// Create an iOS profile application. +const Target profileIosApplication = Target( + name: 'profile_ios_application', + buildAction: null, + inputs: [], + outputs: [], + dependencies: [ + copyAssets, + aotAssemblyProfile, + ] +); + +/// Create an iOS debug application. +const Target releaseIosApplication = Target( + name: 'release_ios_application', + buildAction: null, + inputs: [], + outputs: [], + dependencies: [ + copyAssets, + aotAssemblyRelease, + ] +); diff --git a/packages/flutter_tools/lib/src/build_system/targets/linux.dart b/packages/flutter_tools/lib/src/build_system/targets/linux.dart new file mode 100644 index 00000000000..c5ad64d1389 --- /dev/null +++ b/packages/flutter_tools/lib/src/build_system/targets/linux.dart @@ -0,0 +1,46 @@ +// Copyright 2019 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 '../../artifacts.dart'; +import '../../base/file_system.dart'; +import '../../globals.dart'; +import '../build_system.dart'; + +// Copies all of the input files to the correct copy dir. +Future copyLinuxAssets(Map updates, + Environment environment) async { + final String basePath = artifacts.getArtifactPath(Artifact.linuxDesktopPath); + for (String input in updates.keys) { + final String outputPath = fs.path.join( + environment.projectDir.path, + 'linux', + 'flutter', + fs.path.relative(input, from: basePath), + ); + final File destinationFile = fs.file(outputPath); + if (!destinationFile.parent.existsSync()) { + destinationFile.parent.createSync(recursive: true); + } + fs.file(input).copySync(destinationFile.path); + } +} + +/// Copies the Linux desktop embedding files to the copy directory. +const Target unpackLinux = Target( + name: 'unpack_linux', + inputs: [ + Source.artifact(Artifact.linuxDesktopPath), + ], + outputs: [ + Source.pattern('{PROJECT_DIR}/linux/flutter/libflutter_linux.so'), + Source.pattern('{PROJECT_DIR}/linux/flutter/flutter_export.h'), + Source.pattern('{PROJECT_DIR}/linux/flutter/flutter_messenger.h'), + Source.pattern('{PROJECT_DIR}/linux/flutter/flutter_plugin_registrar.h'), + Source.pattern('{PROJECT_DIR}/linux/flutter/flutter_glfw.h'), + Source.pattern('{PROJECT_DIR}/linux/flutter/icudtl.dat'), + Source.pattern('{PROJECT_DIR}/linux/flutter/cpp_client_wrapper/*'), + ], + dependencies: [], + buildAction: copyLinuxAssets, +); diff --git a/packages/flutter_tools/lib/src/build_system/targets/macos.dart b/packages/flutter_tools/lib/src/build_system/targets/macos.dart new file mode 100644 index 00000000000..7bfb9239f7e --- /dev/null +++ b/packages/flutter_tools/lib/src/build_system/targets/macos.dart @@ -0,0 +1,100 @@ +// Copyright 2019 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 '../../artifacts.dart'; +import '../../base/file_system.dart'; +import '../../base/io.dart'; +import '../../base/process_manager.dart'; +import '../../globals.dart'; +import '../build_system.dart'; +import 'assets.dart'; +import 'dart.dart'; + +/// Copy the macOS framework to the correct copy dir by invoking 'cp -R'. +/// +/// The shelling out is done to avoid complications with preserving special +/// files (e.g., symbolic links) in the framework structure. +/// +/// Removes any previous version of the framework that already exists in the +/// target directory. +// TODO(jonahwilliams): remove shell out. +Future copyFramework(Map updates, + Environment environment) async { + final String basePath = artifacts.getArtifactPath(Artifact.flutterMacOSFramework); + final Directory targetDirectory = environment + .projectDir + .childDirectory('macos') + .childDirectory('Flutter') + .childDirectory('FlutterMacOS.framework'); + if (targetDirectory.existsSync()) { + targetDirectory.deleteSync(recursive: true); + } + + final ProcessResult result = processManager + .runSync(['cp', '-R', basePath, targetDirectory.path]); + if (result.exitCode != 0) { + throw Exception( + 'Failed to copy framework (exit ${result.exitCode}:\n' + '${result.stdout}\n---\n${result.stderr}', + ); + } +} + +const String _kOutputPrefix = '{PROJECT_DIR}/macos/Flutter/FlutterMacOS.framework'; + +/// Copies the macOS desktop framework to the copy directory. +const Target unpackMacos = Target( + name: 'unpack_macos', + inputs: [ + Source.artifact(Artifact.flutterMacOSFramework), + ], + outputs: [ + Source.pattern('$_kOutputPrefix/FlutterMacOS'), + // Headers + Source.pattern('$_kOutputPrefix/Headers/FLEOpenGLContextHandling.h'), + Source.pattern('$_kOutputPrefix/Headers/FLEReshapeListener.h'), + Source.pattern('$_kOutputPrefix/Headers/FLEView.h'), + Source.pattern('$_kOutputPrefix/Headers/FLEViewController.h'), + Source.pattern('$_kOutputPrefix/Headers/FlutterBinaryMessenger.h'), + Source.pattern('$_kOutputPrefix/Headers/FlutterChannels.h'), + Source.pattern('$_kOutputPrefix/Headers/FlutterCodecs.h'), + Source.pattern('$_kOutputPrefix/Headers/FlutterMacOS.h'), + Source.pattern('$_kOutputPrefix/Headers/FlutterPluginMacOS.h'), + Source.pattern('$_kOutputPrefix/Headers/FlutterPluginRegistrarMacOS.h'), + // Modules + Source.pattern('$_kOutputPrefix/Modules/module.modulemap'), + // Resources + Source.pattern('$_kOutputPrefix/Resources/icudtl.dat'), + Source.pattern('$_kOutputPrefix/Resources/info.plist'), + // Ignore Versions folder for now + ], + dependencies: [], + buildAction: copyFramework, +); + +/// Build a macOS application. +const Target macosApplication = Target( + name: 'debug_macos_application', + buildAction: null, + inputs: [], + outputs: [], + dependencies: [ + unpackMacos, + kernelSnapshot, + copyAssets, + ] +); + +/// Build a macOS release application. +const Target macoReleaseApplication = Target( + name: 'release_macos_application', + buildAction: null, + inputs: [], + outputs: [], + dependencies: [ + unpackMacos, + aotElfRelease, + copyAssets, + ] +); diff --git a/packages/flutter_tools/lib/src/build_system/targets/windows.dart b/packages/flutter_tools/lib/src/build_system/targets/windows.dart new file mode 100644 index 00000000000..2677cba6983 --- /dev/null +++ b/packages/flutter_tools/lib/src/build_system/targets/windows.dart @@ -0,0 +1,50 @@ +// Copyright 2019 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 '../../artifacts.dart'; +import '../../base/file_system.dart'; +import '../../globals.dart'; +import '../build_system.dart'; + +/// Copies all of the input files to the correct copy dir. +Future copyWindowsAssets(Map updates, + Environment environment) async { + // This path needs to match the prefix in the rule below. + final String basePath = artifacts.getArtifactPath(Artifact.windowsDesktopPath); + for (String input in updates.keys) { + final String outputPath = fs.path.join( + environment.projectDir.path, + 'windows', + 'flutter', + fs.path.relative(input, from: basePath), + ); + final File destinationFile = fs.file(outputPath); + if (!destinationFile.parent.existsSync()) { + destinationFile.parent.createSync(recursive: true); + } + fs.file(input).copySync(destinationFile.path); + } +} + +/// Copies the Windows desktop embedding files to the copy directory. +const Target unpackWindows = Target( + name: 'unpack_windows', + inputs: [ + Source.artifact(Artifact.windowsDesktopPath), + ], + outputs: [ + Source.pattern('{PROJECT_DIR}/windows/flutter/flutter_windows.dll'), + Source.pattern('{PROJECT_DIR}/windows/flutter/flutter_windows.dll.exp'), + Source.pattern('{PROJECT_DIR}/windows/flutter/flutter_windows.dll.lib'), + Source.pattern('{PROJECT_DIR}/windows/flutter/flutter_windows.dll.pdb'), + Source.pattern('{PROJECT_DIR}/windows/flutter/flutter_export.h'), + Source.pattern('{PROJECT_DIR}/windows/flutter/flutter_messenger.h'), + Source.pattern('{PROJECT_DIR}/windows/flutter/flutter_plugin_registrar.h'), + Source.pattern('{PROJECT_DIR}/windows/flutter/flutter_glfw.h'), + Source.pattern('{PROJECT_DIR}/windows/flutter/icudtl.dat'), + Source.pattern('{PROJECT_DIR}/windows/flutter/cpp_client_wrapper/*'), + ], + dependencies: [], + buildAction: copyWindowsAssets, +); diff --git a/packages/flutter_tools/lib/src/commands/assemble.dart b/packages/flutter_tools/lib/src/commands/assemble.dart new file mode 100644 index 00000000000..e5a66593103 --- /dev/null +++ b/packages/flutter_tools/lib/src/commands/assemble.dart @@ -0,0 +1,221 @@ +// Copyright 2019 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 '../base/common.dart'; +import '../base/context.dart'; +import '../base/file_system.dart'; +import '../build_info.dart'; +import '../build_system/build_system.dart'; +import '../convert.dart'; +import '../globals.dart'; +import '../project.dart'; +import '../runner/flutter_command.dart'; + +/// The [BuildSystem] instance. +BuildSystem get buildSystem => context.get(); + +/// Assemble provides a low level API to interact with the flutter tool build +/// system. +class AssembleCommand extends FlutterCommand { + AssembleCommand() { + addSubcommand(AssembleRun()); + addSubcommand(AssembleDescribe()); + addSubcommand(AssembleListInputs()); + addSubcommand(AssembleBuildDirectory()); + } + @override + String get description => 'Assemble and build flutter resources.'; + + @override + String get name => 'assemble'; + + @override + bool get isExperimental => true; + + @override + Future runCommand() { + return null; + } +} + +abstract class AssembleBase extends FlutterCommand { + AssembleBase() { + argParser.addMultiOption( + 'define', + abbr: 'd', + help: 'Allows passing configuration to a target with --define=target=key=value.' + ); + argParser.addOption( + 'build-mode', + allowed: const [ + 'debug', + 'profile', + 'release', + ], + ); + argParser.addOption( + 'resource-pool-size', + help: 'The maximum number of concurrent tasks the build system will run.' + ); + } + + /// Returns the provided target platform. + /// + /// Throws a [ToolExit] if none is provided. This intentionally has no + /// default. + TargetPlatform get targetPlatform { + final String value = argResults['target-platform'] ?? 'darwin-x64'; + if (value == null) { + throwToolExit('--target-platform is required for flutter assemble.'); + } + return getTargetPlatformForName(value); + } + + /// Returns the provided build mode. + /// + /// Throws a [ToolExit] if none is provided. This intentionally has no + /// default. + BuildMode get buildMode { + final String value = argResults['build-mode'] ?? 'debug'; + if (value == null) { + throwToolExit('--build-mode is required for flutter assemble.'); + } + return getBuildModeForName(value); + } + + /// The name of the target we are describing or building. + String get targetName { + if (argResults.rest.isEmpty) { + throwToolExit('missing target name for flutter assemble.'); + } + return argResults.rest.first; + } + + /// The environmental configuration for a build invocation. + Environment get environment { + final FlutterProject flutterProject = FlutterProject.current(); + final Environment result = Environment( + buildDir: fs.directory(getBuildDirectory()), + projectDir: flutterProject.directory, + defines: _parseDefines(argResults['define']), + ); + return result; + } + + static Map _parseDefines(List values) { + final Map results = {}; + for (String chunk in values) { + final List parts = chunk.split('='); + if (parts.length != 2) { + throwToolExit('Improperly formatted define flag: $chunk'); + } + final String key = parts[0]; + final String value = parts[1]; + results[key] = value; + } + return results; + } +} + +/// Execute a build starting from a target action. +class AssembleRun extends AssembleBase { + @override + String get description => 'Execute the stages for a specified target.'; + + @override + String get name => 'run'; + + @override + bool get isExperimental => true; + + @override + Future runCommand() async { + final BuildResult result = await buildSystem.build(targetName, environment, BuildSystemConfig( + resourcePoolSize: argResults['resource-pool-size'], + )); + if (!result.success) { + for (MapEntry data in result.exceptions.entries) { + printError('Target ${data.key} failed: ${data.value.exception}'); + printError('${data.value.exception}'); + } + throwToolExit('build failed'); + } else { + printStatus('build succeeded'); + } + return null; + } +} + +/// Fully describe a target and its dependencies. +class AssembleDescribe extends AssembleBase { + @override + String get description => 'List the stages for a specified target.'; + + @override + String get name => 'describe'; + + @override + bool get isExperimental => true; + + @override + Future runCommand() { + try { + printStatus( + json.encode(buildSystem.describe(targetName, environment)) + ); + } on Exception catch (err, stackTrace) { + printTrace(stackTrace.toString()); + throwToolExit(err.toString()); + } + return null; + } +} + +/// List input files for a target. +class AssembleListInputs extends AssembleBase { + @override + String get description => 'List the inputs for a particular target.'; + + @override + String get name => 'inputs'; + + @override + bool get isExperimental => true; + + @override + Future runCommand() { + try { + final List> results = buildSystem.describe(targetName, environment); + for (Map result in results) { + if (result['name'] == targetName) { + final List inputs = result['inputs']; + inputs.forEach(printStatus); + } + } + } on Exception catch (err, stackTrace) { + printTrace(stackTrace.toString()); + throwToolExit(err.toString()); + } + return null; + } +} + +/// Return the build directory for a configuiration. +class AssembleBuildDirectory extends AssembleBase { + @override + String get description => 'List the inputs for a particular target.'; + + @override + String get name => 'build-dir'; + + @override + bool get isExperimental => true; + + @override + Future runCommand() { + printStatus(environment.buildDir.path); + return null; + } +} + diff --git a/packages/flutter_tools/lib/src/context_runner.dart b/packages/flutter_tools/lib/src/context_runner.dart index bc03cbe4474..533cfc6fbdf 100644 --- a/packages/flutter_tools/lib/src/context_runner.dart +++ b/packages/flutter_tools/lib/src/context_runner.dart @@ -21,6 +21,7 @@ import 'base/platform.dart'; import 'base/time.dart'; import 'base/user_messages.dart'; import 'base/utils.dart'; +import 'build_system/build_system.dart'; import 'cache.dart'; import 'compile.dart'; import 'devfs.dart'; @@ -67,6 +68,7 @@ Future runInContext( Artifacts: () => CachedArtifacts(), AssetBundleFactory: () => AssetBundleFactory.defaultInstance, BotDetector: () => const BotDetector(), + BuildSystem: () => BuildSystem(), Cache: () => Cache(), ChromeLauncher: () => const ChromeLauncher(), CocoaPods: () => CocoaPods(), diff --git a/packages/flutter_tools/pubspec.yaml b/packages/flutter_tools/pubspec.yaml index 2a8a7ebd4db..6a573d1bd8b 100644 --- a/packages/flutter_tools/pubspec.yaml +++ b/packages/flutter_tools/pubspec.yaml @@ -38,6 +38,7 @@ dependencies: yaml: 2.1.16 flutter_goldens_client: path: ../flutter_goldens_client + protobuf: 0.13.15 # We depend on very specific internal implementation details of the # 'test' package, which change between versions, so when upgrading @@ -83,7 +84,6 @@ dependencies: pedantic: 1.8.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" petitparser: 2.4.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" pool: 1.4.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - protobuf: 0.13.15 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" pub_semver: 1.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" pubspec_parse: 0.1.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" scratch_space: 0.0.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" diff --git a/packages/flutter_tools/test/build_system/build_system_test.dart b/packages/flutter_tools/test/build_system/build_system_test.dart new file mode 100644 index 00000000000..e0c2ffa7ab6 --- /dev/null +++ b/packages/flutter_tools/test/build_system/build_system_test.dart @@ -0,0 +1,554 @@ +// Copyright 2019 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 'package:flutter_tools/src/artifacts.dart'; +import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/build_info.dart'; +import 'package:flutter_tools/src/build_system/build_system.dart'; +import 'package:flutter_tools/src/build_system/exceptions.dart'; +import 'package:flutter_tools/src/build_system/file_hash_store.dart'; +import 'package:flutter_tools/src/build_system/filecache.pb.dart' as pb; +import 'package:flutter_tools/src/cache.dart'; +import 'package:flutter_tools/src/convert.dart'; +import 'package:mockito/mockito.dart'; + +import '../src/common.dart'; +import '../src/context.dart'; +import '../src/testbed.dart'; + +void main() { + setUpAll(() { + Cache.disableLocking(); + }); + + group(Target, () { + Testbed testbed; + MockPlatform mockPlatform; + Environment environment; + Target fooTarget; + Target barTarget; + Target fizzTarget; + BuildSystem buildSystem; + int fooInvocations; + int barInvocations; + + setUp(() { + fooInvocations = 0; + barInvocations = 0; + mockPlatform = MockPlatform(); + // Keep file paths the same. + when(mockPlatform.isWindows).thenReturn(false); + testbed = Testbed( + setup: () { + environment = Environment( + projectDir: fs.currentDirectory, + ); + fs.file('foo.dart').createSync(recursive: true); + fs.file('pubspec.yaml').createSync(); + fooTarget = Target( + name: 'foo', + inputs: const [ + Source.pattern('{PROJECT_DIR}/foo.dart'), + ], + outputs: const [ + Source.pattern('{BUILD_DIR}/out'), + ], + dependencies: [], + buildAction: (Map updates, Environment environment) { + environment + .buildDir + .childFile('out') + ..createSync(recursive: true) + ..writeAsStringSync('hey'); + fooInvocations++; + } + ); + barTarget = Target( + name: 'bar', + inputs: const [ + Source.pattern('{BUILD_DIR}/out'), + ], + outputs: const [ + Source.pattern('{BUILD_DIR}/bar'), + ], + dependencies: [fooTarget], + buildAction: (Map updates, Environment environment) { + environment.buildDir + .childFile('bar') + ..createSync(recursive: true) + ..writeAsStringSync('there'); + barInvocations++; + } + ); + fizzTarget = Target( + name: 'fizz', + inputs: const [ + Source.pattern('{BUILD_DIR}/out'), + ], + outputs: const [ + Source.pattern('{BUILD_DIR}/fizz'), + ], + dependencies: [fooTarget], + buildAction: (Map updates, Environment environment) { + throw Exception('something bad happens'); + } + ); + buildSystem = BuildSystem({ + fooTarget.name: fooTarget, + barTarget.name: barTarget, + fizzTarget.name: fizzTarget, + }); + }, + overrides: { + Platform: () => mockPlatform, + } + ); + }); + + test('can describe build rules', () => testbed.run(() { + expect(buildSystem.describe('foo', environment), [ + { + 'name': 'foo', + 'dependencies': [], + 'inputs': ['/foo.dart'], + 'outputs': [fs.path.join(environment.buildDir.path, 'out')], + 'stamp': fs.path.join(environment.buildDir.path, 'foo.stamp'), + } + ]); + })); + + test('Throws exception if asked to build non-existent target', () => testbed.run(() { + expect(buildSystem.build('not_real', environment, const BuildSystemConfig()), throwsA(isInstanceOf())); + })); + + test('Throws exception if asked to build with missing inputs', () => testbed.run(() async { + // Delete required input file. + fs.file('foo.dart').deleteSync(); + final BuildResult buildResult = await buildSystem.build('foo', environment, const BuildSystemConfig()); + + expect(buildResult.hasException, true); + expect(buildResult.exceptions.values.single.exception, isInstanceOf()); + })); + + test('Throws exception if it does not produce a specified output', () => testbed.run(() async { + final Target badTarget = Target + (buildAction: (Map inputs, Environment environment) {}, + inputs: const [ + Source.pattern('{PROJECT_DIR}/foo.dart'), + ], + outputs: const [ + Source.pattern('{BUILD_DIR}/out') + ], + name: 'bad' + ); + buildSystem = BuildSystem({ + badTarget.name: badTarget, + }); + final BuildResult result = await buildSystem.build('bad', environment, const BuildSystemConfig()); + + expect(result.hasException, true); + expect(result.exceptions.values.single.exception, isInstanceOf()); + })); + + test('Saves a stamp file with inputs and outputs', () => testbed.run(() async { + await buildSystem.build('foo', environment, const BuildSystemConfig()); + + final File stampFile = fs.file(fs.path.join(environment.buildDir.path, 'foo.stamp')); + expect(stampFile.existsSync(), true); + + final Map stampContents = json.decode(stampFile.readAsStringSync()); + expect(stampContents['inputs'], ['/foo.dart']); + })); + + test('Does not re-invoke build if stamp is valid', () => testbed.run(() async { + await buildSystem.build('foo', environment, const BuildSystemConfig()); + await buildSystem.build('foo', environment, const BuildSystemConfig()); + + expect(fooInvocations, 1); + })); + + test('Re-invoke build if input is modified', () => testbed.run(() async { + await buildSystem.build('foo', environment, const BuildSystemConfig()); + + fs.file('foo.dart').writeAsStringSync('new contents'); + + await buildSystem.build('foo', environment, const BuildSystemConfig()); + expect(fooInvocations, 2); + })); + + test('does not re-invoke build if input timestamp changes', () => testbed.run(() async { + await buildSystem.build('foo', environment, const BuildSystemConfig()); + + fs.file('foo.dart').writeAsStringSync(''); + + await buildSystem.build('foo', environment, const BuildSystemConfig()); + expect(fooInvocations, 1); + })); + + test('does not re-invoke build if output timestamp changes', () => testbed.run(() async { + await buildSystem.build('foo', environment, const BuildSystemConfig()); + + environment.buildDir.childFile('out').writeAsStringSync('hey'); + + await buildSystem.build('foo', environment, const BuildSystemConfig()); + expect(fooInvocations, 1); + })); + + + test('Re-invoke build if output is modified', () => testbed.run(() async { + await buildSystem.build('foo', environment, const BuildSystemConfig()); + + environment.buildDir.childFile('out').writeAsStringSync('Something different'); + + await buildSystem.build('foo', environment, const BuildSystemConfig()); + expect(fooInvocations, 2); + })); + + test('Runs dependencies of targets', () => testbed.run(() async { + await buildSystem.build('bar', environment, const BuildSystemConfig()); + + expect(fs.file(fs.path.join(environment.buildDir.path, 'bar')).existsSync(), true); + expect(fooInvocations, 1); + expect(barInvocations, 1); + })); + + test('handles a throwing build action', () => testbed.run(() async { + final BuildResult result = await buildSystem.build('fizz', environment, const BuildSystemConfig()); + + expect(result.hasException, true); + })); + + test('Can describe itself with JSON output', () => testbed.run(() { + environment.buildDir.createSync(recursive: true); + expect(fooTarget.toJson(environment), { + 'inputs': [ + '/foo.dart' + ], + 'outputs': [ + fs.path.join(environment.buildDir.path, 'out'), + ], + 'dependencies': [], + 'name': 'foo', + 'stamp': fs.path.join(environment.buildDir.path, 'foo.stamp'), + }); + })); + + test('Compute update recognizes added files', () => testbed.run(() async { + fs.directory('build').createSync(); + final FileHashStore fileCache = FileHashStore(environment); + fileCache.initialize(); + final List inputs = fooTarget.resolveInputs(environment); + final Map changes = await fooTarget.computeChanges(inputs, environment, fileCache); + fileCache.persist(); + + expect(changes, { + '/foo.dart': ChangeType.Added + }); + + await buildSystem.build('foo', environment, const BuildSystemConfig()); + final Map secondChanges = await fooTarget.computeChanges(inputs, environment, fileCache); + + expect(secondChanges, {}); + })); + }); + + group('FileCache', () { + Testbed testbed; + Environment environment; + + setUp(() { + testbed = Testbed(setup: () { + fs.directory('build').createSync(); + environment = Environment( + projectDir: fs.currentDirectory, + ); + }); + }); + + test('Initializes file cache', () => testbed.run(() { + final FileHashStore fileCache = FileHashStore(environment); + fileCache.initialize(); + fileCache.persist(); + + expect(fs.file(fs.path.join('build', '.filecache')).existsSync(), true); + + final List buffer = fs.file(fs.path.join('build', '.filecache')).readAsBytesSync(); + final pb.FileStorage fileStorage = pb.FileStorage.fromBuffer(buffer); + + expect(fileStorage.files, isEmpty); + expect(fileStorage.version, 1); + })); + + test('saves and restores to file cache', () => testbed.run(() { + final File file = fs.file('foo.dart') + ..createSync() + ..writeAsStringSync('hello'); + final FileHashStore fileCache = FileHashStore(environment); + fileCache.initialize(); + fileCache.hashFiles([file]); + fileCache.persist(); + final String currentHash = fileCache.currentHashes[file.resolveSymbolicLinksSync()]; + final List buffer = fs.file(fs.path.join('build', '.filecache')).readAsBytesSync(); + pb.FileStorage fileStorage = pb.FileStorage.fromBuffer(buffer); + + expect(fileStorage.files.single.hash, currentHash); + expect(fileStorage.files.single.path, file.resolveSymbolicLinksSync()); + + + final FileHashStore newFileCache = FileHashStore(environment); + newFileCache.initialize(); + expect(newFileCache.currentHashes, isEmpty); + expect(newFileCache.previousHashes[fs.path.absolute('foo.dart')], currentHash); + newFileCache.persist(); + + // Still persisted correctly. + fileStorage = pb.FileStorage.fromBuffer(buffer); + + expect(fileStorage.files.single.hash, currentHash); + expect(fileStorage.files.single.path, file.resolveSymbolicLinksSync()); + })); + }); + + group('Target', () { + Testbed testbed; + MockPlatform mockPlatform; + Environment environment; + Target sharedTarget; + BuildSystem buildSystem; + int shared; + + setUp(() { + shared = 0; + Cache.flutterRoot = ''; + mockPlatform = MockPlatform(); + // Keep file paths the same. + when(mockPlatform.isWindows).thenReturn(false); + when(mockPlatform.isLinux).thenReturn(true); + when(mockPlatform.isMacOS).thenReturn(false); + testbed = Testbed( + setup: () { + environment = Environment( + projectDir: fs.currentDirectory, + ); + fs.file('foo.dart').createSync(recursive: true); + fs.file('pubspec.yaml').createSync(); + sharedTarget = Target( + name: 'shared', + inputs: const [ + Source.pattern('{PROJECT_DIR}/foo.dart'), + ], + outputs: const [], + dependencies: [], + buildAction: (Map updates, Environment environment) { + shared += 1; + } + ); + final Target fooTarget = Target( + name: 'foo', + inputs: const [ + Source.pattern('{PROJECT_DIR}/foo.dart'), + ], + outputs: const [ + Source.pattern('{BUILD_DIR}/out'), + ], + dependencies: [sharedTarget], + buildAction: (Map updates, Environment environment) { + environment + .buildDir + .childFile('out') + ..createSync(recursive: true) + ..writeAsStringSync('hey'); + } + ); + final Target barTarget = Target( + name: 'bar', + inputs: const [ + Source.pattern('{BUILD_DIR}/out'), + ], + outputs: const [ + Source.pattern('{BUILD_DIR}/bar'), + ], + dependencies: [fooTarget, sharedTarget], + buildAction: (Map updates, Environment environment) { + environment + .buildDir + .childFile('bar') + ..createSync(recursive: true) + ..writeAsStringSync('there'); + } + ); + buildSystem = BuildSystem({ + fooTarget.name: fooTarget, + barTarget.name: barTarget, + sharedTarget.name: sharedTarget, + }); + }, + overrides: { + Platform: () => mockPlatform, + } + ); + }); + + test('Only invokes shared target once', () => testbed.run(() async { + await buildSystem.build('bar', environment, const BuildSystemConfig()); + + expect(shared, 1); + })); + }); + + group('Source', () { + Testbed testbed; + SourceVisitor visitor; + Environment environment; + + setUp(() { + testbed = Testbed(setup: () { + fs.directory('cache').createSync(); + environment = Environment( + projectDir: fs.currentDirectory, + buildDir: fs.directory('build'), + ); + visitor = SourceVisitor(environment); + environment.buildDir.createSync(recursive: true); + }); + }); + + test('configures implicit vs explict correctly', () => testbed.run(() { + expect(const Source.pattern('{PROJECT_DIR}/foo').implicit, false); + expect(const Source.pattern('{PROJECT_DIR}/*foo').implicit, true); + expect(Source.function((Environment environment) => []).implicit, true); + expect(Source.behavior(TestBehavior()).implicit, true); + })); + + test('can substitute {PROJECT_DIR}/foo', () => testbed.run(() { + fs.file('foo').createSync(); + const Source fooSource = Source.pattern('{PROJECT_DIR}/foo'); + fooSource.accept(visitor); + + expect(visitor.sources.single.path, fs.path.absolute('foo')); + })); + + test('can substitute {BUILD_DIR}/bar', () => testbed.run(() { + final String path = fs.path.join(environment.buildDir.path, 'bar'); + fs.file(path).createSync(); + const Source barSource = Source.pattern('{BUILD_DIR}/bar'); + barSource.accept(visitor); + + expect(visitor.sources.single.path, fs.path.absolute(path)); + })); + + test('can substitute Artifact', () => testbed.run(() { + final String path = fs.path.join( + Cache.instance.getArtifactDirectory('engine').path, + 'windows-x64', + 'foo', + ); + fs.file(path).createSync(recursive: true); + const Source fizzSource = Source.artifact(Artifact.windowsDesktopPath, platform: TargetPlatform.windows_x64); + fizzSource.accept(visitor); + + expect(visitor.sources.single.resolveSymbolicLinksSync(), fs.path.absolute(path)); + })); + + test('can substitute {PROJECT_DIR}/*.fizz', () => testbed.run(() { + const Source fizzSource = Source.pattern('{PROJECT_DIR}/*.fizz'); + fizzSource.accept(visitor); + + expect(visitor.sources, isEmpty); + + fs.file('foo.fizz').createSync(); + fs.file('foofizz').createSync(); + + + fizzSource.accept(visitor); + + expect(visitor.sources.single.path, fs.path.absolute('foo.fizz')); + })); + + test('can substitute {PROJECT_DIR}/fizz.*', () => testbed.run(() { + const Source fizzSource = Source.pattern('{PROJECT_DIR}/fizz.*'); + fizzSource.accept(visitor); + + expect(visitor.sources, isEmpty); + + fs.file('fizz.foo').createSync(); + fs.file('fizz').createSync(); + + fizzSource.accept(visitor); + + expect(visitor.sources.single.path, fs.path.absolute('fizz.foo')); + })); + + + test('can substitute {PROJECT_DIR}/a*bc', () => testbed.run(() { + const Source fizzSource = Source.pattern('{PROJECT_DIR}/bc*bc'); + fizzSource.accept(visitor); + + expect(visitor.sources, isEmpty); + + fs.file('bcbc').createSync(); + fs.file('bc').createSync(); + + fizzSource.accept(visitor); + + expect(visitor.sources.single.path, fs.path.absolute('bcbc')); + })); + + + test('crashes on bad substitute of two **', () => testbed.run(() { + const Source fizzSource = Source.pattern('{PROJECT_DIR}/*.*bar'); + + fs.file('abcd.bar').createSync(); + + expect(() => fizzSource.accept(visitor), throwsA(isInstanceOf())); + })); + + + test('can\'t substitute foo', () => testbed.run(() { + const Source invalidBase = Source.pattern('foo'); + + expect(() => invalidBase.accept(visitor), throwsA(isInstanceOf())); + })); + }); + + + + test('Can find dependency cycles', () { + final Target barTarget = Target( + name: 'bar', + inputs: [], + outputs: [], + buildAction: null, + dependencies: nonconst([]) + ); + final Target fooTarget = Target( + name: 'foo', + inputs: [], + outputs: [], + buildAction: null, + dependencies: nonconst([]) + ); + barTarget.dependencies.add(fooTarget); + fooTarget.dependencies.add(barTarget); + expect(() => checkCycles(barTarget), throwsA(isInstanceOf())); + }); +} + +class MockPlatform extends Mock implements Platform {} + +// Work-around for silly lint check. +T nonconst(T input) => input; + +class TestBehavior extends SourceBehavior { + @override + List inputs(Environment environment) { + return null; + } + + @override + List outputs(Environment environment) { + return null; + } +} diff --git a/packages/flutter_tools/test/build_system/exceptions_test.dart b/packages/flutter_tools/test/build_system/exceptions_test.dart new file mode 100644 index 00000000000..68486141e66 --- /dev/null +++ b/packages/flutter_tools/test/build_system/exceptions_test.dart @@ -0,0 +1,72 @@ +// Copyright 2019 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 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/build_system/build_system.dart'; +import 'package:flutter_tools/src/build_system/exceptions.dart'; + +import '../src/common.dart'; + +void main() { + test('Exceptions', () { + final MissingInputException missingInputException = MissingInputException( + [fs.file('foo'), fs.file('bar')], 'example'); + final CycleException cycleException = CycleException(const { + Target( + name: 'foo', + buildAction: null, + inputs: [], + outputs: [], + ), + Target( + name: 'bar', + buildAction: null, + inputs: [], + outputs: [], + ) + }); + final InvalidPatternException invalidPatternException = InvalidPatternException( + 'ABC' + ); + final MissingOutputException missingOutputException = MissingOutputException( + [ fs.file('foo'), fs.file('bar') ], + 'example' + ); + final MisplacedOutputException misplacedOutputException = MisplacedOutputException( + 'foo', + 'example', + ); + final MissingDefineException missingDefineException = MissingDefineException( + 'foobar', + 'example', + ); + + expect( + missingInputException.toString(), + 'foo, bar were declared as an inputs, ' + 'but did not exist. Check the definition of target:example for errors'); + expect( + cycleException.toString(), + 'Dependency cycle detected in build: foo -> bar' + ); + expect( + invalidPatternException.toString(), + 'The pattern "ABC" is not valid' + ); + expect( + missingOutputException.toString(), + 'foo, bar were declared as outputs, but were not generated by the ' + 'action. Check the definition of target:example for errors' + ); + expect( + misplacedOutputException.toString(), + 'Target example produced an output at foo which is outside of the ' + 'current build or project directory', + ); + expect( + missingDefineException.toString(), + 'Target example required define foobar but it was not provided' + ); + }); +} diff --git a/packages/flutter_tools/test/build_system/targets/assets_test.dart b/packages/flutter_tools/test/build_system/targets/assets_test.dart new file mode 100644 index 00000000000..43021558039 --- /dev/null +++ b/packages/flutter_tools/test/build_system/targets/assets_test.dart @@ -0,0 +1,70 @@ +// Copyright 2019 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 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/build_system/build_system.dart'; +import 'package:flutter_tools/src/build_system/targets/assets.dart'; + +import '../../src/common.dart'; +import '../../src/testbed.dart'; + +void main() { + group('copy_assets', () { + Testbed testbed; + BuildSystem buildSystem; + Environment environment; + + setUp(() { + testbed = Testbed(setup: () { + environment = Environment( + projectDir: fs.currentDirectory, + ); + buildSystem = BuildSystem({ + copyAssets.name: copyAssets, + }); + fs.file(fs.path.join('assets', 'foo', 'bar.png')) + ..createSync(recursive: true); + fs.file('.packages') + ..createSync(); + fs.file('pubspec.yaml') + ..createSync() + ..writeAsStringSync(''' +name: example + +flutter: + assets: + - assets/foo/bar.png +'''); + }); + }); + + test('Copies files to correct asset directory', () => testbed.run(() async { + await buildSystem.build('copy_assets', environment, const BuildSystemConfig()); + + expect(fs.file(fs.path.join(environment.buildDir.path, 'flutter_assets', 'AssetManifest.json')).existsSync(), true); + expect(fs.file(fs.path.join(environment.buildDir.path, 'flutter_assets', 'FontManifest.json')).existsSync(), true); + expect(fs.file(fs.path.join(environment.buildDir.path, 'flutter_assets', 'LICENSE')).existsSync(), true); + // See https://github.com/flutter/flutter/issues/35293 + expect(fs.file(fs.path.join(environment.buildDir.path, 'flutter_assets', 'assets/foo/bar.png')).existsSync(), true); + })); + + test('Does not leave stale files in build directory', () => testbed.run(() async { + await buildSystem.build('copy_assets', environment, const BuildSystemConfig()); + + expect(fs.file(fs.path.join(environment.buildDir.path, 'flutter_assets', 'assets/foo/bar.png')).existsSync(), true); + // Modify manifest to remove asset. + fs.file('pubspec.yaml') + ..createSync() + ..writeAsStringSync(''' +name: example + +flutter: +'''); + await buildSystem.build('copy_assets', environment, const BuildSystemConfig()); + + // See https://github.com/flutter/flutter/issues/35293 + expect(fs.file(fs.path.join(environment.buildDir.path, 'flutter_assets', 'assets/foo/bar.png')).existsSync(), false); + })); + }); +} diff --git a/packages/flutter_tools/test/build_system/targets/dart_test.dart b/packages/flutter_tools/test/build_system/targets/dart_test.dart new file mode 100644 index 00000000000..0d742efb3fe --- /dev/null +++ b/packages/flutter_tools/test/build_system/targets/dart_test.dart @@ -0,0 +1,224 @@ +// Copyright 2019 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 'package:flutter_tools/src/base/build.dart'; +import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/build_info.dart'; +import 'package:flutter_tools/src/build_system/build_system.dart'; +import 'package:flutter_tools/src/build_system/exceptions.dart'; +import 'package:flutter_tools/src/build_system/targets/dart.dart'; +import 'package:flutter_tools/src/cache.dart'; +import 'package:flutter_tools/src/compile.dart'; +import 'package:flutter_tools/src/project.dart'; +import 'package:mockito/mockito.dart'; +import 'package:process/process.dart'; + +import '../../src/common.dart'; +import '../../src/mocks.dart'; +import '../../src/testbed.dart'; + +void main() { + group('dart rules', () { + Testbed testbed; + BuildSystem buildSystem; + Environment androidEnvironment; + Environment iosEnvironment; + MockProcessManager mockProcessManager; + + setUpAll(() { + Cache.disableLocking(); + }); + + setUp(() { + mockProcessManager = MockProcessManager(); + testbed = Testbed(setup: () { + androidEnvironment = Environment( + projectDir: fs.currentDirectory, + defines: { + kBuildMode: getNameForBuildMode(BuildMode.profile), + kTargetPlatform: getNameForTargetPlatform(TargetPlatform.android_arm), + } + ); + iosEnvironment = Environment( + projectDir: fs.currentDirectory, + defines: { + kBuildMode: getNameForBuildMode(BuildMode.profile), + kTargetPlatform: getNameForTargetPlatform(TargetPlatform.ios), + } + ); + buildSystem = BuildSystem(); + HostPlatform hostPlatform; + if (platform.isWindows) { + hostPlatform = HostPlatform.windows_x64; + } else if (platform.isLinux) { + hostPlatform = HostPlatform.linux_x64; + } else if (platform.isMacOS) { + hostPlatform = HostPlatform.darwin_x64; + } else { + assert(false); + } + final String skyEngineLine = platform.isWindows + ? r'sky_engine:file:///C:/bin/cache/pkg/sky_engine/lib/' + : 'sky_engine:file:///bin/cache/pkg/sky_engine/lib/'; + fs.file('.packages') + ..createSync() + ..writeAsStringSync(''' +# Generated +$skyEngineLine +flutter_tools:lib/'''); + final String engineArtifacts = fs.path.join('bin', 'cache', + 'artifacts', 'engine'); + final List paths = [ + fs.path.join('bin', 'cache', 'pkg', 'sky_engine', 'lib', 'ui', + 'ui.dart'), + fs.path.join('bin', 'cache', 'pkg', 'sky_engine', 'sdk_ext', + 'vmservice_io.dart'), + fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'dart'), + fs.path.join(engineArtifacts, getNameForHostPlatform(hostPlatform), + 'frontend_server.dart.snapshot'), + fs.path.join(engineArtifacts, 'android-arm-profile', + getNameForHostPlatform(hostPlatform), 'gen_snapshot'), + fs.path.join(engineArtifacts, 'ios-profile', 'gen_snapshot'), + fs.path.join(engineArtifacts, 'common', 'flutter_patched_sdk', + 'platform_strong.dill'), + fs.path.join('lib', 'foo.dart'), + fs.path.join('lib', 'bar.dart'), + fs.path.join('lib', 'fizz'), + ]; + for (String path in paths) { + fs.file(path).createSync(recursive: true); + } + }, overrides: { + KernelCompilerFactory: () => FakeKernelCompilerFactory(), + GenSnapshot: () => FakeGenSnapshot(), + }); + }); + + test('kernel_snapshot Produces correct output directory', () => testbed.run(() async { + await buildSystem.build('kernel_snapshot', androidEnvironment, const BuildSystemConfig()); + + expect(fs.file(fs.path.join(androidEnvironment.buildDir.path,'main.app.dill')).existsSync(), true); + })); + + test('kernel_snapshot throws error if missing build mode', () => testbed.run(() async { + final BuildResult result = await buildSystem.build('kernel_snapshot', + androidEnvironment..defines.remove(kBuildMode), const BuildSystemConfig()); + + expect(result.exceptions.values.single.exception, isInstanceOf()); + })); + + test('aot_elf_profile Produces correct output directory', () => testbed.run(() async { + await buildSystem.build('aot_elf_profile', androidEnvironment, const BuildSystemConfig()); + + expect(fs.file(fs.path.join(androidEnvironment.buildDir.path, 'main.app.dill')).existsSync(), true); + expect(fs.file(fs.path.join(androidEnvironment.buildDir.path, 'app.so')).existsSync(), true); + })); + + test('aot_elf_profile throws error if missing build mode', () => testbed.run(() async { + final BuildResult result = await buildSystem.build('aot_elf_profile', + androidEnvironment..defines.remove(kBuildMode), const BuildSystemConfig()); + + expect(result.exceptions.values.single.exception, isInstanceOf()); + })); + + + test('aot_elf_profile throws error if missing target platform', () => testbed.run(() async { + final BuildResult result = await buildSystem.build('aot_elf_profile', + androidEnvironment..defines.remove(kTargetPlatform), const BuildSystemConfig()); + + expect(result.exceptions.values.single.exception, isInstanceOf()); + })); + + + test('aot_assembly_profile throws error if missing build mode', () => testbed.run(() async { + final BuildResult result = await buildSystem.build('aot_assembly_profile', + iosEnvironment..defines.remove(kBuildMode), const BuildSystemConfig()); + + expect(result.exceptions.values.single.exception, isInstanceOf()); + })); + + test('aot_assembly_profile throws error if missing target platform', () => testbed.run(() async { + final BuildResult result = await buildSystem.build('aot_assembly_profile', + iosEnvironment..defines.remove(kTargetPlatform), const BuildSystemConfig()); + + expect(result.exceptions.values.single.exception, isInstanceOf()); + })); + + test('aot_assembly_profile throws error if built for non-iOS platform', () => testbed.run(() async { + final BuildResult result = await buildSystem.build('aot_assembly_profile', + androidEnvironment, const BuildSystemConfig()); + + expect(result.exceptions.values.single.exception, isInstanceOf()); + })); + + test('aot_assembly_profile will lipo binaries together when multiple archs are requested', () => testbed.run(() async { + iosEnvironment.defines[kIosArchs] ='armv7,arm64'; + when(mockProcessManager.run(any)).thenAnswer((Invocation invocation) async { + fs.file(fs.path.join(iosEnvironment.buildDir.path, 'App.framework', 'App')) + .createSync(recursive: true); + return FakeProcessResult( + stdout: '', + stderr: '', + ); + }); + final BuildResult result = await buildSystem.build('aot_assembly_profile', + iosEnvironment, const BuildSystemConfig()); + + expect(result.success, true); + }, overrides: { + ProcessManager: () => mockProcessManager, + })); + }); +} + +class MockProcessManager extends Mock implements ProcessManager {} + +class FakeGenSnapshot implements GenSnapshot { + @override + Future run({SnapshotType snapshotType, IOSArch iosArch, Iterable additionalArgs = const []}) async { + final Directory out = fs.file(additionalArgs.last).parent; + if (iosArch == null) { + out.childFile('app.so').createSync(); + out.childFile('gen_snapshot.d').createSync(); + return 0; + } + out.childDirectory('App.framework').childFile('App').createSync(recursive: true); + out.childFile('snapshot_assembly.S').createSync(); + out.childFile('snapshot_assembly.o').createSync(); + return 0; + } +} + +class FakeKernelCompilerFactory implements KernelCompilerFactory { + FakeKernelCompiler kernelCompiler = FakeKernelCompiler(); + + @override + Future create(FlutterProject flutterProject) async { + return kernelCompiler; + } +} + +class FakeKernelCompiler implements KernelCompiler { + @override + Future compile({ + String sdkRoot, + String mainPath, + String outputFilePath, + String depFilePath, + TargetModel targetModel = TargetModel.flutter, + bool linkPlatformKernelIn = false, + bool aot = false, + bool trackWidgetCreation, + List extraFrontEndOptions, + String incrementalCompilerByteStorePath, + String packagesPath, + List fileSystemRoots, + String fileSystemScheme, + bool targetProductVm = false, + String initializeFromDill}) async { + fs.file(outputFilePath).createSync(recursive: true); + return CompilerOutput(outputFilePath, 0, null); + } +} diff --git a/packages/flutter_tools/test/build_system/targets/linux_test.dart b/packages/flutter_tools/test/build_system/targets/linux_test.dart new file mode 100644 index 00000000000..4b22c9aee76 --- /dev/null +++ b/packages/flutter_tools/test/build_system/targets/linux_test.dart @@ -0,0 +1,84 @@ +// Copyright 2019 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 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/build_system/build_system.dart'; +import 'package:flutter_tools/src/build_system/targets/linux.dart'; +import 'package:flutter_tools/src/cache.dart'; +import 'package:mockito/mockito.dart'; + +import '../../src/common.dart'; +import '../../src/testbed.dart'; + +void main() { + group('unpack_linux', () { + Testbed testbed; + BuildSystem buildSystem; + Environment environment; + MockPlatform mockPlatform; + + setUpAll(() { + Cache.disableLocking(); + }); + + setUp(() { + mockPlatform = MockPlatform(); + when(mockPlatform.isWindows).thenReturn(false); + when(mockPlatform.isMacOS).thenReturn(false); + when(mockPlatform.isLinux).thenReturn(true); + testbed = Testbed(setup: () { + Cache.flutterRoot = ''; + environment = Environment( + projectDir: fs.currentDirectory, + ); + buildSystem = BuildSystem({ + unpackLinux.name: unpackLinux, + }); + fs.file('bin/cache/artifacts/engine/linux-x64/libflutter_linux.so').createSync(recursive: true); + fs.file('bin/cache/artifacts/engine/linux-x64/flutter_export.h').createSync(); + fs.file('bin/cache/artifacts/engine/linux-x64/flutter_messenger.h').createSync(); + fs.file('bin/cache/artifacts/engine/linux-x64/flutter_plugin_registrar.h').createSync(); + fs.file('bin/cache/artifacts/engine/linux-x64/flutter_glfw.h').createSync(); + fs.file('bin/cache/artifacts/engine/linux-x64/icudtl.dat').createSync(); + fs.file('bin/cache/artifacts/engine/linux-x64/cpp_client_wrapper/foo').createSync(recursive: true); + fs.directory('linux').createSync(); + }, overrides: { + Platform: () => mockPlatform, + }); + }); + + test('Copies files to correct cache directory', () => testbed.run(() async { + final BuildResult result = await buildSystem.build('unpack_linux', environment, const BuildSystemConfig()); + + expect(result.hasException, false); + expect(fs.file('linux/flutter/libflutter_linux.so').existsSync(), true); + expect(fs.file('linux/flutter/flutter_export.h').existsSync(), true); + expect(fs.file('linux/flutter/flutter_messenger.h').existsSync(), true); + expect(fs.file('linux/flutter/flutter_plugin_registrar.h').existsSync(), true); + expect(fs.file('linux/flutter/flutter_glfw.h').existsSync(), true); + expect(fs.file('linux/flutter/icudtl.dat').existsSync(), true); + expect(fs.file('linux/flutter/cpp_client_wrapper/foo').existsSync(), true); + })); + + test('Does not re-copy files unecessarily', () => testbed.run(() async { + await buildSystem.build('unpack_linux', environment, const BuildSystemConfig()); + final DateTime modified = fs.file('linux/flutter/libflutter_linux.so').statSync().modified; + await buildSystem.build('unpack_linux', environment, const BuildSystemConfig()); + + expect(fs.file('linux/flutter/libflutter_linux.so').statSync().modified, equals(modified)); + })); + + test('Detects changes in input cache files', () => testbed.run(() async { + await buildSystem.build('unpack_linux', environment, const BuildSystemConfig()); + fs.file('bin/cache/artifacts/engine/linux-x64/libflutter_linux.so').writeAsStringSync('asd'); // modify cache. + + await buildSystem.build('unpack_linux', environment, const BuildSystemConfig()); + + expect(fs.file('linux/flutter/libflutter_linux.so').readAsStringSync(), 'asd'); + })); + }); +} + +class MockPlatform extends Mock implements Platform {} diff --git a/packages/flutter_tools/test/build_system/targets/macos_test.dart b/packages/flutter_tools/test/build_system/targets/macos_test.dart new file mode 100644 index 00000000000..5deadb5342a --- /dev/null +++ b/packages/flutter_tools/test/build_system/targets/macos_test.dart @@ -0,0 +1,115 @@ +// Copyright 2019 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 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/io.dart'; +import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/base/process_manager.dart'; +import 'package:flutter_tools/src/build_system/build_system.dart'; +import 'package:flutter_tools/src/build_system/targets/macos.dart'; +import 'package:mockito/mockito.dart'; +import 'package:process/process.dart'; + +import '../../src/common.dart'; +import '../../src/testbed.dart'; + +void main() { + group('unpack_macos', () { + Testbed testbed; + BuildSystem buildSystem; + Environment environment; + MockPlatform mockPlatform; + + setUp(() { + mockPlatform = MockPlatform(); + when(mockPlatform.isWindows).thenReturn(false); + when(mockPlatform.isMacOS).thenReturn(true); + when(mockPlatform.isLinux).thenReturn(false); + testbed = Testbed(setup: () { + environment = Environment( + projectDir: fs.currentDirectory, + ); + buildSystem = BuildSystem({ + unpackMacos.name: unpackMacos, + }); + final List inputs = [ + fs.file('bin/cache/artifacts/engine/darwin-x64/FlutterMacOS.framework/FlutterMacOS'), + fs.file('bin/cache/artifacts/engine/darwin-x64/FlutterMacOS.framework/Headers/FLEOpenGLContextHandling.h'), + fs.file('bin/cache/artifacts/engine/darwin-x64/FlutterMacOS.framework/Headers/FLEReshapeListener.h'), + fs.file('bin/cache/artifacts/engine/darwin-x64/FlutterMacOS.framework/Headers/FLEView.h'), + fs.file('bin/cache/artifacts/engine/darwin-x64/FlutterMacOS.framework/Headers/FLEViewController.h'), + fs.file('bin/cache/artifacts/engine/darwin-x64/FlutterMacOS.framework/Headers/FlutterBinaryMessenger.h'), + fs.file('bin/cache/artifacts/engine/darwin-x64/FlutterMacOS.framework/Headers/FlutterChannels.h'), + fs.file('bin/cache/artifacts/engine/darwin-x64/FlutterMacOS.framework/Headers/FlutterCodecs.h'), + fs.file('bin/cache/artifacts/engine/darwin-x64/FlutterMacOS.framework/Headers/FlutterMacOS.h'), + fs.file('bin/cache/artifacts/engine/darwin-x64/FlutterMacOS.framework/Headers/FlutterPluginMacOS.h'), + fs.file('bin/cache/artifacts/engine/darwin-x64/FlutterMacOS.framework/Headers/FlutterPluginRegisrarMacOS.h'), + fs.file('bin/cache/artifacts/engine/darwin-x64/FlutterMacOS.framework/Modules/module.modulemap'), + fs.file('bin/cache/artifacts/engine/darwin-x64/FlutterMacOS.framework/Resources/icudtl.dat'), + fs.file('bin/cache/artifacts/engine/darwin-x64/FlutterMacOS.framework/Resources/info.plist'), + ]; + for (File input in inputs) { + input.createSync(recursive: true); + } + when(processManager.runSync(any)).thenAnswer((Invocation invocation) { + final List arguments = invocation.positionalArguments.first; + final Directory source = fs.directory(arguments[arguments.length - 2]); + final Directory target = fs.directory(arguments.last) + ..createSync(recursive: true); + for (FileSystemEntity entity in source.listSync(recursive: true)) { + if (entity is File) { + final String relative = fs.path.relative(entity.path, from: source.path); + final String destination = fs.path.join(target.path, relative); + if (!fs.file(destination).parent.existsSync()) { + fs.file(destination).parent.createSync(); + } + entity.copySync(destination); + } + } + return FakeProcessResult()..exitCode = 0; + }); + }, overrides: { + ProcessManager: () => MockProcessManager(), + Platform: () => mockPlatform, + }); + }); + + test('Copies files to correct cache directory', () => testbed.run(() async { + await buildSystem.build('unpack_macos', environment, const BuildSystemConfig()); + + expect(fs.directory('macos/Flutter/FlutterMacOS.framework').existsSync(), true); + expect(fs.file('macos/Flutter/FlutterMacOS.framework/FlutterMacOS').existsSync(), true); + expect(fs.file('macos/Flutter/FlutterMacOS.framework/Headers/FLEOpenGLContextHandling.h').existsSync(), true); + expect(fs.file('macos/Flutter/FlutterMacOS.framework/Headers/FLEReshapeListener.h').existsSync(), true); + expect(fs.file('macos/Flutter/FlutterMacOS.framework/Headers/FLEView.h').existsSync(), true); + expect(fs.file('macos/Flutter/FlutterMacOS.framework/Headers/FLEViewController.h').existsSync(), true); + expect(fs.file('macos/Flutter/FlutterMacOS.framework/Headers/FlutterBinaryMessenger.h').existsSync(), true); + expect(fs.file('macos/Flutter/FlutterMacOS.framework/Headers/FlutterChannels.h').existsSync(), true); + expect(fs.file('macos/Flutter/FlutterMacOS.framework/Headers/FlutterCodecs.h').existsSync(), true); + expect(fs.file('macos/Flutter/FlutterMacOS.framework/Headers/FlutterMacOS.h').existsSync(), true); + expect(fs.file('macos/Flutter/FlutterMacOS.framework/Headers/FlutterPluginMacOS.h').existsSync(), true); + expect(fs.file('macos/Flutter/FlutterMacOS.framework/Headers/FlutterPluginRegisrarMacOS.h').existsSync(), true); + expect(fs.file('macos/Flutter/FlutterMacOS.framework/Modules/module.modulemap').existsSync(), true); + expect(fs.file('macos/Flutter/FlutterMacOS.framework/Resources/icudtl.dat').existsSync(), true); + expect(fs.file('macos/Flutter/FlutterMacOS.framework/Resources/info.plist').existsSync(), true); + })); + }); +} + +class MockPlatform extends Mock implements Platform {} + +class MockProcessManager extends Mock implements ProcessManager {} +class FakeProcessResult implements ProcessResult { + @override + int exitCode; + + @override + int pid = 0; + + @override + String stderr = ''; + + @override + String stdout = ''; +} diff --git a/packages/flutter_tools/test/build_system/targets/windows_test.dart b/packages/flutter_tools/test/build_system/targets/windows_test.dart new file mode 100644 index 00000000000..f46896ad4ec --- /dev/null +++ b/packages/flutter_tools/test/build_system/targets/windows_test.dart @@ -0,0 +1,97 @@ +// Copyright 2019 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 'package:file/memory.dart'; +import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/build_system/build_system.dart'; +import 'package:flutter_tools/src/build_system/targets/windows.dart'; +import 'package:flutter_tools/src/cache.dart'; +import 'package:mockito/mockito.dart'; + +import '../../src/common.dart'; +import '../../src/testbed.dart'; + +void main() { + group('unpack_windows', () { + Testbed testbed; + BuildSystem buildSystem; + Environment environment; + Platform platform; + + setUpAll(() { + Cache.disableLocking(); + }); + + setUp(() { + Cache.flutterRoot = ''; + platform = MockPlatform(); + when(platform.isWindows).thenReturn(true); + when(platform.isMacOS).thenReturn(false); + when(platform.isLinux).thenReturn(false); + when(platform.pathSeparator).thenReturn(r'\'); + testbed = Testbed(setup: () { + environment = Environment( + projectDir: fs.currentDirectory, + ); + buildSystem = BuildSystem({ + unpackWindows.name: unpackWindows, + }); + fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_export.h').createSync(recursive: true); + fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_messenger.h').createSync(); + fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_windows.dll').createSync(); + fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_windows.dll.exp').createSync(); + fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_windows.dll.lib').createSync(); + fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_windows.dll.pdb').createSync(); + fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\lutter_export.h').createSync(); + fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_messenger.h').createSync(); + fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_plugin_registrar.h').createSync(); + fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_glfw.h').createSync(); + fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\icudtl.dat').createSync(); + fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\cpp_client_wrapper\foo').createSync(recursive: true); + fs.directory('windows').createSync(); + }, overrides: { + FileSystem: () => MemoryFileSystem(style: FileSystemStyle.windows), + Platform: () => platform, + }); + }); + + test('Copies files to correct cache directory', () => testbed.run(() async { + await buildSystem.build('unpack_windows', environment, const BuildSystemConfig()); + + expect(fs.file(r'C:\windows\flutter\flutter_export.h').existsSync(), true); + expect(fs.file(r'C:\windows\flutter\flutter_messenger.h').existsSync(), true); + expect(fs.file(r'C:\windows\flutter\flutter_windows.dll').existsSync(), true); + expect(fs.file(r'C:\windows\flutter\flutter_windows.dll.exp').existsSync(), true); + expect(fs.file(r'C:\windows\flutter\flutter_windows.dll.lib').existsSync(), true); + expect(fs.file(r'C:\windows\flutter\flutter_windows.dll.pdb').existsSync(), true); + expect(fs.file(r'C:\windows\flutter\flutter_export.h').existsSync(), true); + expect(fs.file(r'C:\windows\flutter\flutter_messenger.h').existsSync(), true); + expect(fs.file(r'C:\windows\flutter\flutter_plugin_registrar.h').existsSync(), true); + expect(fs.file(r'C:\windows\flutter\flutter_glfw.h').existsSync(), true); + expect(fs.file(r'C:\windows\flutter\icudtl.dat').existsSync(), true); + expect(fs.file(r'C:\windows\flutter\cpp_client_wrapper\foo').existsSync(), true); + })); + + test('Does not re-copy files unecessarily', () => testbed.run(() async { + await buildSystem.build('unpack_windows', environment, const BuildSystemConfig()); + final DateTime modified = fs.file(r'C:\windows\flutter\flutter_export.h').statSync().modified; + await buildSystem.build('unpack_windows', environment, const BuildSystemConfig()); + + expect(fs.file(r'C:\windows\flutter\flutter_export.h').statSync().modified, equals(modified)); + })); + + test('Detects changes in input cache files', () => testbed.run(() async { + await buildSystem.build('unpack_windows', environment, const BuildSystemConfig()); + final DateTime modified = fs.file(r'C:\windows\flutter\flutter_export.h').statSync().modified; + fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_export.h').writeAsStringSync('asd'); // modify cache. + + await buildSystem.build('unpack_windows', environment, const BuildSystemConfig()); + + expect(fs.file(r'C:\windows\flutter\flutter_export.h').statSync().modified, isNot(modified)); + })); + }); +} + +class MockPlatform extends Mock implements Platform {} diff --git a/packages/flutter_tools/test/commands/assemble_test.dart b/packages/flutter_tools/test/commands/assemble_test.dart new file mode 100644 index 00000000000..366eda77805 --- /dev/null +++ b/packages/flutter_tools/test/commands/assemble_test.dart @@ -0,0 +1,84 @@ +// Copyright 2019 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 'package:args/command_runner.dart'; +import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/logger.dart'; +import 'package:flutter_tools/src/build_info.dart'; +import 'package:flutter_tools/src/build_system/build_system.dart'; +import 'package:flutter_tools/src/cache.dart'; +import 'package:flutter_tools/src/commands/assemble.dart'; +import 'package:flutter_tools/src/globals.dart'; +import 'package:mockito/mockito.dart'; + +import '../src/common.dart'; +import '../src/testbed.dart'; + +void main() { + group('Assemble', () { + Testbed testbed; + MockBuildSystem mockBuildSystem; + + setUpAll(() { + Cache.disableLocking(); + }); + + setUp(() { + mockBuildSystem = MockBuildSystem(); + testbed = Testbed(overrides: { + BuildSystem: () => mockBuildSystem, + }); + }); + + test('Can list the output directory relative to project root', () => testbed.run(() async { + final CommandRunner commandRunner = createTestCommandRunner(AssembleCommand()); + await commandRunner.run(['assemble', '--flutter-root=.', 'build-dir', '-dBuildMode=debug']); + final BufferLogger bufferLogger = logger; + final Environment environment = Environment( + defines: { + 'BuildMode': 'debug' + }, projectDir: fs.currentDirectory, + buildDir: fs.directory(getBuildDirectory()), + ); + + expect(bufferLogger.statusText.trim(), + fs.path.relative(environment.buildDir.path, from: fs.currentDirectory.path)); + })); + + test('Can describe a target', () => testbed.run(() async { + when(mockBuildSystem.describe('foobar', any)).thenReturn(>[ + {'fizz': 'bar'}, + ]); + final CommandRunner commandRunner = createTestCommandRunner(AssembleCommand()); + await commandRunner.run(['assemble', '--flutter-root=.', 'describe', 'foobar']); + final BufferLogger bufferLogger = logger; + + expect(bufferLogger.statusText.trim(), '[{"fizz":"bar"}]'); + })); + + test('Can describe a target\'s inputs', () => testbed.run(() async { + when(mockBuildSystem.describe('foobar', any)).thenReturn(>[ + {'name': 'foobar', 'inputs': ['bar', 'baz']}, + ]); + final CommandRunner commandRunner = createTestCommandRunner(AssembleCommand()); + await commandRunner.run(['assemble', '--flutter-root=.', 'inputs', 'foobar']); + final BufferLogger bufferLogger = logger; + + expect(bufferLogger.statusText.trim(), 'bar\nbaz'); + })); + + test('Can run a build', () => testbed.run(() async { + when(mockBuildSystem.build('foobar', any, any)).thenAnswer((Invocation invocation) async { + return BuildResult(true, const {}, const {}); + }); + final CommandRunner commandRunner = createTestCommandRunner(AssembleCommand()); + await commandRunner.run(['assemble', 'run', 'foobar']); + final BufferLogger bufferLogger = logger; + + expect(bufferLogger.statusText.trim(), 'build succeeded'); + })); + }); +} + +class MockBuildSystem extends Mock implements BuildSystem {} diff --git a/packages/flutter_tools/test/src/testbed.dart b/packages/flutter_tools/test/src/testbed.dart index ee01dbf78d4..3714684bf23 100644 --- a/packages/flutter_tools/test/src/testbed.dart +++ b/packages/flutter_tools/test/src/testbed.dart @@ -76,7 +76,7 @@ class Testbed { : _setup = setup, _overrides = overrides; - final Future Function() _setup; + final FutureOr Function() _setup; final Map _overrides; /// Runs `test` within a tool zone. From 028b4e52732c91d77191e9b603cb6573529beeff Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Thu, 11 Jul 2019 19:55:27 -0400 Subject: [PATCH 33/41] Roll engine 3b944102a56e..bcde838d778e (6 commits) (#36020) https://github.com/flutter/engine/compare/3b944102a56e...bcde838d778e git log 3b944102a56e8f4182e6601113fc36538edf3de9..bcde838d778eecd39282cfb84ebba1d484bb7515 --no-merges --oneline bcde838d7 Roll Wuffs and buildroot (flutter/engine#9791) 3b75979d3 fix ColorFilter.matrix constness (flutter/engine#9789) 3c9a22c77 Fall back to a fully qualified path to libapp.so if the library can not be loaded by name (flutter/engine#9762) 298a610c7 Roll fuchsia/sdk/core/mac-amd64 from XOXaWqvr4OuJ6O3uPefSwSFjZMaEmDHy5JQm3Q8Oc0wC to CDbRdGJ3bu-aWMCZqN5VzfQqIBwDGL2wfFodWABKdCIC (flutter/engine#9790) 833f6b4fc Roll src/third_party/skia f9fcf7ffa89a..7825d4983f90 (6 commits) (flutter/engine#9788) 1250c3773 Add comments to differentiate two cache paths (flutter/engine#9721) The AutoRoll server is located here: https://autoroll.skia.org/r/flutter-engine-flutter-autoroll Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+/master/autoroll/README.md If the roll is causing failures, please contact the current sheriff (garyq@google.com), and stop the roller if necessary. --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 4cc7c1660df..86a6ad05863 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -3b944102a56e8f4182e6601113fc36538edf3de9 +bcde838d778eecd39282cfb84ebba1d484bb7515 From aa2de3eb4eea757cf3eda822bdd07324bbe60068 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Thu, 11 Jul 2019 21:21:27 -0400 Subject: [PATCH 34/41] Roll engine bcde838d778e..55a2b81e40bf (3 commits) (#36029) https://github.com/flutter/engine/compare/bcde838d778e...55a2b81e40bf git log bcde838d778eecd39282cfb84ebba1d484bb7515..55a2b81e40bf91f73a8265b54b73a2d62197d024 --no-merges --oneline 55a2b81e4 Roll src/third_party/skia 7825d4983f90..c3f28e3cf0d4 (9 commits) (flutter/engine#9794) 84fd7eb06 Fix typo in PlaceholderAlignment docs (flutter/engine#9793) 4b11df89d Update flutter_web to latest (flutter/engine#9792) The AutoRoll server is located here: https://autoroll.skia.org/r/flutter-engine-flutter-autoroll Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+/master/autoroll/README.md If the roll is causing failures, please contact the current sheriff (garyq@google.com), and stop the roller if necessary. --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 86a6ad05863..78b0b21d163 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -bcde838d778eecd39282cfb84ebba1d484bb7515 +55a2b81e40bf91f73a8265b54b73a2d62197d024 From ab0f54e7bc98e84c3da4d7f8402b4f7012b25dd7 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Thu, 11 Jul 2019 23:01:27 -0400 Subject: [PATCH 35/41] d1dcd1848 Remove breaking asserts (flutter/engine#9797) (#36033) https://github.com/flutter/engine/compare/55a2b81e40bf...d1dcd1848633 git log 55a2b81e40bf91f73a8265b54b73a2d62197d024..d1dcd1848633c5764e23313823445cbcba451a59 --no-merges --oneline d1dcd1848 Remove breaking asserts (flutter/engine#9797) The AutoRoll server is located here: https://autoroll.skia.org/r/flutter-engine-flutter-autoroll Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+/master/autoroll/README.md If the roll is causing failures, please contact the current sheriff (garyq@google.com), and stop the roller if necessary. --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 78b0b21d163..fe51880e83e 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -55a2b81e40bf91f73a8265b54b73a2d62197d024 +d1dcd1848633c5764e23313823445cbcba451a59 From 90326b6184d3ada2c5be61a9086578cacca8d9ad Mon Sep 17 00:00:00 2001 From: Anoop B <16367697+anoop-b@users.noreply.github.com> Date: Fri, 12 Jul 2019 09:46:48 +0530 Subject: [PATCH 36/41] [ImgBot] Optimize images (#35971) --- .../Icon-App-1024x1024@1x.png | Bin 11112 -> 10932 bytes dev/devicelab/images/agent-statuses.png | Bin 18399 -> 13842 bytes dev/devicelab/images/broken-test.png | Bin 69897 -> 56878 bytes dev/devicelab/images/legend.png | Bin 48845 -> 30220 bytes .../Icon-App-1024x1024@1x.png | Bin 11112 -> 10932 bytes .../Icon-App-1024x1024@1x.png | Bin 11112 -> 10932 bytes .../Icon-App-1024x1024@1x.png | Bin 11112 -> 10932 bytes dev/snippets/assets/code_sample.png | Bin 58572 -> 39037 bytes dev/snippets/assets/code_snippet.png | Bin 202228 -> 113476 bytes .../main/res/mipmap-hdpi/ic_background.png | Bin 18209 -> 2583 bytes .../main/res/mipmap-hdpi/ic_foreground.png | Bin 3581 -> 2063 bytes .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 3951 -> 3116 bytes .../main/res/mipmap-xhdpi/ic_background.png | Bin 31807 -> 3231 bytes .../main/res/mipmap-xhdpi/ic_foreground.png | Bin 5455 -> 2721 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 5326 -> 3980 bytes .../main/res/mipmap-xxhdpi/ic_background.png | Bin 72301 -> 4963 bytes .../main/res/mipmap-xxhdpi/ic_foreground.png | Bin 10303 -> 4613 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 9650 -> 7167 bytes .../main/res/mipmap-xxxhdpi/ic_background.png | Bin 125855 -> 6802 bytes .../main/res/mipmap-xxxhdpi/ic_foreground.png | Bin 16499 -> 6155 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 13901 -> 9897 bytes .../AppIcon.appiconset/Icon-120.png | Bin 1787 -> 1750 bytes .../AppIcon.appiconset/Icon-152.png | Bin 2162 -> 2003 bytes .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 3481 -> 3041 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2121 -> 1958 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 5061 -> 4372 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 8878 -> 7152 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 13629 -> 10393 bytes .../AppIcon.appiconset/Icon-60@2x.png | Bin 7210 -> 5633 bytes .../AppIcon.appiconset/Icon-60@3x.png | Bin 12818 -> 9562 bytes .../AppIcon.appiconset/Icon-76.png | Bin 3804 -> 3115 bytes .../AppIcon.appiconset/Icon-76@2x.png | Bin 10082 -> 7587 bytes .../AppIcon.appiconset/Icon-83.5@2x.png | Bin 11552 -> 8627 bytes .../Icon-Notification@2x.png | Bin 1529 -> 1404 bytes .../Icon-Notification@3x.png | Bin 2663 -> 2297 bytes .../AppIcon.appiconset/Icon-Small-40.png | Bin 1529 -> 1404 bytes .../AppIcon.appiconset/Icon-Small-40@2x.png | Bin 4058 -> 3282 bytes .../AppIcon.appiconset/Icon-Small-40@3x.png | Bin 7210 -> 5633 bytes .../AppIcon.appiconset/Icon-Small@2x.png | Bin 2518 -> 2164 bytes .../AppIcon.appiconset/Icon-Small@3x.png | Bin 4520 -> 3725 bytes .../Icon-App-1024x1024@1x.png | Bin 11112 -> 10932 bytes .../Icon-App-1024x1024@1x.png | Bin 11112 -> 10932 bytes 42 files changed, 0 insertions(+), 0 deletions(-) diff --git a/dev/benchmarks/macrobenchmarks/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/dev/benchmarks/macrobenchmarks/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png index 3d43d11e66f4de3da27ed045ca4fe38ad8b48094..b6a5d3f48e4e0fec02ff52437b182c553efd1c00 100644 GIT binary patch literal 10932 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 P-1+_A+?hGkL;m(J7kc&K diff --git a/dev/devicelab/images/agent-statuses.png b/dev/devicelab/images/agent-statuses.png index d0b3dc5fb329a7ccf6c3fb7809f0046c5bf11d1a..ad5eba6a2bc80acf33e029ce0526a71dd72a39c1 100644 GIT binary patch delta 10814 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 JmC2X||1bB?fUf`m delta 15407 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�NLTb!X^_@a`5Z!XwlIAv>~lHX-l!d_2K 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 }YItuJ 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 diff --git a/dev/devicelab/images/legend.png b/dev/devicelab/images/legend.png index c9bd9a05952c77c95a0920726efd53ed96be1d84..cb94696556d7ec468c610f1fa876662dfd6d6040 100644 GIT binary patch delta 27322 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�NYjAer}~eBX|a$Vd8)ua-Dp$+>tv(; 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%0Ap$;UuX`AydL-OSd()WdF4GwfI za0duv^8in2n=yiK*@F$ncSqmD{L78PP735_xuJ<|B--N~4*}PrdEMHCo^LKy71uXW zLvN(FGLSrZ_?>ql^)JQm^gk89!su!|aW2bp1hwWeeK76MRrs6xp?Z(k7igA=cVUn+ zHsBJkJ@ZbKr7xIJl)UX(XS>vqp|WlY5=T|o{IxmlH*O!CiB4mnSZc2cRosB06N+I; z{U6j_AmBpy6|M zN;pi^!Ru)T;y|c0A~V;93(h=yd<0%(!I{fz-1g_gab(JYe&hU=Gt8pHp)QXWPj-#= zOdD2oPw7Y@*)>TNY!>r@FOvN41tZlCa0qE|u;~Qf6bIFB%fr|N(SR~q+d9fVAWaSm z5}1Q=^f0jXuZWZAKtc~u!Nw_}anOES>8Q7!tvfS7);W5GaQ}Mxy83MCMR_3JgrFhR zf!^xHzfvYouY7WVc>ABGPY~>1g04}WJ_G}A(c4{@$#%kbFS>8kgU&-<0$5;ZX^9rC zHyoU0FcSl5<;w+24cAG?NYts`3$OIBDLjsQJsF_VHxLoAvCRbZO%pJs1ECedQJ@_7U1u{Yz0vZL1XcA#$ojou09tCd9n)KXw&M7WP?VQgVia7o;{1p;yT`@lVwrD5 zX^V^`)Cgs~)*fgXC`#}wb}>de#YW3qs_RX1691UMftCbA^(!0AJsK_P_4XoK1nd_! z{H0Ds@taK?4GQyz4IE1_gRmGhYE*LMW|}6h1L7G}Qbh76r9woU#}f*63Xxhb82s9A zWVCjuBe3iq9-E84U{E%7a&0=T`6l-aWba9jm%W-&rtD@Tzt+EGj^N%GN)O$9SR*4Z zd|VE{IiKfTeW1ceYnTf6Z~{QC@s1b4ivRA_6X`I*e@h+h1W5ot{RLF8!k zg;iJe-?e_+7L)jkpVSN5DsTDG%jD&SZ`?U!_8lJInW#E2^AdJtk!rKJP@L3|uSUB&e)oIBkto^wk;oS29i z8%qDN)iA4Af(l?6Ne!5N5nub5)gL)a(qOt`K8l@G(G?mR2o;|2cY#S}cu!fsq z;|VX@p95NSq=(ba2Wy8m`C%7E!+SgRC5LjZj{~H(5%XsJj$MX-pfbbC)oyP*;pASd z?iuNLKJei7S9J~TgMO+D@5MW&q#KM5*&C;q#L0&MEMYx&Rza^7+G1thfa|jdIu)SW=aD%Fa9U>RkT% zkG<52ncL#%E&C|~>^m|GwnRGENM4E%WpDQ^tL=qHA6GtICX*y6^l%r;=@T^sf%^Lq z6in3sl|}CbNQ3=xhEy633i`mtq>z%Xj*>_Kq-dbOvbWn@O>VB<$G?kuaE`S3@f|7~ z{o2vXb`TinC+c<~&KI?OAcxF!SCNMzfSD?>nDkDx4$GbT>(K4<*o;V+vc)BwCBjE! zLae#&*fsB32}5Z8+T}6BPJr{2^HTz^E!Fex-sTqwEx)+^#aFA|Mg7g7gfG7N=u1ak zG{oZM`#dU;KT8u^o7AV0-Ut|aWDkC&4qg#N=d&8jncNN4hL4Z78c5oE~g5byJ zC$VbGNwd|=d1KT3k0OrbJmMA?yv}&xSe z<#t(u=9VYE(9O}_0`>r0+9yC6W9WkGa}DlC45_m{hPfqSvL@Zesb8a_9g6IU%M#pM zJ0uO3lq$w!v8b1#h8-*x-D!W(J!QSAgo=Gn^-W63bPBg{0PSPEKGh0=ByP5{v9;IcxOr z0G}>1f&fb71^mR3!QSF6<=wx!mj4y!`A;pF|C?aMf7}N6ow@k`a@v1Tr-S(PMIE(D z#yJ%W`C?OUNcuzYeoS{9B-I>@^c|iF7}`ApA0V9U9Q-WoJS?1?PdNAl?(+z6-)CZH z7hq=xW_ap|{;`LpwUL>z>wn&(*c?&}?f}0y1b8zi0YhsWS35HkQwNCnAJ3@8Y;3^$ zJ;_)ZvNBVHhvs8@ge?Z{bMudVjGoyW+L_rnm|2rrK_txVZ7lR%Z{Cin1Gj<5NGeE_ IAoP6x3zA_;KmY&$ delta 46093 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 I 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 diff --git a/dev/integration_tests/codegen/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/dev/integration_tests/codegen/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png index 3d43d11e66f4de3da27ed045ca4fe38ad8b48094..b6a5d3f48e4e0fec02ff52437b182c553efd1c00 100644 GIT binary patch literal 10932 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 P-1+_A+?hGkL;m(J7kc&K diff --git a/dev/integration_tests/ios_add2app/ios_add2app/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/dev/integration_tests/ios_add2app/ios_add2app/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png index 3d43d11e66f4de3da27ed045ca4fe38ad8b48094..b6a5d3f48e4e0fec02ff52437b182c553efd1c00 100644 GIT binary patch literal 10932 zcmeHN2~<R zh`|8`A_N>jnSu(UMFx?8j8PC!!VDphaL#`F42fd#7Vlc`zIE4n%Y~eiz4y1j|NDpi z?<@|nSJ-HM`qifhf@m%MamgwK83`XpBA<+azdF#2QsT{X@z0A9BsoHJVErigKH1~P zRX-!ho@ofe4MPw){D}J+K>~~rq}d%o%+4Xmgze|kRxX4C>Km5XEI|PAFFNzuNd%dm zzjVoB`=H9!8Yl0Kvc-9w0G$6dx!kMW*Eju^=3f?0o-t$U)GHRB-_ptGc%r}RxlL{U z594Nx3LA0oOp3q$3;sZ^!++3&bGZ!o-*6w?;oOhf z=A+Qb$scV5!RbG+&2S}BQ6YH!FKb0``VVX~T$dzyeSa3=9=_98)_7Z{SspqgJ$MRU z7xBn&41zpQ)%5dr4e`tmh%S+$3-JLRk&DLFC>t)q21$H5$O+fat1-`o21z628fpkq z%4%l9b!-re!W?9SX#5_6SYrFgL8%ToSju{TFz-VEme}QC0T5fO(BEZ111RaK=Dg2f z5CAIHecf9c*?Z1bUB4>>q^w7hD!A0r-@Nu_!`#dr(LXj|=UESd?^DGgGQV zidf2`ZT@pzXf7}!NH4q(0IMcxsUGDih(0{kRSez&z?CFA0RVXsVFw3^u=^KMtt95q z43q$b*6#uQDLoiCAF_{RFc{!H^moH_cmll#Fc^KXi{9GDl{>%+3qyfOE5;Zq|6#Hb zp^#1G+z^AXfRKaa9HK;%b3Ux~U@q?xg<2DXP%6k!3E)PA<#4$ui8eDy5|9hA5&{?v z(-;*1%(1~-NTQ`Is1_MGdQ{+i*ccd96ab$R$T3=% zw_KuOF@vI!A>>Y_2pl9L{9h1-C6H8<)J4gKI6{WzGBi<@u3P6hNsXG=bRq5c+z;Gc3VUCe;LIIFDmQAGy+=mRyF++u=drBWV8-^>0zcWx+)(|LcH)C(o z+}(GY=-?=3)7W4_?Q{Q0u{Y{(cO23&btXGIBDO`WmK40*!ocNIY9`h75Z-$KsZ2!zFrOk|!6UjMqS5(xo``OXh!SF(p`X|wQ4OBgWTy&c zrJlHsJ342pHlO?@Yo}THY9hUf4xw~h5E@UJo}6uNM=gyRReO?fvmWw#c89M$MLHl< zc9H6&Dm63IL}Uxdb`NU5NH#cJ?FZ@FL}tPIqF3ujhzxaj+_A!rT#alxAUj8`emyrM zooYSVTN6jtI#3&J`M%@$Dr%$TP}x7JscBm6e`)^WFdrFQ#R%1m}p5adKOe%!(b=~k4Pr3ST71A^!liwxZi zU8=2RhXm;muH-Vf_yc|f)q~9#D@Z4gD;Tz#b>k@SAwL`}Uq?atPjTHu?-U-y5kaQV zL0{LMUQJmabFkc=n%Hy6;Tb=Ugh%3^N)A%+TWkcA2|M(VZ+^_!1^q@^H|dbW&%`Qd z{8ZOD6nycipcvXt$GYz+#SqRR2OA3Bewyn9dg5=cpE+1jKwn%dA3>>D9OXKSGSiZi zhATIk7dulx^(Eh|EO(~1?D-}!h42E*^i|HDH0ISi_bI`m**kn_E3c)+FMo8lwpJc> zHWEf3Y?mz)(k?751$kMwJA2pd;9TDRJ=u=`COUl{llx&=TCfX-IhmNaeumUf4VE4? zq=(Nxy9TR*RRtEOagwx{)xZQ+8iwt=%NT! z@jrD-Zp+7gV5xLREK3$8;JVl8X(zU<=7WtAu{s;}{YJ>-yD4kHp>m-X*;xG;n20#jAXL_Zi8pcBvR6QHv+W+nZ>!3d5riYyP3FV_ub$Cjt zA*xRKlm(s+udE4?*#dDpGB`H z;v)2P)S~gW-}}c?*C--}LqF~QWNb8E@paLNIO>)|#V=Ay$1XxDNL@Q^) z_LSsYc^*^~9+}a2GIX0eachMtQg;?&3elpgrucCEP05s^_JCfpr2Pnweah3Y>7io5 z67!%O$p+6!SHoZ;rVuwiatg7Sm;&>V4X$Jg)~5eOtF!_&kz z1jb1s9!Lw8Zc@R)u%L|jFNGs+CzP>7vrQRGbf%=Sus4dvNn@c0&K;Hgmdg>$bJ2)z zX%_KWorRjs%xHe&=SXmheMCNUYqg^KVQ|5HQS?8`fF$9xrvdi5QXX|IsJ#e3r8#2k zz)0lzHJzwOXILd`kuqh8R?LW7F zto6|*7P`B?qTJb(TJlmJksxpP=6d=d)CVbYP-r4$hD(H~TG)0xL?8CLh&OVTkMk-T zYf%$taM2kgpbJnS{+6Xkn>iX@TuqQ?&cN6UjC9YF&%q{Ut3zv{UGe4M>-69@p)*(? zjXQZ$8^nfSen%a_j*T$pNowo{xiGEk$%Ck1aQhHUKjJH96XbLPXv+jk%ard#fu=@Q z$Ae`aWvE^{%tDfK>8GjkdLD zJE|jfdrmVbkfS>rN*+`#l%ZUi5_bMS<>-~WDNlpjSc3gQv9KOcK7kcp@|d?yaTmB^ zp5c!0;B$vxS|SszusMMj6at-EMMVAie!Jx@!qYTk4F?d_gm71T(<{~2|~P{jfGpsD)~-x0)E$>*ZI~~A9P&w>UQl#UV;;z84N0lGr|1L zSi9ujWZJT6tAQj&F1RgW=?As3v}+V|9>#&uNemd+Fz9$vG#Ptk>uT06bO8x@A;%l< zs1=QYC1|k&tv5E^`673|y8<1D=Kr$^2dBrL?(?NwQSo7n4S(Rni< zAH5;N4F}v$&{9>Efo*PB>T$&r1*^*`OTx4|ikV{d?B6HY;F25k{`OcZZ(us-RVwDx zUzJrCTBD$uz1ZFiSZ*$yX3c`ghG5WdBE$2g%&V7_F4c<#8j)TF_jFlKGTcdj@|Z>a z&kp09GVs!Zxsh^jG)}C)*I3ZD8$|Um`{D)nU=LKaEvnyx_J5%i-6Va?@*>=3(dQy` zOv%$_9l2B|+(t>qohkuU4r_P=R^6L#w%ZAlgKJTXc>KY|z0I<0!!XKF%RN#tUh0?7 zo&mDd(BFBOR&YFsKR7D3LD+X>+T1Br0a|9Osmff5CbBflb<2D8g-JfK* z&ZCu}gHBWT%@VZXv4*#$GWVcz4NS zUW`Eg+eXYmHkD1U{gn^+a}pPJ=0!^MIpSWCc{@wHRxyXEuuB9^>U&o{c{uJSWzxA? zIl8{#kiso|tAS zJ+q(EKiggeBE{==4|GRL3f6|STvOzrWuQXbl?gVyz6IGi_Fpz@ z*l9Y$SgA(5Gbj>Rgj|%pvYjZuATa9jajTL0f%JVr3$DIV=`lSHl=Iv;EjuGkBaI zeVE~2*A(04mm4xso+$46l@+Wh53?O{n~J^pIdZh0=Wv#F_x4jPQ5@=o*VJ2BgG|si z>ZrLz|6Kp12$kN)Z{fh5FRMn&7IYZ)PLhAQLHrCXG7h^`+LPWMU>I6Sd2b?2^&VUP z1Qhl1xY>ONWd8z^+p~G>JuTN9fcYtG_D&GH{Miv-sxTN`l%t(YbEz9F9xXKr=0Ku& zm6>b>n01zeRy%Y~EuQb9JgAJ~W;b@xFt>s)z?wvy+^9@5E zPXC!M_uSEUI`4}G7JcbX1;k{xzHz}qEwrfopdbEQjt{#bhkMSj9=f^owdGH z1I@eMYi%}qUg35bU1C}UczWu<%`!vIvL@`T@YT%Ta#XB=nln3Qo1q)s3`4aC?zx;F zSt-HW9An~W8hSVJo4;sq4wS41J6?MtJI-e@WmAidnb;xYu)>HrR)@pq(<#!Dfae!s zo|#R!(@U{z4EoffZ08Fd?K2!>`(9mai{BHgHJZk@&1dKaA{&>Wud{h8dSxpHj#i=1 z9QwPn9-zAvth)s)-=^0QQ}V4{H63R!0XCZ{wArJ->!S(c9fIO(SaI(R>#?;jn+OE8v|d4$70@itAv-IDZQ-52WupGq1TysYHl%a`h9KG&d=cJK>fv1Ebo5xhS-Ar zvt%Z8nVnxOXUe&LV`4lk(^J6_*J9gOQ;RbUzS3MDGQBin|MkX%O_c51=S#({;Lfue zto3N{=Udk39IJo%Jg#`YLDzw=mHDlG7hfhk+*Sc)W8m{%1f*xdszr^)0IQ^Lx` zpIbjMN0%Ag)Uz__E1C|xwqPM!KuGN;$Mzeg>UAA3{hMfE&oWtca8X2>Htg?=zSeg~ zrA+HbR%P-187KQ3CoTtVtc30fsd#cilcH%wm^{ODAAPnw=PYY^Rd zP`vw`VY?Q0tcN1-#x5B%efC82agDZewt(Dk;yv|q&R8nG{7pY^mgW>M9d7^0^__{^ zTTG}JL2ObO)11MSQ%rocU*d3cbi?1F^Zw(2mB<)!gwV3p?*61$o9U zD4_y&MiN8&3NFdJU-D~E*LB)QmitYz!z6Ap58^9g%T1=)In69Vc;kkIC4raRs?*d>YhqC7fH-(4sb`kP%CSX>jK1)FKaE{W0W3YK}+mApyv zpSCez4#NZ<8|p~*7v9{=QgD9~0qQ>u_P% zuinytH*uo%Uk=n?^8x($kWN_c+$s50H3Il80BpV8H=AS!3i|{7SpMQQtxKFU=FYmH zeY^jJh+g<4`m8v!^O>-NFLn~-RqlNxnZl2wd2A{Yc1G=Fa$d+Q&(N&rnPf+b7ser4x_TgJjitU_f4Z z;4Ro~ut27d?!YiD+QP@)T=77cR9~MK@bd~pY%X(h%L=(1M_DvEN~_~+xmZkm8A0Ga zQSWONI17_su5wpHg3sI?i9D+_Y|pCqVuHJNdHUauTD=R$Jb&2K_liQisqG$(sm=k9;L* z!L?*4B~hf6uioSX$zWJ?;q-SWXRFhz2Jt4%fOHA=Bwf|RzhwqdXGr78y$J)LR7&3T zE1WWz*>GPWKZ0%&@%6=fyx)5rzUpI;vy`u(RKzNG_1sI}IFCZ&UsR?8S! z!65@`-;RKl12LMka0L8&HsaA8{tWv8W-<}F|Nn<iT7q6h&WAVr806i~>Gqn6rM z>3}bMG&oq%DIriqR35=rtEdos5L6z)YC*Xq0U-$_+Il@RaU zXYX%+``hR28`(B*uJ6G9&iz>|)PS%!)9N`7=LcmcxH}k69HPyT-%S zH7+jBCC<%76cg_H-n41cTqnKn`u_V9p~XaTLUe3s{KRPSTeK6apP4Jg%VQ$e#72ms zxyWzmGSRwN?=fRgpx!?W&ZsrLfuhAsRxm%;_|P@3@3~BJwY4ZVBJ3f&$5x>`^fD?d zI+z!v#$!gz%FtL*%mR^Uwa*8LJFZ_;X!y$cD??W#c)31l@ervOa_Qk86R{HJiZb$f z&&&0xYmB{@D@yl~^l5IXtB_ou{xFiYP(Jr<9Ce{jCN z<3Rf2TD%}_N?y>bgWq|{`RKd}n>P4e8Z-D+(fn^4)+|pv$DcR&i+RHNhv$71F*McT zl`phYBlb;wO`b7)*10XF6UXhY9`@UR*6-#(Zp`vyU(__*te6xYtV&N0(zjMtev{tZ zapmGin===teMXjsS0>CYxUy<2izOKOPai0}!B9+6q$s3CF8W{xUwz?A0ADO5&BsiB z{SFt|KehNd-S#eiDq!y&+mW9N_!wH-i~q|oNm=mEzkx}B?Ehe%q$tK8f=QY#*6rH9 zNHHaG(9WBqzP!!TMEktSVuh$i$4A^b25LK}&1*4W?ul*5pZYjL1OZ@X9?3W7Y|T6} z1SXx0Wn-|!A;fZGGlYn9a1Jz5^8)~v#mXhmm>um{QiGG459N}L<&qyD+sy_ixD@AP zW0XV6w#3(JW>TEV}MD=O0O>k5H>p#&|O zD2mGf0Cz7+>l7`NuzGobt;(o@vb9YiOpHN8QJ9Uva|i7R?7nnq;L_iq+ZqPv*oGu! zN@GuJ9fm;yrEFga63m?1qy|5&fd32<%$yP$llh}Udrp>~fb>M>R55I@BsGYhCj8m1 zC=ziFh4@hoytpfrJlr}FsV|C(aV4PZ^8^`G29(+!Bk8APa#PemJqkF zE{IzwPaE)I&r`OxGk*vPErm6sGKaQJ&6FODW$;gAl_4b_j!oH4yE@ zP~Cl4?kp>Ccc~Nm+0kjIb`U0N7}zrQEN5!Ju|}t}LeXi!baZOyhlWha5lq{Ld2rdo zGz7hAJQt<6^cxXTe0xZjmADL85cC&H+~Lt2siIIh{$~+U#&#^{Ub22IA|ea6 z5j12XLc`~dh$$1>3o0Cgvo*ybi$c*z>n=5L&X|>Wy1~eagk;lcEnf^2^2xB=e58Z` z@Rw{1ssK)NRV+2O6c<8qFl%efHE;uy!mq(Xi1P*H2}LMi z3EqWN2U?eW{J$lSFxDJg-=&RH!=6P9!y|S~gmjg)gPKGMxq6r9cNIhW` zS})-obO}Ao_`;=>@fAwU&=|5$J;?~!s4LN2&XiMXEl>zk9M}tVEg#kkIkbKp%Ig2QJ2aCILCM1E=aN*iuz>;q#T_I7aVM=E4$m_#OWLnXQnFUnu?~(X>$@NP zBJ@Zw>@bmErSuW7SR2=6535wh-R`WZ+5dLqwTvw}Ks8~4F#hh0$Qn^l-z=;>D~St( z-1yEjCCgd*z5qXa*bJ7H2Tk54KiX&=Vd}z?%dcc z`N8oeYUKe17&|B5A-++RHh8WQ%;gN{vf%05@jZF%wn1Z_yk#M~Cn(i@MB_mpcbLj5 zR#QAtC`k=tZ*h|){Mjz`7bNL zGWOW=bjQhX@`Vw^xn#cVwn28c2D9vOb0TLLy~-?-%gOyHSeJ9a>P}5OF5$n}k-pvUa*pvLw)KvG~>QjNWS3LY1f*OkFwPZ5qC@+3^Bt=HZbf`alKY#{pn zdY}NEIgo1sd)^TPxVzO{uvU$|Z-jkK0p1x##LexgQ$zx1^bNPOG*u2RmZkIM!zFVz zz|IsP3I?qrlmjGS2w_(azCvGTnf~flqogV@Q%mH{76uLU(>UB zQZ?*ys3BO&TV{Pj_qEa-hkH7mOMe_Bnu3%CXCgu90XNKf$N)PUc3Ei-&~@tT zI^49Lm^+=TrI=h4h=W@jW{GjWd{_kVuSzAL6Pi@HKYYnnNbtcYdIRww+jY$(30=#p8*if(mzbvau z00#}4Qf+gH&ce_&8y3Z@CZV>b%&Zr7xuPSSqOmoaP@arwPrMx^jQBQQi>YvBUdpBn zI``MZ3I3HLqp)@vk^E|~)zw$0$VI_RPsL9u(kqulmS`tnb%4U)hm{)h@bG*jw@Y*#MX;Th1wu3TrO}Srn_+YWYesEgkO1 zv?P8uWB)is;#&=xBBLf+y5e4?%y>_8$1KwkAJ8UcW|0CIz89{LydfJKr^RF=JFPi}MAv|ecbuZ!YcTSxsD$(Pr#W*oytl?@+2 zXBFb32Kf_G3~EgOS7C`8w!tx}DcCT%+#qa76VSbnHo;4(oJ7)}mm?b5V65ir`7Z}s zR2)m15b#E}z_2@rf34wo!M^CnVoi# ze+S(IK({C6u=Sm{1>F~?)8t&fZpOOPcby;I3jO;7^xmLKM(<%i-nyj9mgw9F1Lq4|DZUHZ4)V9&6fQM(ZxbG{h+}(koiTu`SQw6#6q2Yg z-d+1+MRp$zYT2neIR2cKij2!R;C~ooQ3<;^8)_Gch&ZyEtiQwmF0Mb_)6)4lVEBF< zklXS7hvtu30uJR`3OzcqUNOdYsfrKSGkIQAk|4=&#ggxdU4^Y(;)$8}fQ>lTgQdJ{ zzie8+1$3@E;|a`kzuFh9Se}%RHTmBg)h$eH;gttjL_)pO^10?!bNev6{mLMaQpY<< z7M^ZXrg>tw;vU@9H=khbff?@nu)Yw4G% zGxobPTUR2p_ed7Lvx?dkrN^>Cv$Axuwk;Wj{5Z@#$sK@f4{7SHg%2bpcS{(~s;L(mz@9r$cK@m~ef&vf%1@ z@8&@LLO2lQso|bJD6}+_L1*D^}>oqg~$NipL>QlP3 zM#ATSy@ycMkKs5-0X8nFAtMhO_=$DlWR+@EaZ}`YduRD4A2@!at3NYRHmlENea9IF zN*s>mi?zy*Vv+F+&4-o`Wj}P3mLGM*&M(z|;?d82>hQkkY?e-hJ47mWOLCPL*MO04 z3lE(n2RM=IIo;Z?I=sKJ_h=iJHbQ2<}WW0b@I6Qf-{T=Qn#@N0yG5xH&ofEy^mZMPzd22nR`t!Q)VkNgf*VOxE z$XhOunG3ZN#`Ks$Hp~}`OX5vmHP={GYUJ+-g0%PS$*Qi5+-40M47zJ24vK1#? zb$s^%r?+>#lw$mpZaMa1aO%wlPm3~cno_(S%U&-R;6eK(@`CjswAW2)HfZ>ptItaZ|XqQ z&sHVVL>WCe|E4iPb2~gS5ITs6xfg(kmt&3$YcI=zTuqj37t|+9ojCr(G^ul#p{>k) zM94pI>~5VZ$!*Qurq<@RIXgP3sx-2kL$1Q~da%rnNIh?)&+c~*&e~CYPDhPYjb+Xu zKg5w^XB3(_9{Waa4E(-J-Kq_u6t_k?a8kEHqai-N-4#`SRerO!h}!cS%SMC<)tGix zOzVP^_t!HN&HIPL-ZpcgWitHM&yFRC7!k4zSI+-<_uQ}|tX)n{Ib;X>Xx>i_d*KkH zCzogKQFpP1408_2!ofU|iBq2R8hW6G zuqJs9Tyw{u%-uWczPLkM!MfKfflt+NK9Vk8E!C>AsJwNDRoe2~cL+UvqNP|5J8t)( z0$iMa!jhudJ+fqFn+um&@Oj6qXJd_3-l`S^I1#0fnt!z3?D*hAHr*u(*wR@`4O z#avrtg%s`Fh{?$FtBFM^$@@hW!8ZfF4;=n0<8In&X}-Rp=cd0TqT_ne46$j^r}FzE z26vX^!PzScuQfFfl1HEZ{zL?G88mcc76zHGizWiykBf4m83Z${So-+dZ~YGhm*RO7 zB1gdIdqnFi?qw+lPRFW5?}CQ3Me3G^muvll&4iN+*5#_mmIu;loULMwb4lu9U*dFM z-Sr**(0Ei~u=$3<6>C-G6z4_LNCx||6YtjS)<;hf)YJTPKXW+w%hhCTUAInIse9>r zl2YU6nRb$u-FJlWN*{{%sm_gi_UP5{=?5}5^D2vPzM=oPfNw~azZQ#P zl5z8RtSSiTIpEohC15i-Q1Bk{3&ElsD0uGAOxvbk29VUDmmA0w;^v`W#0`};O3DVE z&+-ca*`YcN%z*#VXWK9Qa-OEME#fykF%|7o=1Y+eF;Rtv0W4~kKRDx9YBHOWhC%^I z$Jec0cC7o37}Xt}cu)NH5R}NT+=2Nap*`^%O)vz?+{PV<2~qX%TzdJOGeKj5_QjqR&a3*K@= P-1+_A+?hGkL;m(J7kc&K diff --git a/dev/integration_tests/release_smoke_test/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/dev/integration_tests/release_smoke_test/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png index 3d43d11e66f4de3da27ed045ca4fe38ad8b48094..b6a5d3f48e4e0fec02ff52437b182c553efd1c00 100644 GIT binary patch literal 10932 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 P-1+_A+?hGkL;m(J7kc&K diff --git a/dev/snippets/assets/code_sample.png b/dev/snippets/assets/code_sample.png index 3a9b91debffb5aceb531d61c4d4c1ba54e4214de..cc3e125cc5ea7385e827d2e77360ee6f471e319b 100644 GIT binary patch literal 39037 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 literal 58572 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 z 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 eDJb8`(Lh&_}CeKetuJur5jnI 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%0DDXURsJAnlpQNJTA&2 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 literal 202228 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

i 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 z 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 literal 18209 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 diff --git a/examples/flutter_gallery/android/app/src/main/res/mipmap-hdpi/ic_foreground.png b/examples/flutter_gallery/android/app/src/main/res/mipmap-hdpi/ic_foreground.png index e3c6fb0d528ddd064955540cade0ea926596fff1..373133cbbca60878187575e59a86c3e00de52140 100644 GIT binary patch literal 2063 zcmc&!dpMNq7XOkYTQM%V9A(V7O)d=+Q|{)1p%F&XmdltKW2j9`JCRE@LsQv=!xY1dy=Xuw&ctL@_ z+ck_e007ud@*{*mzV_Qz-wd5n+j$h^RGHpnZvgnU;JXd#76`*>ej#K4NVf!l91Z}; zp-|2O0GvVtz+wylxbOkMAi3iAU^f6z*&cK-l&JjwtCeI zs7EpdaeR?iA4uqw*wX5(qN}Z_HI}h;h(w`hA7~d-gNmxQf|8j6QW z6dT}604{FXiiNPE&I{1;0$_jZDXUly%%s)#gMC_!Tmvwb$N1)9#V0+ zVlCv~Z_9P3P%;%~1Tro3}ochj5C-R#Tl>l0c^ z(#0mRF{D(qq2@5-XxJ+aU(rl*J%iQk(CZZuq;2PK{vg?0=je-s!D?Qi$^``O^0tW5 z`^L8o21?31PiY z?Knua@dtIsxn39!GHj^zG=I$FI4hc3jyr~CTn;>->A*lEs#01WY`5!#nK`N=ByY*!Z+Q|r*!1-J#y+K=dLc4lO?*&yOb5~ zOT7uDmT(Tat?5M^S{|L81T`a{+VA}K2va-dqtx$FHcVZ0Ym%eK|R$WieAq&WwHBpuuj(6M8O8K?8Hp+l>~FIs*gLTy!*-rh(1 zgK|A=PTa9+^=dl-_s$V6Cs8P&Q>@ho-+vyoa#NIo6=$d-*Kxmh$ z>f=9@c_aNxPYQL4Uq3;e-?m8+V8h|jFWvBdm8p)Kqs*sTidW#}DJIZInT*e@71{Q( zuN!T`j9BjYWN28;97778zG^8N#ajNHnLlkj{X zniAKqn(PL4=dF9lWyRb2Per1Uy=5I^4ktrACbOrfJMmSSS+7n?VtfjJ8FZhO8AR`1 zTl|ppQ&s?FuzhU_D){N+YDwD1yjiO(Hy63?E{wzcxhq};N%ZW%0@L+(b4|~6=jzc_ z5n=-k=3m)ksa=&;_sK&rqn+aBWHZ{1;m$PPn#oHlW{46~qfX^yz&}Xzy$9PXTY_wN zO7n9H?nZ)S%`qv$+*43=4ZkL{!`9l&Jxq^Rwf2jmxyV4F1RT_-nlM8o%gjiE`1)pnW|HO*#uUF`P}OvKcP4 z6b9q~N3_EMJG8T%qhqMUewTgDE>8Pw&}bJldcwI4_FsY%Npx1+nZFm@OayL10)Rve KB;3Nqoc|A50`-3Y literal 3581 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 LJd3TwxZeFgkP)B+ diff --git a/examples/flutter_gallery/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/examples/flutter_gallery/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index b8f67f1933dbb23636f092d10e5e1fe1abbb437b..41ebbcad375a683b011a1041c5874ca86657ea1a 100644 GIT binary patch literal 3116 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%0AJAXp|J4@(&WJpi7ip9q@xPy4awI^ zXCkF?2I1Iznq!dW-p*E=<%~u)doA#=quiI@$uYAcM(=Z#j46}GH(pNMt&n4}$4FDZ zw>R&1x&}G0i)AZ>@`XX5YV<;zE`E3Rr`ZS7@T6_Pgtb5aysD0Bk3jrS>r|+@ z+-#!zmjUhtYA?ae@2FOGvw^!jTn_Xf+{1Ohhb>EAJpspP;sab=-yx}36Ve}q)VJ<- zA!unGUs5M2>qfVJJx$KWJ=&ryPQ1(n$B-te$#ej*@U&+=-RQ}6WQLqRy!W(H@@-~C z#dkGecFp!1Zq%!dCp1;+#?Yzt9pi*&cKg>>?+_7*ri*rJ<-NA#c6VQe0E&Q`biH44{{auoh9ZOKjn~uy4!v0&gi-Ky&QFCpxClVbvZ6NAX z!8DO)`!VNqQ`l5*qOM2P*3iXzLbBr|wrt=qook_|um3s2n?l~cL5_OZ*{-K!qh!SN z-hU=hk)x@t9oUXmjro~tRm}E>=S$uiq#_F{t1ByKAMdi7S>%hRkVmBT0!MAT09uX>Yr&l)gS;M2wuD9D~R{E2Y zlImW6rFd4l)4i(aIkDSU2fn_}n_=RnU8#;1U<;BN=+0Y``+K8<{hR%~OiIp8oDgG? zp&{=nc>X}m3Y(=UptdWg?@Eh+<+;pbwTr9r?B;d$*6l|?Q>NTT$?GNCU>SVTVkb?r zS^1!5Ph{Z-$7oBzzZzuXjCSQ6c=c5i`?AR;xf_4D#(%U?er;UtZ(9w6r}6&hZY(a# zuWe7NsU=#kTmBiBP|!6z7r`H}4^nMCss29H^Co_j^Lzks*imCW7*Y=ocRPwQK_E>G o5xOv#2@E!hWbghTLU4$G;DsyypHLYDD)|K9V2ib>vhq&+4;(12y#N3J literal 3951 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 JPDHLkV1l+vm7)Lu diff --git a/examples/flutter_gallery/android/app/src/main/res/mipmap-xhdpi/ic_background.png b/examples/flutter_gallery/android/app/src/main/res/mipmap-xhdpi/ic_background.png index d05e1b6799b0816fdbc07b61629bea3835845e12..e322899c925125d0da53c66fd02afdf30bf61b60 100644 GIT binary patch literal 3231 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 literal 31807 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 T;WEfzNCD<1R>n9(cg%kPaL+bM diff --git a/examples/flutter_gallery/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/examples/flutter_gallery/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 6b18864675003c35952d48d544c12a9c77e10c7d..0f6226d7f83b175ec75f51095fb7f6c9e35a3b40 100644 GIT binary patch literal 3980 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 HI{beCqNHw% literal 5326 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≫CQ}m>8^!eWY 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 Ld@1*W_0#_gizC#` diff --git a/examples/flutter_gallery/android/app/src/main/res/mipmap-xxhdpi/ic_foreground.png b/examples/flutter_gallery/android/app/src/main/res/mipmap-xxhdpi/ic_foreground.png index fa40533725a589357e10d11b0e9fdda63b526c8e..87d69a71557d90e0ab1488aa0cdabcc06272c626 100644 GIT binary patch literal 4613 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 z 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 r0v^Rl`tRBQ#^Jws_oiu#fxKa36y2n+hxS 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 diff --git a/examples/flutter_gallery/android/app/src/main/res/mipmap-xxxhdpi/ic_background.png b/examples/flutter_gallery/android/app/src/main/res/mipmap-xxxhdpi/ic_background.png index 3fd2f4fa22a42aaca5012374ccb871ee1fa349fe..cd5aea93afbaf77215396fc3ef4651539d1b3c42 100644 GIT binary patch literal 6802 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 W|2LHRa+HA$9L5G$^viW!V*VEmWjz1@ literal 125855 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%0DD9Nrh}wRh@bW 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

aRP^p5XZ$ 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 diff --git a/examples/flutter_gallery/android/app/src/main/res/mipmap-xxxhdpi/ic_foreground.png b/examples/flutter_gallery/android/app/src/main/res/mipmap-xxxhdpi/ic_foreground.png index c5df8264954b2db800da9ef0a5ebe02973e48a3b..615f0b8aad9d92ccffc975dc6b26d2969ab20d6c 100644 GIT binary patch literal 6155 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 I>v`$F0K?K!$p8QV literal 16499 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 diff --git a/examples/flutter_gallery/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/examples/flutter_gallery/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 87050b46b0986a2d3c262147886b87f63305119f..c9ac0c3ca9b959e916cdae8b02cf5284e0b19a70 100644 GIT binary patch literal 9897 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 diff --git a/examples/flutter_gallery/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-120.png b/examples/flutter_gallery/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-120.png index 4a6aeb333b2395ded530119e52e1e1024b0cbcba..6b4872a6ee7c22d561635dc8597dcd2021e0108b 100644 GIT binary patch literal 1750 zcmZ`&X;hQf7QGNi7!tb#OdR@Ls87KP8VN=wX;DBT5T*pwGAIbx`T#8;QXZA^C@NZJ z0!dIoTcuDDQ09OF79}Aef>0b7Bm|KVrV1(GN#55V{qcUhz1F$=oPE~5_xw2biZ}Bx z$zY=aLWsn0bN0pf!e60>!_GBLoue4(L^^poAyl1Z`0=DJR-1;o`FbMs?GA)e(hyp~ zq?Ad7;;9Htoj}O02qDVZ;wB#lgtV`Fd$3#pK%)T-z?cf^r=evAnw3zafZ1hG1H4>> zgHqVh1r{RsOb8o0A$1f~08Ub{6oH)tY$dQ?3|TVJsA0DV%(@_3201b?6GE;Ga>pT0 z26^L5x4F+}9J1}YhVjYkhfYPQh zDpwMZmvA0Pv0lp*kbhMYf=ZA_9y*erQ`?IVEYb2Vzy%Z|KW@&$-WCOrE0p--H?^2~ z+Wvf;KOZsj$raOtfa}`sxi~*Aj>XHV?bBx$;}|(QK1DjdMcOQ$Hk(f=pEmI0>$+y) zy$W@`3n}dyLmw{QIg{X7fcNC!nH*iOLL8e%DOV7^iu9bW=`-^6j^yiNH?VlbTA*}j zD8DF3?i_u`3?1y10KSnxO)7my@+c%6%EYnxZHg6A@K4Ak3wP|gHa4vgF+=(!U}Ym&dF9`pn58yZB^9>3qdVNhx_C zYW%+87ei%xz&w8Lh9*;hZu!!FiH1Y6V}Fx)!W(n~O&+T=0$scwfOX|pQBJ0v-F zuJupbOWEfZE%lN^e53U?>^IMs2LE8xbpPNLF}K@(y=z&_`qHHTWN$KIPX2>v_93}L zUr8%%wfu7Jw-mR=dlg4V=(__%W4C{>d4%r@e_5xbUb%b?P3~&atW+uODr_kPW3RG~ROf=POV8hV&!JwgP*LIzgo$Ct;0AP(Vm@!zJ6pRtABlHIjwa zZ4MvU?eX75GUyvzn^vs4&9htD5N7WuX6?KPL86l`OQoTs7WT z@|I%}l>ST*znoD(U*jL)zr`vhs3juGw`Qtl^3JdBwPrtmFH(eC#SB%Q>x*!zvd?7~ zBq})fUiZ>;e3-8)#~!*QJe70@y>C|8$gTTN4fARfM%1`lfxX8pxjhoQ3zKJ=GdbPY zZm0U4FQY{{t`5!{Cz{1Bcl3xx0kYRI-W_9?+JNSx~!JHyTA4H%R}FtIsG@Dz57Iw zzV%>aAommO|7?$QIU0BBWL&si*f-%AAuH-$TT3e4(#ndp*T&A8Znw{R7nN#9rM{sz gtoKT!3)8vs;EB}#0yra$lK=n! literal 1787 zcmX}tX;hO}8UWxALRbR9N-=5FT02gwMP*lp!R4@7B0EWll|>K?R%AJ%Ad8NoVx?1% zEhG>GMOy`>fIxr*WU(kDB$2Qv2qGaYCJ>bg48b>M9A?INzYz(yoLqnBff=e-U6bJJ|nL!}SAc$o^ zVH;3Ou!nN7{>9jUVr(GG&?Cptmucw7H1sbvJX&rTT4Cg#W8_<86vQ^7u#MQRdJE{+M^umrl_^uDE`e0`d>_Q1(w*agKU?&87ltkws1V>aq z?Cl4qesC7SKSi+bkClBA*e?cG3AjnXT>?G>;41|`DNqN2h8lw4VF>MqFcE}{;J6r0 zjl$X2aPBoEzlM}?I6n@ls0qmUweQkzg3L*{THT*@UvRxf{8NoMR|Yp_kk>Gf*C5Sn z9LQ^w=E)!*H4OzaD42%AX(*Zo=3@zS8j4YJV99|khZ58bl**xW1~@ZNI}7y+XcE2U zil(?qXpzWT7l8Ld##;dXz;xR?Xj4GjBD7289fR_YA$i9lbV_BN3e8g$Jbe%SAK|4M zUa4Vf1?2yQd6inZ3Q7&ARzanKr8Q8m!SWic0IcYAs{ooc_ym6)EocF>Xx3_V06Hy7 ztJ8r_hh|;6$@O~(f|(_IxKd9}ER3q@mVuT=iMwoT$2x;8d3C(>z_WD$bRX(*Y>09( z_~~N&=~@?J@JOVVaDDVd$_##GVs`Vt-jA2BaKsl?yaa}b{~_s9<;Tx!FJX5@=$Rhr z&?nf|Mjrxu67$%2Mg=A1_cpQP2IevA8=Oav?%&|Gvv2|%qPXr^td;edCrbOrLsc$x zaakHNd8Q-7`b&nIG?yRAn5eWZ#wGDQSaLrM&yjV|2G8gpYKU(3zRXUwv({rQRz`O` zx{P6nHdxtgVbrMXsNs%6WfE?{vrEW-R%dO_sIi&w?DTQMs*Xp@X!pA&uD4C9@ta&; zPtfvG-_~CC?lsL~C!Nb@5^)Yo`C(rO`SFsl&xD*==~Fef%h1}{#sIy-KO7NqVrux; zx_6~$NC&vKEOzn8ZUaVZOlnxvOFqBHR=R&S*&$3*)Qfq%{CmHwHT0{4^MkY8a_5NP z@S%ROOj8#(Zy&eY|MmM$a+aLvGg9UhB`d^^X0!QIdw_OTk$R^+eWJiAigI_E_+j}z zO%<(4Y`G=8(WGd7qRoz#ylc3&q|8cnQt-%IM@}{mL}g4L8N>RA|JLq;VUC=4xtAW3 zLkUX>pCueBf72BzGyRFqQ1L@Zskh_5E*3iGZjR;6iFOLcQfF{y3KC;-8pA#|lVW?e zC#p$_A;QwQgp|0J$j2597yL43vHOgt&$oD|N$MuE57xOa5{o zri*p4%+39sw`;yfA=xPWfxFRi0x7gQS&z^ry1T9YVGJgF_<_}GFv*88dYdsU4ZoM^ zSZjG?>a!!?Zjo8#rp*Z^g@adO<&oThwEEWSizPUh!t^rri3o<~nMq$+j>cY@)A_+U z>rC}8HD+V9eP31Va5}1p$rA1z+3wV*p8VS%duVr9Z*o*KUFPx+x7tQWx#_c|<>+)R m@QJUVFi@ZH|A(ks|H&v$tBJ~PCh5=*3n6>@dDOT?Wd0A^lEjn% diff --git a/examples/flutter_gallery/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-152.png b/examples/flutter_gallery/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-152.png index f00dddf63ba511d96332478a140509b50a880510..58e4e750829d324957a8005fa1a72fb4a083198d 100644 GIT binary patch literal 2003 zcmZ`(do&dI9{(}MdqSkTOSN@Vwv0(u9=()D)0n|{C6P3f6ot?#ZWbGcmAodTd&_R} zX1vA>m9zH7%y>muflnfcD#>D<5ek9*Gd`~95n=bX>?obUNQ(%dM{IL*Il zB7|_nGY(V*KKkP77)3NU>eE+%O0YfI9-+DiTGC5cMZW9u87di}J0=JvBqJnNPzm!0 zMH3KO2t>$MQDAHMV~+b#gp>!|Ts$2CKn5U}gIorsA0cxZa%LcR1~R5$VI5>L*wYF7 zd0@(ezjuMr8z`Owi44-GVIL2yyTPUhYVjf)^yhGTso+5iu}q8GW-usmfHP&F8|$~9{L zEb5(?%jKWM;3EJ-HW;?aw{gVSYt{N5`E74!v~JWYQ*w|iQ`4(Z>qeatIUD0$gz+gt zlzeXipn5QTDc1_EMJ^AKYku3njMnuUrL$QW&q8IdLPTL|hg2({d7wfqz<3m3JPUAF zt1wPKV%;C9xIe;OsZ??J5$nptx+#hmZK79VPi3f)^HnMNIckxNv$<-dTounk-AiTacBz_9*&5E-s;*2GkAiJ28@m3b8rJtU zowKpj0`Fd#Qss*7#TRNP7+AMQDqcm(K941GxnB_v9ZOR__ZZ{zST2*vB@*AvR^*he z>|G?2$7ioJJkwefBcZ0Ur2uXz&6NAiVkx*JH;E-uQc}}~L`qC-M5nV5 zDG#~iA%`q#6BG#>{BEf z;b(krA++h2FRt|F<_nsFREr{#9o2qUHQbE1iZ^}Nfe>b%=wR>p-Kc0Zg{tpvpgKto zY9GNlWZ(?k^mMr+wg1}fEzH~Pu6Ma6wGE%jz+tr*xGi?86L;-}ZELIQ6Ar(Iveq&M zlTQ}ElWpxhBDcAFyFP7KAYq%fYEt|EU?aGMdblJpGGs7zd9Gydy?_+u^ZS{n+fV%v zVoGf|7qQ<*qqszWuQh5K(Unfe^s1^T&aRyf|6@0B@VqrB?%WGXUZw%@Tw z!$-K-yGH628To&MI7T+n5u?oSU40y%^KpH%o!0xtt>2p;p{!~7+l-jEansdGC9~}x zj1GAH`(@;Gc}GPByn9_%Bnvn@qQQM?v` zP(U4 zpZ;8;|NFb2lOu@qj(4Ox_k{0DZ>neT@AL{UJiRmpyZ5tREs5KLW2#@*hL_ac>qyYu zHe3_3dH7`6foyhaXjX=c9`onJN%0pSx;v3*wjQ1I7CYS1HzNLtw=_#CjnN|5^y=%# zTe*3r^Q@!&Bnd0BfbKnP5`pvjgP+5g%8q(|^kjmKy96dV|AGOq|pT-{>w zyVx`->IWY8AnQ^%Ui62ayVD-BRir^K$?d@oefy;CZ!*8yiJRHnpdaL7Fw{ZJDRn7U zHSuUJ?M%Hc&M2s7=jaU!ZGu9LUWDFgZM!}(v!UhSo1xU1TqyGEl4$$o9Ff=zM39gXtW?Web=JV>p3<`rnCm3gS! z?v8Lh?Q>30Wima#eWI9BeEinx_=Z+f`9F)5CNTH_PTXwy{+)ftxG~@~M}BCMG+sYn z>8I_x`-O1Tn4`VyyGOiqETA-2-fm2x>+Ga6;+A|xZ?v~x4R(EELDR@$1^31l&!sbK z0tS}nMBKG-md?%-@z3Y@B{jZ*7BMe1!uu^`F;BPrmxD{LPFM_a}w2&*Y|6fpb R9aSj=i0DXhs6G{#_+LZt18o2R literal 2162 zcmZwJc|6ox9|!QCWiaICB5OBomU>)-?yVFNV;N*?Y%`*4QI>=hx3ZN;V;E+PTesWO z&2~pf#t>1FF}74wv`ES_mXLMkJ9B?M&!5k8Uhnhyp7T2Ab-w?eEH_tsMR_fG1VI!X z9c(?&O8Y+Lq|h|p*r$RPi8v2?8-&@jaRS{)hgrK=BS`gi1z`{d-D6`MeB%)0hsWQi zL`QUKFoH-9xH)^-AqTRMLuAC3jNtMR90hSIK=4$=IS+BBBCdsqYY}p|5IJ0gFafCn zq!uKc$Pz9TiOL0u8jz?3Nr&r_uKAKjiX{mQN$(O#pAsqDH7QTJlozU4>Ig%Mz>xAr zl}OzOY1?bk?lfr+y0j-<+6z@IeT0Fr$-x{h!nmPm7UAfWilLQ?;eY=SQn~(E`TF1rCDL7`qoqngWh$P9sw_}#5^rFE8ma-* z9*WhP#p(^9&IXN!RSovq#tzu>47Q;J;gE<$>yI~Ki2ln>Bz8=`$2M7AVCb=5N6Wd>?bxf^u zOn-n+d*Gb@z%{ep?Q*?42RyE@Jkaa{&o1!FY9M5@30xrbioChtlhf#%+vLyS1Q)af zzlM<45dH>E@E~FkA_w8*AeB`fj{p7z?oPnp9q*ZwP=(^dJw8ZP>-4h))cU& zp)6j^Tfu3t?qVu!1JQ zszA6ZgjIkwfpAR-YXAa)P#^>Wx)6atEEd9lhX_OfBGG^1dld@=ViAbZg&4$Q@tY`z zGz7sIINDl!ogJJWT0XC8ry={*;15--lalr%?v8=P$?A(*+61y5$H_pR=IQw7A7=x( zmq_N-L5FtTN~FGbuRex}95q*3e9_425n+2W_s=aQgoTE^UnX9lE$gs)7gEB)62?ML zD~ks>{U(Y7|3{E6ww@ByYFLx7$f!IQxmfiY0Z%AvI#ISnOV8IgRK;pYFQXXINchQTOs)YlNqwZ*u>eqxqx&KZ52cE zFCdxFK9vu1RSe6U#R!0g+Mf-9rnva<|)wdEkCjBd^Y_A~nsZ$wj)ga$q z{EvDu)Ge%nz^%Ll<(~H$uc_-WxG`*Q&=$ToB0$;1TBn+H>3g4+?7@yzxN7Mq+H_hctt~v@?cAbe^S_jGK6HeyG7VX&k5-cGW@E>wqZ@WQ51(G{9}#tg z{B$rK`vsdAFnalE)ytX)QAPIBFm&p2_)^{hb4e;r^xd)ZV`_fK)O_3HT;dxXgxBQa zX7zu$GmlUGrJWLw->S?kR(=p!UV=yPDHe$yITOY6K}*Co!mF3Iw4??iA;m?yUw4x* zR{UXs9pO$InP_V{6u=WIdwE~P7FtH?S~9QK@a1c^CxuB&uD$*o;iF`ofboA~7ECvq z@35I_l5AdLHEJ>vs)iQd@e^+~N;Vt()m6$@SzcRtQMTOsBmt9BCrT_yA_~gcZ;4!T zS!3#j9P_UIOm?}^Uwdm-n&~X&@Xcu1Mn}@k2GYwHb|J@;gO!T7vc}Y;h4LOV21nnF zjE~6P91zDhPYjrwBn|{W3p6To*`QqY?jz6ssAivTqaroWySOXw&H=`YMa=jo$EZ(6 zov{t3Xk6yAnua0zG z#pZ_fa(C-}MRpY->w1mAauh73h!uwJdV{4akLhE+DkCP6eqP# zi*)Vm)YX`% z^{%|KD%Y=4?0<_gdLA2(pKp()mw(}^@{sgx-J`ssxLm8JUyVP z=3KKT1<$2R`g=_$xJp&DH&#}ydGX|epa4$og>xIL7^OUoX&s#dqb7v91NXc4S#0-d z6N#wyn~uLaRNE4<4qJF{wa%*YNy)TSPj$A}R$C3i30mg=vYymw3!`lsKVQm6{|Shr LovSU=CNT9MZl-aA diff --git a/examples/stocks/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/examples/stocks/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index ac48d350b41715108e0b3db0ef9105e5b5ff0fcc..f244429db54dcbe5adb45cda08f8fb61f87d54c8 100644 GIT binary patch delta 3036 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 delta 2109 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 diff --git a/examples/stocks/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/examples/stocks/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 699852dd530c5089831937b90f7834d0d18dfc1d..d0c9cd23d6ed1f2ed663872185e1b434b171a604 100644 GIT binary patch literal 4372 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 CXBYPX literal 5061 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 literal 8878 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 CD_AQ4 literal 13629 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 AX#fBK literal 12818 zcmdU0*P2ocWaYHS-#6tz?`F`LDX=^ezkouwCS z^f<(LoHdkvXyGlZkM+a_>HHLg96=5fbh%NF%F6oU`1a; zS#@6Nuceh=3t`>}+`UU^6_L^{kd}I+*op0eFM)R!IT0CEM>!0bRtF#RC&TiMh?MG* zBf6G$aO`A~%<>|zFTwB@a4h9MPrtvzmQaB=3e2s5OoFKqUE>1fe~O@;%DY+iaPStm zd^D?kH)mPN56v9|=9-eLF(ttAscmIm%cGr=z-E3AB$>@TpZ2kQcS-PnbxC8oJH=Jk zzLEFB!s9;_qsUChGlN$?nq3IhHHO@!Z@&Gx8nT}nrsr|&ecg%|_G{(8I*rWLGPYkk zqHv`NG`=b|hh+08xD&T(w)-+L=qqelJk{t4?c>$uZpcy{TdchY%MV1{xM=Ng*z!W{ z>+E}|oJ}^KxkGMsUyyr>%@+EYPXK~x9*#EwA``#v<^$MwuKUXy;Yw#&P#F*5^$i!_;2my5Zs zGFiZ%c3$*OV#sUM#Ew~4II%F|eV*NHxY57pm)GK*As!wMc5Xj#Vhb^PLF8dix^47HYS#M-m4t&82KcACyWBc%f@=YXGGVq}z&$mNw zRxEz-a)d0Ttys|&jyK#U=pPTd?}8xT!Lp!6=q8#jdA{={kbu$XDa?blWy!(mNYHCk zM&O<_yaQ!KKhQ^MWqy92e%z}AMatkT3{6P=H{2`Q%D$h+%gN@Xje70hGK*=7+kdQ)&ervIdi)CC67qe7&B*={l14gJ>rm$h={^uXM7SqA z&C1S(|0{sh;|X1|*ID|zRV`aP{SLQo;xAU;?HyOP{#ier@8b^@i=s={<#oe1Ba*Sg z?b`o3ESh|vWk}C3CR=sD_^s73J}yVt?uk*o-Zts`dR(Rd(DKl!lC7Wm4o5E@$D51r ze*=Qt2h6ut86*2$bLs6A;W+`;k`%}D8Gg;29V;vU7PwkCM>n(Z!>$ERt-$|QpV~o3 zf`bd9Pun?E3tLbB{y447s<#qzjcd4wfH7df3eP_~&&Dp;*sG+2i?3JJrrjvwKo=~3 z7uBBDvre{bs@?*3TxcVEI@xcCw{F98&!_obVMbJP1MPdtjC}iE_j}%$o_!V?-ecVg zbobtS2;Z84yz*$pVJ-_0UGx3n7k?28;GDdgO@r%)7<|%Uq3krmtx~YlA?j9`p#0!lMT4evMU^KkMYl z#wX}E!|WKgE;VK%%;R>6W*238JI<|JEiO!ef+t%k!v2ehLHzNEvJ-LC`nG-u_}OY* z_Mo4w@AcB!^rP)D$cFW}ZWpIWOloCZ$ajm%Qek+0R&;-^fTy^$aD7Vu7OoWY!C8eM zI~|iWFP?CM%x&qX20`~XM2GLAa&@o@1{=$j(#j+?lU2+BY48%YUCv{`E+FYp}o@aRBeFRgT-br2X%D zm9`;;ClZn9jg2NP;pnqrOh0^P~~RY7tX+nrhyBqf^Dz_G-JQ&I3+46*lJD0_G*Nf{B!a`&mGZ61D~ z{ug%qV+O~sIWA{94EaIujvv00kc^Oe$tCh%M`k{?5tID|SE+(p=iaMy!zyPbP0>ZT z?TW)WQL4|We@-Qwl*WdA+})8rFq+SUGtDmR0Av)y-$!jqfJBN*Yzx#tt?+{$Xu!Vx-OanaI*yb*`*+UZv5>0G+2Hu3#4H<5 zqO1$Ee|jkKp^QS`am(R{eYxQsXI-bHle6QZ2NgC}#_xkI1B3)$I--XSGM!KC)`pjS zwZ4fi>@UZrf8j!O1p@ruR$I4VS+*G=yp2fJF46|aiURwt?N$^7-~ev#rKVc1&Ob?0 z5}3-LYzk)=`c>9o)JOtth;25bC;oxjp;-oRzUVOJbuyYKdoc~o-!ap26y5b~s-`4B zFYjq072UgLc^!M*Yq;**{)b6#2p31>*Fx+&{|sXh<;A5D(7b~jcdVF-=Mwfk0&7&Qg@7@B025iW1 zQ0mF4NZ{Vc{}zKjN}=AReIQAWPt3ITyRxK)5Jh^2pe3}p<&2eiks{W-dbpq6W$3`~ zqZW9ZEgTJepu}%9O^|YM-X(3hx##!r^fqA&@_Dx}CC;eFLxvx?(zYH}15m$1TKa)q z+pk93Z5AbpKDf^GwZ6|PD`x&SMRbEb$SE6oCW98mwu`#k#j5`iyuHb#7Q~Psbe=d8 z=Ter(DRq3ynEX}C!SCD)JR)qrNPoED<1~M4M_j*a#csIrQy-sXugK9~K}=N#br*HD|pe2Fmtw~^(59^JR2&U4(RcIe*h0pS5R&UlmE9LgI$UeZ*G(`6kn2&=^|$S?K5sOsdcXov24>J#B5vmI5>g~PPdfGwv_XSsO*|~j1p1o+T#)=`(cuN7E5%yo`pYN>G9RqaKe(QXht|4(GE#dd@@4`W-I=g>_Y66aVyQIa*3guvbnv#+Rb0~rbbaO|$YwGLzHjUJ+1%j6x#I_~&4zhR%P^*fZ9y*GWyGlNw@ z-~fxqOu3OSUa8doWI2A1+;3=+gDf4cz`^TI8d6Kw3!9NFT|Uiwpb9=`vyAjsEX5W1 za1CR>*~7P)`_;?;sSG2s#z2!&UGd8f8G&wlQu2npNs@&VG3i-|6EFHr9+EKBI{PV@n%SFMNC?aRB$W`=#mq z4CP@pdD3_49j2&sL^+-xBC1irDrgzDLsux3Zqs=CmE^tY&Rd)^!FL7wNV?11XERLC zmb;%T*#X6?@iSNkL)8d%&@&P4FR56JCD$#T?84KjVLV)CNL^MxK$4uu62o=v`sXUo zLp^ZLHRL&5;Z_u{kxu!F7T6-32JyfkX5+G7(xjbGG+rdgy8!LWm9C5JfR;`T>@!qD zk3${O#4UhR@HdSX1lO%HphBX{+Kk_XjObSkWmYgA11%bjBsdY*A%5F#*^-t4t>w6a zWL3K+IX#z{GW+Hizu&cAF`D35EU9O0+b8RwDkvz!EBWP>V#kEL=~HsRvQqh8?!?8m zyr7udQG5PS&~xxnDQy2_bnnWFV&cZcEy+WTm$#N#aE&6b@gkqr36rj{n*AK~Q2%8n0|1bbA1)2UD_y zS`SjFyZYa@IDhY-t955LSTZ2LVU&2|%on2RBm5E$3g#&Sxp?eP2fK_I_&=p@H9yC@ z1?pZu)0?5q_Ie*?$AQN^qK-(~30;PxhYiod$Rb;PxR;9I=ZbHT9Agpk(IQW#I=wp5 zA*&BMLwVPdMwptRb%c8Dp1@L_$9kqsPfIC?fIeV_#~!@Xb3~-iI1MT3xD;&4gt>=Z z__zD-?O7ns{xO|6MIoEYsO+=v8JxUUzrt^XEPwcc^hBuM04r^lz+*a6Kl`?N58 zRb}>O<_6mGH0|O?w`AR>GH5lAZG$d5=xjCo>L}N=0KDE2D~(sAl&M3la$FaYp0-tz zj}{p~sGG~jr$hJygA`Ev2L=30=T)KE+}2!3*U-}+Vu_!U!st8Lya#ee+;$vK znEIk=dV^WEm$_^?9_-01VP?NB&(Bnn4y4nLTaqD=9t$}>THYXOIJD275XC-tTyOq* z;DEcSc_1;+*Fid;);lO=?qNBaCVnTxL6vl4(ug-4gi`Y^Z?D&_6$A$v@Xnh(`sumd z#UZNn-?$dWFG+Ldy)Uz#MvgBUXh@*gtUs|H;&Yts&*ae4tyA8($4|{*v{!C2#vE~% zA@Ut(qE2X>&?P00{h=qYuWPyODO9*aSm}>khk;;uUWP1W~6pzlA>JIb8~qodYaaX5SJT9~?k9W9=hvX;IPcRR z!q-#hki^DLu7bCVz_)|EEH{5`$3eP*k`G#)2k3&R`7wRpdH>!{uljg!wk*?J+u9pV zTnQ2In-q#K93}3n4M3YaNcfnja<9%&ZY}DVE#Ow`0v^KKAu!ams95n zjl~Mxie2X|M2l}b?$Ug|G!=BRbVCwo0G6s5pCg5!pti8&XFWDo{2J)6J%I@L+@`IN z=+CHbC{wI_j$WCzTQJeGaQ`X-O?)-le7nxzIABo!ZPP~-n>Z5hj-PkSG8ROk4|g{p zsBhB#0*Zwz_dX;)?Ncv#1u%yZcMBKbIJWa$B7))=k8> z0_Lv(g8oAveG0G~nn#E%I?CI2tyX7EHxajAt%1xt{L%oeCB}gT(z?>)No!VWa&zIK zfXD^XEAfVYl;Pahb@MLMKl;1PnJuxQ-c}O7C zpuM|y4H!oxK(c`L8pqvB{S)ATa75p6A5?r#iyhqQ2={r$6r(|jxDiP{D8WBe1e;Z? zPii~Dp%E^0m0Kr8@;L)!CYgUk879Frh80_1;Q#%H@5W&6ll*#a_(cNd@7pE<&TSMj z;Omt5j%&PP?+@Rw&H(jRzkj?-f%8Huk zJ~6;oG7L(2H~>eDFfiqWP$Be_n4pS$DRL4|$H|X-ndsjZ6u4hK>B|}|jBs%e;W*0F znZ`uLy4?}nPF{;wb9rE@pm8_X(*uO)6P=sr*T1{6+fUcrb+|GdPMyYbagvDCfE`4U4c)Rs15rmPi<Z*r?o`v>@8~OAuR3Oqpvu>3C8f>cYP=Yjl~h00&9w zMmo~02s?76o)Fr!j?v6tA>BDnU$Q{jH!LEX8?p;;y^mRfjTWeT27k=C=qZ(AIR!@$jI*gb1l__0fR*It$oeO=8 zm#T{rn!h25eFlD2z8b$}FqAIY!^Co#Oti5Zpsl4u}>7XU`;n)kN+H%_xKSffJVi zZQn}Flnx&$^Fn<8wNWd!jd%Vg6>!QS{Km8I=mOvLCy5YNJg-Zy?;|*w<#*#nFFL63 zS1yy`{q0d`7n1ETLxTs*&x9-sg3N|{0aF$_w!T4fpIA4q-B5wmF?>17kzfgt0ZmFH z4?bs`?Rg;tl~N>}@cNSOyz}`Y#GX;sotX6P#r9HC)HpTNg=B5yTXS#EB!Uvdjt_3h z>?yhHQT%my=o|C7BjA(*JI^Oa)-6wuF98=KtEKv*_xDxk`@V~BY4g`|naqe*c`(n7 z{h85*Nb$-}xLb%buQ~kpyQazMzY6v~9Cw^z(sO%xl~8MczzC4;3$b0?o5zI1iCo?| z)Jp>tC6tZHOjl#zPL5*-u}f$^(9#Gmekyqdnmo4we$dVG{@gXG3`^4m{v6Y@b&CQj zX5A8USZxzzt+1y$Z0t_!8Mg6VOL(rP6?4MwEPK7U^g935ch&l6fHvzhwmZPGQwrgA zr(*V_j_qB~^*LPKog=s6o!UiBIs7~u-)w8{Uiue@WIYhHX$CJew7RCQ+CgcK9jsi^ z6)>KSsu63}P1+z!4ah0UjQ2Ct6rsTn%g_akK1^-EO)_=4?~=jYmuVEB&fPYwaq^l| zvqyH(XVjh+qTykIx0@p0wS{oUoz&eoJ^g`tA;G=rm!;shz2DQxwRjyk1=rbs_@6Ah z%o29czFEBstaq|Brv1x}i0*xtb;w6=UWUMwd8v)(5@6yho;iUXe$^G72<-nsIT zsWdp>s2lmSUl3+zk*98yTzw5=Zbg*6I7)GTD(E?xmLnjtvHZbmH=dx8m%hXurScla zP&;evPEZfbrfoi(<`-}}abou0vdeeta=ex+oB;e8f{*Xa-+sjnNFl98iBse~{>WoJ zDa{sc-=9%!q-D_LmZ+y9xZ}+UsK!WYzE8Zzvj+LdV5;N65l{ZM4m~2IDJTe7d2*e| z7N8oe&Xk&TZbSbb-cZU^C%{;}uaCRCg+`7&3D+25Qru9fs^r#9H&(Tk8_1s+f04A> zl)fT6O&(;?lm~>hN4H5IZ>% ze45AabHn;n7-`g3fv)6Wy52vRah-b*R9teq_79H4UuC3T8c71-vD02ckzZ9OMJ4ZA zWloJW@us-tG=bcNQQF@m?XkP#PJx-u=&YLJ-w~VQqC%O5(y7^=$idH#JGok?{|#&Zy}G)ASXQ;FjXoQ- z9P!L`imhG*Y^$qL{hO*h*Vx0X1ip}+)(X8b*zb(P4i1Q}U^!T_=sz`baxy>7ox^?f zU*@+}EcUz!kT!O7EmNnDAi4^mmp|8CH@Uk?r&QS1t~@@OQ%~)ny5rn|6**oD7uiN2 zcd*$!B~lX!6YvV=u2D2Gvg#l+qd&#oNWtYLLnN$G->t}5lXaDlcU=ld&38Uog4$Kj z4YV9=$J>zjzTj+mHf{T0?vStGCN#J53>d<5zGm*cY|w0On%A9DsNaJh&kt((-o8Q- zfZ+qh{c5bGWK$3ObF+2I4SOhk(&YHFvu^vxNh$>N2w0J8`y9%=Yq}hGUG~;8}A_Vg7^)}H>$3tw+Nd0P*g?cJsyo)OYU72R);ych^LnC>| z;6CB{>y-kh&(ogSL(&ELM#>m}Y ztCSscr@^d%GQJ%K$sem?yrSP4m$S7J44Fb5@)@>;0~_uQw0IC>leHY>N+NVX?R}5& zAr3R!td*K7ig=hyoJK$!3_>MmQ*u6@gddDEuHuCiEvl(h8G zUgo;UX`QU;3o6F-h(X>0zEv|1Cx-Hd@JqXH%K#k@r^$)(>V6}8@=~6XeoC>ONQt8r zFknwftw5AypFAkLqfPyeC884M${md-s-%WV+Ma1|wH{Y7L@l3rE)j#@K_ATICWZtr zgBnW`oe?s7xE}Z*E<%MQFZ;dZ0Y34n{{cjAd1siGy5c{Bp_XS6V?wlXxRg56wtbWe zSq10NQMjNW6tYoFJL$FBxuc{_I^lYFqV`t(e%%m?o$>kTMgwv$ty|l`PyKdc-n&!# z`GhGSQu}(1vUPk#d{}|)Z3!)7e)jj6viqSA*SK=wlx{mz>S^@_zzg}tSq)J1CRnm~ z@ceFR+gZepgGr98C9RfVcI&^?LbXT!3F}e`4a?!HwE#dsD{CALFh44~%~Lp;Ow2tV zAx|XTn~OlJXBTZ2Quv4xD(2v6p4iyD!oYHI6n7~Mb2V|D!m!X(LQ9p2b-tHumL)I| z>z1*1AH*F_%BgB1cQdK8qkRJL|5InLv838w?=WZwErbnkCl-EdBNo_=DB8M^|Fwa9 zT6vBOiS89zVbb9@GIW_hi3vs|*%x~2ap(+u-Ts6hxZcw7}%Hr&kjMNjg#UMGQ0VP3j|C3R^|DvUV`LmE*c!TzK_PwMG^H8hvyz}>v z8nJXk5)Tdw=&}N2o5sO;iHq2rO-FFLql|=iee32d{ATJN*5p=E0snL90&-PNozqUw z0|jJ?3)!L;b+ybv82k`we&mAW)o3Hy(Q8lH?%wWq5jX$@s% zzvZwyYvvdJXred$@JyZSaN@K}$>#2I8VHWDBNs09&2tq(1^rHX@{)8eDKG(4t{ zt_noKtr*`p((zy#=MXHWn^YDs6^%_QT;v%|;>|82kN!vh$EWnp6Q!xI!4d?YUp1=J!@6}O}ymMS&~)_)S` zof8#fu7vHsj=nV?87!yOZr3Co8YRwIWdDxu*=#Cz&MORk zC3NzqgrlQ5M8;|+laZB+_~c`=y$SaZ*1geyl^1-hgg2NXQm{(r1y)^ zi=uguDB!S+Aj8mhfXPNoPTz?>(N=+`usIJols0>b91WY3DxoE%u5vM6x4HtajNDY$ zRtCm8NA^3ngNutL(>`0J0KL0zA1XzPHU41Cvt}vr?RpF50Cih28sWAz)q>;u#)?_+ z4|%wt@T^@TUx{#EbTFE2T!|ZCK2e5bPAB51BsACBi>^&Qz~GOPTg0m^Mqexz;bJV5 zp!-N;_cC`jxVKjg+$r*gCZE`qXIQ`~8`jm(62{_|7F|_Uq^x#{>3+STDA~dN8QhI) zu+;p$fq4q`5U72pPpw-pwbx!l)S8c<-p^;d*0XinO}_=24JY-<>3p2OU_1Iv!3?@t zgnt7#Ls(Civ!rPxtnXr&8;isRi>rkC={Soi(1V)!>IOXlV=c~zK@EA zjRHgi#u%~SZo}5iGon`}kR-}K>>$^F;kIqg9kj@A5xa3~z|3^5ar?ZqUQTid*kt9) znj006?J`sm?$Y7zpN`a1o(xH5cBCO=t93z+sCNH@G&S7q{P!p1t|1?>FA0SMCea`@ zAmt2hS59lUROA93A&}d)#H~x!Zi(QCU zhSRkm&AK3NQuhP?YcP^GsjAPm3z*Kt(^)_Vp0dgkO_b|YmBv9MkV%)WV=<8X23yTA zPX%^4!^nH=!G1FGI+SfGcGX*8%x^ynqju_ps*>CU8UwwYThsNJL zFS$YVcoF7jr$~dyj_~m$wx89g84kD?nbKitJdllL9;S-or|dCfkPpT1+=Alv=vU#^ zzDM6`mT+D7qas7c8!94X1JJ_mf)ZAD!(QBHf#RF|=mPY!jVT^47?0eoL|ZZy0f~aH z?1VxC(@F*82R%2ZVF&C=K{^5;{qS!H;$r>SF_P|jn7B!4xK5(=$?z4`Kyh^mqAs%o zkrW-w(5`=I4{M_Fa1P|$FiG&+jnm&p84DIjOGPxw15A;={}^y{rO2oP9-CtvD-a+_ zHC94CoY7LH*9ISd=Adg?ip6)(#XFZTGEcnM`Q#iwsaZgQxv25LbOGBSABqL!3t7DQHG8d+AQLx_1}ebMSo&)j#i!gjI>Z(J#XSv}4rXz}@#6Y1NvQ5OFaCx-fD}awh&TbYnfgb-&z#tG zdOLx!G0qZ#Ma{MQf6wDtYad6bV68|`+Tcl6d%4FyAAc^ciSDeR z4*bq~5_#%++@-=?N)cT??H>Rl;D46=>9jirUxL3MQOy`L{@Ic$JGG=|c+5+mJz$xt z6q#6@s$Y3U|A2eB4vrNG=I`$rN*AnFDGD`8MiZ%^Gu?kR`|7cOHvtLKnet7QE zmdlpJ+=|Bx)-LbWoUi8o&V=XW|AN+$HlT)taL>1sEp5a>M!6e{0}PT*DlJZ2ft3j~ zBm9XEICPVJ$co}Ks+Q<6aW2JZ53zRR-ui4TE|MOb#XXrkJg@A&pLHKr{D<;~8Govd z2tGJFUmQCc00bHs^vW5=(4x4lK7#)`M zQm)7)W)V1dZpCehKERN{gfbo7gmO-WKX)SZM5&S=`|ME{Q{n>T?UMl{}RyVVdz8Wt>lRuA1UMhJ}Udnb2 zH36>DE-*{CP}$6fyaKnefdk(Xe-_^0NNE-(Mpqx{F7~%Jab>PTpG@6LBKx7NrBp24 zZsr50DPg_|g0n2523J6h;-}Ai7LHnywzWJ(S;jQ9 z6_&+60U5ictkE~pa1;1hwxbf{`TZtSsf#U?fGMF?Vg?`dCbY;Pv@=^E4R;vq6iu7V zUBa#~e0P0G;@p>_=p#ypwJ#RkU4#J~gw~Pj>j$G#91;Ynnc;DNepKWhN{&NAF&S-Y z)mz>x%bgmL+s`L_hw+oleuc!T?I-~&{C1k9e1J9xSq9 zly#J1u21rgVn!w@cuK;qm3wZ+{|49&vTp^%%$LiUm<3xSG@X@!`Hv@R%Sy#5pW zYI!x;5Ap4V?i{2ccx_S>-47*SVP-F-Z@+8T6*qklAIcXM0G0x?Rk4uJ=5E#EUH_*u+LAhKa0yWNOl>!`89#t150RiKT1N>C9iGy~L}+?7}! z%yAa7A7Nq?Az{i(>C9ng(R{{Y>>YPz=H!ld*YWqgg! zIq}|5%_D$@XpZyDRS!$nd5xXNt&dv0SoS6PFp#oP+DCcJ-n*L0#>CD_h7xK}F+G?D z{u&rAOJ?_}>8eGR(5o{^QRhx&i=2=CY7wFcn-yVA3anAXC6E;OR8qly7i?Dj%fuG2 zL_onzJ(+?E%N(5~uWGR?>3a0Xjy0eQCucuRow|v_)oF(Y=h5?fh(&rUJe-CVDM6lA z3CJ~pmZ(UNO|n6ARP3DA!Saz^eul9?ZGeO?f#MrU6o8cD$&Bw8#}ovo*}HKPt0ncD zNSXHoQyGbMS6OPNO>{2@=RMcSTL@4@}I)T42TK^=XK%r zflA~kSpWiZRaWdpWZTcW9z|v2pDNZ&P7}8=4I8KmFDDlj2Rm_jJMlw9yDgAVwoDBT zF=#JNU{qA8qLB^a&^$$8~4cfT!iU&9|+BI0Q)=r%v z@@;xUnWTj%N)V?!k7UfOSKY-{Ihj69a*;3^!VxnnC2l0uyb_I^E^=uhjz4v5@U*7c z2^ft#sT8w~vNnJjH^IrHA9Oz0b)yp_{yZfyN@4AZ%W6|e&N+kOyM?3nxl}343%995 zkg6#FqBF;_#4Agqn@(IH&Vpim`mI=EH|h&_gE%jDAZHVuvNRPUzbsqU9XDKaz40zC zwdeSauF$m`45lZxnx?LZv$d-7)c4O#0dc)@L(|D>0;W63B*{!Q5%(V>`}!lk`h9c^ z3J1WW6tkjZYGVeiYbY;>u1YLI0-XAnJJ_t_^{zq_v1xMlkcFk`u{i zg;0x6yUJo@=Uv0ALhYKwcn^Z5HqtEF@~Cn=24L$gm3$=Wir?$zYNTs67S5cW04Cm^S{&mr6^R_uY^Y#O1cgRGWQaU&z#t`h0O0hU41SHd z4u}(R)>_*07l^!Sv3;emup*r_OQ88IFGrnw-^eqq;ZrKC%sMyMq89NA zZKbLUE9&1Q(2wpvmL~gE;_wWdIzWs8kKB_n)qa65k=B9Z9;l_oZB&yFm1ih%|0c_- zg(N_nIwdyv#CYV<(Fd}=(~gg7+@|7HP5)T%`h|wvxGeo3`Vn{f#S~UM@qH*5)5Jz9 z5AOg>l(S0^cpP+HC1Cq;GD9hf^nryY@hl;tU3BCdPanB@ZSA&kRgBDPU~3q$A1OyQ{aoo#pD?J`dnb=(HC9 zsaNk&n_O2eRS=zIeOOA6CrLD?*++p4Lr1BqZh;)s$BnuS6RC_R(e3*AQ%Ex^yPEUp z&BkF>rRM1({oJ%|9T=Eyvv!Y4wsVq^Wazyvr>E=i4DQ!X6~O zxL#FsCW4<$m&+531>s~u!&iDbXWzd+I}fXdH$ePRApg(_zl@^t9~xxZVN?gjj5OF@ zo#ardZB>0W1QhT#F*>OiXHR&kw{gVtu8^{whS<8fHuGd6xHji|HcIIBb@5X*c0Su% wbpLm5pga7l?c2Kq*ABPz1-tw|dwxSyrPX8>iA)-KKjZ! zy|N_x9zuB6=jMxw7EC6l^uHb=}+OF{MArGCpQ%QR8lQVD3L|J zpT9gH>XGa&@~Ozj1qSV+l+p343|$Fso;SLS#CoPiAPTW|+_F~ILPk38g`seg`Wc-} zpI4LLd}(2`vttGicaHG9jJmH#(c5~$6EjO5v(!sH2cd8MkocI*Kd@g0+C{0?dS%`D z)L4Y0lTapby>0AVW6Ono>Pm=)6k#r{?Lk*AD|TT)lxo8tv~(2WB-wm^=6gqmRI`js zcvMZ-qyw#NV^h)japr1UW5`X^4(ZnV{&|s~OOs??zx!I#qTihiQZ?B<5*s`V-dlGM zt)Ct9m{T+wi#Q(ME)t9Q9Z-lJVGzW&jQY*dbX;82i@UE~+V5CB`XIBVc&H0k^7t_G zB*(YMfN+9%VZYb#B*S?+m27$Py=(sr^;@nke6uP0jM$}Bv|4p=SB> z+wXq=LG$Jh7tqLKN>Co{ojzLoMm?h7kc*j%fg4~LMvarp0%NJGk}|Y>{o5PsmG3Wp zJ{}eHd8-8zMbJvC$}fg()%ppH!@7*5S;qad&AA(#`VVinosk*+XKA_ z+E#zEvJ3Np%HWJ<1wFGiV&&dp+H+xQDXmTY`N4vv9;oS{DX~lN@QLM+V~>GN(>5!$n2$-rL4WRluKXreW%5-$;C)>W^&($><0`LQ*bk%~&f8`( zHr0lE!lh|)*{@e<7j2ba()?Mu*C10gKD9ML>twykg&otfSU(admN(_*m>172(m_)O z@mmz!vgor%y6vsq8W-~D+jzb#c-2H;X}wZn;8Hk+@c5>~y0X_<+3LgEN~StZo~GY3 z9F?eym=$uHl;|R*%i`RhlFkRN{vjEi&Vq8O!5=HTCdU}b1e5N>8C*D@-PR8Xxnw)` zedECAvPnA~>RH(%`}Pl?lF}aY+n;^lJ@W-QO!x_JW1zl@7?f+w9VBZT=oFspZp?7h zCa;}2aySb0hHp+%I+^%q+0De%l43;8@DZLv7@h4V?66jkJ8$~J27>+Z)G=ll}Rd~M&}r+akX zG!xf{|_V_Kni@w*(2DY3U*9q~ved|&A6qa>zp!>{Gb|y#5gYU(~ zc}=YssN-V3rYJnHGA{Y$oN)6&B;T_(DVK|fTTe{P%>RbZzYN}Ixk4alEY*)920jn% zWDfg<(Gws3W9^h(9uM0{`EpQm&aht+1XB|)R;_eFTN5pBacC3rk9hdgbXEitm@?g| z6?OUR+Pxd}bg3#&Spo8&xvJBJ%Bz@Mv`56b(^Hb@vMEpuk%S?FO8~hz5+*KTR~(*} zGwsOa0#7V%38S_o`_F{oQ=a1qw#t2Z+dn=Lz$Meue+Lb*IpUUck}~}^a-E!7oBLcI zSJZK%(MWe>1{(&cD+7WTFqmQzeha|hTY^-&EfUi+Zs7?jEN?Av0xJcvXXqKy7Rf!aF_NBp?v-0Jel`SPtIIDS)HM}P_|a4 z^T>6>VqW?W<_oawn4VABGHPpz;2=??vW`|bTk*<2Iokz@cQ;|usL2G3q0Mmh&D+7c zTxtD}PH!mpm|`kXMq8g*J@C#)+{_TX+G{l(U+RtT3EsRUgX8AOs~%##eMu5Ltj^Q- zi5UVqv}s3!8#3vyr9I!R@R}pdSenEob5o)5mdpsuHNLLf@w+d!-=rrarEa$tb z%I!aA{?6L$IsaPp>^3W_LC$qogM$U$0pGTDrN`|fqCpbkQ2^Ei!o{XQlD>}cnBDm? z4LmZ$aYbrEk{|scm-o4>ekM;VxX`oJ)d!eC8iiknf39@I3&%l`d!p5U@j?rO>uGUY zpV~(4=*Ay6rjNevuO3cQ2=VRJWFK1V>AFxV-oPIGGODaRr`OCG+-a_og=1&sLM$xs zgwYyg?Ityr^_AIb?CSu^To zO}f={V8rfKc%A5p=7rSqf2X>W?!?0C6fqokm16S;;O2=m84ofa`8rTQWj6vF|91)SfnU0r{V8C~;=K~&1J6-H=sTk*hK zDVmSBHF*)2L6!tdWJPx5Y`zc1Df?uU_^`(TVD`6HYFBLdn7Fu9Nex4CYQ`Qt`cy@u@_CgFnRD#sMRRVu(8JoL2igVsyi75O^k^Qtfsdqb`Sd%7XuhTPW%{nPCm zO_wAp=HSg^>?8n22`J#^{vmPaxxH9A0~%LgN4zcNE$a&PWc8@J4F-200aQw?t1+7& zg>Kx?{}2@_)T$;D5o3e*(u_pHqV^Y{}EKC#xb*HFySZ|i#9 z*$J>t9#aT%7;RZ+65!9mZT8?f^7KVIn+ORpK}~?%)FB`yTg7R;zwAw{G#Q>4SFj^R zqVRqIF{vhG2qe&TLz!1~#J6wzA2kOJ@)_?#1VJ%okbCt<5^3Z2*d$*4l^aB1aB^`!a7b55#{pUdXZX`$SiE+9o|X) zhG0{KGeMG#t4GyQqK~CDEE-z%q`QO7)tFE{jK7X+IkV{faJ|>tzo5P}il#ZER6305 z%!Lb^1~*!Her7Y=;ma))d)~g5$VMcZ=e-+tJVLXSpfVg5BOI?cxfI@&r%2!PI#Hc} zQMwkvlYFXCi~lQG-<(T1VW{Nzro1;1F>|V~rGkvF2f4cjdFbK-JWc^nQ&H7XRMApY zQ?pUk*45C`)zrM8qN1y!5@y&?`ags_e(tyMq5q%2dX`oAlmM6-Uq#oTu#x`(sR6F= literal 3804 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 diff --git a/examples/stocks/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png b/examples/stocks/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png index 312b325dc148dc290ea2dc6b6e62aae852ec0ddb..929edb5327696ba6f643a6c8655e0c050e0b93b8 100644 GIT binary patch literal 7587 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 literal 10082 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 diff --git a/examples/stocks/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png b/examples/stocks/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png index af73fd12de3d537fe02881f54afb17f10f572e05..1b8f3de80a738eb931ad587893e7255a192b6002 100644 GIT binary patch literal 8627 zcma)icT^K!&~_*yNDUxGdI#xUKzfwWk&blfpp?)-dW-ZXCG;*vKq*4#i1glDsL})i zLJUa%^84?7|MQ{qm~YtE^lzd%IM~tD9*7V0R8}^m zrUlsmfG;STThwqQ`$5`UXu-=Jt}b2tvRCNQtpx7=i~1)@p0q$9wFA|X{d#POV@}9P z?r)UwTwoZo<`~6HVBhUh^DA2G!biIIcHZo876Aqo?=Wy{S>tM3CREnGFjy$9cAJ`Q zaz1!1;VTGhrTKrU|L4dczv0ST{&{Kv?sV9d^ow1g;JXsqf!mD~D(irg0jx?T%ROYT z?^4l$1j5n(MYpJ^;V4l1)=fw*VL@L0B3R`$2|YWEAlU0pS8??$tMabtWBk?D?}o~G z=>@vcRDCcXofuzD)n2HF`KBw@j`y4WjIiT+aPfQpWEaTz!vdM@n+R3J27!3#x7Od{ zRax`Qle1mM?CN*BD3%&NQy7CNVk0C7QzUUP{(XcP+Q9Rx7i-8GNE;bCFOLOL;NS0s|eX39J~D?MT*x~7l^MCn7Swd z3q|wZ7pVRlau4y=na*#;{qK-=uxwr?*VVc=!ht7$Z5YOacE_=Q^#9m z^9@2e44)MzBD@x{wd;LFx`|Y=hb9uQH4lWVUp6yTDuWO*SRaL6_s7#pVg$0b4&-%5 z3+M9_pNvwdBr?k0rF*Nb4BAyYd)KciMG?E{-IthHismY@m)L$?pSTViX&#%IZO||M zwoKnpnKeuOf@Egv{h&;?Rp5|49~b+hdMRq**XE6^Lv~Pty_;!eyI69j5iX~}7Oh*z zcoa4wZU<)E7N!%Ocei8L3(Lya^i>6tF0%zB+U&U9H5Hm}FmlPC{L;)yO+CM|ErMZIFTWwss5m+rr0PLBDL- z5S43dJ7`PdqOd(h5-2+3JPFBn4-9!;d^7l=2aUY zUtqJ2d>soKm0TdZgg`z#+`XB2sJJk@(sabXa{-X7oQj&sqlzWj6bqzzCgporN?Yq)D{XotODG3)uo`R8m&jNenqq@9$B ze0?TCY0{akn{@QcM0!~>!iYhEG^F8~m%w8ODTv8b4?#*|!t7OP%oM08f?#jHJCxQ+ z^1WCD2o$x6KDoJelB01xKn9FPzkpEwRXE(iKAFKdC!hqLCTvgw_J z+EFY^R^8vx-wb^$Hy;x5WH$)WXDZ&5ezWk573lk=I~Hi;KlD<&BV_1g@Amra9n0=c zj>R7IT(gkiYxv~_Fb zdn7ufP0Jf?PqL;fpkRE$ql3-n{HY6p@xWx4WBzr_Px#Cm?A&hQ*}C7`F9$Bd++m4? zB)u(Oqw-Z3%!4rwA`SK5Je~TUDv_Z5l=*{BBBU>jJdj3+dHYz-T!x`Gq5I@Q9ytUO zW~mu=J5OFg4ZAYoTS=H#KrgGN3&d(^cwrt(TZ-7U^cf`PPJuA<=@lxFx$-JI0zzTJ z{zTLcKl%JJB7c9mdcfE2_-JuzXlKn_96gaxh=mw2zB+!GsJBKVV%{dU@A40E9iyau z`bIvR=GkIax-M0FZV7M~#o*_>v@z4K%3>tNERi!5Ggme6n+omW1(BKgx3cB5W`0Yn zeaoM^3;O$EX@<=BI4P&H?{Wi&R)^6mTmH~09ckR!&SvGnp*H$uo`U3;k*}JKMddt= zkTcXoTtcRK{8)N>c%+Ua9Xd!6iaxi46VtdH@EDd;cZD9t9r_73OPlB%&fS~aoutso z;71QWdOB|?!7P$Pv{*_%K{o*>r+eHfiV{Mg!xUpOH9b&7Z6p*5gM2DFDeVp=H@4D88k;gr$pqgE83E=||Gw z?7OQPwReT-+rF3nBnrR85~}E)U`~fo4*Va=&7JysodY#rD!fZ8?qLsxOCNpthg8Y{ z@8$$9B)8VY6^!iU!2LpRR+?GHTG5atP{*gw8y~PQ&qyM$%TEx^)?)O!lcdpQtB;;* zZ1OSF;G{6q44;V%4DZFgr~`_B&lXfPZJV;LUTpih2yS+IHGr!5K47DgP zK{#HGR#!Cjo$n66h>F#2x$$G;!hN*0GHfitec1lIX3ho$9(})&gwH@G_|)UMO+A$2 zW;Wwmn=Y{7zq$1n(aJa3tSU-iq-ZqD3j=S1&B<#gl5+CV;yMhT=*4S#@ehPR;-|(7 z5-ehq&ox-qG@@C2C`Ku(n_|!mTSk5>wDNIsR<2w}l2x%6}W~UF8YguR0*NWEx zzvQskOtH1?E`LIIf2$K{Sx!yx}>gpydoGnypM{6KKsqhABH$m=IkxL*q5X6 z?!wkX4#S5~S(6nhj)?jCivW*A={Hy>c0% zw<3%=a9;YGYvB5XA5|Q(czO9txXp+#8ER4Pms#^yt~A+fBt@)6tv|8GVT5e@K09D)+Ni_#YkqxcdYJg`s1uer)N`C2=}}8 zZdZm;321h1+IIgGgOir4l6J6~dOF*Rb;DBU{6J}Iz-U+bYBb_%qdhjDV)JOEK>Ga5 z4P`;5bhE&qh-~r5tqd&}Luc%*SzLBu^J5k0yC9kJ_t|elHblfrm)^o3tuk~LrJl?*&Av)%^X>Jl?!Q7EU! zo#CQ8w~FjLD89suihtFzi45?K)CV*2_-L9#uHieveyryrdK(%lG$4~g=jih8^q2Ta zwa4e_S#qA0M<$BsD^<|=<9vy;~TjHWOP8lM$3rD ze%P{^#UCUT(c#%^;LQR)jjk*-8+IkvDUxgwHTDqU=nK4?bnCZ#PqoJf(mMT_d}gG+ zmblp8C8EqwZi=N8)fQc4Z!3DV*mJ3dI{an@t%RC=My|VxE?8he1TGp9qdD?5pCCn8 z@ANFuu8SO4@qGY5?Ui?6&ZXRqh-u@+6?+E}$G3cz2Rjf;S>L>zlO0IE+lVy`Gvo~m zQi`UY=(vm$KL64vS9*m}xE((wS4(7MA4)~R*9_+j?RkL~Zjz~W#VT(uOlyTLOlej< zin0$^8`dQ`u%Uuz{YoJYy*uq+knpv>t9R~?Y^qykdS$75;CB(t;)_~T1@}xoH?;Qr z)VTp|%um+nT?uty71QK4VF_qfu(I8Q;9V6-`z*g-O z(0K)SW>N3s_N&cK`HAnKVWqNGL_pYBW!A7TTapJUXF<4R&!n@CB}HVa<2bg45{g8 z!&KNXk~+FJNZN{EBk!ZV8GMdI!qx{Z`8C0?u?>m)jEz>HuIiWFJk5@;kOiuS6D;7+ z+0pEokhZaf4Q^BGve$E_pg#XYQhqRwI`^xm7TbpOB>;2fiJXvs7_Kh7APB*S^Vs@A zIf19^!|Y)myb8;?UilA7j8gAqlQ4U&Litn(@iWtD4Zpn8nOhlDwMhAq&H+fZoKYVA z^PnV7X*}aR_;jRBD&xhuVa>W#?Kb4H`S1R`CShT=ozT+X;{Gq5_3(~lS zjpxnleDZy{Kj&~}M`sFkrA3pDZ&Joj;y1`n`iQ{t)7wC!>e5>}AVn%0JG*z+x3Giv z4~(O3BhFKQl(p55F21h+tAug%x2|3Jd1Ef?w=YmJIwra+5NtbMzaG-?>3;L}{>C2t zyp7|t(}lq?;@nzx$1hD^M1pMY4q z4Q|Q3pGUQgjVMz@s~p1OTgC{M2evJVXt9cro^Rb0g&39n?!rB&s|(nitLXBVEj^P( z%5P4stzLQCic0Y3J;MItgE}p2wOkeqjhrD<0Y@R|<1a)68yh}{|G;-EQ-Rux4+7vg zLw7za|ER!#rGxp}HsPvWNEFKA7|x^}R$5)RsBj;15&Fg-gtPU|B*b5Dy+mh{xo+9~ zw$B#40z=7Jat`>H)%8e?Q-qQ@3)$#pTfQIwwdJjaHZ*V_RRHeTS=n*G$qP1}9L}QI zn#%|aEFG}i-Gxk1(zQe~65~ zwUBhWob9Zjd@F`he|skFKQ1Clb?}*+eNsRBud*Lf5->c*Ps?Yb6hV$;{TuOGTf86U~d6a)&u~y=#5UgdF zO)>}fg%WCTy)e+1(4-)fujGa#({|f5E` zs_fk9cEZ-vcvB(&hRYgZUAixiNH!rSGCN6r(UMn32$UNRBaa;j-j6TAtLIo^fr zS%oe=C_^a1LWfV8wZj;zvuBTruxM<6{0(hAn;!ZlbeHAe5BjiuJnXB!_O=Zb9xwMu zTcaDrZbJ3ByPkE2lK&Ex5}(S)yn68$3eD1zsB*PyFC58)7i^M<7#11`v@>9AMTiIA z{wc6t8`>e0y@u$=r_oyP>_8s!pO5B9Ht|iRhRo(|VRT1f#ug#0Z(w}mab%2s-go}d z)c7DyY-Q%GHD8>BEB>~q<@K&x`Bp2F6N&3%-iiKQH0jurKxYD%Fc+CWUA*`L~jCwJ%VIm1GGaNp*6^+R}fIgfv}?L0^76bloRmf-P8-h^Yp>h-ZyoYcI$ zi0hDkOHX`Bc{H9ch}G!B>T|&j<5%Bk{5W-3VKuE+_JR5m*Sm;5ZBvH_Uuo*mBG*b^ zXr)ei;@pMyjz)Z6dCSZMI1G7X7s|{jAo^YC6=dz8>p6P)g0!EI_s#C}fEnG16Ged` zs_-wBhyas5S9Qvs@2(&vKsuE0=!7U03RQ}{ee$Q1$HbN>oD;mm(Ds#Ml{^jqATCv2 z5E@R|{*BLQz+o71kZEgII89U7Dy}qaw|9@~(to7>BP7Dyjs4!iuet8516`D9FXlZe zSkd6nh%pK!D3^JHlH{xK2x9(itl zBPD=UJyYsPJ-#K~yN$NL&6u}ikEvaWjPYk{fQxD=B}GX0cm=5-?)8Bz|4^YupF^pr zQNhMo>M5iBRiz6+I9eo1bIk0c{$Cjvo0D-Tb-wop2XPdih=1UD)RC%}+UaD^v{`Q$ zo{kRgTDoP|T6WVx*xGy*c4FcbpEsXyp)#)`;+YhKTvU7;XBC2?g3;4s-IMW>X$xyXw88srqOqqrxN(86 zLebo%Zocv<78{4bAP5w}1#Y6Dx~Wv&w#tNnK`UehdgY z#*>SeT9QXOoy+W90S)X<9oZf%(Ln(n?;f97a)Pb9I%G+}<}4HuxpcNndP_#$7C5*# zY?sxA7v(G75u(iRz?t6lC&SC}V-5FuQoeZeOdsFlO?}{K=b2-&BocF!1Pgu8TLrW0 zhp569z=u?C5-o!^p$Av>2d%^HP(-E8Z*PygjnlS!+s3}YHK}49C1K&4OCIyJlTVSPI#47y_qofbktwrB^4EnDn9oH%P@e~18R+w$GUHU^gnq3|08wij zNmhO)g33I2vJ+)4^~dk=`p69w*_e9s9uL_)O;91_fvxW!hxlJAmKvRw$#Lq^=aZ;X ztBCajScM1jyBv+znemwO|Ni_|bn+JO;M5+yMe5BS+eN&V@BB7i8o+!gtd`!=7pP(L z6F!O1_WTYju8%)5Bzpyh3%#QJMG8%y25&-ufRF*b0MqC)9sE!UPl%KuPV%*IgRh3TDQdby9{u2(ijk%y@E$j=a8^h zswV>UG*X0G7p#}hix}CrP5oo}fOScD0ODfApD=v;|qC>L3v&lHuW{1 zK7V0(C&ora(Gtse2rCrOzPbK=7l^2#a(_PY#yCW~9UQ3?`}D0AN0H+nU~fCGpu4|9 zqDqi1m=JuY69%qcS%Jo%>sV@2v_CRq<+xz?v-eulE8u0PAeqa%vTvQjV;)-nG)vZD zX|oU$teeilP~7E7Sg*1y=gSIt8lX&z0_hK8(Nfk5T$si0$}DxVsL_ASbLj4TERR1Y7T?d>c%l|rTM@%1`_vPVD zbLnmQPgHFW509RnyHH7W^M{y=mSQF)nN5Z&L!n; z2ASR?pzy*fe|Ur0n~et0LczZFhc-fxZ~G+V3^F=s9upGHl`;BMCz+mg&)@@ca=hvM zV70WqyCZMutHcob7v#H-%OID0=|xp;p!s%!cY%MIkma=YXVkHi=eFi z){_NPNONZ594A=>q;}EdlqP`V`%(YLVtK=Sb-R=3V;r>m$u*nJIqO6{9WwJj6QjX8ULC--+YzdjJ=Ghi7vjkZyLU}i~L zGScLf)nn9CaW`x08OdX(!Sz30AJ>*#y?cTYvIkGK^A2TkDJwx=6wLaOLRZGAW!8P~ zym$y^pOIxg)2Z%}*<@Un$s=BIu~Tbf*ya^~pw0A}FDJ00Aza(IhO@`iQ&Dg-u$I*% z&@MLeJ*FYX!fT72jruFf8=uq zq4Ad2#}5yf1LhoC#-zeiwKpw{w-5Crp=e%Q)w%Cgn;tka1a_^Bf_@spURIStV+6m-4!!g{Z4GTR+W><#^&(GQ}o@6pIb&RX($sQ?d9`uF9eEfeLe-*HaKmn#%HTve>4~$Mwb3L zcjJ{a8F{zCQg6)f4&JQ#z5m)*0>cqr>sMWw-KJ_nFP^(qd~Ua|I(r2V;^dl@N}^V< z)Xr@Pot<3)FWs^xG%57RId4XhnaF_1to%9nl4{-CW8G*Sev<(rJ~UHv-QipzNsp{6gfP32}ub$VPR0ngmApcgjcSWCx#1 zG803o){ai&3u@V`e|$Oc2a;>%c=$Lw4?UfVqX|-+yVm^P&{dvDdJ_&C%f zBWazlZrSajXhw26{P)2TwHo4MPC9SY1seuKNMDufa$wD!I6$-I^oUW%c-i(w!<_Yf zZ}(u0jiFjkIt8EIK%{Gd+4W5PGeQbcZ%K?D^a!cZUOE6;6N=wkz3r50mi)o&vUwb% zKgd!ZqPczTt2cl{&_#aDJZv)o3{kA84!ay3TixL%k+r+vjDNE?#3ZfdIs-~*f;`fW zK})XP>gEc3lD!j1+OLmj^*@ghA(W%bFT-66^yQV~@eMZ>@grAdfP^M0R%c2 zRSWZf%Fvi19mn-6DZE-(Ip_MN>BD^SEDg7vIL01E()x7@Qtt`$9)3}B8~_3tNhY zDorF+S*Kt_`FHS`=^}6!oHJaU&qB=J%yz3GT$WwTQG^1Z#M|DjC3CT%MUKX?C0KT) zh|695s(;>aPn)m$7-p&L8b^w&+CS-8#o&4{K+wVVq-L1^g21JU={4~W)9Vw@ z($O9|zIIh(#do+Os`C`@Smohci%>ibyPdNMg(#z?bZTH~CS|WQY;rb5ATnbcp_Qw> z^z|^P9DiD_MvZH)C^WFHRvunDCm_c#Qy$%LO(NT{u;JG#wt@;0_#&`qSOvXeq}nv^pgVH=fLIj!qms!*2h8C z4&s0n05K6!89@;#K`}8y(Py#}QnHeg{30Tpm>z2Y NP=BEVs#URx{6CuF3?Tpj literal 11552 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 beZhU;(9^{7?WcN`JOh;F)#U1B%) zfP?@5`Tzg`fam}Kbua(`>RI+y?e7jT@qQ9J+u00v@9M??Vs0RI60puMM)000D& zNkluxfbt<$gz!K`V}EL5jK;)7OZ zeDFa{ilRXciHQUwM8wc2K?+eD8o|Z@mJf?mN=qn^wxM6Uba&hRxO?x654#n_0Bya< zODDOxxi|OB@6MTX{xgSE75Bp!_sK@Vqu|@yXNTT8aAL=Zhue`2tE$^}>|(WdL5lLH zubf};KY{BStADFcZhvCcGyU=CwnLi=^MfV9#lv+%!xfO`_TS&#yS99J#raU(*uVo5 zdFJ_+#*fw=n4BNHhv1$_$D2E!T~_*N$i3VaZc2+&QuvS?%ZY{t-e0#bFK666SzJkH zpt9=Kxw99fZS-2C)o{Raprz~N*ol^M-L3mJsEYq!Re#;O|Mk3aIg^VfUhX|-IY1x+ zG21^nj!v5qyxMo}i<-;I_+GPD z_QA02j$OSRJ+olmqROiE;aJzm!TpK8%Dt~FFD-Wi1HJw2Oy;Kf1!c2*<39`su7nyR z+EzTZsIqE(DxDY!*b{flcdrGfOrKmhsr`C0lYapeti&J#HpGV5lCfkgkpW1EU^&oq z?Ra2<>)L^j_iwy|NZc0u`44Z$y}r`9%UXLHm>5|e*uq$_1zR!!W(#3QI7L?35*sqc zHni1FomP0M_sp)tn}-M9e{6fhm7}X4eyXLrUf?QuAdfR(12Qm{*dmR1LLx3D$f~tu z0)GtS!FU4q#FgqfbLZ4H?)mZ5?x7Zm`sTw2PwiM+u_>HvFV3F@5+N_{M0(;^NkIw& zcHBhF?R7Ls2F5T1qRK+k3QEVAaVp|^-hdlkv-0UZbz6!HW-KdNeHX3niFB;{WO?zV z;M7SoU2y?bmE7FCrSl(Y4ArJJDeCq)oqsW>2T%|}p$b)1QAS`@@THcE&52YT3Q+~2 zH+(G_Pk*`bL{Y)?J4HM`H~*cNcc)#)leDO+iimuD05UK!IV~_YEiy7xF*rIjHaaymD=;uRFfe*Sv!wt403~!qSaf7z zbY(hiZ)9m^c>ppnF*z+THZ3wTR53U@G&VXlH7hVMIxsK`919r$0000WMP| delta 1522 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 VEpZxMm$Lu>002ovPDHLkV1h~78M6QY diff --git a/examples/stocks/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-Small-40.png b/examples/stocks/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-Small-40.png index 93da7f02267fd0720fce51b1f54432ff33c3a948..e9a6b95b1663d784bedc2c13834df8a5b0eace5c 100644 GIT binary patch delta 1396 zcmV-)1&jLm3;YU@8Gix*000A=FFF7K00d`2O+f$vv5yP zfP?@5`Tzg`fam}Kbua(`>RI+y?e7jT@qQ9J+u00v@9M??Vs0RI60puMM)000D& zNkluxfbt<$gz!K`V}EL5jK;)7OZ zeDFa{ilRXciHQUwM8wc2K?+eD8o|Z@mJf?mN=qn^wxM6Uba&hRxO?x654#n_0Bya< zODDOxxi|OB@6MTX{xgSE75Bp!_sK@Vqu|@yXNTT8aAL=Zhue`2tE$^}>|(WdL5lLH zubf};KY{BStADFcZhvCcGyU=CwnLi=^MfV9#lv+%!xfO`_TS&#yS99J#raU(*uVo5 zdFJ_+#*fw=n4BNHhv1$_$D2E!T~_*N$i3VaZc2+&QuvS?%ZY{t-e0#bFK666SzJkH zpt9=Kxw99fZS-2C)o{Raprz~N*ol^M-L3mJsEYq!Re#;O|Mk3aIg^VfUhX|-IY1x+ zG21^nj!v5qyxMo}i<-;I_+GPD z_QA02j$OSRJ+olmqROiE;aJzm!TpK8%Dt~FFD-Wi1HJw2Oy;Kf1!c2*<39`su7nyR z+EzTZsIqE(DxDY!*b{flcdrGfOrKmhsr`C0lYapeti&J#HpGV5lCfkgkpW1EU^&oq z?Ra2<>)L^j_iwy|NZc0u`44Z$y}r`9%UXLHm>5|e*uq$_1zR!!W(#3QI7L?35*sqc zHni1FomP0M_sp)tn}-M9e{6fhm7}X4eyXLrUf?QuAdfR(12Qm{*dmR1LLx3D$f~tu z0)GtS!FU4q#FgqfbLZ4H?)mZ5?x7Zm`sTw2PwiM+u_>HvFV3F@5+N_{M0(;^NkIw& zcHBhF?R7Ls2F5T1qRK+k3QEVAaVp|^-hdlkv-0UZbz6!HW-KdNeHX3niFB;{WO?zV z;M7SoU2y?bmE7FCrSl(Y4ArJJDeCq)oqsW>2T%|}p$b)1QAS`@@THcE&52YT3Q+~2 zH+(G_Pk*`bL{Y)?J4HM`H~*cNcc)#)leDO+iimuD05UK!IV~_YEiy7xF*rIjHaaymD=;uRFfe*Sv!wt403~!qSaf7z zbY(hiZ)9m^c>ppnF*z+THZ3wTR53U@G&VXlH7hVMIxsK`919r$0000WMP| delta 1522 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 M>R5DznswxV0E`j;1^@s6 literal 4058 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 M07*qoM6N<$g46ZKng9R* diff --git a/examples/stocks/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png b/examples/stocks/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png index bc584542f54d7a7da03c8dd85f000c48d65f991d..bf55f17cd3a5681dd4be646b5cd53df708ea3992 100644 GIT binary patch literal 5633 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 r4Tn`2(zgX1P2S zfP?@5`Tzg`fam}Kbua(`>RI+y?e7jT@qQ9J+u00v@9M??Vs0RI60puMM)000Mz zNkl|*yHi6@7>cs?whd@ zBobp|gXBBsJ>AiJdh@$yzI)EOcLpLt_fKQGuUZdo4{i@`4{jIX-e{@}gj? z=U;z(^?M7Vc7Nnv$88BVt=yE=D<$bv*?~8Atmt%HS0_Hp*4C@}*>(Pk>}P&c(@?Q_ z_l7~KY4ay9zel~h;p5z6SN3FO{<6wRqmt>BcJ!06XGoJrhb`;<^ByQy; zQgHc#^+!rR_}+KNrwtjNyK(MyZ$($&UT^Z`=FNTV;q;93AD^rGED&vB@RztX?p-1x z#eeSFma^mJJAX8Grb?!jo3dI%zPpPX2>VxU%1Y^zGV6!g#kB?AK&^thg93$9@@xNDYHRCm;cC%qx8ziMuP%P-#meU58ea*+MHJtr5YvwxZLQr-hPc>W zSaZbVE1W%L(UGE$-rBYDZsESOcg<%Pwtp>sI=9toENeK=P%#n*)J(T{*fq%_CJ-SK z=PvNcYkOLC{ZFPmmw#~Gw$I<{eB4h?yqmZGwZ$`5^zPHUxc26f#lSI`0R=Y3fC3aT z6DtCnp@aM%hQy1HfP;Iy%$CavE5+~uk>orCMCzw*+itnrUc zeSB2rg{s3Ls}%q-8G|v^)?sD*3RVmjn?g|u2wQP_V~Uk8SbzBH*7Qfm4;hq}yKzok zb5%!ieF1N7-rRu$9(s1-;!Cv!zJG8%vjP)9U;$#3#;Ng+0$4}HAJolJ3PFi#18swL zyWBTg%8!-roHA}ET=uF>^8;aj;<%O_eI`Vg z(vwj;%wQrB6OTaszV^VkhkuT&@)t&;LJ$x!kuTEdi_{6UQhZa;6*9O4N^&O;|N59x z&y^OxPdnF0gc@o;SIRYTz@UGA^2cvJFnIQaoIAtyhngpjoC;emm7N#SB3g@>j@Mrw zrNFP}uK|cyKt!ayq3Twv5ejSs1}7Ga2nj?;v=D(AQ9E+**xo+w)PH`xAH4Z9C7Jt= z9zM3R{^}ijcggfsOQx^7?WIHKcdXsElpw?e7EN|z&=atmlwtrk6%NwQyC4BfnMuHJ z=lp%#h|Dh9XAlt~0uw# zW{S-ohn2w`%axk6Q?UsNfdNebb&Ga25rNqGXgD%}akC;K5`V-%K?0ck(n0TX!f}BN z!)@|5ynoEneMcdkjCJ_(-?ou&;&@X9# zkXFhR>~PMwWq(xKIcr<@QvJ|@ovy@iMQhy}Y<;BfB$M7Kw&(@g&nIasART=R3Buus z7CSNVCW4#nP6-90`5)%7BVyc1M1hD7hJs1%ltiXY0)M}VSfQ)c=PcVwSV(SH(zgbV zal4Yb0=FAm&u_v#xIMT%xc5Eo{{h9U=6VO&ZWaIl0Ba?5MObuXVRU6WV{&C-bY%cC zFflnTFg7hRGE^}*Iy5#qH8m?RFgh?WdO@?L0000bbVXQnWMOn=I&E)cX=ZroIyE&bFfckWFbf<{9 literal 2518 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 diff --git a/examples/stocks/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png b/examples/stocks/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png index e4c3a937979626c80247a039c33f2747644204b4..bc5f2949131df9b0dc2fd833020f8772765c6e11 100644 GIT binary patch literal 3725 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 P-1+_A+?hGkL;m(J7kc&K diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png index 3d43d11e66f4de3da27ed045ca4fe38ad8b48094..dc9ada4725e9b0ddb1deab583e5b5102493aa332 100644 GIT binary patch literal 10932 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 P-1+_A+?hGkL;m(J7kc&K From 14d489adc5d584490595790ca0deb29da7ee4470 Mon Sep 17 00:00:00 2001 From: Christopher Fujino Date: Fri, 12 Jul 2019 08:36:18 -0700 Subject: [PATCH 37/41] Bundle ios dependencies (#34669) This updates the flutter tool to cache binary files for ideviceinstaller, ios-deploy, libimobiledevice, and dynamically linked dependencies from Flutter's GCP bucket. --- .cirrus.yml | 4 +- bin/internal/ideviceinstaller.version | 1 + bin/internal/ios-deploy.version | 1 + bin/internal/libimobiledevice.version | 1 + bin/internal/libplist.version | 1 + bin/internal/openssl.version | 1 + bin/internal/usbmuxd.version | 1 + dev/devicelab/lib/framework/adb.dart | 27 ++- packages/flutter_tools/lib/src/artifacts.dart | 82 ++++++-- .../flutter_tools/lib/src/base/process.dart | 14 +- .../lib/src/base/user_messages.dart | 41 ---- packages/flutter_tools/lib/src/cache.dart | 57 +++++- .../flutter_tools/lib/src/context_runner.dart | 3 +- packages/flutter_tools/lib/src/doctor.dart | 2 - .../flutter_tools/lib/src/ios/devices.dart | 64 ++++--- .../lib/src/ios/ios_workflow.dart | 91 --------- packages/flutter_tools/lib/src/ios/mac.dart | 127 +++++++++++-- .../lib/src/macos/cocoapods.dart | 4 +- .../lib/src/macos/cocoapods_validator.dart | 10 +- packages/flutter_tools/test/cache_test.dart | 16 ++ .../test/ios/code_signing_test.dart | 2 +- .../test/ios/ios_workflow_test.dart | 178 ------------------ packages/flutter_tools/test/ios/mac_test.dart | 73 +++++-- .../test/macos/cocoapods_validator_test.dart | 27 +-- 24 files changed, 397 insertions(+), 431 deletions(-) create mode 100644 bin/internal/ideviceinstaller.version create mode 100644 bin/internal/ios-deploy.version create mode 100644 bin/internal/libimobiledevice.version create mode 100644 bin/internal/libplist.version create mode 100644 bin/internal/openssl.version create mode 100644 bin/internal/usbmuxd.version delete mode 100644 packages/flutter_tools/test/ios/ios_workflow_test.dart diff --git a/.cirrus.yml b/.cirrus.yml index 204112cec3d..6674fcc1d8a 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -21,7 +21,7 @@ task: fingerprint_script: echo $OS; cat bin/internal/engine.version artifacts_cache: folder: bin/cache/artifacts - fingerprint_script: echo $OS; cat bin/internal/engine.version + fingerprint_script: echo $OS; cat bin/internal/*.version setup_script: ./dev/bots/cirrus_setup.sh matrix: - name: docs @@ -298,7 +298,7 @@ task: fingerprint_script: echo %OS% & type bin\internal\engine.version artifacts_cache: folder: bin\cache\artifacts - fingerprint_script: echo %OS% & type bin\internal\engine.version + fingerprint_script: echo %OS% & type bin\internal\*.version setup_script: - flutter config --no-analytics - flutter doctor -v diff --git a/bin/internal/ideviceinstaller.version b/bin/internal/ideviceinstaller.version new file mode 100644 index 00000000000..90f1492fb9d --- /dev/null +++ b/bin/internal/ideviceinstaller.version @@ -0,0 +1 @@ +ab9352110092cf651b5602301371cd00691c7e13 diff --git a/bin/internal/ios-deploy.version b/bin/internal/ios-deploy.version new file mode 100644 index 00000000000..768361896d9 --- /dev/null +++ b/bin/internal/ios-deploy.version @@ -0,0 +1 @@ +ea5583388ac0ca035f6b991fd7955bea6492c68c diff --git a/bin/internal/libimobiledevice.version b/bin/internal/libimobiledevice.version new file mode 100644 index 00000000000..0fc801bd3c5 --- /dev/null +++ b/bin/internal/libimobiledevice.version @@ -0,0 +1 @@ +398c1208731cb887c64a31c2ae111048b079f80d diff --git a/bin/internal/libplist.version b/bin/internal/libplist.version new file mode 100644 index 00000000000..973064be2b9 --- /dev/null +++ b/bin/internal/libplist.version @@ -0,0 +1 @@ +17546f53ac1377b0d4f45a800aaec7366ba5b6a0 diff --git a/bin/internal/openssl.version b/bin/internal/openssl.version new file mode 100644 index 00000000000..400e36a8e95 --- /dev/null +++ b/bin/internal/openssl.version @@ -0,0 +1 @@ +03da376ff7504c63a1d00d57cf41bd7b7e93ff65 diff --git a/bin/internal/usbmuxd.version b/bin/internal/usbmuxd.version new file mode 100644 index 00000000000..d77b5cf4e91 --- /dev/null +++ b/bin/internal/usbmuxd.version @@ -0,0 +1 @@ +60109fdef47dfe0badfb558a6a2105e8fb23660a diff --git a/dev/devicelab/lib/framework/adb.dart b/dev/devicelab/lib/framework/adb.dart index e6765c6ab27..f6db339c35a 100644 --- a/dev/devicelab/lib/framework/adb.dart +++ b/dev/devicelab/lib/framework/adb.dart @@ -392,9 +392,34 @@ class IosDeviceDiscovery implements DeviceDiscovery { _workingDevice = allDevices[math.Random().nextInt(allDevices.length)]; } + // Returns the path to cached binaries relative to devicelab directory + String get _artifactDirPath { + return path.normalize( + path.join( + path.current, + '../../bin/cache/artifacts', + ) + ); + } + + // Returns a colon-separated environment variable that contains the paths + // of linked libraries for idevice_id + Map get _ideviceIdEnvironment { + final String libPath = const [ + 'libimobiledevice', + 'usbmuxd', + 'libplist', + 'openssl', + 'ideviceinstaller', + 'ios-deploy', + ].map((String packageName) => path.join(_artifactDirPath, packageName)).join(':'); + return {'DYLD_LIBRARY_PATH': libPath}; + } + @override Future> discoverDevices() async { - final List iosDeviceIDs = LineSplitter.split(await eval('idevice_id', ['-l'])) + final String ideviceIdPath = path.join(_artifactDirPath, 'libimobiledevice', 'idevice_id'); + final List iosDeviceIDs = LineSplitter.split(await eval(ideviceIdPath, ['-l'], environment: _ideviceIdEnvironment)) .map((String line) => line.trim()) .where((String line) => line.isNotEmpty) .toList(); diff --git a/packages/flutter_tools/lib/src/artifacts.dart b/packages/flutter_tools/lib/src/artifacts.dart index 65a8b630f6e..191fd156714 100644 --- a/packages/flutter_tools/lib/src/artifacts.dart +++ b/packages/flutter_tools/lib/src/artifacts.dart @@ -40,6 +40,14 @@ enum Artifact { kernelWorkerSnapshot, /// The root of the web implementation of the dart SDK. flutterWebSdk, + iosDeploy, + ideviceinfo, + ideviceId, + idevicename, + idevicesyslog, + idevicescreenshot, + ideviceinstaller, + iproxy, /// The root of the Linux desktop sources. linuxDesktopPath, /// The root of the Windows desktop sources. @@ -93,6 +101,22 @@ String _artifactToFileName(Artifact artifact, [ TargetPlatform platform, BuildMo return 'dartdevc.dart.snapshot'; case Artifact.kernelWorkerSnapshot: return 'kernel_worker.dart.snapshot'; + case Artifact.iosDeploy: + return 'ios-deploy'; + case Artifact.ideviceinfo: + return 'ideviceinfo'; + case Artifact.ideviceId: + return 'idevice_id'; + case Artifact.idevicename: + return 'idevicename'; + case Artifact.idevicesyslog: + return 'idevicesyslog'; + case Artifact.idevicescreenshot: + return 'idevicescreenshot'; + case Artifact.ideviceinstaller: + return 'ideviceinstaller'; + case Artifact.iproxy: + return 'iproxy'; case Artifact.linuxDesktopPath: if (platform != TargetPlatform.linux_x64) { throw Exception('${getNameForTargetPlatform(platform)} does not support' @@ -187,13 +211,26 @@ class CachedArtifacts extends Artifacts { } String _getIosArtifactPath(Artifact artifact, TargetPlatform platform, BuildMode mode) { - final String engineDir = _getEngineArtifactsPath(platform, mode); + final String artifactFileName = _artifactToFileName(artifact); switch (artifact) { case Artifact.genSnapshot: case Artifact.snapshotDart: case Artifact.flutterFramework: case Artifact.frontendServerSnapshotForEngineDartSdk: - return fs.path.join(engineDir, _artifactToFileName(artifact)); + final String engineDir = _getEngineArtifactsPath(platform, mode); + return fs.path.join(engineDir, artifactFileName); + case Artifact.ideviceId: + case Artifact.ideviceinfo: + case Artifact.idevicescreenshot: + case Artifact.idevicesyslog: + case Artifact.idevicename: + return cache.getArtifactDirectory('libimobiledevice').childFile(artifactFileName).path; + case Artifact.iosDeploy: + return cache.getArtifactDirectory('ios-deploy').childFile(artifactFileName).path; + case Artifact.ideviceinstaller: + return cache.getArtifactDirectory('ideviceinstaller').childFile(artifactFileName).path; + case Artifact.iproxy: + return cache.getArtifactDirectory('usbmuxd').childFile(artifactFileName).path; default: assert(false, 'Artifact $artifact not available for platform $platform.'); return null; @@ -302,24 +339,25 @@ class LocalEngineArtifacts extends Artifacts { @override String getArtifactPath(Artifact artifact, { TargetPlatform platform, BuildMode mode }) { + final String artifactFileName = _artifactToFileName(artifact); switch (artifact) { case Artifact.snapshotDart: - return fs.path.join(_engineSrcPath, 'flutter', 'lib', 'snapshot', _artifactToFileName(artifact)); + return fs.path.join(_engineSrcPath, 'flutter', 'lib', 'snapshot', artifactFileName); case Artifact.genSnapshot: return _genSnapshotPath(); case Artifact.flutterTester: return _flutterTesterPath(platform); case Artifact.isolateSnapshotData: case Artifact.vmSnapshotData: - return fs.path.join(engineOutPath, 'gen', 'flutter', 'lib', 'snapshot', _artifactToFileName(artifact)); + return fs.path.join(engineOutPath, 'gen', 'flutter', 'lib', 'snapshot', artifactFileName); case Artifact.platformKernelDill: - return fs.path.join(_getFlutterPatchedSdkPath(mode), _artifactToFileName(artifact)); + return fs.path.join(_getFlutterPatchedSdkPath(mode), artifactFileName); case Artifact.platformLibrariesJson: - return fs.path.join(_getFlutterPatchedSdkPath(mode), 'lib', _artifactToFileName(artifact)); + return fs.path.join(_getFlutterPatchedSdkPath(mode), 'lib', artifactFileName); case Artifact.flutterFramework: - return fs.path.join(engineOutPath, _artifactToFileName(artifact)); + return fs.path.join(engineOutPath, artifactFileName); case Artifact.flutterMacOSFramework: - return fs.path.join(engineOutPath, _artifactToFileName(artifact)); + return fs.path.join(engineOutPath, artifactFileName); case Artifact.flutterPatchedSdkPath: // When using local engine always use [BuildMode.debug] regardless of // what was specified in [mode] argument because local engine will @@ -329,23 +367,35 @@ class LocalEngineArtifacts extends Artifacts { case Artifact.flutterWebSdk: return _getFlutterWebSdkPath(); case Artifact.frontendServerSnapshotForEngineDartSdk: - return fs.path.join(_hostEngineOutPath, 'gen', _artifactToFileName(artifact)); + return fs.path.join(_hostEngineOutPath, 'gen', artifactFileName); case Artifact.engineDartSdkPath: return fs.path.join(_hostEngineOutPath, 'dart-sdk'); case Artifact.engineDartBinary: - return fs.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', _artifactToFileName(artifact)); + return fs.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', artifactFileName); case Artifact.dart2jsSnapshot: - return fs.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', 'snapshots', _artifactToFileName(artifact)); + return fs.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', 'snapshots', artifactFileName); case Artifact.dartdevcSnapshot: - return fs.path.join(dartSdkPath, 'bin', 'snapshots', _artifactToFileName(artifact)); + return fs.path.join(dartSdkPath, 'bin', 'snapshots', artifactFileName); case Artifact.kernelWorkerSnapshot: - return fs.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', 'snapshots', _artifactToFileName(artifact)); + return fs.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', 'snapshots', artifactFileName); + case Artifact.ideviceId: + case Artifact.ideviceinfo: + case Artifact.idevicename: + case Artifact.idevicescreenshot: + case Artifact.idevicesyslog: + return cache.getArtifactDirectory('libimobiledevice').childFile(artifactFileName).path; + case Artifact.ideviceinstaller: + return cache.getArtifactDirectory('ideviceinstaller').childFile(artifactFileName).path; + case Artifact.iosDeploy: + return cache.getArtifactDirectory('ios-deploy').childFile(artifactFileName).path; + case Artifact.iproxy: + return cache.getArtifactDirectory('usbmuxd').childFile(artifactFileName).path; case Artifact.linuxDesktopPath: - return fs.path.join(_hostEngineOutPath, _artifactToFileName(artifact)); + return fs.path.join(_hostEngineOutPath, artifactFileName); case Artifact.windowsDesktopPath: - return fs.path.join(_hostEngineOutPath, _artifactToFileName(artifact)); + return fs.path.join(_hostEngineOutPath, artifactFileName); case Artifact.skyEnginePath: - return fs.path.join(_hostEngineOutPath, 'gen', 'dart-pkg', _artifactToFileName(artifact)); + return fs.path.join(_hostEngineOutPath, 'gen', 'dart-pkg', artifactFileName); } assert(false, 'Invalid artifact $artifact.'); return null; diff --git a/packages/flutter_tools/lib/src/base/process.dart b/packages/flutter_tools/lib/src/base/process.dart index 47b2949a178..1dd5765821d 100644 --- a/packages/flutter_tools/lib/src/base/process.dart +++ b/packages/flutter_tools/lib/src/base/process.dart @@ -263,20 +263,26 @@ Future runCheckedAsync( return result; } -bool exitsHappy(List cli) { +bool exitsHappy( + List cli, { + Map environment, +}) { _traceCommand(cli); try { - return processManager.runSync(cli).exitCode == 0; + return processManager.runSync(cli, environment: environment).exitCode == 0; } catch (error) { printTrace('$cli failed with $error'); return false; } } -Future exitsHappyAsync(List cli) async { +Future exitsHappyAsync( + List cli, { + Map environment, +}) async { _traceCommand(cli); try { - return (await processManager.run(cli)).exitCode == 0; + return (await processManager.run(cli, environment: environment)).exitCode == 0; } catch (error) { printTrace('$cli failed with $error'); return false; diff --git a/packages/flutter_tools/lib/src/base/user_messages.dart b/packages/flutter_tools/lib/src/base/user_messages.dart index 09af158d940..0f359b58bef 100644 --- a/packages/flutter_tools/lib/src/base/user_messages.dart +++ b/packages/flutter_tools/lib/src/base/user_messages.dart @@ -145,44 +145,6 @@ class UserMessages { 'Once installed, run:\n' ' sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer'; - // Messages used in IOSValidator - String get iOSIMobileDeviceMissing => - 'libimobiledevice and ideviceinstaller are not installed. To install with Brew, run:\n' - ' brew update\n' - ' brew install --HEAD usbmuxd\n' - ' brew link usbmuxd\n' - ' brew install --HEAD libimobiledevice\n' - ' brew install ideviceinstaller'; - String get iOSIMobileDeviceBroken => - 'Verify that all connected devices have been paired with this computer in Xcode.\n' - 'If all devices have been paired, libimobiledevice and ideviceinstaller may require updating.\n' - 'To update with Brew, run:\n' - ' brew update\n' - ' brew uninstall --ignore-dependencies libimobiledevice\n' - ' brew uninstall --ignore-dependencies usbmuxd\n' - ' brew install --HEAD usbmuxd\n' - ' brew unlink usbmuxd\n' - ' brew link usbmuxd\n' - ' brew install --HEAD libimobiledevice\n' - ' brew install ideviceinstaller'; - String get iOSDeviceInstallerMissing => - 'ideviceinstaller is not installed; this is used to discover connected iOS devices.\n' - 'To install with Brew, run:\n' - ' brew install --HEAD usbmuxd\n' - ' brew link usbmuxd\n' - ' brew install --HEAD libimobiledevice\n' - ' brew install ideviceinstaller'; - String iOSDeployVersion(String version) => 'ios-deploy $version'; - String iOSDeployOutdated(String minVersion) => - 'ios-deploy out of date ($minVersion is required). To upgrade with Brew:\n' - ' brew upgrade ios-deploy'; - String get iOSDeployMissing => - 'ios-deploy not installed. To install:\n' - ' brew install ios-deploy'; - String get iOSBrewMissing => - 'Brew can be used to install tools for iOS device development.\n' - 'Download brew at https://brew.sh/.'; - // Messages used in CocoaPodsValidator String cocoaPodsVersion(String version) => 'CocoaPods version $version'; String cocoaPodsUninitialized(String consequence) => @@ -206,9 +168,6 @@ class UserMessages { '$consequence\n' 'To upgrade:\n' '$upgradeInstructions'; - String get cocoaPodsBrewMissing => - 'Brew can be used to install CocoaPods.\n' - 'Download brew at https://brew.sh/.'; // Messages used in VsCodeValidator String vsCodeVersion(String version) => 'version $version'; diff --git a/packages/flutter_tools/lib/src/cache.dart b/packages/flutter_tools/lib/src/cache.dart index 6d2d13e023d..3a6039d85b5 100644 --- a/packages/flutter_tools/lib/src/cache.dart +++ b/packages/flutter_tools/lib/src/cache.dart @@ -53,7 +53,7 @@ class DevelopmentArtifact { /// Artifacts required by all developments. static const DevelopmentArtifact universal = DevelopmentArtifact._('universal'); - /// The vaulues of DevelopmentArtifacts. + /// The values of DevelopmentArtifacts. static final List values = [ android, iOS, @@ -83,6 +83,9 @@ class Cache { _artifacts.add(LinuxEngineArtifacts(this)); _artifacts.add(LinuxFuchsiaSDKArtifacts(this)); _artifacts.add(MacOSFuchsiaSDKArtifacts(this)); + for (String artifactName in IosUsbArtifacts.artifactNames) { + _artifacts.add(IosUsbArtifacts(artifactName, this)); + } } else { _artifacts.addAll(artifacts); } @@ -221,6 +224,22 @@ class Cache { return getCacheArtifacts().childDirectory(name); } + MapEntry get dyLdLibEntry { + if (_dyLdLibEntry != null) { + return _dyLdLibEntry; + } + final List paths = []; + for (CachedArtifact artifact in _artifacts) { + final String currentPath = artifact.dyLdLibPath; + if (currentPath.isNotEmpty) { + paths.add(currentPath); + } + } + _dyLdLibEntry = MapEntry('DYLD_LIBARY_PATH', paths.join(':')); + return _dyLdLibEntry; + } + MapEntry _dyLdLibEntry; + /// The web sdk has to be co-located with the dart-sdk so that they can share source /// code. Directory getWebSdkDirectory() { @@ -328,6 +347,9 @@ abstract class CachedArtifact { // artifact name. String get stampName => name; + /// Returns a string to be set as environment DYLD_LIBARY_PATH variable + String get dyLdLibPath => ''; + /// All development artifacts this cache provides. final Set developmentArtifacts; @@ -890,6 +912,39 @@ class MacOSFuchsiaSDKArtifacts extends _FuchsiaSDKArtifacts { } } +/// Cached iOS/USB binary artifacts. +class IosUsbArtifacts extends CachedArtifact { + IosUsbArtifacts(String name, Cache cache) : super( + name, + cache, + // This is universal to ensure every command checks for them first + const { DevelopmentArtifact.universal }, + ); + + static const List artifactNames = [ + 'libimobiledevice', + 'usbmuxd', + 'libplist', + 'openssl', + 'ideviceinstaller', + 'ios-deploy', + ]; + + @override + String get dyLdLibPath { + return cache.getArtifactDirectory(name).path; + } + + @override + Future updateInner() { + if (!platform.isMacOS) { + return Future.value(); + } + final Uri archiveUri = Uri.parse('$_storageBaseUrl/flutter_infra/ios-usb-dependencies/$name/$version/$name.zip'); + return _downloadZipArchive('Downloading $name...', archiveUri, location); + } +} + // Many characters are problematic in filenames, especially on Windows. final Map> _flattenNameSubstitutions = >{ r'@'.codeUnitAt(0): '@@'.codeUnits, diff --git a/packages/flutter_tools/lib/src/context_runner.dart b/packages/flutter_tools/lib/src/context_runner.dart index 533cfc6fbdf..ba5d910ad52 100644 --- a/packages/flutter_tools/lib/src/context_runner.dart +++ b/packages/flutter_tools/lib/src/context_runner.dart @@ -87,9 +87,8 @@ Future runInContext( FuchsiaWorkflow: () => FuchsiaWorkflow(), GenSnapshot: () => const GenSnapshot(), HotRunnerConfig: () => HotRunnerConfig(), - IMobileDevice: () => const IMobileDevice(), + IMobileDevice: () => IMobileDevice(), IOSSimulatorUtils: () => IOSSimulatorUtils(), - IOSValidator: () => const IOSValidator(), IOSWorkflow: () => const IOSWorkflow(), KernelCompilerFactory: () => const KernelCompilerFactory(), LinuxWorkflow: () => const LinuxWorkflow(), diff --git a/packages/flutter_tools/lib/src/doctor.dart b/packages/flutter_tools/lib/src/doctor.dart index 58ba4de7967..c4aa3a67bca 100644 --- a/packages/flutter_tools/lib/src/doctor.dart +++ b/packages/flutter_tools/lib/src/doctor.dart @@ -72,8 +72,6 @@ class _DefaultDoctorValidatorsProvider implements DoctorValidatorsProvider { GroupedValidator([androidValidator, androidLicenseValidator]), if (iosWorkflow.appliesToHostPlatform || macOSWorkflow.appliesToHostPlatform) GroupedValidator([xcodeValidator, cocoapodsValidator]), - if (iosWorkflow.appliesToHostPlatform) - iosValidator, if (webWorkflow.appliesToHostPlatform) const WebValidator(), // Add desktop doctors to workflow if the flag is enabled. diff --git a/packages/flutter_tools/lib/src/ios/devices.dart b/packages/flutter_tools/lib/src/ios/devices.dart index 3ac80c57f45..7007daf077e 100644 --- a/packages/flutter_tools/lib/src/ios/devices.dart +++ b/packages/flutter_tools/lib/src/ios/devices.dart @@ -7,6 +7,7 @@ import 'dart:async'; import 'package:meta/meta.dart'; import '../application_package.dart'; +import '../artifacts.dart'; import '../base/file_system.dart'; import '../base/io.dart'; import '../base/logger.dart'; @@ -23,10 +24,6 @@ import 'code_signing.dart'; import 'ios_workflow.dart'; import 'mac.dart'; -const String _kIdeviceinstallerInstructions = - 'To work with iOS devices, please install ideviceinstaller. To install, run:\n' - 'brew install ideviceinstaller.'; - class IOSDeploy { const IOSDeploy(); @@ -37,9 +34,15 @@ class IOSDeploy { @required String bundlePath, @required List launchArguments, }) async { - final List launchCommand = [ + final String iosDeployPath = artifacts.getArtifactPath(Artifact.iosDeploy, platform: TargetPlatform.ios); + // TODO(fujino): remove fallback once g3 updated + const List fallbackIosDeployPath = [ '/usr/bin/env', 'ios-deploy', + ]; + final List commandList = iosDeployPath != null ? [iosDeployPath] : fallbackIosDeployPath; + final List launchCommand = [ + ...commandList, '--id', deviceId, '--bundle', @@ -61,6 +64,7 @@ class IOSDeploy { // it. final Map iosDeployEnv = Map.from(platform.environment); iosDeployEnv['PATH'] = '/usr/bin:${iosDeployEnv['PATH']}'; + iosDeployEnv.addEntries(>[cache.dyLdLibEntry]); return await runCommandAndStreamOutput( launchCommand, @@ -120,8 +124,20 @@ class IOSDevice extends Device { platformType: PlatformType.ios, ephemeral: true, ) { - _installerPath = _checkForCommand('ideviceinstaller'); - _iproxyPath = _checkForCommand('iproxy'); + if (platform.isMacOS) { + printError('Cannot control iOS devices or simulators. ideviceinstaller and iproxy are not available on your platform.'); + _installerPath = null; + _iproxyPath = null; + return; + } + _installerPath = artifacts.getArtifactPath( + Artifact.ideviceinstaller, + platform: TargetPlatform.ios + ) ?? 'ideviceinstaller'; // TODO(fujino): remove fallback once g3 updated + _iproxyPath = artifacts.getArtifactPath( + Artifact.iproxy, + platform: TargetPlatform.ios + ) ?? 'iproxy'; // TODO(fujino): remove fallback once g3 updated } String _installerPath; @@ -173,23 +189,6 @@ class IOSDevice extends Device { return devices; } - static String _checkForCommand( - String command, [ - String macInstructions = _kIdeviceinstallerInstructions, - ]) { - try { - command = runCheckedSync(['which', command]).trim(); - } catch (e) { - if (platform.isMacOS) { - printError('$command not found. $macInstructions'); - } else { - printError('Cannot control iOS devices or simulators. $command is not available on your platform.'); - } - return null; - } - return command; - } - @override Future isAppInstalled(ApplicationPackage app) async { try { @@ -589,12 +588,17 @@ class _IOSDevicePortForwarder extends DevicePortForwarder { while (!connected) { printTrace('attempting to forward device port $devicePort to host port $hostPort'); // Usage: iproxy LOCAL_TCP_PORT DEVICE_TCP_PORT UDID - process = await runCommand([ - device._iproxyPath, - hostPort.toString(), - devicePort.toString(), - device.id, - ]); + process = await runCommand( + [ + device._iproxyPath, + hostPort.toString(), + devicePort.toString(), + device.id, + ], + environment: Map.fromEntries( + >[cache.dyLdLibEntry], + ), + ); // TODO(ianh): This is a flakey race condition, https://github.com/libimobiledevice/libimobiledevice/issues/674 connected = !await process.stdout.isEmpty.timeout(_kiProxyPortForwardTimeout, onTimeout: () => false); if (!connected) { diff --git a/packages/flutter_tools/lib/src/ios/ios_workflow.dart b/packages/flutter_tools/lib/src/ios/ios_workflow.dart index cf95c30c8d4..f21dffd8141 100644 --- a/packages/flutter_tools/lib/src/ios/ios_workflow.dart +++ b/packages/flutter_tools/lib/src/ios/ios_workflow.dart @@ -2,21 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'dart:async'; - import '../base/context.dart'; -import '../base/os.dart'; import '../base/platform.dart'; -import '../base/process.dart'; -import '../base/user_messages.dart'; -import '../base/version.dart'; import '../doctor.dart'; import '../macos/xcode.dart'; -import 'mac.dart'; import 'plist_utils.dart' as plist; IOSWorkflow get iosWorkflow => context.get(); -IOSValidator get iosValidator => context.get(); class IOSWorkflow implements Workflow { const IOSWorkflow(); @@ -40,86 +32,3 @@ class IOSWorkflow implements Workflow { return plist.getValueFromFile(path, key); } } - -class IOSValidator extends DoctorValidator { - - const IOSValidator() : super('iOS tools - develop for iOS devices'); - - Future get hasIDeviceInstaller => exitsHappyAsync(['ideviceinstaller', '-h']); - - Future get hasIosDeploy => exitsHappyAsync(['ios-deploy', '--version']); - - String get iosDeployMinimumVersion => '1.9.4'; - - // ios-deploy <= v1.9.3 declares itself as v2.0.0 - List get iosDeployBadVersions => ['2.0.0']; - - Future get iosDeployVersionText async => (await runAsync(['ios-deploy', '--version'])).processResult.stdout.replaceAll('\n', ''); - - bool get hasHomebrew => os.which('brew') != null; - - Future get macDevMode async => (await runAsync(['DevToolsSecurity', '-status'])).processResult.stdout; - - Future get _iosDeployIsInstalledAndMeetsVersionCheck async { - if (!await hasIosDeploy) - return false; - try { - final Version version = Version.parse(await iosDeployVersionText); - return version >= Version.parse(iosDeployMinimumVersion) - && !iosDeployBadVersions.map((String v) => Version.parse(v)).contains(version); - } on FormatException catch (_) { - return false; - } - } - - // Change this value if the number of checks for packages needed for installation changes - static const int totalChecks = 4; - - @override - Future validate() async { - final List messages = []; - ValidationType packageManagerStatus = ValidationType.installed; - - int checksFailed = 0; - - if (!iMobileDevice.isInstalled) { - checksFailed += 3; - packageManagerStatus = ValidationType.partial; - messages.add(ValidationMessage.error(userMessages.iOSIMobileDeviceMissing)); - } else if (!await iMobileDevice.isWorking) { - checksFailed += 2; - packageManagerStatus = ValidationType.partial; - messages.add(ValidationMessage.error(userMessages.iOSIMobileDeviceBroken)); - } else if (!await hasIDeviceInstaller) { - checksFailed += 1; - packageManagerStatus = ValidationType.partial; - messages.add(ValidationMessage.error(userMessages.iOSDeviceInstallerMissing)); - } - - final bool iHasIosDeploy = await hasIosDeploy; - - // Check ios-deploy is installed at meets version requirements. - if (iHasIosDeploy) { - messages.add(ValidationMessage(userMessages.iOSDeployVersion(await iosDeployVersionText))); - } - if (!await _iosDeployIsInstalledAndMeetsVersionCheck) { - packageManagerStatus = ValidationType.partial; - if (iHasIosDeploy) { - messages.add(ValidationMessage.error(userMessages.iOSDeployOutdated(iosDeployMinimumVersion))); - } else { - checksFailed += 1; - messages.add(ValidationMessage.error(userMessages.iOSDeployMissing)); - } - } - - // If one of the checks for the packages failed, we may need brew so that we can install - // the necessary packages. If they're all there, however, we don't even need it. - if (checksFailed == totalChecks) - packageManagerStatus = ValidationType.missing; - if (checksFailed > 0 && !hasHomebrew) { - messages.add(ValidationMessage.hint(userMessages.iOSBrewMissing)); - } - - return ValidationResult(packageManagerStatus, messages); - } -} diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart index dcc7f5acdc6..2bcdd594631 100644 --- a/packages/flutter_tools/lib/src/ios/mac.dart +++ b/packages/flutter_tools/lib/src/ios/mac.dart @@ -7,6 +7,7 @@ import 'dart:async'; import 'package:meta/meta.dart'; import '../application_package.dart'; +import '../artifacts.dart'; import '../base/common.dart'; import '../base/context.dart'; import '../base/file_system.dart'; @@ -42,35 +43,99 @@ class IOSDeviceNotFoundError implements Exception { } class IMobileDevice { - const IMobileDevice(); + IMobileDevice() + : _ideviceIdPath = artifacts.getArtifactPath(Artifact.ideviceId, platform: TargetPlatform.ios) + ?? 'idevice_id', // TODO(fujino): remove fallback once g3 updated + _ideviceinfoPath = artifacts.getArtifactPath(Artifact.ideviceinfo, platform: TargetPlatform.ios) + ?? 'ideviceinfo', // TODO(fujino): remove fallback once g3 updated + _idevicenamePath = artifacts.getArtifactPath(Artifact.idevicename, platform: TargetPlatform.ios) + ?? 'idevicename', // TODO(fujino): remove fallback once g3 updated + _idevicesyslogPath = artifacts.getArtifactPath(Artifact.idevicesyslog, platform: TargetPlatform.ios) + ?? 'idevicesyslog', // TODO(fujino): remove fallback once g3 updated + _idevicescreenshotPath = artifacts.getArtifactPath(Artifact.idevicescreenshot, platform: TargetPlatform.ios) + ?? 'idevicescreenshot' { // TODO(fujino): remove fallback once g3 updated + } + final String _ideviceIdPath; + final String _ideviceinfoPath; + final String _idevicenamePath; + final String _idevicesyslogPath; + final String _idevicescreenshotPath; - bool get isInstalled => exitsHappy(['idevice_id', '-h']); + bool get isInstalled { + _isInstalled ??= exitsHappy( + [ + _ideviceIdPath, + '-h' + ], + environment: Map.fromEntries( + >[cache.dyLdLibEntry] + ), + ); + return _isInstalled; + } + bool _isInstalled; /// Returns true if libimobiledevice is installed and working as expected. /// /// Older releases of libimobiledevice fail to work with iOS 10.3 and above. Future get isWorking async { - if (!isInstalled) - return false; + if (_isWorking != null) { + return _isWorking; + } + if (!isInstalled) { + _isWorking = false; + return _isWorking; + } // If usage info is printed in a hyphenated id, we need to update. const String fakeIphoneId = '00008020-001C2D903C42002E'; - final ProcessResult ideviceResult = (await runAsync(['ideviceinfo', '-u', fakeIphoneId])).processResult; + final Map executionEnv = Map.fromEntries( + >[cache.dyLdLibEntry] + ); + final ProcessResult ideviceResult = (await runAsync( + [ + _ideviceinfoPath, + '-u', + fakeIphoneId + ], + environment: executionEnv, + )).processResult; if (ideviceResult.stdout.contains('Usage: ideviceinfo')) { - return false; + _isWorking = false; + return _isWorking; } // If no device is attached, we're unable to detect any problems. Assume all is well. - final ProcessResult result = (await runAsync(['idevice_id', '-l'])).processResult; - if (result.exitCode == 0 && result.stdout.isEmpty) - return true; - - // Check that we can look up the names of any attached devices. - return await exitsHappyAsync(['idevicename']); + final ProcessResult result = (await runAsync( + [ + _ideviceIdPath, + '-l', + ], + environment: executionEnv, + )).processResult; + if (result.exitCode == 0 && result.stdout.isEmpty) { + _isWorking = true; + } else { + // Check that we can look up the names of any attached devices. + _isWorking = await exitsHappyAsync( + [_idevicenamePath], + environment: executionEnv, + ); + } + return _isWorking; } + bool _isWorking; Future getAvailableDeviceIDs() async { try { - final ProcessResult result = await processManager.run(['idevice_id', '-l']); + final ProcessResult result = await processManager.run( + [ + _ideviceIdPath, + '-l' + ], + environment: Map.fromEntries( + >[cache.dyLdLibEntry] + ), + ); if (result.exitCode != 0) throw ToolExit('idevice_id returned an error:\n${result.stderr}'); return result.stdout; @@ -81,7 +146,18 @@ class IMobileDevice { Future getInfoForDevice(String deviceID, String key) async { try { - final ProcessResult result = await processManager.run(['ideviceinfo', '-u', deviceID, '-k', key]); + final ProcessResult result = await processManager.run( + [ + _ideviceinfoPath, + '-u', + deviceID, + '-k', + key + ], + environment: Map.fromEntries( + >[cache.dyLdLibEntry] + ), + ); if (result.exitCode == 255 && result.stdout != null && result.stdout.contains('No device found')) throw IOSDeviceNotFoundError('ideviceinfo could not find device:\n${result.stdout}'); if (result.exitCode != 0) @@ -93,11 +169,30 @@ class IMobileDevice { } /// Starts `idevicesyslog` and returns the running process. - Future startLogger(String deviceID) => runCommand(['idevicesyslog', '-u', deviceID]); + Future startLogger(String deviceID) { + return runCommand( + [ + _idevicesyslogPath, + '-u', + deviceID, + ], + environment: Map.fromEntries( + >[cache.dyLdLibEntry] + ), + ); + } /// Captures a screenshot to the specified outputFile. Future takeScreenshot(File outputFile) { - return runCheckedAsync(['idevicescreenshot', outputFile.path]); + return runCheckedAsync( + [ + _idevicescreenshotPath, + outputFile.path + ], + environment: Map.fromEntries( + >[cache.dyLdLibEntry] + ), + ); } } diff --git a/packages/flutter_tools/lib/src/macos/cocoapods.dart b/packages/flutter_tools/lib/src/macos/cocoapods.dart index 9462395b728..9729387c9cd 100644 --- a/packages/flutter_tools/lib/src/macos/cocoapods.dart +++ b/packages/flutter_tools/lib/src/macos/cocoapods.dart @@ -30,11 +30,11 @@ const String unknownCocoaPodsConsequence = ''' Ensure that the output of 'pod --version' contains only digits and . to be recognized by Flutter.'''; const String cocoaPodsInstallInstructions = ''' - brew install cocoapods + sudo gem install cocoapods pod setup'''; const String cocoaPodsUpgradeInstructions = ''' - brew upgrade cocoapods + sudo gem install cocoapods pod setup'''; CocoaPods get cocoaPods => context.get(); diff --git a/packages/flutter_tools/lib/src/macos/cocoapods_validator.dart b/packages/flutter_tools/lib/src/macos/cocoapods_validator.dart index 615c3f54b3e..aaee7455727 100644 --- a/packages/flutter_tools/lib/src/macos/cocoapods_validator.dart +++ b/packages/flutter_tools/lib/src/macos/cocoapods_validator.dart @@ -5,7 +5,6 @@ import 'dart:async'; import '../base/context.dart'; -import '../base/os.dart'; import '../base/user_messages.dart'; import '../doctor.dart'; import 'cocoapods.dart'; @@ -15,8 +14,6 @@ CocoaPodsValidator get cocoapodsValidator => context.get(); class CocoaPodsValidator extends DoctorValidator { const CocoaPodsValidator() : super('CocoaPods subvalidator'); - bool get hasHomebrew => os.which('brew') != null; - @override Future validate() async { final List messages = []; @@ -48,11 +45,6 @@ class CocoaPodsValidator extends DoctorValidator { } } - // Only check/report homebrew status if CocoaPods isn't installed. - if (status == ValidationType.missing && !hasHomebrew) { - messages.add(ValidationMessage.hint(userMessages.cocoaPodsBrewMissing)); - } - return ValidationResult(status, messages); } -} \ No newline at end of file +} diff --git a/packages/flutter_tools/test/cache_test.dart b/packages/flutter_tools/test/cache_test.dart index a95964a5519..64a7e584a18 100644 --- a/packages/flutter_tools/test/cache_test.dart +++ b/packages/flutter_tools/test/cache_test.dart @@ -107,6 +107,22 @@ void main() { verifyNever(artifact1.update({})); verify(artifact2.update({})); }); + testUsingContext('getter dyLdLibEntry concatenates the output of each artifact\'s dyLdLibEntry getter', () async { + final CachedArtifact artifact1 = MockCachedArtifact(); + final CachedArtifact artifact2 = MockCachedArtifact(); + final CachedArtifact artifact3 = MockCachedArtifact(); + when(artifact1.dyLdLibPath).thenReturn('/path/to/alpha:/path/to/beta'); + when(artifact2.dyLdLibPath).thenReturn('/path/to/gamma:/path/to/delta:/path/to/epsilon'); + when(artifact3.dyLdLibPath).thenReturn(''); // Empty output + final Cache cache = Cache(artifacts: [artifact1, artifact2, artifact3]); + expect(cache.dyLdLibEntry.key, 'DYLD_LIBARY_PATH'); + expect( + cache.dyLdLibEntry.value, + '/path/to/alpha:/path/to/beta:/path/to/gamma:/path/to/delta:/path/to/epsilon', + ); + }, overrides: { + Cache: ()=> mockCache, + }); testUsingContext('failed storage.googleapis.com download shows China warning', () async { final CachedArtifact artifact1 = MockCachedArtifact(); final CachedArtifact artifact2 = MockCachedArtifact(); diff --git a/packages/flutter_tools/test/ios/code_signing_test.dart b/packages/flutter_tools/test/ios/code_signing_test.dart index 9d381a054ab..ecea51fc71a 100644 --- a/packages/flutter_tools/test/ios/code_signing_test.dart +++ b/packages/flutter_tools/test/ios/code_signing_test.dart @@ -425,7 +425,7 @@ void main() { final Map signingConfigs = await getCodeSigningIdentityDevelopmentTeam(iosApp: app); expect( - testLogger.errorText, + testLogger.errorText.replaceAll('\n', ' '), contains('Saved signing certificate "iPhone Developer: Invalid Profile" is not a valid development certificate'), ); expect( diff --git a/packages/flutter_tools/test/ios/ios_workflow_test.dart b/packages/flutter_tools/test/ios/ios_workflow_test.dart deleted file mode 100644 index a2e37453062..00000000000 --- a/packages/flutter_tools/test/ios/ios_workflow_test.dart +++ /dev/null @@ -1,178 +0,0 @@ -// Copyright 2017 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 'package:file/memory.dart'; -import 'package:flutter_tools/src/base/file_system.dart'; -import 'package:flutter_tools/src/base/io.dart'; -import 'package:flutter_tools/src/doctor.dart'; -import 'package:flutter_tools/src/ios/ios_workflow.dart'; -import 'package:flutter_tools/src/ios/mac.dart'; -import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; - -import '../src/common.dart'; -import '../src/context.dart'; - -void main() { - group('iOS Workflow validation', () { - MockIMobileDevice iMobileDevice; - MockIMobileDevice iMobileDeviceUninstalled; - MockProcessManager processManager; - FileSystem fs; - - setUp(() { - iMobileDevice = MockIMobileDevice(); - iMobileDeviceUninstalled = MockIMobileDevice(isInstalled: false); - processManager = MockProcessManager(); - fs = MemoryFileSystem(); - }); - - testUsingContext('Emit missing status when nothing is installed', () async { - final IOSWorkflowTestTarget workflow = IOSWorkflowTestTarget( - hasHomebrew: false, - hasIosDeploy: false, - hasIDeviceInstaller: false, - iosDeployVersionText: '0.0.0', - ); - final ValidationResult result = await workflow.validate(); - expect(result.type, ValidationType.missing); - }, overrides: { - IMobileDevice: () => iMobileDeviceUninstalled, - }); - - testUsingContext('Emits installed status when homebrew not installed, but not needed', () async { - final IOSWorkflowTestTarget workflow = IOSWorkflowTestTarget(hasHomebrew: false); - final ValidationResult result = await workflow.validate(); - expect(result.type, ValidationType.installed); - }, overrides: { - IMobileDevice: () => iMobileDevice, - }); - - testUsingContext('Emits partial status when libimobiledevice is not installed', () async { - final IOSWorkflowTestTarget workflow = IOSWorkflowTestTarget(); - final ValidationResult result = await workflow.validate(); - expect(result.type, ValidationType.partial); - }, overrides: { - IMobileDevice: () => MockIMobileDevice(isInstalled: false, isWorking: false), - }); - - testUsingContext('Emits partial status when libimobiledevice is installed but not working', () async { - final IOSWorkflowTestTarget workflow = IOSWorkflowTestTarget(); - final ValidationResult result = await workflow.validate(); - expect(result.type, ValidationType.partial); - }, overrides: { - IMobileDevice: () => MockIMobileDevice(isWorking: false), - }); - - testUsingContext('Emits partial status when libimobiledevice is installed but not working', () async { - when(processManager.run( - ['ideviceinfo', '-u', '00008020-001C2D903C42002E'], - workingDirectory: anyNamed('workingDirectory'), - environment: anyNamed('environment')), - ).thenAnswer((Invocation _) async { - final MockProcessResult result = MockProcessResult(); - when(result.stdout).thenReturn(r''' -Usage: ideviceinfo [OPTIONS] -Show information about a connected device. - - -d, --debug enable communication debugging - -s, --simple use a simple connection to avoid auto-pairing with the device - -u, --udid UDID target specific device by its 40-digit device UDID - -q, --domain NAME set domain of query to NAME. Default: None - -k, --key NAME only query key specified by NAME. Default: All keys. - -x, --xml output information as xml plist instead of key/value pairs - -h, --help prints usage information - '''); - return null; - }); - final IOSWorkflowTestTarget workflow = IOSWorkflowTestTarget(); - final ValidationResult result = await workflow.validate(); - expect(result.type, ValidationType.partial); - }, overrides: { - ProcessManager: () => processManager, - }); - - - testUsingContext('Emits partial status when ios-deploy is not installed', () async { - final IOSWorkflowTestTarget workflow = IOSWorkflowTestTarget(hasIosDeploy: false); - final ValidationResult result = await workflow.validate(); - expect(result.type, ValidationType.partial); - }, overrides: { - IMobileDevice: () => iMobileDevice, - }); - - testUsingContext('Emits partial status when ios-deploy version is too low', () async { - final IOSWorkflowTestTarget workflow = IOSWorkflowTestTarget(iosDeployVersionText: '1.8.0'); - final ValidationResult result = await workflow.validate(); - expect(result.type, ValidationType.partial); - }, overrides: { - IMobileDevice: () => iMobileDevice, - }); - - testUsingContext('Emits partial status when ios-deploy version is a known bad version', () async { - final IOSWorkflowTestTarget workflow = IOSWorkflowTestTarget(iosDeployVersionText: '2.0.0'); - final ValidationResult result = await workflow.validate(); - expect(result.type, ValidationType.partial); - }, overrides: { - IMobileDevice: () => iMobileDevice, - }); - - testUsingContext('Succeeds when all checks pass', () async { - final ValidationResult result = await IOSWorkflowTestTarget().validate(); - expect(result.type, ValidationType.installed); - }, overrides: { - FileSystem: () => fs, - IMobileDevice: () => iMobileDevice, - ProcessManager: () => processManager, - }); - }); -} - -final ProcessResult exitsHappy = ProcessResult( - 1, // pid - 0, // exitCode - '', // stdout - '', // stderr -); - -class MockIMobileDevice extends IMobileDevice { - MockIMobileDevice({ - this.isInstalled = true, - bool isWorking = true, - }) : isWorking = Future.value(isWorking); - - @override - final bool isInstalled; - - @override - final Future isWorking; -} - -class MockProcessManager extends Mock implements ProcessManager {} -class MockProcessResult extends Mock implements ProcessResult {} - -class IOSWorkflowTestTarget extends IOSValidator { - IOSWorkflowTestTarget({ - this.hasHomebrew = true, - bool hasIosDeploy = true, - String iosDeployVersionText = '1.9.4', - bool hasIDeviceInstaller = true, - }) : hasIosDeploy = Future.value(hasIosDeploy), - iosDeployVersionText = Future.value(iosDeployVersionText), - hasIDeviceInstaller = Future.value(hasIDeviceInstaller); - - @override - final bool hasHomebrew; - - @override - final Future hasIosDeploy; - - @override - final Future iosDeployVersionText; - - @override - final Future hasIDeviceInstaller; -} diff --git a/packages/flutter_tools/test/ios/mac_test.dart b/packages/flutter_tools/test/ios/mac_test.dart index 8124ed8e212..de77d6e82bd 100644 --- a/packages/flutter_tools/test/ios/mac_test.dart +++ b/packages/flutter_tools/test/ios/mac_test.dart @@ -9,6 +9,8 @@ import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart' show ProcessException, ProcessResult; import 'package:flutter_tools/src/ios/mac.dart'; import 'package:flutter_tools/src/ios/xcodeproj.dart'; +import 'package:flutter_tools/src/artifacts.dart'; +import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/project.dart'; import 'package:mockito/mockito.dart'; import 'package:platform/platform.dart'; @@ -22,6 +24,8 @@ final Map noColorTerminalOverride = { Platform: _kNoColorTerminalPlatform, }; +class MockArtifacts extends Mock implements Artifacts {} +class MockCache extends Mock implements Cache {} class MockProcessManager extends Mock implements ProcessManager {} class MockFile extends Mock implements File {} class MockXcodeProjectInterpreter extends Mock implements XcodeProjectInterpreter {} @@ -32,41 +36,80 @@ void main() { final FakePlatform osx = FakePlatform.fromPlatform(const LocalPlatform()) ..operatingSystem = 'macos'; MockProcessManager mockProcessManager; + final String libimobiledevicePath = fs.path.join('bin', 'cache', 'artifacts', 'libimobiledevice'); + final String ideviceIdPath = fs.path.join(libimobiledevicePath, 'idevice_id'); + final String ideviceInfoPath = fs.path.join(libimobiledevicePath, 'ideviceinfo'); + final String idevicescreenshotPath = fs.path.join(libimobiledevicePath, 'idevicescreenshot'); + MockArtifacts mockArtifacts; + MockCache mockCache; setUp(() { mockProcessManager = MockProcessManager(); + mockCache = MockCache(); + mockArtifacts = MockArtifacts(); + when(mockArtifacts.getArtifactPath(Artifact.ideviceId, platform: anyNamed('platform'))).thenReturn(ideviceIdPath); + when(mockCache.dyLdLibEntry).thenReturn( + MapEntry('DYLD_LIBRARY_PATH', libimobiledevicePath) + ); + }); + + testUsingContext('isWorking returns false if libimobiledevice is not installed', () async { + when(mockProcessManager.runSync( + [ideviceIdPath, '-h'], environment: anyNamed('environment') + )).thenReturn(ProcessResult(123, 1, '', '')); + expect(await iMobileDevice.isWorking, false); + }, overrides: { + ProcessManager: () => mockProcessManager, + Artifacts: () => mockArtifacts, }); testUsingContext('getAvailableDeviceIDs throws ToolExit when libimobiledevice is not installed', () async { - when(mockProcessManager.run(['idevice_id', '-l'])) - .thenThrow(const ProcessException('idevice_id', ['-l'])); + when(mockProcessManager.run( + [ideviceIdPath, '-l'], + environment: {'DYLD_LIBRARY_PATH': libimobiledevicePath}, + )).thenThrow(ProcessException(ideviceIdPath, ['-l'])); expect(() async => await iMobileDevice.getAvailableDeviceIDs(), throwsToolExit()); }, overrides: { ProcessManager: () => mockProcessManager, + Cache: () => mockCache, + Artifacts: () => mockArtifacts, }); testUsingContext('getAvailableDeviceIDs throws ToolExit when idevice_id returns non-zero', () async { - when(mockProcessManager.run(['idevice_id', '-l'])) - .thenAnswer((_) => Future.value(ProcessResult(1, 1, '', 'Sad today'))); + when(mockProcessManager.run( + [ideviceIdPath, '-l'], + environment: {'DYLD_LIBRARY_PATH': libimobiledevicePath}, + )).thenAnswer((_) => Future.value(ProcessResult(1, 1, '', 'Sad today'))); expect(() async => await iMobileDevice.getAvailableDeviceIDs(), throwsToolExit()); }, overrides: { ProcessManager: () => mockProcessManager, + Cache: () => mockCache, + Artifacts: () => mockArtifacts, }); testUsingContext('getAvailableDeviceIDs returns idevice_id output when installed', () async { - when(mockProcessManager.run(['idevice_id', '-l'])) - .thenAnswer((_) => Future.value(ProcessResult(1, 0, 'foo', ''))); + when(mockProcessManager.run( + [ideviceIdPath, '-l'], + environment: {'DYLD_LIBRARY_PATH': libimobiledevicePath}, + )).thenAnswer((_) => Future.value(ProcessResult(1, 0, 'foo', ''))); expect(await iMobileDevice.getAvailableDeviceIDs(), 'foo'); }, overrides: { ProcessManager: () => mockProcessManager, + Cache: () => mockCache, + Artifacts: () => mockArtifacts, }); testUsingContext('getInfoForDevice throws IOSDeviceNotFoundError when ideviceinfo returns specific error code and message', () async { - when(mockProcessManager.run(['ideviceinfo', '-u', 'foo', '-k', 'bar'])) - .thenAnswer((_) => Future.value(ProcessResult(1, 255, 'No device found with udid foo, is it plugged in?', ''))); + when(mockArtifacts.getArtifactPath(Artifact.ideviceinfo, platform: anyNamed('platform'))).thenReturn(ideviceInfoPath); + when(mockProcessManager.run( + [ideviceInfoPath, '-u', 'foo', '-k', 'bar'], + environment: {'DYLD_LIBRARY_PATH': libimobiledevicePath}, + )).thenAnswer((_) => Future.value(ProcessResult(1, 255, 'No device found with udid foo, is it plugged in?', ''))); expect(() async => await iMobileDevice.getInfoForDevice('foo', 'bar'), throwsA(isInstanceOf())); }, overrides: { ProcessManager: () => mockProcessManager, + Cache: () => mockCache, + Artifacts: () => mockArtifacts, }); group('screenshot', () { @@ -77,14 +120,15 @@ void main() { setUp(() { mockProcessManager = MockProcessManager(); mockOutputFile = MockFile(); + when(mockArtifacts.getArtifactPath(Artifact.idevicescreenshot, platform: anyNamed('platform'))).thenReturn(idevicescreenshotPath); }); testUsingContext('error if idevicescreenshot is not installed', () async { when(mockOutputFile.path).thenReturn(outputPath); // Let `idevicescreenshot` fail with exit code 1. - when(mockProcessManager.run(['idevicescreenshot', outputPath], - environment: null, + when(mockProcessManager.run([idevicescreenshotPath, outputPath], + environment: {'DYLD_LIBRARY_PATH': libimobiledevicePath}, workingDirectory: null, )).thenAnswer((_) => Future.value(ProcessResult(4, 1, '', ''))); @@ -92,20 +136,23 @@ void main() { }, overrides: { ProcessManager: () => mockProcessManager, Platform: () => osx, + Cache: () => mockCache, }); testUsingContext('idevicescreenshot captures and returns screenshot', () async { when(mockOutputFile.path).thenReturn(outputPath); - when(mockProcessManager.run(any, environment: null, workingDirectory: null)).thenAnswer( + when(mockProcessManager.run(any, environment: anyNamed('environment'), workingDirectory: null)).thenAnswer( (Invocation invocation) => Future.value(ProcessResult(4, 0, '', ''))); await iMobileDevice.takeScreenshot(mockOutputFile); - verify(mockProcessManager.run(['idevicescreenshot', outputPath], - environment: null, + verify(mockProcessManager.run([idevicescreenshotPath, outputPath], + environment: {'DYLD_LIBRARY_PATH': libimobiledevicePath}, workingDirectory: null, )); }, overrides: { ProcessManager: () => mockProcessManager, + Cache: () => mockCache, + Artifacts: () => mockArtifacts, }); }); }); diff --git a/packages/flutter_tools/test/macos/cocoapods_validator_test.dart b/packages/flutter_tools/test/macos/cocoapods_validator_test.dart index bd49fc148be..996bd35fd1a 100644 --- a/packages/flutter_tools/test/macos/cocoapods_validator_test.dart +++ b/packages/flutter_tools/test/macos/cocoapods_validator_test.dart @@ -23,7 +23,7 @@ void main() { }); testUsingContext('Emits installed status when CocoaPods is installed', () async { - final CocoaPodsTestTarget workflow = CocoaPodsTestTarget(); + const CocoaPodsValidator workflow = CocoaPodsValidator(); final ValidationResult result = await workflow.validate(); expect(result.type, ValidationType.installed); }, overrides: { @@ -33,7 +33,7 @@ void main() { testUsingContext('Emits missing status when CocoaPods is not installed', () async { when(cocoaPods.evaluateCocoaPodsInstallation) .thenAnswer((_) async => CocoaPodsStatus.notInstalled); - final CocoaPodsTestTarget workflow = CocoaPodsTestTarget(); + const CocoaPodsValidator workflow = CocoaPodsValidator(); final ValidationResult result = await workflow.validate(); expect(result.type, ValidationType.missing); }, overrides: { @@ -43,7 +43,7 @@ void main() { testUsingContext('Emits partial status when CocoaPods is installed with unknown version', () async { when(cocoaPods.evaluateCocoaPodsInstallation) .thenAnswer((_) async => CocoaPodsStatus.unknownVersion); - final CocoaPodsTestTarget workflow = CocoaPodsTestTarget(); + const CocoaPodsValidator workflow = CocoaPodsValidator(); final ValidationResult result = await workflow.validate(); expect(result.type, ValidationType.partial); }, overrides: { @@ -52,7 +52,7 @@ void main() { testUsingContext('Emits partial status when CocoaPods is not initialized', () async { when(cocoaPods.isCocoaPodsInitialized).thenAnswer((_) async => false); - final CocoaPodsTestTarget workflow = CocoaPodsTestTarget(); + const CocoaPodsValidator workflow = CocoaPodsValidator(); final ValidationResult result = await workflow.validate(); expect(result.type, ValidationType.partial); }, overrides: { @@ -62,30 +62,13 @@ void main() { testUsingContext('Emits partial status when CocoaPods version is too low', () async { when(cocoaPods.evaluateCocoaPodsInstallation) .thenAnswer((_) async => CocoaPodsStatus.belowRecommendedVersion); - final CocoaPodsTestTarget workflow = CocoaPodsTestTarget(); + const CocoaPodsValidator workflow = CocoaPodsValidator(); final ValidationResult result = await workflow.validate(); expect(result.type, ValidationType.partial); }, overrides: { CocoaPods: () => cocoaPods, }); - - testUsingContext('Emits installed status when homebrew not installed, but not needed', () async { - final CocoaPodsTestTarget workflow = CocoaPodsTestTarget(hasHomebrew: false); - final ValidationResult result = await workflow.validate(); - expect(result.type, ValidationType.installed); - }, overrides: { - CocoaPods: () => cocoaPods, - }); }); } class MockCocoaPods extends Mock implements CocoaPods {} - -class CocoaPodsTestTarget extends CocoaPodsValidator { - CocoaPodsTestTarget({ - this.hasHomebrew = true, - }); - - @override - final bool hasHomebrew; -} From 7b150f81c5b06a0c86fdc818e2919168e7a931e3 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Fri, 12 Jul 2019 08:48:14 -0700 Subject: [PATCH 38/41] move reload and restart handling into terminal (#35846) --- .../lib/src/resident_runner.dart | 69 +++++----- .../lib/src/resident_web_runner.dart | 14 +- packages/flutter_tools/lib/src/run_cold.dart | 6 + .../test/terminal_handler_test.dart | 128 ++++++++++++++---- 4 files changed, 145 insertions(+), 72 deletions(-) diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart index 94ab8821b48..77c9e94e52b 100644 --- a/packages/flutter_tools/lib/src/resident_runner.dart +++ b/packages/flutter_tools/lib/src/resident_runner.dart @@ -559,6 +559,9 @@ abstract class ResidentRunner { }); } + /// Whether this runner can hot reload. + bool get canHotReload => hotMode; + /// Start the app and keep the process running during its lifetime. /// /// Returns the exit code that we should use for the flutter tool process; 0 @@ -838,35 +841,6 @@ abstract class ResidentRunner { /// Called right before we exit. Future cleanupAtFinish(); - - /// Called when the runner should handle a terminal command. - Future handleTerminalCommand(String code) async { - switch (code) { - case 'r': - final OperationResult result = await restart(fullRestart: false); - if (!result.isOk) { - printStatus('Try again after fixing the above error(s).', emphasis: true); - } - return; - case 'R': - // If hot restart is not supported for all devices, ignore the command. - if (!canHotRestart) { - return; - } - final OperationResult result = await restart(fullRestart: true); - if (!result.isOk) { - printStatus('Try again after fixing the above error(s).', emphasis: true); - } - return; - case 'l': - case 'L': - final List views = flutterDevices.expand((FlutterDevice d) => d.views).toList(); - printStatus('Connected ${pluralize('view', views.length)}:'); - for (FlutterView v in views) { - printStatus('${v.uiIsolate.name} (${v.uiIsolate.id})', indent: 2); - } - } - } } class OperationResult { @@ -918,6 +892,9 @@ class TerminalHandler { bool _processingUserRequest = false; StreamSubscription subscription; + @visibleForTesting + String lastReceivedCommand; + void setupTerminal() { if (!logger.quiet) { printStatus(''); @@ -964,6 +941,14 @@ class TerminalHandler { return true; } return false; + case 'l': + final List views = residentRunner.flutterDevices + .expand((FlutterDevice d) => d.views).toList(); + printStatus('Connected ${pluralize('view', views.length)}:'); + for (FlutterView v in views) { + printStatus('${v.uiIsolate.name} (${v.uiIsolate.id})', indent: 2); + } + return true; case 'L': if (residentRunner.supportsServiceProtocol) { await residentRunner.debugDumpLayerTree(); @@ -1000,6 +985,25 @@ class TerminalHandler { await residentRunner.screenshot(device); } return true; + case 'r': + if (!residentRunner.canHotReload) { + return false; + } + final OperationResult result = await residentRunner.restart(fullRestart: false); + if (!result.isOk) { + printStatus('Try again after fixing the above error(s).', emphasis: true); + } + return true; + case 'R': + // If hot restart is not supported for all devices, ignore the command. + if (!residentRunner.canHotRestart || !residentRunner.hotMode) { + return false; + } + final OperationResult result = await residentRunner.restart(fullRestart: true); + if (!result.isOk) { + printStatus('Try again after fixing the above error(s).', emphasis: true); + } + return true; case 'S': if (residentRunner.supportsServiceProtocol) { await residentRunner.debugDumpSemanticsTreeInTraversalOrder(); @@ -1031,11 +1035,9 @@ class TerminalHandler { await residentRunner.debugToggleDebugCheckElevationsEnabled(); return true; } - return false; } - Future processTerminalInput(String command) async { // When terminal doesn't support line mode, '\n' can sneak into the input. command = command.trim(); @@ -1045,9 +1047,8 @@ class TerminalHandler { } _processingUserRequest = true; try { - final bool handled = await _commonTerminalInputHandler(command); - if (!handled) - await residentRunner.handleTerminalCommand(command); + lastReceivedCommand = command; + await _commonTerminalInputHandler(command); } catch (error, st) { printError('$error\n$st'); await _cleanUpAndExit(null); diff --git a/packages/flutter_tools/lib/src/resident_web_runner.dart b/packages/flutter_tools/lib/src/resident_web_runner.dart index 55dad48efee..be3753639d2 100644 --- a/packages/flutter_tools/lib/src/resident_web_runner.dart +++ b/packages/flutter_tools/lib/src/resident_web_runner.dart @@ -49,6 +49,9 @@ class ResidentWebRunner extends ResidentRunner { WipConnection _connection; final FlutterProject flutterProject; + @override + bool get canHotReload => false; + @override Future attach( {Completer connectionInfoCompleter, @@ -73,17 +76,6 @@ class ResidentWebRunner extends ResidentRunner { await _server?.dispose(); } - @override - Future handleTerminalCommand(String code) async { - if (code == 'R') { - // If hot restart is not supported for all devices, ignore the command. - if (!canHotRestart) { - return; - } - await restart(fullRestart: true); - } - } - @override void printHelp({bool details}) { const String fire = '🔥'; diff --git a/packages/flutter_tools/lib/src/run_cold.dart b/packages/flutter_tools/lib/src/run_cold.dart index ad91f56ab43..6a79afc46ff 100644 --- a/packages/flutter_tools/lib/src/run_cold.dart +++ b/packages/flutter_tools/lib/src/run_cold.dart @@ -38,6 +38,12 @@ class ColdRunner extends ResidentRunner { final File applicationBinary; bool _didAttach = false; + @override + bool get canHotReload => false; + + @override + bool get canHotRestart => false; + @override Future run({ Completer connectionInfoCompleter, diff --git a/packages/flutter_tools/test/terminal_handler_test.dart b/packages/flutter_tools/test/terminal_handler_test.dart index 088c7129be3..6e182ba605b 100644 --- a/packages/flutter_tools/test/terminal_handler_test.dart +++ b/packages/flutter_tools/test/terminal_handler_test.dart @@ -3,9 +3,12 @@ // found in the LICENSE file. import 'dart:async'; +import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/device.dart'; +import 'package:flutter_tools/src/globals.dart'; import 'package:flutter_tools/src/resident_runner.dart'; +import 'package:flutter_tools/src/vmservice.dart'; import 'package:mockito/mockito.dart'; import 'src/common.dart'; @@ -24,37 +27,21 @@ void main() { testUsingContext('single help character', () async { final TestRunner testRunner = createTestRunner(); final TerminalHandler terminalHandler = TerminalHandler(testRunner); - expect(testRunner.hasHelpBeenPrinted, isFalse); + expect(testRunner.hasHelpBeenPrinted, false); await terminalHandler.processTerminalInput('h'); - expect(testRunner.hasHelpBeenPrinted, isTrue); + expect(testRunner.hasHelpBeenPrinted, true); }); testUsingContext('help character surrounded with newlines', () async { final TestRunner testRunner = createTestRunner(); final TerminalHandler terminalHandler = TerminalHandler(testRunner); - expect(testRunner.hasHelpBeenPrinted, isFalse); + expect(testRunner.hasHelpBeenPrinted, false); await terminalHandler.processTerminalInput('\nh\n'); - expect(testRunner.hasHelpBeenPrinted, isTrue); - }); - - testUsingContext('reload character with trailing newline', () async { - final TestRunner testRunner = createTestRunner(); - final TerminalHandler terminalHandler = TerminalHandler(testRunner); - expect(testRunner.receivedCommand, isNull); - await terminalHandler.processTerminalInput('r\n'); - expect(testRunner.receivedCommand, equals('r')); - }); - - testUsingContext('newlines', () async { - final TestRunner testRunner = createTestRunner(); - final TerminalHandler terminalHandler = TerminalHandler(testRunner); - expect(testRunner.receivedCommand, isNull); - await terminalHandler.processTerminalInput('\n\n'); - expect(testRunner.receivedCommand, equals('')); + expect(testRunner.hasHelpBeenPrinted, true); }); }); - group('keycode verification, brought to you by the letter r', () { + group('keycode verification, brought to you by the letter', () { MockResidentRunner mockResidentRunner; TerminalHandler terminalHandler; @@ -62,7 +49,18 @@ void main() { mockResidentRunner = MockResidentRunner(); terminalHandler = TerminalHandler(mockResidentRunner); when(mockResidentRunner.supportsServiceProtocol).thenReturn(true); - when(mockResidentRunner.handleTerminalCommand(any)).thenReturn(null); + }); + + testUsingContext('a, can handle trailing newlines', () async { + await terminalHandler.processTerminalInput('a\n'); + + expect(terminalHandler.lastReceivedCommand, 'a'); + }); + + testUsingContext('n, can handle trailing only newlines', () async { + await terminalHandler.processTerminalInput('\n\n'); + + expect(terminalHandler.lastReceivedCommand, ''); }); testUsingContext('a - debugToggleProfileWidgetBuilds with service protocol', () async { @@ -116,6 +114,19 @@ void main() { verifyNever(mockResidentRunner.debugToggleWidgetInspector()); }); + testUsingContext('l - list flutter views', () async { + final MockFlutterDevice mockFlutterDevice = MockFlutterDevice(); + when(mockResidentRunner.isRunningDebug).thenReturn(true); + when(mockResidentRunner.flutterDevices).thenReturn([mockFlutterDevice]); + when(mockFlutterDevice.views).thenReturn([]); + + await terminalHandler.processTerminalInput('l'); + + final BufferLogger bufferLogger = logger; + + expect(bufferLogger.statusText, contains('Connected views:\n')); + }); + testUsingContext('L - debugDumpLayerTree with service protocol', () async { await terminalHandler.processTerminalInput('L'); @@ -209,6 +220,74 @@ void main() { verify(mockResidentRunner.screenshot(mockFlutterDevice)).called(1); }); + testUsingContext('r - hotReload supported and succeeds', () async { + when(mockResidentRunner.canHotReload).thenReturn(true); + when(mockResidentRunner.restart(fullRestart: false)) + .thenAnswer((Invocation invocation) async { + return OperationResult(0, ''); + }); + await terminalHandler.processTerminalInput('r'); + + verify(mockResidentRunner.restart(fullRestart: false)).called(1); + }); + + testUsingContext('r - hotReload supported and fails', () async { + when(mockResidentRunner.canHotReload).thenReturn(true); + when(mockResidentRunner.restart(fullRestart: false)) + .thenAnswer((Invocation invocation) async { + return OperationResult(1, ''); + }); + await terminalHandler.processTerminalInput('r'); + + verify(mockResidentRunner.restart(fullRestart: false)).called(1); + + final BufferLogger bufferLogger = logger; + + expect(bufferLogger.statusText, contains('Try again after fixing the above error(s).')); + }); + + testUsingContext('r - hotReload unsupported', () async { + when(mockResidentRunner.canHotReload).thenReturn(false); + await terminalHandler.processTerminalInput('r'); + + verifyNever(mockResidentRunner.restart(fullRestart: false)); + }); + + testUsingContext('R - hotRestart supported and succeeds', () async { + when(mockResidentRunner.canHotRestart).thenReturn(true); + when(mockResidentRunner.hotMode).thenReturn(true); + when(mockResidentRunner.restart(fullRestart: true)) + .thenAnswer((Invocation invocation) async { + return OperationResult(0, ''); + }); + await terminalHandler.processTerminalInput('R'); + + verify(mockResidentRunner.restart(fullRestart: true)).called(1); + }); + + testUsingContext('R - hotRestart supported and fails', () async { + when(mockResidentRunner.canHotRestart).thenReturn(true); + when(mockResidentRunner.hotMode).thenReturn(true); + when(mockResidentRunner.restart(fullRestart: true)) + .thenAnswer((Invocation invocation) async { + return OperationResult(1, 'fail'); + }); + await terminalHandler.processTerminalInput('R'); + + verify(mockResidentRunner.restart(fullRestart: true)).called(1); + + final BufferLogger bufferLogger = logger; + + expect(bufferLogger.statusText, contains('Try again after fixing the above error(s).')); + }); + + testUsingContext('R - hot restart unsupported', () async { + when(mockResidentRunner.canHotRestart).thenReturn(false); + await terminalHandler.processTerminalInput('R'); + + verifyNever(mockResidentRunner.restart(fullRestart: true)); + }); + testUsingContext('S - debugDumpSemanticsTreeInTraversalOrder with service protocol', () async { await terminalHandler.processTerminalInput('S'); @@ -306,11 +385,6 @@ class TestRunner extends ResidentRunner { @override Future cleanupAtFinish() async { } - @override - Future handleTerminalCommand(String code) async { - receivedCommand = code; - } - @override void printHelp({ bool details }) { hasHelpBeenPrinted = true; From e91822da24c013aa6f21d03ed3af3587923d9fd2 Mon Sep 17 00:00:00 2001 From: Christopher Fujino Date: Fri, 12 Jul 2019 09:03:34 -0700 Subject: [PATCH 39/41] Revert "Bundle ios dependencies (#34669)" (#36071) This reverts commit 14d489adc5d584490595790ca0deb29da7ee4470. --- .cirrus.yml | 4 +- bin/internal/ideviceinstaller.version | 1 - bin/internal/ios-deploy.version | 1 - bin/internal/libimobiledevice.version | 1 - bin/internal/libplist.version | 1 - bin/internal/openssl.version | 1 - bin/internal/usbmuxd.version | 1 - dev/devicelab/lib/framework/adb.dart | 27 +-- packages/flutter_tools/lib/src/artifacts.dart | 82 ++------ .../flutter_tools/lib/src/base/process.dart | 14 +- .../lib/src/base/user_messages.dart | 41 ++++ packages/flutter_tools/lib/src/cache.dart | 57 +----- .../flutter_tools/lib/src/context_runner.dart | 3 +- packages/flutter_tools/lib/src/doctor.dart | 2 + .../flutter_tools/lib/src/ios/devices.dart | 64 +++---- .../lib/src/ios/ios_workflow.dart | 91 +++++++++ packages/flutter_tools/lib/src/ios/mac.dart | 127 ++----------- .../lib/src/macos/cocoapods.dart | 4 +- .../lib/src/macos/cocoapods_validator.dart | 10 +- packages/flutter_tools/test/cache_test.dart | 16 -- .../test/ios/code_signing_test.dart | 2 +- .../test/ios/ios_workflow_test.dart | 178 ++++++++++++++++++ packages/flutter_tools/test/ios/mac_test.dart | 73 ++----- .../test/macos/cocoapods_validator_test.dart | 27 ++- 24 files changed, 431 insertions(+), 397 deletions(-) delete mode 100644 bin/internal/ideviceinstaller.version delete mode 100644 bin/internal/ios-deploy.version delete mode 100644 bin/internal/libimobiledevice.version delete mode 100644 bin/internal/libplist.version delete mode 100644 bin/internal/openssl.version delete mode 100644 bin/internal/usbmuxd.version create mode 100644 packages/flutter_tools/test/ios/ios_workflow_test.dart diff --git a/.cirrus.yml b/.cirrus.yml index 6674fcc1d8a..204112cec3d 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -21,7 +21,7 @@ task: fingerprint_script: echo $OS; cat bin/internal/engine.version artifacts_cache: folder: bin/cache/artifacts - fingerprint_script: echo $OS; cat bin/internal/*.version + fingerprint_script: echo $OS; cat bin/internal/engine.version setup_script: ./dev/bots/cirrus_setup.sh matrix: - name: docs @@ -298,7 +298,7 @@ task: fingerprint_script: echo %OS% & type bin\internal\engine.version artifacts_cache: folder: bin\cache\artifacts - fingerprint_script: echo %OS% & type bin\internal\*.version + fingerprint_script: echo %OS% & type bin\internal\engine.version setup_script: - flutter config --no-analytics - flutter doctor -v diff --git a/bin/internal/ideviceinstaller.version b/bin/internal/ideviceinstaller.version deleted file mode 100644 index 90f1492fb9d..00000000000 --- a/bin/internal/ideviceinstaller.version +++ /dev/null @@ -1 +0,0 @@ -ab9352110092cf651b5602301371cd00691c7e13 diff --git a/bin/internal/ios-deploy.version b/bin/internal/ios-deploy.version deleted file mode 100644 index 768361896d9..00000000000 --- a/bin/internal/ios-deploy.version +++ /dev/null @@ -1 +0,0 @@ -ea5583388ac0ca035f6b991fd7955bea6492c68c diff --git a/bin/internal/libimobiledevice.version b/bin/internal/libimobiledevice.version deleted file mode 100644 index 0fc801bd3c5..00000000000 --- a/bin/internal/libimobiledevice.version +++ /dev/null @@ -1 +0,0 @@ -398c1208731cb887c64a31c2ae111048b079f80d diff --git a/bin/internal/libplist.version b/bin/internal/libplist.version deleted file mode 100644 index 973064be2b9..00000000000 --- a/bin/internal/libplist.version +++ /dev/null @@ -1 +0,0 @@ -17546f53ac1377b0d4f45a800aaec7366ba5b6a0 diff --git a/bin/internal/openssl.version b/bin/internal/openssl.version deleted file mode 100644 index 400e36a8e95..00000000000 --- a/bin/internal/openssl.version +++ /dev/null @@ -1 +0,0 @@ -03da376ff7504c63a1d00d57cf41bd7b7e93ff65 diff --git a/bin/internal/usbmuxd.version b/bin/internal/usbmuxd.version deleted file mode 100644 index d77b5cf4e91..00000000000 --- a/bin/internal/usbmuxd.version +++ /dev/null @@ -1 +0,0 @@ -60109fdef47dfe0badfb558a6a2105e8fb23660a diff --git a/dev/devicelab/lib/framework/adb.dart b/dev/devicelab/lib/framework/adb.dart index f6db339c35a..e6765c6ab27 100644 --- a/dev/devicelab/lib/framework/adb.dart +++ b/dev/devicelab/lib/framework/adb.dart @@ -392,34 +392,9 @@ class IosDeviceDiscovery implements DeviceDiscovery { _workingDevice = allDevices[math.Random().nextInt(allDevices.length)]; } - // Returns the path to cached binaries relative to devicelab directory - String get _artifactDirPath { - return path.normalize( - path.join( - path.current, - '../../bin/cache/artifacts', - ) - ); - } - - // Returns a colon-separated environment variable that contains the paths - // of linked libraries for idevice_id - Map get _ideviceIdEnvironment { - final String libPath = const [ - 'libimobiledevice', - 'usbmuxd', - 'libplist', - 'openssl', - 'ideviceinstaller', - 'ios-deploy', - ].map((String packageName) => path.join(_artifactDirPath, packageName)).join(':'); - return {'DYLD_LIBRARY_PATH': libPath}; - } - @override Future> discoverDevices() async { - final String ideviceIdPath = path.join(_artifactDirPath, 'libimobiledevice', 'idevice_id'); - final List iosDeviceIDs = LineSplitter.split(await eval(ideviceIdPath, ['-l'], environment: _ideviceIdEnvironment)) + final List iosDeviceIDs = LineSplitter.split(await eval('idevice_id', ['-l'])) .map((String line) => line.trim()) .where((String line) => line.isNotEmpty) .toList(); diff --git a/packages/flutter_tools/lib/src/artifacts.dart b/packages/flutter_tools/lib/src/artifacts.dart index 191fd156714..65a8b630f6e 100644 --- a/packages/flutter_tools/lib/src/artifacts.dart +++ b/packages/flutter_tools/lib/src/artifacts.dart @@ -40,14 +40,6 @@ enum Artifact { kernelWorkerSnapshot, /// The root of the web implementation of the dart SDK. flutterWebSdk, - iosDeploy, - ideviceinfo, - ideviceId, - idevicename, - idevicesyslog, - idevicescreenshot, - ideviceinstaller, - iproxy, /// The root of the Linux desktop sources. linuxDesktopPath, /// The root of the Windows desktop sources. @@ -101,22 +93,6 @@ String _artifactToFileName(Artifact artifact, [ TargetPlatform platform, BuildMo return 'dartdevc.dart.snapshot'; case Artifact.kernelWorkerSnapshot: return 'kernel_worker.dart.snapshot'; - case Artifact.iosDeploy: - return 'ios-deploy'; - case Artifact.ideviceinfo: - return 'ideviceinfo'; - case Artifact.ideviceId: - return 'idevice_id'; - case Artifact.idevicename: - return 'idevicename'; - case Artifact.idevicesyslog: - return 'idevicesyslog'; - case Artifact.idevicescreenshot: - return 'idevicescreenshot'; - case Artifact.ideviceinstaller: - return 'ideviceinstaller'; - case Artifact.iproxy: - return 'iproxy'; case Artifact.linuxDesktopPath: if (platform != TargetPlatform.linux_x64) { throw Exception('${getNameForTargetPlatform(platform)} does not support' @@ -211,26 +187,13 @@ class CachedArtifacts extends Artifacts { } String _getIosArtifactPath(Artifact artifact, TargetPlatform platform, BuildMode mode) { - final String artifactFileName = _artifactToFileName(artifact); + final String engineDir = _getEngineArtifactsPath(platform, mode); switch (artifact) { case Artifact.genSnapshot: case Artifact.snapshotDart: case Artifact.flutterFramework: case Artifact.frontendServerSnapshotForEngineDartSdk: - final String engineDir = _getEngineArtifactsPath(platform, mode); - return fs.path.join(engineDir, artifactFileName); - case Artifact.ideviceId: - case Artifact.ideviceinfo: - case Artifact.idevicescreenshot: - case Artifact.idevicesyslog: - case Artifact.idevicename: - return cache.getArtifactDirectory('libimobiledevice').childFile(artifactFileName).path; - case Artifact.iosDeploy: - return cache.getArtifactDirectory('ios-deploy').childFile(artifactFileName).path; - case Artifact.ideviceinstaller: - return cache.getArtifactDirectory('ideviceinstaller').childFile(artifactFileName).path; - case Artifact.iproxy: - return cache.getArtifactDirectory('usbmuxd').childFile(artifactFileName).path; + return fs.path.join(engineDir, _artifactToFileName(artifact)); default: assert(false, 'Artifact $artifact not available for platform $platform.'); return null; @@ -339,25 +302,24 @@ class LocalEngineArtifacts extends Artifacts { @override String getArtifactPath(Artifact artifact, { TargetPlatform platform, BuildMode mode }) { - final String artifactFileName = _artifactToFileName(artifact); switch (artifact) { case Artifact.snapshotDart: - return fs.path.join(_engineSrcPath, 'flutter', 'lib', 'snapshot', artifactFileName); + return fs.path.join(_engineSrcPath, 'flutter', 'lib', 'snapshot', _artifactToFileName(artifact)); case Artifact.genSnapshot: return _genSnapshotPath(); case Artifact.flutterTester: return _flutterTesterPath(platform); case Artifact.isolateSnapshotData: case Artifact.vmSnapshotData: - return fs.path.join(engineOutPath, 'gen', 'flutter', 'lib', 'snapshot', artifactFileName); + return fs.path.join(engineOutPath, 'gen', 'flutter', 'lib', 'snapshot', _artifactToFileName(artifact)); case Artifact.platformKernelDill: - return fs.path.join(_getFlutterPatchedSdkPath(mode), artifactFileName); + return fs.path.join(_getFlutterPatchedSdkPath(mode), _artifactToFileName(artifact)); case Artifact.platformLibrariesJson: - return fs.path.join(_getFlutterPatchedSdkPath(mode), 'lib', artifactFileName); + return fs.path.join(_getFlutterPatchedSdkPath(mode), 'lib', _artifactToFileName(artifact)); case Artifact.flutterFramework: - return fs.path.join(engineOutPath, artifactFileName); + return fs.path.join(engineOutPath, _artifactToFileName(artifact)); case Artifact.flutterMacOSFramework: - return fs.path.join(engineOutPath, artifactFileName); + return fs.path.join(engineOutPath, _artifactToFileName(artifact)); case Artifact.flutterPatchedSdkPath: // When using local engine always use [BuildMode.debug] regardless of // what was specified in [mode] argument because local engine will @@ -367,35 +329,23 @@ class LocalEngineArtifacts extends Artifacts { case Artifact.flutterWebSdk: return _getFlutterWebSdkPath(); case Artifact.frontendServerSnapshotForEngineDartSdk: - return fs.path.join(_hostEngineOutPath, 'gen', artifactFileName); + return fs.path.join(_hostEngineOutPath, 'gen', _artifactToFileName(artifact)); case Artifact.engineDartSdkPath: return fs.path.join(_hostEngineOutPath, 'dart-sdk'); case Artifact.engineDartBinary: - return fs.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', artifactFileName); + return fs.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', _artifactToFileName(artifact)); case Artifact.dart2jsSnapshot: - return fs.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', 'snapshots', artifactFileName); + return fs.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', 'snapshots', _artifactToFileName(artifact)); case Artifact.dartdevcSnapshot: - return fs.path.join(dartSdkPath, 'bin', 'snapshots', artifactFileName); + return fs.path.join(dartSdkPath, 'bin', 'snapshots', _artifactToFileName(artifact)); case Artifact.kernelWorkerSnapshot: - return fs.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', 'snapshots', artifactFileName); - case Artifact.ideviceId: - case Artifact.ideviceinfo: - case Artifact.idevicename: - case Artifact.idevicescreenshot: - case Artifact.idevicesyslog: - return cache.getArtifactDirectory('libimobiledevice').childFile(artifactFileName).path; - case Artifact.ideviceinstaller: - return cache.getArtifactDirectory('ideviceinstaller').childFile(artifactFileName).path; - case Artifact.iosDeploy: - return cache.getArtifactDirectory('ios-deploy').childFile(artifactFileName).path; - case Artifact.iproxy: - return cache.getArtifactDirectory('usbmuxd').childFile(artifactFileName).path; + return fs.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', 'snapshots', _artifactToFileName(artifact)); case Artifact.linuxDesktopPath: - return fs.path.join(_hostEngineOutPath, artifactFileName); + return fs.path.join(_hostEngineOutPath, _artifactToFileName(artifact)); case Artifact.windowsDesktopPath: - return fs.path.join(_hostEngineOutPath, artifactFileName); + return fs.path.join(_hostEngineOutPath, _artifactToFileName(artifact)); case Artifact.skyEnginePath: - return fs.path.join(_hostEngineOutPath, 'gen', 'dart-pkg', artifactFileName); + return fs.path.join(_hostEngineOutPath, 'gen', 'dart-pkg', _artifactToFileName(artifact)); } assert(false, 'Invalid artifact $artifact.'); return null; diff --git a/packages/flutter_tools/lib/src/base/process.dart b/packages/flutter_tools/lib/src/base/process.dart index 1dd5765821d..47b2949a178 100644 --- a/packages/flutter_tools/lib/src/base/process.dart +++ b/packages/flutter_tools/lib/src/base/process.dart @@ -263,26 +263,20 @@ Future runCheckedAsync( return result; } -bool exitsHappy( - List cli, { - Map environment, -}) { +bool exitsHappy(List cli) { _traceCommand(cli); try { - return processManager.runSync(cli, environment: environment).exitCode == 0; + return processManager.runSync(cli).exitCode == 0; } catch (error) { printTrace('$cli failed with $error'); return false; } } -Future exitsHappyAsync( - List cli, { - Map environment, -}) async { +Future exitsHappyAsync(List cli) async { _traceCommand(cli); try { - return (await processManager.run(cli, environment: environment)).exitCode == 0; + return (await processManager.run(cli)).exitCode == 0; } catch (error) { printTrace('$cli failed with $error'); return false; diff --git a/packages/flutter_tools/lib/src/base/user_messages.dart b/packages/flutter_tools/lib/src/base/user_messages.dart index 0f359b58bef..09af158d940 100644 --- a/packages/flutter_tools/lib/src/base/user_messages.dart +++ b/packages/flutter_tools/lib/src/base/user_messages.dart @@ -145,6 +145,44 @@ class UserMessages { 'Once installed, run:\n' ' sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer'; + // Messages used in IOSValidator + String get iOSIMobileDeviceMissing => + 'libimobiledevice and ideviceinstaller are not installed. To install with Brew, run:\n' + ' brew update\n' + ' brew install --HEAD usbmuxd\n' + ' brew link usbmuxd\n' + ' brew install --HEAD libimobiledevice\n' + ' brew install ideviceinstaller'; + String get iOSIMobileDeviceBroken => + 'Verify that all connected devices have been paired with this computer in Xcode.\n' + 'If all devices have been paired, libimobiledevice and ideviceinstaller may require updating.\n' + 'To update with Brew, run:\n' + ' brew update\n' + ' brew uninstall --ignore-dependencies libimobiledevice\n' + ' brew uninstall --ignore-dependencies usbmuxd\n' + ' brew install --HEAD usbmuxd\n' + ' brew unlink usbmuxd\n' + ' brew link usbmuxd\n' + ' brew install --HEAD libimobiledevice\n' + ' brew install ideviceinstaller'; + String get iOSDeviceInstallerMissing => + 'ideviceinstaller is not installed; this is used to discover connected iOS devices.\n' + 'To install with Brew, run:\n' + ' brew install --HEAD usbmuxd\n' + ' brew link usbmuxd\n' + ' brew install --HEAD libimobiledevice\n' + ' brew install ideviceinstaller'; + String iOSDeployVersion(String version) => 'ios-deploy $version'; + String iOSDeployOutdated(String minVersion) => + 'ios-deploy out of date ($minVersion is required). To upgrade with Brew:\n' + ' brew upgrade ios-deploy'; + String get iOSDeployMissing => + 'ios-deploy not installed. To install:\n' + ' brew install ios-deploy'; + String get iOSBrewMissing => + 'Brew can be used to install tools for iOS device development.\n' + 'Download brew at https://brew.sh/.'; + // Messages used in CocoaPodsValidator String cocoaPodsVersion(String version) => 'CocoaPods version $version'; String cocoaPodsUninitialized(String consequence) => @@ -168,6 +206,9 @@ class UserMessages { '$consequence\n' 'To upgrade:\n' '$upgradeInstructions'; + String get cocoaPodsBrewMissing => + 'Brew can be used to install CocoaPods.\n' + 'Download brew at https://brew.sh/.'; // Messages used in VsCodeValidator String vsCodeVersion(String version) => 'version $version'; diff --git a/packages/flutter_tools/lib/src/cache.dart b/packages/flutter_tools/lib/src/cache.dart index 3a6039d85b5..6d2d13e023d 100644 --- a/packages/flutter_tools/lib/src/cache.dart +++ b/packages/flutter_tools/lib/src/cache.dart @@ -53,7 +53,7 @@ class DevelopmentArtifact { /// Artifacts required by all developments. static const DevelopmentArtifact universal = DevelopmentArtifact._('universal'); - /// The values of DevelopmentArtifacts. + /// The vaulues of DevelopmentArtifacts. static final List values = [ android, iOS, @@ -83,9 +83,6 @@ class Cache { _artifacts.add(LinuxEngineArtifacts(this)); _artifacts.add(LinuxFuchsiaSDKArtifacts(this)); _artifacts.add(MacOSFuchsiaSDKArtifacts(this)); - for (String artifactName in IosUsbArtifacts.artifactNames) { - _artifacts.add(IosUsbArtifacts(artifactName, this)); - } } else { _artifacts.addAll(artifacts); } @@ -224,22 +221,6 @@ class Cache { return getCacheArtifacts().childDirectory(name); } - MapEntry get dyLdLibEntry { - if (_dyLdLibEntry != null) { - return _dyLdLibEntry; - } - final List paths = []; - for (CachedArtifact artifact in _artifacts) { - final String currentPath = artifact.dyLdLibPath; - if (currentPath.isNotEmpty) { - paths.add(currentPath); - } - } - _dyLdLibEntry = MapEntry('DYLD_LIBARY_PATH', paths.join(':')); - return _dyLdLibEntry; - } - MapEntry _dyLdLibEntry; - /// The web sdk has to be co-located with the dart-sdk so that they can share source /// code. Directory getWebSdkDirectory() { @@ -347,9 +328,6 @@ abstract class CachedArtifact { // artifact name. String get stampName => name; - /// Returns a string to be set as environment DYLD_LIBARY_PATH variable - String get dyLdLibPath => ''; - /// All development artifacts this cache provides. final Set developmentArtifacts; @@ -912,39 +890,6 @@ class MacOSFuchsiaSDKArtifacts extends _FuchsiaSDKArtifacts { } } -/// Cached iOS/USB binary artifacts. -class IosUsbArtifacts extends CachedArtifact { - IosUsbArtifacts(String name, Cache cache) : super( - name, - cache, - // This is universal to ensure every command checks for them first - const { DevelopmentArtifact.universal }, - ); - - static const List artifactNames = [ - 'libimobiledevice', - 'usbmuxd', - 'libplist', - 'openssl', - 'ideviceinstaller', - 'ios-deploy', - ]; - - @override - String get dyLdLibPath { - return cache.getArtifactDirectory(name).path; - } - - @override - Future updateInner() { - if (!platform.isMacOS) { - return Future.value(); - } - final Uri archiveUri = Uri.parse('$_storageBaseUrl/flutter_infra/ios-usb-dependencies/$name/$version/$name.zip'); - return _downloadZipArchive('Downloading $name...', archiveUri, location); - } -} - // Many characters are problematic in filenames, especially on Windows. final Map> _flattenNameSubstitutions = >{ r'@'.codeUnitAt(0): '@@'.codeUnits, diff --git a/packages/flutter_tools/lib/src/context_runner.dart b/packages/flutter_tools/lib/src/context_runner.dart index ba5d910ad52..533cfc6fbdf 100644 --- a/packages/flutter_tools/lib/src/context_runner.dart +++ b/packages/flutter_tools/lib/src/context_runner.dart @@ -87,8 +87,9 @@ Future runInContext( FuchsiaWorkflow: () => FuchsiaWorkflow(), GenSnapshot: () => const GenSnapshot(), HotRunnerConfig: () => HotRunnerConfig(), - IMobileDevice: () => IMobileDevice(), + IMobileDevice: () => const IMobileDevice(), IOSSimulatorUtils: () => IOSSimulatorUtils(), + IOSValidator: () => const IOSValidator(), IOSWorkflow: () => const IOSWorkflow(), KernelCompilerFactory: () => const KernelCompilerFactory(), LinuxWorkflow: () => const LinuxWorkflow(), diff --git a/packages/flutter_tools/lib/src/doctor.dart b/packages/flutter_tools/lib/src/doctor.dart index c4aa3a67bca..58ba4de7967 100644 --- a/packages/flutter_tools/lib/src/doctor.dart +++ b/packages/flutter_tools/lib/src/doctor.dart @@ -72,6 +72,8 @@ class _DefaultDoctorValidatorsProvider implements DoctorValidatorsProvider { GroupedValidator([androidValidator, androidLicenseValidator]), if (iosWorkflow.appliesToHostPlatform || macOSWorkflow.appliesToHostPlatform) GroupedValidator([xcodeValidator, cocoapodsValidator]), + if (iosWorkflow.appliesToHostPlatform) + iosValidator, if (webWorkflow.appliesToHostPlatform) const WebValidator(), // Add desktop doctors to workflow if the flag is enabled. diff --git a/packages/flutter_tools/lib/src/ios/devices.dart b/packages/flutter_tools/lib/src/ios/devices.dart index 7007daf077e..3ac80c57f45 100644 --- a/packages/flutter_tools/lib/src/ios/devices.dart +++ b/packages/flutter_tools/lib/src/ios/devices.dart @@ -7,7 +7,6 @@ import 'dart:async'; import 'package:meta/meta.dart'; import '../application_package.dart'; -import '../artifacts.dart'; import '../base/file_system.dart'; import '../base/io.dart'; import '../base/logger.dart'; @@ -24,6 +23,10 @@ import 'code_signing.dart'; import 'ios_workflow.dart'; import 'mac.dart'; +const String _kIdeviceinstallerInstructions = + 'To work with iOS devices, please install ideviceinstaller. To install, run:\n' + 'brew install ideviceinstaller.'; + class IOSDeploy { const IOSDeploy(); @@ -34,15 +37,9 @@ class IOSDeploy { @required String bundlePath, @required List launchArguments, }) async { - final String iosDeployPath = artifacts.getArtifactPath(Artifact.iosDeploy, platform: TargetPlatform.ios); - // TODO(fujino): remove fallback once g3 updated - const List fallbackIosDeployPath = [ + final List launchCommand = [ '/usr/bin/env', 'ios-deploy', - ]; - final List commandList = iosDeployPath != null ? [iosDeployPath] : fallbackIosDeployPath; - final List launchCommand = [ - ...commandList, '--id', deviceId, '--bundle', @@ -64,7 +61,6 @@ class IOSDeploy { // it. final Map iosDeployEnv = Map.from(platform.environment); iosDeployEnv['PATH'] = '/usr/bin:${iosDeployEnv['PATH']}'; - iosDeployEnv.addEntries(>[cache.dyLdLibEntry]); return await runCommandAndStreamOutput( launchCommand, @@ -124,20 +120,8 @@ class IOSDevice extends Device { platformType: PlatformType.ios, ephemeral: true, ) { - if (platform.isMacOS) { - printError('Cannot control iOS devices or simulators. ideviceinstaller and iproxy are not available on your platform.'); - _installerPath = null; - _iproxyPath = null; - return; - } - _installerPath = artifacts.getArtifactPath( - Artifact.ideviceinstaller, - platform: TargetPlatform.ios - ) ?? 'ideviceinstaller'; // TODO(fujino): remove fallback once g3 updated - _iproxyPath = artifacts.getArtifactPath( - Artifact.iproxy, - platform: TargetPlatform.ios - ) ?? 'iproxy'; // TODO(fujino): remove fallback once g3 updated + _installerPath = _checkForCommand('ideviceinstaller'); + _iproxyPath = _checkForCommand('iproxy'); } String _installerPath; @@ -189,6 +173,23 @@ class IOSDevice extends Device { return devices; } + static String _checkForCommand( + String command, [ + String macInstructions = _kIdeviceinstallerInstructions, + ]) { + try { + command = runCheckedSync(['which', command]).trim(); + } catch (e) { + if (platform.isMacOS) { + printError('$command not found. $macInstructions'); + } else { + printError('Cannot control iOS devices or simulators. $command is not available on your platform.'); + } + return null; + } + return command; + } + @override Future isAppInstalled(ApplicationPackage app) async { try { @@ -588,17 +589,12 @@ class _IOSDevicePortForwarder extends DevicePortForwarder { while (!connected) { printTrace('attempting to forward device port $devicePort to host port $hostPort'); // Usage: iproxy LOCAL_TCP_PORT DEVICE_TCP_PORT UDID - process = await runCommand( - [ - device._iproxyPath, - hostPort.toString(), - devicePort.toString(), - device.id, - ], - environment: Map.fromEntries( - >[cache.dyLdLibEntry], - ), - ); + process = await runCommand([ + device._iproxyPath, + hostPort.toString(), + devicePort.toString(), + device.id, + ]); // TODO(ianh): This is a flakey race condition, https://github.com/libimobiledevice/libimobiledevice/issues/674 connected = !await process.stdout.isEmpty.timeout(_kiProxyPortForwardTimeout, onTimeout: () => false); if (!connected) { diff --git a/packages/flutter_tools/lib/src/ios/ios_workflow.dart b/packages/flutter_tools/lib/src/ios/ios_workflow.dart index f21dffd8141..cf95c30c8d4 100644 --- a/packages/flutter_tools/lib/src/ios/ios_workflow.dart +++ b/packages/flutter_tools/lib/src/ios/ios_workflow.dart @@ -2,13 +2,21 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; + import '../base/context.dart'; +import '../base/os.dart'; import '../base/platform.dart'; +import '../base/process.dart'; +import '../base/user_messages.dart'; +import '../base/version.dart'; import '../doctor.dart'; import '../macos/xcode.dart'; +import 'mac.dart'; import 'plist_utils.dart' as plist; IOSWorkflow get iosWorkflow => context.get(); +IOSValidator get iosValidator => context.get(); class IOSWorkflow implements Workflow { const IOSWorkflow(); @@ -32,3 +40,86 @@ class IOSWorkflow implements Workflow { return plist.getValueFromFile(path, key); } } + +class IOSValidator extends DoctorValidator { + + const IOSValidator() : super('iOS tools - develop for iOS devices'); + + Future get hasIDeviceInstaller => exitsHappyAsync(['ideviceinstaller', '-h']); + + Future get hasIosDeploy => exitsHappyAsync(['ios-deploy', '--version']); + + String get iosDeployMinimumVersion => '1.9.4'; + + // ios-deploy <= v1.9.3 declares itself as v2.0.0 + List get iosDeployBadVersions => ['2.0.0']; + + Future get iosDeployVersionText async => (await runAsync(['ios-deploy', '--version'])).processResult.stdout.replaceAll('\n', ''); + + bool get hasHomebrew => os.which('brew') != null; + + Future get macDevMode async => (await runAsync(['DevToolsSecurity', '-status'])).processResult.stdout; + + Future get _iosDeployIsInstalledAndMeetsVersionCheck async { + if (!await hasIosDeploy) + return false; + try { + final Version version = Version.parse(await iosDeployVersionText); + return version >= Version.parse(iosDeployMinimumVersion) + && !iosDeployBadVersions.map((String v) => Version.parse(v)).contains(version); + } on FormatException catch (_) { + return false; + } + } + + // Change this value if the number of checks for packages needed for installation changes + static const int totalChecks = 4; + + @override + Future validate() async { + final List messages = []; + ValidationType packageManagerStatus = ValidationType.installed; + + int checksFailed = 0; + + if (!iMobileDevice.isInstalled) { + checksFailed += 3; + packageManagerStatus = ValidationType.partial; + messages.add(ValidationMessage.error(userMessages.iOSIMobileDeviceMissing)); + } else if (!await iMobileDevice.isWorking) { + checksFailed += 2; + packageManagerStatus = ValidationType.partial; + messages.add(ValidationMessage.error(userMessages.iOSIMobileDeviceBroken)); + } else if (!await hasIDeviceInstaller) { + checksFailed += 1; + packageManagerStatus = ValidationType.partial; + messages.add(ValidationMessage.error(userMessages.iOSDeviceInstallerMissing)); + } + + final bool iHasIosDeploy = await hasIosDeploy; + + // Check ios-deploy is installed at meets version requirements. + if (iHasIosDeploy) { + messages.add(ValidationMessage(userMessages.iOSDeployVersion(await iosDeployVersionText))); + } + if (!await _iosDeployIsInstalledAndMeetsVersionCheck) { + packageManagerStatus = ValidationType.partial; + if (iHasIosDeploy) { + messages.add(ValidationMessage.error(userMessages.iOSDeployOutdated(iosDeployMinimumVersion))); + } else { + checksFailed += 1; + messages.add(ValidationMessage.error(userMessages.iOSDeployMissing)); + } + } + + // If one of the checks for the packages failed, we may need brew so that we can install + // the necessary packages. If they're all there, however, we don't even need it. + if (checksFailed == totalChecks) + packageManagerStatus = ValidationType.missing; + if (checksFailed > 0 && !hasHomebrew) { + messages.add(ValidationMessage.hint(userMessages.iOSBrewMissing)); + } + + return ValidationResult(packageManagerStatus, messages); + } +} diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart index 2bcdd594631..dcc7f5acdc6 100644 --- a/packages/flutter_tools/lib/src/ios/mac.dart +++ b/packages/flutter_tools/lib/src/ios/mac.dart @@ -7,7 +7,6 @@ import 'dart:async'; import 'package:meta/meta.dart'; import '../application_package.dart'; -import '../artifacts.dart'; import '../base/common.dart'; import '../base/context.dart'; import '../base/file_system.dart'; @@ -43,99 +42,35 @@ class IOSDeviceNotFoundError implements Exception { } class IMobileDevice { - IMobileDevice() - : _ideviceIdPath = artifacts.getArtifactPath(Artifact.ideviceId, platform: TargetPlatform.ios) - ?? 'idevice_id', // TODO(fujino): remove fallback once g3 updated - _ideviceinfoPath = artifacts.getArtifactPath(Artifact.ideviceinfo, platform: TargetPlatform.ios) - ?? 'ideviceinfo', // TODO(fujino): remove fallback once g3 updated - _idevicenamePath = artifacts.getArtifactPath(Artifact.idevicename, platform: TargetPlatform.ios) - ?? 'idevicename', // TODO(fujino): remove fallback once g3 updated - _idevicesyslogPath = artifacts.getArtifactPath(Artifact.idevicesyslog, platform: TargetPlatform.ios) - ?? 'idevicesyslog', // TODO(fujino): remove fallback once g3 updated - _idevicescreenshotPath = artifacts.getArtifactPath(Artifact.idevicescreenshot, platform: TargetPlatform.ios) - ?? 'idevicescreenshot' { // TODO(fujino): remove fallback once g3 updated - } - final String _ideviceIdPath; - final String _ideviceinfoPath; - final String _idevicenamePath; - final String _idevicesyslogPath; - final String _idevicescreenshotPath; + const IMobileDevice(); - bool get isInstalled { - _isInstalled ??= exitsHappy( - [ - _ideviceIdPath, - '-h' - ], - environment: Map.fromEntries( - >[cache.dyLdLibEntry] - ), - ); - return _isInstalled; - } - bool _isInstalled; + bool get isInstalled => exitsHappy(['idevice_id', '-h']); /// Returns true if libimobiledevice is installed and working as expected. /// /// Older releases of libimobiledevice fail to work with iOS 10.3 and above. Future get isWorking async { - if (_isWorking != null) { - return _isWorking; - } - if (!isInstalled) { - _isWorking = false; - return _isWorking; - } + if (!isInstalled) + return false; // If usage info is printed in a hyphenated id, we need to update. const String fakeIphoneId = '00008020-001C2D903C42002E'; - final Map executionEnv = Map.fromEntries( - >[cache.dyLdLibEntry] - ); - final ProcessResult ideviceResult = (await runAsync( - [ - _ideviceinfoPath, - '-u', - fakeIphoneId - ], - environment: executionEnv, - )).processResult; + final ProcessResult ideviceResult = (await runAsync(['ideviceinfo', '-u', fakeIphoneId])).processResult; if (ideviceResult.stdout.contains('Usage: ideviceinfo')) { - _isWorking = false; - return _isWorking; + return false; } // If no device is attached, we're unable to detect any problems. Assume all is well. - final ProcessResult result = (await runAsync( - [ - _ideviceIdPath, - '-l', - ], - environment: executionEnv, - )).processResult; - if (result.exitCode == 0 && result.stdout.isEmpty) { - _isWorking = true; - } else { - // Check that we can look up the names of any attached devices. - _isWorking = await exitsHappyAsync( - [_idevicenamePath], - environment: executionEnv, - ); - } - return _isWorking; + final ProcessResult result = (await runAsync(['idevice_id', '-l'])).processResult; + if (result.exitCode == 0 && result.stdout.isEmpty) + return true; + + // Check that we can look up the names of any attached devices. + return await exitsHappyAsync(['idevicename']); } - bool _isWorking; Future getAvailableDeviceIDs() async { try { - final ProcessResult result = await processManager.run( - [ - _ideviceIdPath, - '-l' - ], - environment: Map.fromEntries( - >[cache.dyLdLibEntry] - ), - ); + final ProcessResult result = await processManager.run(['idevice_id', '-l']); if (result.exitCode != 0) throw ToolExit('idevice_id returned an error:\n${result.stderr}'); return result.stdout; @@ -146,18 +81,7 @@ class IMobileDevice { Future getInfoForDevice(String deviceID, String key) async { try { - final ProcessResult result = await processManager.run( - [ - _ideviceinfoPath, - '-u', - deviceID, - '-k', - key - ], - environment: Map.fromEntries( - >[cache.dyLdLibEntry] - ), - ); + final ProcessResult result = await processManager.run(['ideviceinfo', '-u', deviceID, '-k', key]); if (result.exitCode == 255 && result.stdout != null && result.stdout.contains('No device found')) throw IOSDeviceNotFoundError('ideviceinfo could not find device:\n${result.stdout}'); if (result.exitCode != 0) @@ -169,30 +93,11 @@ class IMobileDevice { } /// Starts `idevicesyslog` and returns the running process. - Future startLogger(String deviceID) { - return runCommand( - [ - _idevicesyslogPath, - '-u', - deviceID, - ], - environment: Map.fromEntries( - >[cache.dyLdLibEntry] - ), - ); - } + Future startLogger(String deviceID) => runCommand(['idevicesyslog', '-u', deviceID]); /// Captures a screenshot to the specified outputFile. Future takeScreenshot(File outputFile) { - return runCheckedAsync( - [ - _idevicescreenshotPath, - outputFile.path - ], - environment: Map.fromEntries( - >[cache.dyLdLibEntry] - ), - ); + return runCheckedAsync(['idevicescreenshot', outputFile.path]); } } diff --git a/packages/flutter_tools/lib/src/macos/cocoapods.dart b/packages/flutter_tools/lib/src/macos/cocoapods.dart index 9729387c9cd..9462395b728 100644 --- a/packages/flutter_tools/lib/src/macos/cocoapods.dart +++ b/packages/flutter_tools/lib/src/macos/cocoapods.dart @@ -30,11 +30,11 @@ const String unknownCocoaPodsConsequence = ''' Ensure that the output of 'pod --version' contains only digits and . to be recognized by Flutter.'''; const String cocoaPodsInstallInstructions = ''' - sudo gem install cocoapods + brew install cocoapods pod setup'''; const String cocoaPodsUpgradeInstructions = ''' - sudo gem install cocoapods + brew upgrade cocoapods pod setup'''; CocoaPods get cocoaPods => context.get(); diff --git a/packages/flutter_tools/lib/src/macos/cocoapods_validator.dart b/packages/flutter_tools/lib/src/macos/cocoapods_validator.dart index aaee7455727..615c3f54b3e 100644 --- a/packages/flutter_tools/lib/src/macos/cocoapods_validator.dart +++ b/packages/flutter_tools/lib/src/macos/cocoapods_validator.dart @@ -5,6 +5,7 @@ import 'dart:async'; import '../base/context.dart'; +import '../base/os.dart'; import '../base/user_messages.dart'; import '../doctor.dart'; import 'cocoapods.dart'; @@ -14,6 +15,8 @@ CocoaPodsValidator get cocoapodsValidator => context.get(); class CocoaPodsValidator extends DoctorValidator { const CocoaPodsValidator() : super('CocoaPods subvalidator'); + bool get hasHomebrew => os.which('brew') != null; + @override Future validate() async { final List messages = []; @@ -45,6 +48,11 @@ class CocoaPodsValidator extends DoctorValidator { } } + // Only check/report homebrew status if CocoaPods isn't installed. + if (status == ValidationType.missing && !hasHomebrew) { + messages.add(ValidationMessage.hint(userMessages.cocoaPodsBrewMissing)); + } + return ValidationResult(status, messages); } -} +} \ No newline at end of file diff --git a/packages/flutter_tools/test/cache_test.dart b/packages/flutter_tools/test/cache_test.dart index 64a7e584a18..a95964a5519 100644 --- a/packages/flutter_tools/test/cache_test.dart +++ b/packages/flutter_tools/test/cache_test.dart @@ -107,22 +107,6 @@ void main() { verifyNever(artifact1.update({})); verify(artifact2.update({})); }); - testUsingContext('getter dyLdLibEntry concatenates the output of each artifact\'s dyLdLibEntry getter', () async { - final CachedArtifact artifact1 = MockCachedArtifact(); - final CachedArtifact artifact2 = MockCachedArtifact(); - final CachedArtifact artifact3 = MockCachedArtifact(); - when(artifact1.dyLdLibPath).thenReturn('/path/to/alpha:/path/to/beta'); - when(artifact2.dyLdLibPath).thenReturn('/path/to/gamma:/path/to/delta:/path/to/epsilon'); - when(artifact3.dyLdLibPath).thenReturn(''); // Empty output - final Cache cache = Cache(artifacts: [artifact1, artifact2, artifact3]); - expect(cache.dyLdLibEntry.key, 'DYLD_LIBARY_PATH'); - expect( - cache.dyLdLibEntry.value, - '/path/to/alpha:/path/to/beta:/path/to/gamma:/path/to/delta:/path/to/epsilon', - ); - }, overrides: { - Cache: ()=> mockCache, - }); testUsingContext('failed storage.googleapis.com download shows China warning', () async { final CachedArtifact artifact1 = MockCachedArtifact(); final CachedArtifact artifact2 = MockCachedArtifact(); diff --git a/packages/flutter_tools/test/ios/code_signing_test.dart b/packages/flutter_tools/test/ios/code_signing_test.dart index ecea51fc71a..9d381a054ab 100644 --- a/packages/flutter_tools/test/ios/code_signing_test.dart +++ b/packages/flutter_tools/test/ios/code_signing_test.dart @@ -425,7 +425,7 @@ void main() { final Map signingConfigs = await getCodeSigningIdentityDevelopmentTeam(iosApp: app); expect( - testLogger.errorText.replaceAll('\n', ' '), + testLogger.errorText, contains('Saved signing certificate "iPhone Developer: Invalid Profile" is not a valid development certificate'), ); expect( diff --git a/packages/flutter_tools/test/ios/ios_workflow_test.dart b/packages/flutter_tools/test/ios/ios_workflow_test.dart new file mode 100644 index 00000000000..a2e37453062 --- /dev/null +++ b/packages/flutter_tools/test/ios/ios_workflow_test.dart @@ -0,0 +1,178 @@ +// Copyright 2017 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 'package:file/memory.dart'; +import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/io.dart'; +import 'package:flutter_tools/src/doctor.dart'; +import 'package:flutter_tools/src/ios/ios_workflow.dart'; +import 'package:flutter_tools/src/ios/mac.dart'; +import 'package:mockito/mockito.dart'; +import 'package:process/process.dart'; + +import '../src/common.dart'; +import '../src/context.dart'; + +void main() { + group('iOS Workflow validation', () { + MockIMobileDevice iMobileDevice; + MockIMobileDevice iMobileDeviceUninstalled; + MockProcessManager processManager; + FileSystem fs; + + setUp(() { + iMobileDevice = MockIMobileDevice(); + iMobileDeviceUninstalled = MockIMobileDevice(isInstalled: false); + processManager = MockProcessManager(); + fs = MemoryFileSystem(); + }); + + testUsingContext('Emit missing status when nothing is installed', () async { + final IOSWorkflowTestTarget workflow = IOSWorkflowTestTarget( + hasHomebrew: false, + hasIosDeploy: false, + hasIDeviceInstaller: false, + iosDeployVersionText: '0.0.0', + ); + final ValidationResult result = await workflow.validate(); + expect(result.type, ValidationType.missing); + }, overrides: { + IMobileDevice: () => iMobileDeviceUninstalled, + }); + + testUsingContext('Emits installed status when homebrew not installed, but not needed', () async { + final IOSWorkflowTestTarget workflow = IOSWorkflowTestTarget(hasHomebrew: false); + final ValidationResult result = await workflow.validate(); + expect(result.type, ValidationType.installed); + }, overrides: { + IMobileDevice: () => iMobileDevice, + }); + + testUsingContext('Emits partial status when libimobiledevice is not installed', () async { + final IOSWorkflowTestTarget workflow = IOSWorkflowTestTarget(); + final ValidationResult result = await workflow.validate(); + expect(result.type, ValidationType.partial); + }, overrides: { + IMobileDevice: () => MockIMobileDevice(isInstalled: false, isWorking: false), + }); + + testUsingContext('Emits partial status when libimobiledevice is installed but not working', () async { + final IOSWorkflowTestTarget workflow = IOSWorkflowTestTarget(); + final ValidationResult result = await workflow.validate(); + expect(result.type, ValidationType.partial); + }, overrides: { + IMobileDevice: () => MockIMobileDevice(isWorking: false), + }); + + testUsingContext('Emits partial status when libimobiledevice is installed but not working', () async { + when(processManager.run( + ['ideviceinfo', '-u', '00008020-001C2D903C42002E'], + workingDirectory: anyNamed('workingDirectory'), + environment: anyNamed('environment')), + ).thenAnswer((Invocation _) async { + final MockProcessResult result = MockProcessResult(); + when(result.stdout).thenReturn(r''' +Usage: ideviceinfo [OPTIONS] +Show information about a connected device. + + -d, --debug enable communication debugging + -s, --simple use a simple connection to avoid auto-pairing with the device + -u, --udid UDID target specific device by its 40-digit device UDID + -q, --domain NAME set domain of query to NAME. Default: None + -k, --key NAME only query key specified by NAME. Default: All keys. + -x, --xml output information as xml plist instead of key/value pairs + -h, --help prints usage information + '''); + return null; + }); + final IOSWorkflowTestTarget workflow = IOSWorkflowTestTarget(); + final ValidationResult result = await workflow.validate(); + expect(result.type, ValidationType.partial); + }, overrides: { + ProcessManager: () => processManager, + }); + + + testUsingContext('Emits partial status when ios-deploy is not installed', () async { + final IOSWorkflowTestTarget workflow = IOSWorkflowTestTarget(hasIosDeploy: false); + final ValidationResult result = await workflow.validate(); + expect(result.type, ValidationType.partial); + }, overrides: { + IMobileDevice: () => iMobileDevice, + }); + + testUsingContext('Emits partial status when ios-deploy version is too low', () async { + final IOSWorkflowTestTarget workflow = IOSWorkflowTestTarget(iosDeployVersionText: '1.8.0'); + final ValidationResult result = await workflow.validate(); + expect(result.type, ValidationType.partial); + }, overrides: { + IMobileDevice: () => iMobileDevice, + }); + + testUsingContext('Emits partial status when ios-deploy version is a known bad version', () async { + final IOSWorkflowTestTarget workflow = IOSWorkflowTestTarget(iosDeployVersionText: '2.0.0'); + final ValidationResult result = await workflow.validate(); + expect(result.type, ValidationType.partial); + }, overrides: { + IMobileDevice: () => iMobileDevice, + }); + + testUsingContext('Succeeds when all checks pass', () async { + final ValidationResult result = await IOSWorkflowTestTarget().validate(); + expect(result.type, ValidationType.installed); + }, overrides: { + FileSystem: () => fs, + IMobileDevice: () => iMobileDevice, + ProcessManager: () => processManager, + }); + }); +} + +final ProcessResult exitsHappy = ProcessResult( + 1, // pid + 0, // exitCode + '', // stdout + '', // stderr +); + +class MockIMobileDevice extends IMobileDevice { + MockIMobileDevice({ + this.isInstalled = true, + bool isWorking = true, + }) : isWorking = Future.value(isWorking); + + @override + final bool isInstalled; + + @override + final Future isWorking; +} + +class MockProcessManager extends Mock implements ProcessManager {} +class MockProcessResult extends Mock implements ProcessResult {} + +class IOSWorkflowTestTarget extends IOSValidator { + IOSWorkflowTestTarget({ + this.hasHomebrew = true, + bool hasIosDeploy = true, + String iosDeployVersionText = '1.9.4', + bool hasIDeviceInstaller = true, + }) : hasIosDeploy = Future.value(hasIosDeploy), + iosDeployVersionText = Future.value(iosDeployVersionText), + hasIDeviceInstaller = Future.value(hasIDeviceInstaller); + + @override + final bool hasHomebrew; + + @override + final Future hasIosDeploy; + + @override + final Future iosDeployVersionText; + + @override + final Future hasIDeviceInstaller; +} diff --git a/packages/flutter_tools/test/ios/mac_test.dart b/packages/flutter_tools/test/ios/mac_test.dart index de77d6e82bd..8124ed8e212 100644 --- a/packages/flutter_tools/test/ios/mac_test.dart +++ b/packages/flutter_tools/test/ios/mac_test.dart @@ -9,8 +9,6 @@ import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart' show ProcessException, ProcessResult; import 'package:flutter_tools/src/ios/mac.dart'; import 'package:flutter_tools/src/ios/xcodeproj.dart'; -import 'package:flutter_tools/src/artifacts.dart'; -import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/project.dart'; import 'package:mockito/mockito.dart'; import 'package:platform/platform.dart'; @@ -24,8 +22,6 @@ final Map noColorTerminalOverride = { Platform: _kNoColorTerminalPlatform, }; -class MockArtifacts extends Mock implements Artifacts {} -class MockCache extends Mock implements Cache {} class MockProcessManager extends Mock implements ProcessManager {} class MockFile extends Mock implements File {} class MockXcodeProjectInterpreter extends Mock implements XcodeProjectInterpreter {} @@ -36,80 +32,41 @@ void main() { final FakePlatform osx = FakePlatform.fromPlatform(const LocalPlatform()) ..operatingSystem = 'macos'; MockProcessManager mockProcessManager; - final String libimobiledevicePath = fs.path.join('bin', 'cache', 'artifacts', 'libimobiledevice'); - final String ideviceIdPath = fs.path.join(libimobiledevicePath, 'idevice_id'); - final String ideviceInfoPath = fs.path.join(libimobiledevicePath, 'ideviceinfo'); - final String idevicescreenshotPath = fs.path.join(libimobiledevicePath, 'idevicescreenshot'); - MockArtifacts mockArtifacts; - MockCache mockCache; setUp(() { mockProcessManager = MockProcessManager(); - mockCache = MockCache(); - mockArtifacts = MockArtifacts(); - when(mockArtifacts.getArtifactPath(Artifact.ideviceId, platform: anyNamed('platform'))).thenReturn(ideviceIdPath); - when(mockCache.dyLdLibEntry).thenReturn( - MapEntry('DYLD_LIBRARY_PATH', libimobiledevicePath) - ); - }); - - testUsingContext('isWorking returns false if libimobiledevice is not installed', () async { - when(mockProcessManager.runSync( - [ideviceIdPath, '-h'], environment: anyNamed('environment') - )).thenReturn(ProcessResult(123, 1, '', '')); - expect(await iMobileDevice.isWorking, false); - }, overrides: { - ProcessManager: () => mockProcessManager, - Artifacts: () => mockArtifacts, }); testUsingContext('getAvailableDeviceIDs throws ToolExit when libimobiledevice is not installed', () async { - when(mockProcessManager.run( - [ideviceIdPath, '-l'], - environment: {'DYLD_LIBRARY_PATH': libimobiledevicePath}, - )).thenThrow(ProcessException(ideviceIdPath, ['-l'])); + when(mockProcessManager.run(['idevice_id', '-l'])) + .thenThrow(const ProcessException('idevice_id', ['-l'])); expect(() async => await iMobileDevice.getAvailableDeviceIDs(), throwsToolExit()); }, overrides: { ProcessManager: () => mockProcessManager, - Cache: () => mockCache, - Artifacts: () => mockArtifacts, }); testUsingContext('getAvailableDeviceIDs throws ToolExit when idevice_id returns non-zero', () async { - when(mockProcessManager.run( - [ideviceIdPath, '-l'], - environment: {'DYLD_LIBRARY_PATH': libimobiledevicePath}, - )).thenAnswer((_) => Future.value(ProcessResult(1, 1, '', 'Sad today'))); + when(mockProcessManager.run(['idevice_id', '-l'])) + .thenAnswer((_) => Future.value(ProcessResult(1, 1, '', 'Sad today'))); expect(() async => await iMobileDevice.getAvailableDeviceIDs(), throwsToolExit()); }, overrides: { ProcessManager: () => mockProcessManager, - Cache: () => mockCache, - Artifacts: () => mockArtifacts, }); testUsingContext('getAvailableDeviceIDs returns idevice_id output when installed', () async { - when(mockProcessManager.run( - [ideviceIdPath, '-l'], - environment: {'DYLD_LIBRARY_PATH': libimobiledevicePath}, - )).thenAnswer((_) => Future.value(ProcessResult(1, 0, 'foo', ''))); + when(mockProcessManager.run(['idevice_id', '-l'])) + .thenAnswer((_) => Future.value(ProcessResult(1, 0, 'foo', ''))); expect(await iMobileDevice.getAvailableDeviceIDs(), 'foo'); }, overrides: { ProcessManager: () => mockProcessManager, - Cache: () => mockCache, - Artifacts: () => mockArtifacts, }); testUsingContext('getInfoForDevice throws IOSDeviceNotFoundError when ideviceinfo returns specific error code and message', () async { - when(mockArtifacts.getArtifactPath(Artifact.ideviceinfo, platform: anyNamed('platform'))).thenReturn(ideviceInfoPath); - when(mockProcessManager.run( - [ideviceInfoPath, '-u', 'foo', '-k', 'bar'], - environment: {'DYLD_LIBRARY_PATH': libimobiledevicePath}, - )).thenAnswer((_) => Future.value(ProcessResult(1, 255, 'No device found with udid foo, is it plugged in?', ''))); + when(mockProcessManager.run(['ideviceinfo', '-u', 'foo', '-k', 'bar'])) + .thenAnswer((_) => Future.value(ProcessResult(1, 255, 'No device found with udid foo, is it plugged in?', ''))); expect(() async => await iMobileDevice.getInfoForDevice('foo', 'bar'), throwsA(isInstanceOf())); }, overrides: { ProcessManager: () => mockProcessManager, - Cache: () => mockCache, - Artifacts: () => mockArtifacts, }); group('screenshot', () { @@ -120,15 +77,14 @@ void main() { setUp(() { mockProcessManager = MockProcessManager(); mockOutputFile = MockFile(); - when(mockArtifacts.getArtifactPath(Artifact.idevicescreenshot, platform: anyNamed('platform'))).thenReturn(idevicescreenshotPath); }); testUsingContext('error if idevicescreenshot is not installed', () async { when(mockOutputFile.path).thenReturn(outputPath); // Let `idevicescreenshot` fail with exit code 1. - when(mockProcessManager.run([idevicescreenshotPath, outputPath], - environment: {'DYLD_LIBRARY_PATH': libimobiledevicePath}, + when(mockProcessManager.run(['idevicescreenshot', outputPath], + environment: null, workingDirectory: null, )).thenAnswer((_) => Future.value(ProcessResult(4, 1, '', ''))); @@ -136,23 +92,20 @@ void main() { }, overrides: { ProcessManager: () => mockProcessManager, Platform: () => osx, - Cache: () => mockCache, }); testUsingContext('idevicescreenshot captures and returns screenshot', () async { when(mockOutputFile.path).thenReturn(outputPath); - when(mockProcessManager.run(any, environment: anyNamed('environment'), workingDirectory: null)).thenAnswer( + when(mockProcessManager.run(any, environment: null, workingDirectory: null)).thenAnswer( (Invocation invocation) => Future.value(ProcessResult(4, 0, '', ''))); await iMobileDevice.takeScreenshot(mockOutputFile); - verify(mockProcessManager.run([idevicescreenshotPath, outputPath], - environment: {'DYLD_LIBRARY_PATH': libimobiledevicePath}, + verify(mockProcessManager.run(['idevicescreenshot', outputPath], + environment: null, workingDirectory: null, )); }, overrides: { ProcessManager: () => mockProcessManager, - Cache: () => mockCache, - Artifacts: () => mockArtifacts, }); }); }); diff --git a/packages/flutter_tools/test/macos/cocoapods_validator_test.dart b/packages/flutter_tools/test/macos/cocoapods_validator_test.dart index 996bd35fd1a..bd49fc148be 100644 --- a/packages/flutter_tools/test/macos/cocoapods_validator_test.dart +++ b/packages/flutter_tools/test/macos/cocoapods_validator_test.dart @@ -23,7 +23,7 @@ void main() { }); testUsingContext('Emits installed status when CocoaPods is installed', () async { - const CocoaPodsValidator workflow = CocoaPodsValidator(); + final CocoaPodsTestTarget workflow = CocoaPodsTestTarget(); final ValidationResult result = await workflow.validate(); expect(result.type, ValidationType.installed); }, overrides: { @@ -33,7 +33,7 @@ void main() { testUsingContext('Emits missing status when CocoaPods is not installed', () async { when(cocoaPods.evaluateCocoaPodsInstallation) .thenAnswer((_) async => CocoaPodsStatus.notInstalled); - const CocoaPodsValidator workflow = CocoaPodsValidator(); + final CocoaPodsTestTarget workflow = CocoaPodsTestTarget(); final ValidationResult result = await workflow.validate(); expect(result.type, ValidationType.missing); }, overrides: { @@ -43,7 +43,7 @@ void main() { testUsingContext('Emits partial status when CocoaPods is installed with unknown version', () async { when(cocoaPods.evaluateCocoaPodsInstallation) .thenAnswer((_) async => CocoaPodsStatus.unknownVersion); - const CocoaPodsValidator workflow = CocoaPodsValidator(); + final CocoaPodsTestTarget workflow = CocoaPodsTestTarget(); final ValidationResult result = await workflow.validate(); expect(result.type, ValidationType.partial); }, overrides: { @@ -52,7 +52,7 @@ void main() { testUsingContext('Emits partial status when CocoaPods is not initialized', () async { when(cocoaPods.isCocoaPodsInitialized).thenAnswer((_) async => false); - const CocoaPodsValidator workflow = CocoaPodsValidator(); + final CocoaPodsTestTarget workflow = CocoaPodsTestTarget(); final ValidationResult result = await workflow.validate(); expect(result.type, ValidationType.partial); }, overrides: { @@ -62,13 +62,30 @@ void main() { testUsingContext('Emits partial status when CocoaPods version is too low', () async { when(cocoaPods.evaluateCocoaPodsInstallation) .thenAnswer((_) async => CocoaPodsStatus.belowRecommendedVersion); - const CocoaPodsValidator workflow = CocoaPodsValidator(); + final CocoaPodsTestTarget workflow = CocoaPodsTestTarget(); final ValidationResult result = await workflow.validate(); expect(result.type, ValidationType.partial); }, overrides: { CocoaPods: () => cocoaPods, }); + + testUsingContext('Emits installed status when homebrew not installed, but not needed', () async { + final CocoaPodsTestTarget workflow = CocoaPodsTestTarget(hasHomebrew: false); + final ValidationResult result = await workflow.validate(); + expect(result.type, ValidationType.installed); + }, overrides: { + CocoaPods: () => cocoaPods, + }); }); } class MockCocoaPods extends Mock implements CocoaPods {} + +class CocoaPodsTestTarget extends CocoaPodsValidator { + CocoaPodsTestTarget({ + this.hasHomebrew = true, + }); + + @override + final bool hasHomebrew; +} From fc7bd6ad2410422cfbbc80f480aa7956e14f9245 Mon Sep 17 00:00:00 2001 From: chunhtai <47866232+chunhtai@users.noreply.github.com> Date: Fri, 12 Jul 2019 12:13:50 -0700 Subject: [PATCH 40/41] refactor out selection handlers (#35207) --- .../flutter/lib/src/cupertino/text_field.dart | 184 +++-------- .../flutter/lib/src/material/text_field.dart | 269 +++++++-------- .../lib/src/widgets/text_selection.dart | 312 ++++++++++++++++++ .../test/widgets/text_selection_test.dart | 243 ++++++++++++++ 4 files changed, 728 insertions(+), 280 deletions(-) diff --git a/packages/flutter/lib/src/cupertino/text_field.dart b/packages/flutter/lib/src/cupertino/text_field.dart index 6a77c118ab6..b43eb77a3be 100644 --- a/packages/flutter/lib/src/cupertino/text_field.dart +++ b/packages/flutter/lib/src/cupertino/text_field.dart @@ -68,6 +68,39 @@ enum OverlayVisibilityMode { always, } +class _CupertinoTextFieldSelectionGestureDetectorBuilder extends TextSelectionGestureDetectorBuilder { + _CupertinoTextFieldSelectionGestureDetectorBuilder({ + @required _CupertinoTextFieldState state + }) : _state = state, + super(delegate: state); + + final _CupertinoTextFieldState _state; + + @override + void onSingleTapUp(TapUpDetails details) { + // Because TextSelectionGestureDetector listens to taps that happen on + // widgets in front of it, tapping the clear button will also trigger + // this handler. If the the clear button widget recognizes the up event, + // then do not handle it. + if (_state._clearGlobalKey.currentContext != null) { + final RenderBox renderBox = _state._clearGlobalKey.currentContext.findRenderObject(); + final Offset localOffset = renderBox.globalToLocal(details.globalPosition); + if (renderBox.hitTest(BoxHitTestResult(), position: localOffset)) { + return; + } + } + super.onSingleTapUp(details); + _state._requestKeyboard(); + if (_state.widget.onTap != null) + _state.widget.onTap(); + } + + @override + void onDragSelectionEnd(DragEndDetails details) { + _state._requestKeyboard(); + } +} + /// An iOS-style text field. /// /// A text field lets the user enter text, either with a hardware keyboard or with @@ -506,9 +539,8 @@ class CupertinoTextField extends StatefulWidget { } } -class _CupertinoTextFieldState extends State with AutomaticKeepAliveClientMixin { +class _CupertinoTextFieldState extends State with AutomaticKeepAliveClientMixin implements TextSelectionGestureDetectorBuilderDelegate { final GlobalKey _clearGlobalKey = GlobalKey(); - final GlobalKey _editableTextKey = GlobalKey(); TextEditingController _controller; TextEditingController get _effectiveController => widget.controller ?? _controller; @@ -516,17 +548,25 @@ class _CupertinoTextFieldState extends State with AutomaticK FocusNode _focusNode; FocusNode get _effectiveFocusNode => widget.focusNode ?? (_focusNode ??= FocusNode()); - // The selection overlay should only be shown when the user is interacting - // through a touch screen (via either a finger or a stylus). A mouse shouldn't - // trigger the selection overlay. - // For backwards-compatibility, we treat a null kind the same as touch. - bool _shouldShowSelectionToolbar = true; - bool _showSelectionHandles = false; + _CupertinoTextFieldSelectionGestureDetectorBuilder _selectionGestureDetectorBuilder; + + // API for TextSelectionGestureDetectorBuilderDelegate. + @override + bool get forcePressEnabled => true; + + @override + final GlobalKey editableTextKey = GlobalKey(); + + @override + bool get selectionEnabled => widget.selectionEnabled; + // End of API for TextSelectionGestureDetectorBuilderDelegate. + @override void initState() { super.initState(); + _selectionGestureDetectorBuilder = _CupertinoTextFieldSelectionGestureDetectorBuilder(state: this); if (widget.controller == null) { _controller = TextEditingController(); _controller.addListener(updateKeepAlive); @@ -556,103 +596,16 @@ class _CupertinoTextFieldState extends State with AutomaticK super.dispose(); } - EditableTextState get _editableText => _editableTextKey.currentState; + EditableTextState get _editableText => editableTextKey.currentState; void _requestKeyboard() { _editableText?.requestKeyboard(); } - RenderEditable get _renderEditable => _editableText.renderEditable; - - void _handleTapDown(TapDownDetails details) { - _renderEditable.handleTapDown(details); - - // The selection overlay should only be shown when the user is interacting - // through a touch screen (via either a finger or a stylus). A mouse shouldn't - // trigger the selection overlay. - // For backwards-compatibility, we treat a null kind the same as touch. - final PointerDeviceKind kind = details.kind; - _shouldShowSelectionToolbar = - kind == null || - kind == PointerDeviceKind.touch || - kind == PointerDeviceKind.stylus; - } - - void _handleForcePressStarted(ForcePressDetails details) { - if (widget.selectionEnabled) { - _renderEditable.selectWordsInRange( - from: details.globalPosition, - cause: SelectionChangedCause.forcePress, - ); - } - } - - void _handleForcePressEnded(ForcePressDetails details) { - _renderEditable.selectWordsInRange( - from: details.globalPosition, - cause: SelectionChangedCause.forcePress, - ); - if (_shouldShowSelectionToolbar) - _editableText.showToolbar(); - } - - void _handleSingleTapUp(TapUpDetails details) { - // Because TextSelectionGestureDetector listens to taps that happen on - // widgets in front of it, tapping the clear button will also trigger - // this handler. If the the clear button widget recognizes the up event, - // then do not handle it. - if (_clearGlobalKey.currentContext != null) { - final RenderBox renderBox = _clearGlobalKey.currentContext.findRenderObject(); - final Offset localOffset = renderBox.globalToLocal(details.globalPosition); - if(renderBox.hitTest(BoxHitTestResult(), position: localOffset)) { - return; - } - } - - if (widget.selectionEnabled) { - _renderEditable.selectWordEdge(cause: SelectionChangedCause.tap); - } - _requestKeyboard(); - if (widget.onTap != null) { - widget.onTap(); - } - } - - void _handleSingleLongTapStart(LongPressStartDetails details) { - if (widget.selectionEnabled) { - _renderEditable.selectPositionAt( - from: details.globalPosition, - cause: SelectionChangedCause.longPress, - ); - } - } - - void _handleSingleLongTapMoveUpdate(LongPressMoveUpdateDetails details) { - if (widget.selectionEnabled) { - _renderEditable.selectPositionAt( - from: details.globalPosition, - cause: SelectionChangedCause.longPress, - ); - } - } - - void _handleSingleLongTapEnd(LongPressEndDetails details) { - if (_shouldShowSelectionToolbar) - _editableText.showToolbar(); - } - - void _handleDoubleTapDown(TapDownDetails details) { - if (widget.selectionEnabled) { - _renderEditable.selectWord(cause: SelectionChangedCause.tap); - if (_shouldShowSelectionToolbar) - _editableText.showToolbar(); - } - } - bool _shouldShowSelectionHandles(SelectionChangedCause cause) { // When the text field is activated by something that doesn't trigger the // selection overlay, we shouldn't show the handles either. - if (!_shouldShowSelectionToolbar) + if (!_selectionGestureDetectorBuilder.shouldShowSelectionToolbar) return false; // On iOS, we don't show handles when the selection is collapsed. @@ -668,28 +621,6 @@ class _CupertinoTextFieldState extends State with AutomaticK return false; } - void _handleMouseDragSelectionStart(DragStartDetails details) { - _renderEditable.selectPositionAt( - from: details.globalPosition, - cause: SelectionChangedCause.drag, - ); - } - - void _handleMouseDragSelectionUpdate( - DragStartDetails startDetails, - DragUpdateDetails updateDetails, - ) { - _renderEditable.selectPositionAt( - from: startDetails.globalPosition, - to: updateDetails.globalPosition, - cause: SelectionChangedCause.drag, - ); - } - - void _handleMouseDragSelectionEnd(DragEndDetails details) { - _requestKeyboard(); - } - void _handleSelectionChanged(TextSelection selection, SelectionChangedCause cause) { if (cause == SelectionChangedCause.longPress) { _editableText?.bringIntoView(selection.base); @@ -870,7 +801,7 @@ class _CupertinoTextFieldState extends State with AutomaticK padding: widget.padding, child: RepaintBoundary( child: EditableText( - key: _editableTextKey, + key: editableTextKey, controller: controller, readOnly: widget.readOnly, showCursor: widget.showCursor, @@ -925,18 +856,7 @@ class _CupertinoTextFieldState extends State with AutomaticK ignoring: !enabled, child: Container( decoration: effectiveDecoration, - child: TextSelectionGestureDetector( - onTapDown: _handleTapDown, - onForcePressStart: _handleForcePressStarted, - onForcePressEnd: _handleForcePressEnded, - onSingleTapUp: _handleSingleTapUp, - onSingleLongTapStart: _handleSingleLongTapStart, - onSingleLongTapMoveUpdate: _handleSingleLongTapMoveUpdate, - onSingleLongTapEnd: _handleSingleLongTapEnd, - onDoubleTapDown: _handleDoubleTapDown, - onDragSelectionStart: _handleMouseDragSelectionStart, - onDragSelectionUpdate: _handleMouseDragSelectionUpdate, - onDragSelectionEnd: _handleMouseDragSelectionEnd, + child: _selectionGestureDetectorBuilder.buildGestureDetector( behavior: HitTestBehavior.translucent, child: Align( alignment: Alignment(-1.0, _textAlignVertical.y), diff --git a/packages/flutter/lib/src/material/text_field.dart b/packages/flutter/lib/src/material/text_field.dart index 0a1d29a9521..ffb715b8d37 100644 --- a/packages/flutter/lib/src/material/text_field.dart +++ b/packages/flutter/lib/src/material/text_field.dart @@ -35,6 +35,107 @@ typedef InputCounterWidgetBuilder = Widget Function( @required bool isFocused, }); +class _TextFieldSelectionGestureDetectorBuilder extends TextSelectionGestureDetectorBuilder { + _TextFieldSelectionGestureDetectorBuilder({ + @required _TextFieldState state + }) : _state = state, + super(delegate: state); + + final _TextFieldState _state; + + @override + void onTapDown(TapDownDetails details) { + super.onTapDown(details); + _state._startSplash(details.globalPosition); + } + + @override + void onForcePressStart(ForcePressDetails details) { + super.onForcePressStart(details); + if (delegate.selectionEnabled && shouldShowSelectionToolbar) { + editableText.showToolbar(); + } + } + + @override + void onForcePressEnd(ForcePressDetails details) { + // Not required. + } + + @override + void onSingleLongTapMoveUpdate(LongPressMoveUpdateDetails details) { + if (delegate.selectionEnabled) { + switch (Theme.of(_state.context).platform) { + case TargetPlatform.iOS: + renderEditable.selectPositionAt( + from: details.globalPosition, + cause: SelectionChangedCause.longPress, + ); + break; + case TargetPlatform.android: + case TargetPlatform.fuchsia: + renderEditable.selectWordsInRange( + from: details.globalPosition - details.offsetFromOrigin, + to: details.globalPosition, + cause: SelectionChangedCause.longPress, + ); + break; + } + } + } + + @override + void onSingleTapUp(TapUpDetails details) { + editableText.hideToolbar(); + if (delegate.selectionEnabled) { + switch (Theme.of(_state.context).platform) { + case TargetPlatform.iOS: + renderEditable.selectWordEdge(cause: SelectionChangedCause.tap); + break; + case TargetPlatform.android: + case TargetPlatform.fuchsia: + renderEditable.selectPosition(cause: SelectionChangedCause.tap); + break; + } + } + _state._requestKeyboard(); + _state._confirmCurrentSplash(); + if (_state.widget.onTap != null) + _state.widget.onTap(); + } + + @override + void onSingleTapCancel() { + _state._cancelCurrentSplash(); + } + + @override + void onSingleLongTapStart(LongPressStartDetails details) { + if (delegate.selectionEnabled) { + switch (Theme.of(_state.context).platform) { + case TargetPlatform.iOS: + renderEditable.selectPositionAt( + from: details.globalPosition, + cause: SelectionChangedCause.longPress, + ); + break; + case TargetPlatform.android: + case TargetPlatform.fuchsia: + renderEditable.selectWord(cause: SelectionChangedCause.longPress); + Feedback.forLongPress(_state.context); + break; + } + } + _state._confirmCurrentSplash(); + } + + @override + void onDragSelectionStart(DragStartDetails details) { + super.onDragSelectionStart(details); + _state._startSplash(details.globalPosition); + } +} + /// A material design text field. /// /// A text field lets the user enter text, either with hardware keyboard or with @@ -531,9 +632,7 @@ class TextField extends StatefulWidget { } } -class _TextFieldState extends State with AutomaticKeepAliveClientMixin { - final GlobalKey _editableTextKey = GlobalKey(); - +class _TextFieldState extends State with AutomaticKeepAliveClientMixin implements TextSelectionGestureDetectorBuilderDelegate { Set _splashes; InteractiveInkFeature _currentSplash; @@ -549,10 +648,21 @@ class _TextFieldState extends State with AutomaticKeepAliveClientMixi && widget.decoration != null && widget.decoration.counterText == null; - bool _shouldShowSelectionToolbar = true; - bool _showSelectionHandles = false; + _TextFieldSelectionGestureDetectorBuilder _selectionGestureDetectorBuilder; + + // API for TextSelectionGestureDetectorBuilderDelegate. + @override + bool forcePressEnabled; + + @override + final GlobalKey editableTextKey = GlobalKey(); + + @override + bool get selectionEnabled => widget.selectionEnabled; + // End of API for TextSelectionGestureDetectorBuilderDelegate. + InputDecoration _getEffectiveDecoration() { final MaterialLocalizations localizations = MaterialLocalizations.of(context); final ThemeData themeData = Theme.of(context); @@ -621,6 +731,7 @@ class _TextFieldState extends State with AutomaticKeepAliveClientMixi @override void initState() { super.initState(); + _selectionGestureDetectorBuilder = _TextFieldSelectionGestureDetectorBuilder(state: this); if (widget.controller == null) _controller = TextEditingController(); } @@ -650,7 +761,7 @@ class _TextFieldState extends State with AutomaticKeepAliveClientMixi super.dispose(); } - EditableTextState get _editableText => _editableTextKey.currentState; + EditableTextState get _editableText => editableTextKey.currentState; void _requestKeyboard() { _editableText?.requestKeyboard(); @@ -659,7 +770,7 @@ class _TextFieldState extends State with AutomaticKeepAliveClientMixi bool _shouldShowSelectionHandles(SelectionChangedCause cause) { // When the text field is activated by something that doesn't trigger the // selection overlay, we shouldn't show the handles either. - if (!_shouldShowSelectionToolbar) + if (!_selectionGestureDetectorBuilder.shouldShowSelectionToolbar) return false; if (cause == SelectionChangedCause.keyboard) @@ -707,7 +818,7 @@ class _TextFieldState extends State with AutomaticKeepAliveClientMixi InteractiveInkFeature _createInkFeature(Offset globalPosition) { final MaterialInkController inkController = Material.of(context); final ThemeData themeData = Theme.of(context); - final BuildContext editableContext = _editableTextKey.currentContext; + final BuildContext editableContext = editableTextKey.currentContext; final RenderBox referenceBox = InputDecorator.containerOf(editableContext) ?? editableContext.findRenderObject(); final Offset position = referenceBox.globalToLocal(globalPosition); final Color color = themeData.splashColor; @@ -738,133 +849,6 @@ class _TextFieldState extends State with AutomaticKeepAliveClientMixi return splash; } - RenderEditable get _renderEditable => _editableTextKey.currentState.renderEditable; - - void _handleTapDown(TapDownDetails details) { - _renderEditable.handleTapDown(details); - _startSplash(details.globalPosition); - - // The selection overlay should only be shown when the user is interacting - // through a touch screen (via either a finger or a stylus). A mouse shouldn't - // trigger the selection overlay. - // For backwards-compatibility, we treat a null kind the same as touch. - final PointerDeviceKind kind = details.kind; - _shouldShowSelectionToolbar = - kind == null || - kind == PointerDeviceKind.touch || - kind == PointerDeviceKind.stylus; - } - - void _handleForcePressStarted(ForcePressDetails details) { - if (widget.selectionEnabled) { - _renderEditable.selectWordsInRange( - from: details.globalPosition, - cause: SelectionChangedCause.forcePress, - ); - if (_shouldShowSelectionToolbar) { - _editableTextKey.currentState.showToolbar(); - } - } - } - - void _handleSingleTapUp(TapUpDetails details) { - _editableTextKey.currentState.hideToolbar(); - if (widget.selectionEnabled) { - switch (Theme.of(context).platform) { - case TargetPlatform.iOS: - _renderEditable.selectWordEdge(cause: SelectionChangedCause.tap); - break; - case TargetPlatform.android: - case TargetPlatform.fuchsia: - _renderEditable.selectPosition(cause: SelectionChangedCause.tap); - break; - } - } - _requestKeyboard(); - _confirmCurrentSplash(); - if (widget.onTap != null) - widget.onTap(); - } - - void _handleSingleTapCancel() { - _cancelCurrentSplash(); - } - - void _handleSingleLongTapStart(LongPressStartDetails details) { - if (widget.selectionEnabled) { - switch (Theme.of(context).platform) { - case TargetPlatform.iOS: - _renderEditable.selectPositionAt( - from: details.globalPosition, - cause: SelectionChangedCause.longPress, - ); - break; - case TargetPlatform.android: - case TargetPlatform.fuchsia: - _renderEditable.selectWord(cause: SelectionChangedCause.longPress); - Feedback.forLongPress(context); - break; - } - } - _confirmCurrentSplash(); - } - - void _handleSingleLongTapMoveUpdate(LongPressMoveUpdateDetails details) { - if (widget.selectionEnabled) { - switch (Theme.of(context).platform) { - case TargetPlatform.iOS: - _renderEditable.selectPositionAt( - from: details.globalPosition, - cause: SelectionChangedCause.longPress, - ); - break; - case TargetPlatform.android: - case TargetPlatform.fuchsia: - _renderEditable.selectWordsInRange( - from: details.globalPosition - details.offsetFromOrigin, - to: details.globalPosition, - cause: SelectionChangedCause.longPress, - ); - break; - } - } - } - - void _handleSingleLongTapEnd(LongPressEndDetails details) { - if (widget.selectionEnabled) { - if (_shouldShowSelectionToolbar) - _editableTextKey.currentState.showToolbar(); - } - } - - void _handleDoubleTapDown(TapDownDetails details) { - if (widget.selectionEnabled) { - _renderEditable.selectWord(cause: SelectionChangedCause.doubleTap); - if (_shouldShowSelectionToolbar) { - _editableText.showToolbar(); - } - } - } - - void _handleMouseDragSelectionStart(DragStartDetails details) { - _renderEditable.selectPositionAt( - from: details.globalPosition, - cause: SelectionChangedCause.drag, - ); - _startSplash(details.globalPosition); - } - - void _handleMouseDragSelectionUpdate( - DragStartDetails startDetails, - DragUpdateDetails updateDetails, - ) { - _renderEditable.selectPositionAt( - from: startDetails.globalPosition, - to: updateDetails.globalPosition, - cause: SelectionChangedCause.drag, - ); - } - void _startSplash(Offset globalPosition) { if (_effectiveFocusNode.hasFocus) return; @@ -933,7 +917,6 @@ class _TextFieldState extends State with AutomaticKeepAliveClientMixi if (widget.maxLength != null && widget.maxLengthEnforced) formatters.add(LengthLimitingTextInputFormatter(widget.maxLength)); - bool forcePressEnabled; TextSelectionControls textSelectionControls; bool paintCursorAboveText; bool cursorOpacityAnimates; @@ -971,7 +954,7 @@ class _TextFieldState extends State with AutomaticKeepAliveClientMixi Widget child = RepaintBoundary( child: EditableText( - key: _editableTextKey, + key: editableTextKey, readOnly: widget.readOnly, showCursor: widget.showCursor, showSelectionHandles: _showSelectionHandles, @@ -1046,17 +1029,7 @@ class _TextFieldState extends State with AutomaticKeepAliveClientMixi onPointerExit: _handlePointerExit, child: IgnorePointer( ignoring: !(widget.enabled ?? widget.decoration?.enabled ?? true), - child: TextSelectionGestureDetector( - onTapDown: _handleTapDown, - onForcePressStart: forcePressEnabled ? _handleForcePressStarted : null, - onSingleTapUp: _handleSingleTapUp, - onSingleTapCancel: _handleSingleTapCancel, - onSingleLongTapStart: _handleSingleLongTapStart, - onSingleLongTapMoveUpdate: _handleSingleLongTapMoveUpdate, - onSingleLongTapEnd: _handleSingleLongTapEnd, - onDoubleTapDown: _handleDoubleTapDown, - onDragSelectionStart: _handleMouseDragSelectionStart, - onDragSelectionUpdate: _handleMouseDragSelectionUpdate, + child: _selectionGestureDetectorBuilder.buildGestureDetector( behavior: HitTestBehavior.translucent, child: child, ), diff --git a/packages/flutter/lib/src/widgets/text_selection.dart b/packages/flutter/lib/src/widgets/text_selection.dart index ea572c9f0a2..af17c6c1205 100644 --- a/packages/flutter/lib/src/widgets/text_selection.dart +++ b/packages/flutter/lib/src/widgets/text_selection.dart @@ -813,6 +813,318 @@ class _TextSelectionHandleOverlayState } } +/// Delegate interface for the [TextSelectionGestureDetectorBuilder]. +/// +/// The interface is usually implemented by textfield implementations wrapping +/// [EditableText], that use a [TextSelectionGestureDetectorBuilder] to build a +/// [TextSelectionGestureDetector] for their [EditableText]. The delegate provides +/// the builder with information about the current state of the textfield. +/// Based on these information, the builder adds the correct gesture handlers +/// to the gesture detector. +/// +/// See also: +/// +/// * [TextField], which implements this delegate for the Material textfield. +/// * [CupertinoTextField], which implements this delegate for the Cupertino textfield. +abstract class TextSelectionGestureDetectorBuilderDelegate { + /// [GlobalKey] to the [EditableText] for which the + /// [TextSelectionGestureDetectorBuilder] will build a [TextSelectionGestureDetector]. + GlobalKey get editableTextKey; + + /// Whether the textfield should respond to force presses. + bool get forcePressEnabled; + + /// Whether the user may select text in the textfield. + bool get selectionEnabled; +} + +/// Builds a [TextSelectionGestureDetector] to wrap an [EditableText]. +/// +/// The class implements sensible defaults for many user interactions +/// with an [EditableText] (see the documentation of the various gesture handler +/// methods, e.g. [onTapDown], [onFrocePress], etc.). Subclasses of +/// [EditableTextSelectionHandlesProvider] can change the behavior performed in +/// responds to these gesture events by overriding the corresponding handler +/// methods of this class. +/// +/// The resulting [TextSelectionGestureDetector] to wrap an [EditableText] is +/// obtained by calling [buildGestureDetector]. +/// +/// See also: +/// +/// * [TextField], which uses a subclass to implement the Material-specific +/// gesture logic of an [EditableText]. +/// * [CupertinoTextField], which uses a subclass to implement the +/// Cupertino-specific gesture logic of an [EditableText]. +class TextSelectionGestureDetectorBuilder { + /// Creates a [TextSelectionGestureDetectorBuilder]. + /// + /// The [delegate] must not be null. + TextSelectionGestureDetectorBuilder({ + @required this.delegate, + }) : assert(delegate != null); + + /// The delegate for this [TextSelectionGestureDetectorBuilder]. + /// + /// The delegate provides the builder with information about what actions can + /// currently be performed on the textfield. Based on this, the builder adds + /// the correct gesture handlers to the gesture detector. + @protected + final TextSelectionGestureDetectorBuilderDelegate delegate; + + /// Whether to show the selection tool bar. + /// + /// It is based on the signal source when a [onTapDown] is called. This getter + /// will return true if current [onTapDown] event is triggered by a touch or + /// a stylus. + bool get shouldShowSelectionToolbar => _shouldShowSelectionToolbar; + bool _shouldShowSelectionToolbar = true; + + /// The [State] of the [EditableText] for which the builder will provide a + /// [TextSelectionGestureDetector]. + @protected + EditableTextState get editableText => delegate.editableTextKey.currentState; + + /// The [RenderObject] of the [EditableText] for which the builder will + /// provide a [TextSelectionGestureDetector]. + @protected + RenderEditable get renderEditable => editableText.renderEditable; + + /// Handler for [TextSelectionGestureDetector.onTapDown]. + /// + /// By default, it forwards the tap to [RenderEditable.handleTapDown] and sets + /// [shouldShowSelectionToolbar] to true if the tap was initiated by a finger or stylus. + /// + /// See also: + /// + /// * [TextSelectionGestureDetector.onTapDown], which triggers this callback. + @protected + void onTapDown(TapDownDetails details) { + renderEditable.handleTapDown(details); + // The selection overlay should only be shown when the user is interacting + // through a touch screen (via either a finger or a stylus). A mouse shouldn't + // trigger the selection overlay. + // For backwards-compatibility, we treat a null kind the same as touch. + final PointerDeviceKind kind = details.kind; + _shouldShowSelectionToolbar = kind == null + || kind == PointerDeviceKind.touch + || kind == PointerDeviceKind.stylus; + } + + /// Handler for [TextSelectionGestureDetector.onForcePressStart]. + /// + /// By default, it selects the word at the position of the force press, + /// if selection is enabled. + /// + /// This callback is only applicable when force press is enabled. + /// + /// See also: + /// + /// * [TextSelectionGestureDetector.onForcePressStart], which triggers this + /// callback. + @protected + void onForcePressStart(ForcePressDetails details) { + assert(delegate.forcePressEnabled); + _shouldShowSelectionToolbar = true; + if (delegate.selectionEnabled) { + renderEditable.selectWordsInRange( + from: details.globalPosition, + cause: SelectionChangedCause.forcePress, + ); + } + } + + /// Handler for [TextSelectionGestureDetector.onForcePressEnd]. + /// + /// By default, it selects words in the range specified in [details] and shows + /// tool bar if it is necessary. + /// + /// This callback is only applicable when force press is enabled. + /// + /// See also: + /// + /// * [TextSelectionGestureDetector.onForcePressEnd], which triggers this + /// callback. + @protected + void onForcePressEnd(ForcePressDetails details) { + assert(delegate.forcePressEnabled); + renderEditable.selectWordsInRange( + from: details.globalPosition, + cause: SelectionChangedCause.forcePress, + ); + if (shouldShowSelectionToolbar) + editableText.showToolbar(); + } + + /// Handler for [TextSelectionGestureDetector.onSingleTapUp]. + /// + /// By default, it selects word edge if selection is enabled. + /// + /// See also: + /// + /// * [TextSelectionGestureDetector.onSingleTapUp], which triggers + /// this callback. + @protected + void onSingleTapUp(TapUpDetails details) { + if (delegate.selectionEnabled) { + renderEditable.selectWordEdge(cause: SelectionChangedCause.tap); + } + } + + /// Handler for [TextSelectionGestureDetector.onSingleTapCancel]. + /// + /// By default, it services as place holder to enable subclass override. + /// + /// See also: + /// + /// * [TextSelectionGestureDetector.onSingleTapCancel], which triggers + /// this callback. + @protected + void onSingleTapCancel() {/* Subclass should override this method if needed. */} + + /// Handler for [TextSelectionGestureDetector.onSingleLongTapStart]. + /// + /// By default, it selects text position specified in [details] if selection + /// is enabled. + /// + /// See also: + /// + /// * [TextSelectionGestureDetector.onSingleLongTapStart], which triggers + /// this callback. + @protected + void onSingleLongTapStart(LongPressStartDetails details) { + if (delegate.selectionEnabled) { + renderEditable.selectPositionAt( + from: details.globalPosition, + cause: SelectionChangedCause.longPress, + ); + } + } + + /// Handler for [TextSelectionGestureDetector.onSingleLongTapMoveUpdate]. + /// + /// By default, it updates the selection location specified in [details] if + /// selection is enabled. + /// + /// See also: + /// + /// * [TextSelectionGestureDetector.onSingleLongTapMoveUpdate], which + /// triggers this callback. + @protected + void onSingleLongTapMoveUpdate(LongPressMoveUpdateDetails details) { + if (delegate.selectionEnabled) { + renderEditable.selectPositionAt( + from: details.globalPosition, + cause: SelectionChangedCause.longPress, + ); + } + } + + /// Handler for [TextSelectionGestureDetector.onSingleLongTapEnd]. + /// + /// By default, it shows tool bar if necessary. + /// + /// See also: + /// + /// * [TextSelectionGestureDetector.onSingleLongTapEnd], which triggers this + /// callback. + @protected + void onSingleLongTapEnd(LongPressEndDetails details) { + if (shouldShowSelectionToolbar) + editableText.showToolbar(); + } + + /// Handler for [TextSelectionGestureDetector.onDoubleTapDown]. + /// + /// By default, it selects a word through [renderEditable.selectWord] if + /// selectionEnabled and shows tool bar if necessary. + /// + /// See also: + /// + /// * [TextSelectionGestureDetector.onDoubleTapDown], which triggers this + /// callback. + @protected + void onDoubleTapDown(TapDownDetails details) { + if (delegate.selectionEnabled) { + renderEditable.selectWord(cause: SelectionChangedCause.tap); + if (shouldShowSelectionToolbar) + editableText.showToolbar(); + } + } + + /// Handler for [TextSelectionGestureDetector.onDragSelectionStart]. + /// + /// By default, it selects a text position specified in [details]. + /// + /// See also: + /// + /// * [TextSelectionGestureDetector.onDragSelectionStart], which triggers + /// this callback. + @protected + void onDragSelectionStart(DragStartDetails details) { + renderEditable.selectPositionAt( + from: details.globalPosition, + cause: SelectionChangedCause.drag, + ); + } + + /// Handler for [TextSelectionGestureDetector.onDragSelectionUpdate]. + /// + /// By default, it updates the selection location specified in [details]. + /// + /// See also: + /// + /// * [TextSelectionGestureDetector.onDragSelectionUpdate], which triggers + /// this callback./lib/src/material/text_field.dart + @protected + void onDragSelectionUpdate(DragStartDetails startDetails, DragUpdateDetails updateDetails) { + renderEditable.selectPositionAt( + from: startDetails.globalPosition, + to: updateDetails.globalPosition, + cause: SelectionChangedCause.drag, + ); + } + + /// Handler for [TextSelectionGestureDetector.onDragSelectionEnd]. + /// + /// By default, it services as place holder to enable subclass override. + /// + /// See also: + /// + /// * [TextSelectionGestureDetector.onDragSelectionEnd], which triggers this + /// callback. + @protected + void onDragSelectionEnd(DragEndDetails details) {/* Subclass should override this method if needed. */} + + /// Returns a [TextSelectionGestureDetector] configured with the handlers + /// provided by this builder. + /// + /// The [child] or its subtree should contain [EditableText]. + Widget buildGestureDetector({ + Key key, + HitTestBehavior behavior, + Widget child + }) { + return TextSelectionGestureDetector( + key: key, + onTapDown: onTapDown, + onForcePressStart: delegate.forcePressEnabled ? onForcePressStart : null, + onForcePressEnd: delegate.forcePressEnabled ? onForcePressEnd : null, + onSingleTapUp: onSingleTapUp, + onSingleTapCancel: onSingleTapCancel, + onSingleLongTapStart: onSingleLongTapStart, + onSingleLongTapMoveUpdate: onSingleLongTapMoveUpdate, + onSingleLongTapEnd: onSingleLongTapEnd, + onDoubleTapDown: onDoubleTapDown, + onDragSelectionStart: onDragSelectionStart, + onDragSelectionUpdate: onDragSelectionUpdate, + onDragSelectionEnd: onDragSelectionEnd, + behavior: behavior, + child: child, + ); + } +} + /// A gesture detector to respond to non-exclusive event chains for a text field. /// /// An ordinary [GestureDetector] configured to handle events like tap and diff --git a/packages/flutter/test/widgets/text_selection_test.dart b/packages/flutter/test/widgets/text_selection_test.dart index b978ef53988..41ebfe6c47f 100644 --- a/packages/flutter/test/widgets/text_selection_test.dart +++ b/packages/flutter/test/widgets/text_selection_test.dart @@ -5,6 +5,8 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:flutter/gestures.dart' show PointerDeviceKind; import 'package:flutter/widgets.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter/material.dart'; void main() { int tapCount; @@ -62,6 +64,30 @@ void main() { ); } + Future pumpTextSelectionGestureDetectorBuilder( + WidgetTester tester, { + bool forcePressEnabled = true, + bool selectionEnabled = true, + }) async { + final GlobalKey editableTextKey = GlobalKey(); + final FakeTextSelectionGestureDetectorBuilderDelegate delegate = FakeTextSelectionGestureDetectorBuilderDelegate( + editableTextKey: editableTextKey, + forcePressEnabled: forcePressEnabled, + selectionEnabled: selectionEnabled, + ); + final TextSelectionGestureDetectorBuilder provider = + TextSelectionGestureDetectorBuilder(delegate: delegate); + + await tester.pumpWidget( + MaterialApp( + home: provider.buildGestureDetector( + behavior: HitTestBehavior.translucent, + child: FakeEditableText(key: editableTextKey) + ) + ) + ); + } + testWidgets('a series of taps all call onTaps', (WidgetTester tester) async { await pumpGestureDetector(tester); await tester.tapAt(const Offset(200, 200)); @@ -380,4 +406,221 @@ void main() { await gesture.removePointer(); }); + + testWidgets('test TextSelectionGestureDetectorBuilder long press', (WidgetTester tester) async { + await pumpTextSelectionGestureDetectorBuilder(tester); + final TestGesture gesture = + await tester.startGesture(const Offset(200.0, 200.0), pointer: 0, kind: PointerDeviceKind.touch); + await tester.pump(const Duration(seconds: 2)); + await gesture.up(); + await tester.pumpAndSettle(); + + final FakeEditableTextState state = tester.state(find.byType(FakeEditableText)); + final FakeRenderEditable renderEditable = tester.renderObject(find.byType(FakeEditable)); + expect(state.showToolbarCalled, isTrue); + expect(renderEditable.selectPositionAtCalled, isTrue); + }); + + testWidgets('test TextSelectionGestureDetectorBuilder tap', (WidgetTester tester) async { + await pumpTextSelectionGestureDetectorBuilder(tester); + final TestGesture gesture = + await tester.startGesture(const Offset(200.0, 200.0), pointer: 0, kind: PointerDeviceKind.touch); + await gesture.up(); + await tester.pumpAndSettle(); + + final FakeEditableTextState state = tester.state(find.byType(FakeEditableText)); + final FakeRenderEditable renderEditable = tester.renderObject(find.byType(FakeEditable)); + expect(state.showToolbarCalled, isFalse); + expect(renderEditable.selectWordEdgeCalled, isTrue); + }); + + testWidgets('test TextSelectionGestureDetectorBuilder double tap', (WidgetTester tester) async { + await pumpTextSelectionGestureDetectorBuilder(tester); + final TestGesture gesture = + await tester.startGesture(const Offset(200.0, 200.0), pointer: 0, kind: PointerDeviceKind.touch); + await tester.pump(const Duration(milliseconds: 50)); + await gesture.up(); + await gesture.down(const Offset(200.0, 200.0)); + await tester.pump(const Duration(milliseconds: 50)); + await gesture.up(); + await tester.pumpAndSettle(); + + final FakeEditableTextState state = tester.state(find.byType(FakeEditableText)); + final FakeRenderEditable renderEditable = tester.renderObject(find.byType(FakeEditable)); + expect(state.showToolbarCalled, isTrue); + expect(renderEditable.selectWordCalled, isTrue); + }); + + testWidgets('test TextSelectionGestureDetectorBuilder forcePress enabled', (WidgetTester tester) async { + await pumpTextSelectionGestureDetectorBuilder(tester); + final TestGesture gesture = await tester.createGesture(); + await gesture.downWithCustomEvent( + const Offset(200.0, 200.0), + const PointerDownEvent( + pointer: 0, + position: Offset(200.0, 200.0), + pressure: 3.0, + pressureMax: 6.0, + pressureMin: 0.0, + ), + ); + await gesture.updateWithCustomEvent( + const PointerUpEvent( + pointer: 0, + position: Offset(200.0, 200.0), + pressure: 0.0, + pressureMax: 6.0, + pressureMin: 0.0, + ), + ); + await tester.pump(); + + final FakeEditableTextState state = tester.state(find.byType(FakeEditableText)); + final FakeRenderEditable renderEditable = tester.renderObject(find.byType(FakeEditable)); + expect(state.showToolbarCalled, isTrue); + expect(renderEditable.selectWordsInRangeCalled, isTrue); + }); + + testWidgets('test TextSelectionGestureDetectorBuilder selection disabled', (WidgetTester tester) async { + await pumpTextSelectionGestureDetectorBuilder(tester, selectionEnabled: false); + final TestGesture gesture = + await tester.startGesture(const Offset(200.0, 200.0), pointer: 0, kind: PointerDeviceKind.touch); + await tester.pump(const Duration(seconds: 2)); + await gesture.up(); + await tester.pumpAndSettle(); + + final FakeEditableTextState state = tester.state(find.byType(FakeEditableText)); + final FakeRenderEditable renderEditable = tester.renderObject(find.byType(FakeEditable)); + expect(state.showToolbarCalled, isTrue); + expect(renderEditable.selectWordsInRangeCalled, isFalse); + }); + + testWidgets('test TextSelectionGestureDetectorBuilder forcePress disabled', (WidgetTester tester) async { + await pumpTextSelectionGestureDetectorBuilder(tester, forcePressEnabled: false); + final TestGesture gesture = await tester.createGesture(); + await gesture.downWithCustomEvent( + const Offset(200.0, 200.0), + const PointerDownEvent( + pointer: 0, + position: Offset(200.0, 200.0), + pressure: 3.0, + pressureMax: 6.0, + pressureMin: 0.0, + ), + ); + await gesture.up(); + await tester.pump(); + + final FakeEditableTextState state = tester.state(find.byType(FakeEditableText)); + final FakeRenderEditable renderEditable = tester.renderObject(find.byType(FakeEditable)); + expect(state.showToolbarCalled, isFalse); + expect(renderEditable.selectWordsInRangeCalled, isFalse); + }); +} + +class FakeTextSelectionGestureDetectorBuilderDelegate implements TextSelectionGestureDetectorBuilderDelegate { + FakeTextSelectionGestureDetectorBuilderDelegate({ + this.editableTextKey, + this.forcePressEnabled, + this.selectionEnabled, + }); + + @override + final GlobalKey editableTextKey; + + @override + final bool forcePressEnabled; + + @override + final bool selectionEnabled; +} + +class FakeEditableText extends EditableText { + FakeEditableText({Key key}): super( + key: key, + controller: TextEditingController(), + focusNode: FocusNode(), + backgroundCursorColor: Colors.white, + cursorColor: Colors.white, + style: const TextStyle(), + ); + + @override + FakeEditableTextState createState() => FakeEditableTextState(); +} + +class FakeEditableTextState extends EditableTextState { + final GlobalKey _editableKey = GlobalKey(); + bool showToolbarCalled = false; + + @override + RenderEditable get renderEditable => _editableKey.currentContext.findRenderObject(); + + @override + bool showToolbar() { + showToolbarCalled = true; + return true; + } + + @override + Widget build(BuildContext context) { + super.build(context); + return FakeEditable(this, key: _editableKey); + } +} + +class FakeEditable extends LeafRenderObjectWidget { + const FakeEditable( + this.delegate, { + Key key, + }) : super(key: key); + final EditableTextState delegate; + + @override + RenderEditable createRenderObject(BuildContext context) { + return FakeRenderEditable(delegate); + } +} + +class FakeRenderEditable extends RenderEditable { + FakeRenderEditable(EditableTextState delegate) : super( + text: const TextSpan( + style: TextStyle(height: 1.0, fontSize: 10.0, fontFamily: 'Ahem'), + text: 'placeholder', + ), + startHandleLayerLink: LayerLink(), + endHandleLayerLink: LayerLink(), + textAlign: TextAlign.start, + textDirection: TextDirection.ltr, + locale: const Locale('en', 'US'), + offset: ViewportOffset.fixed(10.0), + textSelectionDelegate: delegate, + selection: const TextSelection.collapsed( + offset: 0, + ), + ); + + bool selectWordsInRangeCalled = false; + @override + void selectWordsInRange({ @required Offset from, Offset to, @required SelectionChangedCause cause }) { + selectWordsInRangeCalled = true; + } + + bool selectWordEdgeCalled = false; + @override + void selectWordEdge({ @required SelectionChangedCause cause }) { + selectWordEdgeCalled = true; + } + + bool selectPositionAtCalled = false; + @override + void selectPositionAt({ @required Offset from, Offset to, @required SelectionChangedCause cause }) { + selectPositionAtCalled = true; + } + + bool selectWordCalled = false; + @override + void selectWord({ @required SelectionChangedCause cause }) { + selectWordCalled = true; + } } From eb0b17902876f1a75eb7180c0b9f3571efb312b8 Mon Sep 17 00:00:00 2001 From: Kate Lovett Date: Fri, 12 Jul 2019 12:23:04 -0700 Subject: [PATCH 41/41] Part 1: Skia Gold Testing (#33688) * Fresh PR for Gold integration. * Nits * WIP * Artifacts from merge * Changed some platform dependencies for web, added library prefix notation for Skia Gold test names. * Updating for CI implementation * Write out service account * Writing to skip out * WIP * ++ * Fixing depot tools deps * Windows depot_tools * Fixing setup scripts * ++ * depot tools * ++ * WIP * Tracing depot_tools clone * WIP * ++ * analyzer * WIP * chrome typo * copy artifact * Working on tests * Code cleanup * ++ * Code cleanup, updated tests * ++ review feedback * Review * Analyzer * Review feedback * Nits from review * PRogress * ++ * Fixing tests * ++ * Testing repo route * Just needing documention around new structures. * cleanup * Analyzer * Documentation updates * Documentation updates * Cirrus updates * cirrus nit * Review feedback * Review feedback * Fixing skip comparator * Fix base directory for Skia Gold case * ++ * Feedback * ++ * Fixed uri assertion * Made GoldensClient abstract, altered SkiaGoldClient constructor * Analyzer --- .cirrus.yml | 11 + dev/bots/download_goldctl.ps1 | 5 + dev/bots/download_goldctl.sh | 6 + .../test/cupertino/date_picker_test.dart | 2 - .../flutter/test/cupertino/nav_bar_test.dart | 8 +- .../cupertino/segmented_control_test.dart | 4 +- .../test/cupertino/text_field_test.dart | 5 +- .../test/material/bottom_app_bar_test.dart | 2 - .../material/bottom_app_bar_theme_test.dart | 1 - .../material/bottom_navigation_bar_test.dart | 1 - .../test/material/card_theme_test.dart | 1 - .../test/material/dialog_theme_test.dart | 1 - .../flutter/test/material/dropdown_test.dart | 2 - .../material/floating_action_button_test.dart | 1 - .../test/material/input_decorator_test.dart | 3 - .../flutter/test/material/material_test.dart | 2 - .../flutter/test/material/radio_test.dart | 1 - .../test/material/tab_bar_theme_test.dart | 4 - .../test/material/text_field_test.dart | 5 +- .../continous_rectangle_border_test.dart | 3 - .../test/rendering/localized_fonts_test.dart | 3 - .../test/widgets/backdrop_filter_test.dart | 1 - .../widgets/editable_text_cursor_test.dart | 7 +- .../test/widgets/invert_colors_test.dart | 2 - .../widgets/list_wheel_scroll_view_test.dart | 2 - .../flutter/test/widgets/opacity_test.dart | 1 - .../test/widgets/physical_model_test.dart | 1 - .../flutter/test/widgets/shadow_test.dart | 10 +- .../test/widgets/text_golden_test.dart | 46 ++- .../test/widgets/widget_inspector_test.dart | 25 -- .../flutter_goldens/lib/flutter_goldens.dart | 269 +++++++++++++++--- .../test/flutter_goldens_test.dart | 112 ++++++-- .../flutter_goldens_client/lib/client.dart | 60 ++-- .../lib/skia_client.dart | 211 ++++++++++++++ packages/flutter_test/lib/src/goldens.dart | 27 +- packages/flutter_test/lib/src/matchers.dart | 18 +- packages/flutter_test/test/goldens_test.dart | 13 + packages/flutter_test/test/matchers_test.dart | 63 +--- 38 files changed, 671 insertions(+), 268 deletions(-) create mode 100644 dev/bots/download_goldctl.ps1 create mode 100755 dev/bots/download_goldctl.sh create mode 100644 packages/flutter_goldens_client/lib/skia_client.dart diff --git a/.cirrus.yml b/.cirrus.yml index 204112cec3d..5baaa6cd4f6 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -72,7 +72,11 @@ task: env: GCLOUD_SERVICE_ACCOUNT_KEY: ENCRYPTED[f12abe60f5045d619ef4c79b83dd1e0722a0b0b13dbea95fbe334e2db7fffbcd841a5a92da8824848b539a19afe0c9fb] SHARD: tests + DEPOT_TOOLS: "tmp/depot_tools" + GOLDCTL: "$DEPOT_TOOLS/goldctl" + GOLD_SERVICE_ACCOUNT: ENCRYPTED[3afeea5ac7201151c3d0dc9648862f0462b5e4f55dc600ca8b692319622f7c3eda3d577b1b16cc2ef0311b7314c1c095] SUBSHARD: framework_other + goldctl_script: ./dev/bots/download_goldctl.sh test_script: - dart --enable-asserts ./dev/bots/test.dart container: @@ -317,6 +321,9 @@ task: GCLOUD_SERVICE_ACCOUNT_KEY: ENCRYPTED[f12abe60f5045d619ef4c79b83dd1e0722a0b0b13dbea95fbe334e2db7fffbcd841a5a92da8824848b539a19afe0c9fb] SHARD: tests SUBSHARD: framework_other + GOLDCTL: "C:\\Windows\\Temp\\goldctl_tool\\goldctl.exe" + GOLD_SERVICE_ACCOUNT: ENCRYPTED[3afeea5ac7201151c3d0dc9648862f0462b5e4f55dc600ca8b692319622f7c3eda3d577b1b16cc2ef0311b7314c1c095] + goldctl_script: powershell dev\bots\download_goldctl.ps1 test_all_script: - dart --enable-asserts dev\bots\test.dart - name: tests_extras-windows @@ -493,6 +500,10 @@ task: GCLOUD_SERVICE_ACCOUNT_KEY: ENCRYPTED[f12abe60f5045d619ef4c79b83dd1e0722a0b0b13dbea95fbe334e2db7fffbcd841a5a92da8824848b539a19afe0c9fb] SHARD: tests SUBSHARD: extras + DEPOT_TOOLS: "tmp/depot_tools" + GOLDCTL: "$DEPOT_TOOLS/goldctl" + GOLD_SERVICE_ACCOUNT: ENCRYPTED[3afeea5ac7201151c3d0dc9648862f0462b5e4f55dc600ca8b692319622f7c3eda3d577b1b16cc2ef0311b7314c1c095] + goldctl_script: ./dev/bots/download_goldctl.sh test_all_script: - ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976 - dart --enable-asserts dev/bots/test.dart diff --git a/dev/bots/download_goldctl.ps1 b/dev/bots/download_goldctl.ps1 new file mode 100644 index 00000000000..b983539987c --- /dev/null +++ b/dev/bots/download_goldctl.ps1 @@ -0,0 +1,5 @@ +$url= "https://chrome-infra-packages.appspot.com/p/skia/tools/goldctl/windows-amd64/+/" +$path = "c:\Windows\Temp\goldctl.zip" + +(New-Object System.Net.WebClient).DownloadFile($path, $output) +Expand-Archive -LiteralPath $path -DestinationPath "C:\Windows\Temp\goldctl_tool" diff --git a/dev/bots/download_goldctl.sh b/dev/bots/download_goldctl.sh new file mode 100755 index 00000000000..9ef81cc3784 --- /dev/null +++ b/dev/bots/download_goldctl.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +git clone --depth 1 https://chromium.googlesource.com/chromium/tools/depot_tools.git ./tmp/depot_tools +cd tmp/depot_tools +echo -e '# Ensure File\n$ServiceURL https://chrome-infra-packages.appspot.com\n\n# Skia Gold Client goldctl\nskia/tools/goldctl/${platform} latest' > ensure.txt +./cipd ensure -ensure-file ensure.txt -root . diff --git a/packages/flutter/test/cupertino/date_picker_test.dart b/packages/flutter/test/cupertino/date_picker_test.dart index ae902120384..0b8908f0f09 100644 --- a/packages/flutter/test/cupertino/date_picker_test.dart +++ b/packages/flutter/test/cupertino/date_picker_test.dart @@ -847,7 +847,6 @@ void main() { 'date_picker_test.datetime.initial.png', version: 1, ), - skip: !isLinux ); // Slightly drag the hour component to make the current hour off-center. @@ -860,7 +859,6 @@ void main() { 'date_picker_test.datetime.drag.png', version: 1, ), - skip: !isLinux ); }); }); diff --git a/packages/flutter/test/cupertino/nav_bar_test.dart b/packages/flutter/test/cupertino/nav_bar_test.dart index 96afba335d9..56afa4a7837 100644 --- a/packages/flutter/test/cupertino/nav_bar_test.dart +++ b/packages/flutter/test/cupertino/nav_bar_test.dart @@ -805,9 +805,6 @@ void main() { ), ); }, - // TODO(xster): remove once https://github.com/flutter/flutter/issues/17483 - // is fixed. - skip: !isLinux, ); testWidgets( @@ -842,10 +839,7 @@ void main() { ), ); }, - // TODO(xster): remove once https://github.com/flutter/flutter/issues/17483 - // is fixed. - skip: !isLinux, - ); + ); testWidgets('NavBar draws a light system bar for a dark background', (WidgetTester tester) async { diff --git a/packages/flutter/test/cupertino/segmented_control_test.dart b/packages/flutter/test/cupertino/segmented_control_test.dart index 4cacef60242..71556c81715 100644 --- a/packages/flutter/test/cupertino/segmented_control_test.dart +++ b/packages/flutter/test/cupertino/segmented_control_test.dart @@ -1417,7 +1417,7 @@ void main() { version: 0, ), ); - }, skip: !isLinux); + }); testWidgets('Golden Test Pressed State', (WidgetTester tester) async { final Map children = {}; @@ -1458,5 +1458,5 @@ void main() { version: 0, ), ); - }, skip: !isLinux); + }); } diff --git a/packages/flutter/test/cupertino/text_field_test.dart b/packages/flutter/test/cupertino/text_field_test.dart index a4ebbd131be..dcdc751f7d8 100644 --- a/packages/flutter/test/cupertino/text_field_test.dart +++ b/packages/flutter/test/cupertino/text_field_test.dart @@ -481,7 +481,7 @@ void main() { version: 2, ), ); - }, skip: !isLinux); + }); testWidgets('Cupertino cursor iOS golden', (WidgetTester tester) async { debugDefaultTargetPlatformOverride = TargetPlatform.iOS; @@ -514,7 +514,7 @@ void main() { version: 2, ), ); - }, skip: !isLinux); + }); testWidgets( 'can control text content via controller', @@ -2901,7 +2901,6 @@ void main() { 'text_field_test.disabled.png', version: 0, ), - skip: !isLinux, ); }); diff --git a/packages/flutter/test/material/bottom_app_bar_test.dart b/packages/flutter/test/material/bottom_app_bar_test.dart index 4a0739836a5..7f1b3dcf6aa 100644 --- a/packages/flutter/test/material/bottom_app_bar_test.dart +++ b/packages/flutter/test/material/bottom_app_bar_test.dart @@ -75,7 +75,6 @@ void main() { 'bottom_app_bar.custom_shape.1.png', version: null, ), - skip: !isLinux, ); await pump(FloatingActionButtonLocation.centerDocked); await tester.pumpAndSettle(); @@ -85,7 +84,6 @@ void main() { 'bottom_app_bar.custom_shape.2.png', version: null, ), - skip: !isLinux, ); }, skip: isBrowser); diff --git a/packages/flutter/test/material/bottom_app_bar_theme_test.dart b/packages/flutter/test/material/bottom_app_bar_theme_test.dart index 4bbb597cdb1..3b4cd47815e 100644 --- a/packages/flutter/test/material/bottom_app_bar_theme_test.dart +++ b/packages/flutter/test/material/bottom_app_bar_theme_test.dart @@ -84,7 +84,6 @@ void main() { 'bottom_app_bar_theme.custom_shape.png', version: null, ), - skip: !isLinux, ); }, skip: isBrowser); diff --git a/packages/flutter/test/material/bottom_navigation_bar_test.dart b/packages/flutter/test/material/bottom_navigation_bar_test.dart index e8b277c1491..d8bc3a763f1 100644 --- a/packages/flutter/test/material/bottom_navigation_bar_test.dart +++ b/packages/flutter/test/material/bottom_navigation_bar_test.dart @@ -1438,7 +1438,6 @@ void main() { 'bottom_navigation_bar.shifting_transition.$pump.png', version: 2, ), - skip: !isLinux, ); } }, skip: isBrowser); diff --git a/packages/flutter/test/material/card_theme_test.dart b/packages/flutter/test/material/card_theme_test.dart index 8dedd6c21aa..abdf8cc6db5 100644 --- a/packages/flutter/test/material/card_theme_test.dart +++ b/packages/flutter/test/material/card_theme_test.dart @@ -141,7 +141,6 @@ void main() { 'card_theme.custom_shape.png', version: null, ), - skip: !isLinux, ); }, skip: isBrowser); } diff --git a/packages/flutter/test/material/dialog_theme_test.dart b/packages/flutter/test/material/dialog_theme_test.dart index 64378abfc72..133ecc1da71 100644 --- a/packages/flutter/test/material/dialog_theme_test.dart +++ b/packages/flutter/test/material/dialog_theme_test.dart @@ -134,7 +134,6 @@ void main() { 'dialog_theme.dialog_with_custom_border.png', version: null, ), - skip: !isLinux, ); }, skip: isBrowser); diff --git a/packages/flutter/test/material/dropdown_test.dart b/packages/flutter/test/material/dropdown_test.dart index b16d9bcfec6..03c480ce187 100644 --- a/packages/flutter/test/material/dropdown_test.dart +++ b/packages/flutter/test/material/dropdown_test.dart @@ -144,7 +144,6 @@ void main() { 'dropdown_test.default.png', version: 0, ), - skip: !isLinux, ); }, skip: isBrowser); @@ -160,7 +159,6 @@ void main() { 'dropdown_test.expanded.png', version: 0, ), - skip: !isLinux, ); }, skip: isBrowser); diff --git a/packages/flutter/test/material/floating_action_button_test.dart b/packages/flutter/test/material/floating_action_button_test.dart index 8b89ba85b93..5be827065d0 100644 --- a/packages/flutter/test/material/floating_action_button_test.dart +++ b/packages/flutter/test/material/floating_action_button_test.dart @@ -740,7 +740,6 @@ void main() { 'floating_action_button_test.clip.png', version: 2, ), - skip: !isLinux, ); }); diff --git a/packages/flutter/test/material/input_decorator_test.dart b/packages/flutter/test/material/input_decorator_test.dart index 405182550df..1d35a7d40fd 100644 --- a/packages/flutter/test/material/input_decorator_test.dart +++ b/packages/flutter/test/material/input_decorator_test.dart @@ -2844,7 +2844,6 @@ void main() { 'input_decorator.outline_icon_label.ltr.png', version: null, ), - skip: !isLinux, ); await tester.pumpWidget(buildFrame(TextDirection.rtl)); @@ -2854,10 +2853,8 @@ void main() { 'input_decorator.outline_icon_label.rtl.png', version: null, ), - skip: !isLinux, ); }, - skip: !isLinux, ); testWidgets('InputDecorator draws and animates hoverColor', (WidgetTester tester) async { diff --git a/packages/flutter/test/material/material_test.dart b/packages/flutter/test/material/material_test.dart index cb5b103c141..dac786582b5 100644 --- a/packages/flutter/test/material/material_test.dart +++ b/packages/flutter/test/material/material_test.dart @@ -620,7 +620,6 @@ void main() { 'material.border_paint_above.png', version: null, ), - skip: !isLinux, ); }, skip: isBrowser); @@ -664,7 +663,6 @@ void main() { 'material.border_paint_below.png', version: null, ), - skip: !isLinux, ); }, skip: isBrowser); }); diff --git a/packages/flutter/test/material/radio_test.dart b/packages/flutter/test/material/radio_test.dart index 29d8748c64e..bf817a5090e 100644 --- a/packages/flutter/test/material/radio_test.dart +++ b/packages/flutter/test/material/radio_test.dart @@ -280,7 +280,6 @@ void main() { 'radio.ink_ripple.png', version: null, ), - skip: !isLinux, ); }, skip: isBrowser); } diff --git a/packages/flutter/test/material/tab_bar_theme_test.dart b/packages/flutter/test/material/tab_bar_theme_test.dart index f17d4e08076..bb97c5d19f3 100644 --- a/packages/flutter/test/material/tab_bar_theme_test.dart +++ b/packages/flutter/test/material/tab_bar_theme_test.dart @@ -271,7 +271,6 @@ void main() { 'tab_bar_theme.tab_indicator_size_tab.png', version: null, ), - skip: !isLinux, ); }, skip: isBrowser); @@ -286,7 +285,6 @@ void main() { 'tab_bar_theme.tab_indicator_size_label.png', version: null, ), - skip: !isLinux, ); }, skip: isBrowser); @@ -306,7 +304,6 @@ void main() { 'tab_bar_theme.custom_tab_indicator.png', version: null, ), - skip: !isLinux, ); }, skip: isBrowser); @@ -326,7 +323,6 @@ void main() { 'tab_bar_theme.beveled_rect_indicator.png', version: null, ), - skip: !isLinux, ); }, skip: isBrowser); } diff --git a/packages/flutter/test/material/text_field_test.dart b/packages/flutter/test/material/text_field_test.dart index a432de80439..0f0b0d7c3e6 100644 --- a/packages/flutter/test/material/text_field_test.dart +++ b/packages/flutter/test/material/text_field_test.dart @@ -416,7 +416,7 @@ void main() { version: 0, ), ); - }, skip: !isLinux); + }); testWidgets('Material cursor iOS golden', (WidgetTester tester) async { debugDefaultTargetPlatformOverride = TargetPlatform.iOS; @@ -448,7 +448,7 @@ void main() { version: 0, ), ); - }, skip: !isLinux); + }); testWidgets('text field selection toolbar renders correctly inside opacity', (WidgetTester tester) async { await tester.pumpWidget( @@ -501,7 +501,6 @@ void main() { 'text_field_opacity_test.0.png', version: 2, ), - skip: !isLinux, ); }, skip: isBrowser); diff --git a/packages/flutter/test/painting/continous_rectangle_border_test.dart b/packages/flutter/test/painting/continous_rectangle_border_test.dart index 70e4526baf3..f644fb020b0 100644 --- a/packages/flutter/test/painting/continous_rectangle_border_test.dart +++ b/packages/flutter/test/painting/continous_rectangle_border_test.dart @@ -75,7 +75,6 @@ void main() { 'continuous_rectangle_border.golden_test_even_radii.png', version: null, ), - skip: !isLinux, ); }, skip: isBrowser); @@ -100,7 +99,6 @@ void main() { 'continuous_rectangle_border.golden_test_varying_radii.png', version: null, ), - skip: !isLinux, ); }, skip: isBrowser); @@ -122,7 +120,6 @@ void main() { 'continuous_rectangle_border.golden_test_large_radii.png', version: null, ), - skip: !isLinux, ); }, skip: isBrowser); diff --git a/packages/flutter/test/rendering/localized_fonts_test.dart b/packages/flutter/test/rendering/localized_fonts_test.dart index 025bb5610b0..e269699bb3d 100644 --- a/packages/flutter/test/rendering/localized_fonts_test.dart +++ b/packages/flutter/test/rendering/localized_fonts_test.dart @@ -55,7 +55,6 @@ void main() { ), ); }, - skip: !isLinux, ); testWidgets( @@ -110,7 +109,6 @@ void main() { ), ); }, - skip: !isLinux, ); testWidgets( @@ -157,7 +155,6 @@ void main() { ), ); }, - skip: !isLinux, ); } diff --git a/packages/flutter/test/widgets/backdrop_filter_test.dart b/packages/flutter/test/widgets/backdrop_filter_test.dart index c728f50ba1d..db339be4da2 100644 --- a/packages/flutter/test/widgets/backdrop_filter_test.dart +++ b/packages/flutter/test/widgets/backdrop_filter_test.dart @@ -47,7 +47,6 @@ void main() { 'backdrop_filter_test.cull_rect.png', version: 1, ), - skip: !isLinux, ); }, skip: isBrowser); } diff --git a/packages/flutter/test/widgets/editable_text_cursor_test.dart b/packages/flutter/test/widgets/editable_text_cursor_test.dart index 08c2d0fa45e..3c72be430f2 100644 --- a/packages/flutter/test/widgets/editable_text_cursor_test.dart +++ b/packages/flutter/test/widgets/editable_text_cursor_test.dart @@ -95,7 +95,7 @@ void main() { version: 3, ), ); - }, skip: !isLinux); + }); testWidgets('cursor layout has correct radius', (WidgetTester tester) async { final GlobalKey editableTextKey = GlobalKey(); @@ -149,7 +149,7 @@ void main() { version: 3, ), ); - }, skip: !isLinux); + }); testWidgets('Cursor animates on iOS', (WidgetTester tester) async { final Widget widget = MaterialApp( @@ -759,6 +759,5 @@ void main() { ), ); debugDefaultTargetPlatformOverride = null; - }, skip: !isLinux); - + }); } diff --git a/packages/flutter/test/widgets/invert_colors_test.dart b/packages/flutter/test/widgets/invert_colors_test.dart index bedb76c3ed4..8489f6e09f0 100644 --- a/packages/flutter/test/widgets/invert_colors_test.dart +++ b/packages/flutter/test/widgets/invert_colors_test.dart @@ -24,7 +24,6 @@ void main() { 'invert_colors_test.0.png', version: null, ), - skip: !isLinux, ); }, skip: isBrowser); @@ -46,7 +45,6 @@ void main() { 'invert_colors_test.1.png', version: null, ), - skip: !isLinux, ); }, skip: isBrowser); } diff --git a/packages/flutter/test/widgets/list_wheel_scroll_view_test.dart b/packages/flutter/test/widgets/list_wheel_scroll_view_test.dart index eacb3e55936..b52e5388b87 100644 --- a/packages/flutter/test/widgets/list_wheel_scroll_view_test.dart +++ b/packages/flutter/test/widgets/list_wheel_scroll_view_test.dart @@ -539,7 +539,6 @@ void main() { 'list_wheel_scroll_view.center_child.magnified.png', version: null, ), - skip: !isLinux, ); }, skip: isBrowser); @@ -597,7 +596,6 @@ void main() { 'list_wheel_scroll_view.curved_wheel.left.png', version: null, ), - skip: !isLinux, ); }, skip: isBrowser); diff --git a/packages/flutter/test/widgets/opacity_test.dart b/packages/flutter/test/widgets/opacity_test.dart index 0446459ddd2..1d173b3c42b 100644 --- a/packages/flutter/test/widgets/opacity_test.dart +++ b/packages/flutter/test/widgets/opacity_test.dart @@ -181,7 +181,6 @@ void main() { 'opacity_test.offset.png', version: 1, ), - skip: !isLinux, ); }, skip: isBrowser); diff --git a/packages/flutter/test/widgets/physical_model_test.dart b/packages/flutter/test/widgets/physical_model_test.dart index c425fb41867..5e043f8ea36 100644 --- a/packages/flutter/test/widgets/physical_model_test.dart +++ b/packages/flutter/test/widgets/physical_model_test.dart @@ -114,7 +114,6 @@ void main() { 'physical_model_overflow.png', version: null, ), - skip: !isLinux, ); }, skip: isBrowser); diff --git a/packages/flutter/test/widgets/shadow_test.dart b/packages/flutter/test/widgets/shadow_test.dart index bf5d6e2b269..f573974af17 100644 --- a/packages/flutter/test/widgets/shadow_test.dart +++ b/packages/flutter/test/widgets/shadow_test.dart @@ -37,8 +37,7 @@ void main() { 'shadow.BoxDecoration.enabled.png', version: null, ), - skip: !isLinux - ); // shadows render differently on different platforms + ); debugDisableShadows = true; }, skip: isBrowser); @@ -70,7 +69,7 @@ void main() { ); } debugDisableShadows = true; - }, skip: !isLinux); // shadows render differently on different platforms + }); testWidgets('Shadows with PhysicalLayer', (WidgetTester tester) async { await tester.pumpWidget( @@ -107,8 +106,7 @@ void main() { 'shadow.PhysicalModel.enabled.png', version: null, ), - skip: !isLinux, - ); // shadows render differently on different platforms + ); debugDisableShadows = true; }, skip: isBrowser); @@ -144,5 +142,5 @@ void main() { ); } debugDisableShadows = true; - }, skip: !isLinux); // shadows render differently on different platforms + }); } diff --git a/packages/flutter/test/widgets/text_golden_test.dart b/packages/flutter/test/widgets/text_golden_test.dart index ce798a0efa1..4b0d29a8d12 100644 --- a/packages/flutter/test/widgets/text_golden_test.dart +++ b/packages/flutter/test/widgets/text_golden_test.dart @@ -62,7 +62,7 @@ void main() { version: null, ), ); - }, skip: !isLinux); + }); testWidgets('Text Foreground', (WidgetTester tester) async { @@ -147,7 +147,7 @@ void main() { version: null, ), ); - }, skip: !isLinux); + }); // TODO(garyq): This test requires an update when the background // drawing from the beginning of the line bug is fixed. The current @@ -200,7 +200,7 @@ void main() { version: null, ), ); - }, skip: !isLinux); + }); testWidgets('Text Fade', (WidgetTester tester) async { await tester.pumpWidget( @@ -239,7 +239,7 @@ void main() { version: 1, ), ); - }, skip: !isLinux); + }); testWidgets('Default Strut text', (WidgetTester tester) async { await tester.pumpWidget( @@ -267,8 +267,7 @@ void main() { version: null, ), ); - }, skip: true); // Should only be on linux (skip: !isLinux). - // Disabled for now until font inconsistency is resolved. + }); testWidgets('Strut text 1', (WidgetTester tester) async { await tester.pumpWidget( @@ -298,8 +297,7 @@ void main() { version: 1, ), ); - }, skip: true); // Should only be on linux (skip: !isLinux). - // Disabled for now until font inconsistency is resolved. + }); testWidgets('Strut text 2', (WidgetTester tester) async { await tester.pumpWidget( @@ -330,8 +328,7 @@ void main() { version: 1, ), ); - }, skip: true); // Should only be on linux (skip: !isLinux). - // Disabled for now until font inconsistency is resolved. + }); testWidgets('Strut text rich', (WidgetTester tester) async { await tester.pumpWidget( @@ -385,8 +382,7 @@ void main() { version: 1, ), ); - }, skip: true); // Should only be on linux (skip: !isLinux). - // Disabled for now until font inconsistency is resolved. + }); testWidgets('Strut text font fallback', (WidgetTester tester) async { // Font Fallback @@ -424,8 +420,7 @@ void main() { version: 1, ), ); - }, skip: true); // Should only be on linux (skip: !isLinux). - // Disabled for now until font inconsistency is resolved. + }); testWidgets('Strut text rich forceStrutHeight', (WidgetTester tester) async { await tester.pumpWidget( @@ -479,8 +474,7 @@ void main() { version: 1, ), ); - }, skip: true); // Should only be on linux (skip: !isLinux). - // Disabled for now until font inconsistency is resolved. + }); testWidgets('Decoration thickness', (WidgetTester tester) async { final TextDecoration allDecorations = TextDecoration.combine( @@ -521,7 +515,7 @@ void main() { version: 0, ), ); - }, skip: !isLinux); // Coretext uses different thicknesses for decoration + }); testWidgets('Decoration thickness', (WidgetTester tester) async { final TextDecoration allDecorations = TextDecoration.combine( @@ -563,7 +557,7 @@ void main() { version: 1, ), ); - }, skip: !isLinux); // Coretext uses different thicknesses for decoration + }); testWidgets('Text Inline widget', (WidgetTester tester) async { await tester.pumpWidget( @@ -660,7 +654,7 @@ void main() { version: 1, ), ); - }, skip: !isLinux); // Coretext uses different thicknesses for decoration + }); testWidgets('Text Inline widget textfield', (WidgetTester tester) async { await tester.pumpWidget( @@ -708,7 +702,7 @@ void main() { version: 2, ), ); - }, skip: !isLinux); // Coretext uses different thicknesses for decoration + }); // This tests if multiple Text.rich widgets are able to inline nest within each other. testWidgets('Text Inline widget nesting', (WidgetTester tester) async { @@ -840,7 +834,7 @@ void main() { version: 2, ), ); - }, skip: !isLinux); // Coretext uses different thicknesses for decoration + }); testWidgets('Text Inline widget baseline', (WidgetTester tester) async { await tester.pumpWidget( @@ -950,7 +944,7 @@ void main() { version: 1, ), ); - }, skip: !isLinux); // Coretext uses different thicknesses for decoration + }); testWidgets('Text Inline widget aboveBaseline', (WidgetTester tester) async { await tester.pumpWidget( @@ -1060,7 +1054,7 @@ void main() { version: 1, ), ); - }, skip: !isLinux); // Coretext uses different thicknesses for decoration + }); testWidgets('Text Inline widget belowBaseline', (WidgetTester tester) async { await tester.pumpWidget( @@ -1170,7 +1164,7 @@ void main() { version: 1, ), ); - }, skip: !isLinux); // Coretext uses different thicknesses for decoration + }); testWidgets('Text Inline widget top', (WidgetTester tester) async { await tester.pumpWidget( @@ -1280,7 +1274,7 @@ void main() { version: 1, ), ); - }, skip: !isLinux); // Coretext uses different thicknesses for decoration + }); testWidgets('Text Inline widget middle', (WidgetTester tester) async { await tester.pumpWidget( @@ -1390,5 +1384,5 @@ void main() { version: 1, ), ); - }, skip: !isLinux); // Coretext uses different thicknesses for decoration + }); } diff --git a/packages/flutter/test/widgets/widget_inspector_test.dart b/packages/flutter/test/widgets/widget_inspector_test.dart index c77591d5c23..09ea5f4f687 100644 --- a/packages/flutter/test/widgets/widget_inspector_test.dart +++ b/packages/flutter/test/widgets/widget_inspector_test.dart @@ -2028,7 +2028,6 @@ class TestWidgetInspectorService extends Object with WidgetInspectorService { 'inspector.repaint_boundary_margin.png', version: null, ), - skip: !isLinux, ); // Regression test for how rendering with a pixel scale other than 1.0 @@ -2042,7 +2041,6 @@ class TestWidgetInspectorService extends Object with WidgetInspectorService { 'inspector.repaint_boundary_margin_small.png', version: null, ), - skip: !isLinux, ); await expectLater( @@ -2054,7 +2052,6 @@ class TestWidgetInspectorService extends Object with WidgetInspectorService { 'inspector.repaint_boundary_margin_large.png', version: null, ), - skip: !isLinux, ); final Layer layerParent = layer.parent; @@ -2073,7 +2070,6 @@ class TestWidgetInspectorService extends Object with WidgetInspectorService { 'inspector.repaint_boundary.png', version: null, ), - skip: !isLinux, ); // Verify that taking a screenshot didn't change the layers associated with @@ -2094,7 +2090,6 @@ class TestWidgetInspectorService extends Object with WidgetInspectorService { 'inspector.repaint_boundary_margin.png', version: null, ), - skip: !isLinux, ); // Verify that taking a screenshot didn't change the layers associated with @@ -2118,7 +2113,6 @@ class TestWidgetInspectorService extends Object with WidgetInspectorService { 'inspector.repaint_boundary_debugPaint.png', version: null, ), - skip: !isLinux, ); // Verify that taking a screenshot with debug paint on did not change // the number of children the layer has. @@ -2132,7 +2126,6 @@ class TestWidgetInspectorService extends Object with WidgetInspectorService { 'inspector.repaint_boundary.png', version: null, ), - skip: !isLinux, ); expect(renderObject.debugLayer, equals(layer)); @@ -2149,7 +2142,6 @@ class TestWidgetInspectorService extends Object with WidgetInspectorService { 'inspector.container.png', version: null, ), - skip: !isLinux, ); await expectLater( @@ -2163,7 +2155,6 @@ class TestWidgetInspectorService extends Object with WidgetInspectorService { 'inspector.container_debugPaint.png', version: null, ), - skip: !isLinux, ); { @@ -2187,7 +2178,6 @@ class TestWidgetInspectorService extends Object with WidgetInspectorService { 'inspector.container_debugPaint.png', version: null, ), - skip: !isLinux, ); expect(container.debugNeedsLayout, isFalse); } @@ -2203,7 +2193,6 @@ class TestWidgetInspectorService extends Object with WidgetInspectorService { 'inspector.container_small.png', version: null, ), - skip: !isLinux, ); await expectLater( @@ -2217,7 +2206,6 @@ class TestWidgetInspectorService extends Object with WidgetInspectorService { 'inspector.container_large.png', version: null, ), - skip: !isLinux, ); // This screenshot will show the clip rect debug paint but no other @@ -2233,7 +2221,6 @@ class TestWidgetInspectorService extends Object with WidgetInspectorService { 'inspector.clipRect_debugPaint.png', version: null, ), - skip: !isLinux, ); final Element clipRect = find.byType(ClipRRect).evaluate().single; @@ -2253,7 +2240,6 @@ class TestWidgetInspectorService extends Object with WidgetInspectorService { 'inspector.clipRect_debugPaint_margin.png', version: null, ), - skip: !isLinux, ); // Verify we get the same image if we go through the service extension @@ -2296,7 +2282,6 @@ class TestWidgetInspectorService extends Object with WidgetInspectorService { 'inspector.padding_debugPaint.png', version: null, ), - skip: !isLinux, ); // The bounds for this box crop its rendered content. @@ -2311,7 +2296,6 @@ class TestWidgetInspectorService extends Object with WidgetInspectorService { 'inspector.sizedBox_debugPaint.png', version: 1, ), - skip: !isLinux, ); // Verify that setting a margin includes the previously cropped content. @@ -2327,7 +2311,6 @@ class TestWidgetInspectorService extends Object with WidgetInspectorService { 'inspector.sizedBox_debugPaint_margin.png', version: null, ), - skip: !isLinux, ); }, skip: isBrowser); @@ -2402,7 +2385,6 @@ class TestWidgetInspectorService extends Object with WidgetInspectorService { 'inspector.composited_transform.only_offsets.png', version: null, ), - skip: !isLinux, ); await expectLater( @@ -2415,7 +2397,6 @@ class TestWidgetInspectorService extends Object with WidgetInspectorService { 'inspector.composited_transform.only_offsets_follower.png', version: null, ), - skip: !isLinux, ); await expectLater( @@ -2424,7 +2405,6 @@ class TestWidgetInspectorService extends Object with WidgetInspectorService { 'inspector.composited_transform.only_offsets_small.png', version: 1, ), - skip: !isLinux, ); await expectLater( @@ -2437,7 +2417,6 @@ class TestWidgetInspectorService extends Object with WidgetInspectorService { 'inspector.composited_transform.only_offsets_target.png', version: null, ), - skip: !isLinux, ); }, skip: isBrowser); @@ -2513,7 +2492,6 @@ class TestWidgetInspectorService extends Object with WidgetInspectorService { 'inspector.composited_transform.with_rotations.png', version: null, ), - skip: !isLinux, ); await expectLater( @@ -2526,7 +2504,6 @@ class TestWidgetInspectorService extends Object with WidgetInspectorService { 'inspector.composited_transform.with_rotations_small.png', version: null, ), - skip: !isLinux, ); await expectLater( @@ -2539,7 +2516,6 @@ class TestWidgetInspectorService extends Object with WidgetInspectorService { 'inspector.composited_transform.with_rotations_target.png', version: null, ), - skip: !isLinux, ); await expectLater( @@ -2552,7 +2528,6 @@ class TestWidgetInspectorService extends Object with WidgetInspectorService { 'inspector.composited_transform.with_rotations_follower.png', version: null, ), - skip: !isLinux, ); // Make sure taking screenshots hasn't modified the positions of the diff --git a/packages/flutter_goldens/lib/flutter_goldens.dart b/packages/flutter_goldens/lib/flutter_goldens.dart index 4f28df3576e..3784c0d1b90 100644 --- a/packages/flutter_goldens/lib/flutter_goldens.dart +++ b/packages/flutter_goldens/lib/flutter_goldens.dart @@ -9,19 +9,88 @@ import 'package:file/file.dart'; import 'package:file/local.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:meta/meta.dart'; +import 'package:platform/platform.dart'; import 'package:flutter_goldens_client/client.dart'; +import 'package:flutter_goldens_client/skia_client.dart'; + export 'package:flutter_goldens_client/client.dart'; +export 'package:flutter_goldens_client/skia_client.dart'; /// Main method that can be used in a `flutter_test_config.dart` file to set /// [goldenFileComparator] to an instance of [FlutterGoldenFileComparator] that -/// works for the current test. +/// works for the current test. _Which_ FlutterGoldenFileComparator is +/// instantiated is based on the current testing environment. Future main(FutureOr testMain()) async { - goldenFileComparator = await FlutterGoldenFileComparator.fromDefaultComparator(); + const Platform platform = LocalPlatform(); + if (FlutterSkiaGoldFileComparator.isAvailableOnPlatform(platform)) { + goldenFileComparator = await FlutterSkiaGoldFileComparator.fromDefaultComparator(); + } else if (FlutterGoldensRepositoryFileComparator.isAvailableOnPlatform(platform)) { + goldenFileComparator = await FlutterGoldensRepositoryFileComparator.fromDefaultComparator(); + } else { + goldenFileComparator = FlutterSkippingGoldenFileComparator.fromDefaultComparator(); + } await testMain(); } -/// A golden file comparator specific to the `flutter/flutter` repository. +/// Abstract base class golden file comparator specific to the `flutter/flutter` +/// repository. +abstract class FlutterGoldenFileComparator extends GoldenFileComparator { + /// Creates a [FlutterGoldenFileComparator] that will resolve golden file + /// URIs relative to the specified [basedir]. + /// + /// The [fs] and [platform] parameters useful in tests, where the default file + /// system and platform can be replaced by mock instances. + @visibleForTesting + FlutterGoldenFileComparator( + this.basedir, { + this.fs = const LocalFileSystem(), + this.platform = const LocalPlatform(), + }) : assert(basedir != null), + assert(fs != null), + assert(platform != null); + + /// The directory to which golden file URIs will be resolved in [compare] and + /// [update]. + final Uri basedir; + + /// The file system used to perform file access. + @visibleForTesting + final FileSystem fs; + + /// A wrapper for the [dart:io.Platform] API. + @visibleForTesting + final Platform platform; + + @override + Future update(Uri golden, Uint8List imageBytes) async { + final File goldenFile = getGoldenFile(golden); + await goldenFile.parent.create(recursive: true); + await goldenFile.writeAsBytes(imageBytes, flush: true); + } + + /// Calculate the appropriate basedir for the current test context. + @protected + @visibleForTesting + static Directory getBaseDirectory(GoldensClient goldens, LocalFileComparator defaultComparator) { + final FileSystem fs = goldens.fs; + final Directory testDirectory = fs.directory(defaultComparator.basedir); + final String testDirectoryRelativePath = fs.path.relative(testDirectory.path, from: goldens.flutterRoot.path); + return goldens.comparisonRoot.childDirectory(testDirectoryRelativePath); + } + + /// Returns the golden [File] identified by the given [Uri]. + @protected + File getGoldenFile(Uri uri) { + assert(basedir.scheme == 'file'); + final File goldenFile = fs.directory(basedir).childFile(fs.file(uri).path); + assert(goldenFile.uri.scheme == 'file'); + return goldenFile; + } +} + +/// A [FlutterGoldenFileComparator] for testing golden images against the +/// `flutter/goldens` repository. /// /// Within the https://github.com/flutter/flutter repository, it's important /// not to check-in binaries in order to keep the size of the repository to a @@ -29,59 +98,61 @@ Future main(FutureOr testMain()) async { /// files from a sibling repository, `flutter/goldens`. /// /// This comparator will locally clone the `flutter/goldens` repository into -/// the `$FLUTTER_ROOT/bin/cache/pkg/goldens` folder, then perform the comparison against -/// the files therein. -class FlutterGoldenFileComparator implements GoldenFileComparator { - /// Creates a [FlutterGoldenFileComparator] that will resolve golden file - /// URIs relative to the specified [basedir]. +/// the `$FLUTTER_ROOT/bin/cache/pkg/goldens` folder using the +/// [GoldensRepositoryClient], then perform the comparison against the files +/// therein. +/// +/// See also: +/// +/// * [GoldenFileComparator], the abstract class that +/// [FlutterGoldenFileComparator] implements. +/// * [FlutterSkiaGoldFileComparator], another [FlutterGoldenFileComparator] +/// that tests golden images through Skia Gold. +class FlutterGoldensRepositoryFileComparator extends FlutterGoldenFileComparator { + /// Creates a [FlutterGoldensRepositoryFileComparator] that will test golden + /// file images against the `flutter/goldens` repository. /// - /// The [fs] parameter exists for testing purposes only. - @visibleForTesting - FlutterGoldenFileComparator( - this.basedir, { - this.fs = const LocalFileSystem(), - }); + /// The [fs] and [platform] parameters useful in tests, where the default file + /// system and platform can be replaced by mock instances. + FlutterGoldensRepositoryFileComparator( + Uri basedir, { + FileSystem fs = const LocalFileSystem(), + Platform platform = const LocalPlatform(), + }) : super( + basedir, + fs: fs, + platform: platform, + ); - /// The directory to which golden file URIs will be resolved in [compare] and [update]. - final Uri basedir; - - /// The file system used to perform file access. - @visibleForTesting - final FileSystem fs; - - /// Creates a new [FlutterGoldenFileComparator] that mirrors the relative - /// path resolution of the default [goldenFileComparator]. + /// Creates a new [FlutterGoldensRespositoryFileComparator] that mirrors the + /// relative path resolution of the default [goldenFileComparator]. /// /// By the time the future completes, the clone of the `flutter/goldens` - /// repository is guaranteed to be ready use. + /// repository is guaranteed to be ready to use. /// /// The [goldens] and [defaultComparator] parameters are visible for testing /// purposes only. - static Future fromDefaultComparator({ - GoldensClient goldens, + static Future fromDefaultComparator({ + GoldensRepositoryClient goldens, LocalFileComparator defaultComparator, }) async { defaultComparator ??= goldenFileComparator; // Prepare the goldens repo. - goldens ??= GoldensClient(); + goldens ??= GoldensRepositoryClient(); await goldens.prepare(); - // Calculate the appropriate basedir for the current test context. - final FileSystem fs = goldens.fs; - final Directory testDirectory = fs.directory(defaultComparator.basedir); - final String testDirectoryRelativePath = fs.path.relative(testDirectory.path, from: goldens.flutterRoot.path); - return FlutterGoldenFileComparator(goldens.repositoryRoot.childDirectory(testDirectoryRelativePath).uri); + final Directory baseDirectory = FlutterGoldenFileComparator.getBaseDirectory(goldens, defaultComparator); + return FlutterGoldensRepositoryFileComparator(baseDirectory.uri); } @override Future compare(Uint8List imageBytes, Uri golden) async { - final File goldenFile = _getGoldenFile(golden); + final File goldenFile = getGoldenFile(golden); if (!goldenFile.existsSync()) { throw TestFailure('Could not be compared against non-existent file: "$golden"'); } final List goldenBytes = await goldenFile.readAsBytes(); - // TODO(tvolkert): Improve the intelligence of this comparison. if (goldenBytes.length != imageBytes.length) { return false; } @@ -93,14 +164,130 @@ class FlutterGoldenFileComparator implements GoldenFileComparator { return true; } - @override - Future update(Uri golden, Uint8List imageBytes) async { - final File goldenFile = _getGoldenFile(golden); - await goldenFile.parent.create(recursive: true); - await goldenFile.writeAsBytes(imageBytes, flush: true); + /// Decides based on the current platform whether goldens tests should be + /// performed against the flutter/goldens repository. + static bool isAvailableOnPlatform(Platform platform) => platform.isLinux; +} + +/// A [FlutterGoldenFileComparator] for testing golden images with Skia Gold. +/// +/// For testing across all platforms, the [SkiaGoldClient] is used to upload +/// images for framework-related golden tests and process results. Currently +/// these tests are designed to be run post-submit on Cirrus CI, informed by the +/// environment. +/// +/// See also: +/// +/// * [GoldenFileComparator], the abstract class that +/// [FlutterGoldenFileComparator] implements. +/// * [FlutterGoldensRepositoryFileComparator], another +/// [FlutterGoldenFileComparator] that tests golden images using the +/// flutter/goldens repository. +class FlutterSkiaGoldFileComparator extends FlutterGoldenFileComparator { + /// Creates a [FlutterSkiaGoldFileComparator] that will test golden file + /// images against Skia Gold. + /// + /// The [fs] and [platform] parameters useful in tests, where the default file + /// system and platform can be replaced by mock instances. + FlutterSkiaGoldFileComparator( + final Uri basedir, + this.skiaClient, { + FileSystem fs = const LocalFileSystem(), + Platform platform = const LocalPlatform(), + }) : super( + basedir, + fs: fs, + platform: platform, + ); + + final SkiaGoldClient skiaClient; + + /// Creates a new [FlutterSkiaGoldFileComparator] that mirrors the relative + /// path resolution of the default [goldenFileComparator]. + /// + /// The [goldens] and [defaultComparator] parameters are visible for testing + /// purposes only. + static Future fromDefaultComparator({ + SkiaGoldClient goldens, + LocalFileComparator defaultComparator, + }) async { + defaultComparator ??= goldenFileComparator; + goldens ??= SkiaGoldClient(); + + final Directory baseDirectory = FlutterGoldenFileComparator.getBaseDirectory(goldens, defaultComparator); + if (!baseDirectory.existsSync()) + baseDirectory.createSync(recursive: true); + await goldens.auth(baseDirectory); + await goldens.imgtestInit(); + return FlutterSkiaGoldFileComparator(baseDirectory.uri, goldens); } - File _getGoldenFile(Uri uri) { - return fs.directory(basedir).childFile(fs.file(uri).path); + @override + Future compare(Uint8List imageBytes, Uri golden) async { + golden = _addPrefix(golden); + await update(golden, imageBytes); + + final File goldenFile = getGoldenFile(golden); + if (!goldenFile.existsSync()) { + throw TestFailure('Could not be compared against non-existent file: "$golden"'); + } + return await skiaClient.imgtestAdd(golden.path, goldenFile); + } + + @override + Uri getTestUri(Uri key, int version) => key; + + /// Decides based on the current environment whether goldens tests should be + /// performed against Skia Gold. + static bool isAvailableOnPlatform(Platform platform) { + final String cirrusCI = platform.environment['CIRRUS_CI'] ?? ''; + final String cirrusPR = platform.environment['CIRRUS_PR'] ?? ''; + final String cirrusBranch = platform.environment['CIRRUS_BRANCH'] ?? ''; + return cirrusCI.isNotEmpty && cirrusPR.isEmpty && cirrusBranch == 'master'; + } + + /// Prepends the golden Uri with the library name that encloses the current + /// test. + Uri _addPrefix(Uri golden) { + final String prefix = basedir.pathSegments[basedir.pathSegments.length - 2]; + return Uri.parse(prefix + '.' + golden.toString()); } } + +/// A [FlutterGoldenFileComparator] for skipping golden image tests when Skia +/// Gold is unavailable or the current platform that is executing tests is not +/// Linux. +/// +/// See also: +/// +/// * [FlutterGoldensRepositoryFileComparator], another +/// [FlutterGoldenFileComparator] that tests golden images using the +/// flutter/goldens repository. +/// * [FlutterSkiaGoldFileComparator], another [FlutterGoldenFileComparator] +/// that tests golden images through Skia Gold. +class FlutterSkippingGoldenFileComparator extends FlutterGoldenFileComparator { + /// Creates a [FlutterSkippingGoldenFileComparator] that will skip tests that + /// are not in the right environment for golden file testing. + FlutterSkippingGoldenFileComparator(Uri basedir) : super(basedir); + + /// Creates a new [FlutterSkippingGoldenFileComparator] that mirrors the relative + /// path resolution of the default [goldenFileComparator]. + static FlutterSkippingGoldenFileComparator fromDefaultComparator({ + LocalFileComparator defaultComparator, + }) { + defaultComparator ??= goldenFileComparator; + return FlutterSkippingGoldenFileComparator(defaultComparator.basedir); + } + + @override + Future compare(Uint8List imageBytes, Uri golden) async { + print('Skipping "$golden" test : Skia Gold is not available in this testing ' + 'environment and flutter/goldens repository comparison is only available ' + 'on Linux machines.' + ); + return true; + } + + @override + Future update(Uri golden, Uint8List imageBytes) => null; +} diff --git a/packages/flutter_goldens/test/flutter_goldens_test.dart b/packages/flutter_goldens/test/flutter_goldens_test.dart index 19645edc8f2..4f1520052b2 100644 --- a/packages/flutter_goldens/test/flutter_goldens_test.dart +++ b/packages/flutter_goldens/test/flutter_goldens_test.dart @@ -34,13 +34,13 @@ void main() { }); group('GoldensClient', () { - GoldensClient goldens; + GoldensRepositoryClient goldens; setUp(() { - goldens = GoldensClient( + goldens = GoldensRepositoryClient( fs: fs, - platform: platform, process: process, + platform: platform, ); }); @@ -60,32 +60,65 @@ void main() { }); }); + group('SkiaGoldClient', () { + SkiaGoldClient goldens; + + setUp(() { + goldens = SkiaGoldClient( + fs: fs, + process: process, + platform: platform, + ); + }); + + group('auth', () { + test('performs minimal work if already authorized', () async { + final Directory workDirectory = fs.directory('/workDirectory')..createSync(recursive: true); + fs.file('/workDirectory/temp/auth_opt.json')..createSync(recursive: true); + when(process.run(any)).thenAnswer((_) => Future.value(io.ProcessResult(123, 0, '', ''))); + await goldens.auth(workDirectory); + + // Verify that we spawned no process calls + final VerificationResult verifyProcessRun = + verifyNever(process.run(captureAny, workingDirectory: captureAnyNamed('workingDirectory'))); + expect(verifyProcessRun.callCount, 0); + }); + }); + }); + group('FlutterGoldenFileComparator', () { + test('calculates the basedir correctly', () async { + final MockSkiaGoldClient goldens = MockSkiaGoldClient(); + final MockLocalFileComparator defaultComparator = MockLocalFileComparator(); + final Directory flutterRoot = fs.directory('/foo')..createSync(recursive: true); + final Directory goldensRoot = flutterRoot.childDirectory('bar')..createSync(recursive: true); + when(goldens.fs).thenReturn(fs); + when(goldens.flutterRoot).thenReturn(flutterRoot); + when(goldens.comparisonRoot).thenReturn(goldensRoot); + when(defaultComparator.basedir).thenReturn(flutterRoot.childDirectory('baz').uri); + final Directory basedir = FlutterGoldenFileComparator.getBaseDirectory(goldens, defaultComparator); + expect(basedir.uri, fs.directory('/foo/bar/baz').uri); + }); + }); + + group('FlutterGoldensRepositoryFileComparator', () { MemoryFileSystem fs; - FlutterGoldenFileComparator comparator; + FlutterGoldensRepositoryFileComparator comparator; setUp(() { fs = MemoryFileSystem(); + platform = FakePlatform( + operatingSystem: 'linux', + environment: {'FLUTTER_ROOT': _kFlutterRoot}, + ); final Directory flutterRoot = fs.directory('/path/to/flutter')..createSync(recursive: true); final Directory goldensRoot = flutterRoot.childDirectory('bin/cache/goldens')..createSync(recursive: true); final Directory testDirectory = goldensRoot.childDirectory('test/foo/bar')..createSync(recursive: true); - comparator = FlutterGoldenFileComparator(testDirectory.uri, fs: fs); - }); - - group('fromDefaultComparator', () { - test('calculates the basedir correctly', () async { - final MockGoldensClient goldens = MockGoldensClient(); - final MockLocalFileComparator defaultComparator = MockLocalFileComparator(); - final Directory flutterRoot = fs.directory('/foo')..createSync(recursive: true); - final Directory goldensRoot = flutterRoot.childDirectory('bar')..createSync(recursive: true); - when(goldens.fs).thenReturn(fs); - when(goldens.flutterRoot).thenReturn(flutterRoot); - when(goldens.repositoryRoot).thenReturn(goldensRoot); - when(defaultComparator.basedir).thenReturn(flutterRoot.childDirectory('baz').uri); - comparator = await FlutterGoldenFileComparator.fromDefaultComparator( - goldens: goldens, defaultComparator: defaultComparator); - expect(comparator.basedir, fs.directory('/foo/bar/baz').uri); - }); + comparator = FlutterGoldensRepositoryFileComparator( + testDirectory.uri, + fs: fs, + platform: platform, + ); }); group('compare', () { @@ -132,9 +165,44 @@ void main() { expect(goldenFile.readAsBytesSync(), [1, 2, 3]); }); }); + + group('getTestUri', () { + test('incorporates version number', () { + final Uri key = comparator.getTestUri(Uri.parse('foo.png'), 1); + expect(key, Uri.parse('foo.1.png')); + }); + test('ignores null version number', () { + final Uri key = comparator.getTestUri(Uri.parse('foo.png'), null); + expect(key, Uri.parse('foo.png')); + }); + }); + }); + + group('FlutterSkiaGoldFileComparator', () { + FlutterSkiaGoldFileComparator comparator; + + setUp(() { + final Directory flutterRoot = fs.directory('/path/to/flutter')..createSync(recursive: true); + final Directory goldensRoot = flutterRoot.childDirectory('bin/cache/goldens')..createSync(recursive: true); + final Directory testDirectory = goldensRoot.childDirectory('test/foo/bar')..createSync(recursive: true); + comparator = FlutterSkiaGoldFileComparator( + testDirectory.uri, + MockSkiaGoldClient(), + fs: fs, + platform: platform, + ); + }); + + group('getTestUri', () { + test('ignores version number', () { + final Uri key = comparator.getTestUri(Uri.parse('foo.png'), 1); + expect(key, Uri.parse('foo.png')); + }); + }); }); } class MockProcessManager extends Mock implements ProcessManager {} -class MockGoldensClient extends Mock implements GoldensClient {} +class MockGoldensRepositoryClient extends Mock implements GoldensRepositoryClient {} +class MockSkiaGoldClient extends Mock implements SkiaGoldClient {} class MockLocalFileComparator extends Mock implements LocalFileComparator {} diff --git a/packages/flutter_goldens_client/lib/client.dart b/packages/flutter_goldens_client/lib/client.dart index 3f6952f3a5e..d5257a52d38 100644 --- a/packages/flutter_goldens_client/lib/client.dart +++ b/packages/flutter_goldens_client/lib/client.dart @@ -16,11 +16,11 @@ import 'package:process/process.dart'; const String _kFlutterRootKey = 'FLUTTER_ROOT'; -/// A class that represents a clone of the https://github.com/flutter/goldens -/// repository, nested within the `bin/cache` directory of the caller's Flutter -/// repository. -class GoldensClient { - /// Create a handle to a local clone of the goldens repository. +/// An base class that provides shared information to the +/// [FlutterGoldenFileComparator] as well as the [SkiaGoldClient] and +/// [GoldensRepositoryClient]. +abstract class GoldensClient { + /// Creates a handle to the local environment of golden file images. GoldensClient({ this.fs = const LocalFileSystem(), this.platform = const LocalPlatform(), @@ -46,17 +46,32 @@ class GoldensClient { /// subprocesses. final ProcessManager process; - RandomAccessFile _lock; - /// The local [Directory] where the Flutter repository is hosted. /// /// Uses the [fs] file system. Directory get flutterRoot => fs.directory(platform.environment[_kFlutterRootKey]); - /// The local [Directory] where the goldens repository is hosted. + /// The local [Directory] where the goldens files are located. /// /// Uses the [fs] file system. - Directory get repositoryRoot => flutterRoot.childDirectory(fs.path.join('bin', 'cache', 'pkg', 'goldens')); + Directory get comparisonRoot => flutterRoot.childDirectory(fs.path.join('bin', 'cache', 'pkg', 'goldens')); +} + +/// A class that represents a clone of the https://github.com/flutter/goldens +/// repository, nested within the `bin/cache` directory of the caller's Flutter +/// repository. +class GoldensRepositoryClient extends GoldensClient { + GoldensRepositoryClient({ + FileSystem fs = const LocalFileSystem(), + ProcessManager process = const LocalProcessManager(), + Platform platform = const LocalPlatform(), + }) : super( + fs: fs, + process: process, + platform: platform, + ); + + RandomAccessFile _lock; /// Prepares the local clone of the `flutter/goldens` repository for golden /// file testing. @@ -89,46 +104,46 @@ class GoldensClient { } } - Future _getGoldensCommit() async { - final File versionFile = flutterRoot.childFile(fs.path.join('bin', 'internal', 'goldens.version')); - return (await versionFile.readAsString()).trim(); - } - Future _getCurrentCommit() async { - if (!repositoryRoot.existsSync()) { + if (!comparisonRoot.existsSync()) { return null; } else { final io.ProcessResult revParse = await process.run( ['git', 'rev-parse', 'HEAD'], - workingDirectory: repositoryRoot.path, + workingDirectory: comparisonRoot.path, ); return revParse.exitCode == 0 ? revParse.stdout.trim() : null; } } + Future _getGoldensCommit() async { + final File versionFile = flutterRoot.childFile(fs.path.join('bin', 'internal', 'goldens.version')); + return (await versionFile.readAsString()).trim(); + } + Future _initRepository() async { - await repositoryRoot.create(recursive: true); + await comparisonRoot.create(recursive: true); await _runCommands( [ 'git init', 'git remote add upstream https://github.com/flutter/goldens.git', 'git remote set-url --push upstream git@github.com:flutter/goldens.git', ], - workingDirectory: repositoryRoot, + workingDirectory: comparisonRoot, ); } Future _checkCanSync() async { final io.ProcessResult result = await process.run( ['git', 'status', '--porcelain'], - workingDirectory: repositoryRoot.path, + workingDirectory: comparisonRoot.path, ); if (result.stdout.trim().isNotEmpty) { final StringBuffer buf = StringBuffer(); buf - ..writeln('flutter_goldens git checkout at ${repositoryRoot.path} has local changes and cannot be synced.') + ..writeln('flutter_goldens git checkout at ${comparisonRoot.path} has local changes and cannot be synced.') ..writeln('To reset your client to a clean state, and lose any local golden test changes:') - ..writeln('cd ${repositoryRoot.path}') + ..writeln('cd ${comparisonRoot.path}') ..writeln('git reset --hard HEAD') ..writeln('git clean -x -d -f -f'); throw NonZeroExitCode(1, buf.toString()); @@ -142,7 +157,7 @@ class GoldensClient { 'git fetch upstream $commit', 'git reset --hard FETCH_HEAD', ], - workingDirectory: repositoryRoot, + workingDirectory: comparisonRoot, ); } @@ -174,6 +189,7 @@ class GoldensClient { _lock = null; } } + /// Exception that signals a process' exit with a non-zero exit code. class NonZeroExitCode implements Exception { /// Create an exception that represents a non-zero exit code. diff --git a/packages/flutter_goldens_client/lib/skia_client.dart b/packages/flutter_goldens_client/lib/skia_client.dart new file mode 100644 index 00000000000..fe3d7be285d --- /dev/null +++ b/packages/flutter_goldens_client/lib/skia_client.dart @@ -0,0 +1,211 @@ +// Copyright 2019 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:convert'; +import 'dart:io' as io; + +import 'package:file/file.dart'; +import 'package:file/local.dart'; +import 'package:path/path.dart' as path; +import 'package:platform/platform.dart'; +import 'package:process/process.dart'; + +import 'package:flutter_goldens_client/client.dart'; + +// If you are here trying to figure out how to use golden files in the Flutter +// repo itself, consider reading this wiki page: +// https://github.com/flutter/flutter/wiki/Writing-a-golden-file-test-for-package%3Aflutter + +// TODO(Piinks): This file will replace ./client.dart when transition to Skia +// Gold testing is complete + +const String _kGoldctlKey = 'GOLDCTL'; +const String _kServiceAccountKey = 'GOLD_SERVICE_ACCOUNT'; + +/// An extension of the [GoldensClient] class that interfaces with Skia Gold +/// for golden file testing. +class SkiaGoldClient extends GoldensClient { + SkiaGoldClient({ + FileSystem fs = const LocalFileSystem(), + ProcessManager process = const LocalProcessManager(), + Platform platform = const LocalPlatform(), + }) : super( + fs: fs, + process: process, + platform: platform, + ); + + /// The local [Directory] within the [comparisonRoot] for the current test + /// context. In this directory, the client will create image and json files + /// for the goldctl tool to use. + /// + /// This is informed by the [FlutterGoldenFileComparator] [basedir]. It cannot + /// be null. + Directory _workDirectory; + + /// The path to the local [Directory] where the goldctl tool is hosted. + /// + /// Uses the [platform] environment in this implementation. + String get _goldctl => platform.environment[_kGoldctlKey]; + + /// The path to the local [Directory] where the service account key is + /// hosted. + /// + /// Uses the [platform] environment in this implementation. + String get _serviceAccount => platform.environment[_kServiceAccountKey]; + + /// Prepares the local work space for golden file testing and calls the + /// goldctl `auth` command. + /// + /// This ensures that the goldctl tool is authorized and ready for testing. It + /// will only be called once for each instance of + /// [FlutterSkiaGoldFileComparator]. + /// + /// The [workDirectory] parameter specifies the current directory that golden + /// tests are executing in, relative to the library of the given test. It is + /// informed by the basedir of the [FlutterSkiaGoldFileComparator]. + Future auth(Directory workDirectory) async { + assert(workDirectory != null); + _workDirectory = workDirectory; + if (_clientIsAuthorized()) + return; + + final File authorization = _workDirectory.childFile('serviceAccount.json'); + await authorization.writeAsString(_serviceAccount); + + final List authArguments = [ + 'auth', + '--service-account', authorization.path, + '--work-dir', _workDirectory.childDirectory('temp').path, + ]; + + final io.ProcessResult authResults = await io.Process.run( + _goldctl, + authArguments, + ); + + if (authResults.exitCode != 0) { + final StringBuffer buf = StringBuffer() + ..writeln('Flutter + Skia Gold auth failed.') + ..writeln('stdout: ${authResults.stdout}') + ..writeln('stderr: ${authResults.stderr}'); + throw NonZeroExitCode(authResults.exitCode, buf.toString()); + } + } + + /// Executes the `imgtest init` command in the goldctl tool. + /// + /// The `imgtest` command collects and uploads test results to the Skia Gold + /// backend, the `init` argument initializes the testing environment. + Future imgtestInit() async { + final String commitHash = await _getCurrentCommit(); + final File keys = _workDirectory.childFile('keys.json'); + final File failures = _workDirectory.childFile('failures.json'); + + await keys.writeAsString(_getKeysJSON()); + await failures.create(); + + final List imgtestInitArguments = [ + 'imgtest', 'init', + '--instance', 'flutter', + '--work-dir', _workDirectory.childDirectory('temp').path, + '--commit', commitHash, + '--keys-file', keys.path, + '--failure-file', failures.path, + '--passfail', + ]; + + if (imgtestInitArguments.contains(null)) { + final StringBuffer buf = StringBuffer(); + buf.writeln('Null argument for Skia Gold imgtest init:'); + imgtestInitArguments.forEach(buf.writeln); + throw NonZeroExitCode(1, buf.toString()); + } + + final io.ProcessResult imgtestInitResult = await io.Process.run( + _goldctl, + imgtestInitArguments, + ); + + if (imgtestInitResult.exitCode != 0) { + final StringBuffer buf = StringBuffer() + ..writeln('Flutter + Skia Gold imgtest init failed.') + ..writeln('stdout: ${imgtestInitResult.stdout}') + ..writeln('stderr: ${imgtestInitResult.stderr}'); + throw NonZeroExitCode(imgtestInitResult.exitCode, buf.toString()); + } + } + + /// Executes the `imgtest add` command in the goldctl tool. + /// + /// The `imgtest` command collects and uploads test results to the Skia Gold + /// backend, the `add` argument uploads the current image test. A response is + /// returned from the invocation of this command that indicates a pass or fail + /// result. + /// + /// The testName and goldenFile parameters reference the current comparison + /// being evaluated by the [FlutterSkiaGoldFileComparator]. + Future imgtestAdd(String testName, File goldenFile) async { + assert(testName != null); + assert(goldenFile != null); + + final List imgtestArguments = [ + 'imgtest', 'add', + '--work-dir', _workDirectory.childDirectory('temp').path, + '--test-name', testName.split(path.extension(testName.toString()))[0], + '--png-file', goldenFile.path, + ]; + + await io.Process.run( + _goldctl, + imgtestArguments, + ); + + // TODO(Piinks): Comment on PR if triage is needed, https://github.com/flutter/flutter/issues/34673 + // So as not to turn the tree red in this initial implementation, this will + // return true for now. + // The ProcessResult that returns from line 157 contains the pass/fail + // result of the test & links to the dashboard and diffs. + return true; + } + + /// Returns the current commit hash of the Flutter repository. + Future _getCurrentCommit() async { + if (!flutterRoot.existsSync()) { + final StringBuffer buf = StringBuffer() + ..writeln('Flutter root could not be found: $flutterRoot'); + throw NonZeroExitCode(1, buf.toString()); + } else { + final io.ProcessResult revParse = await process.run( + ['git', 'rev-parse', 'HEAD'], + workingDirectory: flutterRoot.path, + ); + return revParse.exitCode == 0 ? revParse.stdout.trim() : null; + } + } + + /// Returns a JSON String with keys value pairs used to uniquely identify the + /// configuration that generated the given golden file. + /// + /// Currently, the only key value pair being tracked is the platform the image + /// was rendered on. + String _getKeysJSON() { + return json.encode( + { + 'Platform' : platform.operatingSystem, + } + ); + } + + /// Returns a boolean value to prevent the client from re-authorizing itself + /// for multiple tests. + bool _clientIsAuthorized() { + final File authFile = _workDirectory.childFile(super.fs.path.join( + 'temp', + 'auth_opt.json', + )); + return authFile.existsSync(); + } +} diff --git a/packages/flutter_test/lib/src/goldens.dart b/packages/flutter_test/lib/src/goldens.dart index 6672755ce08..1bc6fcd8398 100644 --- a/packages/flutter_test/lib/src/goldens.dart +++ b/packages/flutter_test/lib/src/goldens.dart @@ -45,6 +45,26 @@ abstract class GoldenFileComparator { /// The method by which [golden] is located and by which its bytes are written /// is left up to the implementation class. Future update(Uri golden, Uint8List imageBytes); + + /// Returns a new golden file [Uri] to incorporate any [version] number with + /// the [key]. + /// + /// The [version] is an optional int that can be used to differentiate + /// historical golden files. + /// + /// Version numbers are used in golden file tests for package:flutter. You can + /// learn more about these tests [here](https://github.com/flutter/flutter/wiki/Writing-a-golden-file-test-for-package:flutter). + Uri getTestUri(Uri key, int version) { + if (version == null) + return key; + final String keyString = key.toString(); + final String extension = path.extension(keyString); + return Uri.parse( + keyString + .split(extension) + .join() + '.' + version.toString() + extension + ); + } } /// Compares rasterized image bytes against a golden image file. @@ -126,6 +146,11 @@ class TrivialComparator implements GoldenFileComparator { Future update(Uri golden, Uint8List imageBytes) { throw StateError('goldenFileComparator has not been initialized'); } + + @override + Uri getTestUri(Uri key, int version) { + return key; + } } /// The default [GoldenFileComparator] implementation for `flutter test`. @@ -140,7 +165,7 @@ class TrivialComparator implements GoldenFileComparator { /// /// When using `flutter test --update-goldens`, [LocalFileComparator] /// updates the files on disk to match the rendering. -class LocalFileComparator implements GoldenFileComparator { +class LocalFileComparator extends GoldenFileComparator { /// Creates a new [LocalFileComparator] for the specified [testFile]. /// /// Golden file keys will be interpreted as file paths relative to the diff --git a/packages/flutter_test/lib/src/matchers.dart b/packages/flutter_test/lib/src/matchers.dart index 9f32de05467..a97299c3e18 100644 --- a/packages/flutter_test/lib/src/matchers.dart +++ b/packages/flutter_test/lib/src/matchers.dart @@ -1712,7 +1712,7 @@ class _MatchesGoldenFile extends AsyncMatcher { imageFuture = _captureImage(elements.single); } - final Uri testNameUri = _getTestNameUri(key, version); + final Uri testNameUri = goldenFileComparator.getTestUri(key, version); final TestWidgetsFlutterBinding binding = TestWidgetsFlutterBinding.ensureInitialized(); return binding.runAsync(() async { @@ -1734,19 +1734,9 @@ class _MatchesGoldenFile extends AsyncMatcher { } @override - Description describe(Description description) => - description.add('one widget whose rasterized image matches golden image "${_getTestNameUri(key, version)}"'); - - Uri _getTestNameUri(Uri key, int version) { - return version == null ? key : Uri.parse( - key - .toString() - .splitMapJoin( - RegExp(r'.png'), - onMatch: (Match m) => '${'.' + version.toString() + m.group(0)}', - onNonMatch: (String n) => '$n' - ) - ); + Description describe(Description description) { + final Uri testNameUri = goldenFileComparator.getTestUri(key, version); + return description.add('one widget whose rasterized image matches golden image "$testNameUri"'); } } diff --git a/packages/flutter_test/test/goldens_test.dart b/packages/flutter_test/test/goldens_test.dart index 5d036428c61..004b33665bb 100644 --- a/packages/flutter_test/test/goldens_test.dart +++ b/packages/flutter_test/test/goldens_test.dart @@ -182,5 +182,18 @@ void main() { expect(fs.file(fix('/foo.png')).readAsBytesSync(), newBytes); }); }); + + group('getTestUri', () { + test('updates file name with version number', () { + final Uri key = Uri.parse('foo.png'); + final Uri key1 = comparator.getTestUri(key, 1); + expect(key1, Uri.parse('foo.1.png')); + }); + test('does nothing for null version number', () { + final Uri key = Uri.parse('foo.png'); + final Uri keyNull = comparator.getTestUri(key, null); + expect(keyNull, Uri.parse('foo.png')); + }); + }); }); } diff --git a/packages/flutter_test/test/matchers_test.dart b/packages/flutter_test/test/matchers_test.dart index b2108e29ae0..05f59812530 100644 --- a/packages/flutter_test/test/matchers_test.dart +++ b/packages/flutter_test/test/matchers_test.dart @@ -335,30 +335,6 @@ void main() { expect(comparator.imageBytes, hasLength(greaterThan(0))); expect(comparator.golden, Uri.parse('foo.png')); }); - - testWidgets('Comparator succeeds incorporating version number', (WidgetTester tester) async { - await tester.pumpWidget(boilerplate(const Text('hello'))); - final Finder finder = find.byType(Text); - await expectLater(finder, matchesGoldenFile( - 'foo.png', - version: 1, - )); - expect(comparator.invocation, _ComparatorInvocation.compare); - expect(comparator.imageBytes, hasLength(greaterThan(0))); - expect(comparator.golden, Uri.parse('foo.1.png')); - }); - - testWidgets('Comparator succeeds with null version number', (WidgetTester tester) async { - await tester.pumpWidget(boilerplate(const Text('hello'))); - final Finder finder = find.byType(Text); - await expectLater(finder, matchesGoldenFile( - 'foo.png', - version: null, - )); - expect(comparator.invocation, _ComparatorInvocation.compare); - expect(comparator.imageBytes, hasLength(greaterThan(0))); - expect(comparator.golden, Uri.parse('foo.png')); - }); }); group('does not match', () { @@ -413,40 +389,6 @@ void main() { expect(error.message, contains('too many widgets')); } }); - - testWidgets('Comparator failure incorporates version number', (WidgetTester tester) async { - comparator.behavior = _ComparatorBehavior.returnFalse; - await tester.pumpWidget(boilerplate(const Text('hello'))); - final Finder finder = find.byType(Text); - try { - await expectLater(finder, matchesGoldenFile( - 'foo.png', - version: 1, - )); - fail('TestFailure expected but not thrown'); - } on TestFailure catch (error) { - expect(comparator.invocation, _ComparatorInvocation.compare); - expect(error.message, contains('does not match')); - expect(error.message, contains('foo.1.png')); - } - }); - - testWidgets('Comparator failure with null version number', (WidgetTester tester) async { - comparator.behavior = _ComparatorBehavior.returnFalse; - await tester.pumpWidget(boilerplate(const Text('hello'))); - final Finder finder = find.byType(Text); - try { - await expectLater(finder, matchesGoldenFile( - 'foo.png', - version: null, - )); - fail('TestFailure expected but not thrown'); - } on TestFailure catch (error) { - expect(comparator.invocation, _ComparatorInvocation.compare); - expect(error.message, contains('does not match')); - expect(error.message, contains('foo.png')); - } - }); }); testWidgets('calls update on comparator if autoUpdateGoldenFiles is true', (WidgetTester tester) async { @@ -708,6 +650,11 @@ class _FakeComparator implements GoldenFileComparator { this.imageBytes = imageBytes; return Future.value(); } + + @override + Uri getTestUri(Uri key, int version) { + return key; + } } class _FakeSemanticsNode extends SemanticsNode {