From 9f23866a0a534c750ea3de4a9c4ee7c111aece69 Mon Sep 17 00:00:00 2001 From: Greg Spencer Date: Thu, 4 Oct 2018 13:03:20 -0700 Subject: [PATCH] Rename module --> application in flutter create command. (#22565) This renames the "module" template to the "application" template, and makes "application" the default. The existing "app" template is now deprecated. flutter create also now recognizes the type of project in an existing directory, and is able to recreate it without having the template type explicitly specified (although you can still do that). It does this now by first looking in the .metadata file for the new project_type field, and if it doesn't find that, then it looks at the directory structure. Also, the .metadata file is now overwritten even on an existing directory so that 1) the project_type can be added to legacy projects, and 2) the version of Flutter that updated the project last is updated. I also cleaned up a bunch of things in create_test.dart, added many more tests, and added an example test to the test/ directory in the generated output of the application template. Fixes #22530 Fixes #22344 --- dev/devicelab/lib/framework/runner.dart | 2 +- packages/flutter_tools/lib/executable.dart | 2 +- .../lib/src/commands/create.dart | 184 +++- .../src/commands/make_host_app_editable.dart | 4 +- .../lib/src/flutter_manifest.dart | 22 +- packages/flutter_tools/lib/src/ios/mac.dart | 2 +- .../flutter_tools/lib/src/ios/xcodeproj.dart | 4 +- packages/flutter_tools/lib/src/plugins.dart | 4 +- packages/flutter_tools/lib/src/project.dart | 70 +- .../flutter_tools/schema/pubspec_yaml.json | 2 +- .../templates/{create => app}/.gitignore.tmpl | 0 .../.idea/libraries/Dart_SDK.xml.tmpl | 0 .../libraries/Flutter_for_Android.xml.tmpl | 0 .../{create => app}/.idea/modules.xml.tmpl | 0 .../runConfigurations/main_dart.xml.tmpl | 0 .../{create => app}/.idea/workspace.xml.tmpl | 0 .../templates/{create => app}/.metadata.tmpl | 2 + .../templates/{create => app}/README.md.tmpl | 0 .../android-java.tmpl/app/build.gradle.tmpl | 0 .../androidIdentifier/MainActivity.java.tmpl | 0 .../android-java.tmpl/build.gradle | 0 .../android-kotlin.tmpl/app/build.gradle.tmpl | 0 .../androidIdentifier/MainActivity.kt.tmpl | 0 .../android-kotlin.tmpl/build.gradle | 0 .../app/src/main/AndroidManifest.xml.tmpl | 0 .../main/res/drawable/launch_background.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../app/src/main/res/values/styles.xml | 0 .../android.tmpl/gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.properties | 0 .../android.tmpl/settings.gradle | 0 .../Runner.xcodeproj/project.pbxproj.tmpl | 0 .../ios-objc.tmpl/Runner/AppDelegate.h | 0 .../ios-objc.tmpl/Runner/AppDelegate.m | 0 .../ios-objc.tmpl/Runner/main.m | 0 .../Runner.xcodeproj/project.pbxproj.tmpl | 0 .../ios-swift.tmpl/Runner/AppDelegate.swift | 0 .../Runner/Runner-Bridging-Header.h | 0 .../ios.tmpl/Flutter/AppFrameworkInfo.plist | 0 .../ios.tmpl/Flutter/Debug.xcconfig | 0 .../ios.tmpl/Flutter/Release.xcconfig | 0 .../contents.xcworkspacedata | 0 .../xcshareddata/xcschemes/Runner.xcscheme | 0 .../contents.xcworkspacedata | 0 .../AppIcon.appiconset/Contents.json | 0 .../Icon-App-1024x1024@1x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin .../Icon-App-83.5x83.5@2x.png | Bin .../LaunchImage.imageset/Contents.json | 0 .../LaunchImage.imageset/LaunchImage.png | Bin .../LaunchImage.imageset/LaunchImage@2x.png | Bin .../LaunchImage.imageset/LaunchImage@3x.png | Bin .../LaunchImage.imageset/README.md | 0 .../Runner/Base.lproj/LaunchScreen.storyboard | 0 .../Runner/Base.lproj/Main.storyboard | 0 .../ios.tmpl/Runner/Info.plist.tmpl | 0 .../{create => app}/lib/main.dart.tmpl | 0 .../{create => app}/projectName.iml.tmpl | 0 .../projectName_android.iml.tmpl | 0 .../{create => app}/pubspec.yaml.tmpl | 0 .../test/widget_test.dart.tmpl | 9 +- .../{module => application}/README.md | 2 +- .../android/gradle/build.gradle.copy.tmpl | 0 .../gradle/gradle.properties.copy.tmpl | 0 .../app.tmpl/build.gradle.tmpl | 0 .../src/main/AndroidManifest.xml.tmpl | 0 .../host/MainActivity.java.tmpl | 0 .../main/res/drawable/launch_background.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../app.tmpl/src/main/res/values/styles.xml | 0 .../settings.gradle.copy.tmpl | 0 .../settings.gradle.copy.tmpl | 0 .../library/Flutter.tmpl/build.gradle.tmpl | 0 .../src/main/AndroidManifest.xml.tmpl | 0 .../main/java/io/flutter/facade/Flutter.java | 5 +- .../io/flutter/facade/FlutterFragment.java | 5 +- .../library/include_flutter.groovy.copy.tmpl | 0 .../android/library/settings.gradle.copy.tmpl | 0 .../common/.gitignore.tmpl | 0 .../common/.idea/libraries/Dart_SDK.xml.tmpl | 0 .../libraries/Flutter_for_Android.xml.tmpl | 0 .../common/.idea/modules.xml.tmpl | 0 .../common/.idea/workspace.xml.tmpl | 0 .../application/common/.metadata.tmpl | 10 + .../common/README.md.tmpl | 0 .../common/lib/main.dart.tmpl | 0 .../common/projectName.iml.tmpl | 0 .../common/projectName_android.iml.tmpl | 0 .../common/pubspec.yaml.tmpl | 7 +- .../common/test/widget_test.dart.tmpl | 48 + .../Config.tmpl/Flutter.xcconfig | 0 .../Config.tmpl/Debug.xcconfig | 0 .../Config.tmpl/Flutter.xcconfig | 0 .../Config.tmpl/Release.xcconfig | 0 .../Runner.tmpl/AppDelegate.h | 0 .../Runner.tmpl/AppDelegate.m | 0 .../AppIcon.appiconset/Contents.json | 0 .../Icon-App-1024x1024@1x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin .../Icon-App-83.5x83.5@2x.png | Bin .../LaunchImage.imageset/Contents.json | 0 .../LaunchImage.imageset/LaunchImage.png | Bin .../LaunchImage.imageset/LaunchImage@2x.png | Bin .../LaunchImage.imageset/LaunchImage@3x.png | Bin .../LaunchImage.imageset/README.md | 0 .../Base.lproj/LaunchScreen.storyboard | 0 .../Runner.tmpl/Base.lproj/Main.storyboard | 0 .../Runner.tmpl/Info.plist.tmpl | 0 .../ios/host_app_ephemeral/Runner.tmpl/main.m | 0 .../project.pbxproj.tmpl | 0 .../contents.xcworkspacedata | 0 .../xcshareddata/xcschemes/Runner.xcscheme | 0 .../contents.xcworkspacedata | 0 .../Config.tmpl/Debug.xcconfig | 0 .../Config.tmpl/Release.xcconfig | 0 .../Podfile.copy.tmpl | 0 .../Runner.tmpl/AppDelegate.m | 0 .../Flutter.tmpl/AppFrameworkInfo.plist | 0 .../ios/library/Flutter.tmpl/README.md | 0 .../ios/library/Flutter.tmpl/podhelper.rb | 0 .../templates/package/.metadata.tmpl | 10 + .../{module/common => plugin}/.metadata.tmpl | 2 + .../test/commands/analyze_once_test.dart | 2 +- .../test/commands/create_test.dart | 965 +++++++++++------- .../test/commands/packages_test.dart | 43 +- .../test/flutter_manifest_test.dart | 8 +- packages/flutter_tools/test/project_test.dart | 48 +- 155 files changed, 921 insertions(+), 541 deletions(-) rename packages/flutter_tools/templates/{create => app}/.gitignore.tmpl (100%) rename packages/flutter_tools/templates/{create => app}/.idea/libraries/Dart_SDK.xml.tmpl (100%) rename packages/flutter_tools/templates/{create => app}/.idea/libraries/Flutter_for_Android.xml.tmpl (100%) rename packages/flutter_tools/templates/{create => app}/.idea/modules.xml.tmpl (100%) rename packages/flutter_tools/templates/{create => app}/.idea/runConfigurations/main_dart.xml.tmpl (100%) rename packages/flutter_tools/templates/{create => app}/.idea/workspace.xml.tmpl (100%) rename packages/flutter_tools/templates/{create => app}/.metadata.tmpl (93%) rename packages/flutter_tools/templates/{create => app}/README.md.tmpl (100%) rename packages/flutter_tools/templates/{create => app}/android-java.tmpl/app/build.gradle.tmpl (100%) rename packages/flutter_tools/templates/{create => app}/android-java.tmpl/app/src/main/java/androidIdentifier/MainActivity.java.tmpl (100%) rename packages/flutter_tools/templates/{create => app}/android-java.tmpl/build.gradle (100%) rename packages/flutter_tools/templates/{create => app}/android-kotlin.tmpl/app/build.gradle.tmpl (100%) rename packages/flutter_tools/templates/{create => app}/android-kotlin.tmpl/app/src/main/kotlin/androidIdentifier/MainActivity.kt.tmpl (100%) rename packages/flutter_tools/templates/{create => app}/android-kotlin.tmpl/build.gradle (100%) rename packages/flutter_tools/templates/{create => app}/android.tmpl/app/src/main/AndroidManifest.xml.tmpl (100%) rename packages/flutter_tools/templates/{create => app}/android.tmpl/app/src/main/res/drawable/launch_background.xml (100%) rename packages/flutter_tools/templates/{create => app}/android.tmpl/app/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename packages/flutter_tools/templates/{create => app}/android.tmpl/app/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename packages/flutter_tools/templates/{create => app}/android.tmpl/app/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename packages/flutter_tools/templates/{create => app}/android.tmpl/app/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename packages/flutter_tools/templates/{create => app}/android.tmpl/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename packages/flutter_tools/templates/{create => app}/android.tmpl/app/src/main/res/values/styles.xml (100%) rename packages/flutter_tools/templates/{create => app}/android.tmpl/gradle.properties (100%) rename packages/flutter_tools/templates/{create => app}/android.tmpl/gradle/wrapper/gradle-wrapper.properties (100%) rename packages/flutter_tools/templates/{create => app}/android.tmpl/settings.gradle (100%) rename packages/flutter_tools/templates/{create => app}/ios-objc.tmpl/Runner.xcodeproj/project.pbxproj.tmpl (100%) rename packages/flutter_tools/templates/{create => app}/ios-objc.tmpl/Runner/AppDelegate.h (100%) rename packages/flutter_tools/templates/{create => app}/ios-objc.tmpl/Runner/AppDelegate.m (100%) rename packages/flutter_tools/templates/{create => app}/ios-objc.tmpl/Runner/main.m (100%) rename packages/flutter_tools/templates/{create => app}/ios-swift.tmpl/Runner.xcodeproj/project.pbxproj.tmpl (100%) rename packages/flutter_tools/templates/{create => app}/ios-swift.tmpl/Runner/AppDelegate.swift (100%) rename packages/flutter_tools/templates/{create => app}/ios-swift.tmpl/Runner/Runner-Bridging-Header.h (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Flutter/AppFrameworkInfo.plist (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Flutter/Debug.xcconfig (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Flutter/Release.xcconfig (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Runner.xcworkspace/contents.xcworkspacedata (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Runner/Assets.xcassets/LaunchImage.imageset/README.md (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Runner/Base.lproj/LaunchScreen.storyboard (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Runner/Base.lproj/Main.storyboard (100%) rename packages/flutter_tools/templates/{create => app}/ios.tmpl/Runner/Info.plist.tmpl (100%) rename packages/flutter_tools/templates/{create => app}/lib/main.dart.tmpl (100%) rename packages/flutter_tools/templates/{create => app}/projectName.iml.tmpl (100%) rename packages/flutter_tools/templates/{create => app}/projectName_android.iml.tmpl (100%) rename packages/flutter_tools/templates/{create => app}/pubspec.yaml.tmpl (100%) rename packages/flutter_tools/templates/{create => app}/test/widget_test.dart.tmpl (83%) rename packages/flutter_tools/templates/{module => application}/README.md (98%) rename packages/flutter_tools/templates/{module => application}/android/gradle/build.gradle.copy.tmpl (100%) rename packages/flutter_tools/templates/{module => application}/android/gradle/gradle.properties.copy.tmpl (100%) rename packages/flutter_tools/templates/{module => application}/android/host_app_common/app.tmpl/build.gradle.tmpl (100%) rename packages/flutter_tools/templates/{module => application}/android/host_app_common/app.tmpl/src/main/AndroidManifest.xml.tmpl (100%) rename packages/flutter_tools/templates/{module => application}/android/host_app_common/app.tmpl/src/main/java/androidIdentifier/host/MainActivity.java.tmpl (100%) rename packages/flutter_tools/templates/{module => application}/android/host_app_common/app.tmpl/src/main/res/drawable/launch_background.xml (100%) rename packages/flutter_tools/templates/{module => application}/android/host_app_common/app.tmpl/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename packages/flutter_tools/templates/{module => application}/android/host_app_common/app.tmpl/src/main/res/values/styles.xml (100%) rename packages/flutter_tools/templates/{module => application}/android/host_app_editable/settings.gradle.copy.tmpl (100%) rename packages/flutter_tools/templates/{module => application}/android/host_app_ephemeral/settings.gradle.copy.tmpl (100%) rename packages/flutter_tools/templates/{module => application}/android/library/Flutter.tmpl/build.gradle.tmpl (100%) rename packages/flutter_tools/templates/{module => application}/android/library/Flutter.tmpl/src/main/AndroidManifest.xml.tmpl (100%) rename packages/flutter_tools/templates/{module => application}/android/library/Flutter.tmpl/src/main/java/io/flutter/facade/Flutter.java (96%) rename packages/flutter_tools/templates/{module => application}/android/library/Flutter.tmpl/src/main/java/io/flutter/facade/FlutterFragment.java (88%) rename packages/flutter_tools/templates/{module => application}/android/library/include_flutter.groovy.copy.tmpl (100%) rename packages/flutter_tools/templates/{module => application}/android/library/settings.gradle.copy.tmpl (100%) rename packages/flutter_tools/templates/{module => application}/common/.gitignore.tmpl (100%) rename packages/flutter_tools/templates/{module => application}/common/.idea/libraries/Dart_SDK.xml.tmpl (100%) rename packages/flutter_tools/templates/{module => application}/common/.idea/libraries/Flutter_for_Android.xml.tmpl (100%) rename packages/flutter_tools/templates/{module => application}/common/.idea/modules.xml.tmpl (100%) rename packages/flutter_tools/templates/{module => application}/common/.idea/workspace.xml.tmpl (100%) create mode 100644 packages/flutter_tools/templates/application/common/.metadata.tmpl rename packages/flutter_tools/templates/{module => application}/common/README.md.tmpl (100%) rename packages/flutter_tools/templates/{module => application}/common/lib/main.dart.tmpl (100%) rename packages/flutter_tools/templates/{module => application}/common/projectName.iml.tmpl (100%) rename packages/flutter_tools/templates/{module => application}/common/projectName_android.iml.tmpl (100%) rename packages/flutter_tools/templates/{module => application}/common/pubspec.yaml.tmpl (78%) create mode 100644 packages/flutter_tools/templates/application/common/test/widget_test.dart.tmpl rename packages/flutter_tools/templates/{module => application}/ios/host_app_editable_cocoapods/Config.tmpl/Flutter.xcconfig (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Config.tmpl/Debug.xcconfig (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Config.tmpl/Flutter.xcconfig (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Config.tmpl/Release.xcconfig (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.tmpl/AppDelegate.h (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.tmpl/AppDelegate.m (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/LaunchImage.imageset/Contents.json (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/LaunchImage.imageset/LaunchImage.png (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.tmpl/Assets.xcassets/LaunchImage.imageset/README.md (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.tmpl/Base.lproj/LaunchScreen.storyboard (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.tmpl/Base.lproj/Main.storyboard (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.tmpl/Info.plist.tmpl (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.tmpl/main.m (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/project.pbxproj.tmpl (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/project.xcworkspace/contents.xcworkspacedata (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/xcshareddata/xcschemes/Runner.xcscheme (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral/Runner.xcworkspace.tmpl/contents.xcworkspacedata (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral_cocoapods/Config.tmpl/Debug.xcconfig (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral_cocoapods/Config.tmpl/Release.xcconfig (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral_cocoapods/Podfile.copy.tmpl (100%) rename packages/flutter_tools/templates/{module => application}/ios/host_app_ephemeral_cocoapods/Runner.tmpl/AppDelegate.m (100%) rename packages/flutter_tools/templates/{module => application}/ios/library/Flutter.tmpl/AppFrameworkInfo.plist (100%) rename packages/flutter_tools/templates/{module => application}/ios/library/Flutter.tmpl/README.md (100%) rename packages/flutter_tools/templates/{module => application}/ios/library/Flutter.tmpl/podhelper.rb (100%) create mode 100644 packages/flutter_tools/templates/package/.metadata.tmpl rename packages/flutter_tools/templates/{module/common => plugin}/.metadata.tmpl (92%) 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);