Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude/skills/gpui-mobile/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ GPUI is Zed's Rust UI framework. This stack runs it on Android:
| Layer | Crate | Where |
|---|---|---|
| GPUI | `gpui-pre` 0.3.9 + touch/IME patches | `Bombatomica64/gpui-pre` branch `mobile-lab`, via `[patch.crates-io]` |
| Components | `gpui-kit` 0.7.3 (`gpui-component`) | `Bombatomica64/gpui-kit` branch `mobile-lab` |
| Components | `gpui-kit` 0.8.0 (`gpui-component`) | `Bombatomica64/gpui-kit` branch `mobile-lab` |
| Platform | `gpui-pre-mobile` (`use gpui_mobile::…`) | `Bombatomica64/gpui-mobile` `main` |
| Reference app | GPUI Mobile Lab | `Bombatomica64/Gpui-android` |

Expand Down
2 changes: 1 addition & 1 deletion COMPONENT_MATRIX.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Status meanings:
- **BROKEN** — cannot be used on a touch-only phone (it may still render).
- **NOT_APPLICABLE** — no meaning inside an Android app, or disabled on mobile by design.

"(patched)" means the status holds with the fixes our forks carry, listed in
"(patched)" means the status holds with the fixes my forks carry, listed in
[MOBILE_PATCHES.md](MOBILE_PATCHES.md). How statuses were determined, and the
limits of the test device, are in [README.md](README.md#how-statuses-were-verified).

Expand Down
22 changes: 12 additions & 10 deletions CONTRIBUTING_IDEAS.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,10 @@ Ordered roughly by how much they'd move the verdict above. Status as of
TalkBack through `AccessibilityNodeProvider`.
- Upstream: gpui-mobile [#25](https://github.com/longbridge/gpui-mobile/pull/25),
merged 2026-10-14.
- Open: Kit's clear button gets a name (gpui-kit
- Upstream: Kit's clear and password buttons have names (gpui-kit
[#3554](https://github.com/longbridge/gpui-kit/pull/3554)) and a masked
input the password role ([#3555](https://github.com/longbridge/gpui-kit/pull/3555)).
input the password role ([#3555](https://github.com/longbridge/gpui-kit/pull/3555)),
in v0.8.0.
- Next: check the rest of Kit's controls for missing labels and roles
with TalkBack.
2. **Soft-keyboard and IME support.**
Expand All @@ -88,11 +89,12 @@ Ordered roughly by how much they'd move the verdict above. Status as of
`android-ime-dismiss`); ask for the keyboard when a focused input is
tapped, and scroll a focused input into view (gpui-kit
`input-tap-requests-keyboard`, `input-reveal-on-focus`).
- Upstream: touch selection handles are in Kit `main`
(`touch_selection`), not yet in a release the lab pins.
- Open: back keeps the text in a `clean_on_escape` input (gpui-kit
[#3556](https://github.com/longbridge/gpui-kit/pull/3556)); inputs say
how the keyboard should assist them ([#3557](https://github.com/longbridge/gpui-kit/pull/3557)).
- Upstream: touch selection handles (`touch_selection`, Kit v0.8.0).
- Upstream (v0.8.0): back keeps the text in a `clean_on_escape` input
(gpui-kit [#3556](https://github.com/longbridge/gpui-kit/pull/3556));
inputs say how the keyboard should assist them
([#3557](https://github.com/longbridge/gpui-kit/pull/3557)), with
autocorrect and caps off unless an input asks for them.
- Not started: autofill.
3. **Touch-drag and gesture handling.**
- Upstream: Slider drags (gpui-kit #3313), long-press context menus
Expand Down Expand Up @@ -150,9 +152,9 @@ Ordered roughly by how much they'd move the verdict above. Status as of
to propose once it has phone captures).
- Not started: system fonts.
8. **Upstream the fork fixes.** The branches in
[MOBILE_PATCHES.md](MOBILE_PATCHES.md). Open since 2026-10-16: gpui-kit
#3554–#3557 and gpui-mobile #39–#41; the forks are rebased onto gpui-pre
0.3.9, Kit v0.7.3 and gpui-mobile `main`.
[MOBILE_PATCHES.md](MOBILE_PATCHES.md). gpui-kit #3554–#3557 are merged
(v0.8.0); gpui-mobile #39–#41 are open since 2026-10-16; the forks are rebased onto gpui-pre
0.3.9, Kit v0.8.0 and gpui-mobile `main`.
- The gpui-pre ones are ready for Zed in
[docs/upstream-zed](docs/upstream-zed/README.md).
- The gpui-mobile and Kit ones are in
Expand Down
24 changes: 12 additions & 12 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 5 additions & 5 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name = "gpui-mobile-lab"
version = "0.1.2"
edition = "2024"
publish = false
description = "On-device test gallery for GPUI Kit v0.7.3 on Android"
description = "On-device test gallery for GPUI Kit v0.8.0 on Android"

# `cargo gpui` (github.com/Bombatomica64/cargo-gpui): where the dev loop installs and reloads.
[package.metadata.gpui]
Expand All @@ -15,11 +15,11 @@ name = "gpui_mobile_lab"
crate-type = ["cdylib"]

[dependencies]
# One GPUI snapshot for everything: GPUI Kit 0.7.3 pins gpui-pre =0.3.9, and so does
# the gpui-mobile fork; [patch.crates-io] swaps in 0.3.9 with our touch fixes. Kit and gpui-mobile come from our forks, pinned by rev
# One GPUI snapshot for everything: GPUI Kit 0.8.0 pins gpui-pre =0.3.9, and so does
# the gpui-mobile fork; [patch.crates-io] swaps in 0.3.9 with my touch fixes. Kit and gpui-mobile come from my forks, pinned by rev
# (see MOBILE_PATCHES.md for what each carries on top of upstream).
gpui = { package = "gpui-pre", version = "=0.3.9", default-features = false }
gpui-kit = { git = "https://github.com/Bombatomica64/gpui-kit", rev = "4ff475436f9ba2f3d800e81155ce8c350eb19aba", default-features = false, features = ["component", "assets"] }
gpui-kit = { git = "https://github.com/Bombatomica64/gpui-kit", rev = "18c9c775a4123d84582326aca1c79a228d399098", default-features = false, features = ["component", "assets"] }
gpui-mobile = { package = "gpui-pre-mobile", git = "https://github.com/Bombatomica64/gpui-mobile", rev = "7f52b45fa0ae27c6c72f7fa976e4e236326ef9db", default-features = false, features = [
"clipboard", "share",
# Exercised by the Platform APIs screen; build.sh copies their Java helpers from this checkout.
Expand All @@ -28,7 +28,7 @@ gpui-mobile = { package = "gpui-pre-mobile", git = "https://github.com/Bombatomi
"microphone", "deeplink",
] }
# Kit's FPS / frame-time HUD (enables gpui's `profiler` frame trace).
gpui-fps = { git = "https://github.com/Bombatomica64/gpui-kit", rev = "4ff475436f9ba2f3d800e81155ce8c350eb19aba" }
gpui-fps = { git = "https://github.com/Bombatomica64/gpui-kit", rev = "18c9c775a4123d84582326aca1c79a228d399098" }
anyhow = "1"
log = "0.4"
# Already in the tree through gpui; the Platform APIs screen reads picked images' sizes.
Expand Down
46 changes: 18 additions & 28 deletions MOBILE_PATCHES.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ branch is what the lab pins.
| Fork | Upstream | Branch the lab pins |
|---|---|---|
| [Bombatomica64/gpui-mobile](https://github.com/Bombatomica64/gpui-mobile) | [longbridge/gpui-mobile](https://github.com/longbridge/gpui-mobile) `main` | `main` (upstream `main` + the branches below, merged) |
| [Bombatomica64/gpui-kit](https://github.com/Bombatomica64/gpui-kit) | [longbridge/gpui-kit](https://github.com/longbridge/gpui-kit) tag `v0.7.3` | `mobile-lab` (`v0.7.3` + the commits below) |
| [Bombatomica64/gpui-kit](https://github.com/Bombatomica64/gpui-kit) | [longbridge/gpui-kit](https://github.com/longbridge/gpui-kit) tag `v0.8.0` | `mobile-lab` (`v0.8.0` + the commits below) |
| [Bombatomica64/gpui-pre](https://github.com/Bombatomica64/gpui-pre) | `gpui-pre` 0.3.9 from crates.io (a snapshot of [zed-industries/zed](https://github.com/zed-industries/zed) `crates/gpui`) | `mobile-lab` (branch `0.3.9` + the branches below) |

Versions of these branches rebased onto upstream `main`, with draft PR
Expand All @@ -24,7 +24,10 @@ clipboard and the surface-teardown fix (gpui-mobile #24, reworked on top of
#26's per-Activity `HostId`), the TalkBack bridge (#25, with the
exception-clearing fix folded in), the emoji font (#29) and night mode (#30)
on the host path, Slider touch drags and the gpui-fps Android font (gpui-kit
#3313, in v0.7.1), and long-press context menus (gpui-kit #3393, in v0.7.2).
#3313, in v0.7.1), long-press context menus (gpui-kit #3393, in v0.7.2), and
the input keyboard configuration, names for the clear and password buttons,
the password role and back keeping the text (gpui-kit #3554–#3557, in
v0.8.0).

Two things the merged versions changed for hosts: the TalkBack adapter goes
on each host's own Activity, so hosts call `host::set_activity(env, host,
Expand All @@ -34,7 +37,8 @@ Activity that handles `uiMode` itself calls
(`AppCompatDelegate`) does not count.

The commits the lab pinned before the 0.3.9 rebase are kept as tags:
`archive/pre-0.3.9/main` (gpui-mobile), `archive/v0.7.1/mobile-lab` (Kit) and
`archive/pre-0.3.9/main` (gpui-mobile), `archive/v0.7.1/mobile-lab` and
`archive/v0.7.3/mobile-lab` (Kit), and
`archive/0.3.8/*` (gpui-pre).

## gpui-mobile
Expand Down Expand Up @@ -149,31 +153,17 @@ the viewport resizing under `adjustResize`, or the keyboard arriving as an
inset on an edge-to-edge window. Needs the GPUI autoscroll fix below to work
in plain scroll containers.

### Tell the keyboard how to assist each input — branches `input-text-input-configuration` ([#3557](https://github.com/longbridge/gpui-kit/pull/3557)), `input-purpose`

`InputState` provides GPUI's `TextInputConfiguration`: Done for single-line
inputs and a line break for multi-line ones; autocorrect, suggestions and
sentence caps only for plain text; Password for a masked input (still while
revealed), Numeric/Decimal for number and digits-only masks, and the purpose
the `Input`'s `content_type` implies (email, phone, URL, password). New
`input_action`, `autocorrect`, `autocapitalize` and `input_purpose`
override them, like React Native's `returnKeyType`, `autoCorrect`,
`autoCapitalize`, `keyboardType` and `secureTextEntry`. `input-purpose`
needs the GPUI branch below.

### Keep the text on Android's back button — branch `input-back-keeps-text`, [#3556](https://github.com/longbridge/gpui-kit/pull/3556)

Back arrives as escape, so an input with `clean_on_escape()` cleared its
text on the second back instead of leaving the screen. On Android escape no
longer clears; it still closes the selection handles and edit menu first.

### Name icon-only input buttons for screen readers — branches `input-icon-button-labels` ([#3554](https://github.com/longbridge/gpui-kit/pull/3554)), `input-masked-password-role` ([#3555](https://github.com/longbridge/gpui-kit/pull/3555))

The clear button (Input, Select, Combobox, DatePicker) and the password
toggle were unlabelled buttons to TalkBack; they are now "Clear" and "Show
password" / "Hide password". A masked input has the `PasswordInput` role.
#3554 names the clear button only; the toggle half stays on the fork while
gpui-kit #3424, which named it too, is closed but can be reopened.
### Say what an input holds — branch `input-purpose`

Kit v0.8.0 has `input_action`, `autocorrect` and `autocapitalize`
([#3557](https://github.com/longbridge/gpui-kit/pull/3557)); the review
made text assistance opt-in, so autocorrect, suggestions and caps are off
unless an input asks for them. This branch adds the purpose on top:
Password for a masked input (still while revealed), Numeric/Decimal for
number and digits-only masks, and the purpose the `Input`'s `content_type`
implies (email, phone, URL, password), with `input_purpose` to override it,
like React Native's `keyboardType` and `secureTextEntry`. It needs the GPUI
branch below.

### Keep sheets and toasts out from under the system bars — branch `upstream/overlays-safe-area`

Expand Down
12 changes: 6 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
# GPUI Kit Mobile Lab (Android)

An on-device test gallery for [GPUI Kit](https://github.com/longbridge/gpui-kit)
**v0.7.3** on Android: a phone-sized version of Kit's story gallery. Every
**v0.8.0** on Android: a phone-sized version of Kit's story gallery. Every
user-facing component has a demo screen that exercises its states and events
(each interactive screen shows the current value and an event log), plus lab
tools for touch, scrolling, diagnostics, rendering stress and themes.

- Component coverage and per-component Android status: **[COMPONENT_MATRIX.md](COMPONENT_MATRIX.md)**
(the app renders its catalog from this file).
- What our forks of gpui-mobile, GPUI Kit and GPUI carry: **[MOBILE_PATCHES.md](MOBILE_PATCHES.md)**.
- What my forks of gpui-mobile, GPUI Kit and GPUI carry: **[MOBILE_PATCHES.md](MOBILE_PATCHES.md)**.
- Assessment and possible work for the GPUI / GPUI Kit teams:
**[CONTRIBUTING_IDEAS.md](CONTRIBUTING_IDEAS.md)**.

Expand All @@ -19,9 +19,9 @@ version of every `gpui-pre-*` crate.

| Dependency | Version / revision |
|---|---|
| GPUI Kit (`gpui-kit`, `gpui-component`, `gpui-base`, `gpui-fps`) | 0.7.3 from [Bombatomica64/gpui-kit](https://github.com/Bombatomica64/gpui-kit) `mobile-lab` (tag `v0.7.3` + 10 commits) |
| GPUI Kit (`gpui-kit`, `gpui-component`, `gpui-base`, `gpui-fps`) | 0.8.0 from [Bombatomica64/gpui-kit](https://github.com/Bombatomica64/gpui-kit) `mobile-lab` (tag `v0.8.0` + 6 commits) |
| GPUI (`gpui-pre`) | 0.3.9 from [Bombatomica64/gpui-pre](https://github.com/Bombatomica64/gpui-pre) `mobile-lab` (crates.io 0.3.9 + 3 touch fixes and `TextInputConfiguration::purpose`), via `[patch.crates-io]` |
| GPUI's other crates (`gpui-pre-wgpu`, …) | 0.3.9 from crates.io (the snapshot GPUI Kit 0.7.3 pins) |
| GPUI's other crates (`gpui-pre-wgpu`, …) | 0.3.9 from crates.io (the snapshot GPUI Kit 0.8.0 pins) |
| gpui-mobile (`gpui-pre-mobile`) | [Bombatomica64/gpui-mobile](https://github.com/Bombatomica64/gpui-mobile) `main` (upstream `main` + the fork-only branches in MOBILE_PATCHES.md) |
| Renderer | `wgpu` 29.0.4 (Vulkan preferred, GLES fallback) |
| Rust | 1.98.1 stable, edition 2024 |
Expand Down Expand Up @@ -142,7 +142,7 @@ Limits of that setup:

## Known Android issues

Each is detailed in the matrix; fixes carried by our forks are in MOBILE_PATCHES.md.
Each is detailed in the matrix; fixes carried by my forks are in MOBILE_PATCHES.md.

**Broken on a touch-only phone**

Expand Down Expand Up @@ -181,7 +181,7 @@ Each is detailed in the matrix; fixes carried by our forks are in MOBILE_PATCHES
can continue as vertical page scrolling.
- After a tap, the touched menu row keeps its hover highlight.

**Fixed in our forks** (checked on a OnePlus CPH2581, Android 16)
**Fixed in my forks** (checked on a OnePlus CPH2581, Android 16)

- Finger drags on `on_drag` elements: Resizable dividers and Dock splitters
and tabs work ([Resizable](docs/demos/touch-drag-resizable.png),
Expand Down
2 changes: 1 addition & 1 deletion docs/hot-patching-plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ changes, gpui/Kit/gpui-mobile changes, new dependencies.

- A debug host APK is built once. On start it loads the app library from its
private directory (`System.load(path)`), falling back to the packaged one.
- `cargo gpui dev` (our CLI, below) builds the arm64 debug `.so`, pushes it
- `cargo gpui dev` (my CLI, below) builds the arm64 debug `.so`, pushes it
(`adb push` + `run-as` copy), and restarts the app process. No Gradle, no
reinstall.
- Optional: save and restore a small "dev state" (current screen, scroll) so
Expand Down
4 changes: 2 additions & 2 deletions docs/upstream-zed/README.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# Upstreaming the GPUI fixes to Zed

The GPUI fixes that live only in our gpui-pre fork, prepared for
The GPUI fixes that live only in my gpui-pre fork, prepared for
zed-industries/zed (`crates/gpui`, which gpui-pre snapshots). Items 3 and 8
of [CONTRIBUTING_IDEAS.md](../../CONTRIBUTING_IDEAS.md).

Nothing here has been posted upstream. Each branch is on our fork
Nothing here has been posted upstream. Each branch is on my fork
[Bombatomica64/zed](https://github.com/Bombatomica64/zed), rebased on
2026-10-16 onto Zed `main` 14119f8d87 (the 2026-10-09 versions are tagged
`archive/2026-10-09/<branch>`). `cargo test -p gpui --lib` passes on each.
Expand Down
Loading
Loading