From ba90652b023c5564c736d2669b568ebc719bc71e Mon Sep 17 00:00:00 2001 From: lorenzomicheli Date: Fri, 16 Oct 2026 15:41:39 +0000 Subject: [PATCH 1/2] Docs: upstream drafts say "my test app" and "my fork" The lab and the forks are the author's own; the PR texts speak for them. Co-Authored-By: Claude Opus 5.5 --- docs/upstream-zed/README.md | 4 ++-- docs/upstream/README.md | 4 ++-- docs/upstream/gpui-kit/input-back-keeps-text.md | 4 ++-- docs/upstream/gpui-kit/input-icon-button-labels.md | 4 ++-- docs/upstream/gpui-kit/input-masked-password-role.md | 2 +- docs/upstream/gpui-kit/input-reveal-on-focus.md | 4 ++-- docs/upstream/gpui-kit/input-tap-requests-keyboard.md | 2 +- docs/upstream/gpui-mobile/android-async-prepare.md | 6 +++--- docs/upstream/gpui-mobile/android-deeplink.md | 2 +- docs/upstream/gpui-mobile/android-ime-dismiss.md | 2 +- docs/upstream/gpui-mobile/android-media-session.md | 4 ++-- docs/upstream/gpui-mobile/android-notifications.md | 4 ++-- docs/upstream/gpui-mobile/android-permission-errors.md | 6 +++--- .../gpui-mobile/android-text-input-configuration.md | 4 ++-- docs/upstream/gpui-mobile/android-text-input-purpose.md | 4 ++-- docs/upstream/hot-reload-discussion.md | 2 +- docs/upstream/safe-area-insets.md | 2 +- 17 files changed, 30 insertions(+), 30 deletions(-) diff --git a/docs/upstream-zed/README.md b/docs/upstream-zed/README.md index b12a186..9db2e35 100644 --- a/docs/upstream-zed/README.md +++ b/docs/upstream-zed/README.md @@ -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/`). `cargo test -p gpui --lib` passes on each. diff --git a/docs/upstream/README.md b/docs/upstream/README.md index 78dfdb9..4396738 100644 --- a/docs/upstream/README.md +++ b/docs/upstream/README.md @@ -1,6 +1,6 @@ # Upstreaming the gpui-mobile and GPUI Kit fixes -These are the fixes that live only in our forks of +These are the fixes that live only in my forks of [longbridge/gpui-mobile](https://github.com/longbridge/gpui-mobile) and [longbridge/gpui-kit](https://github.com/longbridge/gpui-kit), prepared to be sent one at a time. This is item 8 of [CONTRIBUTING_IDEAS.md](../../CONTRIBUTING_IDEAS.md). @@ -10,7 +10,7 @@ Posted so far (2026-10-16): #1–#4 as gpui-kit #3554–#3557, #20 as gpui-mobile #39, and the first two JNI PRs from issue #31 as gpui-mobile #40 and #41. The Kit ones were rebased onto Kit `main` 319b56cf first; the old branch tips are tagged `archive/2026-10-10/upstream/`. Each fix is a minimal branch named -`upstream/` on our fork +`upstream/` on my fork ([Bombatomica64/gpui-mobile](https://github.com/Bombatomica64/gpui-mobile), [Bombatomica64/gpui-kit](https://github.com/Bombatomica64/gpui-kit)), based on upstream `main` as of 2026-10-10: gpui-mobile f9fe5a7 (#24), Kit 0bbd9870 diff --git a/docs/upstream/gpui-kit/input-back-keeps-text.md b/docs/upstream/gpui-kit/input-back-keeps-text.md index 5d3a06f..0e79c35 100644 --- a/docs/upstream/gpui-kit/input-back-keeps-text.md +++ b/docs/upstream/gpui-kit/input-back-keeps-text.md @@ -16,7 +16,7 @@ On Android, `clean_on_escape` no longer clears. Escape still dismisses the selec ## Screenshot -Android (OnePlus CPH2581, Android 16), the "Type here…" input of our test app has `clean_on_escape()`: +Android (OnePlus CPH2581, Android 16), the "Type here…" input of my test app has `clean_on_escape()`: **Before**: type "Hello" (left), back hides the keyboard (middle), back again clears the text and stays on the screen (right). @@ -28,7 +28,7 @@ Android (OnePlus CPH2581, Android 16), the "Type here…" input of our test app - `cargo clippy -p gpui-base -p gpui-component -p gpui-kit --features gpui-kit/test-support --tests -- --deny warnings`: clean - `cargo test -p gpui-base --lib input`: 337 passed; `cargo test -p gpui-kit --features test-support --test input --test input_focus`: input 179 passed, input_focus 4 passed -- On Android, through our test app (Kit 0.7.1 plus this change). +- On Android, through my test app (Kit 0.7.1 plus this change). ## Checklist diff --git a/docs/upstream/gpui-kit/input-icon-button-labels.md b/docs/upstream/gpui-kit/input-icon-button-labels.md index dc1c318..4a3f977 100644 --- a/docs/upstream/gpui-kit/input-icon-button-labels.md +++ b/docs/upstream/gpui-kit/input-icon-button-labels.md @@ -3,7 +3,7 @@ - Branch: [`upstream/input-icon-button-labels`](https://github.com/Bombatomica64/gpui-kit/tree/upstream/input-icon-button-labels), one commit on upstream `main` (0bbd9870) - Diff: 3 files, +37 (one `accessibility_label`, one localized string, a 29-line UI test) - Depends on: nothing. -- **Trimmed for upstream.** Our fork branch also named the password mask toggle. Open PR longbridge/gpui-kit#3424 (counterbeing, 2026-10-09) does exactly that ("Show password" / "Hide password", plus the sidebar caret), so that half is dropped here to avoid a duplicate. Our string keys (`Input.Show password`) differed from #3424's (`Input.Show Password`), so there's no conflict either way. +- **Trimmed for upstream.** My fork branch also named the password mask toggle. Open PR longbridge/gpui-kit#3424 (counterbeing, 2026-10-09) does exactly that ("Show password" / "Hide password", plus the sidebar caret), so that half is dropped here to avoid a duplicate. Our string keys (`Input.Show password`) differed from #3424's (`Input.Show Password`), so there's no conflict either way. - Recording: before, a `uiautomator dump` ([a11y-text-input-baseline.xml](../../demos/a11y-text-input-baseline.xml)): every clear button is an `android.widget.Button` with empty `text` and `content-desc`. After: checked with uiautomator and TalkBack (Gpui-android#38), but no screenshot. A TalkBack screenshot would help; a follow-up. --- @@ -26,7 +26,7 @@ Android (OnePlus CPH2581, Android 16, TalkBack), Kit's Input with `cleanable(tru - `cargo clippy -p gpui-base -p gpui-component -p gpui-kit --features gpui-kit/test-support --tests -- --deny warnings`: clean - `cargo test -p gpui-kit --features test-support --test input --test input_focus`: input 180 passed (incl. the new `clear_button_is_named`), input_focus 4 passed -- On Android, through our test app (Kit 0.7.1 plus this change): uiautomator shows `content-desc="Clear"`, and TalkBack focuses and activates it. +- On Android, through my test app (Kit 0.7.1 plus this change): uiautomator shows `content-desc="Clear"`, and TalkBack focuses and activates it. ## Checklist diff --git a/docs/upstream/gpui-kit/input-masked-password-role.md b/docs/upstream/gpui-kit/input-masked-password-role.md index 4237724..bc42463 100644 --- a/docs/upstream/gpui-kit/input-masked-password-role.md +++ b/docs/upstream/gpui-kit/input-masked-password-role.md @@ -25,7 +25,7 @@ Android (OnePlus CPH2581, Android 16), the masked field of Kit's Input demo: - `cargo clippy -p gpui-base -p gpui-component -p gpui-kit --features gpui-kit/test-support --tests -- --deny warnings`: clean - `cargo test -p gpui-kit --features test-support --test input --test input_focus`: input 180 passed (incl. the new `masked_input_is_a_password_field`), input_focus 4 passed -- On Android, through our test app (Kit 0.7.1 plus this change), with uiautomator. +- On Android, through my test app (Kit 0.7.1 plus this change), with uiautomator. ## Checklist diff --git a/docs/upstream/gpui-kit/input-reveal-on-focus.md b/docs/upstream/gpui-kit/input-reveal-on-focus.md index 1bc4682..497cdf1 100644 --- a/docs/upstream/gpui-kit/input-reveal-on-focus.md +++ b/docs/upstream/gpui-kit/input-reveal-on-focus.md @@ -5,10 +5,10 @@ - Depends on, to be useful: - **Zed PR "gpui: Reveal a descendant's autoscroll request in scrollable divs"** ([draft](../../upstream-zed/autoscroll.md)), released in a `gpui-pre` snapshot that Kit pins. Without it only `List` honours the request, so in the usual `overflow_y_scroll()` form this PR does nothing. It's safe but inert. - On Android, a viewport that shrinks when the IME opens (gpui-mobile's host with `adjustResize`, as today). -- **Its own test fails on Kit `main` today**: `focused_input_asks_its_scroll_container_to_reveal_it` uses an `overflow_y_scroll` div, and stock gpui-pre 0.3.8 divs ignore the request, so `assert!(scroll_handle.offset().y < px(0.))` fails (the test was written against our fork's patched gpui-pre; not re-run there for this prep). Once Kit pins a gpui-pre with the autoscroll change, it should pass unchanged; re-run it then. (Another option: test it inside a `List`, which honours the request today. But that wouldn't test the common case.) +- **Its own test fails on Kit `main` today**: `focused_input_asks_its_scroll_container_to_reveal_it` uses an `overflow_y_scroll` div, and stock gpui-pre 0.3.8 divs ignore the request, so `assert!(scroll_handle.offset().y < px(0.))` fails (the test was written against my fork's patched gpui-pre; not re-run there for this prep). Once Kit pins a gpui-pre with the autoscroll change, it should pass unchanged; re-run it then. (Another option: test it inside a `List`, which honours the request today. But that wouldn't test the common case.) - **Send after the GPUI autoscroll change is in a gpui-pre release.** Sending it earlier would ask reviewers to accept code whose main effect they can't see. - Desktop impact: an input inside a `List` now scrolls into view when it gains focus (e.g. by Tab), or when the window is resized while it has focus. Worth stating; it's arguably the right behaviour. -- Recording: **missing.** Follow-up: a long form in a scrolling div, tapping a field near the bottom. Before: the keyboard covers it. After: the page scrolls it above the keyboard. This needs the GPUI autoscroll change, so it can only be captured on our fork build. +- Recording: **missing.** Follow-up: a long form in a scrolling div, tapping a field near the bottom. Before: the keyboard covers it. After: the page scrolls it above the keyboard. This needs the GPUI autoscroll change, so it can only be captured on my fork build. --- diff --git a/docs/upstream/gpui-kit/input-tap-requests-keyboard.md b/docs/upstream/gpui-kit/input-tap-requests-keyboard.md index 08785b0..7ab5fd0 100644 --- a/docs/upstream/gpui-kit/input-tap-requests-keyboard.md +++ b/docs/upstream/gpui-kit/input-tap-requests-keyboard.md @@ -21,7 +21,7 @@ A touch press (`GlobalState::is_touch_press`) with the left button on an editabl - `cargo clippy -p gpui-base -p gpui-component -p gpui-kit --features gpui-kit/test-support --tests -- --deny warnings`: clean - `cargo test -p gpui-base --lib input`: 337 passed; `cargo test -p gpui-kit --features test-support --test input --test input_focus`: input 179 passed, input_focus 4 passed -- To check on Android (our test app: Kit 0.7.1 plus this change, gpui-mobile with `show_soft_keyboard`): hide the keyboard with back, then tap the focused field; the keyboard should come back. *(The lab carries this change, but there is no recorded check of it; capture one before sending.)* +- To check on Android (my test app: Kit 0.7.1 plus this change, gpui-mobile with `show_soft_keyboard`): hide the keyboard with back, then tap the focused field; the keyboard should come back. *(The lab carries this change, but there is no recorded check of it; capture one before sending.)* ## Checklist diff --git a/docs/upstream/gpui-mobile/android-async-prepare.md b/docs/upstream/gpui-mobile/android-async-prepare.md index 851137f..9d169a0 100644 --- a/docs/upstream/gpui-mobile/android-async-prepare.md +++ b/docs/upstream/gpui-mobile/android-async-prepare.md @@ -20,9 +20,9 @@ No signature changes (`PlayerState::Loading` already exists). `set_url`'s doc sa ### Testing - `cargo fmt --all -- --check`; `cargo check --target aarch64-linux-android --all-targets` and `cargo clippy --target aarch64-linux-android`: no new warnings; `cargo test --lib`: 46 passed. -- `GpuiAudio.java` is the same as on our fork, whose CI builds the example APK. -- On device (OnePlus CPH2581, Android 16, our fork's `main`), an MP3 over Wi-Fi: `set_url` took 1222 ms before and 21–27 ms after. `state()` is `Loading` until it's ready, a `play()` made while loading starts playback once it is, and pause and `state()` work afterwards. The failure path (bad URL) was not checked on the device. -- Not changed: `GpuiVideoPlayer` prepares synchronously the same way. Our test app can't exercise the video player, so I left it alone. +- `GpuiAudio.java` is the same as on my fork, whose CI builds the example APK. +- On device (OnePlus CPH2581, Android 16, my fork's `main`), an MP3 over Wi-Fi: `set_url` took 1222 ms before and 21–27 ms after. `state()` is `Loading` until it's ready, a `play()` made while loading starts playback once it is, and pause and `state()` work afterwards. The failure path (bad URL) was not checked on the device. +- Not changed: `GpuiVideoPlayer` prepares synchronously the same way. My test app can't exercise the video player, so I left it alone. Thanks for taking the time to review this. diff --git a/docs/upstream/gpui-mobile/android-deeplink.md b/docs/upstream/gpui-mobile/android-deeplink.md index 0d67e51..10e2b20 100644 --- a/docs/upstream/gpui-mobile/android-deeplink.md +++ b/docs/upstream/gpui-mobile/android-deeplink.md @@ -26,7 +26,7 @@ A deep link that reaches an app that is already running is lost on the host-driv ### Testing - `cargo fmt --all -- --check`; `cargo check --target aarch64-linux-android --all-targets` and `cargo clippy --target aarch64-linux-android`: no new warnings; `cargo test --lib`: 46 passed. -- On device (OnePlus CPH2581, Android 16, our fork's `main`; the test app's Activity calls `handle_link` from `onNewIntent`): a cold start with `gpuilab://cold/1`, then `am start -d gpuilab://warm/2`. +- On device (OnePlus CPH2581, Android 16, my fork's `main`; the test app's Activity calls `handle_link` from `onNewIntent`): a cold start with `gpuilab://cold/1`, then `am start -d gpuilab://warm/2`. - Before: `get_latest_link()` stays `gpuilab://cold/1`, and the handler is never called. - After: the handler fires with `gpuilab://warm/2`, and `get_latest_link()` returns it. - The re-entrancy fix (a handler replacing itself) is checked by reading the code only. diff --git a/docs/upstream/gpui-mobile/android-ime-dismiss.md b/docs/upstream/gpui-mobile/android-ime-dismiss.md index 39069b4..cf9765f 100644 --- a/docs/upstream/gpui-mobile/android-ime-dismiss.md +++ b/docs/upstream/gpui-mobile/android-ime-dismiss.md @@ -25,7 +25,7 @@ OnePlus CPH2581, Android 16, host-driven test app. A dialog with an input: typin ### Testing - `cargo fmt --all -- --check`; `cargo check --target aarch64-linux-android --all-targets` and `cargo clippy --target aarch64-linux-android`: no new warnings (the 8 on `main` remain); `cargo test --lib`: 46 passed. -- On the device above, with our fork's `main` (which carries this commit on top of the JNI work in #31): Done in a dialog's input hides the keyboard and keeps the dialog and focus. A tap on the field shows the keyboard again. Back behaves as before. +- On the device above, with my fork's `main` (which carries this commit on top of the JNI work in #31): Done in a dialog's input hides the keyboard and keeps the dialog and focus. A tap on the field shows the keyboard again. Back behaves as before. Test app: [Bombatomica64/Gpui-android](https://github.com/Bombatomica64/Gpui-android) (Dialogs & Sheets screen). diff --git a/docs/upstream/gpui-mobile/android-media-session.md b/docs/upstream/gpui-mobile/android-media-session.md index 37e7c2a..64ede04 100644 --- a/docs/upstream/gpui-mobile/android-media-session.md +++ b/docs/upstream/gpui-mobile/android-media-session.md @@ -22,8 +22,8 @@ No public API changes. ### Testing - `cargo fmt --all -- --check`; `cargo check --target aarch64-linux-android --all-targets` and `cargo clippy --target aarch64-linux-android`: no new warnings; `cargo test --lib`: 46 passed. -- `GpuiMediaSession.java` is the same as on our fork, whose CI builds the example APK. -- On device (OnePlus CPH2581, Android 16, our fork's `main`): `media_session::init()` succeeds. `adb shell cmd media_session dispatch pause` and `dispatch next` reach `onPause` / `onSkipToNext` on the main thread, and the Rust handler receives `Pause`, `Next`. +- `GpuiMediaSession.java` is the same as on my fork, whose CI builds the example APK. +- On device (OnePlus CPH2581, Android 16, my fork's `main`): `media_session::init()` succeeds. `adb shell cmd media_session dispatch pause` and `dispatch next` reach `onPause` / `onSkipToNext` on the main thread, and the Rust handler receives `Pause`, `Next`. - The re-entrancy fix is checked by reading the code only. Thanks for taking the time to review this. diff --git a/docs/upstream/gpui-mobile/android-notifications.md b/docs/upstream/gpui-mobile/android-notifications.md index 1a63ab1..20bbdc5 100644 --- a/docs/upstream/gpui-mobile/android-notifications.md +++ b/docs/upstream/gpui-mobile/android-notifications.md @@ -27,8 +27,8 @@ Behaviour change: `show()` returns `Err` instead of `Ok(())` when the notificati ### Testing - `cargo fmt --all -- --check`; `cargo check --target aarch64-linux-android --all-targets` and `cargo clippy --target aarch64-linux-android`: no new warnings; `cargo test --lib`: 46 passed. -- `GpuiNotifications.java` is the same as on our fork, whose CI builds the example APK. -- On device (OnePlus CPH2581, Android 16, test app with targetSdk 34, our fork's `main`): +- `GpuiNotifications.java` is the same as on my fork, whose CI builds the example APK. +- On device (OnePlus CPH2581, Android 16, test app with targetSdk 34, my fork's `main`): - without `POST_NOTIFICATIONS`: before, `show` → `Ok(())` and `dumpsys notification` lists nothing from the app; after, `show` → `Err("java.lang.SecurityException: POST_NOTIFICATIONS is not granted; request it first")`. - granted: the notification is posted. Tapping it opens the app, and `take_launch_payload()` returns `Some("lab-payload")` once, then `None`. diff --git a/docs/upstream/gpui-mobile/android-permission-errors.md b/docs/upstream/gpui-mobile/android-permission-errors.md index 34c0dfa..aebbd01 100644 --- a/docs/upstream/gpui-mobile/android-permission-errors.md +++ b/docs/upstream/gpui-mobile/android-permission-errors.md @@ -2,7 +2,7 @@ - Branch: [`upstream/android-permission-errors`](https://github.com/Bombatomica64/gpui-mobile/tree/upstream/android-permission-errors), one commit on upstream `main` (f9fe5a7) - Diff: 4 files, +41 −42 (two Java helpers, doc comments in two Rust modules) -- Depends on: nothing. (Lab issue Bombatomica64/Gpui-android#46. On our fork it sits on the JNI rework from #31, but it doesn't need it.) +- Depends on: nothing. (Lab issue Bombatomica64/Gpui-android#46. On my fork it sits on the JNI rework from #31, but it doesn't need it.) - Recording: none needed. The result is a return value; the before/after values measured on the device are in the Testing section (Gpui-android#46). --- @@ -21,8 +21,8 @@ No signature changes. Behaviour change: calls that used to return an empty `Ok` ### Testing - `cargo fmt --all -- --check`; `cargo check --target aarch64-linux-android --all-targets` and `cargo clippy --target aarch64-linux-android`: no new warnings; `cargo test --lib`: 46 passed. -- The Java helpers are the same as on our fork, whose CI builds the example APK. -- On device (OnePlus CPH2581, Android 16, our fork's `main`), without the permissions: +- The Java helpers are the same as on my fork, whose CI builds the example APK. +- On device (OnePlus CPH2581, Android 16, my fork's `main`), without the permissions: - before: `get_calendars` → `Ok([])`, `get_last_known_position` → `Ok(None)`, `get_current_position` → `Err("Failed to get current position")` - after: `get_calendars` → `Err("java.lang.SecurityException: Permission Denial: opening provider com.android.providers.calendar.CalendarProvider2 … requires android.permission.READ_CALENDAR …")`, and both location calls → `Err("java.lang.SecurityException: Location needs ACCESS_FINE_LOCATION or ACCESS_COARSE_LOCATION")` diff --git a/docs/upstream/gpui-mobile/android-text-input-configuration.md b/docs/upstream/gpui-mobile/android-text-input-configuration.md index cbd4c9b..0ba6371 100644 --- a/docs/upstream/gpui-mobile/android-text-input-configuration.md +++ b/docs/upstream/gpui-mobile/android-text-input-configuration.md @@ -49,8 +49,8 @@ Left: a field with `input_action(Search)` gets the Search key. Right: after a si ### Testing - `cargo fmt --all -- --check`; `cargo check --target aarch64-linux-android --all-targets` (which builds the `input_type` unit tests) and `cargo clippy --target aarch64-linux-android`: no new warnings; `cargo test --lib`: 46 passed. -- `GpuiInputActivity.java` is the same as on our fork, whose CI builds the example APK. -- On device (our fork's `main` with GPUI Kit's matching change): `input_action(Search/Send/Next)` show those keys; a plain single-line field gets Done with autocorrect and sentence caps; `autocorrect(false)` gives no suggestions. The keyboard's action key and an injected hardware Enter both reach the field as `PressEnter`. Enter still inserts a newline in a textarea. +- `GpuiInputActivity.java` is the same as on my fork, whose CI builds the example APK. +- On device (my fork's `main` with GPUI Kit's matching change): `input_action(Search/Send/Next)` show those keys; a plain single-line field gets Done with autocorrect and sentence caps; `autocorrect(false)` gives no suggestions. The keyboard's action key and an injected hardware Enter both reach the field as `PressEnter`. Enter still inserts a newline in a textarea. Thanks for taking the time to review this. diff --git a/docs/upstream/gpui-mobile/android-text-input-purpose.md b/docs/upstream/gpui-mobile/android-text-input-purpose.md index f02c230..549df65 100644 --- a/docs/upstream/gpui-mobile/android-text-input-purpose.md +++ b/docs/upstream/gpui-mobile/android-text-input-purpose.md @@ -2,7 +2,7 @@ - Branch: [`upstream/android-text-input-purpose`](https://github.com/Bombatomica64/gpui-mobile/tree/upstream/android-text-input-purpose), one commit on top of `upstream/android-text-input-configuration` - Diff (own commit): 1 file, `src/android/input_type.rs`, about +64 −6 -- **Blocked.** It reads `TextInputConfiguration::purpose`, which exists only in our gpui-pre fork. It needs the Zed PR ([../../upstream-zed/text-input-purpose.md](../../upstream-zed/text-input-purpose.md)) merged and released in a `gpui-pre` snapshot, and gpui-mobile bumped to that snapshot. Until then the branch does not build against crates.io `gpui-pre`. It was not compiled for this prep; it builds on our fork's `main`, which patches gpui-pre. +- **Blocked.** It reads `TextInputConfiguration::purpose`, which exists only in my gpui-pre fork. It needs the Zed PR ([../../upstream-zed/text-input-purpose.md](../../upstream-zed/text-input-purpose.md)) merged and released in a `gpui-pre` snapshot, and gpui-mobile bumped to that snapshot. Until then the branch does not build against crates.io `gpui-pre`. It was not compiled for this prep; it builds on my fork's `main`, which patches gpui-pre. - Also depends on: android-text-input-configuration (and so android-ime-dismiss). - Recording: [password keyboard before/after](../../demos/android-password-keyboard.png), [amount keyboard](../../demos/android-amount-keyboard.png). @@ -25,6 +25,6 @@ OnePlus CPH2581, Android 16, SwiftKey: a masked input before (suggests "Hunter2" ### Testing -- On device with our forks: a masked input asks for `inputType=0x81` with `IME_FLAG_NO_PERSONALIZED_LEARNING`, and SwiftKey shows no suggestion strip. The phone mask gets `TYPE_CLASS_PHONE`, the amount mask number|decimal, a PIN (masked + digit mask) a numeric password. +- On device with my forks: a masked input asks for `inputType=0x81` with `IME_FLAG_NO_PERSONALIZED_LEARNING`, and SwiftKey shows no suggestion strip. The phone mask gets `TYPE_CLASS_PHONE`, the amount mask number|decimal, a PIN (masked + digit mask) a numeric password. 🤖 Generated with [Claude Code](https://claude.com/claude-code) diff --git a/docs/upstream/hot-reload-discussion.md b/docs/upstream/hot-reload-discussion.md index 2f5678e..34c5897 100644 --- a/docs/upstream/hot-reload-discussion.md +++ b/docs/upstream/hot-reload-discussion.md @@ -68,7 +68,7 @@ the click counter kept its value (3).* `System.loadLibrary`. In a debuggable build it loads `files/dev/lib.so` when a dev tool has pushed one; release builds always load the packaged library. It's opt-in, about 50 lines, and adds no - Rust code or dependency. It's on our fork as branch + Rust code or dependency. It's on my fork as branch [`dev-hot-loader`](https://github.com/Bombatomica64/gpui-mobile/blob/dev-hot-loader/example/android/gradle/app/src/main/java/dev/gpui/mobile/GpuiLibraryLoader.java), based on your `main`. diff --git a/docs/upstream/safe-area-insets.md b/docs/upstream/safe-area-insets.md index b512076..8a541b9 100644 --- a/docs/upstream/safe-area-insets.md +++ b/docs/upstream/safe-area-insets.md @@ -3,7 +3,7 @@ Not posted. Branch [`Bombatomica64/gpui-mobile:android-host-insets`](https://github.com/Bombatomica64/gpui-mobile/tree/android-host-insets), one commit on upstream `main` (f9fe5a7), 4 files, +155 −6. It applies to -upstream as is; on our fork `main` it only conflicts next to +upstream as is; on my fork `main` it only conflicts next to `configuration_changed` (#30). --- From 543f53f810f9dcf734f0dd0c621d4d18df5d43de Mon Sep 17 00:00:00 2001 From: lorenzomicheli Date: Tue, 20 Oct 2026 07:18:37 +0000 Subject: [PATCH 2/2] Move to GPUI Kit v0.8.0 Kit v0.8.0 has my four input PRs (#3554-#3557), so the mobile-lab branch of my Kit fork is rebased onto v0.8.0 without them: six commits remain (the old tip is tagged archive/v0.7.3/mobile-lab). v0.8.0 still pins gpui-pre =0.3.9. #3557 merged with text assistance opt-in: autocorrect, suggestions and caps are off unless an input asks for them. The Message field on the Text input screen now asks for them, so the screen still shows both. v0.8.0 also turns on scroll bounce on Android by default; that needs a look on the phone. The docs mark #3554-#3557 merged, carry the "my test app" wording that missed #78, and drop the last "our"/"we" from the drafts. Co-Authored-By: Claude Opus 5.5 --- .claude/skills/gpui-mobile/SKILL.md | 2 +- COMPONENT_MATRIX.md | 2 +- CONTRIBUTING_IDEAS.md | 22 +++++---- Cargo.lock | 24 +++++----- Cargo.toml | 10 ++-- MOBILE_PATCHES.md | 46 ++++++++----------- README.md | 12 ++--- docs/hot-patching-plan.md | 2 +- docs/upstream/README.md | 16 +++---- .../gpui-kit/input-icon-button-labels.md | 2 +- docs/upstream/hot-reload-discussion.md | 10 ++-- docs/upstream/replies/gpui-mobile-25.md | 2 +- src/lib.rs | 4 +- src/screens/text_input.rs | 4 +- 14 files changed, 76 insertions(+), 82 deletions(-) diff --git a/.claude/skills/gpui-mobile/SKILL.md b/.claude/skills/gpui-mobile/SKILL.md index 98871ad..c02c655 100644 --- a/.claude/skills/gpui-mobile/SKILL.md +++ b/.claude/skills/gpui-mobile/SKILL.md @@ -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` | diff --git a/COMPONENT_MATRIX.md b/COMPONENT_MATRIX.md index 19ffb10..df7fd55 100644 --- a/COMPONENT_MATRIX.md +++ b/COMPONENT_MATRIX.md @@ -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). diff --git a/CONTRIBUTING_IDEAS.md b/CONTRIBUTING_IDEAS.md index 0075d2b..5add7c4 100644 --- a/CONTRIBUTING_IDEAS.md +++ b/CONTRIBUTING_IDEAS.md @@ -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.** @@ -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 @@ -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 diff --git a/Cargo.lock b/Cargo.lock index 3440ef6..cf938ec 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2141,8 +2141,8 @@ dependencies = [ [[package]] name = "gpui-base" -version = "0.7.3" -source = "git+https://github.com/Bombatomica64/gpui-kit?rev=4ff475436f9ba2f3d800e81155ce8c350eb19aba#4ff475436f9ba2f3d800e81155ce8c350eb19aba" +version = "0.8.0" +source = "git+https://github.com/Bombatomica64/gpui-kit?rev=18c9c775a4123d84582326aca1c79a228d399098#18c9c775a4123d84582326aca1c79a228d399098" dependencies = [ "aho-corasick", "anyhow", @@ -2181,8 +2181,8 @@ dependencies = [ [[package]] name = "gpui-component" -version = "0.7.3" -source = "git+https://github.com/Bombatomica64/gpui-kit?rev=4ff475436f9ba2f3d800e81155ce8c350eb19aba#4ff475436f9ba2f3d800e81155ce8c350eb19aba" +version = "0.8.0" +source = "git+https://github.com/Bombatomica64/gpui-kit?rev=18c9c775a4123d84582326aca1c79a228d399098#18c9c775a4123d84582326aca1c79a228d399098" dependencies = [ "anyhow", "chrono", @@ -2227,8 +2227,8 @@ dependencies = [ [[package]] name = "gpui-component-macros" -version = "0.7.3" -source = "git+https://github.com/Bombatomica64/gpui-kit?rev=4ff475436f9ba2f3d800e81155ce8c350eb19aba#4ff475436f9ba2f3d800e81155ce8c350eb19aba" +version = "0.8.0" +source = "git+https://github.com/Bombatomica64/gpui-kit?rev=18c9c775a4123d84582326aca1c79a228d399098#18c9c775a4123d84582326aca1c79a228d399098" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2238,8 +2238,8 @@ dependencies = [ [[package]] name = "gpui-fps" -version = "0.7.3" -source = "git+https://github.com/Bombatomica64/gpui-kit?rev=4ff475436f9ba2f3d800e81155ce8c350eb19aba#4ff475436f9ba2f3d800e81155ce8c350eb19aba" +version = "0.8.0" +source = "git+https://github.com/Bombatomica64/gpui-kit?rev=18c9c775a4123d84582326aca1c79a228d399098#18c9c775a4123d84582326aca1c79a228d399098" dependencies = [ "core-graphics 0.24.0", "gpui-pre", @@ -2279,8 +2279,8 @@ dependencies = [ [[package]] name = "gpui-kit" -version = "0.7.3" -source = "git+https://github.com/Bombatomica64/gpui-kit?rev=4ff475436f9ba2f3d800e81155ce8c350eb19aba#4ff475436f9ba2f3d800e81155ce8c350eb19aba" +version = "0.8.0" +source = "git+https://github.com/Bombatomica64/gpui-kit?rev=18c9c775a4123d84582326aca1c79a228d399098#18c9c775a4123d84582326aca1c79a228d399098" dependencies = [ "gpui-base", "gpui-component", @@ -2293,8 +2293,8 @@ dependencies = [ [[package]] name = "gpui-kit-assets" -version = "0.7.3" -source = "git+https://github.com/Bombatomica64/gpui-kit?rev=4ff475436f9ba2f3d800e81155ce8c350eb19aba#4ff475436f9ba2f3d800e81155ce8c350eb19aba" +version = "0.8.0" +source = "git+https://github.com/Bombatomica64/gpui-kit?rev=18c9c775a4123d84582326aca1c79a228d399098#18c9c775a4123d84582326aca1c79a228d399098" dependencies = [ "anyhow", "gpui-pre", diff --git a/Cargo.toml b/Cargo.toml index f3ea8d9..dbed2ea 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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] @@ -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. @@ -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. diff --git a/MOBILE_PATCHES.md b/MOBILE_PATCHES.md index 080d139..ed07d05 100644 --- a/MOBILE_PATCHES.md +++ b/MOBILE_PATCHES.md @@ -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 @@ -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, @@ -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 @@ -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` diff --git a/README.md b/README.md index 6ebfb9a..13878a8 100644 --- a/README.md +++ b/README.md @@ -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)**. @@ -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 | @@ -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** @@ -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), diff --git a/docs/hot-patching-plan.md b/docs/hot-patching-plan.md index 1b1dae8..828fe07 100644 --- a/docs/hot-patching-plan.md +++ b/docs/hot-patching-plan.md @@ -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 diff --git a/docs/upstream/README.md b/docs/upstream/README.md index 4396738..dfc994f 100644 --- a/docs/upstream/README.md +++ b/docs/upstream/README.md @@ -6,7 +6,7 @@ These are the fixes that live only in my forks of sent one at a time. This is item 8 of [CONTRIBUTING_IDEAS.md](../../CONTRIBUTING_IDEAS.md). The GPUI fixes for Zed are in [../upstream-zed](../upstream-zed/README.md). -Posted so far (2026-10-16): #1–#4 as gpui-kit #3554–#3557, #20 as +Posted so far (2026-10-16): #1–#4 as gpui-kit #3554–#3557 (merged, in v0.8.0), #20 as gpui-mobile #39, and the first two JNI PRs from issue #31 as gpui-mobile #40 and #41. The Kit ones were rebased onto Kit `main` 319b56cf first; the old branch tips are tagged `archive/2026-10-10/upstream/`. Each fix is a minimal branch named @@ -23,10 +23,10 @@ captures in [../demos](../demos) and say where a capture is missing. | # | Repo | Branch | Status | Depends on | Recording | Draft | | --- | --- | --- | --- | --- | --- | --- | -| 1 | kit | [`upstream/input-icon-button-labels`](https://github.com/Bombatomica64/gpui-kit/tree/upstream/input-icon-button-labels) | ✅ posted: [#3554](https://github.com/longbridge/gpui-kit/pull/3554) | — (the mask toggle half is in open #3424) | before: uiautomator dump; after: no | [draft](gpui-kit/input-icon-button-labels.md) | -| 2 | kit | [`upstream/input-masked-password-role`](https://github.com/Bombatomica64/gpui-kit/tree/upstream/input-masked-password-role) | ✅ posted: [#3555](https://github.com/longbridge/gpui-kit/pull/3555) | — | before: uiautomator dump; after: no | [draft](gpui-kit/input-masked-password-role.md) | -| 3 | kit | [`upstream/input-back-keeps-text`](https://github.com/Bombatomica64/gpui-kit/tree/upstream/input-back-keeps-text) | ✅ posted: [#3556](https://github.com/longbridge/gpui-kit/pull/3556) | — | before only | [draft](gpui-kit/input-back-keeps-text.md) | -| 4 | kit | [`upstream/input-text-input-configuration`](https://github.com/Bombatomica64/gpui-kit/tree/upstream/input-text-input-configuration) | ✅ posted: [#3557](https://github.com/longbridge/gpui-kit/pull/3557) | — (gpui-pre 0.3.8 has the API) | yes (Android, with #13) | [draft](gpui-kit/input-text-input-configuration.md) | +| 1 | kit | [`upstream/input-icon-button-labels`](https://github.com/Bombatomica64/gpui-kit/tree/upstream/input-icon-button-labels) | ✅ merged (v0.8.0): [#3554](https://github.com/longbridge/gpui-kit/pull/3554) | — (v0.8.0 names the mask toggle too) | before: uiautomator dump; after: no | [draft](gpui-kit/input-icon-button-labels.md) | +| 2 | kit | [`upstream/input-masked-password-role`](https://github.com/Bombatomica64/gpui-kit/tree/upstream/input-masked-password-role) | ✅ merged (v0.8.0): [#3555](https://github.com/longbridge/gpui-kit/pull/3555) | — | before: uiautomator dump; after: no | [draft](gpui-kit/input-masked-password-role.md) | +| 3 | kit | [`upstream/input-back-keeps-text`](https://github.com/Bombatomica64/gpui-kit/tree/upstream/input-back-keeps-text) | ✅ merged (v0.8.0): [#3556](https://github.com/longbridge/gpui-kit/pull/3556) | — | before only | [draft](gpui-kit/input-back-keeps-text.md) | +| 4 | kit | [`upstream/input-text-input-configuration`](https://github.com/Bombatomica64/gpui-kit/tree/upstream/input-text-input-configuration) | ✅ merged (v0.8.0): [#3557](https://github.com/longbridge/gpui-kit/pull/3557) | — (gpui-pre 0.3.8 has the API) | yes (Android, with #13) | [draft](gpui-kit/input-text-input-configuration.md) | | 5 | mobile | [`upstream/android-package-visibility`](https://github.com/Bombatomica64/gpui-mobile/tree/upstream/android-package-visibility) | ✅ (docs + manifest) | — | not needed | [draft](gpui-mobile/android-package-visibility.md) | | 6 | mobile | [`upstream/android-permission-errors`](https://github.com/Bombatomica64/gpui-mobile/tree/upstream/android-permission-errors) | ✅ | — | measured values | [draft](gpui-mobile/android-permission-errors.md) | | 7 | mobile | [`upstream/android-media-session`](https://github.com/Bombatomica64/gpui-mobile/tree/upstream/android-media-session) | ✅ | — | log lines | [draft](gpui-mobile/android-media-session.md) | @@ -46,10 +46,10 @@ captures in [../demos](../demos) and say where a capture is missing. Notes on the triage: -- **Not fixed upstream another way.** I checked upstream `main` and open PRs on both repos (2026-10-10). The one overlap is gpui-kit #3424 (open, by another contributor), which names the password mask toggle. Our labels branch was trimmed to the clear button, so it doesn't duplicate #3424. Kit `main` already gives `content_type(Password)` the `PasswordInput` role; #2 adds it for `masked(true)` alone. +- **Not fixed upstream another way.** I checked upstream `main` and open PRs on both repos (2026-10-10). The one overlap is gpui-kit #3424 (open, by another contributor), which names the password mask toggle. My labels branch was trimmed to the clear button, so it doesn't duplicate #3424. Kit `main` already gives `content_type(Password)` the `PasswordInput` role; #2 adds it for `masked(true)` alone. - **Split for one concern each.** Fork branch `android-callbacks` became #7 (media session) + #8 (deep links), and `android-notifications-links` became #9 (notifications) + #5 (`` docs). - **Ported off the JNI rework.** #9, #10 and #13 used the `or_clear` helper from issue #31's rework. They now use the `map_err` + `exception_clear` idiom already in upstream `main` (one explicit clear in #13). Their Java files are byte-identical to the fork's, which the fork's CI built. -- **Kit branches were tested against Kit `main`.** Our earlier tests were against v0.7.1, which the lab pins. #1 and #2 gained a UI test each, in the style of #3424. +- **Kit branches were tested against Kit `main`.** My earlier tests were against v0.7.1, which the lab pins. #1 and #2 gained a UI test each, in the style of #3424. ## Checks run @@ -62,7 +62,7 @@ Not compiled: #16 and #17, which need the unreleased GPUI field. ## Suggested send order -#25, #29 and #30 are merged. gpui-mobile now has #39–#41 open from us, so +#25, #29 and #30 are merged. gpui-mobile now has #39–#41 open from me, so send the next ones there as those land. 1. **Kit, now, one or two at a time:** #1 (clear label), #2 (masked role), #3 (back keeps text), #4 (text input configuration). They're independent of each other. #4 is the only one with new public API. #3 is the one most likely to get a design question (Android-only `cfg`). diff --git a/docs/upstream/gpui-kit/input-icon-button-labels.md b/docs/upstream/gpui-kit/input-icon-button-labels.md index 4a3f977..3d9b2ec 100644 --- a/docs/upstream/gpui-kit/input-icon-button-labels.md +++ b/docs/upstream/gpui-kit/input-icon-button-labels.md @@ -3,7 +3,7 @@ - Branch: [`upstream/input-icon-button-labels`](https://github.com/Bombatomica64/gpui-kit/tree/upstream/input-icon-button-labels), one commit on upstream `main` (0bbd9870) - Diff: 3 files, +37 (one `accessibility_label`, one localized string, a 29-line UI test) - Depends on: nothing. -- **Trimmed for upstream.** My fork branch also named the password mask toggle. Open PR longbridge/gpui-kit#3424 (counterbeing, 2026-10-09) does exactly that ("Show password" / "Hide password", plus the sidebar caret), so that half is dropped here to avoid a duplicate. Our string keys (`Input.Show password`) differed from #3424's (`Input.Show Password`), so there's no conflict either way. +- **Trimmed for upstream.** My fork branch also named the password mask toggle. Open PR longbridge/gpui-kit#3424 (counterbeing, 2026-10-09) does exactly that ("Show password" / "Hide password", plus the sidebar caret), so that half is dropped here to avoid a duplicate. My string keys (`Input.Show password`) differed from #3424's (`Input.Show Password`), so there's no conflict either way. - Recording: before, a `uiautomator dump` ([a11y-text-input-baseline.xml](../../demos/a11y-text-input-baseline.xml)): every clear button is an `android.widget.Button` with empty `text` and `content-desc`. After: checked with uiautomator and TalkBack (Gpui-android#38), but no screenshot. A TalkBack screenshot would help; a follow-up. --- diff --git a/docs/upstream/hot-reload-discussion.md b/docs/upstream/hot-reload-discussion.md index 34c5897..dbfe9cd 100644 --- a/docs/upstream/hot-reload-discussion.md +++ b/docs/upstream/hot-reload-discussion.md @@ -6,8 +6,8 @@ --- -Hi! While building a test app on gpui-mobile we made Rust hot reload work on -Android, and we'd like to know whether you find it useful and where you'd +Hi! While building a test app on gpui-mobile I made Rust hot reload work on +Android, and I'd like to know whether you find it useful and where you'd like it to live. ## What it is @@ -50,12 +50,12 @@ with a 32-screen test app: | Save → change on screen (patch) | 3.3–3.6 s | | Reload with a 1.4 MB delta, same screen | 8.3 s | -Over USB the push part (~1.5 s of each patch) should shrink; we haven't +Over USB the push part (~1.5 s of each patch) should shrink; I haven't measured that yet. ![Patches applied on the phone](https://raw.githubusercontent.com/Bombatomica64/Gpui-android/main/docs/demos/subsecond-buttons-patches.png) -*From our first prototype: a title, a colour and a layout changed live while +*From my first prototype: a title, a colour and a layout changed live while the click counter kept its value (3).* ## How it's split @@ -79,7 +79,7 @@ the click counter kept its value (3).* - keep it as a separate project that apps opt into; - move the tool under longbridge; - or bring it into gpui-mobile itself. -3. Would you take `GpuiLibraryLoader` as a small PR? We can open it +3. Would you take `GpuiLibraryLoader` as a small PR? I can open it whenever you like. Known limits: Android arm64 debug builds only; host-driven Activities only diff --git a/docs/upstream/replies/gpui-mobile-25.md b/docs/upstream/replies/gpui-mobile-25.md index 345ab34..3842528 100644 --- a/docs/upstream/replies/gpui-mobile-25.md +++ b/docs/upstream/replies/gpui-mobile-25.md @@ -51,7 +51,7 @@ Non-blocking: Nothing takes `BRIDGE` on the UI thread any more. An `AccessibilityStateChangeListener` would need a Java class, which this crate doesn't ship, so I kept the per-frame call. It is a synchronized field read. -- **Two jni versions**: the second one stays as long as we use +- **Two jni versions**: the second one stays as long as the bridge uses `accesskit_android`, because `InjectingAdapter::new` takes its jni 0.21 `JNIEnv`. The VM is no longer rebuilt per attach (31d79d8). - **Hover before `hit_test`** (6d443bd): moved. diff --git a/src/lib.rs b/src/lib.rs index 5a898cb..5cf95af 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,4 @@ -//! GPUI Kit Mobile Lab: an on-device component gallery for GPUI Kit v0.7.3. +//! GPUI Kit Mobile Lab: an on-device component gallery for GPUI Kit v0.8.0. extern crate gpui_mobile; @@ -12,7 +12,7 @@ mod ui; use gpui::{App, AppContext as _, WindowOptions}; -pub const GPUI_KIT_VERSION: &str = "0.7.3"; +pub const GPUI_KIT_VERSION: &str = "0.8.0"; pub const GPUI_VERSION: &str = "gpui-pre 0.3.9"; pub const GPUI_MOBILE_REVISION: &str = "Bombatomica64/gpui-mobile 7f52b45"; diff --git a/src/screens/text_input.rs b/src/screens/text_input.rs index becc473..1cbbdc7 100644 --- a/src/screens/text_input.rs +++ b/src/screens/text_input.rs @@ -73,7 +73,9 @@ impl TextInputScreen { }), make("message", window, cx, &|s| { s.input_action(TextInputAction::Send) - .placeholder("Message (Send key)") + .autocorrect(true) + .autocapitalize(Autocapitalize::Sentences) + .placeholder("Message (autocorrect, Send key)") }), make("pin", window, cx, &|s| { s.masked(true).mask_pattern("9999").placeholder("PIN (digit keyboard)")