Skip to content

MOB-380: on_press_in/on_press_out, held-press Mob.Test API, press-node taps survive re-render - #187

Merged
GenericJam merged 4 commits into
masterfrom
feat/MOB-380-press-hold
Oct 4, 2026
Merged

GenericJam merged 4 commits into
masterfrom
feat/MOB-380-press-hold

Conversation

@GenericJam

@GenericJam GenericJam commented Oct 4, 2026 •

Copy link
Copy Markdown
Owner

Linear: MOB-380 (speech part: MOB-21 → mob_speech plugin).

  • on_press_in / on_press_out on any node → {:press_in, tag} / {:press_out, tag}; observe without consuming; paired via a touch-down snapshot of press_out's routing (zig mob_press_begin/end, iOS mob_begin_press). iOS 18+ UIKit observer, iOS 17 DragGesture fallback. Android observer lives in mob_new's bridge (GenericJam/mob_new MOB-380 PR, mob_new 0.6.5).
  • A press node's tap (node also declaring on_press_in/out) goes through the new identity-tolerant mob_send_press_tap (same slot+pid+tag): a press's re-render was dropping 1–9/80 tap_xy taps on the emulator; 0/160 after. Plain taps keep the generation-strict mob_send_tap (486ac5b, after review found a stale positional Mob.List {:select, id, index} could otherwise hit a moved row). Re-verified on the emulator: 20/20 taps at 300 ms and 80 ms gaps on two press nodes and a plain re-rendering node.
  • Mob.Test.press_down_xy/4, press_move_xy/3, press_up_xy/3, hold_xy/4 hold a real in-process pointer on Android (Compose detectTapGestures sees onPress/tryAwaitRelease); by-tag press_in/2, press_out/2, hold/3 everywhere; iOS xy → :not_supported.
  • Decision: decisions/2026-10-03-press-in-out-and-held-press.md.

Verified: Android emulator (hold_xy 1500 → press_in..press_out 1669ms → tap; Compose probe pressed/long_press/released held_ms≈hold); iOS 26 simulator with real XCTest touches. Not run on physical iPhone.

Review: reviewer subagent (Codex rate-limited until 7:20 PM): DO NOT SHIP only on mob_new's mob floor (fixed in the mob_new PR); other findings fixed. Merge-time re-review pending.

Release: mob 0.9.12 (after 0.9.11, MOB-379).

GenericJam and others added 3 commits October 3, 2026 18:51
…tolerant taps

Press in/out on any node (iOS UIKit observer, Android via the generated
bridge), paired through a touch-down snapshot of press_out's routing.
Mob.Test.press_down_xy/press_move_xy/press_up_xy/hold_xy hold a real
in-process pointer on Android; by-tag press_in/press_out/hold everywhere.
Taps resolve identity-tolerantly: a press's re-render was dropping them.

Pre-commit review: reviewer subagent (Codex rate-limited until 7:20 PM);
findings fixed (timeout code, max-hold vs move race, doc accuracy).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Merge review: reviewer subagent (Codex rate-limited until 7:20 PM).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review found that making every tap identity-tolerant lets a stale
positional tag (Mob.List's {:select, id, index}) reach whichever row the
list moved into that index. mob_send_tap is strict again. The new
mob_send_press_tap resolves by identity and is used only for a node that
also declares on_press_in / on_press_out (iOS: chosen in the on_tap
deserialiser; Android: the generated bridge's nativeSendPressTap).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@GenericJam GenericJam changed the title MOB-380: on_press_in/on_press_out, held-press Mob.Test API, identity-tolerant taps MOB-380: on_press_in/on_press_out, held-press Mob.Test API, press-node taps survive re-render Oct 4, 2026
…ror), held-press note on tap_xy

Reviewer subagent (Codex rate-limited until 7:20 PM): MERGE; these are its nitpicks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@GenericJam

Copy link
Copy Markdown
Owner Author

Merge review: reviewer subagent (Codex rate-limited until 7:20 PM): DO NOT MERGE on f8c1a4c (stale positional tap via identity-tolerant taps) → fixed in 486ac5b (plain taps strict; only press nodes use mob_send_press_tap) → MERGE; nitpicks fixed in e7fdce4 → re-review MERGE, no findings. Emulator re-run after the fix: 20/20 taps at 300 ms and 80 ms gaps on two press nodes and on a plain re-rendering node, press_in/press_out paired. CI tests run 37167577852 green on e7fdce4. Not changed (reviewer: non-blocking): disabled nodes still report press_in/press_out.

@GenericJam
GenericJam merged commit b216483 into master Oct 4, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant