Repository navigation
Releases: Kaedo17/effectcraft-mobile
Release list
EffectCraft 0.10.0 Android arm64 (nightly)
Nightly 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.
EffectCraft 0.10.0 Android arm64 (nightly)
Nightly build of the EffectCraft Android (arm64) port with the physical keyboard and mouse input 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.
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 (Galaxy Tab S9 FE+, Android 16): 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.
Notes
- Known, pre-existing and unrelated: if the display times out while the app is in the foreground, Android 16's activity teardown can hit an
android-activityglue deadlock (on_destroy) and show the system's "isn't responding" dialog. The identical stack is recorded for v0.9.2 on this device; relaunching recovers, and the auto-save recovery dialog protects unsaved work. - APK is debug-keystore signed (sideload install):
effectcraft.apk, 31.4 MB.
EffectCraft 0.8.0 Android arm64 (dev preview 3)
Adds an in-app folder browser: Save/Export prompts get a Location picker (enter folders, create new ones), and Preferences ▸ Project's auto-save folder now works.
- arm64-v8a, minSdk 28, targetSdk 35; sideload only (debug keystore)
- Still unavailable: media import, system (SAF) folder picker
EffectCraft 0.8.0 Android arm64 (dev preview 2)
Save, Open Project and export now work: app-private storage prompts (Projects/, Exports/), settings and auto-save persist across launches.
- arm64-v8a, minSdk 28, targetSdk 35; sideload only (debug keystore)
- Still unavailable: media import, system folder picker
EffectCraft 0.8.0 Android arm64 (dev preview 1)
First runnable Android build — verified on a Galaxy Tab S11 (open, create project).
- arm64-v8a, minSdk 28, targetSdk 35
- Signed with a throwaway debug keystore: sideload only, do not distribute
- Known gap: Save/Open do nothing on Android yet (no file dialogs in v1)
EffectCraft 0.10.0 Android arm64
First Latest (non-nightly) Android build. Synced with the source repo: the port now sits on upstream 05955c08 (EffectCraft 0.10.0).
What's new since v0.9.2-android.2 (the previous Latest)
- List / Small / Medium / Large views in the in-app file picker, in both the file browser and the Open Project prompt (from nightly v0.9.2-android.5). Icon views show thumbnails: a decoded frame for media, the project's stored thumbnail for
.ecprojtiles, folder icons, and an extension label when nothing decodes. The picker's View toolbar switches views andgeneral.pickerViewremembers the choice (default: Large). Folders sort first; the status toast now takes the location row, so the footer buttons never get pushed below the scroll clip. - UI Scale now goes down to 50 % (was 75 %) — Settings ▸ Appearance, dragged or typed.
- Preview playback no longer freezes while the sound plays on (nightly v0.9.2-android.4): cpal's AAudio backend reports latencies from two different clocks; an uptime-sized value no device outputs is now dropped and A/V syncs to the callback buffer alone.
- Touch scrolling and tap targets across panels (nightly v0.9.2-android.3+): wider drag hit targets and finger-drag scrolling — mouse users get the larger targets too.
- Exports keep their colors on re-import (all platforms): video sample entries are now tagged with the BT.709 limited-range
colrbox the encoders actually produce.
Verified on Samsung Tab S11
- UI Scale at 50 %: the whole interface renders correctly and stays tappable (checked by screenshot), restored to the device's saved 80 % afterwards
- File picker: all four views in both dialogs, thumbnails, folder navigation, selection, and the persisted view choice (detailed in the nightly notes)
cargo xtask cigreen on this branch (desktop Linux suite, 190+)
APK is signed with the standard Android debug keystore (same as all previous Android builds).
EffectCraft 0.9.2 Android arm64 (nightly)
Nightly build of the Android port at 04f0228b (branch feat/file-picker-view-modes).
Features since v0.9.2-android.4
- List / Small / Medium / Large views in the in-app file picker, in both the file browser and the Open Project prompt. Icon views show thumbnails: a decoded frame for media, the project's stored thumbnail for
.ecprojtiles, folder icons, and an extension label when nothing decodes (the Media Browser's decode budget — two per frame, cached per path — is now shared throughpanels/thumbs.rs). - The picker's own View toolbar switches views and
general.pickerViewremembers the choice across dialogs (default: Large). Folders sort first; tiles show 14 / 18 / 24 characters of name; the rows are the original dialog unchanged. - The status toast now takes the location row instead of adding one, so the footer buttons never get pushed below the scroll clip (the footer-after-toast regression test covers exactly that).
Verified on Samsung Tab S11
- All four views switch in both dialogs; default Large; the choice persists across closing and reopening a dialog
- Thumbnails render for camera/screenshot images, stored project thumbnails and folders;
.jsonfiles fall back to an extension label - Folder navigation, Up (hidden at the root), empty folders, selection checkmark with a "1 selected" status
- "Select at least one file." toast replaces the location row and the footer stays tappable afterwards
cargo xtask cigreen (layers, assets, 190 test suites, wasm)
APK is signed with the standard Android debug keystore (same as previous nightlies).
EffectCraft 0.9.2 Android arm64 (nightly)
Nightly build of the Android port at b2094049 (branch android/arm64-port).
Fixes since v0.9.2-android.3
- Preview playback no longer freezes while the sound plays on. The picture is driven by the audio clock, which subtracts the device's reported output latency — but cpal's AAudio backend (Android) builds its two stream timestamps from different clocks (playback: CLOCK_MONOTONIC since boot; callback: since the stream was created), so the difference was the tablet's uptime (~10.9 days on the test device). The clock never advanced past the preview's first frame and the viewer froze, while audio kept playing. Latencies no device reports are now dropped and A/V syncs to the callback buffer alone. Scrubbing, export and the frame cache were never affected.
Verified on Samsung Tab S11
- Preview plays picture + sound in real time (2556-frame comp, all cached)
- Logcat shows the broken latency detected and dropped once
- Scrubbing smooth, no crashes
APK is signed with the standard Android debug keystore (same as previous nightlies).
EffectCraft 0.9.2 Android arm64 (nightly)
Nightly build from android/arm64-port (18f95af8).
Fixed
- #1 — Right sidebar panels and the timeline layer list can now be scrolled by touch.
- A drag over a panel's own empty space scrolls it (the panels had only wheel/trackpad input before).
- Scroll bars grew from a 10-point hit to a 20-point touch target — this is how the timeline layer list scrolls by touch, so the marquee and layer-reorder drags there are untouched.
- Panel scroll drags are inset from panel edges so the dock's resize gutters keep every press that aims at a divider.
Verified on device
Samsung Tab S11, demo project:
- Effects & Presets list scrolls by dragging its scroll bar.
- Timeline layer list (18 rows overflowing a 16-row view) scrolls to reveal the hidden rows.
- No crashes or panics in logcat during the session.
APK is signed with the standard Android debug key, minSdk 28, arm64.
EffectCraft 0.9.2 Android arm64
EffectCraft 0.9.2 with an Android build, rebased onto current upstream. This replaces the earlier v0.9.2-android.1 prerelease: the branch has been rebased onto the latest storytold/effectcraft main, so it now carries 284 upstream commits on top of the 0.9.2 release — including the command-line parsing rewrite, the new Delete Template prompt and their fix for interface symbols reporting as missing glyphs.
Everything a file dialog does on the desktop now does on the phone.
New since the 0.8.0 previews
- Shared storage. The in-app browser can reach
/storage/emulated/0as a second root, alongside the app-private one, with a switcher between them. Android never grants that silently, so the app checks whether All files access is held and opens the system settings page where you toggle it, then asks again. Without the grant everything still works, inside the app-private directory. Neither root can be escaped: entries are only ever chosen from listings, never typed, and "Up" stops at the root's own top. - Media import. Picking footage now goes through the same browser, so a file anywhere on the device can come into a project.
- A launcher icon, in EffectCraft's own artwork at five densities. The APK used to install as a blank tile.
- Menus scroll by dragging. On a phone in landscape the Edit menu has 34 rows and room for 21. A finger drag did nothing at all, so Select All, Deselect All, Label, Purge, Edit Original, Templates, Keyboard Shortcuts and Preferences were simply unreachable. Measured on a Redmi 2311DRK48G: an 850 pt drag on the old build left the menu byte-for-byte unchanged, and on this build the same drag walks it from "Can't Undo" down to "Preferences" and back.
- Folder picks work (Settings ▸ Project ▸ auto-save location…), and the browser's buttons and its error messages are legible on a small screen: one of them was writing into a toast painted behind the modal it belonged to, so "Could not create the folder: …" read as nothing happening.
- Colour survives a round trip. Our MP4s carried no
colrbox, so re-importing our own output picked the container's resolution-based default matrix and shifted the picture — pure red came back as[232, 0, 1]. H.264, HEVC and AV1 sample entries are now tagged BT.709 limited-range.
Notes
- arm64-v8a, minSdk 28 (Android 9), targetSdk 35, landscape; signed with a debug keystore, so sideload only — do not distribute
- There is no system file picker on Android (rfd has no backend there); the app's own dialogs stand in for it, writing to
Projects/,Exports/andconfig/under its private storage - This is the desktop UI at phone size, not a layout designed for a small screen — expect panels to be cramped, and please report what gets in the way
- Building it:
cargo apk build --release - Verified on hardware: installs, boots into a restored project, and menus, the timeline and the file browser all render. The drag-to-scroll fix is covered by a unit test; the phone it was measured on was offline at release time, so this build has not had a fresh on-device drag pass.
Supersedes v0.9.2-android.1, and with it the 0.8.0 previews, which stay up for reference.