Discover available ISPARK parking spots, check real-time fees, and navigate to your destination with ease.
- Jetpack Compose β 100% declarative UI with Material 3 and Dynamic Color support.
- Navigation Compose β Type-safe routing using Kotlin Serialization.
- Dagger-Hilt β Dependency Injection with modularized providers.
- Room β Local persistence for Offline-First capability and Single Source of Truth (SSoT).
- Retrofit + OkHttp β Network layer with custom Call Adapters for automatic
Resource<T>wrapping. - Google Maps Compose β Interactive map with custom JSON styles and geospatial polygon overlays.
- Coroutines & Flow β Reactive data streams with an MVVM/MVI hybrid approach (StateFlow + Channels).
- Clean Architecture β Strictly decoupled layers (Data, Domain, Presentation) with single-responsibility UseCases.
- Offline Resilience β Resilient recovery with intelligent data pre-fetching and localized error handling.
- Multi-Language Support β Fully localized in English and Turkish using a custom
UiTextwrapper.
The project follows Clean Architecture principles with a strict separation of concerns. Below is the high-level data flow and architectural diagram:
graph TD
%% Layer Definitions
subgraph UI_Layer [Presentation Layer - Compose UI]
A[Splash Screen] --> B[Park Map Screen - Home]
B --> C[Park Detail Screen]
end
subgraph State_Management [ViewModel & UI State]
B_VM[ParkMapViewModel]
C_VM[ParkDetailViewModel]
B_State[ParkMapUiState]
C_State[ParkDetailUiState]
Events[UiEvent - Snackbar/Nav]
end
subgraph Domain_Layer [Domain Layer - Business Logic]
UC1[FetchParksUseCase]
UC2[FilterParksUseCase]
UC3[FetchParkDetailUseCase]
UC4[ObserveParkDetailUseCase]
UC5[ToggleFavoriteUseCase]
end
subgraph Data_Layer [Data Layer - Repository & Sources]
Repo[ParkRepositoryImpl]
API[ParkApiService - Retrofit]
DB[ParkDao - Room]
end
%% Flow Connections
A -- triggers --> UC1
UC1 -- fetch & cache --> Repo
Repo -- calls --> API
API -- returns JSON --> Repo
Repo -- saves to --> DB
B_VM -- observes --> UC4
B_VM -- filters via --> UC2
UC4 -- stream --> DB
C_VM -- actions --> UC5
C_VM -- refresh detail --> UC3
UC3 -- network sync --> Repo
%% Data Flow Directions
Repo -.-> B_State
B_VM -.-> B_State
B_State -.-> B
C_VM -.-> C_State
C_State -.-> C
B_VM -- events --> Events
Events -.-> B
com.brkckr.parkv2/
βββ data/
β βββ local/ # Room DB, DAO, Entities (Offline Storage)
β βββ remote/ # Retrofit API, Response models, Call Adapters
β βββ mapper/ # Data β Domain Layer conversion
β βββ repository/ # Repository Implementations (SSoT Logic)
βββ domain/
β βββ model/ # Clean Data Classes (Park, ParkDetail)
β βββ repository/ # Domain interfaces
β βββ usecase/ # Single-responsibility Business Logic
βββ presentation/
β βββ splash/ # Onboarding & Initial Sync
β βββ park_map/ # Map UI, Horizontal Pager, Search
β βββ park_detail/ # Park Details & Polygon display
β βββ navigation/ # Type-safe Route definitions
β βββ common/ # UiEvent, UiText, Shared UI Logic
βββ di/ # Decoupled Hilt Modules
βββ ui/
βββ theme/ # Material 3 Theme & Dynamic Colors
βββ components/ # Global Reusable UI Components (Chips, Loaders)
- Add your Google Maps API Key to
local.defaults.propertiesin the root directory. - Open the project in Android Studio and click Run## βοΈ Installation & Setup


