Skip to content

Zdroid 0.3.1

Choose a tag to compare

@Dylanmurzello Dylanmurzello released this 19 May 00:58
· 345 commits to main since this release

Install

Download Zdroid-0.3.1.apk below and open it on your Android device. Allow "install from unknown sources" when prompted, then tap the Zdroid icon.

For dev iteration: adb install -r Zdroid-0.3.1.apk.

In-place upgrade over v0.2.x and v0.3.0 (same signing cert). Auto-update from a working v0.3.0 build (the one currently on this releases page) will pull this version automatically. If your v0.3.0 install was the very first build that shipped on 2026-05-18, its updater has the FileProvider path bug and can't reach this release. Sideload Zdroid-0.3.1.apk once; subsequent updates will be auto.

What's new

  • Android Input onboarding section. The first-run onboarding now exposes a dedicated row for the three touch-input toggles (Soft Keyboard, Programming Keys Row, Virtual Trackpad), each rendered as an icon + label + on/off switch. Replaces the Zed AI agent setup row on Android, which surfaced sign-in buttons for a feature path the port doesn't support yet. The Settings panel still has the full Android Input page; this is purely a discoverability surface so new users see the touch-mode controls during setup.

Fixes

  • CursorSurfaceControl release race. setStyle(STYLE_ARROW) schedules an 80 ms debounced runnable to suppress the Arrow flicker that gpui's cursor_style emits during clicks. If pointer capture was lost during those 80 ms (settings window opening, focus change), MainActivity.onPointerCaptureChanged would call CursorSurfaceControl.release(), tearing down the underlying SurfaceControl. The 80 ms timer then fired its deferred move(), which threw IllegalStateException: Invalid usage after release of Surface(name=zdroid_cursor_overlay) and crashed the main thread. Repro was reliable on the S9 Ultra during onboarding navigation. Fix: a released flag now guards every public mutator (move, setStyle, setVisible) plus the debounced runnable body, and release() calls Handler.removeCallbacks on any pending Arrow transition before tearing the SurfaceControl down. Two layers of protection because a late JNI dispatch from gpui after release could still race the cancel.

  • Virtual trackpad cursor accumulated ghost travel past window edges. The Rust trackpad state machine in touch.rs updated self.cursor.x / self.cursor.y unbounded on every swipe; Kotlin's setTrackpadCursorPosition clamped the displayed sprite to [0, width-1] but Rust's internal state kept growing past width. Result: pushing the cursor past the right edge banked overshoot inside Rust, and you had to swipe back the exact same overshoot distance before the sprite visibly moved off the edge. Asymmetric visual look (sprite "vanishes" off the right but "hugs" the left) was the Arrow cursor's top-left hot-spot: at the right edge, the sprite body extends ~sprite_size past the screen and gets clipped by SurfaceFlinger; at the left edge, the body extends into the visible region so the cursor stays fully drawn. Fix: clamp self.cursor to [0, bounds] in logical pixels after every delta, with bounds piped through from AndroidWindowState.bounds.size via the dispatch wrappers.

Caveats

  • First install (or after a clean uninstall) needs you to grant "Install unknown apps" for Zdroid in Android Settings so the in-app updater can hand future APKs to the system installer.
  • Floating-mode Gboard support is unfinished: the programming keys row stays anchored at the screen bottom and won't follow a detached IME. Toggle android_input.programming_extras_row off if you use floating mode.
  • The "Please update Zed to Collaborate" badge in the title bar calls auto_update::check directly instead of dispatching the action, so it still surfaces upstream's package-manager prompt. Use the Zdroid menu's Check for Updates entry.

Verification

  • APK SHA-256: f18f6cb5434d18dae033034484dc44b97e09067e0b7b11d95c11ac3a4c9b5216
  • Signing cert SHA-256: 25:68:A2:A3:81:2D:8B:C3:A4:E8:E7:56:68:5C:5C:F7:25:40:EA:A2:94:37:F4:C1:25:8A:0C:81:73:BF:AB:4E (same as v0.2.x / v0.3.0)
  • Built from commit 2e11ed91ca
  • versionCode 11, versionName "0.3.1"
  • Bootstrap: bootstrap-2026.05.06-r2