android beginning tentative
This commit is contained in:
parent
b78db2283b
commit
67137cd95f
59
templates/android-make/Makefile
Normal file
59
templates/android-make/Makefile
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
include vars.mk
|
||||||
|
|
||||||
|
JAVAC = javac
|
||||||
|
|
||||||
|
APKSIGNER = ${BUILD_TOOLS_DIR}/apksigner
|
||||||
|
ZIPALIGN = ${BUILD_TOOLS_DIR}/zipalign
|
||||||
|
AAPT = ${BUILD_TOOLS_DIR}/aapt
|
||||||
|
D8 = ${BUILD_TOOLS_DIR}/d8
|
||||||
|
|
||||||
|
JARS := \
|
||||||
|
${ANDROID_JAR_FILE} \
|
||||||
|
${ANDROIDX_CORE_FILE} \
|
||||||
|
${ANDROIDX_LIFECYCLE_COMMON_FILE} \
|
||||||
|
${ANDROIDX_VERSIONEDPARCELABLE_FILE} \
|
||||||
|
${KOTLIN_STDLIB_FILE} \
|
||||||
|
${KOTLINX_COROUTINES_CORE_FILE} \
|
||||||
|
${KOTLINX_COROUTINES_CORE_JVM_FILE}
|
||||||
|
|
||||||
|
CLASSES_PATH := $(subst /,.,$(JAVA_PACKAGE_NAME))
|
||||||
|
|
||||||
|
CLASSES := MainActivity
|
||||||
|
|
||||||
|
ifeq (${HAS_MIDI_IN}, yes)
|
||||||
|
MIN_API := 29
|
||||||
|
else
|
||||||
|
MIN_API := 26
|
||||||
|
endif
|
||||||
|
|
||||||
|
all: build/${BUNDLE_NAME}.apk
|
||||||
|
|
||||||
|
build/${BUNDLE_NAME}.apk: build/gen/${BUNDLE_NAME}.aligned.apk ${KEY_STORE}
|
||||||
|
${APKSIGNER} sign --ks ${KEY_STORE} --ks-key-alias ${KEY_ALIAS} --ks-pass ${STORE_PASS} --key-pass ${KEY_PASS} --out $@ build/gen/${BUNDLE_NAME}.aligned.apk
|
||||||
|
|
||||||
|
build/gen/${BUNDLE_NAME}.aligned.apk: build/gen/${BUNDLE_NAME}.unsigned.apk
|
||||||
|
${ZIPALIGN} -f -p 4 $^ $@
|
||||||
|
|
||||||
|
build/gen/${BUNDLE_NAME}.unsigned.apk: build/apk/classes.dex src/AndroidManifest.xml | build/gen
|
||||||
|
${AAPT} package -f -M src/AndroidManifest.xml $(foreach jar,$(JARS),-I $(jar)) -F $@ build/apk
|
||||||
|
|
||||||
|
build/apk/classes.dex: build/apk/my_classes.jar
|
||||||
|
cd build/apk && ${D8} --min-api ${MIN_API} ../../$^ ${JARS} && cd ../..
|
||||||
|
|
||||||
|
build/apk/my_classes.jar: $(foreach class,$(CLASSES),build/obj/$(CLASSES_PATH)/$(class).class) | build/apk
|
||||||
|
${D8} $(foreach class,$(CLASSES),'build/obj/$(CLASSES_PATH)/$(class).class') --min-api ${MIN_API} --output $@ --no-desugaring
|
||||||
|
|
||||||
|
build/obj/${CLASSES_PATH}/MainActivity.class: src/MainActivity.java | build/obj
|
||||||
|
${JAVAC} -classpath "$(subst $() $(),:,$(JARS))" -d build/obj $^
|
||||||
|
|
||||||
|
build/gen build/obj:
|
||||||
|
mkdir -p $@
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -fr build
|
||||||
|
|
||||||
|
install: build/${BUNDLE_NAME}.apk
|
||||||
|
[ -n "`${ADB} shell pm list packages | grep ^package:${JAVA_PACKAGE_NAME}$`" ] && ${ADB} uninstall ${JAVA_PACKAGE_NAME}; exit 0
|
||||||
|
${ADB} install $^
|
||||||
|
|
||||||
|
.PHONY: all clean install
|
4
templates/android-make/tibia-index.js
Normal file
4
templates/android-make/tibia-index.js
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
module.exports = function (data, api) {
|
||||||
|
api.copyFile(`Makefile`, `Makefile`);
|
||||||
|
api.generateFileFromTemplateFile(`vars.mk`, `vars.mk`, data);
|
||||||
|
};
|
22
templates/android-make/vars.mk
Normal file
22
templates/android-make/vars.mk
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
BUNDLE_NAME := {{=it.product.bundleName}}
|
||||||
|
JAVA_PACKAGE_NAME := {{=it.android.javaPackageName}}
|
||||||
|
|
||||||
|
KEY_STORE := {{=it.android_make.keyStore}}
|
||||||
|
KEY_ALIAS := {{=it.android_make.keyAlias}}
|
||||||
|
STORE_PASS := {{=it.android_make.storePass}}
|
||||||
|
KEY_PASS := {{=it.android_make.keyPass}}
|
||||||
|
|
||||||
|
ANDROID_SDK_DIR := {{=it.android_make.sdkDir}}
|
||||||
|
BUILD_TOOLS_DIR := ${ANDROID_SDK_DIR}/build/tools/{{=it.android_make.buildToolsVersion}}
|
||||||
|
ANDROIDX_DIR := {{=it.android_make.androidxDir}}
|
||||||
|
KOTLIN_DIR := {{=it.android_make.kotlinDir}}
|
||||||
|
|
||||||
|
ANDROID_JAR_FILE := ${ANDROID_SDK_DIR}/platforms/android-{{=it.android_make.androidVersion}}/android.jar
|
||||||
|
ANDROIDX_CORE_FILE := ${ANDROIDX_DIR}/core-{{=it.android_make.androidxCoreVersion}}.jar
|
||||||
|
ANDROIDX_LIFECYCLE_COMMON_FILE := ${ANDROIDX_DIR}/lifecycle-common-{{=it.android_make.androidxLifecycleCommonVersion}}.jar
|
||||||
|
ANDROIDX_VERSIONEDPARCELABLE_FILE := ${ANDROIDX_DIR}/versionedparcelable-{{=it.android_make.androidxVersionedparcelableVersion}}.jar
|
||||||
|
KOTLIN_STDLIB_FILE := ${KOTLIN_DIR}/kotlin-stdlib-{{=it.android_make.kotlinStdlibVersion}}.jar
|
||||||
|
KOTLINX_COROUTINES_CORE_FILE := ${KOTLIN_DIR}/kotlinx-coroutines-core-{{=it.android_make.kotlinxCoroutinesCoreVersion}}.jar
|
||||||
|
KOTLINX_COROUTINES_CORE_JVM_FILE := ${KOTLIN_DIR}/kotlinx-coroutines-core-jvm-{{=it.android_make.kotlinxCoroutinesCoreJVMVersion}}.jar
|
||||||
|
|
||||||
|
HAS_MIDI_IN := {{=it.product.buses.filter(x => x.type == "midi" && x.direction == "input").length > 0 ? "yes" : "no"}}
|
21
templates/android/data/AndroidManifest.xml
Normal file
21
templates/android/data/AndroidManifest.xml
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.orastron.@NAME@">
|
||||||
|
{{?it.product.buses.filter(x => x.type == "audio" && x.direction == "input").length > 0}}
|
||||||
|
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
||||||
|
{{?}}
|
||||||
|
{{?it.product.buses.filter(x => x.type == "midi" && x.direction == "input").length > 0}}
|
||||||
|
<uses-sdk android:minSdkVersion="29" /> <!-- for AMidi -->
|
||||||
|
{{??}}
|
||||||
|
<uses-sdk android:minSdkVersion="26" /> <!-- for androidx core and AAudio -->
|
||||||
|
{{?}}
|
||||||
|
<uses-sdk android:targetSdkVersion="34" />
|
||||||
|
<application android:label="@NAME@">
|
||||||
|
<activity android:name=".MainActivity" android:label="@NAME@" android:exported="true">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
</manifest>
|
86
templates/android/src/MainActivity.java
Normal file
86
templates/android/src/MainActivity.java
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023, 2024 Orastron Srl unipersonale
|
||||||
|
*/
|
||||||
|
|
||||||
|
package {{=it.android.javaPackageName}};
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.webkit.WebView;
|
||||||
|
import android.webkit.WebSettings;
|
||||||
|
import android.webkit.WebChromeClient;
|
||||||
|
import android.webkit.WebViewClient;
|
||||||
|
import android.webkit.JavascriptInterface;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
|
import androidx.core.app.ActivityCompat;
|
||||||
|
|
||||||
|
public class MainActivity extends Activity {
|
||||||
|
/*
|
||||||
|
static {
|
||||||
|
System.loadLibrary("{{=it.android.javaPackageName}}");
|
||||||
|
}
|
||||||
|
|
||||||
|
public native boolean nativeAudioStart();
|
||||||
|
public native void nativeAudioStop();
|
||||||
|
public native float nativeGetParameter(int i);
|
||||||
|
public native void nativeSetParameter(int i, float v);
|
||||||
|
|
||||||
|
private WebView webView;
|
||||||
|
|
||||||
|
public class WebAppInterface {
|
||||||
|
@JavascriptInterface
|
||||||
|
public boolean hasAudioPermission() {
|
||||||
|
return MainActivity.this.checkCallingOrSelfPermission(android.Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
@JavascriptInterface
|
||||||
|
public void requestAudioPermission() {
|
||||||
|
ActivityCompat.requestPermissions(MainActivity.this, new String[] { android.Manifest.permission.RECORD_AUDIO }, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@JavascriptInterface
|
||||||
|
public boolean audioStart() {
|
||||||
|
return nativeAudioStart();
|
||||||
|
}
|
||||||
|
|
||||||
|
@JavascriptInterface
|
||||||
|
public void audioStop() {
|
||||||
|
nativeAudioStop();
|
||||||
|
}
|
||||||
|
|
||||||
|
@JavascriptInterface
|
||||||
|
public float getParameter(int i) {
|
||||||
|
return nativeGetParameter(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
@JavascriptInterface
|
||||||
|
public void setParameter(int i, float v) {
|
||||||
|
nativeSetParameter(i, v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
webView = new WebView(this);
|
||||||
|
setContentView(webView);
|
||||||
|
WebSettings webSettings = webView.getSettings();
|
||||||
|
webSettings.setJavaScriptEnabled(true);
|
||||||
|
webView.setWebChromeClient(new WebChromeClient());
|
||||||
|
webView.setWebViewClient(new WebViewClient());
|
||||||
|
webSettings.setDomStorageEnabled(true);
|
||||||
|
webView.addJavascriptInterface(new WebAppInterface(), "Android");
|
||||||
|
//webView.loadUrl("file:///android_asset/index.html");
|
||||||
|
webView.loadUrl("https://www.orastron.com/");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@Override
|
||||||
|
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
|
||||||
|
if (grantResults.length > 0)
|
||||||
|
webView.loadUrl("javascript:gotAudioPermission()");
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
7
templates/android/tibia-index.js
Normal file
7
templates/android/tibia-index.js
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
var path = require("path");
|
||||||
|
var sep = path.sep;
|
||||||
|
|
||||||
|
module.exports = function (data, api) {
|
||||||
|
api.generateFileFromTemplateFile(`data${sep}AndroidManifest.xml`, `data${sep}AndroidManifest.xml`, data);
|
||||||
|
api.generateFileFromTemplateFile(`src${sep}MainActivity.java`, `src${sep}MainActivity.java`, data);
|
||||||
|
};
|
19
test/android-make.json
Normal file
19
test/android-make.json
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"android_make": {
|
||||||
|
"keyStore": "keystore.jks",
|
||||||
|
"keyAlias": "androidkey",
|
||||||
|
"storePass": "android",
|
||||||
|
"keyPass": "android",
|
||||||
|
"sdkDir": "${HOME}/Android/Sdk",
|
||||||
|
"buildToolsVersion": "34.0.0",
|
||||||
|
"androidxDir": "{HOME}/Android/androidx",
|
||||||
|
"kotlinDir": "${HOME}/Android/kotlin",
|
||||||
|
"androidVersion": "34",
|
||||||
|
"androidxCoreVersion": "1.10.1",
|
||||||
|
"androidxLifecycleCommonVersion": "2.6.1",
|
||||||
|
"androidxVersionedparcelableVersion": "1.1.1",
|
||||||
|
"kotlinStdlibVersion": "1.9.0",
|
||||||
|
"kotlinxCoroutinesCoreVersion": "1.7.3",
|
||||||
|
"kotlinxCoroutinesCoreJVMVersion": "1.7.3"
|
||||||
|
}
|
||||||
|
}
|
5
test/android.json
Normal file
5
test/android.json
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"android": {
|
||||||
|
"javaPackageName": "com.example.tibia_test"
|
||||||
|
}
|
||||||
|
}
|
BIN
test/keystore.jks
Normal file
BIN
test/keystore.jks
Normal file
Binary file not shown.
@ -13,3 +13,7 @@ $dir/../tibia $dir/product.json,$dir/company.json $dir/../templates/web $dir/../
|
|||||||
$dir/../tibia $dir/product.json,$dir/company.json $dir/../templates/web-make $dir/../out/web
|
$dir/../tibia $dir/product.json,$dir/company.json $dir/../templates/web-make $dir/../out/web
|
||||||
$dir/../tibia $dir/product.json,$dir/company.json $dir/../templates/web-demo $dir/../out/web
|
$dir/../tibia $dir/product.json,$dir/company.json $dir/../templates/web-demo $dir/../out/web
|
||||||
cp $dir/plugin.h $dir/../out/web/src
|
cp $dir/plugin.h $dir/../out/web/src
|
||||||
|
|
||||||
|
$dir/../tibia $dir/product.json,$dir/company.json,$dir/android.json $dir/../templates/android $dir/../out/android
|
||||||
|
$dir/../tibia $dir/product.json,$dir/company.json,$dir/android.json,$dir/android-make.json $dir/../templates/android-make $dir/../out/android
|
||||||
|
cp $dir/keystore.jks $dir/../out/android
|
||||||
|
Loading…
Reference in New Issue
Block a user