Two Java classes (MainActivity, NotificationService) hand their lifecycle to a new android-shell crate built on client-core; client-core gains notifications.rs (the /notifications SSE parse and attention_line, ported from Notifications.kt). Packaged as a new app/shellApp Gradle module rather than a rewrite of app/androidApp in place, so that module's working Compose UI is untouched. Both pass conditions held on the emulator: a notification arrived in Android's drawer with the app closed, and a shared text share landed as a real message in a sandbox session's transcript. Found and fixed three real bugs along the way (a silently-wrong JNI signature from a generic JObject parameter, a class-by-name lookup failing on this crate's own background thread for lack of an app ClassLoader, and onStartCommand opening two /notifications connections per enrollment -- the last a latent bug in Notifications.kt itself). Full account, exact commands and what was deliberately cut are in RUST.md's E3 box. Co-Authored-By: Claude Sonnet <noreply@anthropic.com>
37 lines
1.5 KiB
TOML
37 lines
1.5 KiB
TOML
[package]
|
|
name = "android-shell"
|
|
version = "0.1.0"
|
|
edition = "2024"
|
|
|
|
# The JNI bridge behind E3's two Java stub classes (`MainActivity`,
|
|
# `NotificationService` -- see RUST.md's "How much Java is unavoidable" for
|
|
# why those two classes cannot be anything but Java/Kotlin, registered from
|
|
# the manifest by name). Everything they would otherwise have done in
|
|
# Kotlin -- the SSE follow loop, deciding where a notification is shown,
|
|
# picking a session for a share -- is here instead, built on `client-core`
|
|
# so the networking and parsing are not duplicated a third time next to the
|
|
# server and the Kotlin app.
|
|
#
|
|
# `cdylib` for `System.loadLibrary`; `lib` too so `cargo test`/`clippy` run
|
|
# on a normal host target without an Android NDK toolchain, the same
|
|
# posture `client-core` and `server` already have.
|
|
|
|
[lib]
|
|
name = "android_shell"
|
|
crate-type = ["cdylib", "lib"]
|
|
|
|
[dependencies]
|
|
client-core = { path = "../client-core" }
|
|
jni = "0.22"
|
|
log = "0.4"
|
|
|
|
# `LogErrorAndDefault` (the `native_method!` error policy this crate uses
|
|
# throughout, see lib.rs) logs through the `log` facade, which is a no-op
|
|
# without a backend installed -- so without this, every recoverable error
|
|
# at a native entry point would be silently dropped rather than reaching
|
|
# logcat. Android-only: nothing else here needs it, and it does not build
|
|
# off-device (see `notify::ensure_logger`'s call site, the only place this
|
|
# is used).
|
|
[target.'cfg(target_os = "android")'.dependencies]
|
|
android_logger = "0.15"
|