

MotoRun - Android Verseny Adminisztrációs App
Áttekintés
A MotoRun egy modern Android alkalmazás Silkolene motoRun motoros navigációs versenyekhez, amely egyszerűsíti a verseny szervezői és résztvevői számára a pontőröknél történő adatnaplózást. Az alkalmazás offline-first megközelítéssel készült, ahol az elsődleges cél a megbízható, másodperc-pontos digitális naplózás volt még internetkapcsolat nélkül is.
A projekt során különös figyelmet fordítottam a Clean Architecture elvekre, MVVM mintára és az offline-first adatkezelésre, biztosítva hogy a kritikus versenyinformációk soha ne vesszenek el kapcsolódási problémák miatt.
Architektúra és tervezési minták
Clean Architecture implementáció
- Presentation Layer:
@HiltViewModel
annotált ViewModel-ek unidirectional data flow-val (StateFlow
) - Domain Layer: Repository interface-ek és use-case-ek a business logic elkülönítésére
- Data Layer: Room database + Firestore hibrid megoldás offline-first prioritással
- UI Layer: Jetpack Compose-zal felépített stateless Composable-ök
State Management és reaktív programozás
data class CheckpointUiState(
val sorter: Sorter = Sorter.TimeDESC,
val filter: Filter = Filter.Arrived,
val selectedEntry: Entry? = null,
val sortedEntries: List<Entry> = emptyList(),
val isFilterHidingEntries: Boolean = false
)
- Sealed classes típusbiztos state/error modeling-hez (
AuthState
,AuthError
) - Flow operators (
combine
,distinctUntilChanged
) reaktív adatáramláshoz
Dependency Injection és modularitás
- Hilt használata teljes DI coverage-dzsel
- Moduláris felépítés:
AuthRepository
,EntryRepository
,NetworkManager
- Interface segregation a tesztelhetőség javítására
Kulcs funkciók és implementációk
NFC-alapú csapat regisztráció
@Singleton
class NFCHandler @Inject constructor(
private val authRepository: AuthRepository,
private val entryRepository: EntryRepository
) {
sealed class NFCState {
object Disabled : NFCState()
data class Enabled(val checkpointId: Int) : NFCState()
}
fun handleNfcIntent(intent: Intent) {
// Role-based authorization and automatic entry creation
}
}
Offline-first adatszinkronizáció
- Room database helyi perzisztenciával
- Firestore cloud backup és multi-device sync
- Conflict resolution version-based update strategiával
- Network state monitoring automatikus reconnection és retry logikával
Role-based hozzáférés-vezérlés
enum class Role {
UNKNOWN, TEAM, CHECKPOINT, ORGANIZER, ADMIN
}
sealed class AuthState {
data object Idle : AuthState()
data object Loading : AuthState()
data class LoggedIn(val role: Role, val isOnline: Boolean) : AuthState()
data class Error(val error: AuthError) : AuthState()
}
Robusztus hálózatkezelés
- NetworkManager lifecycle-aware hálózatkezelés
- Exponential backoff újra csatlakozási stratégia
- Rate limiting Firestore API túlterhelés ellen (free tier :))
- Health checks és automatikus helyreállás
Technikai megvalósítás
Offline képességek
- AndroidKeyStore belépési adatok és kulcsok biztonságos tárolásához
- Room komplex relációs lekérdezésekkel és indexeléssel
- DataStore konfigurációk kezeléséhez
UI/UX tervezés
- Material 3 design system
- Compose UI deklaratív kezelőfelület leírás
- State hoisting clean separation of concerns-ért
- Dialog management centralizált UI state handling-gel
Adatexport és jelentések
- Apache POI Excel export funkcióhoz
- Google Apps Script Google Sheets export funkcióhoz
- FileProvider offline file sharing-hez
- Progress tracking callbacks hosszú műveleteknél
Hardware integráció
- NFC card reading NDEF message parsing-gal
- Device identification unique device tracking-hez
- Hardware sensor access készülék-specifikus adatokhoz
Alkalmazott technológiák
Android fejlesztés:
- Kotlin 2.0 modern nyelvi elemek használata
- Jetpack Compose declarative UI
- Navigation Compose type-safe navigáció
- Hilt dependency injection
- Room + DataStore data persistence
Backend és szinkronizáció:
- Firebase Auth role-based authentication
- Firebase Firestore szinkronizációs adatbázis, verziókezeléssel
- Firebase Crashlytics crash reporting
Architektúra és patterns:
- MVVM + Clean Architecture
- Repository pattern adat absztakciós réteg
- Observer pattern reactive programming-hoz
- Singleton pattern system services-hez
Fejlesztői tooling:
- Gradle KTS build configuration
- ProGuard code obfuscation and minifying
- BuildConfig environment-specific settings
Eredmények és teljesítmény
- Offline működés: 100% funkcionalitás internet nélkül
- Adatbiztonság: Zero data loss konfliktus-feloldó szinkronizációval
- NFC response idő: < 200ms card-tól entry creation-ig
- Multi-role support: 4 különböző felhasználói szerepkör
- Excel export: Teljes verseny eredmények batch export-ja
- Network resilience: Automatikus reconnection és retry logika
A projekt demonstrálja a modern Android fejlesztés best practice-eit, különös tekintettel a reliability, scalability és maintainability szempontjaira kritikus alkalmazási környezetben.
← Vissza a projektekhez