The release job now waits for the android job, takes its APK, lists it in
SHA256SUMS.txt and uploads it as a release asset. The android job is no
longer optional. README describes installing the APK.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- scripts/setup-android-sdk.sh installs fixed versions of the Android
command-line tools (checksum verified), platform 34, build-tools
34.0.0 and NDK 28.2
- packaging/android/Containerfile + scripts/build-apk-container.sh build
the APK in a container (podman or docker) with JDK 17 and Rust 1.99
- New CI job "Android APK (experimental)": builds the APK and keeps it
as a workflow artifact, signed with the key from the secrets
ANDROID_KEYSTORE_B64/ANDROID_KEYSTORE_PASS/ANDROID_KEY_ALIAS if set.
Not part of the release yet; its failure doesn't block the release.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
InkActivity extends NativeActivity:
- An invisible view with its own input connection receives the soft
keyboard's text (commitText, deleteSurroundingText), so characters
without a key event (umlauts by long press, ...) arrive as well. The
field is a visible-password field, so keyboards commit each character
instead of composing words.
- Import and "insert image" open the system file dialog
(ACTION_OPEN_DOCUMENT); the chosen file is copied to the cache folder
and handed to Rust by path.
src/android_bridge.rs calls the activity through JNI and receives its
native calls; package-android.sh compiles the class with javac and d8.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 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>
Shared groundwork:
- paths.rs: folders for data, settings and downloads per system (Linux XDG
unchanged, Windows %APPDATA%/%LOCALAPPDATA%, Android app folder)
- Linux-only parts behind cfg: Wayland on-screen keyboard (osk/wayland.rs),
display backend and app id, the vendored winit touch extensions
- run_with(event_loop) so that other entry points can start the app
Windows (#48):
- cross-compiled with MinGW into a portable ink-notes_<version>_x86_64.exe
(system DLLs only), no console window in release builds
- file picker: user folders and drives; held notebook locks are detected
(ERROR_LOCK_VIOLATION)
- updater: replaces the running .exe via rename, active at the next start
- octotablet panicking without the Tablet PC components no longer crashes
the app
- release: .exe built in CI and part of the signed checksums
- all library tests pass under wine
Android (#42):
- android_main entry point, winit with android-native-activity,
android_logger; octotablet and arboard left out there
- cargo check and the cdylib build for aarch64-linux-android pass; the window
surface does not follow the activity lifecycle yet
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
README, ARCHITECTURE.md und FILE_FORMAT.md beschreiben jetzt alle
Funktionen bis v0.11 (Text, Bilder, PDF-Import, Seitenformate, Lineal,
durchgehendes Scrollen, Musterfarben, Dateiformat-Version 8). Werbliche
Formulierungen durch überprüfbare Angaben ersetzt, auch in Paket-
beschreibung, Desktop-Datei, AppStream-Metadaten und Release-Notizen.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Der Signaturschlüssel wurde mit `rsign generate -W` erzeugt und ist mit
leerem Passwort verschlüsselt; das minisign-CLI aus Ubuntu (0.11) verlangt
dafür ein Terminal und brach in der CI mit "Error while loading the secret
key file" ab.
- Workflow installiert rsign2 0.6.7 (ohne -D warnings) statt minisign
- build-release.sh signiert und verifiziert mit rsign; da rsign bei falscher
Key-ID mit Exit-Code 0 endet, wird zusätzlich die Erfolgsmeldung geprüft
- README: Signierwerkzeug und Fallstrick dokumentiert
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- updater.rs: rustfmt-konforme Formatierung des öffentlichen Schlüssels
(cargo fmt --check ließ die Release-Pipeline scheitern)
- storage.rs: test_io_error_* simuliert den I/O-Fehler über ein Verzeichnis
statt chmod 000, damit er auch als root (CI-Runner) greift
- build-release.sh: findet den öffentlichen Schlüssel auch, wenn rustfmt ihn
in die Folgezeile umbricht
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Konfliktlösung: Speicher-Architektur des Branches (Formatversionierung,
Papierkorb, Backups, Instance-Lock, robuster Autosave) übernommen und die
dort fehlenden Korrekturen aus main darauf übertragen:
- Autosave gleicht das Manifest bei jeder Änderung mit dem Notizbuch ab
(mark_dirty); per Taste N/Bild-ab angelegte Seiten gingen sonst nach
einem Neustart verloren
- Start öffnet keine beschädigten Notizbücher automatisch und verwendet den
Ordner eines nicht ladbaren Notizbuchs nicht wieder
- PDF-Export lädt nicht geöffnete Seiten nach (load_all_pages), verweigert
unvollständige Exporte und meldet das echte Ergebnis an die UI
- Cargo.toml: minisign-verify und fs2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- SHA256SUMS.txt muss mit dem eingebauten Minisign-Schlüssel
(UPDATE_SIGNING_PUBLIC_KEY) signiert sein; fehlende oder ungültige
Signaturen und Versionen ohne Schlüssel lehnen Updates ab
- Prüfsummen und Signatur werden vor dem Paket geladen und geprüft
- build-release.sh signiert mit MINISIGN_SECRET_KEY und prüft, dass der
Schlüssel zum eingebauten öffentlichen Schlüssel passt; in der CI ist die
Signatur Pflicht
- publish-gitea-release.sh lädt SHA256SUMS.txt.minisig hoch
- README: Einrichtung des Schlüsselpaars dokumentiert
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>