diff --git a/lib/src/cli/commands/run.dart b/lib/src/cli/commands/run.dart index 155746c..5fb5313 100644 --- a/lib/src/cli/commands/run.dart +++ b/lib/src/cli/commands/run.dart @@ -12,6 +12,7 @@ class RunCommand extends fltool.RunCommand with FlutterpiCommandMixin { usesDeviceManager(); usesEngineFlavorOption(); usesDebugSymbolsOption(); + usesRotationOption(); } @protected @@ -39,7 +40,6 @@ class RunCommand extends fltool.RunCommand with FlutterpiCommandMixin { @override Future runCommand() async { await populateCache(); - return super.runCommand(); } } diff --git a/lib/src/cli/flutterpi_command.dart b/lib/src/cli/flutterpi_command.dart index 164d78a..ffc3f54 100644 --- a/lib/src/cli/flutterpi_command.dart +++ b/lib/src/cli/flutterpi_command.dart @@ -174,6 +174,18 @@ mixin FlutterpiCommandMixin on FlutterCommand { return remote.contains('@') ? remote.split('@').first : null; } + int get rotation { + final rotationString = stringArg('rotation'); + if (rotationString == null) { + return 0; + } + final rotationInt = int.tryParse(rotationString); + if (rotationInt == null) { + usageException('Invalid --rotation: Expected an integer in degrees. '); + } + return rotationInt; + } + final _contextOverrides = {}; void addContextOverride(dynamic Function() fn) { @@ -249,6 +261,7 @@ mixin FlutterpiCommandMixin on FlutterCommand { fs: globals.fs, logger: globals.logger, platform: globals.platform, + rotation: rotation, ), deviceId: stringArg(FlutterGlobalOptions.kDeviceIdOption, global: true), ), @@ -290,6 +303,18 @@ mixin FlutterpiCommandMixin on FlutterCommand { ); } + void usesRotationOption() { + argParser.addOption( + 'rotation', + abbr: 'r', + help: 'Start the app with this rotation. This is just an ' + 'alternative, more intuitive way to specify the ' + 'startup orientation. The angle is in degrees and clock-wise', + allowed: ['0', '90', '180', '270'], + defaultsTo: '0', + ); + } + bool getIncludeDebugSymbols() { return boolArg('debug-symbols'); } @@ -431,6 +456,7 @@ mixin FlutterpiCommandMixin on FlutterCommand { fs: globals.fs, logger: globals.logger, platform: globals.platform, + rotation: rotation, ), BuildTargets: () => const BuildTargetsImpl(), ApplicationPackageFactory: () => FlutterpiApplicationPackageFactory(), diff --git a/lib/src/config.dart b/lib/src/config.dart index 9495a9e..a832a18 100644 --- a/lib/src/config.dart +++ b/lib/src/config.dart @@ -77,6 +77,7 @@ class FlutterPiToolConfig { required this.fs, required this.logger, required this.platform, + required this.rotation, }) : _config = Config( 'flutterpi_tool_config', fileSystem: fs, @@ -88,6 +89,7 @@ class FlutterPiToolConfig { final Logger logger; final Platform platform; final Config _config; + final int rotation; List getDevices() { final entries = _config.getValue('devices'); diff --git a/lib/src/devices/flutterpi_ssh/device.dart b/lib/src/devices/flutterpi_ssh/device.dart index d13aab7..7e00d70 100644 --- a/lib/src/devices/flutterpi_ssh/device.dart +++ b/lib/src/devices/flutterpi_ssh/device.dart @@ -4,6 +4,7 @@ import 'dart:io'; import 'package:flutterpi_tool/src/build_system/build_app.dart'; import 'package:flutterpi_tool/src/cache.dart'; import 'package:flutterpi_tool/src/common.dart'; +import 'package:flutterpi_tool/src/config.dart'; import 'package:flutterpi_tool/src/fltool/common.dart'; import 'package:flutterpi_tool/src/fltool/globals.dart'; import 'package:flutterpi_tool/src/more_os_utils.dart'; @@ -109,6 +110,7 @@ class FlutterpiSshDevice extends Device { required String id, required this.name, required this.sshUtils, + required this.config, required String? remoteInstallPath, required this.logger, required this.os, @@ -129,6 +131,7 @@ class FlutterpiSshDevice extends Device { final Logger logger; final FlutterpiCache cache; final MoreOperatingSystemUtils os; + final FlutterPiToolConfig config; final runningApps = {}; final logReaders = {}; @@ -330,6 +333,7 @@ class FlutterpiSshDevice extends Device { required String flutterpiExe, required String bundlePath, required BuildMode runtimeMode, + required int rotation, Iterable engineArgs = const [], Iterable dartCmdlineArgs = const [], }) { @@ -346,6 +350,7 @@ class FlutterpiSshDevice extends Device { '--dimensions', '$width,$height', ], + '--rotation', rotation.toString(), if (runtimeModeArg != null) runtimeModeArg, bundlePath, ...engineArgs, @@ -495,6 +500,7 @@ class FlutterpiSshDevice extends Device { flutterpiExe: flutterpiExePath, bundlePath: remoteInstallPath, runtimeMode: debuggingOptions.buildInfo.mode, + rotation: config.rotation, engineArgs: [ ...engineArgs, if (debuggingOptions.deviceVmServicePort == null) diff --git a/lib/src/devices/flutterpi_ssh/device_discovery.dart b/lib/src/devices/flutterpi_ssh/device_discovery.dart index 63642e7..f897198 100644 --- a/lib/src/devices/flutterpi_ssh/device_discovery.dart +++ b/lib/src/devices/flutterpi_ssh/device_discovery.dart @@ -47,6 +47,7 @@ class FlutterpiSshDeviceDiscovery extends PollingDeviceDiscovery { os: os, explicitDisplaySizeMillimeters: configEntry.displaySizeMillimeters, explicitDevicePixelRatio: null, + config: config, ); }