#!/bin/bash if [ "$#" -ne 2 ]; then echo "USAGE: $0 APP_NAME DESCRIPTION" exit 1 fi PROJECT_HOME=~/AndroidStudioProjects ORG_PATH="$PROJECT_HOME/defaultOrg" KEY_PROPERTIES_PATH="$PROJECT_HOME/defaultKeyProperties" appName="$1" packageName=`echo "$appName" | tr ' ' '_' | tr '[:upper:]' '[:lower:]'` description="$2" echo "App Name: $appName" echo "Package Name: $packageName" echo "Description: $description" if [[ -f "$ORG_PATH" ]]; then org=`cat "$PROJECT_HOME/defaultOrg"` else echo "Could not find file with default org in $ORG_PATH" exit 1 fi if [[ -f "$KEY_PROPERTIES_PATH" ]]; then keyProperties=`cat "$PROJECT_HOME/defaultKeyProperties"` else echo "Could not find file with default key properties in $KEY_PROPERTIES_PATH" exit 1 fi flutter create --android-language java --org "$org" "$packageName" || exit 1 cd "$packageName" ######################### #### create .gitignore ## ######################### cat > .gitignore < pubspec.yaml <=2.2.2 <3.0.0" dependencies: flutter: sdk: flutter intl: ^0.15.7 shared_preferences: ^0.5.4+8 cupertino_icons: ^0.1.2 dev_dependencies: flutter_test: sdk: flutter flutter_launcher_icons: "^0.7.3" flutter_icons: image_path: "LauncherIcon.png" android: true ios: true flutter: uses-material-design: true EOF ######################################### ## generate key.properties for signing ## ######################################### cat > android/key.properties < android/app/build.gradle < localProperties.load(reader) } } def flutterRoot = localProperties.getProperty('flutter.sdk') if (flutterRoot == null) { throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") } def flutterVersionCode = localProperties.getProperty('flutter.versionCode') if (flutterVersionCode == null) { flutterVersionCode = '1' } def flutterVersionName = localProperties.getProperty('flutter.versionName') if (flutterVersionName == null) { flutterVersionName = '1.0' } apply plugin: 'com.android.application' apply from: "\$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" def keystoreProperties = new Properties() def keystorePropertiesFile = rootProject.file('key.properties') if (keystorePropertiesFile.exists()) { keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) } android { compileSdkVersion 28 lintOptions { disable 'InvalidPackage' } defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "$org.$packageName" minSdkVersion 16 targetSdkVersion 28 versionCode flutterVersionCode.toInteger() versionName flutterVersionName testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } signingConfigs { release { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storeFile file(keystoreProperties['storeFile']) storePassword keystoreProperties['storePassword'] } } buildTypes { release { signingConfig signingConfigs.release } } } flutter { source '../..' } dependencies { testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' } EOF ####################### ## set android label ## ####################### sed -i "s/android:label=\"$packageName\"/android:label=\"$appName\"/" android/app/src/main/AndroidManifest.xml ##################### ## empty README.md ## ##################### cat > README.md < lib/main.dart < runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: '$appName', theme: ThemeData( primarySwatch: Colors.blue, ), home: MyHomePage(title: '$appName'), ); } } class MyHomePage extends StatefulWidget { MyHomePage({Key key, this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State { int state = 1; void _changeState(int s) { setState(() { state = s; }); } List popupMenuItems = ["About"]; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), actions: [ PopupMenuButton( onSelected: (String value) => handleClick(context, value), itemBuilder: (BuildContext context) { return popupMenuItems.map((String choice) { return PopupMenuItem( value: choice, child: Text(choice), ); }).toList(); }, ), ], ), body: Padding( padding: const EdgeInsets.all(8.0), child: ListView(children: [ Text("Lorem ipsum dolor sit amet"), ]), ), ); } void handleClick(BuildContext context, String value) { switch (value) { case 'About': showLicensePage(context: context, applicationName: widget.title); } } } EOF ##################### ## create Makefile ## ##################### cat > Makefile <