Skip to content

VeloSpot v1.0.21

Choose a tag to compare

@github-actions github-actions released this 21 Jun 17:55
89cdcc7

VeloSpot v1.0.21

Added

  • Share a location with other apps β€” the detail sheets for a custom map pin, an address search result, a bike parking space and a saved favourite now carry a Share action that opens the system share sheet with a universal OpenStreetMap web link (plus the resolved name/address as the first line), so you can send a spot to WhatsApp, Telegram, e-mail, etc. Built on a small LocationSharer (in core/share, symmetric to ImageSharer). Fully localised across all eight supported languages.

  • Leaner, cleaner map UI + new ride features β€” a focused pass that declutters the map and adds practical navigation tools, all localised across the eight supported languages:

    • Unified top bar + Settings sheet β€” the cramped top-bar dropdown menu (which mixed quick actions and settings) is gone. The map now carries just a search field and a single round menu button that opens a tidy Settings bottom sheet, grouping everything into clear sections: Quick actions (favourites, parked bike, rides, round trip), Appearance & map (dark mode, language, map view, layers), Routing (offline routing, about) and a Developer section (the GPS simulator in debug builds). The menu button is tinted when offline routing is active (SettingsSheet, MapMenuCard, MapScreenUiState).
    • Slimmer navigation card β€” the bulky active-navigation card is now a compact, glanceable pill showing distance Β· ETA and live speed with a round stop button; tapping it expands to reveal the destination name and the route's elevation profile (MapNavigationOverlay).
    • Minimal navigation mode β€” while navigating, all map clutter that isn't part of the trip (other parking spots, saved places, search pins) is hidden, leaving just the route, the destination and the live position for a clean, focused view (MapMarkerRenderer.minimalNavMode).
    • Turn-by-turn banner β€” a top banner now announces the next turn ("In 120 m β€” Turn left") with an arrow that rotates to point the way. It's derived purely from the route geometry, so it works for both BRouter offline and OSRM online routes, and animates in/out as a turn approaches (RouteMatcher.nextTurn, NavigationProgress, MapTurnBanner).
    • Round-trip generator β€” a new Round trip action generates a circular route that starts and ends at your current position; pick a target distance (5–50 km) and BRouter builds a loop back home (offline routing required). Uses BRouter's native round-trip support (BRouterEngine.calculateRoundTrip, RoutingRepository.getRoundTrip, RoundTripSheet, NavigationController.startRoundTrip).
    • Route elevation profile β€” the expanded navigation pill now shows a compact elevation graph of the route (distance vs. terrain height) with total ascent ↑ / descent ↓, drawn from BRouter's per-node elevation data with a plain Canvas (RouteElevationProfile).
    • Cancellable route calculation with progress β€” while a route is being computed the loading card now shows a progress bar and a running elapsed-seconds counter, plus a Cancel button. Cancelling propagates into the BRouter engine, which aborts its search at the next loop check (RoutingEngine.terminate) instead of running to completion β€” handy for long trips you didn't mean to start (BRouterEngine.runEngine, NavigationController.cancelRouteCalculation, MapNavigationOverlay).
  • Offline routing: full Germany/France/Luxembourg download + automatic on-demand tiles β€” the offline-routing setup now offers two choices instead of silently grabbing one tile: "Download my region" (the single 5°×5Β° BRouter tile around your current position, ~250 MB) and "Download all of Germany, France & Luxembourg" (the curated set of 12 land tiles covering the three supported countries, ~2–2.5 GB), with a resumable per-file progress indicator (BRouterSegmentManager.COUNTRY_SEGMENTS / downloadCountrySegments, OfflineRoutingController, two-button OfflineRoutingSetupSheet). On top of that, offline navigation is no longer limited to the pre-downloaded tile: when you route to a destination whose tile is missing, the router now downloads the needed tile(s) for that route on demand (RoutingRepositoryImpl β†’ BRouterSegmentManager.ensureSegments) and routes offline, only falling back to the online OSRM router when the download can't happen (no connectivity). Governed by a new OfflineRoutingPreferences.isOnDemandDownloadEnabled flag (default on). Fully localised across all eight supported languages.

