Items 1-3 of Iris's 22:16 phone report, plus the two defects that were hiding behind item 1 and only became visible once the first one was fixed. Emulator evidence and the numbers are in docs/RUST.md. **Keyboard reopen.** `attr.rs`'s already-focused branch calls `focus_gained` on a tap that stays inside `DRAG_SLOP` -- what Android's own `EditText` does, `showSoftInput` being idempotent. Dismissing the IME leaves the field focused, so the only branch that requested it never ran again. Negative control run: without this one call the second tap leaves `mInputShown=false`. Swipes across and out of the focused field still summon nothing. **IME height.** `MainActivity` sends `getInsets(ime()).bottom` and `isVisible(ime())` as two values; the height used to be sent *as* the boolean, so nothing had a number to pad by. `Insets`/`WindowInsets` carry both, `bench_client` reads the boolean for its state machine and the height for `Composer::set_bottom_inset`, and the list follows because it is `rest(1)` in the same `Span`. **Fling.** Three defects, in the order they were found: 1. `on_touch_event` read only each `MotionEvent`'s final position, so a batched 120Hz flick fed the tracker one sample and `velocity()` answered 0.0. Historical samples are replayed through the sensor pass now, `CursorState::time` carries each sample's own time (so a replay loop's speed cannot become the measured velocity -- the winit backend sets it too), the press is a sample as AOSP's own tracker does, and `iris drag release:` logs the decision for the phone's logcat. 2. Nothing advanced a fling between input events: `tick_fling`'s only caller was the benchmark's own loop, so the bench flung and a finger never did. iris has one animation mechanism now -- `Widget::tick`, `UiData::animate`/`tick_animations`, called by both backends before the draw and re-requesting a frame while it answers true. 3. With flings finally animating, one lasted 45 seconds: `List::fling` hardcoded density 1.0 against physical-pixel velocities, and `FlingCalculator`'s coefficient used the scroll friction where AOSP uses its 0.84 tuning constant -- 56x, inside an exponential. Emulator: 1.62s for v=11064, against AOSP's own 1.586s. **Two pre-existing faults found on the way.** `MOVE_CHAIN_LIMIT` was 16 and the composer's chain is 17, so every debug build aborted on a tap of the composer and every release build silently drew and hit-tested that subtree short; it is 64 in both the CPU walk and shader.wgsl, and the assert prints the chain so a cycle and a deep tree can be told apart. And `minSdk` is 29, since `getEventTimeNanos` is API 29 and a missing JNI method is a crash rather than a degraded fling. Every new invariant carries its guard: sample times non-decreasing in `on_touch_event`, and tests confirmed to fail without their fix for the press-seeded velocity, the animation registration and the AOSP magnitudes. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
124 lines
5.5 KiB
TOML
124 lines
5.5 KiB
TOML
[package]
|
|
name = "iris"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
|
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
|
|
|
[dependencies]
|
|
iris-core = { workspace = true }
|
|
iris-macro = { workspace = true }
|
|
parley = { workspace = true }
|
|
swash = { workspace = true }
|
|
pollster = { workspace = true }
|
|
wgpu = { workspace = true }
|
|
image = { workspace = true }
|
|
accesskit = { workspace = true }
|
|
tokio = { workspace = true, features = ["sync", "rt", "rt-multi-thread"] }
|
|
# For diagnostics visible through android_logger (or whatever logger the
|
|
# app crate installs) -- this crate never installs one itself. Not in the
|
|
# android-only block below any more: the lines that matter most are in
|
|
# shared widget code, which the host backend compiles too.
|
|
log = "0.4.28"
|
|
|
|
# winit everywhere except Android; android-view (below) is what stands in
|
|
# for it there. Both backends live in this crate (see `src/android/mod.rs`'s
|
|
# doc comment) but are never compiled together: winit's own Android support
|
|
# pulls in `android-activity`, which panics at compile time unless one of
|
|
# its own backend features is picked, and picking one is exactly what
|
|
# `iris-core` was kept free of (RUST.md's I0b). Confirmed by trying it
|
|
# 2026-09-05: `cargo ndk -t x86_64 -P 26 build -p iris` failed inside
|
|
# `android-activity` itself with "Either game-activity or native-activity
|
|
# must be enabled" before this split existed.
|
|
[target.'cfg(not(target_os = "android"))'.dependencies]
|
|
winit = { workspace = true }
|
|
arboard = { workspace = true, features = ["wayland-data-control"] }
|
|
# I4 (RUST.md): the desktop half of the AccessKit push, `winit`'s own
|
|
# adapter over `accesskit`. No pin needed the way android-view's rev is
|
|
# pinned -- this is an ordinary crates.io release with no local abort to
|
|
# track (that finding is Android-only, see below).
|
|
accesskit_winit = "0.34.0"
|
|
|
|
# Pinned to the exact commit RUST.md's E1 (2026-09-04) measured on this
|
|
# emulator -- real Vulkan rendering, a working `InputConnection`, and the
|
|
# accesskit-detach abort, all against this rev specifically. Advancing it
|
|
# wants re-running E1's checks, the same reason the nightly toolchain pin
|
|
# is dated rather than floating.
|
|
[target.'cfg(target_os = "android")'.dependencies]
|
|
android-view = { git = "https://github.com/rust-mobile/android-view.git", rev = "bec6c62a96cef8239b0fd7fedeef9b184d02e3a1" }
|
|
# I4 (RUST.md): the Android half of the AccessKit push, over android-view's
|
|
# `AccessibilityNodeProvider`. **0.8.0 carries the same detach-abort E1
|
|
# found on 0.4.0** (the `State` enum still never returns to `Inactive`,
|
|
# and `send_completed_event` still unwraps a Java exception) -- advancing
|
|
# the version is not the fix, so pinning to a specific rev buys nothing
|
|
# here the way it does for android-view itself. `android/view.rs`'s
|
|
# `raise_if_enabled` is the mitigation, carried from E1.
|
|
accesskit_android = "0.8.0"
|
|
# Not re-exported by android-view (only `jni` and `ndk` are), and needed
|
|
# for `android/insets.rs`'s own id -> state map -- the same reason
|
|
# android-view's own `PEER_MAP` carries one.
|
|
send_wrapper = "0.6.0"
|
|
|
|
[features]
|
|
# RUST.md's I5 "Where iris's frame time goes" diagnosis: forces the Android
|
|
# `wgpu::Instance` to `Backends::GL` instead of `Backends::PRIMARY`, so the
|
|
# same build can be measured against SwiftShader's software Vulkan ICD (the
|
|
# default) or virgl's GLES path, without a second env-var plumbing path that
|
|
# nothing on this machine can hand to an already-launched Android process
|
|
# (there is no `am start` environment and no system-property reader here to
|
|
# add one). Read by `android/render.rs` and, so the GLES path can be
|
|
# reproduced on a machine with a real GPU rather than only in the emulator,
|
|
# by `default/render.rs`:
|
|
# ./run-headless.sh transcript --shot /tmp/x.png -- -p transcript-ui \
|
|
# --features iris/force-gles
|
|
force-gles = []
|
|
|
|
[dev-dependencies]
|
|
tokio = { workspace = true, features = ["sync", "rt", "rt-multi-thread", "time"] }
|
|
# The tabs example's widget tree. A dev-dependency cycle back to this
|
|
# package is fine -- cargo excludes dev-dependencies from the graph used
|
|
# to build the library itself, so this only matters for `--examples`.
|
|
tabs-ui = { path = "tabs-ui" }
|
|
|
|
# Plain Instant-timed binaries, not criterion -- see benches/message_list.rs's
|
|
# header for why. `harness = false` opts out of the unstable `#[bench]`
|
|
# test-crate harness cargo would otherwise want, in favour of an ordinary
|
|
# `fn main()`.
|
|
[[bench]]
|
|
name = "message_list"
|
|
harness = false
|
|
|
|
[workspace]
|
|
members = ["core", "macro", "tabs-ui", "transcript-ui", "desktop-app"]
|
|
# android-app pulls in android-view, which needs the NDK sysroot to link
|
|
# -- excluded so `cargo build --workspace --all-targets` on the host stays
|
|
# buildable. Cross-compile it from its own directory (its own single-crate
|
|
# workspace, since it has no `[workspace]` table of its own and this
|
|
# exclusion stops it inheriting this one): `cd android-app && cargo ndk
|
|
# -t x86_64 -P 29 build`.
|
|
exclude = ["android-app"]
|
|
|
|
[workspace.package]
|
|
version = "0.1.0"
|
|
edition = "2024"
|
|
|
|
[workspace.dependencies]
|
|
pollster = "0.4.0"
|
|
winit = "0.30.12"
|
|
wgpu = "28.0.0"
|
|
bytemuck = "1.23.1"
|
|
image = "0.25.6"
|
|
parley = "0.11.1"
|
|
swash = "0.2.10"
|
|
fxhash = "0.2.1"
|
|
arboard = "3.6.1"
|
|
accesskit = "0.25.0"
|
|
iris-core = { path = "core" }
|
|
iris-macro = { path = "macro" }
|
|
tokio = "1.49.0"
|
|
# Current stable as of 2026-09-05 (`cargo search`) -- I5's markdown block
|
|
# model, the same crate E2's uncommitted `e2-transcript` experiment used for
|
|
# the identical job (RUST.md), rather than reimplementing a CommonMark
|
|
# parser.
|
|
pulldown-cmark = "0.13.4"
|