WalkPlanner
Walking route and daily movement planner for simple personal activity routines.
Get it on Google Play ↗ Source on GitHub ↗
Hyper-local run and walk route planner for Android. WalkPlanner uses GPS and OpenStreetMap data to generate loop routes, tracks active sessions, and stores history offline.
Architecture
presentation/ (Compose screens + ViewModels)
↓
domain/ (use cases, models, repository interfaces — no Android imports)
↓
data/ (Room, Retrofit/Overpass, DataStore, WorkManager, location)
- UI: Jetpack Compose + Navigation Compose
- DI: Manual wiring in
WalkPlannerApplication - Maps: OSMDroid with local tile cache (100 MB)
- Routes: Overpass API with Room OSM graph cache (7-day expiry)
- Routing: Bidirectional A* on an adjacency-list street graph with Haversine edge distances and highway safety weights
- Sessions: WorkManager
SaveSessionWorkerpersists completed runs - Active tracking:
ActiveRunForegroundServicewith pause/stop notification actions
Permissions
| Permission | Purpose |
|---|---|
ACCESS_FINE_LOCATION |
GPS route planning and live tracking |
ACCESS_COARSE_LOCATION |
Fallback when fine location is denied |
FOREGROUND_SERVICE / FOREGROUND_SERVICE_LOCATION |
Active run notification |
INTERNET / ACCESS_NETWORK_STATE |
Overpass API and connectivity checks |
WAKE_LOCK |
Keep CPU awake during active (non-paused) runs |
Run unit tests
./gradlew testDebugUnitTest
Reports: app/build/reports/tests/testDebugUnitTest/
Key test suites:
DistanceInputValidatorTestRouteMapperTestGenerateRouteUseCaseTestRouteRepositoryImplTest(Robolectric + in-memory Room)ActiveRunViewModelTestLocationRepositoryImplTest
Run instrumented tests
./gradlew connectedDebugAndroidTest
CI
GitHub Actions runs ./gradlew assembleDebug and ./gradlew testDebugUnitTest on push/PR to main and develop.
Hiring a senior Android / Flutter engineer?
I architect and ship production mobile software — Kotlin, Jetpack Compose, Flutter — for robotics, EV infrastructure, fintech, and real-time systems. Open to remote roles in Europe and the US.
Get in touch →