Changed

  • Faster offline route calculation on long trips: the in-memory segment node cache (RoutingContext.memoryclass) is no longer left at BRouter's conservative 64 MB default but sized to the device (β‰ˆ half the app heap budget, clamped 96–256 MB), so long routes stop thrashing the cache (evict β†’ re-read β†’ re-decode segments from disk); and the standstill start-U-turn correction β€” which recomputes the entire route a second time β€” is now skipped beyond ~30 km, where the start spur is negligible relative to the trip and a full recompute is the dominant cost (BRouterEngine).
  • "Download my region" is bound to your actual position β€” the single-tile download no longer falls back to a hard-coded default region when there's no GPS fix; it now requires a real location and surfaces LocationUnavailable otherwise, so it always fetches the tile you're actually in (OfflineRoutingController).
  • BRouter cycling profiles de-prefer pavements and favour quiet streets in town (gravel.brf, trekking.brf, PROFILES_VERSION 2 β†’ 4) β€” footways/sidewalks with bike permission are made more expensive and quiet carriageways (residential / living-street / unclassified / service) cheaper, so urban routes stop hugging the pavement next to the road; dedicated cycleways stay preferred for safety.

Fixed

  • Saved-place pins now actually show their star β€” the green saved-place pin (custom pins stored as named favourites) was documented and intended to carry a white star to set it apart from the transient blue custom pin and the red address-search pin, but the star was never drawn. The pin now renders a crisp white five-pointed star on its green body, so saved favourites are instantly recognisable on the map again (MarkerIconFactory.createSavedPlaceIcon).
  • Smoother live navigation β€” no more "kangaroo" hopping β€” GPS fixes arrive only every few seconds, so easing the puck/camera straight to each fix made it lurch forward then freeze until the next fix. While on-route, the puck is now dead-reckoned: it advances continuously along the route at the rider's measured speed (derived from along-route progress, so it works even when a fix carries no speed) and is gently corrected to the snapped GPS position on every fix (a large drift / reroute hard-resyncs). The result is continuous, fluid motion between fixes (NavigationManager). While dead-reckoning, the camera/puck also hugs the route more tightly (a shorter position smoothing constant) so curves aren't visibly cut.
  • Offline routes no longer open with a spurious "make a U-turn" β€” BRouter used to connect the start waypoint to the nearest network node, which can sit behind the rider, opening the route with an out-and-back hairpin the online router never shows. The rider's live GPS heading is now passed to BRouter as a startDirection hint; for a start from a complete standstill (no heading) a lightweight second pass detects a start that heads away from the destination and re-runs BRouter with the route's own forward direction β€” BRouter then drops the spur itself, so the geometry stays real on-road (no path surgery) (BRouterEngine).
  • Offline routes start on the carriageway, not the sidewalk β€” BRouter was snapping the start/end onto the nearest way, which in town is often a footway=sidewalk, opening the route with a pavement + crossing detour before reaching the road. The cycling profiles now declare noStartWay=footway,sidewalk, so the start/end snaps to the carriageway like the online router does (and cycling on sidewalks isn't suggested) (gravel.brf, trekking.brf).
  • Navigation marker/camera heading no longer skewed by sub-metre route stubs β€” BRouter occasionally emits a tiny (~0.1 m) first segment, and the camera/marker took its heading from that single segment, pointing slightly off the route at the start. The route heading is now sampled ~15 m ahead along the polyline, so a degenerate stub can't skew it; the marker also seeds to the route's forward direction at the very start instead of a stale bearing (RouteMatcher, NavigationManager).

πŸ“₯ APK Variants

File Description
VeloSpot-v1.0.21.apk F-Droid flavor – no Google services, ready to sideload; this is the APK F-Droid reproducibly verifies
VeloSpot-v1.0.21-googlePlay.apk Google Play flavor – includes Google Play Services Location

Installation (sideload)

  1. Download the APK below.
  2. On your Android device: Settings β†’ Apps β†’ Install unknown apps β†’ allow your browser or file manager.
  3. Open the APK and tap Install.

The F-Droid flavor is also available on F-Droid.