diff --git a/dev/devicelab/lib/framework/runner.dart b/dev/devicelab/lib/framework/runner.dart index 7c7837a255..69cbe36364 100644 --- a/dev/devicelab/lib/framework/runner.dart +++ b/dev/devicelab/lib/framework/runner.dart @@ -143,7 +143,7 @@ Future cleanupSystem() async { final String gradlewBinaryName = Platform.isWindows ? 'gradlew.bat' : 'gradlew'; final Directory tempDir = Directory.systemTemp.createTempSync('flutter_devicelab_shutdown_gradle.'); recursiveCopy(Directory(path.join(flutterDirectory.path, 'bin', 'cache', 'artifacts', 'gradle_wrapper')), tempDir); - copy(File(path.join(path.join(flutterDirectory.path, 'packages', 'flutter_tools'), 'templates', 'create', 'android.tmpl', 'gradle', 'wrapper', 'gradle-wrapper.properties')), Directory(path.join(tempDir.path, 'gradle', 'wrapper'))); + copy(File(path.join(path.join(flutterDirectory.path, 'packages', 'flutter_tools'), 'templates', 'app', 'android.tmpl', 'gradle', 'wrapper', 'gradle-wrapper.properties')), Directory(path.join(tempDir.path, 'gradle', 'wrapper'))); if (!Platform.isWindows) { await exec( 'chmod', diff --git a/packages/flutter_tools/lib/executable.dart b/packages/flutter_tools/lib/executable.dart index b42040eda9..61a38a72c7 100644 --- a/packages/flutter_tools/lib/executable.dart +++ b/packages/flutter_tools/lib/executable.dart @@ -56,7 +56,7 @@ Future main(List args) async { ChannelCommand(verboseHelp: verboseHelp), CleanCommand(), ConfigCommand(verboseHelp: verboseHelp), - CreateCommand(), + CreateCommand(verboseHelp: verboseHelp), DaemonCommand(hidden: !verboseHelp), DevicesCommand(), DoctorCommand(verbose: verbose), diff --git a/packages/flutter_tools/lib/src/commands/create.dart b/packages/flutter_tools/lib/src/commands/create.dart index a34ec89c59..80cf399ce0 100644 --- a/packages/flutter_tools/lib/src/commands/create.dart +++ b/packages/flutter_tools/lib/src/commands/create.dart @@ -6,6 +6,7 @@ import 'dart:async'; import 'package:linter/src/rules/pub/package_names.dart' as package_names; // ignore: implementation_imports import 'package:linter/src/utils.dart' as linter_utils; // ignore: implementation_imports +import 'package:yaml/yaml.dart' as yaml; import '../android/android.dart' as android; import '../android/android_sdk.dart' as android_sdk; @@ -23,8 +24,33 @@ import '../runner/flutter_command.dart'; import '../template.dart'; import '../version.dart'; +enum ProjectType { + app, + application, + module, // TODO(gspencer): deprecated -- should be removed once IntelliJ no longer uses it. + package, + plugin, +} + +ProjectType _stringToProjectType(String value) { + ProjectType result; + // TODO(gspencer): remove module when it is no longer used by IntelliJ plugin. + // Module is just an alias for application. + if (value == 'module') { + value = 'application'; + } + for (ProjectType type in ProjectType.values) { + if (value == getEnumName(type)) { + result = type; + break; + } + } + assert(result != null, 'Unsupported template type $value requested.'); + return result; +} + class CreateCommand extends FlutterCommand { - CreateCommand() { + CreateCommand({bool verboseHelp = false }) { argParser.addFlag('pub', defaultsTo: true, help: 'Whether to run "flutter packages get" after the project has been created.' @@ -39,21 +65,33 @@ class CreateCommand extends FlutterCommand { 'with-driver-test', negatable: true, defaultsTo: false, - help: 'Also add a flutter_driver dependency and generate a sample \'flutter drive\' test.' + help: "Also add a flutter_driver dependency and generate a sample 'flutter drive' test." ); argParser.addOption( 'template', abbr: 't', - allowed: ['app', 'module', 'package', 'plugin'], + allowed: ProjectType.values.map((ProjectType type) => getEnumName(type)), help: 'Specify the type of project to create.', valueHelp: 'type', allowedHelp: { - 'app': '(default) Generate a Flutter application.', - 'package': 'Generate a shareable Flutter project containing modular Dart code.', - 'plugin': 'Generate a shareable Flutter project containing an API in Dart code\n' - 'with a platform-specific implementation for Android, for iOS code, or for both.', - }, - defaultsTo: 'app', + getEnumName(ProjectType.application): '(default) Generate a Flutter application.', + getEnumName(ProjectType.package): 'Generate a shareable Flutter project containing modular ' + 'Dart code.', + getEnumName(ProjectType.plugin): 'Generate a shareable Flutter project containing an API ' + 'in Dart code with a platform-specific implementation for Android, for iOS code, or ' + 'for both.', + }..addAll(verboseHelp + ? { + getEnumName(ProjectType.app): 'Generate the legacy form of an application project. Use ' + '"application" instead, unless you are working with an existing legacy app project. ' + 'This is not just an alias for the "application" template, it produces different ' + 'output.', + getEnumName(ProjectType.module): 'Legacy, deprecated form of an application project. Use ' + '"application" instead. This is just an alias for the "application" template, it ' + 'produces the same output. It will be removed in a future release.', + } + : {}), + defaultsTo: null, ); argParser.addOption( 'description', @@ -90,6 +128,48 @@ class CreateCommand extends FlutterCommand { @override String get invocation => '${runner.executableName} $name '; + // If it has a .metadata file with the project_type in it, use that. + // If it has an android dir and an android/app dir, it's a legacy app + // If it has an android dir and an android/src dir, it's a plugin + // If it has .ios and/or .android dirs, it's an application (nee module) + // If it has an ios dir and an ios/Classes dir, it's a plugin + // If it has no ios dir, no android dir, and no .ios or .android, then it's a package. + ProjectType _determineTemplateType(Directory projectDir) { + yaml.YamlMap loadMetadata(Directory projectDir) { + if (!projectDir.existsSync()) + return null; + final File metadataFile =fs.file(fs.path.join(projectDir.absolute.path, '.metadata')); + if (!metadataFile.existsSync()) + return null; + return yaml.loadYaml(metadataFile.readAsStringSync()); + } + + // If it exists, the project type in the metadata is definitive. + final yaml.YamlMap metadata = loadMetadata(projectDir); + if (metadata != null && metadata['project_type'] != null) { + return _stringToProjectType(metadata['project_type']); + } + + // There either wasn't any metadata, or it didn't contain the project type, + // so try and figure out what type of project it is from the existing + // directory structure. + if (fs.directory(fs.path.join(projectDir.absolute.path, 'android', 'app')).existsSync()) + return ProjectType.app; + final bool dotPlatformDirExists = fs.directory(fs.path.join(projectDir.absolute.path, '.ios')).existsSync() || + fs.directory(fs.path.join(projectDir.absolute.path, '.android')).existsSync(); + final bool platformDirExists = fs.directory(fs.path.join(projectDir.absolute.path, 'ios')).existsSync() || + fs.directory(fs.path.join(projectDir.absolute.path, 'android')).existsSync(); + if (dotPlatformDirExists) + return ProjectType.application; + if (!platformDirExists && !dotPlatformDirExists) + return ProjectType.package; + if (platformDirExists && + (fs.directory(fs.path.join(projectDir.absolute.path, 'ios', 'Classes')).existsSync() || + fs.directory(fs.path.join(projectDir.absolute.path, 'android', 'src')).existsSync())) + return ProjectType.plugin; + return null; + } + @override Future runCommand() async { if (argResults.rest.isEmpty) @@ -123,13 +203,33 @@ class CreateCommand extends FlutterCommand { if (!fs.isFileSync(fs.path.join(flutterDriverPackagePath, 'pubspec.yaml'))) throwToolExit('Unable to find package:flutter_driver in $flutterDriverPackagePath', exitCode: 2); - final String template = argResults['template']; - final bool generateModule = template == 'module'; - final bool generatePlugin = template == 'plugin'; - final bool generatePackage = template == 'package'; - final Directory projectDir = fs.directory(argResults.rest.first); final String dirPath = fs.path.normalize(projectDir.absolute.path); + + ProjectType detectedProjectType; + if (projectDir.existsSync()) { + detectedProjectType = _determineTemplateType(projectDir); + if (detectedProjectType == null) { + throwToolExit('Sorry, unable to detect the type of project to recreate. ' + 'Try creating a fresh project and migrating your existing code to ' + 'the new project manually.'); + } + } + + ProjectType template; + if (argResults['template'] != null) { + template = _stringToProjectType(argResults['template']); + } + template ??= detectedProjectType ?? ProjectType.application; + if (detectedProjectType != null && template != detectedProjectType) { + throwToolExit("The requested template type '${getEnumName(template)}' doesn't match the " + "existing template type of '${getEnumName(detectedProjectType)}'."); + } + + final bool generateApplication = template == ProjectType.application; + final bool generatePlugin = template == ProjectType.plugin; + final bool generatePackage = template == ProjectType.package; + String organization = argResults['org']; if (!argResults.wasParsed('org')) { final FlutterProject project = await FlutterProject.fromDirectory(projectDir); @@ -164,54 +264,58 @@ class CreateCommand extends FlutterCommand { iosLanguage: argResults['ios-language'], ); - printStatus('Creating project ${fs.path.relative(dirPath)}...'); + final String relativeDirPath = fs.path.relative(dirPath); + printStatus('Creating project $relativeDirPath...'); final Directory directory = fs.directory(dirPath); int generatedFileCount = 0; switch (template) { - case 'app': - generatedFileCount += await _generateApp(directory, templateContext); + case ProjectType.app: + generatedFileCount += await _generateLegacyApp(directory, templateContext); break; - case 'module': - generatedFileCount += await _generateModule(directory, templateContext); + case ProjectType.module: + case ProjectType.application: + generatedFileCount += await _generateApplication(directory, templateContext); break; - case 'package': + case ProjectType.package: generatedFileCount += await _generatePackage(directory, templateContext); break; - case 'plugin': + case ProjectType.plugin: generatedFileCount += await _generatePlugin(directory, templateContext); break; } printStatus('Wrote $generatedFileCount files.'); - printStatus(''); + printStatus('\nAll done!'); if (generatePackage) { - final String relativePath = fs.path.relative(dirPath); - printStatus('Your package code is in lib/${templateContext['projectName']}.dart in the $relativePath directory.'); - } else if (generateModule) { - final String relativePath = fs.path.relative(dirPath); - printStatus('Your module code is in lib/main.dart in the $relativePath directory.'); + final String relativeMainPath = fs.path.normalize(fs.path.join(relativeDirPath, 'lib', '${templateContext['projectName']}.dart')); + printStatus('Your package code is in $relativeMainPath'); + } else if (generateApplication) { + final String relativeMainPath = fs.path.normalize(fs.path.join(relativeDirPath, 'lib', 'main.dart')); + printStatus('Your application code is in $relativeMainPath.'); } else { // Run doctor; tell the user the next steps. final FlutterProject project = await FlutterProject.fromPath(dirPath); final FlutterProject app = project.hasExampleApp ? project.example : project; - final String relativeAppPath = fs.path.relative(app.directory.path); - final String relativePluginPath = fs.path.relative(dirPath); + final String relativeAppPath = fs.path.normalize(fs.path.relative(app.directory.path)); + final String relativeAppMain = fs.path.join(relativeAppPath, 'lib', 'main.dart'); + final String relativePluginPath = fs.path.normalize(fs.path.relative(dirPath)); + final String relativePluginMain = fs.path.join(relativePluginPath, 'lib', '$projectName.dart'); if (doctor.canLaunchAnything) { // Let them know a summary of the state of their tooling. await doctor.summary(); printStatus(''' -All done! In order to run your application, type: +In order to run your application, type: \$ cd $relativeAppPath \$ flutter run -Your main program file is lib/main.dart in the $relativeAppPath directory. +Your application code is in $relativeAppMain. '''); if (generatePlugin) { printStatus(''' -Your plugin code is in lib/$projectName.dart in the $relativePluginPath directory. +Your plugin code is in $relativePluginMain. -Host platform code is in the android/ and ios/ directories under $relativePluginPath. +Host platform code is in the "android" and "ios" directories under $relativePluginPath. To edit platform code in an IDE see https://flutter.io/developing-packages/#edit-plugin-package. '''); } @@ -227,18 +331,18 @@ To edit platform code in an IDE see https://flutter.io/developing-packages/#edit 're-validate your setup.'); printStatus("When complete, type 'flutter run' from the '$relativeAppPath' " 'directory in order to launch your app.'); - printStatus('Your main program file is: $relativeAppPath/lib/main.dart'); + printStatus('Your application code is in $relativeAppMain'); } } } - Future _generateModule(Directory directory, Map templateContext) async { + Future _generateApplication(Directory directory, Map templateContext) async { int generatedCount = 0; final String description = argResults.wasParsed('description') ? argResults['description'] - : 'A new flutter module project.'; + : 'A new flutter application project.'; templateContext['description'] = description; - generatedCount += _renderTemplate(fs.path.join('module', 'common'), directory, templateContext); + generatedCount += _renderTemplate(fs.path.join('application', 'common'), directory, templateContext); if (argResults['pub']) { await pubGet( context: PubContext.create, @@ -296,13 +400,13 @@ To edit platform code in an IDE see https://flutter.io/developing-packages/#edit templateContext['pluginProjectName'] = projectName; templateContext['androidPluginIdentifier'] = androidPluginIdentifier; - generatedCount += await _generateApp(project.example.directory, templateContext); + generatedCount += await _generateLegacyApp(project.example.directory, templateContext); return generatedCount; } - Future _generateApp(Directory directory, Map templateContext) async { + Future _generateLegacyApp(Directory directory, Map templateContext) async { int generatedCount = 0; - generatedCount += _renderTemplate('create', directory, templateContext); + generatedCount += _renderTemplate('app', directory, templateContext); final FlutterProject project = await FlutterProject.fromDirectory(directory); generatedCount += _injectGradleWrapper(project); diff --git a/packages/flutter_tools/lib/src/commands/make_host_app_editable.dart b/packages/flutter_tools/lib/src/commands/make_host_app_editable.dart index 9ae153d3ef..efd5aa94c2 100644 --- a/packages/flutter_tools/lib/src/commands/make_host_app_editable.dart +++ b/packages/flutter_tools/lib/src/commands/make_host_app_editable.dart @@ -44,8 +44,8 @@ abstract class MakeHostAppEditableSubCommand extends FlutterCommand { Future validateCommand() async { await super.validateCommand(); _project = await FlutterProject.current(); - if (!_project.isModule) - throw ToolExit("Only projects created using 'flutter create -t module' can have their host apps made editable."); + if (!_project.isApplication) + throw ToolExit("Only projects created using 'flutter create -t application' can have their host apps made editable."); } } diff --git a/packages/flutter_tools/lib/src/flutter_manifest.dart b/packages/flutter_tools/lib/src/flutter_manifest.dart index bfc9c5a188..7e4068e064 100644 --- a/packages/flutter_tools/lib/src/flutter_manifest.dart +++ b/packages/flutter_tools/lib/src/flutter_manifest.dart @@ -110,14 +110,14 @@ class FlutterManifest { return _flutterDescriptor['uses-material-design'] ?? false; } - /// True if this manifest declares a Flutter module project. + /// True if this manifest declares a Flutter application project. /// - /// A Flutter project is considered a module when it has a `module:` - /// descriptor. A Flutter module project supports integration into an + /// A Flutter project is considered an application when it has a `application:` + /// descriptor. A Flutter application project supports integration into an /// existing host app. /// - /// Such a project can be created using `flutter create -t module`. - bool get isModule => _flutterDescriptor.containsKey('module'); + /// Such a project can be created using `flutter create -t application`. + bool get isApplication => _flutterDescriptor.containsKey('application'); /// True if this manifest declares a Flutter plugin project. /// @@ -130,21 +130,21 @@ class FlutterManifest { bool get isPlugin => _flutterDescriptor.containsKey('plugin'); /// Returns the Android package declared by this manifest in its - /// module or plugin descriptor. Returns null, if there is no + /// application or plugin descriptor. Returns null, if there is no /// such declaration. String get androidPackage { - if (isModule) - return _flutterDescriptor['module']['androidPackage']; + if (isApplication) + return _flutterDescriptor['application']['androidPackage']; if (isPlugin) return _flutterDescriptor['plugin']['androidPackage']; return null; } /// Returns the iOS bundle identifier declared by this manifest in its - /// module descriptor. Returns null, if there is no such declaration. + /// application descriptor. Returns null, if there is no such declaration. String get iosBundleIdentifier { - if (isModule) - return _flutterDescriptor['module']['iosBundleIdentifier']; + if (isApplication) + return _flutterDescriptor['application']['iosBundleIdentifier']; return null; } diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart index d77a41de65..ffaa515b0d 100644 --- a/packages/flutter_tools/lib/src/ios/mac.dart +++ b/packages/flutter_tools/lib/src/ios/mac.dart @@ -335,7 +335,7 @@ Future buildXcodeProject({ buildInfo: buildInfo, ); refreshPluginsList(project); - if (hasPlugins(project) || (project.isModule && project.ios.podfile.existsSync())) { + if (hasPlugins(project) || (project.isApplication && project.ios.podfile.existsSync())) { // If the Xcode project, Podfile, or Generated.xcconfig have changed since // last run, pods should be updated. final Fingerprinter fingerprinter = Fingerprinter( diff --git a/packages/flutter_tools/lib/src/ios/xcodeproj.dart b/packages/flutter_tools/lib/src/ios/xcodeproj.dart index 2bb2a20c5e..4b99549fcf 100644 --- a/packages/flutter_tools/lib/src/ios/xcodeproj.dart +++ b/packages/flutter_tools/lib/src/ios/xcodeproj.dart @@ -57,8 +57,8 @@ Future updateGeneratedXcodeProperties({ localsBuffer.writeln('SYMROOT=\${SOURCE_ROOT}/../${getIosBuildDirectory()}'); - if (!project.isModule) { - // For module projects we do not want to write the FLUTTER_FRAMEWORK_DIR + if (!project.isApplication) { + // For application projects we do not want to write the FLUTTER_FRAMEWORK_DIR // explicitly. Rather we rely on the xcode backend script and the Podfile // logic to derive it from FLUTTER_ROOT and FLUTTER_BUILD_MODE. localsBuffer.writeln('FLUTTER_FRAMEWORK_DIR=${flutterFrameworkDir(buildInfo.mode)}'); diff --git a/packages/flutter_tools/lib/src/plugins.dart b/packages/flutter_tools/lib/src/plugins.dart index cd4827b43a..ba274ebd16 100644 --- a/packages/flutter_tools/lib/src/plugins.dart +++ b/packages/flutter_tools/lib/src/plugins.dart @@ -248,7 +248,7 @@ Future _writeIOSPluginRegistrant(FlutterProject project, List plug }; final String registryDirectory = project.ios.pluginRegistrantHost.path; - if (project.isModule) { + if (project.isApplication) { final String registryClassesDirectory = fs.path.join(registryDirectory, 'Classes'); _renderTemplateToFile( _iosPluginRegistrantPodspecTemplate, @@ -297,7 +297,7 @@ Future injectPlugins(FlutterProject project) async { final List plugins = findPlugins(project); await _writeAndroidPluginRegistrant(project, plugins); await _writeIOSPluginRegistrant(project, plugins); - if (!project.isModule && project.ios.hostAppRoot.existsSync()) { + if (!project.isApplication && project.ios.hostAppRoot.existsSync()) { final CocoaPods cocoaPods = CocoaPods(); if (plugins.isNotEmpty) cocoaPods.setupPodfile(project.ios); diff --git a/packages/flutter_tools/lib/src/project.dart b/packages/flutter_tools/lib/src/project.dart index 3f94c80b78..aade35b4fb 100644 --- a/packages/flutter_tools/lib/src/project.dart +++ b/packages/flutter_tools/lib/src/project.dart @@ -110,8 +110,8 @@ class FlutterProject { FlutterManifest.empty(), ); - /// True, if this project is a Flutter module. - bool get isModule => manifest.isModule; + /// True, if this project is a Flutter application. + bool get isApplication => manifest.isApplication; /// True, if this project has an example application. bool get hasExampleApp => _exampleDirectory(directory).existsSync(); @@ -132,7 +132,7 @@ class FlutterProject { } /// Generates project files necessary to make Gradle builds work on Android - /// and CocoaPods+Xcode work on iOS, for app and module projects only. + /// and CocoaPods+Xcode work on iOS, for app and application projects only. Future ensureReadyForPlatformSpecificTooling() async { if (!directory.existsSync() || hasExampleApp) return; @@ -146,7 +146,7 @@ class FlutterProject { /// Represents the iOS sub-project of a Flutter project. /// /// Instances will reflect the contents of the `ios/` sub-folder of -/// Flutter applications and the `.ios/` sub-folder of Flutter modules. +/// Flutter applications and the `.ios/` sub-folder of Flutter applications. class IosProject { IosProject._(this.parent); @@ -162,7 +162,7 @@ class IosProject { /// This parent folder of `Runner.xcodeproj`. Directory get hostAppRoot { - if (!isModule || _editableDirectory.existsSync()) + if (!isApplication || _editableDirectory.existsSync()) return _editableDirectory; return _ephemeralDirectory; } @@ -172,14 +172,14 @@ class IosProject { /// during build. /// /// This is the same as [hostAppRoot] except when the project is - /// a Flutter module with an editable host app. - Directory get _flutterLibRoot => isModule ? _ephemeralDirectory : _editableDirectory; + /// a Flutter application with an editable host app. + Directory get _flutterLibRoot => isApplication ? _ephemeralDirectory : _editableDirectory; /// The bundle name of the host app, `Runner.app`. String get hostAppBundleName => '$_hostAppBundleName.app'; - /// True, if the parent Flutter project is a module. - bool get isModule => parent.isModule; + /// True, if the parent Flutter project is an application. + bool get isApplication => parent.isApplication; /// The xcode config file for [mode]. File xcodeConfigFor(String mode) => _flutterLibRoot.childDirectory('Flutter').childFile('$mode.xcconfig'); @@ -264,32 +264,32 @@ class IosProject { } void _regenerateFromTemplateIfNeeded() { - if (!isModule) + if (!isApplication) return; final bool pubspecChanged = isOlderThanReference(entity: _ephemeralDirectory, referenceFile: parent.pubspecFile); final bool toolingChanged = Cache.instance.isOlderThanToolsStamp(_ephemeralDirectory); if (!pubspecChanged && !toolingChanged) return; _deleteIfExistsSync(_ephemeralDirectory); - _overwriteFromTemplate(fs.path.join('module', 'ios', 'library'), _ephemeralDirectory); + _overwriteFromTemplate(fs.path.join('application', 'ios', 'library'), _ephemeralDirectory); // Add ephemeral host app, if a editable host app does not already exist. if (!_editableDirectory.existsSync()) { - _overwriteFromTemplate(fs.path.join('module', 'ios', 'host_app_ephemeral'), _ephemeralDirectory); + _overwriteFromTemplate(fs.path.join('application', 'ios', 'host_app_ephemeral'), _ephemeralDirectory); if (hasPlugins(parent)) { - _overwriteFromTemplate(fs.path.join('module', 'ios', 'host_app_ephemeral_cocoapods'), _ephemeralDirectory); + _overwriteFromTemplate(fs.path.join('application', 'ios', 'host_app_ephemeral_cocoapods'), _ephemeralDirectory); } } } Future makeHostAppEditable() async { - assert(isModule); + assert(isApplication); if (_editableDirectory.existsSync()) throwToolExit('iOS host app is already editable. To start fresh, delete the ios/ folder.'); _deleteIfExistsSync(_ephemeralDirectory); - _overwriteFromTemplate(fs.path.join('module', 'ios', 'library'), _ephemeralDirectory); - _overwriteFromTemplate(fs.path.join('module', 'ios', 'host_app_ephemeral'), _editableDirectory); - _overwriteFromTemplate(fs.path.join('module', 'ios', 'host_app_ephemeral_cocoapods'), _editableDirectory); - _overwriteFromTemplate(fs.path.join('module', 'ios', 'host_app_editable_cocoapods'), _editableDirectory); + _overwriteFromTemplate(fs.path.join('application', 'ios', 'library'), _ephemeralDirectory); + _overwriteFromTemplate(fs.path.join('application', 'ios', 'host_app_ephemeral'), _editableDirectory); + _overwriteFromTemplate(fs.path.join('application', 'ios', 'host_app_ephemeral_cocoapods'), _editableDirectory); + _overwriteFromTemplate(fs.path.join('application', 'ios', 'host_app_editable_cocoapods'), _editableDirectory); await _updateGeneratedXcodeConfigIfNeeded(); await injectPlugins(parent); } @@ -297,7 +297,7 @@ class IosProject { File get generatedXcodePropertiesFile => _flutterLibRoot.childDirectory('Flutter').childFile('Generated.xcconfig'); Directory get pluginRegistrantHost { - return isModule + return isApplication ? _flutterLibRoot.childDirectory('Flutter').childDirectory('FlutterPluginRegistrant') : hostAppRoot.childDirectory(_hostAppBundleName); } @@ -319,7 +319,7 @@ class IosProject { /// Represents the Android sub-project of a Flutter project. /// /// Instances will reflect the contents of the `android/` sub-folder of -/// Flutter applications and the `.android/` sub-folder of Flutter modules. +/// Flutter applications and the `.android/` sub-folder of Flutter applications. class AndroidProject { AndroidProject._(this.parent); @@ -333,21 +333,21 @@ class AndroidProject { /// containing the `app/` subdirectory and the `settings.gradle` file that /// includes it in the overall Gradle project. Directory get hostAppGradleRoot { - if (!isModule || _editableHostAppDirectory.existsSync()) + if (!isApplication || _editableHostAppDirectory.existsSync()) return _editableHostAppDirectory; return _ephemeralDirectory; } /// The Gradle root directory of the Android wrapping of Flutter and plugins. /// This is the same as [hostAppGradleRoot] except when the project is - /// a Flutter module with an editable host app. - Directory get _flutterLibGradleRoot => isModule ? _ephemeralDirectory : _editableHostAppDirectory; + /// a Flutter application with an editable host app. + Directory get _flutterLibGradleRoot => isApplication ? _ephemeralDirectory : _editableHostAppDirectory; Directory get _ephemeralDirectory => parent.directory.childDirectory('.android'); Directory get _editableHostAppDirectory => parent.directory.childDirectory('android'); - /// True, if the parent Flutter project is a module. - bool get isModule => parent.isModule; + /// True, if the parent Flutter project is an application. + bool get isApplication => parent.isApplication; File get appManifestFile { return isUsingGradle @@ -376,12 +376,12 @@ class AndroidProject { } Future ensureReadyForPlatformSpecificTooling() async { - if (isModule && _shouldRegenerateFromTemplate()) { + if (isApplication && _shouldRegenerateFromTemplate()) { _regenerateLibrary(); // Add ephemeral host app, if an editable host app does not already exist. if (!_editableHostAppDirectory.existsSync()) { - _overwriteFromTemplate(fs.path.join('module', 'android', 'host_app_common'), _ephemeralDirectory); - _overwriteFromTemplate(fs.path.join('module', 'android', 'host_app_ephemeral'), _ephemeralDirectory); + _overwriteFromTemplate(fs.path.join('application', 'android', 'host_app_common'), _ephemeralDirectory); + _overwriteFromTemplate(fs.path.join('application', 'android', 'host_app_ephemeral'), _ephemeralDirectory); } } if (!hostAppGradleRoot.existsSync()) { @@ -396,13 +396,13 @@ class AndroidProject { } Future makeHostAppEditable() async { - assert(isModule); + assert(isApplication); if (_editableHostAppDirectory.existsSync()) throwToolExit('Android host app is already editable. To start fresh, delete the android/ folder.'); _regenerateLibrary(); - _overwriteFromTemplate(fs.path.join('module', 'android', 'host_app_common'), _editableHostAppDirectory); - _overwriteFromTemplate(fs.path.join('module', 'android', 'host_app_editable'), _editableHostAppDirectory); - _overwriteFromTemplate(fs.path.join('module', 'android', 'gradle'), _editableHostAppDirectory); + _overwriteFromTemplate(fs.path.join('application', 'android', 'host_app_common'), _editableHostAppDirectory); + _overwriteFromTemplate(fs.path.join('application', 'android', 'host_app_editable'), _editableHostAppDirectory); + _overwriteFromTemplate(fs.path.join('application', 'android', 'gradle'), _editableHostAppDirectory); gradle.injectGradleWrapper(_editableHostAppDirectory); gradle.writeLocalProperties(_editableHostAppDirectory.childFile('local.properties')); await injectPlugins(parent); @@ -410,12 +410,12 @@ class AndroidProject { File get localPropertiesFile => _flutterLibGradleRoot.childFile('local.properties'); - Directory get pluginRegistrantHost => _flutterLibGradleRoot.childDirectory(isModule ? 'Flutter' : 'app'); + Directory get pluginRegistrantHost => _flutterLibGradleRoot.childDirectory(isApplication ? 'Flutter' : 'app'); void _regenerateLibrary() { _deleteIfExistsSync(_ephemeralDirectory); - _overwriteFromTemplate(fs.path.join('module', 'android', 'library'), _ephemeralDirectory); - _overwriteFromTemplate(fs.path.join('module', 'android', 'gradle'), _ephemeralDirectory); + _overwriteFromTemplate(fs.path.join('application', 'android', 'library'), _ephemeralDirectory); + _overwriteFromTemplate(fs.path.join('application', 'android', 'gradle'), _ephemeralDirectory); gradle.injectGradleWrapper(_ephemeralDirectory); } diff --git a/packages/flutter_tools/schema/pubspec_yaml.json b/packages/flutter_tools/schema/pubspec_yaml.json index 0a4b56e97d..c7fb2f82af 100644 --- a/packages/flutter_tools/schema/pubspec_yaml.json +++ b/packages/flutter_tools/schema/pubspec_yaml.json @@ -43,7 +43,7 @@ } } }, - "module": { + "application": { "type": "object", "additionalProperties": false, "properties": { diff --git a/packages/flutter_tools/templates/create/.gitignore.tmpl b/packages/flutter_tools/templates/app/.gitignore.tmpl similarity index 100% rename from packages/flutter_tools/templates/create/.gitignore.tmpl rename to packages/flutter_tools/templates/app/.gitignore.tmpl diff --git a/packages/flutter_tools/templates/create/.idea/libraries/Dart_SDK.xml.tmpl b/packages/flutter_tools/templates/app/.idea/libraries/Dart_SDK.xml.tmpl similarity index 100% rename from packages/flutter_tools/templates/create/.idea/libraries/Dart_SDK.xml.tmpl rename to packages/flutter_tools/templates/app/.idea/libraries/Dart_SDK.xml.tmpl diff --git a/packages/flutter_tools/templates/create/.idea/libraries/Flutter_for_Android.xml.tmpl b/packages/flutter_tools/templates/app/.idea/libraries/Flutter_for_Android.xml.tmpl similarity index 100% rename from packages/flutter_tools/templates/create/.idea/libraries/Flutter_for_Android.xml.tmpl rename to packages/flutter_tools/templates/app/.idea/libraries/Flutter_for_Android.xml.tmpl diff --git a/packages/flutter_tools/templates/create/.idea/modules.xml.tmpl b/packages/flutter_tools/templates/app/.idea/modules.xml.tmpl similarity index 100% rename from packages/flutter_tools/templates/create/.idea/modules.xml.tmpl rename to packages/flutter_tools/templates/app/.idea/modules.xml.tmpl diff --git a/packages/flutter_tools/templates/create/.idea/runConfigurations/main_dart.xml.tmpl b/packages/flutter_tools/templates/app/.idea/runConfigurations/main_dart.xml.tmpl similarity index 100% rename from packages/flutter_tools/templates/create/.idea/runConfigurations/main_dart.xml.tmpl rename to packages/flutter_tools/templates/app/.idea/runConfigurations/main_dart.xml.tmpl diff --git a/packages/flutter_tools/templates/create/.idea/workspace.xml.tmpl b/packages/flutter_tools/templates/app/.idea/workspace.xml.tmpl similarity index 100% rename from packages/flutter_tools/templates/create/.idea/workspace.xml.tmpl rename to packages/flutter_tools/templates/app/.idea/workspace.xml.tmpl diff --git a/packages/flutter_tools/templates/create/.metadata.tmpl b/packages/flutter_tools/templates/app/.metadata.tmpl similarity index 93% rename from packages/flutter_tools/templates/create/.metadata.tmpl rename to packages/flutter_tools/templates/app/.metadata.tmpl index accfecc211..98005dbbcb 100644 --- a/packages/flutter_tools/templates/create/.metadata.tmpl +++ b/packages/flutter_tools/templates/app/.metadata.tmpl @@ -6,3 +6,5 @@ version: revision: {{flutterRevision}} channel: {{flutterChannel}} + +project_type: app diff --git a/packages/flutter_tools/templates/create/README.md.tmpl b/packages/flutter_tools/templates/app/README.md.tmpl similarity index 100% rename from packages/flutter_tools/templates/create/README.md.tmpl rename to packages/flutter_tools/templates/app/README.md.tmpl diff --git a/packages/flutter_tools/templates/create/android-java.tmpl/app/build.gradle.tmpl b/packages/flutter_tools/templates/app/android-java.tmpl/app/build.gradle.tmpl similarity index 100% rename from packages/flutter_tools/templates/create/android-java.tmpl/app/build.gradle.tmpl rename to packages/flutter_tools/templates/app/android-java.tmpl/app/build.gradle.tmpl diff --git a/packages/flutter_tools/templates/create/android-java.tmpl/app/src/main/java/androidIdentifier/MainActivity.java.tmpl b/packages/flutter_tools/templates/app/android-java.tmpl/app/src/main/java/androidIdentifier/MainActivity.java.tmpl similarity index 100% rename from packages/flutter_tools/templates/create/android-java.tmpl/app/src/main/java/androidIdentifier/MainActivity.java.tmpl rename to packages/flutter_tools/templates/app/android-java.tmpl/app/src/main/java/androidIdentifier/MainActivity.java.tmpl diff --git a/packages/flutter_tools/templates/create/android-java.tmpl/build.gradle b/packages/flutter_tools/templates/app/android-java.tmpl/build.gradle similarity index 100% rename from packages/flutter_tools/templates/create/android-java.tmpl/build.gradle rename to packages/flutter_tools/templates/app/android-java.tmpl/build.gradle diff --git a/packages/flutter_tools/templates/create/android-kotlin.tmpl/app/build.gradle.tmpl b/packages/flutter_tools/templates/app/android-kotlin.tmpl/app/build.gradle.tmpl similarity index 100% rename from packages/flutter_tools/templates/create/android-kotlin.tmpl/app/build.gradle.tmpl rename to packages/flutter_tools/templates/app/android-kotlin.tmpl/app/build.gradle.tmpl diff --git a/packages/flutter_tools/templates/create/android-kotlin.tmpl/app/src/main/kotlin/androidIdentifier/MainActivity.kt.tmpl b/packages/flutter_tools/templates/app/android-kotlin.tmpl/app/src/main/kotlin/androidIdentifier/MainActivity.kt.tmpl similarity index 100% rename from packages/flutter_tools/templates/create/android-kotlin.tmpl/app/src/main/kotlin/androidIdentifier/MainActivity.kt.tmpl rename to packages/flutter_tools/templates/app/android-kotlin.tmpl/app/src/main/kotlin/androidIdentifier/MainActivity.kt.tmpl diff --git a/packages/flutter_tools/templates/create/android-kotlin.tmpl/build.gradle b/packages/flutter_tools/templates/app/android-kotlin.tmpl/build.gradle similarity index 100% rename from packages/flutter_tools/templates/create/android-kotlin.tmpl/build.gradle rename to packages/flutter_tools/templates/app/android-kotlin.tmpl/build.gradle diff --git a/packages/flutter_tools/templates/create/android.tmpl/app/src/main/AndroidManifest.xml.tmpl b/packages/flutter_tools/templates/app/android.tmpl/app/src/main/AndroidManifest.xml.tmpl similarity index 100% rename from packages/flutter_tools/templates/create/android.tmpl/app/src/main/AndroidManifest.xml.tmpl rename to packages/flutter_tools/templates/app/android.tmpl/app/src/main/AndroidManifest.xml.tmpl diff --git a/packages/flutter_tools/templates/create/android.tmpl/app/src/main/res/drawable/launch_background.xml b/packages/flutter_tools/templates/app/android.tmpl/app/src/main/res/drawable/launch_background.xml similarity index 100% rename from packages/flutter_tools/templates/create/android.tmpl/app/src/main/res/drawable/launch_background.xml rename to packages/flutter_tools/templates/app/android.tmpl/app/src/main/res/drawable/launch_background.xml diff --git a/packages/flutter_tools/templates/create/android.tmpl/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/flutter_tools/templates/app/android.tmpl/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from packages/flutter_tools/templates/create/android.tmpl/app/src/main/res/mipmap-hdpi/ic_launcher.png rename to packages/flutter_tools/templates/app/android.tmpl/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/packages/flutter_tools/templates/create/android.tmpl/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/flutter_tools/templates/app/android.tmpl/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from packages/flutter_tools/templates/create/android.tmpl/app/src/main/res/mipmap-mdpi/ic_launcher.png rename to packages/flutter_tools/templates/app/android.tmpl/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/packages/flutter_tools/templates/create/android.tmpl/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/packages/flutter_tools/templates/app/android.tmpl/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from packages/flutter_tools/templates/create/android.tmpl/app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to packages/flutter_tools/templates/app/android.tmpl/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/packages/flutter_tools/templates/create/android.tmpl/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/flutter_tools/templates/app/android.tmpl/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from packages/flutter_tools/templates/create/android.tmpl/app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to packages/flutter_tools/templates/app/android.tmpl/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/packages/flutter_tools/templates/create/android.tmpl/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/flutter_tools/templates/app/android.tmpl/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from packages/flutter_tools/templates/create/android.tmpl/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to packages/flutter_tools/templates/app/android.tmpl/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/packages/flutter_tools/templates/create/android.tmpl/app/src/main/res/values/styles.xml b/packages/flutter_tools/templates/app/android.tmpl/app/src/main/res/values/styles.xml similarity index 100% rename from packages/flutter_tools/templates/create/android.tmpl/app/src/main/res/values/styles.xml rename to packages/flutter_tools/templates/app/android.tmpl/app/src/main/res/values/styles.xml diff --git a/packages/flutter_tools/templates/create/android.tmpl/gradle.properties b/packages/flutter_tools/templates/app/android.tmpl/gradle.properties similarity index 100% rename from packages/flutter_tools/templates/create/android.tmpl/gradle.properties rename to packages/flutter_tools/templates/app/android.tmpl/gradle.properties diff --git a/packages/flutter_tools/templates/create/android.tmpl/gradle/wrapper/gradle-wrapper.properties b/packages/flutter_tools/templates/app/android.tmpl/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from packages/flutter_tools/templates/create/android.tmpl/gradle/wrapper/gradle-wrapper.properties rename to packages/flutter_tools/templates/app/android.tmpl/gradle/wrapper/gradle-wrapper.properties diff --git a/packages/flutter_tools/templates/create/android.tmpl/settings.gradle b/packages/flutter_tools/templates/app/android.tmpl/settings.gradle similarity index 100% rename from packages/flutter_tools/templates/create/android.tmpl/settings.gradle rename to packages/flutter_tools/templates/app/android.tmpl/settings.gradle diff --git a/packages/flutter_tools/templates/create/ios-objc.tmpl/Runner.xcodeproj/project.pbxproj.tmpl b/packages/flutter_tools/templates/app/ios-objc.tmpl/Runner.xcodeproj/project.pbxproj.tmpl similarity index 100% rename from packages/flutter_tools/templates/create/ios-objc.tmpl/Runner.xcodeproj/project.pbxproj.tmpl rename to packages/flutter_tools/templates/app/ios-objc.tmpl/Runner.xcodeproj/project.pbxproj.tmpl diff --git a/packages/flutter_tools/templates/create/ios-objc.tmpl/Runner/AppDelegate.h b/packages/flutter_tools/templates/app/ios-objc.tmpl/Runner/AppDelegate.h similarity index 100% rename from packages/flutter_tools/templates/create/ios-objc.tmpl/Runner/AppDelegate.h rename to packages/flutter_tools/templates/app/ios-objc.tmpl/Runner/AppDelegate.h diff --git a/packages/flutter_tools/templates/create/ios-objc.tmpl/Runner/AppDelegate.m b/packages/flutter_tools/templates/app/ios-objc.tmpl/Runner/AppDelegate.m similarity index 100% rename from packages/flutter_tools/templates/create/ios-objc.tmpl/Runner/AppDelegate.m rename to packages/flutter_tools/templates/app/ios-objc.tmpl/Runner/AppDelegate.m diff --git a/packages/flutter_tools/templates/create/ios-objc.tmpl/Runner/main.m b/packages/flutter_tools/templates/app/ios-objc.tmpl/Runner/main.m similarity index 100% rename from packages/flutter_tools/templates/create/ios-objc.tmpl/Runner/main.m rename to packages/flutter_tools/templates/app/ios-objc.tmpl/Runner/main.m diff --git a/packages/flutter_tools/templates/create/ios-swift.tmpl/Runner.xcodeproj/project.pbxproj.tmpl b/packages/flutter_tools/templates/app/ios-swift.tmpl/Runner.xcodeproj/project.pbxproj.tmpl similarity index 100% rename from packages/flutter_tools/templates/create/ios-swift.tmpl/Runner.xcodeproj/project.pbxproj.tmpl rename to packages/flutter_tools/templates/app/ios-swift.tmpl/Runner.xcodeproj/project.pbxproj.tmpl diff --git a/packages/flutter_tools/templates/create/ios-swift.tmpl/Runner/AppDelegate.swift b/packages/flutter_tools/templates/app/ios-swift.tmpl/Runner/AppDelegate.swift similarity index 100% rename from packages/flutter_tools/templates/create/ios-swift.tmpl/Runner/AppDelegate.swift rename to packages/flutter_tools/templates/app/ios-swift.tmpl/Runner/AppDelegate.swift diff --git a/packages/flutter_tools/templates/create/ios-swift.tmpl/Runner/Runner-Bridging-Header.h b/packages/flutter_tools/templates/app/ios-swift.tmpl/Runner/Runner-Bridging-Header.h similarity index 100% rename from packages/flutter_tools/templates/create/ios-swift.tmpl/Runner/Runner-Bridging-Header.h rename to packages/flutter_tools/templates/app/ios-swift.tmpl/Runner/Runner-Bridging-Header.h diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Flutter/AppFrameworkInfo.plist b/packages/flutter_tools/templates/app/ios.tmpl/Flutter/AppFrameworkInfo.plist similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Flutter/AppFrameworkInfo.plist rename to packages/flutter_tools/templates/app/ios.tmpl/Flutter/AppFrameworkInfo.plist diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Flutter/Debug.xcconfig b/packages/flutter_tools/templates/app/ios.tmpl/Flutter/Debug.xcconfig similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Flutter/Debug.xcconfig rename to packages/flutter_tools/templates/app/ios.tmpl/Flutter/Debug.xcconfig diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Flutter/Release.xcconfig b/packages/flutter_tools/templates/app/ios.tmpl/Flutter/Release.xcconfig similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Flutter/Release.xcconfig rename to packages/flutter_tools/templates/app/ios.tmpl/Flutter/Release.xcconfig diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/flutter_tools/templates/app/ios.tmpl/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to packages/flutter_tools/templates/app/ios.tmpl/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/flutter_tools/templates/app/ios.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to packages/flutter_tools/templates/app/ios.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Runner.xcworkspace/contents.xcworkspacedata b/packages/flutter_tools/templates/app/ios.tmpl/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Runner.xcworkspace/contents.xcworkspacedata rename to packages/flutter_tools/templates/app/ios.tmpl/Runner.xcworkspace/contents.xcworkspacedata diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png rename to packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png rename to packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png rename to packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png rename to packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png rename to packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png rename to packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png rename to packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png rename to packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png rename to packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png rename to packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png rename to packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png rename to packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png rename to packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png rename to packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png rename to packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json rename to packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png rename to packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png rename to packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png rename to packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/README.md similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/README.md rename to packages/flutter_tools/templates/app/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/README.md diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Runner/Base.lproj/LaunchScreen.storyboard b/packages/flutter_tools/templates/app/ios.tmpl/Runner/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Runner/Base.lproj/LaunchScreen.storyboard rename to packages/flutter_tools/templates/app/ios.tmpl/Runner/Base.lproj/LaunchScreen.storyboard diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Runner/Base.lproj/Main.storyboard b/packages/flutter_tools/templates/app/ios.tmpl/Runner/Base.lproj/Main.storyboard similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Runner/Base.lproj/Main.storyboard rename to packages/flutter_tools/templates/app/ios.tmpl/Runner/Base.lproj/Main.storyboard diff --git a/packages/flutter_tools/templates/create/ios.tmpl/Runner/Info.plist.tmpl b/packages/flutter_tools/templates/app/ios.tmpl/Runner/Info.plist.tmpl similarity index 100% rename from packages/flutter_tools/templates/create/ios.tmpl/Runner/Info.plist.tmpl rename to packages/flutter_tools/templates/app/ios.tmpl/Runner/Info.plist.tmpl diff --git a/packages/flutter_tools/templates/create/lib/main.dart.tmpl b/packages/flutter_tools/templates/app/lib/main.dart.tmpl similarity index 100% rename from packages/flutter_tools/templates/create/lib/main.dart.tmpl rename to packages/flutter_tools/templates/app/lib/main.dart.tmpl diff --git a/packages/flutter_tools/templates/create/projectName.iml.tmpl b/packages/flutter_tools/templates/app/projectName.iml.tmpl similarity index 100% rename from packages/flutter_tools/templates/create/projectName.iml.tmpl rename to packages/flutter_tools/templates/app/projectName.iml.tmpl diff --git a/packages/flutter_tools/templates/create/projectName_android.iml.tmpl b/packages/flutter_tools/templates/app/projectName_android.iml.tmpl similarity index 100% rename from packages/flutter_tools/templates/create/projectName_android.iml.tmpl rename to packages/flutter_tools/templates/app/projectName_android.iml.tmpl diff --git a/packages/flutter_tools/templates/create/pubspec.yaml.tmpl b/packages/flutter_tools/templates/app/pubspec.yaml.tmpl similarity index 100% rename from packages/flutter_tools/templates/create/pubspec.yaml.tmpl rename to packages/flutter_tools/templates/app/pubspec.yaml.tmpl diff --git a/packages/flutter_tools/templates/create/test/widget_test.dart.tmpl b/packages/flutter_tools/templates/app/test/widget_test.dart.tmpl similarity index 83% rename from packages/flutter_tools/templates/create/test/widget_test.dart.tmpl rename to packages/flutter_tools/templates/app/test/widget_test.dart.tmpl index 1d7bae88b9..ab3fe35abe 100644 --- a/packages/flutter_tools/templates/create/test/widget_test.dart.tmpl +++ b/packages/flutter_tools/templates/app/test/widget_test.dart.tmpl @@ -1,8 +1,9 @@ // This is a basic Flutter widget test. -// To perform an interaction with a widget in your test, use the WidgetTester utility that Flutter -// provides. For example, you can send tap and scroll gestures. You can also use WidgetTester to -// find child widgets in the widget tree, read text, and verify that the values of widget properties -// are correct. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility that Flutter provides. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; diff --git a/packages/flutter_tools/templates/module/README.md b/packages/flutter_tools/templates/application/README.md similarity index 98% rename from packages/flutter_tools/templates/module/README.md rename to packages/flutter_tools/templates/application/README.md index aed3594072..14ad184097 100644 --- a/packages/flutter_tools/templates/module/README.md +++ b/packages/flutter_tools/templates/application/README.md @@ -2,7 +2,7 @@ ## common -Written to root of Flutter module. +Written to root of Flutter application. Adds Dart project files including `pubspec.yaml`. diff --git a/packages/flutter_tools/templates/module/android/gradle/build.gradle.copy.tmpl b/packages/flutter_tools/templates/application/android/gradle/build.gradle.copy.tmpl similarity index 100% rename from packages/flutter_tools/templates/module/android/gradle/build.gradle.copy.tmpl rename to packages/flutter_tools/templates/application/android/gradle/build.gradle.copy.tmpl diff --git a/packages/flutter_tools/templates/module/android/gradle/gradle.properties.copy.tmpl b/packages/flutter_tools/templates/application/android/gradle/gradle.properties.copy.tmpl similarity index 100% rename from packages/flutter_tools/templates/module/android/gradle/gradle.properties.copy.tmpl rename to packages/flutter_tools/templates/application/android/gradle/gradle.properties.copy.tmpl diff --git a/packages/flutter_tools/templates/module/android/host_app_common/app.tmpl/build.gradle.tmpl b/packages/flutter_tools/templates/application/android/host_app_common/app.tmpl/build.gradle.tmpl similarity index 100% rename from packages/flutter_tools/templates/module/android/host_app_common/app.tmpl/build.gradle.tmpl rename to packages/flutter_tools/templates/application/android/host_app_common/app.tmpl/build.gradle.tmpl diff --git a/packages/flutter_tools/templates/module/android/host_app_common/app.tmpl/src/main/AndroidManifest.xml.tmpl b/packages/flutter_tools/templates/application/android/host_app_common/app.tmpl/src/main/AndroidManifest.xml.tmpl similarity index 100% rename from packages/flutter_tools/templates/module/android/host_app_common/app.tmpl/src/main/AndroidManifest.xml.tmpl rename to packages/flutter_tools/templates/application/android/host_app_common/app.tmpl/src/main/AndroidManifest.xml.tmpl diff --git a/packages/flutter_tools/templates/module/android/host_app_common/app.tmpl/src/main/java/androidIdentifier/host/MainActivity.java.tmpl b/packages/flutter_tools/templates/application/android/host_app_common/app.tmpl/src/main/java/androidIdentifier/host/MainActivity.java.tmpl similarity index 100% rename from packages/flutter_tools/templates/module/android/host_app_common/app.tmpl/src/main/java/androidIdentifier/host/MainActivity.java.tmpl rename to packages/flutter_tools/templates/application/android/host_app_common/app.tmpl/src/main/java/androidIdentifier/host/MainActivity.java.tmpl diff --git a/packages/flutter_tools/templates/module/android/host_app_common/app.tmpl/src/main/res/drawable/launch_background.xml b/packages/flutter_tools/templates/application/android/host_app_common/app.tmpl/src/main/res/drawable/launch_background.xml similarity index 100% rename from packages/flutter_tools/templates/module/android/host_app_common/app.tmpl/src/main/res/drawable/launch_background.xml rename to packages/flutter_tools/templates/application/android/host_app_common/app.tmpl/src/main/res/drawable/launch_background.xml diff --git a/packages/flutter_tools/templates/module/android/host_app_common/app.tmpl/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/flutter_tools/templates/application/android/host_app_common/app.tmpl/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from packages/flutter_tools/templates/module/android/host_app_common/app.tmpl/src/main/res/mipmap-hdpi/ic_launcher.png rename to packages/flutter_tools/templates/application/android/host_app_common/app.tmpl/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/packages/flutter_tools/templates/module/android/host_app_common/app.tmpl/src/main/res/values/styles.xml b/packages/flutter_tools/templates/application/android/host_app_common/app.tmpl/src/main/res/values/styles.xml similarity index 100% rename from packages/flutter_tools/templates/module/android/host_app_common/app.tmpl/src/main/res/values/styles.xml rename to packages/flutter_tools/templates/application/android/host_app_common/app.tmpl/src/main/res/values/styles.xml diff --git a/packages/flutter_tools/templates/module/android/host_app_editable/settings.gradle.copy.tmpl b/packages/flutter_tools/templates/application/android/host_app_editable/settings.gradle.copy.tmpl similarity index 100% rename from packages/flutter_tools/templates/module/android/host_app_editable/settings.gradle.copy.tmpl rename to packages/flutter_tools/templates/application/android/host_app_editable/settings.gradle.copy.tmpl diff --git a/packages/flutter_tools/templates/module/android/host_app_ephemeral/settings.gradle.copy.tmpl b/packages/flutter_tools/templates/application/android/host_app_ephemeral/settings.gradle.copy.tmpl similarity index 100% rename from packages/flutter_tools/templates/module/android/host_app_ephemeral/settings.gradle.copy.tmpl rename to packages/flutter_tools/templates/application/android/host_app_ephemeral/settings.gradle.copy.tmpl diff --git a/packages/flutter_tools/templates/module/android/library/Flutter.tmpl/build.gradle.tmpl b/packages/flutter_tools/templates/application/android/library/Flutter.tmpl/build.gradle.tmpl similarity index 100% rename from packages/flutter_tools/templates/module/android/library/Flutter.tmpl/build.gradle.tmpl rename to packages/flutter_tools/templates/application/android/library/Flutter.tmpl/build.gradle.tmpl diff --git a/packages/flutter_tools/templates/module/android/library/Flutter.tmpl/src/main/AndroidManifest.xml.tmpl b/packages/flutter_tools/templates/application/android/library/Flutter.tmpl/src/main/AndroidManifest.xml.tmpl similarity index 100% rename from packages/flutter_tools/templates/module/android/library/Flutter.tmpl/src/main/AndroidManifest.xml.tmpl rename to packages/flutter_tools/templates/application/android/library/Flutter.tmpl/src/main/AndroidManifest.xml.tmpl diff --git a/packages/flutter_tools/templates/module/android/library/Flutter.tmpl/src/main/java/io/flutter/facade/Flutter.java b/packages/flutter_tools/templates/application/android/library/Flutter.tmpl/src/main/java/io/flutter/facade/Flutter.java similarity index 96% rename from packages/flutter_tools/templates/module/android/library/Flutter.tmpl/src/main/java/io/flutter/facade/Flutter.java rename to packages/flutter_tools/templates/application/android/library/Flutter.tmpl/src/main/java/io/flutter/facade/Flutter.java index c9599c82a1..54d717e526 100644 --- a/packages/flutter_tools/templates/module/android/library/Flutter.tmpl/src/main/java/io/flutter/facade/Flutter.java +++ b/packages/flutter_tools/templates/application/android/library/Flutter.tmpl/src/main/java/io/flutter/facade/Flutter.java @@ -19,9 +19,8 @@ import io.flutter.plugins.GeneratedPluginRegistrant; /** * Main entry point for using Flutter in Android applications. * - *

Warning: This file is auto-generated by Flutter tooling. Do not edit. - * It may be moved into flutter.jar or another library dependency of the Flutter module project - * at a later point.

+ *

Warning: This file is auto-generated by Flutter tooling. + * DO NOT EDIT.

*/ public final class Flutter { private Flutter() { diff --git a/packages/flutter_tools/templates/module/android/library/Flutter.tmpl/src/main/java/io/flutter/facade/FlutterFragment.java b/packages/flutter_tools/templates/application/android/library/Flutter.tmpl/src/main/java/io/flutter/facade/FlutterFragment.java similarity index 88% rename from packages/flutter_tools/templates/module/android/library/Flutter.tmpl/src/main/java/io/flutter/facade/FlutterFragment.java rename to packages/flutter_tools/templates/application/android/library/Flutter.tmpl/src/main/java/io/flutter/facade/FlutterFragment.java index 21de8b6d6b..fdca660eea 100644 --- a/packages/flutter_tools/templates/module/android/library/Flutter.tmpl/src/main/java/io/flutter/facade/FlutterFragment.java +++ b/packages/flutter_tools/templates/application/android/library/Flutter.tmpl/src/main/java/io/flutter/facade/FlutterFragment.java @@ -13,9 +13,8 @@ import io.flutter.view.FlutterView; /** * A {@link Fragment} managing a {@link FlutterView}. * - *

Warning: This file is auto-generated by Flutter tooling. Do not edit. - * It may be moved into flutter.jar or another library dependency of the Flutter module project - * at a later point.

+ *

Warning: This file is auto-generated by Flutter tooling. + * DO NOT EDIT.

*/ public class FlutterFragment extends Fragment { public static final String ARG_ROUTE = "route"; diff --git a/packages/flutter_tools/templates/module/android/library/include_flutter.groovy.copy.tmpl b/packages/flutter_tools/templates/application/android/library/include_flutter.groovy.copy.tmpl similarity index 100% rename from packages/flutter_tools/templates/module/android/library/include_flutter.groovy.copy.tmpl rename to packages/flutter_tools/templates/application/android/library/include_flutter.groovy.copy.tmpl diff --git a/packages/flutter_tools/templates/module/android/library/settings.gradle.copy.tmpl b/packages/flutter_tools/templates/application/android/library/settings.gradle.copy.tmpl similarity index 100% rename from packages/flutter_tools/templates/module/android/library/settings.gradle.copy.tmpl rename to packages/flutter_tools/templates/application/android/library/settings.gradle.copy.tmpl diff --git a/packages/flutter_tools/templates/module/common/.gitignore.tmpl b/packages/flutter_tools/templates/application/common/.gitignore.tmpl similarity index 100% rename from packages/flutter_tools/templates/module/common/.gitignore.tmpl rename to packages/flutter_tools/templates/application/common/.gitignore.tmpl diff --git a/packages/flutter_tools/templates/module/common/.idea/libraries/Dart_SDK.xml.tmpl b/packages/flutter_tools/templates/application/common/.idea/libraries/Dart_SDK.xml.tmpl similarity index 100% rename from packages/flutter_tools/templates/module/common/.idea/libraries/Dart_SDK.xml.tmpl rename to packages/flutter_tools/templates/application/common/.idea/libraries/Dart_SDK.xml.tmpl diff --git a/packages/flutter_tools/templates/module/common/.idea/libraries/Flutter_for_Android.xml.tmpl b/packages/flutter_tools/templates/application/common/.idea/libraries/Flutter_for_Android.xml.tmpl similarity index 100% rename from packages/flutter_tools/templates/module/common/.idea/libraries/Flutter_for_Android.xml.tmpl rename to packages/flutter_tools/templates/application/common/.idea/libraries/Flutter_for_Android.xml.tmpl diff --git a/packages/flutter_tools/templates/module/common/.idea/modules.xml.tmpl b/packages/flutter_tools/templates/application/common/.idea/modules.xml.tmpl similarity index 100% rename from packages/flutter_tools/templates/module/common/.idea/modules.xml.tmpl rename to packages/flutter_tools/templates/application/common/.idea/modules.xml.tmpl diff --git a/packages/flutter_tools/templates/module/common/.idea/workspace.xml.tmpl b/packages/flutter_tools/templates/application/common/.idea/workspace.xml.tmpl similarity index 100% rename from packages/flutter_tools/templates/module/common/.idea/workspace.xml.tmpl rename to packages/flutter_tools/templates/application/common/.idea/workspace.xml.tmpl diff --git a/packages/flutter_tools/templates/application/common/.metadata.tmpl b/packages/flutter_tools/templates/application/common/.metadata.tmpl new file mode 100644 index 0000000000..a124080346 --- /dev/null +++ b/packages/flutter_tools/templates/application/common/.metadata.tmpl @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: {{flutterRevision}} + channel: {{flutterChannel}} + +project_type: application diff --git a/packages/flutter_tools/templates/module/common/README.md.tmpl b/packages/flutter_tools/templates/application/common/README.md.tmpl similarity index 100% rename from packages/flutter_tools/templates/module/common/README.md.tmpl rename to packages/flutter_tools/templates/application/common/README.md.tmpl diff --git a/packages/flutter_tools/templates/module/common/lib/main.dart.tmpl b/packages/flutter_tools/templates/application/common/lib/main.dart.tmpl similarity index 100% rename from packages/flutter_tools/templates/module/common/lib/main.dart.tmpl rename to packages/flutter_tools/templates/application/common/lib/main.dart.tmpl diff --git a/packages/flutter_tools/templates/module/common/projectName.iml.tmpl b/packages/flutter_tools/templates/application/common/projectName.iml.tmpl similarity index 100% rename from packages/flutter_tools/templates/module/common/projectName.iml.tmpl rename to packages/flutter_tools/templates/application/common/projectName.iml.tmpl diff --git a/packages/flutter_tools/templates/module/common/projectName_android.iml.tmpl b/packages/flutter_tools/templates/application/common/projectName_android.iml.tmpl similarity index 100% rename from packages/flutter_tools/templates/module/common/projectName_android.iml.tmpl rename to packages/flutter_tools/templates/application/common/projectName_android.iml.tmpl diff --git a/packages/flutter_tools/templates/module/common/pubspec.yaml.tmpl b/packages/flutter_tools/templates/application/common/pubspec.yaml.tmpl similarity index 78% rename from packages/flutter_tools/templates/module/common/pubspec.yaml.tmpl rename to packages/flutter_tools/templates/application/common/pubspec.yaml.tmpl index f1db0cf6a2..2435585c5a 100644 --- a/packages/flutter_tools/templates/module/common/pubspec.yaml.tmpl +++ b/packages/flutter_tools/templates/application/common/pubspec.yaml.tmpl @@ -12,9 +12,14 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter +{{#withDriverTest}} + flutter_driver: + sdk: flutter +{{/withDriverTest}} + flutter: uses-material-design: true - module: + application: androidPackage: {{androidIdentifier}} iosBundleIdentifier: {{iosIdentifier}} diff --git a/packages/flutter_tools/templates/application/common/test/widget_test.dart.tmpl b/packages/flutter_tools/templates/application/common/test/widget_test.dart.tmpl new file mode 100644 index 0000000000..ab3fe35abe --- /dev/null +++ b/packages/flutter_tools/templates/application/common/test/widget_test.dart.tmpl @@ -0,0 +1,48 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility that Flutter provides. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:{{projectName}}/main.dart'; + +{{^withPluginHook}} +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(new MyApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +} +{{/withPluginHook}} +{{#withPluginHook}} +void main() { + testWidgets('Verify Platform version', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(new MyApp()); + + // Verify that platform version is retrieved. + expect( + find.byWidgetPredicate( + (Widget widget) => + widget is Text && widget.data.startsWith('Running on:'), + ), + findsOneWidget); + }); +} +{{/withPluginHook}} diff --git a/packages/flutter_tools/templates/module/ios/host_app_editable_cocoapods/Config.tmpl/Flutter.xcconfig b/packages/flutter_tools/templates/application/ios/host_app_editable_cocoapods/Config.tmpl/Flutter.xcconfig similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_editable_cocoapods/Config.tmpl/Flutter.xcconfig rename to packages/flutter_tools/templates/application/ios/host_app_editable_cocoapods/Config.tmpl/Flutter.xcconfig diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Config.tmpl/Debug.xcconfig b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Config.tmpl/Debug.xcconfig similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Config.tmpl/Debug.xcconfig rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Config.tmpl/Debug.xcconfig diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Config.tmpl/Flutter.xcconfig b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Config.tmpl/Flutter.xcconfig similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Config.tmpl/Flutter.xcconfig rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Config.tmpl/Flutter.xcconfig diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Config.tmpl/Release.xcconfig b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Config.tmpl/Release.xcconfig similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Config.tmpl/Release.xcconfig rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Config.tmpl/Release.xcconfig diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/AppDelegate.h b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/AppDelegate.h similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/AppDelegate.h rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/AppDelegate.h diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/AppDelegate.m b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/AppDelegate.m similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/AppDelegate.m rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/AppDelegate.m diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Contents.json rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Contents.json 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/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/LaunchImage.imageset/Contents.json b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/LaunchImage.imageset/Contents.json similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/LaunchImage.imageset/Contents.json rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/LaunchImage.imageset/Contents.json diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/LaunchImage.imageset/LaunchImage.png similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/LaunchImage.imageset/LaunchImage.png rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/LaunchImage.imageset/LaunchImage.png diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/LaunchImage.imageset/README.md b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/LaunchImage.imageset/README.md similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/LaunchImage.imageset/README.md rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/LaunchImage.imageset/README.md diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Base.lproj/LaunchScreen.storyboard b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Base.lproj/LaunchScreen.storyboard rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Base.lproj/LaunchScreen.storyboard diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Base.lproj/Main.storyboard b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Base.lproj/Main.storyboard similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Base.lproj/Main.storyboard rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Base.lproj/Main.storyboard diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Info.plist.tmpl b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Info.plist.tmpl similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Info.plist.tmpl rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/Info.plist.tmpl diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/main.m b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/main.m similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/main.m rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.tmpl/main.m diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/project.pbxproj.tmpl b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/project.pbxproj.tmpl similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/project.pbxproj.tmpl rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/project.pbxproj.tmpl diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/project.xcworkspace/contents.xcworkspacedata b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/project.xcworkspace/contents.xcworkspacedata rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/project.xcworkspace/contents.xcworkspacedata diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/xcshareddata/xcschemes/Runner.xcscheme b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/xcshareddata/xcschemes/Runner.xcscheme rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/xcshareddata/xcschemes/Runner.xcscheme diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.xcworkspace.tmpl/contents.xcworkspacedata b/packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.xcworkspace.tmpl/contents.xcworkspacedata similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.xcworkspace.tmpl/contents.xcworkspacedata rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral/Runner.xcworkspace.tmpl/contents.xcworkspacedata diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral_cocoapods/Config.tmpl/Debug.xcconfig b/packages/flutter_tools/templates/application/ios/host_app_ephemeral_cocoapods/Config.tmpl/Debug.xcconfig similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral_cocoapods/Config.tmpl/Debug.xcconfig rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral_cocoapods/Config.tmpl/Debug.xcconfig diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral_cocoapods/Config.tmpl/Release.xcconfig b/packages/flutter_tools/templates/application/ios/host_app_ephemeral_cocoapods/Config.tmpl/Release.xcconfig similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral_cocoapods/Config.tmpl/Release.xcconfig rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral_cocoapods/Config.tmpl/Release.xcconfig diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral_cocoapods/Podfile.copy.tmpl b/packages/flutter_tools/templates/application/ios/host_app_ephemeral_cocoapods/Podfile.copy.tmpl similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral_cocoapods/Podfile.copy.tmpl rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral_cocoapods/Podfile.copy.tmpl diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral_cocoapods/Runner.tmpl/AppDelegate.m b/packages/flutter_tools/templates/application/ios/host_app_ephemeral_cocoapods/Runner.tmpl/AppDelegate.m similarity index 100% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral_cocoapods/Runner.tmpl/AppDelegate.m rename to packages/flutter_tools/templates/application/ios/host_app_ephemeral_cocoapods/Runner.tmpl/AppDelegate.m diff --git a/packages/flutter_tools/templates/module/ios/library/Flutter.tmpl/AppFrameworkInfo.plist b/packages/flutter_tools/templates/application/ios/library/Flutter.tmpl/AppFrameworkInfo.plist similarity index 100% rename from packages/flutter_tools/templates/module/ios/library/Flutter.tmpl/AppFrameworkInfo.plist rename to packages/flutter_tools/templates/application/ios/library/Flutter.tmpl/AppFrameworkInfo.plist diff --git a/packages/flutter_tools/templates/module/ios/library/Flutter.tmpl/README.md b/packages/flutter_tools/templates/application/ios/library/Flutter.tmpl/README.md similarity index 100% rename from packages/flutter_tools/templates/module/ios/library/Flutter.tmpl/README.md rename to packages/flutter_tools/templates/application/ios/library/Flutter.tmpl/README.md diff --git a/packages/flutter_tools/templates/module/ios/library/Flutter.tmpl/podhelper.rb b/packages/flutter_tools/templates/application/ios/library/Flutter.tmpl/podhelper.rb similarity index 100% rename from packages/flutter_tools/templates/module/ios/library/Flutter.tmpl/podhelper.rb rename to packages/flutter_tools/templates/application/ios/library/Flutter.tmpl/podhelper.rb diff --git a/packages/flutter_tools/templates/package/.metadata.tmpl b/packages/flutter_tools/templates/package/.metadata.tmpl new file mode 100644 index 0000000000..48ef167c28 --- /dev/null +++ b/packages/flutter_tools/templates/package/.metadata.tmpl @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: {{flutterRevision}} + channel: {{flutterChannel}} + +project_type: package diff --git a/packages/flutter_tools/templates/module/common/.metadata.tmpl b/packages/flutter_tools/templates/plugin/.metadata.tmpl similarity index 92% rename from packages/flutter_tools/templates/module/common/.metadata.tmpl rename to packages/flutter_tools/templates/plugin/.metadata.tmpl index accfecc211..91ede56d66 100644 --- a/packages/flutter_tools/templates/module/common/.metadata.tmpl +++ b/packages/flutter_tools/templates/plugin/.metadata.tmpl @@ -6,3 +6,5 @@ version: revision: {{flutterRevision}} channel: {{flutterChannel}} + +project_type: plugin diff --git a/packages/flutter_tools/test/commands/analyze_once_test.dart b/packages/flutter_tools/test/commands/analyze_once_test.dart index 638c60e6fa..afae38eced 100644 --- a/packages/flutter_tools/test/commands/analyze_once_test.dart +++ b/packages/flutter_tools/test/commands/analyze_once_test.dart @@ -44,7 +44,7 @@ void main() { arguments: ['create', projectPath], statusTextContains: [ 'All done!', - 'Your main program file is lib/main.dart', + 'Your application code is in ${fs.path.normalize(fs.path.join(fs.path.relative(projectPath), 'lib', 'main.dart'))}', ], ); expect(libMain.existsSync(), isTrue); diff --git a/packages/flutter_tools/test/commands/create_test.dart b/packages/flutter_tools/test/commands/create_test.dart index ab848f0220..10c65eb4a6 100644 --- a/packages/flutter_tools/test/commands/create_test.dart +++ b/packages/flutter_tools/test/commands/create_test.dart @@ -23,411 +23,574 @@ const String frameworkRevision = '12345678'; const String frameworkChannel = 'omega'; void main() { - group('create', () { - Directory tempDir; - Directory projectDir; - FlutterVersion mockFlutterVersion; - LoggingProcessManager loggingProcessManager; + Directory tempDir; + Directory projectDir; + FlutterVersion mockFlutterVersion; + LoggingProcessManager loggingProcessManager; - setUpAll(() { - Cache.disableLocking(); - }); + setUpAll(() { + Cache.disableLocking(); + }); - setUp(() { - loggingProcessManager = LoggingProcessManager(); - tempDir = fs.systemTempDirectory.createTempSync('flutter_tools_create_test.'); - projectDir = tempDir.childDirectory('flutter_project'); - mockFlutterVersion = MockFlutterVersion(); - }); + setUp(() { + loggingProcessManager = LoggingProcessManager(); + tempDir = fs.systemTempDirectory.createTempSync('flutter_tools_create_test.'); + projectDir = tempDir.childDirectory('flutter_project'); + mockFlutterVersion = MockFlutterVersion(); + }); - tearDown(() { - tryToDelete(tempDir); - }); + tearDown(() { + tryToDelete(tempDir); + }); - // Verify that we create a project that is well-formed. - testUsingContext('project', () async { - await _createAndAnalyzeProject( - projectDir, - [], - [ - 'android/app/src/main/java/com/example/flutterproject/MainActivity.java', - 'ios/Runner/AppDelegate.h', - 'ios/Runner/AppDelegate.m', - 'ios/Runner/main.m', - 'lib/main.dart', - 'test/widget_test.dart', - 'flutter_project.iml', - ], - ); - return _runFlutterTest(projectDir); - }, timeout: allowForRemotePubInvocation); + // Verify that we create a default project ('application') that is + // well-formed. + testUsingContext('can create a default project', () async { + await _createAndAnalyzeProject(projectDir, [], [ + '.android/app/', + '.gitignore', + '.ios/Flutter', + '.metadata', + 'lib/main.dart', + 'pubspec.yaml', + 'README.md', + 'test/widget_test.dart', + ], unexpectedPaths: [ + 'android/', + 'ios/', + ]); + return _runFlutterTest(projectDir); + }, timeout: allowForRemotePubInvocation); - testUsingContext('kotlin/swift project', () async { - return _createProject( - projectDir, - ['--no-pub', '--android-language', 'kotlin', '-i', 'swift'], - [ - 'android/app/src/main/kotlin/com/example/flutterproject/MainActivity.kt', - 'ios/Runner/AppDelegate.swift', - 'ios/Runner/Runner-Bridging-Header.h', - 'lib/main.dart', - ], - unexpectedPaths: [ - 'android/app/src/main/java/com/example/flutterproject/MainActivity.java', - 'ios/Runner/AppDelegate.h', - 'ios/Runner/AppDelegate.m', - 'ios/Runner/main.m', - ], - ); - }, timeout: allowForCreateFlutterProject); + testUsingContext('can create a legacy module project', () async { + await _createAndAnalyzeProject(projectDir, [ + '--template=module', + ], [ + '.android/app/', + '.gitignore', + '.ios/Flutter', + '.metadata', + 'lib/main.dart', + 'pubspec.yaml', + 'README.md', + 'test/widget_test.dart', + ], unexpectedPaths: [ + 'android/', + 'ios/', + ]); + return _runFlutterTest(projectDir); + }, timeout: allowForRemotePubInvocation); - testUsingContext('package project', () async { - await _createAndAnalyzeProject( - projectDir, - ['--template=package'], - [ - 'lib/flutter_project.dart', - 'test/flutter_project_test.dart', - ], - unexpectedPaths: [ - 'android/app/src/main/java/com/example/flutterproject/MainActivity.java', - 'android/src/main/java/com/example/flutterproject/FlutterProjectPlugin.java', - 'ios/Classes/FlutterProjectPlugin.h', - 'ios/Classes/FlutterProjectPlugin.m', - 'ios/Runner/AppDelegate.h', - 'ios/Runner/AppDelegate.m', - 'ios/Runner/main.m', - 'lib/main.dart', - 'example/android/app/src/main/java/com/example/flutterprojectexample/MainActivity.java', - 'example/ios/Runner/AppDelegate.h', - 'example/ios/Runner/AppDelegate.m', - 'example/ios/Runner/main.m', - 'example/lib/main.dart', - 'test/widget_test.dart', - ], - ); - return _runFlutterTest(projectDir); - }, timeout: allowForRemotePubInvocation); + testUsingContext('kotlin/swift legacy app project', () async { + return _createProject( + projectDir, + ['--no-pub', '--template=app', '--android-language=kotlin', '--ios-language=swift'], + [ + 'android/app/src/main/kotlin/com/example/flutterproject/MainActivity.kt', + 'ios/Runner/AppDelegate.swift', + 'ios/Runner/Runner-Bridging-Header.h', + 'lib/main.dart', + ], + unexpectedPaths: [ + 'android/app/src/main/java/com/example/flutterproject/MainActivity.java', + 'ios/Runner/AppDelegate.h', + 'ios/Runner/AppDelegate.m', + 'ios/Runner/main.m', + ], + ); + }, timeout: allowForCreateFlutterProject); - testUsingContext('plugin project', () async { - await _createAndAnalyzeProject( - projectDir, - ['--template=plugin'], - [ - 'android/src/main/java/com/example/flutterproject/FlutterProjectPlugin.java', - 'ios/Classes/FlutterProjectPlugin.h', - 'ios/Classes/FlutterProjectPlugin.m', - 'lib/flutter_project.dart', - 'example/android/app/src/main/java/com/example/flutterprojectexample/MainActivity.java', - 'example/ios/Runner/AppDelegate.h', - 'example/ios/Runner/AppDelegate.m', - 'example/ios/Runner/main.m', - 'example/lib/main.dart', - 'flutter_project.iml', - ], - plugin: true, - ); - return _runFlutterTest(projectDir.childDirectory('example')); - }, timeout: allowForRemotePubInvocation); + testUsingContext('package project', () async { + await _createAndAnalyzeProject( + projectDir, + ['--template=package'], + [ + 'lib/flutter_project.dart', + 'test/flutter_project_test.dart', + ], + unexpectedPaths: [ + 'android/app/src/main/java/com/example/flutterproject/MainActivity.java', + 'android/src/main/java/com/example/flutterproject/FlutterProjectPlugin.java', + 'example/android/app/src/main/java/com/example/flutterprojectexample/MainActivity.java', + 'example/ios/Runner/AppDelegate.h', + 'example/ios/Runner/AppDelegate.m', + 'example/ios/Runner/main.m', + 'example/lib/main.dart', + 'ios/Classes/FlutterProjectPlugin.h', + 'ios/Classes/FlutterProjectPlugin.m', + 'ios/Runner/AppDelegate.h', + 'ios/Runner/AppDelegate.m', + 'ios/Runner/main.m', + 'lib/main.dart', + 'test/widget_test.dart', + ], + ); + return _runFlutterTest(projectDir); + }, timeout: allowForRemotePubInvocation); - testUsingContext('kotlin/swift plugin project', () async { - return _createProject( - projectDir, - ['--no-pub', '--template=plugin', '-a', 'kotlin', '--ios-language', 'swift'], - [ - 'android/src/main/kotlin/com/example/flutterproject/FlutterProjectPlugin.kt', - 'ios/Classes/FlutterProjectPlugin.h', - 'ios/Classes/FlutterProjectPlugin.m', - 'ios/Classes/SwiftFlutterProjectPlugin.swift', - 'lib/flutter_project.dart', - 'example/android/app/src/main/kotlin/com/example/flutterprojectexample/MainActivity.kt', - 'example/ios/Runner/AppDelegate.swift', - 'example/ios/Runner/Runner-Bridging-Header.h', - 'example/lib/main.dart', - ], - unexpectedPaths: [ - 'android/src/main/java/com/example/flutterproject/FlutterProjectPlugin.java', - 'example/android/app/src/main/java/com/example/flutterprojectexample/MainActivity.java', - 'example/ios/Runner/AppDelegate.h', - 'example/ios/Runner/AppDelegate.m', - 'example/ios/Runner/main.m', - ], - plugin: true, - ); - }, timeout: allowForCreateFlutterProject); + testUsingContext('plugin project', () async { + await _createAndAnalyzeProject( + projectDir, + ['--template=plugin'], + [ + 'android/src/main/java/com/example/flutterproject/FlutterProjectPlugin.java', + 'example/android/app/src/main/java/com/example/flutterprojectexample/MainActivity.java', + 'example/ios/Runner/AppDelegate.h', + 'example/ios/Runner/AppDelegate.m', + 'example/ios/Runner/main.m', + 'example/lib/main.dart', + 'flutter_project.iml', + 'ios/Classes/FlutterProjectPlugin.h', + 'ios/Classes/FlutterProjectPlugin.m', + 'lib/flutter_project.dart', + ], + ); + return _runFlutterTest(projectDir.childDirectory('example')); + }, timeout: allowForRemotePubInvocation); - testUsingContext('plugin project with custom org', () async { - return _createProject( - projectDir, - ['--no-pub', '--template=plugin', '--org', 'com.bar.foo'], - [ - 'android/src/main/java/com/bar/foo/flutterproject/FlutterProjectPlugin.java', - 'example/android/app/src/main/java/com/bar/foo/flutterprojectexample/MainActivity.java', - ], - unexpectedPaths: [ - 'android/src/main/java/com/example/flutterproject/FlutterProjectPlugin.java', - 'example/android/app/src/main/java/com/example/flutterprojectexample/MainActivity.java', - ], - plugin: true, - ); - }, timeout: allowForCreateFlutterProject); + testUsingContext('kotlin/swift plugin project', () async { + return _createProject( + projectDir, + ['--no-pub', '--template=plugin', '-a', 'kotlin', '--ios-language', 'swift'], + [ + 'android/src/main/kotlin/com/example/flutterproject/FlutterProjectPlugin.kt', + 'example/android/app/src/main/kotlin/com/example/flutterprojectexample/MainActivity.kt', + 'example/ios/Runner/AppDelegate.swift', + 'example/ios/Runner/Runner-Bridging-Header.h', + 'example/lib/main.dart', + 'ios/Classes/FlutterProjectPlugin.h', + 'ios/Classes/FlutterProjectPlugin.m', + 'ios/Classes/SwiftFlutterProjectPlugin.swift', + 'lib/flutter_project.dart', + ], + unexpectedPaths: [ + 'android/src/main/java/com/example/flutterproject/FlutterProjectPlugin.java', + 'example/android/app/src/main/java/com/example/flutterprojectexample/MainActivity.java', + 'example/ios/Runner/AppDelegate.h', + 'example/ios/Runner/AppDelegate.m', + 'example/ios/Runner/main.m', + ], + ); + }, timeout: allowForCreateFlutterProject); - testUsingContext('project with-driver-test', () async { - return _createAndAnalyzeProject( - projectDir, - ['--with-driver-test'], - ['lib/main.dart'], - ); - }, timeout: allowForRemotePubInvocation); + testUsingContext('plugin project with custom org', () async { + return _createProject( + projectDir, + ['--no-pub', '--template=plugin', '--org', 'com.bar.foo'], + [ + 'android/src/main/java/com/bar/foo/flutterproject/FlutterProjectPlugin.java', + 'example/android/app/src/main/java/com/bar/foo/flutterprojectexample/MainActivity.java', + ], + unexpectedPaths: [ + 'android/src/main/java/com/example/flutterproject/FlutterProjectPlugin.java', + 'example/android/app/src/main/java/com/example/flutterprojectexample/MainActivity.java', + ], + ); + }, timeout: allowForCreateFlutterProject); - testUsingContext('module', () async { - return _createProject( - projectDir, - ['--no-pub', '--template=module'], - [ - '.gitignore', - '.metadata', - 'lib/main.dart', - 'pubspec.yaml', - 'README.md', - ], - unexpectedPaths: [ - '.android/', - 'android/', - 'ios/', - ] - ); - }, timeout: allowForCreateFlutterProject); + testUsingContext('legacy app project with-driver-test', () async { + return _createAndAnalyzeProject( + projectDir, + ['--with-driver-test', '--template=app'], + ['lib/main.dart'], + ); + }, timeout: allowForRemotePubInvocation); - testUsingContext('module with pub', () async { - return _createProject( - projectDir, - ['-t', 'module'], - [ - '.gitignore', - '.metadata', - 'lib/main.dart', - 'pubspec.lock', - 'pubspec.yaml', - 'README.md', - '.packages', - '.android/build.gradle', - '.android/Flutter/build.gradle', - '.android/Flutter/src/main/java/io/flutter/facade/Flutter.java', - '.android/Flutter/src/main/java/io/flutter/facade/FlutterFragment.java', - '.android/Flutter/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java', - '.android/Flutter/src/main/AndroidManifest.xml', - '.android/gradle.properties', - '.android/gradle/wrapper/gradle-wrapper.jar', - '.android/gradle/wrapper/gradle-wrapper.properties', - '.android/gradlew', - '.android/gradlew.bat', - '.android/local.properties', - '.android/include_flutter.groovy', - '.android/settings.gradle', - ], - unexpectedPaths: [ - 'android/', - 'ios/', - ] - ); - }, timeout: allowForRemotePubInvocation); + testUsingContext('application project with pub', () async { + return _createProject(projectDir, [ + '--template=application' + ], [ + '.android/build.gradle', + '.android/Flutter/build.gradle', + '.android/Flutter/src/main/AndroidManifest.xml', + '.android/Flutter/src/main/java/io/flutter/facade/Flutter.java', + '.android/Flutter/src/main/java/io/flutter/facade/FlutterFragment.java', + '.android/Flutter/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java', + '.android/gradle.properties', + '.android/gradle/wrapper/gradle-wrapper.jar', + '.android/gradle/wrapper/gradle-wrapper.properties', + '.android/gradlew', + '.android/gradlew.bat', + '.android/include_flutter.groovy', + '.android/local.properties', + '.android/settings.gradle', + '.gitignore', + '.metadata', + '.packages', + 'lib/main.dart', + 'pubspec.lock', + 'pubspec.yaml', + 'README.md', + 'test/widget_test.dart', + ], unexpectedPaths: [ + 'android/', + 'ios/', + ]); + }, timeout: allowForRemotePubInvocation); - // Verify content and formatting - testUsingContext('content', () async { - Cache.flutterRoot = '../..'; - when(mockFlutterVersion.frameworkRevision).thenReturn(frameworkRevision); - when(mockFlutterVersion.channel).thenReturn(frameworkChannel); + testUsingContext('has correct content and formatting with applicaiton template', () async { + Cache.flutterRoot = '../..'; + when(mockFlutterVersion.frameworkRevision).thenReturn(frameworkRevision); + when(mockFlutterVersion.channel).thenReturn(frameworkChannel); - final CreateCommand command = CreateCommand(); - final CommandRunner runner = createTestCommandRunner(command); + final CreateCommand command = CreateCommand(); + final CommandRunner runner = createTestCommandRunner(command); - await runner.run(['create', '--no-pub', '--org', 'com.foo.bar', projectDir.path]); + await runner.run(['create', '--template=application', '--no-pub', '--org', 'com.foo.bar', projectDir.path]); - void expectExists(String relPath) { - expect(fs.isFileSync('${projectDir.path}/$relPath'), true); + void expectExists(String relPath) { + expect(fs.isFileSync('${projectDir.path}/$relPath'), true); + } + + expectExists('lib/main.dart'); + expectExists('test/widget_test.dart'); + + for (FileSystemEntity file in projectDir.listSync(recursive: true)) { + if (file is File && file.path.endsWith('.dart')) { + final String original = file.readAsStringSync(); + + final Process process = await Process.start( + sdkBinaryName('dartfmt'), + [file.path], + workingDirectory: projectDir.path, + ); + final String formatted = await process.stdout.transform(utf8.decoder).join(); + + expect(original, formatted, reason: file.path); } + } - expectExists('lib/main.dart'); + await _runFlutterTest(projectDir, target: fs.path.join(projectDir.path, 'test', 'widget_test.dart')); - for (FileSystemEntity file in projectDir.listSync(recursive: true)) { - if (file is File && file.path.endsWith('.dart')) { - final String original = file.readAsStringSync(); + // Generated Xcode settings + final String xcodeConfigPath = fs.path.join('.ios', 'Flutter', 'Generated.xcconfig'); + expectExists(xcodeConfigPath); + final File xcodeConfigFile = fs.file(fs.path.join(projectDir.path, xcodeConfigPath)); + final String xcodeConfig = xcodeConfigFile.readAsStringSync(); + expect(xcodeConfig, contains('FLUTTER_ROOT=')); + expect(xcodeConfig, contains('FLUTTER_APPLICATION_PATH=')); + expect(xcodeConfig, contains('FLUTTER_TARGET=')); + // App identification + final String xcodeProjectPath = fs.path.join('.ios', 'Runner.xcodeproj', 'project.pbxproj'); + expectExists(xcodeProjectPath); + final File xcodeProjectFile = fs.file(fs.path.join(projectDir.path, xcodeProjectPath)); + final String xcodeProject = xcodeProjectFile.readAsStringSync(); + expect(xcodeProject, contains('PRODUCT_BUNDLE_IDENTIFIER = com.foo.bar.flutterProject')); - final Process process = await Process.start( - sdkBinaryName('dartfmt'), - [file.path], - workingDirectory: projectDir.path, - ); - final String formatted = await process.stdout.transform(utf8.decoder).join(); + final String versionPath = fs.path.join('.metadata'); + expectExists(versionPath); + final String version = fs.file(fs.path.join(projectDir.path, versionPath)).readAsStringSync(); + expect(version, contains('version:')); + expect(version, contains('revision: 12345678')); + expect(version, contains('channel: omega')); - expect(original, formatted, reason: file.path); - } + // IntelliJ metadata + final String intelliJSdkMetadataPath = fs.path.join('.idea', 'libraries', 'Dart_SDK.xml'); + expectExists(intelliJSdkMetadataPath); + final String sdkMetaContents = fs + .file(fs.path.join( + projectDir.path, + intelliJSdkMetadataPath, + )) + .readAsStringSync(); + expect(sdkMetaContents, contains('{ + FlutterVersion: () => mockFlutterVersion, + }, timeout: allowForCreateFlutterProject); + + testUsingContext('has correct content and formatting with legacy app template', () async { + Cache.flutterRoot = '../..'; + when(mockFlutterVersion.frameworkRevision).thenReturn(frameworkRevision); + when(mockFlutterVersion.channel).thenReturn(frameworkChannel); + + final CreateCommand command = CreateCommand(); + final CommandRunner runner = createTestCommandRunner(command); + + await runner.run(['create', '--template=app', '--no-pub', '--org', 'com.foo.bar', projectDir.path]); + + void expectExists(String relPath) { + expect(fs.isFileSync('${projectDir.path}/$relPath'), true); + } + + expectExists('lib/main.dart'); + expectExists('test/widget_test.dart'); + + for (FileSystemEntity file in projectDir.listSync(recursive: true)) { + if (file is File && file.path.endsWith('.dart')) { + final String original = file.readAsStringSync(); + + final Process process = await Process.start( + sdkBinaryName('dartfmt'), + [file.path], + workingDirectory: projectDir.path, + ); + final String formatted = await process.stdout.transform(utf8.decoder).join(); + + expect(original, formatted, reason: file.path); } + } - await _runFlutterTest(projectDir, target: fs.path.join(projectDir.path, 'test', 'widget_test.dart')); + await _runFlutterTest(projectDir, target: fs.path.join(projectDir.path, 'test', 'widget_test.dart')); - // Generated Xcode settings - final String xcodeConfigPath = fs.path.join('ios', 'Flutter', 'Generated.xcconfig'); - expectExists(xcodeConfigPath); - final File xcodeConfigFile = fs.file(fs.path.join(projectDir.path, xcodeConfigPath)); - final String xcodeConfig = xcodeConfigFile.readAsStringSync(); - expect(xcodeConfig, contains('FLUTTER_ROOT=')); - expect(xcodeConfig, contains('FLUTTER_APPLICATION_PATH=')); - expect(xcodeConfig, contains('FLUTTER_FRAMEWORK_DIR=')); - // App identification - final String xcodeProjectPath = fs.path.join('ios', 'Runner.xcodeproj', 'project.pbxproj'); - expectExists(xcodeProjectPath); - final File xcodeProjectFile = fs.file(fs.path.join(projectDir.path, xcodeProjectPath)); - final String xcodeProject = xcodeProjectFile.readAsStringSync(); - expect(xcodeProject, contains('PRODUCT_BUNDLE_IDENTIFIER = com.foo.bar.flutterProject')); + // Generated Xcode settings + final String xcodeConfigPath = fs.path.join('ios', 'Flutter', 'Generated.xcconfig'); + expectExists(xcodeConfigPath); + final File xcodeConfigFile = fs.file(fs.path.join(projectDir.path, xcodeConfigPath)); + final String xcodeConfig = xcodeConfigFile.readAsStringSync(); + expect(xcodeConfig, contains('FLUTTER_ROOT=')); + expect(xcodeConfig, contains('FLUTTER_APPLICATION_PATH=')); + expect(xcodeConfig, contains('FLUTTER_FRAMEWORK_DIR=')); + // App identification + final String xcodeProjectPath = fs.path.join('ios', 'Runner.xcodeproj', 'project.pbxproj'); + expectExists(xcodeProjectPath); + final File xcodeProjectFile = fs.file(fs.path.join(projectDir.path, xcodeProjectPath)); + final String xcodeProject = xcodeProjectFile.readAsStringSync(); + expect(xcodeProject, contains('PRODUCT_BUNDLE_IDENTIFIER = com.foo.bar.flutterProject')); - final String versionPath = fs.path.join('.metadata'); - expectExists(versionPath); - final String version = fs.file(fs.path.join(projectDir.path, versionPath)).readAsStringSync(); - expect(version, contains('version:')); - expect(version, contains('revision: 12345678')); - expect(version, contains('channel: omega')); + final String versionPath = fs.path.join('.metadata'); + expectExists(versionPath); + final String version = fs.file(fs.path.join(projectDir.path, versionPath)).readAsStringSync(); + expect(version, contains('version:')); + expect(version, contains('revision: 12345678')); + expect(version, contains('channel: omega')); - // IntelliJ metadata - final String intelliJSdkMetadataPath = fs.path.join('.idea', 'libraries', 'Dart_SDK.xml'); - expectExists(intelliJSdkMetadataPath); - final String sdkMetaContents = fs.file(fs.path.join(projectDir.path, intelliJSdkMetadataPath)).readAsStringSync(); - expect(sdkMetaContents, contains('{ - FlutterVersion: () => mockFlutterVersion, - }, timeout: allowForCreateFlutterProject); + // IntelliJ metadata + final String intelliJSdkMetadataPath = fs.path.join('.idea', 'libraries', 'Dart_SDK.xml'); + expectExists(intelliJSdkMetadataPath); + final String sdkMetaContents = fs + .file(fs.path.join( + projectDir.path, + intelliJSdkMetadataPath, + )) + .readAsStringSync(); + expect(sdkMetaContents, contains('{ + FlutterVersion: () => mockFlutterVersion, + }, timeout: allowForCreateFlutterProject); - // Verify that we can regenerate over an existing project. - testUsingContext('can re-gen over existing project', () async { - Cache.flutterRoot = '../..'; + testUsingContext('can re-gen default template over existing project', () async { + Cache.flutterRoot = '../..'; - final CreateCommand command = CreateCommand(); - final CommandRunner runner = createTestCommandRunner(command); + final CreateCommand command = CreateCommand(); + final CommandRunner runner = createTestCommandRunner(command); - await runner.run(['create', '--no-pub', projectDir.path]); + await runner.run(['create', '--no-pub', projectDir.path]); - await runner.run(['create', '--no-pub', projectDir.path]); - }, timeout: allowForCreateFlutterProject); + await runner.run(['create', '--no-pub', projectDir.path]); + }, timeout: allowForCreateFlutterProject); - testUsingContext('can re-gen android/ folder, reusing custom org', () async { - await _createProject( - projectDir, - ['--no-pub', '--org', 'com.bar.foo'], - [], - ); - projectDir.childDirectory('android').deleteSync(recursive: true); - return _createProject( - projectDir, - ['--no-pub'], - [ - 'android/app/src/main/java/com/bar/foo/flutterproject/MainActivity.java', - ], - unexpectedPaths: [ - 'android/app/src/main/java/com/example/flutterproject/MainActivity.java', - ], - ); - }, timeout: allowForCreateFlutterProject); + testUsingContext('can re-gen default template over existing legacy app project with no metadta and detect the type', () async { + Cache.flutterRoot = '../..'; - testUsingContext('can re-gen ios/ folder, reusing custom org', () async { - await _createProject( - projectDir, - ['--no-pub', '--org', 'com.bar.foo'], - [], - ); - projectDir.childDirectory('ios').deleteSync(recursive: true); - await _createProject(projectDir, ['--no-pub'], []); - final FlutterProject project = await FlutterProject.fromDirectory(projectDir); - expect( - project.ios.productBundleIdentifier, - 'com.bar.foo.flutterProject', - ); - }, timeout: allowForCreateFlutterProject); + final CreateCommand command = CreateCommand(); + final CommandRunner runner = createTestCommandRunner(command); - testUsingContext('can re-gen plugin ios/ and example/ folders, reusing custom org', () async { - await _createProject( - projectDir, - ['--no-pub', '-t', 'plugin', '--org', 'com.bar.foo'], - [], - ); - projectDir.childDirectory('example').deleteSync(recursive: true); - projectDir.childDirectory('ios').deleteSync(recursive: true); - await _createProject( - projectDir, - ['--no-pub', '-t', 'plugin'], - [ - 'example/android/app/src/main/java/com/bar/foo/flutterprojectexample/MainActivity.java', - 'ios/Classes/FlutterProjectPlugin.h', - ], - unexpectedPaths: [ - 'example/android/app/src/main/java/com/example/flutterprojectexample/MainActivity.java', - 'android/src/main/java/com/example/flutterproject/FlutterProjectPlugin.java', - ], - ); - final FlutterProject project = await FlutterProject.fromDirectory(projectDir); - expect( - project.example.ios.productBundleIdentifier, - 'com.bar.foo.flutterProjectExample', - ); - }, timeout: allowForCreateFlutterProject); + await runner.run(['create', '--no-pub', '--template=app', projectDir.path]); - testUsingContext('fails to re-gen without specified org when org is ambiguous', () async { - await _createProject( - projectDir, - ['--no-pub', '--org', 'com.bar.foo'], - [], - ); - fs.directory(fs.path.join(projectDir.path, 'ios')).deleteSync(recursive: true); - await _createProject( - projectDir, - ['--no-pub', '--org', 'com.bar.baz'], - [], - ); - expect( - () => _createProject(projectDir, [], []), - throwsToolExit(message: 'Ambiguous organization'), - ); - }, timeout: allowForCreateFlutterProject); + // Remove the .metadata to simulate an older instantiation that didn't generate those. + fs.file(fs.path.join(projectDir.path, '.metadata')).deleteSync(); - // Verify that we help the user correct an option ordering issue - testUsingContext('produces sensible error message', () async { - Cache.flutterRoot = '../..'; + await runner.run(['create', '--no-pub', projectDir.path]); - final CreateCommand command = CreateCommand(); - final CommandRunner runner = createTestCommandRunner(command); + final String metadata = fs.file(fs.path.join(projectDir.path, '.metadata')).readAsStringSync(); + expect(metadata, contains('project_type: app\n')); + }, timeout: allowForCreateFlutterProject); - expect( - runner.run(['create', projectDir.path, '--pub']), - throwsToolExit(exitCode: 2, message: 'Try moving --pub'), - ); - }); + testUsingContext('can re-gen default template over existing legacy app project and detect the type', () async { + Cache.flutterRoot = '../..'; - // Verify that we fail with an error code when the file exists. - testUsingContext('fails when file exists', () async { - Cache.flutterRoot = '../..'; - final CreateCommand command = CreateCommand(); - final CommandRunner runner = createTestCommandRunner(command); - final File existingFile = fs.file('${projectDir.path.toString()}/bad'); - if (!existingFile.existsSync()) - existingFile.createSync(recursive: true); - expect( - runner.run(['create', existingFile.path]), - throwsToolExit(message: 'file exists'), - ); - }); + final CreateCommand command = CreateCommand(); + final CommandRunner runner = createTestCommandRunner(command); - testUsingContext('fails when invalid package name', () async { - Cache.flutterRoot = '../..'; - final CreateCommand command = CreateCommand(); - final CommandRunner runner = createTestCommandRunner(command); - expect( - runner.run(['create', fs.path.join(projectDir.path, 'invalidName')]), - throwsToolExit(message: '"invalidName" is not a valid Dart package name.'), - ); - }); + await runner.run(['create', '--no-pub', '--template=app', projectDir.path]); - testUsingContext('invokes pub offline when requested', () async { + await runner.run(['create', '--no-pub', projectDir.path]); + + final String metadata = fs.file(fs.path.join(projectDir.path, '.metadata')).readAsStringSync(); + expect(metadata, contains('project_type: app\n')); + }, timeout: allowForCreateFlutterProject); + + testUsingContext('can re-gen default template over existing plugin project and detect the type', () async { + Cache.flutterRoot = '../..'; + + final CreateCommand command = CreateCommand(); + final CommandRunner runner = createTestCommandRunner(command); + + await runner.run(['create', '--no-pub', '--template=plugin', projectDir.path]); + + await runner.run(['create', '--no-pub', projectDir.path]); + + final String metadata = fs.file(fs.path.join(projectDir.path, '.metadata')).readAsStringSync(); + expect(metadata, contains('project_type: plugin')); + }, timeout: allowForCreateFlutterProject); + + testUsingContext('can re-gen default template over existing package project and detect the type', () async { + Cache.flutterRoot = '../..'; + + final CreateCommand command = CreateCommand(); + final CommandRunner runner = createTestCommandRunner(command); + + await runner.run(['create', '--no-pub', '--template=package', projectDir.path]); + + await runner.run(['create', '--no-pub', projectDir.path]); + + final String metadata = fs.file(fs.path.join(projectDir.path, '.metadata')).readAsStringSync(); + expect(metadata, contains('project_type: package')); + }, timeout: allowForCreateFlutterProject); + + testUsingContext('can re-gen application .android/ folder, reusing custom org', () async { + await _createProject( + projectDir, + ['--template=application', '--org', 'com.bar.foo'], + [], + ); + projectDir.childDirectory('.android').deleteSync(recursive: true); + return _createProject( + projectDir, + [], + [ + '.android/app/src/main/java/com/bar/foo/flutterproject/host/MainActivity.java', + ], + ); + }, timeout: allowForRemotePubInvocation); + + testUsingContext('can re-gen application .ios/ folder, reusing custom org', () async { + await _createProject( + projectDir, + ['--template=application', '--org', 'com.bar.foo'], + [], + ); + projectDir.childDirectory('.ios').deleteSync(recursive: true); + await _createProject(projectDir, [], []); + final FlutterProject project = await FlutterProject.fromDirectory(projectDir); + expect( + project.ios.productBundleIdentifier, + 'com.bar.foo.flutterProject', + ); + }, timeout: allowForRemotePubInvocation); + + testUsingContext('can re-gen legacy app android/ folder, reusing custom org', () async { + await _createProject( + projectDir, + ['--no-pub', '--template=app', '--org', 'com.bar.foo'], + [], + ); + projectDir.childDirectory('android').deleteSync(recursive: true); + return _createProject( + projectDir, + ['--no-pub'], + [ + 'android/app/src/main/java/com/bar/foo/flutterproject/MainActivity.java', + ], + unexpectedPaths: [ + 'android/app/src/main/java/com/example/flutterproject/MainActivity.java', + ], + ); + }, timeout: allowForCreateFlutterProject); + + testUsingContext('can re-gen legacy app ios/ folder, reusing custom org', () async { + await _createProject( + projectDir, + ['--no-pub', '--template=app', '--org', 'com.bar.foo'], + [], + ); + projectDir.childDirectory('ios').deleteSync(recursive: true); + await _createProject(projectDir, ['--no-pub'], []); + final FlutterProject project = await FlutterProject.fromDirectory(projectDir); + expect( + project.ios.productBundleIdentifier, + 'com.bar.foo.flutterProject', + ); + }, timeout: allowForCreateFlutterProject); + + testUsingContext('can re-gen plugin ios/ and example/ folders, reusing custom org', () async { + await _createProject( + projectDir, + ['--no-pub', '--template=plugin', '--org', 'com.bar.foo'], + [], + ); + projectDir.childDirectory('example').deleteSync(recursive: true); + projectDir.childDirectory('ios').deleteSync(recursive: true); + await _createProject( + projectDir, + ['--no-pub', '--template=plugin'], + [ + 'example/android/app/src/main/java/com/bar/foo/flutterprojectexample/MainActivity.java', + 'ios/Classes/FlutterProjectPlugin.h', + ], + unexpectedPaths: [ + 'example/android/app/src/main/java/com/example/flutterprojectexample/MainActivity.java', + 'android/src/main/java/com/example/flutterproject/FlutterProjectPlugin.java', + ], + ); + final FlutterProject project = await FlutterProject.fromDirectory(projectDir); + expect( + project.example.ios.productBundleIdentifier, + 'com.bar.foo.flutterProjectExample', + ); + }, timeout: allowForCreateFlutterProject); + + testUsingContext('fails to re-gen without specified org when org is ambiguous', () async { + await _createProject( + projectDir, + ['--no-pub', '--template=app', '--org', 'com.bar.foo'], + [], + ); + fs.directory(fs.path.join(projectDir.path, 'ios')).deleteSync(recursive: true); + await _createProject( + projectDir, + ['--no-pub', '--template=app', '--org', 'com.bar.baz'], + [], + ); + expect( + () => _createProject(projectDir, [], []), + throwsToolExit(message: 'Ambiguous organization'), + ); + }, timeout: allowForCreateFlutterProject); + + // Verify that we help the user correct an option ordering issue + testUsingContext('produces sensible error message', () async { + Cache.flutterRoot = '../..'; + + final CreateCommand command = CreateCommand(); + final CommandRunner runner = createTestCommandRunner(command); + + expect( + runner.run(['create', projectDir.path, '--pub']), + throwsToolExit(exitCode: 2, message: 'Try moving --pub'), + ); + }); + + // Verify that we fail with an error code when the file exists. + testUsingContext('fails when file exists', () async { + Cache.flutterRoot = '../..'; + final CreateCommand command = CreateCommand(); + final CommandRunner runner = createTestCommandRunner(command); + final File existingFile = fs.file('${projectDir.path.toString()}/bad'); + if (!existingFile.existsSync()) { + existingFile.createSync(recursive: true); + } + expect( + runner.run(['create', existingFile.path]), + throwsToolExit(message: 'file exists'), + ); + }); + + testUsingContext('fails when invalid package name', () async { + Cache.flutterRoot = '../..'; + final CreateCommand command = CreateCommand(); + final CommandRunner runner = createTestCommandRunner(command); + expect( + runner.run(['create', fs.path.join(projectDir.path, 'invalidName')]), + throwsToolExit(message: '"invalidName" is not a valid Dart package name.'), + ); + }); + + testUsingContext( + 'invokes pub offline when requested', + () async { Cache.flutterRoot = '../..'; final CreateCommand command = CreateCommand(); @@ -437,13 +600,15 @@ void main() { expect(loggingProcessManager.commands.first, contains(matches(r'dart-sdk[\\/]bin[\\/]pub'))); expect(loggingProcessManager.commands.first, contains('--offline')); }, - timeout: allowForCreateFlutterProject, - overrides: { - ProcessManager: () => loggingProcessManager, - }, - ); + timeout: allowForCreateFlutterProject, + overrides: { + ProcessManager: () => loggingProcessManager, + }, + ); - testUsingContext('invokes pub online when offline not requested', () async { + testUsingContext( + 'invokes pub online when offline not requested', + () async { Cache.flutterRoot = '../..'; final CreateCommand command = CreateCommand(); @@ -453,17 +618,19 @@ void main() { expect(loggingProcessManager.commands.first, contains(matches(r'dart-sdk[\\/]bin[\\/]pub'))); expect(loggingProcessManager.commands.first, isNot(contains('--offline'))); }, - timeout: allowForCreateFlutterProject, - overrides: { - ProcessManager: () => loggingProcessManager, - }, - ); - }); + timeout: allowForCreateFlutterProject, + overrides: { + ProcessManager: () => loggingProcessManager, + }, + ); } Future _createProject( - Directory dir, List createArgs, List expectedPaths, - { List unexpectedPaths = const [], bool plugin = false}) async { + Directory dir, + List createArgs, + List expectedPaths, { + List unexpectedPaths = const [], +}) async { Cache.flutterRoot = '../..'; final CreateCommand command = CreateCommand(); final CommandRunner runner = createTestCommandRunner(command); @@ -477,23 +644,28 @@ Future _createProject( return fs.typeSync(fullPath) != FileSystemEntityType.notFound; } + final List failures = []; for (String path in expectedPaths) { - expect(pathExists(path), true, reason: '$path does not exist'); + if (!pathExists(path)) { + failures.add('Path "$path" does not exist.'); + } } for (String path in unexpectedPaths) { - expect(pathExists(path), false, reason: '$path exists'); + if (pathExists(path)) { + failures.add('Path "$path" exists when it shouldn\'t.'); + } } + expect(failures, isEmpty, reason: failures.join('\n')); } Future _createAndAnalyzeProject( - Directory dir, List createArgs, List expectedPaths, - { List unexpectedPaths = const [], bool plugin = false }) async { - await _createProject(dir, createArgs, expectedPaths, unexpectedPaths: unexpectedPaths, plugin: plugin); - if (plugin) { - await _analyzeProject(dir.path); - } else { - await _analyzeProject(dir.path); - } + Directory dir, + List createArgs, + List expectedPaths, { + List unexpectedPaths = const [], +}) async { + await _createProject(dir, createArgs, expectedPaths, unexpectedPaths: unexpectedPaths); + await _analyzeProject(dir.path); } Future _analyzeProject(String workingDir) async { @@ -530,8 +702,9 @@ Future _runFlutterTest(Directory workingDir, {String target}) async { ..add(flutterToolsPath) ..add('test') ..add('--no-color'); - if (target != null) + if (target != null) { args.add(target); + } final ProcessResult exec = await Process.run( '$dartSdkPath/bin/dart', @@ -555,12 +728,12 @@ class LoggingProcessManager extends LocalProcessManager { @override Future start( List command, { - String workingDirectory, - Map environment, - bool includeParentEnvironment = true, - bool runInShell = false, - ProcessStartMode mode = ProcessStartMode.normal, - }) { + String workingDirectory, + Map environment, + bool includeParentEnvironment = true, + bool runInShell = false, + ProcessStartMode mode = ProcessStartMode.normal, + }) { commands.add(command); return super.start( command, diff --git a/packages/flutter_tools/test/commands/packages_test.dart b/packages/flutter_tools/test/commands/packages_test.dart index 5f74b3a430..34dab67dc8 100644 --- a/packages/flutter_tools/test/commands/packages_test.dart +++ b/packages/flutter_tools/test/commands/packages_test.dart @@ -114,16 +114,32 @@ void main() { 'android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java', ]; + const List applicationPluginRegistrants = [ + '.ios/Flutter/FlutterPluginRegistrant/Classes/GeneratedPluginRegistrant.h', + '.ios/Flutter/FlutterPluginRegistrant/Classes/GeneratedPluginRegistrant.m', + '.android/Flutter/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java', + ]; + const List pluginWitnesses = [ '.flutter-plugins', 'ios/Podfile', ]; + const List applicationPluginWitnesses = [ + '.flutter-plugins', + '.ios/Podfile', + ]; + const Map pluginContentWitnesses = { 'ios/Flutter/Debug.xcconfig': '#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"', 'ios/Flutter/Release.xcconfig': '#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"', }; + const Map applicationPluginContentWitnesses = { + '.ios/Config/Debug.xcconfig': '#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"', + '.ios/Config/Release.xcconfig': '#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"', + }; + void expectDependenciesResolved(String projectPath) { for (String output in pubOutput) { expectExists(projectPath, output); @@ -131,13 +147,13 @@ void main() { } void expectZeroPluginsInjected(String projectPath) { - for (final String registrant in pluginRegistrants) { + for (final String registrant in applicationPluginRegistrants) { expectExists(projectPath, registrant); } for (final String witness in pluginWitnesses) { expectNotExists(projectPath, witness); } - pluginContentWitnesses.forEach((String witness, String content) { + applicationPluginContentWitnesses.forEach((String witness, String content) { expectNotContains(projectPath, witness, content); }); } @@ -154,10 +170,22 @@ void main() { }); } + void expectApplicationPluginInjected(String projectPath) { + for (final String registrant in applicationPluginRegistrants) { + expectExists(projectPath, registrant); + } + for (final String witness in applicationPluginWitnesses) { + expectExists(projectPath, witness); + } + applicationPluginContentWitnesses.forEach((String witness, String content) { + expectContains(projectPath, witness, content); + }); + } + void removeGeneratedFiles(String projectPath) { final Iterable allFiles = >[ pubOutput, - pluginRegistrants, + applicationPluginRegistrants, pluginWitnesses, ].expand((List list) => list); for (String path in allFiles) { @@ -204,14 +232,13 @@ void main() { await runCommandIn(projectPath, 'get'); expectDependenciesResolved(projectPath); - expectPluginInjected(projectPath); - // TODO(mravn): This test fails on the Chrome windows bot only. - // Skipping until resolved. - }, timeout: allowForRemotePubInvocation, skip: true); + expectApplicationPluginInjected(projectPath); + }, timeout: allowForRemotePubInvocation); + testUsingContext('get fetches packages and injects plugin in plugin project', () async { final String projectPath = await createProject( tempDir, - arguments: ['-t', 'plugin', '--no-pub'], + arguments: ['--template=plugin', '--no-pub'], ); final String exampleProjectPath = fs.path.join(projectPath, 'example'); removeGeneratedFiles(projectPath); diff --git a/packages/flutter_tools/test/flutter_manifest_test.dart b/packages/flutter_tools/test/flutter_manifest_test.dart index 894a1bcbbc..287e723ab3 100644 --- a/packages/flutter_tools/test/flutter_manifest_test.dart +++ b/packages/flutter_tools/test/flutter_manifest_test.dart @@ -355,20 +355,20 @@ flutter: '''; final FlutterManifest flutterManifest = await FlutterManifest.createFromString(manifest); expect(flutterManifest.isEmpty, false); - expect(flutterManifest.isModule, false); + expect(flutterManifest.isApplication, false); expect(flutterManifest.isPlugin, false); expect(flutterManifest.androidPackage, null); }); - test('allows a module declaration', () async { + test('allows an application declaration', () async { const String manifest = ''' name: test flutter: - module: + application: androidPackage: com.example '''; final FlutterManifest flutterManifest = await FlutterManifest.createFromString(manifest); - expect(flutterManifest.isModule, true); + expect(flutterManifest.isApplication, true); expect(flutterManifest.androidPackage, 'com.example'); }); diff --git a/packages/flutter_tools/test/project_test.dart b/packages/flutter_tools/test/project_test.dart index 63e80571da..c17d6f0c86 100644 --- a/packages/flutter_tools/test/project_test.dart +++ b/packages/flutter_tools/test/project_test.dart @@ -90,20 +90,20 @@ void main() { }); group('editable Android host app', () { - testInMemory('fails on non-module', () async { + testInMemory('fails on non-application', () async { final FlutterProject project = await someProject(); await expectLater( project.android.makeHostAppEditable(), throwsA(isInstanceOf()), ); }); - testInMemory('exits on already editable module', () async { - final FlutterProject project = await aModuleProject(); + testInMemory('exits on already editable application', () async { + final FlutterProject project = await anApplicationProject(); await project.android.makeHostAppEditable(); return expectToolExitLater(project.android.makeHostAppEditable(), contains('already editable')); }); testInMemory('creates android/app folder in place of .android/app', () async { - final FlutterProject project = await aModuleProject(); + final FlutterProject project = await anApplicationProject(); await project.android.makeHostAppEditable(); expectNotExists(project.directory.childDirectory('.android').childDirectory('app')); expect( @@ -118,7 +118,7 @@ void main() { ); }); testInMemory('retains .android/Flutter folder and references it', () async { - final FlutterProject project = await aModuleProject(); + final FlutterProject project = await anApplicationProject(); await project.android.makeHostAppEditable(); expectExists(project.directory.childDirectory('.android').childDirectory('Flutter')); expect( @@ -127,7 +127,7 @@ void main() { ); }); testInMemory('can be redone after deletion', () async { - final FlutterProject project = await aModuleProject(); + final FlutterProject project = await anApplicationProject(); await project.android.makeHostAppEditable(); project.directory.childDirectory('android').deleteSync(recursive: true); await project.android.makeHostAppEditable(); @@ -173,15 +173,15 @@ void main() { await project.ensureReadyForPlatformSpecificTooling(); expectExists(project.android.hostAppGradleRoot.childFile('local.properties')); }); - testInMemory('creates Android library in module', () async { - final FlutterProject project = await aModuleProject(); + testInMemory('creates Android library in application', () async { + final FlutterProject project = await anApplicationProject(); await project.ensureReadyForPlatformSpecificTooling(); expectExists(project.android.hostAppGradleRoot.childFile('settings.gradle')); expectExists(project.android.hostAppGradleRoot.childFile('local.properties')); expectExists(androidPluginRegistrant(project.android.hostAppGradleRoot.childDirectory('Flutter'))); }); - testInMemory('creates iOS pod in module', () async { - final FlutterProject project = await aModuleProject(); + testInMemory('creates iOS pod in application', () async { + final FlutterProject project = await anApplicationProject(); await project.ensureReadyForPlatformSpecificTooling(); final Directory flutter = project.ios.hostAppRoot.childDirectory('Flutter'); expectExists(flutter.childFile('podhelper.rb')); @@ -194,20 +194,20 @@ void main() { }); }); - group('module status', () { - testInMemory('is known for module', () async { - final FlutterProject project = await aModuleProject(); - expect(project.isModule, isTrue); - expect(project.android.isModule, isTrue); - expect(project.ios.isModule, isTrue); + group('application status', () { + testInMemory('is known for application', () async { + final FlutterProject project = await anApplicationProject(); + expect(project.isApplication, isTrue); + expect(project.android.isApplication, isTrue); + expect(project.ios.isApplication, isTrue); expect(project.android.hostAppGradleRoot.basename, '.android'); expect(project.ios.hostAppRoot.basename, '.ios'); }); - testInMemory('is known for non-module', () async { + testInMemory('is known for non-application', () async { final FlutterProject project = await someProject(); - expect(project.isModule, isFalse); - expect(project.android.isModule, isFalse); - expect(project.ios.isModule, isFalse); + expect(project.isApplication, isFalse); + expect(project.android.isApplication, isFalse); + expect(project.ios.isApplication, isFalse); expect(project.android.hostAppGradleRoot.basename, 'android'); expect(project.ios.hostAppRoot.basename, 'ios'); }); @@ -351,13 +351,13 @@ flutter: return FlutterProject.fromDirectory(directory); } -Future aModuleProject() async { - final Directory directory = fs.directory('module_project'); +Future anApplicationProject() async { + final Directory directory = fs.directory('application_project'); directory.childFile('.packages').createSync(recursive: true); directory.childFile('pubspec.yaml').writeAsStringSync(''' -name: my_module +name: my_application flutter: - module: + application: androidPackage: com.example '''); return FlutterProject.fromDirectory(directory);