Skip to content

Honor "Hidden" points of interest for bus stops and declutter at low zoom#6

Merged
dizzafizza merged 2 commits into
mainfrom
claude/fork-code-review-33fkom
Jul 15, 2026
Merged

Honor "Hidden" points of interest for bus stops and declutter at low zoom#6
dizzafizza merged 2 commits into
mainfrom
claude/fork-code-review-33fkom

Conversation

@dizzafizza

Copy link
Copy Markdown
Owner

Summary

Two issues reported after bus stops started loading reliably (#5): setting Points of Interest to "Hidden" didn't hide bus stops, and zoomed out, the stops overlapped into an unreadable stack of pins (see reported screenshot — a wall of stacked bus icons across a multi-city view).

Changes

Why "Hidden" didn't work: bus stop markers are drawn as the app's own Marker overlay built from Overpass data, not Apple's native points-of-interest layer. The "Hidden" setting only sets MapStyle's pointsOfInterest category filter, which exclusively affects Apple's built-in POI icons (restaurants, shops, etc.) — it has no effect on our custom overlay, so the bus stops kept showing regardless of the setting.

Why it looked crowded: every fetched bus stop got its own marker with no thinning. A bus route easily has dozens of stops, and at a city-wide zoom they visually overlap into a stack.

Fixes:

  • Gate the bus stop markers on mapPointsOfInterestMode != .hidden, so "Hidden" now actually hides them.
  • Track the map's visible latitude span via onMapCameraChange and thin markers through the existing spatial-merge (dedupedBusStops) logic, with spacing that scales with the visible span — full detail at close zoom, progressively fewer markers as the map zooms out. The full-fidelity routeBusStops list (used for dwell pacing during route playback) is untouched; only the on-screen marker set is thinned.

Testing

  • Verified the declutter math in isolation across three zoom levels on a synthetic 40-stop route: all 40 shown at ~1km span (close zoom), thinned to 20 at ~10km span, thinned to 12 at ~150km span (comparable to the reported screenshot's extent).
  • Confirmed the change compiles and archives successfully via the Build Debug IPA CI workflow on this branch.
  • Tested on device
  • Tested with fresh pairing file

Screenshots

N/A — verified via isolated math simulation rather than a live screenshot; happy to follow up with an on-device screenshot if useful.


Generated by Claude Code

claude added 2 commits July 15, 2026 05:38
…zoom

Bus stop markers are our own Marker overlay drawn from Overpass data, not
Apple's native POI layer, so setting Points of Interest to "Hidden" (which
only sets MapStyle's pointsOfInterest category filter) had no effect on
them -- they kept showing regardless of the setting.

Separately, a bus route can have dozens of stops close together; zoomed
out they overlap into an unreadable stack of pins (see reported
screenshot: a wall of stacked bus icons across a multi-city view).

Fixes:
- Gate the bus stop markers on mapPointsOfInterestMode != .hidden so
  "Hidden" actually hides them.
- Track the map's visible latitude span via onMapCameraChange and thin
  markers through the existing dedupedBusStops spatial merge, using a
  spacing that scales with the visible span -- full detail at close zoom,
  progressively fewer markers as the map zooms out. The full-fidelity
  routeBusStops list (used for dwell pacing during playback) is
  untouched; only the on-screen marker set is thinned.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013DNqCsHShA4yNqgZ6ZZQy3
The experimental "Hold App Alive in Background" mode attached the debugger
(setting CS_DEBUGGED) but never ran the app's assigned JIT script. On
TXM / iOS 26+ devices JIT is not enabled merely by attaching: the app
requests executable memory at runtime via `brk #0xf00d` syscalls that the
debugger must service, which is exactly what the JIT script does in its
breakpoint loop. Without the script those syscalls went unhandled, so the
app trapped and hung (or JIT silently failed) on its first JIT call --
"the JIT script doesn't run when attaching to an app."

Thread the same JIT-script callback the normal debug path uses through
the hold flow:

- HomeView.startKeepAlive resolves the app's preferred script (gated on
  hasTXM, exactly like startJITInBackground) and passes it down.
- BackgroundAliveManager.start and JITEnableContext.keepAppAlive forward
  it to holdDebugSession.
- holdDebugSession, when a script is present, runs it (the script does its
  own vAttach + JIT enable + continue and services the app's JIT syscalls
  for as long as the app uses JIT, keeping the app alive under the
  debugger). When absent it keeps the previous attach-and-hold behavior
  for older devices where CS_DEBUGGED alone enables JIT.

The normal (non-hold) JIT path is unchanged. Known limitation: for an app
whose script runs continuously, the hold ends when the app is closed
(matching the normal flow, which likewise cannot interrupt a running
script); the Stop button fully applies to the no-script hold path.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013DNqCsHShA4yNqgZ6ZZQy3
@dizzafizza
dizzafizza merged commit 5c3c37a into main Jul 15, 2026
2 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.

2 participants