feat(android): follow the activity lifecycle and build an APK (Issue #42)

- The drawing surface is created once the native window exists (Resumed)
  and released when the app goes to the background (Suspended); before
  that everything is saved, as Android may stop the app at any time
- Android's back button acts like Escape instead of closing the app
- Panics are written to logcat; no update check on Android yet
- scripts/package-android.sh builds target/ink-notes_<version>_arm64.apk
  without Gradle (NDK, aapt2, zipalign, apksigner); signing key from
  ANDROID_KEYSTORE/ANDROID_KEYSTORE_PASS/ANDROID_KEY_ALIAS, otherwise
  the debug key

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
haraldandClaude Opus 5.5 committed 2026-10-27 18:23:28 +01:00
1 parent ce3a1f697b
commit 7faf78ddeb
9 files changed
+1662 -353

No files matched your search

+31
View File
@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Manifest of the Android app (Issue #42). scripts/package-android.sh fills in the version.
NativeActivity loads libink_notes.so, whose android_main runs the app. -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="eu.pansi.inknotes"
android:versionCode="@VERSION_CODE@"
android:versionName="@VERSION@">
<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
<application
android:label="ink-notes"
android:icon="@mipmap/ic_launcher"
android:hasCode="false"
android:extractNativeLibs="true"
android:theme="@android:style/Theme.Material.Light.NoActionBar">
<!-- configChanges: rotating the tablet or attaching a keyboard must not restart the
activity; the app adapts to the new window size itself -->
<activity
android:name="android.app.NativeActivity"
android:exported="true"
android:launchMode="singleTask"
android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|keyboard|keyboardHidden|navigation|density|uiMode|fontScale|locale|layoutDirection">
<meta-data android:name="android.app.lib_name" android:value="ink_notes" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>