0
0
Fork
You've already forked comaps
0
forked from comaps/comaps

carplay-dashboard #19

Open
eisa01 wants to merge 22 commits from carplay-dashboard into main
pull from: carplay-dashboard
merge into: eisa01:main
eisa01:main
eisa01:multi-surface-map-rendering
eisa01:private-testflight/2026-07-14
eisa01:carplay-dashboard-support
eisa01:modes-ui
eisa01:eisa01/carplay-road-shields
eisa01:carplay-0708
eisa01:forgejo-macos-runner
eisa01:create-venv
eisa01:carplay-0706
eisa01:carplay-0704-findings
eisa01:fable-review
eisa01:testflight/2026.06.30
eisa01:carplay-om-code-review
eisa01:carplay-code-review-jun28
eisa01:carplay-dashboard-mvp2
eisa01:car-follow-on-reacquire
eisa01:carplay-location-keepalive
eisa01:testflight/2026.06.20
eisa01:carplay-roundabout-exit-number
eisa01:carplay-destination
eisa01:carplay-dashboard-mvp
eisa01:name-cherry-picking
eisa01:om-pr-11243-2
eisa01:icu-cjk-fix
eisa01:simple-cjk-fix
eisa01:fix-crash-search
eisa01:scene-support
eisa01:om-carplay-button
eisa01:om-pr-10545
eisa01:submodule-main-branch
eisa01:improve-unit-testing-docs
No description provided.
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
Adds CarPlay dashboard support (live map in the dashboard tile, arrow
centering and car visual scale) and the scene/app-lifecycle plumbing it
needs: showing the map without a connected phone scene, keeping the map
running while the phone is locked, maintaining a GPS fix, following the
position on cold launch into the car screen, and driving the app
lifecycle from aggregate UIApplication notifications via a single-layer
lifecycle observer.
Signed-off-by: eisa01 <eisa01@gmail.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The car inherited whatever zoom level the phone was at (drape preserves
meters-per-pixel across host switches), which reads too close on a car
screen and especially in the small dashboard tile. Zoom out to level 15
once per CarPlay session, when the map first follows the position on a
car screen and no route is active, leaving navigation auto-zoom and
manual zooming alone.
Adds FrameworkHelper.setZoomLevel using relative scaling, which unlike
SetViewportCenter keeps the location follow mode intact.
Signed-off-by: eisa01 <eisa01@gmail.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
UpdateDependentParameters only rebuilt the 3D projection matrices when the
perspective angle moved by more than kEps. At angle 0 SetRotationAngle builds a
singular projection whose inverse (m_3dtoP) is NaN/Inf; that is only safe while
m_isPerspective is false. If perspective turned on for a sub-kEps angle, the
delta check skipped the rebuild and left the NaN matrix active, corrupting
P3dtoP/PtoP3d and through them m_Org -> a NaN screen rect that trips the
m2::Rect min<=max assert (rect2d.hpp:45).
Rebuild whenever m_isPerspective flips, not just when the angle delta exceeds
kEps.
🤖 Generated with [Claude Code](https://claude.ai/code)
Signed-off-by: eisa01 <eisa01@gmail.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Stress-testing CarPlay (rapid CarPlay<->phone switching, stop nav on the phone,
then re-open the CoMaps CarPlay icon) reproducibly aborted the debug build:
 m2::Rect<double>::Rect(...) ASSERT(minX<=maxX && minY<=maxY) rect2d.hpp:45
 +[MWMFrameworkHelper setVisibleViewport:scaleFactor:]
 CarPlayMapViewController.updateVisibleViewPortToNavigationState()
 CarPlayMapViewController.viewDidLayoutSubviews()
 -[CPWindow updateLayoutGuideWithInsets:] (layout-guide inset animation)
During the layout-guide animation / scene handoff the inset rect is transiently
degenerate or non-finite, so setVisibleViewport built an invalid m2::RectD whose
min<=max assert aborted the app (and would silently corrupt the viewport in
release).
setVisibleViewport now validates its input before constructing the rect: it
returns early unless scale is finite and > 0 and all four computed coordinates
are finite with x1 > x0 and y1 > y0. This guards every caller, not just CarPlay.
CarPlayMapViewController.updateVisibleViewPort additionally drops the frame up
front when the origin/size are not finite or the content scale factor is not
finite/positive; the previous width/height>0 check let a NaN origin through.
🤖 Generated with [Claude Code](https://claude.ai/code)
Signed-off-by: eisa01 <eisa01@gmail.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The CarPlay position-mode map button was built with a default glyph and
relied on callers to sync its icon to the actual mode afterwards. Several
template paths never did, so the button showed a stale icon — most visibly
when changing follow/follow-and-rotate on the phone and returning to a car
screen, but also on trip cancel and when starting navigation.
Build the button from a single source of truth (current position mode) in
buildMyPositionModeButton(), used by both base and navigation UI, so every
template path is correct by construction. Re-sync the live button on
re-host (dashboard/app switch) where no rebuild happens.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: eisa01 <eisa01@gmail.com>
This pull request has changes conflicting with the target branch.
  • data/styles/outdoors/dark/style.mapcss
  • data/styles/outdoors/light/style.mapcss
  • data/styles/vehicle/dark/style.mapcss
  • data/styles/vehicle/light/style.mapcss
  • data/styles/walking/dark/symbols/planet-m.svg
  • data/styles/walking/dark/symbols/planet-s.svg
  • data/styles/walking/dark/symbols/shield-brazil-ac-scaled.svg
  • data/styles/walking/dark/symbols/shield-brazil-ac.svg
  • data/styles/walking/dark/symbols/shield-brazil-al-scaled.svg
  • data/styles/walking/dark/symbols/shield-brazil-al.svg
  • data/styles/walking/dark/symbols/shield-brazil-am-scaled.svg
  • data/styles/walking/dark/symbols/shield-brazil-am.svg
  • data/styles/walking/dark/symbols/shield-brazil-ap-scaled.svg
  • data/styles/walking/dark/symbols/shield-brazil-ap.svg
  • data/styles/walking/dark/symbols/shield-brazil-ba-scaled.svg
  • data/styles/walking/dark/symbols/shield-brazil-ba.svg
  • data/styles/walking/dark/symbols/shield-brazil-ce-scaled.svg
  • data/styles/walking/dark/symbols/shield-brazil-ce.svg
  • data/styles/walking/dark/symbols/shield-brazil-df-scaled.svg
  • data/styles/walking/dark/symbols/shield-brazil-df.svg
  • data/styles/walking/dark/symbols/shield-brazil-es-scaled.svg
  • data/styles/walking/dark/symbols/shield-brazil-es.svg
  • data/styles/walking/dark/symbols/shield-brazil-go-scaled.svg
  • data/styles/walking/dark/symbols/shield-brazil-go.svg
  • data/styles/walking/dark/symbols/shield-brazil-ma-scaled.svg
  • data/styles/walking/dark/symbols/shield-brazil-ma.svg
  • data/styles/walking/dark/symbols/shield-brazil-mg-scaled.svg
  • data/styles/walking/dark/symbols/shield-brazil-mg.svg
  • data/styles/walking/dark/symbols/shield-brazil-ms-scaled.svg
  • data/styles/walking/dark/symbols/shield-brazil-ms.svg
  • data/styles/walking/dark/symbols/shield-brazil-mt-scaled.svg
  • data/styles/walking/dark/symbols/shield-brazil-mt.svg
  • data/styles/walking/dark/symbols/shield-brazil-national-scaled.svg
  • data/styles/walking/dark/symbols/shield-brazil-national.svg
  • data/styles/walking/dark/symbols/shield-brazil-pa-scaled.svg
  • data/styles/walking/dark/symbols/shield-brazil-pa.svg
  • data/styles/walking/dark/symbols/shield-brazil-pb-scaled.svg
  • data/styles/walking/dark/symbols/shield-brazil-pb.svg
  • data/styles/walking/dark/symbols/shield-brazil-pe-scaled.svg
  • data/styles/walking/dark/symbols/shield-brazil-pe.svg
  • data/styles/walking/dark/symbols/shield-brazil-pi-scaled.svg
  • data/styles/walking/dark/symbols/shield-brazil-pi.svg
  • data/styles/walking/dark/symbols/shield-brazil-pr-scaled.svg
  • data/styles/walking/dark/symbols/shield-brazil-pr.svg
  • data/styles/walking/dark/symbols/shield-brazil-rj-scaled.svg
  • data/styles/walking/dark/symbols/shield-brazil-rj.svg
  • data/styles/walking/dark/symbols/shield-brazil-rn-scaled.svg
  • data/styles/walking/dark/symbols/shield-brazil-rn.svg
  • data/styles/walking/dark/symbols/shield-brazil-ro-scaled.svg
  • data/styles/walking/dark/symbols/shield-brazil-ro.svg
  • data/styles/walking/dark/symbols/shield-brazil-rr-scaled.svg
  • data/styles/walking/dark/symbols/shield-brazil-rr.svg
  • data/styles/walking/dark/symbols/shield-brazil-rs-scaled.svg
  • data/styles/walking/dark/symbols/shield-brazil-rs.svg
  • data/styles/walking/dark/symbols/shield-brazil-sc-scaled.svg
  • data/styles/walking/dark/symbols/shield-brazil-sc.svg
  • data/styles/walking/dark/symbols/shield-brazil-se-scaled.svg
  • data/styles/walking/dark/symbols/shield-brazil-se.svg
  • data/styles/walking/dark/symbols/shield-brazil-sp-scaled.svg
  • data/styles/walking/dark/symbols/shield-brazil-sp.svg
  • data/styles/walking/dark/symbols/shield-brazil-to-scaled.svg
  • data/styles/walking/dark/symbols/shield-brazil-to.svg
  • data/styles/walking/dark/symbols/stage-m.svg
  • data/styles/walking/dark/symbols/toilets_private-m.svg
  • data/styles/walking/light/symbols/planet-m.svg
  • data/styles/walking/light/symbols/planet-s.svg
  • data/styles/walking/light/symbols/shield-brazil-ac-scaled.svg
  • data/styles/walking/light/symbols/shield-brazil-ac.svg
  • data/styles/walking/light/symbols/shield-brazil-al-scaled.svg
  • data/styles/walking/light/symbols/shield-brazil-al.svg
  • data/styles/walking/light/symbols/shield-brazil-am-scaled.svg
  • data/styles/walking/light/symbols/shield-brazil-am.svg
  • data/styles/walking/light/symbols/shield-brazil-ap-scaled.svg
  • data/styles/walking/light/symbols/shield-brazil-ap.svg
  • data/styles/walking/light/symbols/shield-brazil-ba-scaled.svg
  • data/styles/walking/light/symbols/shield-brazil-ba.svg
  • data/styles/walking/light/symbols/shield-brazil-ce-scaled.svg
  • data/styles/walking/light/symbols/shield-brazil-ce.svg
  • data/styles/walking/light/symbols/shield-brazil-df-scaled.svg
  • data/styles/walking/light/symbols/shield-brazil-df.svg
  • data/styles/walking/light/symbols/shield-brazil-es-scaled.svg
  • data/styles/walking/light/symbols/shield-brazil-es.svg
  • data/styles/walking/light/symbols/shield-brazil-go-scaled.svg
  • data/styles/walking/light/symbols/shield-brazil-go.svg
  • data/styles/walking/light/symbols/shield-brazil-ma-scaled.svg
  • data/styles/walking/light/symbols/shield-brazil-ma.svg
  • data/styles/walking/light/symbols/shield-brazil-mg-scaled.svg
  • data/styles/walking/light/symbols/shield-brazil-mg.svg
  • data/styles/walking/light/symbols/shield-brazil-ms-scaled.svg
  • data/styles/walking/light/symbols/shield-brazil-ms.svg
  • data/styles/walking/light/symbols/shield-brazil-mt-scaled.svg
  • data/styles/walking/light/symbols/shield-brazil-mt.svg
  • data/styles/walking/light/symbols/shield-brazil-national-scaled.svg
  • data/styles/walking/light/symbols/shield-brazil-national.svg
  • data/styles/walking/light/symbols/shield-brazil-pa-scaled.svg
  • data/styles/walking/light/symbols/shield-brazil-pa.svg
  • data/styles/walking/light/symbols/shield-brazil-pb-scaled.svg
  • data/styles/walking/light/symbols/shield-brazil-pb.svg
  • data/styles/walking/light/symbols/shield-brazil-pe-scaled.svg
  • data/styles/walking/light/symbols/shield-brazil-pe.svg
  • data/styles/walking/light/symbols/shield-brazil-pi-scaled.svg
  • data/styles/walking/light/symbols/shield-brazil-pi.svg
  • data/styles/walking/light/symbols/shield-brazil-pr-scaled.svg
  • data/styles/walking/light/symbols/shield-brazil-pr.svg
  • data/styles/walking/light/symbols/shield-brazil-rj-scaled.svg
  • data/styles/walking/light/symbols/shield-brazil-rj.svg
  • data/styles/walking/light/symbols/shield-brazil-rn-scaled.svg
  • data/styles/walking/light/symbols/shield-brazil-rn.svg
  • data/styles/walking/light/symbols/shield-brazil-ro-scaled.svg
  • data/styles/walking/light/symbols/shield-brazil-ro.svg
  • data/styles/walking/light/symbols/shield-brazil-rr-scaled.svg
  • data/styles/walking/light/symbols/shield-brazil-rr.svg
  • data/styles/walking/light/symbols/shield-brazil-rs-scaled.svg
  • data/styles/walking/light/symbols/shield-brazil-rs.svg
  • data/styles/walking/light/symbols/shield-brazil-sc-scaled.svg
  • data/styles/walking/light/symbols/shield-brazil-sc.svg
  • data/styles/walking/light/symbols/shield-brazil-se-scaled.svg
  • data/styles/walking/light/symbols/shield-brazil-se.svg
  • data/styles/walking/light/symbols/shield-brazil-sp-scaled.svg
  • data/styles/walking/light/symbols/shield-brazil-sp.svg
  • data/styles/walking/light/symbols/shield-brazil-to-scaled.svg
  • data/styles/walking/light/symbols/shield-brazil-to.svg
  • data/styles/walking/light/symbols/stage-m.svg
  • data/styles/walking/light/symbols/toilets_private-m.svg
  • data/styles/walking_outdoor/include/priorities_3_FG.prio.txt
  • data/styles/walking_outdoor/include/priorities_4_overlays.prio.txt
  • iphone/Maps/Classes/CarPlay/Template Builders/MapTemplateBuilder.swift
  • iphone/Maps/Classes/CustomViews/NavigationDashboard/Views/RoutePreview/MWMiPhoneRoutePreview.xib
  • iphone/Maps/Classes/CustomViews/NavigationDashboard/Views/RoutePreview/RoutePreviewStatus/BaseRoutePreviewStatus.swift
  • iphone/Maps/Maps.xcodeproj/project.pbxproj
View command line instructions

Manual merge helper

Use this merge commit message when completing the merge manually.

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin carplay-dashboard:carplay-dashboard
git switch carplay-dashboard

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch main
git merge --no-ff carplay-dashboard
git switch carplay-dashboard
git rebase main
git switch main
git merge --ff-only carplay-dashboard
git switch carplay-dashboard
git rebase main
git switch main
git merge --no-ff carplay-dashboard
git switch main
git merge --squash carplay-dashboard
git switch main
git merge --ff-only carplay-dashboard
git switch main
git merge carplay-dashboard
git push origin main
Sign in to join this conversation.
No reviewers
Labels
Clear labels
No items
No labels
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
eisa01/comaps!19
Reference in a new issue
eisa01/comaps
No description provided.
Delete branch "carplay-dashboard"

Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?