157 lines
5.4 KiB
Bash
Executable file
157 lines
5.4 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
pwd
|
|
id
|
|
|
|
set -e
|
|
|
|
|
|
#APP_NAME
|
|
while test -z "${APP_NAME:-}"
|
|
do
|
|
read -p "Please provide a Name for the Android App: " APP_NAME
|
|
done
|
|
|
|
|
|
#APP_PACKAGE
|
|
while test -z "${APP_PACKAGE:-}"
|
|
do
|
|
APP_PACKAGE_DEFAULT="${APP_NAME,,}"
|
|
APP_PACKAGE_DEFAULT="${APP_PACKAGE_DEFAULT//[!a-z0-9]/_}"
|
|
read -p "Please provide a Package.Name for the App [default=$APP_PACKAGE_DEFAULT]: " APP_PACKAGE
|
|
APP_PACKAGE="${APP_PACKAGE:-$APP_PACKAGE_DEFAULT}"
|
|
APP_PACKAGE="${APP_PACKAGE,,}"
|
|
APP_PACKAGE="${APP_PACKAGE//[!a-z0-9\.]/}"
|
|
test -d "apps/$APP_PACKAGE" && {
|
|
echo "There is already an app with APP_PACKAGE '$APP_PACKAGE'. Choose other APP_PACKAGE name" >&2
|
|
APP_PACKAGE=""
|
|
}
|
|
done
|
|
|
|
|
|
#APP_FOLDER
|
|
while test -z "${APP_FOLDER:-}"
|
|
do
|
|
APP_FOLDER_DEFAULT="./apps/${APP_PACKAGE}"
|
|
read -p "Please provide a a path where to setup the Android App Skeleton[default=$APP_FOLDER_DEFAULT]: " APP_FOLDER
|
|
APP_FOLDER="${APP_FOLDER:-$APP_FOLDER_DEFAULT}"
|
|
test -d "$APP_FOLDER" && {
|
|
echo "There is already a folder at '$APP_FOLDER'. Choose other APP_PACKAGE name" >&2
|
|
APP_FOLDER=""
|
|
}
|
|
done
|
|
|
|
|
|
#APP_VERSION_SDK_TARGET
|
|
while test -z "${APP_VERSION_SDK_TARGET:-}"
|
|
do
|
|
cat << API_LEVELS
|
|
read -p "please choose the APP_VERSION_SDK_TARGET apilevel:'
|
|
35 = android 15 = 2024
|
|
34 = android 14 = 2023
|
|
33 = android 13 = 2022
|
|
32 = android 12l = 2022
|
|
31 = android 12 = 2021
|
|
30 = android 11 = 2020
|
|
20 = android 10 = 2019
|
|
(see https://apilevels.com/ for more info)
|
|
API_LEVELS
|
|
APP_VERSION_SDK_TARGET_DEFAULT="33"
|
|
read -p "please choose [default=$APP_VERSION_SDK_TARGET_DEFAULT]: " APP_VERSION_SDK_TARGET
|
|
APP_VERSION_SDK_TARGET="${APP_VERSION_SDK_TARGET:-$APP_VERSION_SDK_TARGET_DEFAULT}"
|
|
test "$APP_VERSION_SDK_TARGET" -gt 0 || {
|
|
echo "error: APP_VERSION_SDK_TARGET 'APP_VERSION_SDK_TARGET' is not valid"
|
|
APP_VERSION_SDK_TARGET='';
|
|
}
|
|
done
|
|
|
|
#APP_VERSION_SDK_MIN
|
|
while test -z "${APP_VERSION_SDK_MIN:-}"
|
|
do
|
|
cat << API_LEVELS
|
|
read -p "please choose the APP_VERSION_SDK_MIN apilevel:'
|
|
35 = android 15 = 2024
|
|
34 = android 14 = 2023
|
|
33 = android 13 = 2022
|
|
32 = android 12l = 2022
|
|
31 = android 12 = 2021
|
|
30 = android 11 = 2020
|
|
20 = android 10 = 2019
|
|
(see https://apilevels.com/ for more info)
|
|
API_LEVELS
|
|
|
|
APP_VERSION_SDK_MIN_DEFAULT="$(( $APP_VERSION_SDK_TARGET - 2))"
|
|
test "$APP_VERSION_SDK_MIN_DEFAULT" -lt 1 && APP_VERSION_SDK_MIN_DEFAULT=1
|
|
read -p "please choose [default=$APP_VERSION_SDK_MIN_DEFAULT]: " APP_VERSION_SDK_MIN
|
|
APP_VERSION_SDK_MIN="${APP_VERSION_SDK_MIN:-$APP_VERSION_SDK_MIN_DEFAULT}"
|
|
test "$APP_VERSION_SDK_MIN" -gt 0 || {
|
|
echo "error: APP_VERSION_SDK_MIN 'APP_VERSION_SDK_MIN' is not valid"
|
|
APP_VERSION_SDK_MIN='';
|
|
}
|
|
done
|
|
|
|
APP_PERMISSIONS="$(cat << APP_PERMISSIONS_EOF
|
|
<uses-permission android:name="android.permission.INTERNET"/>
|
|
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS"/>
|
|
<uses-permission android:name="android.permission.MANAGE_MEDIA"/>
|
|
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
|
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
|
|
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/>
|
|
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
|
|
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
|
|
<uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED"/>
|
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
|
|
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/>
|
|
<uses-permission android:name="android.permission.VIBRATE"/>
|
|
<uses-permission android:name="android.permission.WAKE_LOCK"/>
|
|
<uses-permission android:name="android.permission.WRITE_CALENDAR"/>
|
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
|
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE"/>
|
|
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
|
|
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS"/>
|
|
APP_PERMISSIONS_EOF
|
|
)"
|
|
|
|
|
|
mkdir -p "$APP_FOLDER"
|
|
|
|
|
|
APP_VALUES="$(tee "${APP_FOLDER}/values.sh" << VALUES
|
|
APP_NAME='$APP_NAME'
|
|
APP_PACKAGE='$APP_PACKAGE'
|
|
APP_FOLDER='$APP_FOLDER'
|
|
APP_VERSION_SDK_TARGET='$APP_VERSION_SDK_TARGET'
|
|
APP_VERSION_SDK_MINTARGET='$APP_VERSION_SDK_TARGET'
|
|
APP_PERMISSIONS='$APP_PERMISSIONS'
|
|
VALUES
|
|
)"
|
|
|
|
cat << INFO
|
|
Creating an skeleton for an Android app with the following info:
|
|
$APP_VALUES
|
|
INFO
|
|
|
|
|
|
cat > "${APP_FOLDER}/AndroidManifest.xml" << ANDROIDMANIFEST
|
|
<?xml version="1.0" encoding="utf-8"?>
|
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
|
package="$APP_PACKAGE"
|
|
android:versionCode="1"
|
|
android:versionName="1.0">
|
|
<uses-sdk android:minSdkVersion="$APP_VERSION_SDK_MIN"
|
|
android:targetSdkVersion="$APP_VERSION_SDK_TARGET"/>
|
|
$(sed 's/^/ /' <<< "$APP_PERMISSIONS")
|
|
<application android:label="$APP_NAME" android:icon="@drawable/ic_launcher">
|
|
<activity android:name="$APP_PACKAGE.AppActivity"
|
|
android:exported="true"
|
|
android:configChanges="orientation|screenSize|keyboardHidden"
|
|
android:label="$APP_NAME">
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.MAIN" />
|
|
<category android:name="android.intent.category.LAUNCHER" />
|
|
</intent-filter>
|
|
</activity>
|
|
</application>
|
|
</manifest>
|
|
ANDROIDMANIFEST
|
|
|