snippets/createFlutter

382 lines
8.0 KiB
Bash
Executable File

#!/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 '[: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 <<EOF
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/
# IntelliJ related
*.iml
*.ipr
*.iws
.idea/
# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/
# Flutter/Dart/Pub related
**/doc/api/
.dart_tool/
.flutter-plugins
.packages
.pub-cache/
.pub/
/build/
# Android related
**/android/**/gradle-wrapper.jar
**/android/.gradle
**/android/captures/
**/android/gradlew
**/android/gradlew.bat
**/android/local.properties
**/android/**/GeneratedPluginRegistrant.java
**/android/key.properties
# iOS/XCode related
**/ios/**/*.mode1v3
**/ios/**/*.mode2v3
**/ios/**/*.moved-aside
**/ios/**/*.pbxuser
**/ios/**/*.perspectivev3
**/ios/**/*sync/
**/ios/**/.sconsign.dblite
**/ios/**/.tags*
**/ios/**/.vagrant/
**/ios/**/DerivedData/
**/ios/**/Icon?
**/ios/**/Pods/
**/ios/**/.symlinks/
**/ios/**/profile
**/ios/**/xcuserdata
**/ios/.generated/
**/ios/Flutter/App.framework
**/ios/Flutter/Flutter.framework
**/ios/Flutter/Generated.xcconfig
**/ios/Flutter/app.flx
**/ios/Flutter/app.zip
**/ios/Flutter/flutter_assets/
**/ios/Flutter/flutter_export_environment.sh
**/ios/ServiceDefinitions.json
**/ios/Runner/GeneratedPluginRegistrant.*
# Exceptions to above rules.
!**/ios/**/default.mode1v3
!**/ios/**/default.mode2v3
!**/ios/**/default.pbxuser
!**/ios/**/default.perspectivev3
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
EOF
git init
##################################
## generate empty launcher icon ##
##################################
convert -size 2048x2048 xc:white LauncherIcon.png
############################
## overwrite pubspec.yaml ##
############################
cat > pubspec.yaml <<EOF
name: $packageName
description: $description
version: 1.0.0+1
environment:
sdk: ">=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 <<EOF
$keyProperties
EOF
############################
## overwrite build.gradle ##
############################
cat > android/app/build.gradle <<EOF
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
localPropertiesFile.withReader('UTF-8') { reader ->
localProperties.load(reader)
}
}
def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
flutterVersionCode = '1'
}
def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
flutterVersionName = '1.0'
}
apply plugin: 'com.android.application'
apply from: "\$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
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 <<EOF
# $appName
$description
EOF
#########################
## overwrite main.dart ##
#########################
cat > lib/main.dart <<EOF
import 'package:flutter/material.dart';
void main() => 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<MyHomePage> {
int state = 1;
void _changeState(int s) {
setState(() {
state = s;
});
}
List<String> popupMenuItems = ["About"];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
actions: <Widget>[
PopupMenuButton<String>(
onSelected: (String value) => handleClick(context, value),
itemBuilder: (BuildContext context) {
return popupMenuItems.map((String choice) {
return PopupMenuItem<String>(
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 <<EOF
.PHONY: clean all launcherIcon
all: launcherIcon
flutter pub get
flutter build appbundle
clean:
flutter clean
launcherIcon:
flutter pub get
flutter pub run "flutter_launcher_icons:main"
EOF
################
## test build ##
################
make clean launcherIcon all
make clean