Repository navigation
EffectCraft 0.10.0 Android arm64 (nightly)
Pre-releaseNightly build of the EffectCraft Android (arm64) port: physical keyboard and mouse input, plus the startup-flash fix.
What's fixed
Keyboard chords work at last. winit's Android backend ignores the meta state Android carries on every key event and never emits the ModifiersChanged event egui learns Ctrl/Shift/Alt from, so egui's modifiers were always empty and no chord — Undo, Save, the panel shortcuts, Preferences — could match, and a chord's letter degenerated into its plain-key binding. The app now tracks the modifier keys from the key events themselves and stamps them onto each frame's events (stamp_android_modifiers in ui-egui, ported from FilmCraft's hardware-validated fix). Wheel and click events carry the held modifiers too.
A mouse is usable. The same backend dropped every non-touch motion event (upstream's branch is literally // TODO mouse events): no hover, no scroll wheel, no right/middle button. winit 0.30.13 is vendored (third_party/winit) with that one Android file filled in — mouse and trackpad pointers now produce MouseWheel, MouseInput and cursor-move/enter/leave events; touch and touch-dragged stylus input is untouched, and every other target compiles the published crate byte for byte.
No more home-screen flash at startup. When the display sleeps, OneUI flips the activity config — the Bluetooth keyboard dropping produces a KEYBOARD | KEYBOARD_HIDDEN | NAVIGATION change (mask 0x70) — and bits the activity didn't declare forced Android to relaunch the NativeActivity. Every relaunch then deadlocked in the android-activity glue (main thread stuck in onDestroy -> unloadNativeCode while the native event-loop thread sleeps on in its looper), input dispatch timed out into an ANR, and the system's restart choreography flashed the launcher before the app recovered: the "tap icon → home flashes once → black screen" sequence. The activity holds no Java resources, so it now declares the standard exhaustive game-app configChanges set and absorbs the flip in place — no relaunch, no deadlock, no flash. (The glue bug itself is upstream and pre-existing: the byte-identical stack sits in this device's dropbox for v0.9.2, before any of the input work.)
Verification
- 7 new host tests cover the modifier stamping; full workspace CI green (
fmt,clippy -D warnings, 3257 + 212 tests, layers / assets / wasm / pdf-deps gates). - On device: an injected
Ctrl+Alt+;opens Settings; the bare;key opens nothing. Before this build the chord arrived as a bare key and matched nothing. - A physical mouse verified on-device: wheel scrolling, right-click and hover/cursor movement all register — the exact events the stock backend used to drop.
- Startup-flash repro closed: display off 3 min → wake → icon tap. The 0x70 config flip fires with no
am_relaunch, the task openshasConfigChanged=false,onTop=truelands 6 ms after the transition, and frame-extracted screen recording shows icon → fully rendered app in ~400 ms with zero ANR lines, no launcher flash and no black screen. Before the fix the same cycle reproduced theon_destroy+648deadlock and a 10 s input-timeout ANR on every run.
Notes
- APK is debug-keystore signed (sideload install):
effectcraft.apk, 31.4 MB. - The
android-activityglue deadlock remains an upstream bug; this build removes the only trigger observed on this device (the sleep/wake keyboard config flip). If a relaunch ever comes from another source, relaunching recovers and the auto-save recovery dialog protects unsaved work.