A native Android Pokédex application built with modern Android development practices, demonstrating Clean Architecture, offline-first strategy, and comprehensive testing.
List Screen with Featured Pokemon & Search Detail Screen with Stats & Info
- Browse a list of Pokémon with images and IDs
- Featured Pokemon - Random Pokemon highlighted as "Pokemon of the day"
- Search - Filter Pokemon by name or ID
- View detailed information for each Pokémon including stats, types, and abilities
- Offline-first: Data is cached locally and works without internet connection
- Pull-to-refresh to update data from the API
- Modern Material 3 UI with Jetpack Compose
The project follows Clean Architecture principles with a modular structure:
HatchWorksApp/
├── app/ # Application entry point, DI configuration
├── domain/ # Business logic (UseCases, Repository interfaces, Models)
├── data/ # Data layer (API, Database, Repository implementations)
└── presentation/ # UI layer (Screens, ViewModels, Theme)
:app → :presentation, :data, :domain
:presentation → :domain
:data → :domain
| Category | Technology |
|---|---|
| Language | Kotlin |
| UI | Jetpack Compose + Material 3 |
| Architecture | MVVM + Clean Architecture |
| Dependency Injection | Koin |
| Networking | Retrofit + OkHttp + Gson |
| Local Database | Room |
| Image Loading | Coil |
| Navigation | Navigation Compose |
| Async | Kotlin Coroutines + Flow |
| Testing | JUnit, MockK, Turbine, Espresso, Compose Testing |
This app uses the PokéAPI - a free RESTful Pokémon API.
Pure Kotlin module with no Android dependencies:
model/- Domain models (Pokemon, PokemonDetail)repository/- Repository interfacesusecase/- Business logic use cases
Android Library handling data operations:
remote/- Retrofit API, DTOs, Remote DataSourcelocal/- Room Database, Entities, Local DataSourcerepository/- Repository implementations with offline-first strategy
Android Library containing UI components:
list/- Pokemon list screen (ViewModel, Screen, UiState)detail/- Pokemon detail screen (ViewModel, Screen, UiState)navigation/- Navigation setuptheme/- Material 3 theme configuration
Application configuration:
di/- Koin dependency injection modulesMainActivity- Single activity entry pointHatchWorksApplication- Application class with Koin initialization
The project includes comprehensive test coverage:
- Domain: UseCase tests
- Data: Repository, DataSource tests
- Presentation: ViewModel tests
- Compose UI tests for individual screens
- Navigation E2E tests
# Unit tests
./gradlew testDebugUnitTest
./gradlew :domain:test
# Instrumented tests (requires emulator/device)
./gradlew :app:connectedDebugAndroidTest- Android Studio Hedgehog or newer
- JDK 11
- Android SDK with API 35
- Min SDK: API 23 (Android 6.0)
# Debug build
./gradlew assembleDebug
# Run all checks
./gradlew clean assembleDebug testDebugUnitTestThe app implements an offline-first approach:
- Data is first served from local Room database
- Network request is triggered in the background
- Fresh data is saved to local database
- UI automatically updates via Kotlin Flow
This ensures the app works seamlessly even without internet connectivity.

