| Splash Screen | Main Activity | Map Screen | Foreground Notification |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
SilkRoad App is a modern Android application for recording and visualizing GPS routes.
It uses Jetpack Compose, MVI with UDF (Unidirectional Data Flow), and a foreground notification service to track the user in real-time.
- 🏁 Splash Screen – Smooth entry animation on app start
- 🗺️ Map Screen – Show route, footprints, and camel marker at last position
- 🔴 Auto-Follow Location – Camera always moves to the last recorded point
- 📍 Markers – Footprints for route history, camel for current location
- 🔔 Foreground Notification Service – Keeps tracking active in background
- 🛠️ MVI + UDF Architecture – Clear state management and scalable code
- 📦 Use Cases – Insert point, get points flow, calculate distance
- ⚡ Offline Persistence – Room database caching of GPS points
- Language: Kotlin
- UI: Jetpack Compose
- Architecture: MVI + UDF
- Dependency Injection: Hilt
- Persistence: Room Database
- Maps: Google Maps Compose
- Foreground Service: Persistent notification for route tracking
- Extras: Coroutine Flow, State management, Vector Drawable Icons
SilkRoadApp
│ SilkRoadApplication.kt # Application class
│ MainActivity.kt # Main Activity
│ PermissionManager.kt # Compose permission handling
│
├── domain
│ ├── usecase
│ │ ├── InsertPointUseCase.kt
│ │ ├── GetPointsFlowUseCase.kt
│ │ └── CalculateDistanceUseCase.kt
│ ├── repository
│ │ ├── RouteRepository.kt
│ │ └── LocationRepository.kt
│ └── GpsPoint.kt
│
├── data
│ ├── repository
│ │ └── RouteRepositoryImpl.kt
│ ├── local
│ │ ├── GpsPointEntity.kt
│ │ ├── GpsPointDao.kt
│ │ └── GpsDatabase.kt
│ └── location
│ └── LocationService.kt
│
├── presentation
│ ├── systemstatus
│ │ ├── SystemStatusViewModel.kt # Foreground notification / service VM
│ │ ├── SystemStatusState.kt
│ │ └── SystemStatusIntent.kt
│ ├── state
│ │ ├── SilkRoadState.kt # Map & route state
│ │ └── SilkRoadIntent.kt
│ └── SilkRoadViewModel.kt
│
├── ui
│ ├── theme
│ │ └── SilkRoadTheme.kt
│ ├── components
│ │ └── BlinkingCircle.kt
│ └── map
│ ├── MapScreen.kt
│ └── getBitmapDescriptorFromVector.kt
│
└── di
├── UseCaseModule.kt
└── AppModule.kt



